Skip to content

mxproxmox: add check pbackup #286

Merged
merged 7 commits into from
Dec 8, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;
}