abraunegg-onedrive/src/main.d

106 lines
3.1 KiB
D
Raw Normal View History

2015-09-14 19:21:06 +02:00
import std.getopt, std.file, std.process, std.stdio;
2015-09-16 10:29:20 +02:00
import config, itemdb, monitor, onedrive, sync;
2015-09-01 20:45:34 +02:00
2015-09-14 19:21:06 +02:00
string ver = "1.0";
2015-09-01 20:45:34 +02:00
2015-09-14 19:21:06 +02:00
void main(string[] args)
2015-09-01 20:45:34 +02:00
{
2015-09-16 10:29:20 +02:00
bool monitor, resync, verbose;
2015-09-14 19:21:06 +02:00
try {
writeln("OneDrive Client for Linux v", ver);
auto opt = getopt(
args,
"monitor|m", "Keep monitoring for local and remote changes.", &monitor,
"resync", "Perform a full synchronization.", &resync,
"verbose|v", "Print more details, useful for debugging.", &verbose
);
if (opt.helpWanted) {
defaultGetoptPrinter("Available options:", opt.options);
return;
}
} catch (GetOptException e) {
writeln(e.msg);
writeln("Try 'onedrive -h' for more information.");
return;
}
string homeDirName = environment["HOME"];
string configDirName = environment.get("XDG_CONFIG_HOME", homeDirName ~ "/.config") ~ "/onedrive";
string configFilePath = configDirName ~ "/config";
string refreshTokenFilePath = configDirName ~ "/refresh_token";
string statusTokenFilePath = configDirName ~ "/status_token";
2015-09-16 10:29:20 +02:00
string databaseFilePath = configDirName ~ "/items.db";
2015-09-14 19:21:06 +02:00
2015-09-16 10:29:20 +02:00
if (resync) {
if (verbose) writeln("Deleting the saved status ...");
2015-09-14 19:21:06 +02:00
if (exists(databaseFilePath)) remove(databaseFilePath);
if (exists(statusTokenFilePath)) remove(statusTokenFilePath);
}
if (verbose) writeln("Loading config ...");
auto cfg = config.Config(configFilePath);
cfg.load();
2015-09-01 20:45:34 +02:00
2015-09-14 19:21:06 +02:00
if (verbose) writeln("Initializing the OneDrive API ...");
auto onedrive = new OneDriveApi(cfg, verbose);
onedrive.onRefreshToken = (string refreshToken) {
std.file.write(refreshTokenFilePath, refreshToken);
};
2015-09-01 20:45:34 +02:00
try {
2015-09-14 19:21:06 +02:00
string refreshToken = readText(refreshTokenFilePath);
2015-09-01 20:45:34 +02:00
onedrive.setRefreshToken(refreshToken);
} catch (FileException e) {
onedrive.authorize();
}
2015-09-14 19:21:06 +02:00
// TODO check if the token is valid
2015-09-01 20:45:34 +02:00
2015-09-16 10:29:20 +02:00
if (verbose) writeln("Opening the item database ...");
auto itemdb = new ItemDatabase(databaseFilePath);
2015-09-14 19:21:06 +02:00
if (verbose) writeln("Initializing the Synchronization Engine ...");
2015-09-16 10:29:20 +02:00
auto sync = new SyncEngine(cfg, onedrive, itemdb, verbose);
sync.onStatusToken = (string statusToken) {
std.file.write(statusTokenFilePath, statusToken);
};
try {
string statusToken = readText(statusTokenFilePath);
sync.setStatusToken(statusToken);
} catch (FileException e) {
// swallow exception
}
string syncDir = cfg.get("sync_dir");
chdir(syncDir);
2015-09-01 20:45:34 +02:00
sync.applyDifferences();
2015-09-11 18:33:22 +02:00
sync.uploadDifferences();
2015-09-16 10:29:20 +02:00
return;
2015-09-01 20:45:34 +02:00
2015-09-14 19:21:06 +02:00
if (monitor) {
if (verbose) writeln("Monitoring for changes ...");
Monitor m;
m.onDirCreated = delegate(string path) {
if (verbose) writeln("[M] Directory created: ", path);
2015-09-16 10:29:20 +02:00
sync.uploadCreateDir(path);
2015-09-14 19:21:06 +02:00
sync.uploadDifferences(path);
};
m.onFileChanged = delegate(string path) {
if (verbose) writeln("[M] File changed: ", path);
sync.uploadDifference2(path);
};
m.onDelete = delegate(string path) {
if (verbose) writeln("[M] Item deleted: ", path);
sync.deleteByPath(path);
};
m.onMove = delegate(string from, string to) {
if (verbose) writeln("[M] Item moved: ", from, " -> ", to);
sync.moveItem(from, to);
};
m.init();
m.addRecursive("test");
while (true) m.update();
// TODO download changes
}
2015-09-16 10:29:20 +02:00
destroy(sync);
2015-09-01 20:45:34 +02:00
}