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] file.on("list", fList => cli.fileList( fList.flag("long"), fList.arg("name") )) // dwatch file snapshots [-c|--count] .on("snapshots", fSnapshots => cli.fileSnapshots( fSnapshots.flag("long"), fSnapshots.arg("name") )) // dwatch file remove .on("remove", fRemove => cli.fileRemove(fRemove.arg("name"))) // dwatch file export .on("export", fExport => cli.fileExport( fExport.flag("long"), fExport.arg("name"), fExport.arg("path") )); } ).on("snapshot", (snapshot) { // dwatch snapshot show snapshot.on("show", sSnapshot => cli.snapshotShow(sSnapshot.arg("snaphash"))) // dwatch snapshot diff [] .on("diff", sDiff => cli.snapshotDiff(sDiff.arg("snaphash1"), sDiff.arg("snaphash2"))) // dwatch snapshot remove .on("remove", sRemove => cli.snapshotRemove(sRemove.arg("snaphash"))); }); } } catch (DWException e) { e.print(); return EXIT_FAILURE; } return EXIT_SUCCESS; }