diff --git a/mxproxmox/mxproxmox b/mxproxmox/mxproxmox index aafb077..49f9bf8 100755 --- a/mxproxmox/mxproxmox +++ b/mxproxmox/mxproxmox @@ -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: @@ -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; @@ -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>) { @@ -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) = @_; @@ -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; @@ -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; @@ -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_/; @@ -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)$/ ) { @@ -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; }