mirror of
https://github.com/abraunegg/onedrive
synced 2024-06-01 05:22:14 +02:00
4253318835
commit1eff2d7d67
Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 19:15:27 2023 +1100 Update PR * Add --source-directory 'path/as/source/' --destination-directory 'path/as/destination' functionality commitad3ddee0ec
Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 17:32:24 2023 +1100 Update PR * Add --create-directory * Add --remove-directory commit7dfe6b65b7
Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 12:27:03 2023 +1100 Update PR * Update PR commit75c071e56f
Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 10:12:05 2023 +1100 Update PR * Update PR commit6db484cdad
Author: abraunegg <alex.braunegg@gmail.com> Date: Mon Oct 16 17:01:25 2023 +1100 Update PR * Update PR commitd893ea5460
Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 10:43:50 2023 +1100 Update PR * Update PR commit82bd593bf4
Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 09:14:17 2023 +1100 Update PR * Validate and document --auth-files operation commitc551203f4c
Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 05:48:22 2023 +1100 Update PR * Add --create-share-link commitfbf63999ff
Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 18:39:21 2023 +1100 Update PR * Update PR commit72a4680035
Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 17:43:15 2023 +1100 Update PR * Add --get-file-link * Add --modified-by commit0d3fc3ebf2
Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 14:28:10 2023 +1100 Add --display-sync-status * Add --display-sync-status commit1f183ca03e
Author: abraunegg <alex.braunegg@gmail.com> Date: Mon Oct 9 08:18:13 2023 +1100 Update PR * Update PR with doc updates commitb0628d7099
Author: abraunegg <alex.braunegg@gmail.com> Date: Sun Oct 8 10:52:52 2023 +1100 Update PR * Update PR commit7e3df956ce
Author: abraunegg <alex.braunegg@gmail.com> Date: Sat Oct 7 05:31:26 2023 +1100 Update PR * Update PR commitc69f2abc4b
Author: abraunegg <alex.braunegg@gmail.com> Date: Sat Oct 7 05:28:28 2023 +1100 Update PR * Update PR commitea1ca33374
Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 14:57:51 2023 +1100 Update PR * Update PR commit1503f969df
Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 09:19:04 2023 +1100 Update PR * Update PR commit5127464f2c
Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 06:48:20 2023 +1100 Change when the integrity check is performed * Change when the integrity check is performed commitc7cc45d95c
Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 19:40:05 2023 +1100 Update maxInotifyWatches location * Update maxInotifyWatches location commitc44ad963a6
Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:41:31 2023 +1100 Update main.d * Fix --version segfault commit51f0ffcb1f
Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:24:30 2023 +1100 Uplift to v2.5.0-alpha-2 * Uplift to v2.5.0-alpha-2 commitcbe3e6ea84
Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:17:26 2023 +1100 Clean up before onedrive-v2.5.0-alpha-2 * Clean up before onedrive-v2.5.0-alpha-2
252 lines
6.3 KiB
D
252 lines
6.3 KiB
D
// What is this module called?
|
|
module log;
|
|
|
|
// What does this module require to function?
|
|
import std.stdio;
|
|
import std.file;
|
|
import std.datetime;
|
|
import std.process;
|
|
import std.conv;
|
|
import std.path;
|
|
import std.string;
|
|
import core.memory;
|
|
import core.sys.posix.pwd;
|
|
import core.sys.posix.unistd;
|
|
import core.stdc.string : strlen;
|
|
import std.algorithm : splitter;
|
|
|
|
version(Notifications) {
|
|
import dnotify;
|
|
}
|
|
|
|
// module variables
|
|
// verbose logging count
|
|
long verbose;
|
|
// do we write a log file? ... this should be a config falue
|
|
bool writeLogFile = false;
|
|
// did the log file write fail?
|
|
bool logFileWriteFailFlag = false;
|
|
private bool triggerNotification;
|
|
|
|
// shared string variable for username
|
|
string username;
|
|
string logFilePath;
|
|
string logFileName;
|
|
string logFileFullPath;
|
|
|
|
void initialise(string logDir) {
|
|
writeLogFile = true;
|
|
|
|
// Configure various variables
|
|
username = getUserName();
|
|
logFilePath = logDir;
|
|
logFileName = username ~ ".onedrive.log";
|
|
logFileFullPath = buildPath(logFilePath, logFileName);
|
|
|
|
if (!exists(logFilePath)){
|
|
// logfile path does not exist
|
|
try {
|
|
mkdirRecurse(logFilePath);
|
|
}
|
|
catch (std.file.FileException e) {
|
|
// we got an error ..
|
|
writeln();
|
|
writeln("ERROR: Unable to access ", logFilePath);
|
|
writeln("ERROR: Please manually create '",logFilePath, "' and set appropriate permissions to allow write access");
|
|
writeln("ERROR: The requested client activity log will instead be located in your users home directory");
|
|
writeln();
|
|
|
|
// set the flag so we dont keep printing this sort of message
|
|
logFileWriteFailFlag = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
void enableNotifications(bool value) {
|
|
version(Notifications) {
|
|
// if we try to enable notifications, check for server availability
|
|
// and disable in case dbus server is not reachable
|
|
if (value) {
|
|
auto serverAvailable = dnotify.check_availability();
|
|
if (!serverAvailable) {
|
|
log("Notification (dbus) server not available, disabling");
|
|
value = false;
|
|
}
|
|
}
|
|
}
|
|
triggerNotification = value;
|
|
}
|
|
|
|
void log(T...)(T args) {
|
|
writeln(args);
|
|
if(writeLogFile){
|
|
// Write to log file
|
|
logfileWriteLine(args);
|
|
}
|
|
}
|
|
|
|
void logAndNotify(T...)(T args) {
|
|
notify(args);
|
|
log(args);
|
|
}
|
|
|
|
void fileOnly(T...)(T args) {
|
|
if(writeLogFile){
|
|
// Write to log file
|
|
logfileWriteLine(args);
|
|
}
|
|
}
|
|
|
|
void vlog(T...)(T args) {
|
|
if (verbose >= 1) {
|
|
writeln(args);
|
|
if(writeLogFile){
|
|
// Write to log file
|
|
logfileWriteLine(args);
|
|
}
|
|
}
|
|
}
|
|
|
|
void vdebug(T...)(T args) {
|
|
if (verbose >= 2) {
|
|
writeln("[DEBUG] ", args);
|
|
if(writeLogFile){
|
|
// Write to log file
|
|
logfileWriteLine("[DEBUG] ", args);
|
|
}
|
|
}
|
|
}
|
|
|
|
void vdebugNewLine(T...)(T args) {
|
|
if (verbose >= 2) {
|
|
writeln("\n[DEBUG] ", args);
|
|
if(writeLogFile){
|
|
// Write to log file
|
|
logfileWriteLine("\n[DEBUG] ", args);
|
|
}
|
|
}
|
|
}
|
|
|
|
void error(T...)(T args) {
|
|
stderr.writeln(args);
|
|
if(writeLogFile){
|
|
// Write to log file
|
|
logfileWriteLine(args);
|
|
}
|
|
}
|
|
|
|
void errorAndNotify(T...)(T args) {
|
|
notify(args);
|
|
error(args);
|
|
}
|
|
|
|
void notify(T...)(T args) {
|
|
version(Notifications) {
|
|
if (triggerNotification) {
|
|
string result;
|
|
foreach (index, arg; args) {
|
|
result ~= to!string(arg);
|
|
if (index != args.length - 1)
|
|
result ~= " ";
|
|
}
|
|
auto n = new Notification("OneDrive", result, "IGNORED");
|
|
try {
|
|
n.show();
|
|
// Sent message to notification daemon
|
|
if (verbose >= 2) {
|
|
writeln("[DEBUG] Sent notification to notification service. If notification is not displayed, check dbus or notification-daemon for errors");
|
|
}
|
|
|
|
} catch (Throwable e) {
|
|
vlog("Got exception from showing notification: ", e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void logfileWriteLine(T...)(T args) {
|
|
static import std.exception;
|
|
// Write to log file
|
|
auto currentTime = Clock.currTime();
|
|
auto timeString = leftJustify(currentTime.toString(), 28, '0');
|
|
File logFile;
|
|
|
|
// Resolve: std.exception.ErrnoException@std/stdio.d(423): Cannot open file `/var/log/onedrive/xxxxx.onedrive.log' in mode `a' (Permission denied)
|
|
try {
|
|
logFile = File(logFileFullPath, "a");
|
|
}
|
|
catch (std.exception.ErrnoException e) {
|
|
// We cannot open the log file logFileFullPath for writing
|
|
// The user is not part of the standard 'users' group (GID 100)
|
|
// Change logfile to ~/onedrive.log putting the log file in the users home directory
|
|
|
|
if (!logFileWriteFailFlag) {
|
|
// write out error message that we cant log to the requested file
|
|
writeln();
|
|
writeln("ERROR: Unable to write activity log to ", logFileFullPath);
|
|
writeln("ERROR: Please set appropriate permissions to allow write access to the logging directory for your user account");
|
|
writeln("ERROR: The requested client activity log will instead be located in your users home directory");
|
|
writeln();
|
|
|
|
// set the flag so we dont keep printing this error message
|
|
logFileWriteFailFlag = true;
|
|
}
|
|
|
|
string homePath = environment.get("HOME");
|
|
string logFileFullPathAlternate = homePath ~ "/onedrive.log";
|
|
logFile = File(logFileFullPathAlternate, "a");
|
|
}
|
|
// Write to the log file
|
|
logFile.writeln(timeString, "\t", args);
|
|
logFile.close();
|
|
}
|
|
|
|
private string getUserName() {
|
|
auto pw = getpwuid(getuid);
|
|
|
|
// get required details
|
|
auto runtime_pw_name = pw.pw_name[0 .. strlen(pw.pw_name)].splitter(',');
|
|
auto runtime_pw_uid = pw.pw_uid;
|
|
auto runtime_pw_gid = pw.pw_gid;
|
|
|
|
// user identifiers from process
|
|
vdebug("Process ID: ", pw);
|
|
vdebug("User UID: ", runtime_pw_uid);
|
|
vdebug("User GID: ", runtime_pw_gid);
|
|
|
|
// What should be returned as username?
|
|
if (!runtime_pw_name.empty && runtime_pw_name.front.length){
|
|
// user resolved
|
|
vdebug("User Name: ", runtime_pw_name.front.idup);
|
|
return runtime_pw_name.front.idup;
|
|
} else {
|
|
// Unknown user?
|
|
vdebug("User Name: unknown");
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
void displayMemoryUsagePreGC() {
|
|
// Display memory usage
|
|
writeln();
|
|
writeln("Memory Usage pre GC (KB)");
|
|
writeln("------------------------");
|
|
writeMemoryStats();
|
|
writeln();
|
|
}
|
|
|
|
void displayMemoryUsagePostGC() {
|
|
// Display memory usage
|
|
writeln();
|
|
writeln("Memory Usage post GC (KB)");
|
|
writeln("-------------------------");
|
|
writeMemoryStats();
|
|
writeln();
|
|
}
|
|
|
|
void writeMemoryStats() {
|
|
// write memory stats
|
|
writeln("memory usedSize = ", (GC.stats.usedSize/1024));
|
|
writeln("memory freeSize = ", (GC.stats.freeSize/1024));
|
|
writeln("memory allocatedInCurrentThread = ", (GC.stats.allocatedInCurrentThread/1024));
|
|
} |