2016-08-04 23:35:58 +02:00
|
|
|
import std.stdio;
|
2018-03-14 05:43:40 +01:00
|
|
|
import std.file;
|
|
|
|
import std.datetime;
|
2018-04-25 04:11:34 +02:00
|
|
|
import std.process;
|
2018-12-05 20:19:00 +01:00
|
|
|
import std.conv;
|
2018-04-07 09:06:57 +02:00
|
|
|
import core.sys.posix.pwd, core.sys.posix.unistd, core.stdc.string : strlen;
|
|
|
|
import std.algorithm : splitter;
|
2018-12-05 20:19:00 +01:00
|
|
|
version(Notifications) {
|
|
|
|
import dnotify;
|
|
|
|
}
|
2018-04-07 09:06:57 +02:00
|
|
|
|
2018-11-23 21:13:16 +01:00
|
|
|
// enable verbose logging
|
2018-12-07 19:01:22 +01:00
|
|
|
int verbose;
|
2018-11-23 21:13:16 +01:00
|
|
|
bool writeLogFile = false;
|
|
|
|
|
2018-12-05 20:19:00 +01:00
|
|
|
private bool doNotifications;
|
|
|
|
|
2018-04-07 09:06:57 +02:00
|
|
|
// shared string variable for username
|
|
|
|
string username;
|
2018-05-16 11:19:43 +02:00
|
|
|
string logFilePath;
|
2016-08-04 23:35:58 +02:00
|
|
|
|
2018-11-23 21:13:16 +01:00
|
|
|
void init(string logDir)
|
2018-05-16 11:19:43 +02:00
|
|
|
{
|
2018-11-23 21:13:16 +01:00
|
|
|
writeLogFile = true;
|
|
|
|
username = getUserName();
|
|
|
|
logFilePath = logDir;
|
|
|
|
|
2018-05-16 11:19:43 +02:00
|
|
|
if (!exists(logFilePath)){
|
|
|
|
// logfile path does not exist
|
|
|
|
try {
|
|
|
|
mkdirRecurse(logFilePath);
|
|
|
|
}
|
|
|
|
catch (std.file.FileException e) {
|
|
|
|
// we got an error ..
|
2018-11-23 21:13:16 +01:00
|
|
|
writeln("\nUnable to access ", logFilePath);
|
|
|
|
writeln("Please manually create '",logFilePath, "' and set appropriate permissions to allow write access");
|
|
|
|
writeln("The requested client activity log will instead be located in the users home directory\n");
|
2018-05-16 11:19:43 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-05 20:19:00 +01:00
|
|
|
void setNotifications(bool value)
|
|
|
|
{
|
|
|
|
doNotifications = value;
|
|
|
|
}
|
|
|
|
|
2016-08-04 23:35:58 +02:00
|
|
|
void log(T...)(T args)
|
|
|
|
{
|
2017-12-28 15:21:41 +01:00
|
|
|
writeln(args);
|
2018-11-23 21:13:16 +01:00
|
|
|
if(writeLogFile){
|
|
|
|
// Write to log file
|
|
|
|
logfileWriteLine(args);
|
|
|
|
}
|
2016-08-04 23:35:58 +02:00
|
|
|
}
|
|
|
|
|
2018-12-05 20:19:00 +01:00
|
|
|
void logAndNotify(T...)(T args)
|
|
|
|
{
|
|
|
|
notify(args);
|
|
|
|
log(args);
|
|
|
|
}
|
|
|
|
|
2018-05-03 08:21:53 +02:00
|
|
|
void fileOnly(T...)(T args)
|
|
|
|
{
|
2018-11-23 21:13:16 +01:00
|
|
|
if(writeLogFile){
|
|
|
|
// Write to log file
|
|
|
|
logfileWriteLine(args);
|
|
|
|
}
|
2018-05-03 08:21:53 +02:00
|
|
|
}
|
|
|
|
|
2016-08-04 23:35:58 +02:00
|
|
|
void vlog(T...)(T args)
|
|
|
|
{
|
2018-12-07 19:01:22 +01:00
|
|
|
if (verbose >= 1) {
|
2018-03-14 05:43:40 +01:00
|
|
|
writeln(args);
|
2018-11-23 21:13:16 +01:00
|
|
|
if(writeLogFile){
|
|
|
|
// Write to log file
|
|
|
|
logfileWriteLine(args);
|
|
|
|
}
|
2018-03-14 05:43:40 +01:00
|
|
|
}
|
2016-08-04 23:35:58 +02:00
|
|
|
}
|
2017-12-28 15:21:41 +01:00
|
|
|
|
2018-12-07 19:01:22 +01:00
|
|
|
void vdebug(T...)(T args)
|
|
|
|
{
|
|
|
|
if (verbose >= 2) {
|
|
|
|
writeln("[DEBUG] ", args);
|
|
|
|
if(writeLogFile){
|
|
|
|
// Write to log file
|
|
|
|
logfileWriteLine("[DEBUG] ", args);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-28 15:21:41 +01:00
|
|
|
void error(T...)(T args)
|
|
|
|
{
|
|
|
|
stderr.writeln(args);
|
2018-11-23 21:13:16 +01:00
|
|
|
if(writeLogFile){
|
|
|
|
// Write to log file
|
|
|
|
logfileWriteLine(args);
|
|
|
|
}
|
2018-04-07 09:06:57 +02:00
|
|
|
}
|
|
|
|
|
2018-12-05 20:19:00 +01:00
|
|
|
void errorAndNotify(T...)(T args)
|
|
|
|
{
|
|
|
|
notify(args);
|
|
|
|
error(args);
|
|
|
|
}
|
|
|
|
|
|
|
|
void notify(T...)(T args)
|
|
|
|
{
|
|
|
|
version(Notifications) {
|
|
|
|
if (doNotifications) {
|
|
|
|
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();
|
|
|
|
} catch (Throwable e) {
|
|
|
|
vlog("Got exception from showing notification: ", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-07 09:06:57 +02:00
|
|
|
private void logfileWriteLine(T...)(T args)
|
|
|
|
{
|
|
|
|
// Write to log file
|
2018-05-16 11:19:43 +02:00
|
|
|
string logFileName = .logFilePath ~ .username ~ ".onedrive.log";
|
2018-03-14 05:43:40 +01:00
|
|
|
auto currentTime = Clock.currTime();
|
|
|
|
auto timeString = currentTime.toString();
|
2018-04-25 04:11:34 +02:00
|
|
|
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(logFileName, "a");
|
|
|
|
}
|
|
|
|
catch (std.exception.ErrnoException e) {
|
2018-11-23 21:13:16 +01:00
|
|
|
// We cannot open the log file in logFilePath location for writing
|
2018-04-25 04:11:34 +02:00
|
|
|
// 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
|
|
|
|
string homePath = environment.get("HOME");
|
|
|
|
string logFileNameAlternate = homePath ~ "/onedrive.log";
|
|
|
|
logFile = File(logFileNameAlternate, "a");
|
|
|
|
}
|
|
|
|
// Write to the log file
|
2018-03-14 05:43:40 +01:00
|
|
|
logFile.writeln(timeString, " ", args);
|
|
|
|
logFile.close();
|
2018-04-07 09:06:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private string getUserName()
|
|
|
|
{
|
|
|
|
auto pw = getpwuid(getuid);
|
|
|
|
auto uinfo = pw.pw_gecos[0 .. strlen(pw.pw_gecos)].splitter(',');
|
|
|
|
if (!uinfo.empty && uinfo.front.length){
|
|
|
|
return uinfo.front.idup;
|
|
|
|
} else {
|
|
|
|
// Unknown user?
|
|
|
|
return "unknown";
|
|
|
|
}
|
2018-12-05 20:19:00 +01:00
|
|
|
}
|