Backup Proxmox Containers to FTP

2011-05-26 18:31:32 by demon

Sometimes there is no other option, as using FTP for backup. A quick search through Net gives several solutions, but sadly they are mostly either buggy or ugly. So here is my own.

It depends on ftp-upload and Perl >5.9.

#!/usr/bin/perl -w
# hook script for vzdump (--script option)
# quax@ 26.04.2011

use strict;
print "HOOK: " . join (' ', @ARGV) . "\n";

# config
my $host = "host";
my $user = "user";
my $pass = "secret";
my $dir = "/";

my $phase = shift;
my $mode = shift; # stop/suspend/snapshot
my $vmid = shift;
my $vmtype = $ENV{VMTYPE}; # openvz/qemu
my $dumpdir = $ENV{DUMPDIR};
my $hostname = $ENV{HOSTNAME};
my $tarfile = $ENV{TARFILE};
my $logfile = $ENV{LOGFILE}; 

my %dispatch = (
        "job-start"     => \&nop,
        "job-end"       => \&nop,
        "job-abort"     => \&nop,
        "backup-start"  => \&nop,
        "backup-end"    => \&backup_end,
        "backup-abort"  => \&nop,
        "log-end"       => \&log_end,
        "pre-stop"      => \&nop,
        "pre-restart"   => \&nop,
);

sub upload {
        my $file = shift;

        # try it twice
        system("echo $pass | ftp-upload -h $host -u $user -s -d $dir $file") == 0 ||
        system("echo $pass | ftp-upload -h $host -u $user -s -d $dir $file") == 0 ||
        die "upload to backup-host failed";

        print "HOOK: upload " . $file . " to ftp://" . $host . $dir . " done\n";
}

sub nop {
        # nothing
}

sub backup_end {
        upload($tarfile);
}

sub log_end {
        upload($logfile);
}

exists $dispatch{$phase} ? $dispatch{$phase}() : die "got unknown phase '$phase'";

exit (0);

put it into /usr/local/bin/backup-hook.pl and execute

# echo "script: /usr/local/bin/backup-hook.pl" >> /etc/vzdump.conf
to add it to your config file.

Add a comment:

name

email

url

max length 1000 chars