From 61cd6d505a191d1cd333120b18965d1fac02642a Mon Sep 17 00:00:00 2001 From: Joe S <31870999+KenwoodFox@users.noreply.github.com> Date: Thu, 24 Sep 2020 01:22:42 -0400 Subject: [PATCH] Preformed, minor user additions, this is a pre-stage to a larger change --- Dir Config/bacula-dir.conf | 10 +- Dir Config/clients/zinc-client-users.conf | 8 +- Dir Config/filesets/filesets-archive.conf | 2 +- Dir Config/filesets/filesets-system.conf | 14 ++- Dir Config/filesets/filesets-users.conf | 12 ++ Dir Config/pools.conf | 2 +- .../scripts/webhooks/._sync_3f5c94a4c959.db | Bin 90112 -> 90112 bytes .../scripts/webhooks/Aidan-Bacula-Mail.md | 54 +++++++++ .../scripts/webhooks/Aidan-Bacula-Webhook.py | 20 ++++ .../scripts/webhooks/ChrisProEliteMail.md | 102 +++++------------ .../scripts/webhooks/Christina-Bacula-Mail.md | 50 ++++++++- .../scripts/webhooks/Julio-Bacula-Mail.md | 50 ++++++++- Dir Config/scripts/webhooks/NewImprovedBot.py | 12 ++ Dir Config/scripts/webhooks/RoboticsMail.md | 104 +++++------------- .../__pycache__/bathook.cpython-38.pyc | Bin 2056 -> 3408 bytes Dir Config/scripts/webhooks/bathook.py | 39 ++++++- 16 files changed, 309 insertions(+), 170 deletions(-) create mode 100644 Dir Config/scripts/webhooks/Aidan-Bacula-Mail.md create mode 100644 Dir Config/scripts/webhooks/Aidan-Bacula-Webhook.py create mode 100644 Dir Config/scripts/webhooks/NewImprovedBot.py diff --git a/Dir Config/bacula-dir.conf b/Dir Config/bacula-dir.conf index b747c84..6f3bab6 100644 --- a/Dir Config/bacula-dir.conf +++ b/Dir Config/bacula-dir.conf @@ -35,7 +35,7 @@ Autochanger { # New resource Password = "iamnotacrook" Device = Drive-1-LTO-3, Drive-0-LTO-3 Media Type = LTO-3 - Maximum Concurrent Jobs = 3 + Maximum Concurrent Jobs = 2 } Storage { # Can have multiple of these per autochanger @@ -169,3 +169,11 @@ messages { # Send mail to me and Julio console = all, !skipped, !saved catalog = all } + +messages { # Send mail to me and Aidan + name = AidanMail + mail = 5730dogman@gmail.com ,kenwood364@gmail.com = all, !skipped + file = "/etc/bacula/scripts/webhooks/Aidan-Bacula-Mail.md" = all, !skipped + console = all, !skipped, !saved + catalog = all +} diff --git a/Dir Config/clients/zinc-client-users.conf b/Dir Config/clients/zinc-client-users.conf index 633173c..1e77eb4 100644 --- a/Dir Config/clients/zinc-client-users.conf +++ b/Dir Config/clients/zinc-client-users.conf @@ -24,7 +24,6 @@ Job { # Backup Michael Name = "Backup-Michael" JobDefs = "Default-User-Job" FileSet = "Michael Backup" - Messages = MikesMail } Job { # Backup Matthew @@ -60,3 +59,10 @@ Job { # Backup Julio FileSet = "Julio Backup" Messages = JuliosMail } + +Job { # Backup Aidan + Name = "Backup-Aidan" + JobDefs = "Default-User-Job" + FileSet = "Aidan Backup" + Messages = AidanMail +} \ No newline at end of file diff --git a/Dir Config/filesets/filesets-archive.conf b/Dir Config/filesets/filesets-archive.conf index 1596486..f645503 100644 --- a/Dir Config/filesets/filesets-archive.conf +++ b/Dir Config/filesets/filesets-archive.conf @@ -28,7 +28,7 @@ FileSet { Options { signature = MD5 } - File = "/mnt/Archive/Christina/" + File = "/mnt/Archive/Christina_Archive/" File = "/mnt/Archive/Aux-Christina/" } } diff --git a/Dir Config/filesets/filesets-system.conf b/Dir Config/filesets/filesets-system.conf index 5aa0f6c..25e85e7 100644 --- a/Dir Config/filesets/filesets-system.conf +++ b/Dir Config/filesets/filesets-system.conf @@ -26,14 +26,18 @@ FileSet { # Backup proxmox backups FileSet { Name = "Proxmox Backups" - Include { - Options { - signature = MD5 - } - File = "/mnt/Proxmox/" + Include { + Options { + wilddir = "*.tmp" # Ignore directories matching *.tmp + signature = MD5 + exclude = yes + } + File = "/mnt/Proxmox" } } + + # Backup 1721's Google Drives FileSet { Name = "Google-Drive Robotics" diff --git a/Dir Config/filesets/filesets-users.conf b/Dir Config/filesets/filesets-users.conf index d50b1af..d5e026f 100644 --- a/Dir Config/filesets/filesets-users.conf +++ b/Dir Config/filesets/filesets-users.conf @@ -137,3 +137,15 @@ FileSet { File = "/mnt/NextCloud/data/julio/" } } + +# Aidan's backup on zinc +FileSet { + Name = "Aidan Backup" + Include { + Options { + signature = MD5 + compression=GZIP + } + File = "/mnt/NextCloud/data/aidan/" + } +} diff --git a/Dir Config/pools.conf b/Dir Config/pools.conf index fc5f015..d5888a3 100644 --- a/Dir Config/pools.conf +++ b/Dir Config/pools.conf @@ -4,7 +4,7 @@ Pool { Recycle = yes # Allow these vols to be recycled Recycle Pool = Scratch # Where to put the vol after recycling AutoPrune = yes # Automaticly schedule for recycling - Volume Retention = 6 months # When to auto schedule for recycling + Volume Retention = 4.5 months # When to auto schedule for recycling Storage = Iron-Autochanger Maximum Volume Bytes = 800G diff --git a/Dir Config/scripts/webhooks/._sync_3f5c94a4c959.db b/Dir Config/scripts/webhooks/._sync_3f5c94a4c959.db index f7974fb244099c67d99eccec8ae6588be20e255d..8c1e799f7560733b631c294261132302d04ba899 100644 GIT binary patch delta 2123 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 Z{1R_8- zNH~ymU`lzG zN~8hP0)Z!^zvEYSV8;jwEROPbNVH{ zW+lKCF6wXejQ&NRV5S@FCZ5&r*-|zKE*Zm|VJU#TK4RB*I4}wlz5oz-A3Z`%OKu4g zGaDFvW2{D}APgh{Vu9EPRvizq;=r8|7OctSvjG-~JQ7x%<$x!7K<1FKmQcstLp3aH z!FRcu5(&kZRcd6)r$=-HjiA`TT$r=jchPORzHqm%4&AM%$`4m1(|v2hUxFX1qXBxDgCoKL2Br_5L(fSbjmcveLwq4c z5@o6_-|P6I5-Jh&l*~dVn91tp2saL~oCSSyc~P>|YJ{p9w7Y8;^}M~l#lfvmA*EF;i diff --git a/Dir Config/scripts/webhooks/bathook.py b/Dir Config/scripts/webhooks/bathook.py index 9f36f92..9235be9 100644 --- a/Dir Config/scripts/webhooks/bathook.py +++ b/Dir Config/scripts/webhooks/bathook.py @@ -1,3 +1,4 @@ +from discord_webhook import DiscordEmbed import re @@ -18,7 +19,13 @@ class bathook: self.usedvolumes = self.mextract(self.raw_messages, "Volume name\(s\):") self.jobname = self.mextract(self.raw_messages, "Job:") self.jobid = self.mextract(self.raw_messages, "JobId:") + self.level = self.mextract(self.raw_messages, "Backup Level:") self.data_from = data_from + + if "Backup OK" in self.raw_messages and "Backup OK -- with warnings" not in self.raw_messages: + self.backupstatus = "OK" + else: + self.backupstatus = "Error or warnings." self.maxCharPerMessage = 1994 @@ -33,11 +40,35 @@ class bathook: def get_formatted_message(self): if "Backup OK" in self.raw_messages and "Backup OK -- with warnings" not in self.raw_messages: truncated_stdout = ["""Job {0} (Job {1}) completed with status Backup OK, omitting full report. -All data from {2} was successfully written to tape on {3}. -Backup took {4} And used {5} bytes.""".format(self.jobname, self.jobid, self.data_from, self.endtime, self.elapsedtime, self.byteswritten)] +All data from {2} was successfully written to tape on {3}. Backup level was {4}. +Backup took {5} And used {6} bytes.""".format(self.jobname, self.jobid, self.data_from, self.endtime, self.level, self.elapsedtime, self.byteswritten)] if len(self.usedvolumes) > 1: truncated_stdout[0] = truncated_stdout[0] + ("\nWrote data to volume(s) {0} {1}".format(self.usedvolumes, self.rescheduled)) else: # Discord limits each message to 2000 chars, if the message is longer than that, truncate it - truncated_stdout = [cleaned_stdout[i:i+self.maxCharPerMessage] for i in range(0, len(cleaned_stdout), self.maxCharPerMessage)] - return(truncated_stdout) \ No newline at end of file + truncated_stdout = [self.raw_messages[i:i+self.maxCharPerMessage] for i in range(0, len(self.raw_messages), self.maxCharPerMessage)] + return(truncated_stdout) + + def get_discord_embed(self): + if self.backupstatus == "OK": + headercolor = 3388189 + headerdesc = "The most recent backup completed with status OK, and so the full report will not be shown." + else: + headercolor = 10358814 + headerdesc = "The most recent backup did not complete, or completed with errors, the fill report will still not be shown." + + self.embed = DiscordEmbed(title="Tape Job Results", description=headerdesc, color=headercolor) + self.embed.set_author(name="Snowsune's Tape Daemon", url="https://kitsunehosting.net/", icon_url="https://kitsunehosting.net/nextcloud/index.php/apps/files_sharing/publicpreview/zzygHFxJQXjXxMz?x=1920&y=553&a=true&file=TapeImage.JPG&scalingup=0") + self.embed.set_timestamp() + self.embed.add_embed_field(name="End Time", value=self.endtime) + self.embed.add_embed_field(name="Elapsed Time", value=self.elapsedtime) + self.embed.add_embed_field(name="Bytes Written", value=self.byteswritten) + if len(self.usedvolumes) > 0: + self.embed.add_embed_field(name="Used Volumes", value=self.usedvolumes) + self.embed.add_embed_field(name="Job Name", value=self.jobname) + self.embed.add_embed_field(name="Job ID", value=self.jobid) + self.embed.add_embed_field(name="Job Level", value=self.level) + if len(self.rescheduled) > 0: + self.embed.add_embed_field(name="Job Reschedule?", value=self.rescheduled) + + return(self.embed) \ No newline at end of file