X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=BackupPC_ovz;h=85394502ab86cc36b0dea6040d4ce468f710152d;hb=4113a0439950beb348322626fd0890221155932c;hp=2e0db7cb827824dccc80cd21d64269c96f915703;hpb=c9ba66d43a5b49494c2fb142f2d36718a1636be3;p=ovzbpc.git diff --git a/BackupPC_ovz b/BackupPC_ovz index 2e0db7c..8539450 100755 --- a/BackupPC_ovz +++ b/BackupPC_ovz @@ -1,12 +1,12 @@ #!/usr/bin/perl # # BackupPC_ovz +# Version: __appVersion__ # # OpenVZ integration for BackupPC allowing the latter to backup OpenVZ VE's # with ovz awareness to improve backup and restore efficiency and features. - +# # FIXME: signal handling to clean up mount point and snapshot on termination -# FIXME: saveConfigs and restoreConfigs aren't being used yet use strict; use Socket; @@ -16,12 +16,12 @@ use File::Path; use Proc::PID::File; # Various constants -my @HNS = ('pe18001.titaniummirror.com', 'pe18002.titaniummirror.com'); my @script_ext = qw(start stop mount umount); my @velist = (); my $pidfile = "/tmp/".basename($0).".pid"; my $vzsnap = 'vzsnap'; # Mount point and lv names. Mount is relative to /. my $snapsize = '1g'; +my $hnlistFile = "/etc/backuppc/".basename($0).".hnlist"; my $velistFile = $ENV{HOME}."/log/".basename($0).".velist"; sub cmdExecOrEval @@ -68,6 +68,15 @@ sub refreshConfig() { # Write the VEs on all HNs to a config file on the BackupPC server for # later use. + my @HNS = (); + open my $cfg, "<$hnlistFile" || die "Cannot read $hnlistFile"; + while (<$cfg>) { + chomp; + push(@HNS, split(' ')) if (! /^#/); + } + close($cfg); + die "No HNs defined in $hnlistFile" if ($#HNS < 0); + open my $out, ">$velistFile" || die "Cannot write to $velistFile"; foreach my $hn (@HNS) { open my $fh, "ssh -l root $hn vzlist -a |" || @@ -319,7 +328,7 @@ sub makeSnapshot($) die "Failed to create snapshot device" } $ve->{'snapdev'} = $snapdev; - cmdSystemOrEval("mount -o nouuid $snapdev $snaproot"); + cmdSystemOrEval("mount -o nouuid,noatime,nodiratime $snapdev $snaproot"); my $snapprivate = $ve->{'private'}; $snapprivate =~ s|/?$lvmpath/?|/$vzsnap/|; @@ -353,6 +362,8 @@ sub saveConfigs($) } } +# Because of the complexities involved with restoring VE configuartions and +# knowing when and how to do so, this feature is not currently implemented. sub restoreConfigs($) { my ($ve) = @_; @@ -421,12 +432,12 @@ sub runClient($) die "HN needs a VEID argument" if (!defined($veid)); die "HN: no command to execute after VEID" if ($#ARGV < 0); - # Find $host in the list of VEs + # We (the HN where this code is running) must be hosting the requested VE. my $ve = localVe($veid); die "VE $veid not found on this HN" if (!defined($ve)); #printVeEntry($ve); - if (! $restore) { + if (!$restore) { cmdSystemOrEval("vzctl stop $veid >/dev/null 2>&1") if ($ve->{'running'}); makeSnapshot($ve); cmdSystemOrEval("vzctl start $veid >/dev/null 2>&1") if ($ve->{'running'}); @@ -445,7 +456,7 @@ sub runClient($) #print "HN: cmd |$cmd|\n"; $? = 0; cmdSystemOrEval($cmd); - my $ret = $?; # FIXME + my $ret = $?; # FIXME - modify cmdSystemOrEval to get a return value. # Remove snapshot, we're done delSnapshot($ve); @@ -468,10 +479,6 @@ sub runServer($) { my ($restore) = @_; - # Build the beginning remote command - my $remoteCmd = "/usr/bin/".basename($0); - #print "Remote command is $remoteCmd\n"; - my $host = shift(@ARGV); die "Hostname argument required" if (!defined($host)); die "No command to execute after hostname" if ($#ARGV < 0); @@ -479,12 +486,12 @@ sub runServer($) # Find $host in the list of VEs loadVeList(); my $ve = getVeByHostname($host); - die "VE $host not found" if (!defined($ve)); + die "$host is not a VE or list of HNs in $0 is wrong" if (!defined($ve)); #printVeEntry($ve); - # The command line is bisected by the next occurrence of $host. Everything - # before is the ssh command (sans what to run on the VE) and everything - # after is the xfer command to run on the VE. + # The client command is bisected by the next occurrence of $host. Everything + # before is the ssh command to reach the client and everything after is the + # xfer command sent to the client via ssh. my @sshCmd; my @xferCmd; my $foundHost = 0; @@ -504,74 +511,13 @@ sub runServer($) #print "ssh command: |".join(' ', @sshCmd)."|\n"; #print "xfer command: |".join(' ', @xferCmd)."|\n"; - # Create command line to initiate the remote side of the backup. The - # remote side runs on the VE's HN and is given the VE's VEID. - my $cmd = join(' ', @sshCmd)." ".$ve->{'HN'}." $remoteCmd ". - ($restore ? "restore " : "").$ve->{'VEID'}." ".join(' ', @xferCmd); + # Create the command line to initiate the client side of the backup. We + # contact the HN hosting the VE and run an invocation of this script there + # to perform the required operations for VE backup or restore. + my $cmd; + $cmd = join(' ', @sshCmd)." ".$ve->{'HN'}." /usr/bin/".basename($0)." ". + ($restore ? "restore " : "").$ve->{'VEID'}." ".join(' ', @xferCmd); #print "remote command: |$cmd|\n"; - - ## Search and replace - #foreach my $key (keys %{$velist[0]}) { - # my $val = $ve->{$key}; - # $cmd =~ s/\@$key\@/$val/g if (defined($val)); - #} - - cmdExecOrEval($cmd); -} - -# A hard-coded test; didn't seem to help -sub runServer_test($) -{ - my ($restore) = @_; - - # Build the beginning remote command - my $remoteCmd = "/usr/bin/".basename($0); - #print "Remote command is $remoteCmd\n"; - - my $host = shift(@ARGV); - die "Hostname argument required" if (!defined($host)); - die "No command to execute after hostname" if ($#ARGV < 0); - - # Find $host in the list of VEs - loadVeList(); - my $ve = getVeByHostname($host); - die "VE $host not found" if (!defined($ve)); - #printVeEntry($ve); - - # The command line is bisected by the next occurrence of $host. Everything - # before is the ssh command (sans what to run on the VE) and everything - # after is the xfer command to run on the VE. - my @sshCmd; - my @xferCmd; - my $foundHost = 0; - foreach my $arg (@ARGV) { - if ($arg eq $host) { - $foundHost = 1; - } else { - if ($foundHost) { - push(@xferCmd, $arg); - } else { - push(@sshCmd, $arg); - } - } - } - die "No ssh command found" if ($#sshCmd < 0); - die "No xfer command found" if ($#xferCmd < 0); - #print "ssh command: |".join(' ', @sshCmd)."|\n"; - #print "xfer command: |".join(' ', @xferCmd)."|\n"; - - # Create command line to initiate the remote side of the backup. The - # remote side runs on the VE's HN and is given the VE's VEID. - my $cmd = join(' ', @sshCmd)." pe18002.titaniummirror.com $remoteCmd ". - ($restore ? "restore " : "")."151 ".join(' ', @xferCmd); - #print "remote command: |$cmd|\n"; - - ## Search and replace - #foreach my $key (keys %{$velist[0]}) { - # my $val = $ve->{$key}; - # $cmd =~ s/\@$key\@/$val/g if (defined($val)); - #} - cmdExecOrEval($cmd); }