153 lines
4.7 KiB
D
153 lines
4.7 KiB
D
import dwatch;
|
||
|
||
import commandr;
|
||
import core.stdc.stdlib : EXIT_SUCCESS, EXIT_FAILURE;
|
||
import std.file : exists, isFile;
|
||
import std.path : baseName;
|
||
|
||
private immutable string programName = "dwatch";
|
||
|
||
int main(string[] args)
|
||
{
|
||
string currentName = args[0].baseName;
|
||
bool isDaemon = programName ~ 'd' == currentName;
|
||
|
||
Program program = new Program(currentName, dwatchVersion)
|
||
.add(new Option("c", "config", "Путь к файлу конфигурации")
|
||
.optional
|
||
.validateEachWith(
|
||
opt => opt.exists && opt.isFile,
|
||
"необходимо указать путь к файлу JSON"
|
||
)
|
||
);
|
||
|
||
if (isDaemon)
|
||
{
|
||
program.summary("Демон мониторинга изменений в текстовых файлах")
|
||
.add(new Flag("g", "global", "Глобальный режим")
|
||
.name("global")
|
||
.optional
|
||
)
|
||
.add(new Flag("v", null, "Уровень журналирования")
|
||
.name("verbose")
|
||
.repeating
|
||
);
|
||
} else {
|
||
program.summary("CLI интерфейс для просмотра изменений в текстовых файлах")
|
||
.add(new Command("file", "Работа с файлами")
|
||
.add(new Command("list", "Получить список файлов")
|
||
.add(new Flag("l", "long", "Печать длинного хеша")
|
||
.optional
|
||
)
|
||
.add(new Argument("name", "Фильтр по части имени файла")
|
||
.optional
|
||
)
|
||
)
|
||
.add(new Command("snapshots", "Получить список снимков")
|
||
.add(new Flag("l", "long", "Печать длинного хеша")
|
||
.optional
|
||
)
|
||
.add(new Argument("name", "Имя или хеш")
|
||
.required
|
||
)
|
||
)
|
||
.add(new Command("remove", "Удалить снимки")
|
||
.add(new Argument("name", "Имя или хеш")
|
||
.required
|
||
)
|
||
)
|
||
.add(new Command("export", "Выгрузить снимки")
|
||
.add(new Flag("l", "long", "Печать длинного хеша")
|
||
.optional
|
||
)
|
||
.add(new Argument("name", "Имя или хеш")
|
||
.required
|
||
)
|
||
.add(new Argument("path", "Путь для сохранения архива")
|
||
.required
|
||
)
|
||
)
|
||
)
|
||
.add(new Command("snapshot", "Работа со снимками")
|
||
.add(new Command("show", "Получить снимок")
|
||
.add(new Argument("snaphash", "Хеш снимка")
|
||
.required
|
||
)
|
||
)
|
||
.add(new Command("diff", "Получить изменения снимка")
|
||
.add(new Argument("snaphash1", "Хеш снимка")
|
||
.required
|
||
)
|
||
.add(new Argument("snaphash2", "Хеш относительного снимка")
|
||
.optional
|
||
)
|
||
)
|
||
.add(new Command("remove", "Удалить снимок")
|
||
.add(new Argument("snaphash", "Хеш снимка")
|
||
.required
|
||
)
|
||
)
|
||
);
|
||
}
|
||
|
||
ProgramArgs argumets = program.parse(args);
|
||
|
||
string configFile = argumets.option("config", "config.json");
|
||
|
||
DWConfig config;
|
||
|
||
try {
|
||
config = new DWConfig(configFile);
|
||
} catch (DWException e) {
|
||
e.print();
|
||
return EXIT_FAILURE;
|
||
}
|
||
|
||
try {
|
||
if (isDaemon) {
|
||
// Настройка таймзоны, необходимо для определения пути локали - добавления в игнорлист fanotify
|
||
setupTimeZone(getZoneinfo(config.timezone).zone);
|
||
// Уровень подробности вывода журнала
|
||
setLogLevel(argumets.occurencesOf("verbose"), config.logfile);
|
||
DWDaemon daemon = new DWDaemon(config, argumets.flag("global"));
|
||
daemon.run();
|
||
} else {
|
||
DWCLI cli = new DWCLI(config);
|
||
scope(exit) cli.close();
|
||
argumets.on(
|
||
"file", (file) {
|
||
// dwatch file list [-l|--long] <name-filter>
|
||
file.on("list", fList => cli.fileList(
|
||
fList.flag("long"),
|
||
fList.arg("name")
|
||
))
|
||
// dwatch file snapshots [-c|--count] <filename|filehash>
|
||
.on("snapshots", fSnapshots => cli.fileSnapshots(
|
||
fSnapshots.flag("long"),
|
||
fSnapshots.arg("name")
|
||
))
|
||
// dwatch file remove <filename|filehash>
|
||
.on("remove", fRemove => cli.fileRemove(fRemove.arg("name")))
|
||
// dwatch file export <filename|filehash>
|
||
.on("export", fExport => cli.fileExport(
|
||
fExport.flag("long"),
|
||
fExport.arg("name"),
|
||
fExport.arg("path")
|
||
));
|
||
}
|
||
).on("snapshot", (snapshot) {
|
||
// dwatch snapshot show <snaphash>
|
||
snapshot.on("show", sSnapshot => cli.snapshotShow(sSnapshot.arg("snaphash")))
|
||
// dwatch snapshot diff <snaphash1> [<snaphash2>]
|
||
.on("diff", sDiff => cli.snapshotDiff(sDiff.arg("snaphash1"), sDiff.arg("snaphash2")))
|
||
// dwatch snapshot remove <snaphash>
|
||
.on("remove", sRemove => cli.snapshotRemove(sRemove.arg("snaphash")));
|
||
});
|
||
}
|
||
} catch (DWException e) {
|
||
e.print();
|
||
return EXIT_FAILURE;
|
||
}
|
||
|
||
return EXIT_SUCCESS;
|
||
}
|