Created
August 22, 2022 14:23
-
-
Save instance-id/2f9173827960dc8fc1f4fd265a3d5188 to your computer and use it in GitHub Desktop.
My dotnet-script runner and backup scheduler
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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