dwatch/source/app.d

153 lines
4.7 KiB
D
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}