Skip to content

Instantly share code, notes, and snippets.

@instance-id
Created August 22, 2022 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save instance-id/2f9173827960dc8fc1f4fd265a3d5188 to your computer and use it in GitHub Desktop.
Save instance-id/2f9173827960dc8fc1f4fd265a3d5188 to your computer and use it in GitHub Desktop.
My dotnet-script runner and backup scheduler
#!/usr/bin/env dotnet-script
#load "../shell/shell.csx"
#load "../webcheck/webcheck.csx"
#load "../cointop/cointop_class.csx"
#load "../extensions.csx"
#r "nuget: FluentScheduler, 5.5.1"
#r "../packages/fluentscheduler/FluentScheduler.dll"
#r "System.Globalization.dll"
using System;
using FluentScheduler;
using System.Threading;
using System.Globalization;
using Log = System.Console;
using System.Diagnostics.CodeAnalysis;
static IShell _bash = new Bash();
static IShell _bash2 = new Bash();
private static string bash(string command) => _bash.Execute(command);
private static string bash2(string command) => _bash2.Execute(command);
private static void Sleep() => Thread.Sleep(Timeout.Infinite);
private static void Initialize()
{
var lockFolder = "/mnt/ramdisk/.kv/job_locks";
var jobLocks = new Dictionary<int, int>();
var shells = new Dictionary<int, IShell>();
var totalJobs = 10;
for (int i = 0; i < totalJobs; i++)
{
jobLocks.Add(i, 0);
shells.Add(i, new Bash());
}
if (!System.IO.Directory.Exists(lockFolder))
System.IO.Directory.CreateDirectory(lockFolder);
var cmdArgs = Environment.GetCommandLineArgs();
void PrintResults(string fileName, int result)
{
if (result == 0)
File.WriteAllText($"/mnt/ramdisk/.kv/results/{fileName}", "success");
else
File.WriteAllText($"/mnt/ramdisk/.kv/results/{fileName}", "fail");
}
// --| Cointop likes to fkup it's own config file
var fixScript = "/home/mosthated/_dev/languages/sh/conky/fixcointop.zsh";
bash(fixScript);
JobManager.Initialize();
// --| Lock reset ---------------------------
JobManager.AddJob(() =>
{
jobLocks.ForEach(x =>
{
jobLocks[x.Key] = 0;
});
}, s => s.WithName("lock_reset").ToRunEvery(60).Seconds()
);
// --| Stats Jobs -----------------------------------------------
// --| GPU Info -----------------------------
var gpuInfo = $"/home/mosthated/_dev/languages/sh/system/gpu_info.sh && echo 0";
JobManager.AddJob(() =>
{
var jobNum = 0;
if (jobLocks[jobNum] == 0)
{
jobLocks[jobNum] = 1;
jobLocks[jobNum] = int.Parse(shells[jobNum].Execute(gpuInfo));
PrintResults("gpu_results", jobLocks[jobNum]);
}
}, s => s.WithName("gpu_check").ToRunEvery(3).Seconds()
);
// --| Temperatures -------------------------
var tempInfo = $"if /home/mosthated/_dev/languages/sh/conky/temps.sh; then echo 0; else echo 1; fi";
JobManager.AddJob(() =>
{
var jobNum = 1;
if (jobLocks[jobNum] == 0)
{
jobLocks[jobNum] = 1;
jobLocks[jobNum] = int.Parse(shells[jobNum].Execute(tempInfo));
PrintResults("temp_results", jobLocks[jobNum]);
}
}, s => s.WithName("temp_check").ToRunEvery(2).Seconds()
);
// --| Cointop ------------------------------
var coinInfo = "if echo $(/mnt/x/_programming/go/bin/cointop holdings > /mnt/ramdisk/.kv/current_holdings); then echo 0; else echo 1; fi";
JobManager.AddJob(() =>
{
var jobNum = 2;
if (jobLocks[jobNum] == 0)
{
jobLocks[jobNum] = 1;
jobLocks[jobNum] = int.Parse(shells[jobNum].Execute(coinInfo));
PrintResults("cointop_results", jobLocks[jobNum]);
}
}, s => s.WithName("cointop_results").ToRunNow().AndEvery(15).Seconds()
);
// --| Stock Results ------------------------
var stockInfo = "if echo $(NO_COLOR=1 /home/mosthated/.conky/scripts/ticker.sh U | awk 'NR==1{print $2}' > /mnt/ramdisk/.kv/unity_holdings); then echo 0; else echo 1; fi";
JobManager.AddJob(() =>
{
var jobNum = 3;
if (jobLocks[jobNum] == 0)
{
jobLocks[jobNum] = 1;
jobLocks[jobNum] = int.Parse(shells[jobNum].Execute(stockInfo));
PrintResults("stock_results", jobLocks[jobNum]);
}
}, s => s.WithName("stock_results").ToRunNow().AndEvery(15).Seconds());
// --| Drive Check --------------------------
var diskInfo = $"if /home/mosthated/_dev/languages/sh/conky/drivecheck.sh; then echo 0; else echo 1; fi";
JobManager.AddJob(() =>
{
var jobNum = 4;
if (jobLocks[jobNum] == 0)
{
jobLocks[jobNum] = 1;
jobLocks[jobNum] = int.Parse(shells[jobNum].Execute(diskInfo));
PrintResults("drive_results", jobLocks[jobNum]);
}
}, s => s.WithName("drive_check").ToRunEvery(60).Seconds());
// --| Update Jobs ----------------------------------------------
// --| Update System Check ------------------
var updateCheck = "if env DB_DIR=/mnt/ramdisk/.kv /home/mosthated/_dev/languages/sh/system/update_check.sh; then echo 0; else echo 1; fi";
var updateString = "UPDATE_COMPLETE=false";
var homePath = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile));
var updatePath = homePath.FullName + "/.updatestatus";
JobManager.AddJob(() =>
{
var jobNum = 5;
if (jobLocks[jobNum] == 0)
{
jobLocks[jobNum] = 1;
jobLocks[jobNum] = int.Parse(shells[jobNum].Execute(updateCheck));
PrintResults("update_results", jobLocks[jobNum]);
if (jobLocks[jobNum] == 0)
File.WriteAllText(updatePath, updateString);
}
}, s => s.WithName("system_updates").ToRunEvery(15).Minutes());
// --| Backup Jobs ----------------------------------------------
// --| Backup Unity -------------------------
var backupScript = "if /home/mosthated/_dev/languages/pwsh/backups/backup_listed_projects.ps1; then echo 0; else echo 1; fi";
JobManager.AddJob(() =>
{
var jobNum = 6;
if (jobLocks[jobNum] == 0)
{
jobLocks[jobNum] = 1;
jobLocks[jobNum] = int.Parse(shells[jobNum].Execute(backupScript));
PrintResults("unity_backup_results", jobLocks[jobNum]);
}
}, s => s.WithName("unity_backup").ToRunEvery(1).Days().At(3, 0));
// --| Imported Type Jobs ---------------------------------------
// --| Coin Parse ---------------------------
JobManager.AddJob(() =>
{
var jobNum = 7;
if (jobLocks[jobNum] == 0)
{
jobLocks[jobNum] = 1;
jobLocks[jobNum] = RunCointop(_bash);
PrintResults("coinparse_results", jobLocks[jobNum]);
}
}, s => s.WithName("coin_parse").ToRunEvery(20).Seconds());
// --| Web Check ----------------------------
JobManager.AddJob(() =>
{
var jobNum = 8;
if (jobLocks[jobNum] == 0)
{
jobLocks[jobNum] = 1;
jobLocks[jobNum] = WebCheck.Run(cmdArgs);
PrintResults("web_results", jobLocks[jobNum]);
}
}, s => s.WithName("web_check").ToRunEvery(60).Seconds());
// --| Job Events -----------------------------------------------
// --|-----------------------------------------------------------
JobManager.JobException += (sender) =>
{
if (sender.Name == "unity_backup" || sender.Name == "system_updates")
{
var jobError = $"/home/mosthated/_dev/languages/pwsh/notification/systemnotify.ps1 '{sender.Name}' '{sender.Exception}' Critical backup.error";
bash(jobError);
}
if (sender.Name == "coin_parse")
{
var fixScript = "/home/mosthated/_dev/languages/sh/conky/fixcointop.zsh";
bash(fixScript);
}
var errorMessage = $"Job Error: {sender.Name} : {sender.Exception}";
errorMessage = errorMessage.Replace("--- End of stack trace from previous location ---", " --- End of stack trace from previous location ---");
var todaysDate = DateTime.Now.ToString("yyyy-MM-dd");
var nowTimestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
var errorPath = "/home/mosthated/_errors";
var errorFile = $"{errorPath}/{todaysDate}_job_errors.log";
if (File.Exists(errorFile))
File.AppendAllText(errorFile, $"[{nowTimestamp}] {errorMessage + Environment.NewLine}");
else File.WriteAllText(errorFile, $"[{nowTimestamp}] {errorMessage + Environment.NewLine}");
Console.WriteLine(errorMessage);
};
JobManager.JobStart += (sender) =>
{
if (sender.Name == "unity_backup")
{
Console.WriteLine($"Job {sender.Name} starting: {sender.StartTime}");
var jobStart = $"/home/mosthated/_dev/languages/pwsh/notification/systemnotify.ps1 '{sender.Name}' '{sender.StartTime}' Normal backup.started";
bash(jobStart);
}
};
JobManager.JobEnd += (sender) =>
{
if (sender.Name == "unity_backup")
{
var nowTimestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
Console.WriteLine($"Job {sender.Name} ending: {nowTimestamp} {sender.Duration}");
var jobEnd = $"/home/mosthated/_dev/languages/pwsh/notification/systemnotify.ps1 '{sender.Name}' 'Time: {nowTimestamp} Duration:{sender.Duration}' Normal backup.ended";
bash(jobEnd);
}
};
}
Initialize();
Sleep();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment