Skip to content

Commit

Permalink
Merge pull request #286 from mariux64/mxproxmox-add-check-pbackup
Browse files Browse the repository at this point in the history
mxproxmox: add check pbackup
  • Loading branch information
donald authored Dec 8, 2022
2 parents 08dbbfb + bbd5231 commit 1e3aca5
Showing 1 changed file with 77 additions and 19 deletions.
96 changes: 77 additions & 19 deletions mxproxmox/mxproxmox
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ usage: $0 cmd
$0 backup ident path
$0 local-backups : run local backups (if needed)
$0 test
$0 api path : get from path, dump result
$0 client [cmd...] : call proxmox-backup-client (add key file if required)
$0 tclient [cmd...] : same with workaround for reiserfs /tmp
$0 active-jobs : list jobs active on server
$0 check-pbackup : cross-check pbackup and mxproxmox jobs
Examples:
Expand All @@ -37,7 +37,6 @@ sub read_cred_file {
chomp($PBS_PASSWORD);
$ENV{'PBS_PASSWORD'} = $PBS_PASSWORD;
}
read_cred_file();

my $hostname = `hostname -s`;chomp $hostname;

Expand All @@ -57,7 +56,7 @@ sub save_qx {
}

sub do_map {
my ($prefix, $mapname) = @_;
my ($prefix, $mapname, $local_only) = @_;
my @out;
open my $in, "/etc/automount/$mapname" or die "/etc/automount/$mapname: $!\n";
while (<$in>) {
Expand All @@ -70,13 +69,18 @@ sub do_map {
@f = split ':', $hostname_and_path;
@f == 2 or next;
my ($host, $path) = @f;
push @out, [ "${prefix}_$key", $path ] if $host eq $hostname;
if (!$local_only || $host eq $hostname) {
push @out, [ "${prefix}_$key", $path ];
}
}
return (@out);
}

my $ua = new LWP::UserAgent( ssl_opts => { verify_hostname => 0 } );
$ua->default_header( Authorization => 'PBSAPIToken mariux64@pbs!backup:'.$PBS_PASSWORD );
our $ua;
sub init_ua {
$ua = new LWP::UserAgent( ssl_opts => { verify_hostname => 0 } );
$ua->default_header( Authorization => 'PBSAPIToken mariux64@pbs!backup:'.$PBS_PASSWORD );
}

sub get {
my ($path) = @_;
Expand Down Expand Up @@ -147,9 +151,6 @@ sub latest_snapshot_age {
return time-latest_snapshot($ident);
}

sub cmd_test {
}

sub cmd_backup {
my ($ident, $path, $limit) = @_;
lstat $path;
Expand Down Expand Up @@ -198,7 +199,7 @@ sub read_backup_list {
open my $in, '<', '/etc/mxproxmox/backup-list.dat' or die "/etc/mxproxmox/backup-list.dat: $!\n";
while (<$in>) {
chomp;
s/#.*//;
s/\s*#.*//;
/\S/ or next;
my ($project, $opt_limit) = split " ";
$INCLUDE{$project} = $opt_limit;
Expand All @@ -210,12 +211,11 @@ sub cmd_local_backups {
read_backup_list();
my @jobs = ([ "sys_$hostname", "/" ]) ;
for my $p (
do_map('home', 'auto.home'),
do_map('cfdl', 'auto.confidential'),
do_map('prj', 'auto.project'),
do_map('pkg', 'auto.package'),
do_map('cfdl', 'auto.confidential'),
do_map('src', 'auto.src'),
do_map('home', 'auto.home', 1),
do_map('cfdl', 'auto.confidential', 1),
do_map('prj', 'auto.project', 1),
do_map('pkg', 'auto.package', 1),
do_map('src', 'auto.src', 1),
) {
my ($ident, $path) = @$p;
push @jobs, $p if $ident =~ /^home_/;
Expand Down Expand Up @@ -248,6 +248,54 @@ sub cmd_local_backups {
}
}

sub cmd_check_pbackup {

read_backup_list();

my %jobs;
for my $p (
do_map('home', 'auto.home', 0),
do_map('cfdl', 'auto.confidential', 0),
do_map('prj', 'auto.project', 0),
do_map('pkg', 'auto.package', 0),
do_map('src', 'auto.src', 0),
) {
my ($ident, $path) = @$p;
$jobs{$ident} = $path if $ident =~ /^home_/;
$jobs{$ident} = $path if exists $INCLUDE{$ident};
}

my %pbackup_jobs;
open my $pipe, '-|', '/project/admin/pbackup/bin/pbackup', 'parse-jobs' or die "/project/admin/pbackup/bin/pbackup: $!\n";
for (<$pipe>) {
chomp;
my ($ident, $path) = split " ", $_, 2;
next if $ident =~ /^sys_/;
$path =~ s/^[a-z0-9]+://i;
$pbackup_jobs{$ident} = $path;
}
close $pipe or exit 1;

print "\n\n# The following output was generated by `mxproxmox check-pbackup`:\n\n";

for my $ident (sort keys %jobs) {
if (!exists $pbackup_jobs{$ident}) {
print "# consider to remove $ident, because it is not a a pbackup job\n";
}
}
print "\n";

for my $ident (sort keys %pbackup_jobs) {
if (exists $jobs{$ident}) {
if ($pbackup_jobs{$ident} ne $jobs{$ident}) {
warn "$ident: path differ. pbackup: ", $pbackup_jobs{$ident}, " proxmox: ", $jobs{$ident}, "\n";
}
} else {
printf "# %-30s # consider to add, because its a pbackup job\n", $ident;
}
}
}

sub cmd_client {
my @cmd = ('proxmox-backup-client', @_);
if ( $_[0] =~ /^(catalog|restore|mount|map|backup)$/ ) {
Expand All @@ -266,24 +314,34 @@ sub cmd_tclient {

@ARGV >= 1 or die USAGE;
my ($cmd,@rest) = shift;
if ($cmd eq 'test') {
cmd_test(@ARGV);
} elsif ($cmd eq 'api') {
if ($cmd eq 'api') {
@ARGV==1 or die USAGE;
read_cred_file();
init_ua();
cmd_api(@ARGV);
} elsif ($cmd eq 'local-backups') {
@ARGV==0 or die USAGE;
read_cred_file();
init_ua();
cmd_local_backups(@ARGV);
} elsif ($cmd eq 'backup') {
@ARGV==2 or die USAGE;
read_cred_file();
cmd_backup(@ARGV);
} elsif ($cmd eq 'client') {
read_cred_file();
cmd_client(@ARGV);
} elsif ($cmd eq 'tclient') {
read_cred_file();
cmd_tclient(@ARGV);
} elsif ($cmd eq 'active-jobs') {
@ARGV==0 or die USAGE;
read_cred_file();
init_ua();
cmd_active_jobs(@ARGV);
} elsif ($cmd eq 'check-pbackup') {
@ARGV==0 or die USAGE;
cmd_check_pbackup(@ARGV);
} else {
die USAGE;
}

0 comments on commit 1e3aca5

Please sign in to comment.