From 40ced83d22808bc2b75e8ed7f678c5502a34c2d4 Mon Sep 17 00:00:00 2001
From: Florent Heuze
Date: Fri, 8 Nov 2019 16:40:15 +0100
Subject: [PATCH 1/3] Initial commit
---
LICENSE | 21 +++++++++++++++++++++
README.md | 3 +++
2 files changed, 24 insertions(+)
create mode 100644 LICENSE
create mode 100644 README.md
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d449d3e
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6d585a0
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# BackupPC-Check
+
+Vérification des sauvegardes BackupPC
\ No newline at end of file
From 05ecc2418251a63d029e4e3ad988e22176be8ada Mon Sep 17 00:00:00 2001
From: Heuzef
Date: Fri, 8 Nov 2019 16:44:05 +0100
Subject: [PATCH 2/3] Init project.
---
Check.pm | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
README.md | 20 ++++++-
update.sh | 8 +++
3 files changed, 213 insertions(+), 1 deletion(-)
create mode 100644 Check.pm
create mode 100644 update.sh
diff --git a/Check.pm b/Check.pm
new file mode 100644
index 0000000..45e7a8f
--- /dev/null
+++ b/Check.pm
@@ -0,0 +1,186 @@
+#============================================================= -*-perl-*-
+#
+# BackupPC::CGI::Check package
+#
+# DESCRIPTION
+#
+# This module implements the Check action for the CGI interface.
+#
+# AUTHOR
+# Heuze Florent
+#
+#========================================================================
+#
+# Released November 2019 - firewall-services.com
+#
+#========================================================================
+
+package BackupPC::CGI::Check;
+
+use strict;
+use lib "/usr/share/BackupPC/lib";
+use BackupPC::Lib;
+use BackupPC::CGI::Lib qw(:all);
+use Statistics::Descriptive;
+
+sub action
+{
+ # Init
+ my($str, $strGood, $header);
+ GetStatusInfo("hosts info");
+ my $Privileged = CheckPermission();
+ my $bpc = BackupPC::Lib->new();
+
+ # Start loop
+ foreach my $host ( GetUserHosts(1) ) {
+ my($incrAge, $reasonHilite, $frequency, $idBackup, $lastAge, $lastAgeColor, $tempState, $tempReason, $lastXferErrors, $lastXferErrorsColor, $ifErrors, $sizeConsistency, $sizeConsistencyColor);
+ my($shortErr);
+ my @Backups = $bpc->BackupInfoRead($host);
+
+ $bpc->ConfigRead($host);
+ %Conf = $bpc->Conf();
+
+ next if ( $Conf{XferMethod} eq "archive" );
+ next if ( !$Privileged && !CheckPermission($host) );
+
+ # Get frequency for this host
+ if ( $Conf{IncrPeriod} < $Conf{FullPeriod} ) {
+ $frequency = $Conf{IncrPeriod};
+ } else {
+ $frequency = $Conf{FullPeriod};
+ }
+
+ # ID
+ my $idBackup = $Backups[@Backups-1]->{num} if ( @Backups );
+
+ # Age
+ my $lastBackup = ( $Backups[-1]->{type} =~ m/^full|incr$/ ) ? -1 : -2;
+ $lastAge = sprintf("%.1f", (time - $Backups[$lastBackup]->{startTime}) / (24 * 3600));
+
+ # Color for age
+ if ( $lastAge < $frequency ) {
+ $lastAgeColor = "MediumSeaGreen";
+ } else {
+ $lastAgeColor = "Tomato";
+ }
+
+ # Color and link for errors
+ $lastXferErrors = $Backups[@Backups-1]->{xferErrs} if ( @Backups );
+ if ( $lastXferErrors == 0 ) {
+ $lastXferErrorsColor = "MediumSeaGreen";
+ $ifErrors = "";
+ } else {
+ $lastXferErrorsColor = "Tomato";
+ my $browseErrors = "?action=view&type=XferErr&num=$idBackup&host=$host";
+ $ifErrors = "| Read me !";
+ }
+
+ # Colors statuts
+ $reasonHilite = $Conf{CgiStatusHilightColor}{$Status{$host}{reason}} || $Conf{CgiStatusHilightColor}{$Status{$host}{state}};
+ $reasonHilite = " bgcolor=\"$reasonHilite\"" if ( $reasonHilite ne "" );
+
+ # Check Size Consistency
+ my $new_size = 0;
+ my $new_size_avg = 0;
+ my $new_size_q1 = 0;
+ my $new_size_q3 = 0;
+ my $sizes = new Statistics::Descriptive::Full;
+
+ foreach my $backup ( @Backups ) {
+ my $idBackup = $Backups[@Backups-1]->{num} if ( @Backups );
+ # Skip partial or active backups
+ next if ( $backup->{type} !~ m/^full|incr$/ );
+ # Push all the sizes in our data set to compute avg sizes
+ # Exclude backup N°0 as it'll always have much more new data than normal backups
+ $sizes->add_data($backup->{sizeNew}) unless ( $backup->{num} == 0 );
+
+ # Ignore the last backup if it's not full or incr (which means it's either partial or active)
+ my $i = ( $Backups[-1]->{type} =~ m/^full|incr$/ ) ? -1 : -2;
+ $new_size = $Backups[$i]->{sizeNew};
+ $new_size_avg = int $sizes->mean;
+ $new_size_q1 = eval { int $sizes->quantile(1) } || 0;
+ $new_size_q3 = eval { int $sizes->quantile(3) } || 0;
+ }
+
+ # Using a mathematical formula to calculate the consistency of the average size, for new files, on all backups
+ my $toobig = 0;
+ my $toosmall = 0;
+ my $sizeConsistencyColor = "Tomato";
+ my $sizeConsistency = "ANOMALOUS";
+
+ # TOO BIG ? If the size is 6 times higher than usual :
+ if ( $new_size > ($new_size_q3 + ($new_size_q3 - $new_size_q1) ) * 1.5 and $new_size > $new_size_avg * 6 ) {
+ $toobig = 1;
+ }
+
+ # TOO SMALL ? If the size is 3 times lower than usual :
+ if ( $new_size < ($new_size_q1 - ($new_size_q3 - $new_size_q1) ) * 1.5 and $new_size < $new_size_avg / 3 ) {
+ $toosmall = 1;
+ }
+
+ # Get result
+ if ( not $idBackup > 4) {
+ $sizeConsistencyColor = "Gray";
+ $sizeConsistency = "Not enough backups";
+ }
+ elsif ( not $toobig and not $toosmall and not $idBackup < 4) {
+ $sizeConsistencyColor = "MediumSeaGreen";
+ $sizeConsistency = "Normal";
+ }
+
+ # Get URL for explore file
+ my $browseFile = "?action=browse&host=$host";
+
+ # Show summary
+ $str .= <
+ $host ($idBackup) |
+ $lastAge (Freq: $frequency) |
+ $lastXferErrors $ifErrors |
+ $sizeConsistency |
+
+EOF
+
+ }
+ # End loop
+
+ # Time set
+ my $now = timeStamp2(time);
+ my $DUmaxTime = timeStamp2($Info{DUDailyMaxTime});
+ my $DUInodemaxTime = timeStamp2($Info{DUInodeDailyMaxTime});
+
+ # Show header
+ $header = <This check was generated at \$now.
+
+ File system pool size usage (\$DUmaxTime) :
+
+
+ File system inode size usage (\$DUInodemaxTime) :
+
+
\$Info{DUInodeDailyMax}%
+
+
+ \${h2("Backups summary")}
+
+
+EOF
+
+ # Show page
+ my $content = eval ("qq{$header}");
+ Header("BackupPC: Check", $content);
+ Trailer();
+}
+
+1;
diff --git a/README.md b/README.md
index 6d585a0..74c7c9e 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,21 @@
# BackupPC-Check
-Vérification des sauvegardes BackupPC
\ No newline at end of file
+Verifying BackupPC Backups
+
+# Install
+
+## Install dependencies
+
+``yum -y perl-Statistics-Descriptive``
+
+## Install Backup-Check
+
+``cd /root ; git clone ssh://gitea@gitea.fws.fr:3222/fws/BackupPC-Check.git ; sh /root/BackupPC-Check/update.sh``
+
+## Add menu link
+
+Edit config -> CGI -> CgiNavBarLinks and add name "Check" with link "?action=check".
+
+# Update
+
+``sh /root/BackupPC-Check/update.sh``
diff --git a/update.sh b/update.sh
new file mode 100644
index 0000000..33d874e
--- /dev/null
+++ b/update.sh
@@ -0,0 +1,8 @@
+echo ""
+echo "Updating ..."
+echo ""
+git pull
+sleep 1
+\cp -v Check.pm /usr/share/BackupPC/lib/BackupPC/CGI/Check.pm
+echo ""
+echo "OK"
From c960fdab2accb5cca8170e8bb6e5e3c41e35dc6c Mon Sep 17 00:00:00 2001
From: Heuzef
Date: Fri, 22 Nov 2019 11:18:14 +0100
Subject: [PATCH 3/3] Update Reademe
---
README.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/README.md b/README.md
index 74c7c9e..4b6930e 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,12 @@ Verifying BackupPC Backups
``cd /root ; git clone ssh://gitea@gitea.fws.fr:3222/fws/BackupPC-Check.git ; sh /root/BackupPC-Check/update.sh``
+## Declare the new Action
+
+Edit ``/usr/share/BackupPC/sbin/BackupPC_Admin.pl`` file to add this line in **%ActionDispatch** array :
+
+``"check" => "Check",``
+
## Add menu link
Edit config -> CGI -> CgiNavBarLinks and add name "Check" with link "?action=check".