]> git.proxmox.com Git - pve-manager.git/commitdiff
vzdump: add new 'remove' flag to disable automatic file removal
authorDietmar Maurer <dietmar@proxmox.com>
Fri, 23 Mar 2012 08:56:41 +0000 (09:56 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 23 Mar 2012 09:05:14 +0000 (10:05 +0100)
The maxfiles flags is now a storage related flag. So we set that on
the storage definition, and removed it from the scheduled backup GUI.
We use '--remove 0' for 'Backup now', so the user need to remove
old backups himself.

PVE/VZDump.pm
debian/changelog.Debian
defines.mk
www/manager/dc/Backup.js
www/manager/storage/DirEdit.js
www/manager/storage/NFSEdit.js
www/manager/window/Backup.js

index 930c070411b0881a6bc0f96a7fac2c2e77799b1f..835e878bfcac968caca345f7394310289e0e6771 100644 (file)
@@ -439,6 +439,9 @@ sub new {
 
     my $defaults = read_vzdump_defaults();
 
+    my $maxfiles = $opts->{maxfiles};
+    $opts->{remove} = 1 if !defined($opts->{remove});
+
     foreach my $k (keys %$defaults) {
        if ($k eq 'dumpdir' || $k eq 'storage') {
            $opts->{$k} = $defaults->{$k} if !defined ($opts->{dumpdir}) &&
@@ -497,6 +500,7 @@ sub new {
     if ($opts->{storage}) {
        my $info = storage_info ($opts->{storage});
        $opts->{dumpdir} = $info->{dumpdir};
+       $maxfiles = $info->{maxfiles} if !$maxfiles && $info->{maxfiles};
     } elsif ($opts->{dumpdir}) {
        die "dumpdir '$opts->{dumpdir}' does not exist\n"
            if ! -d $opts->{dumpdir};
@@ -508,6 +512,8 @@ sub new {
        die "tmpdir '$opts->{tmpdir}' does not exist\n";
     }
 
+    $opts->{maxfiles} = $maxfiles if $maxfiles;
+
     return $self;
 
 }
@@ -661,6 +667,22 @@ sub compressor_info {
        die "internal error - unknown compression option '$opt_compress'";
     }
 }
+
+sub get_backup_file_list {
+    my ($dir, $bkname, $exclude_fn) = @_;
+
+    my $bklist = [];
+    foreach my $fn (<$dir/${bkname}-*>) {
+       next if $exclude_fn && $fn eq $exclude_fn;
+       if ($fn =~ m!/(${bkname}-(\d{4})_(\d{2})_(\d{2})-(\d{2})_(\d{2})_(\d{2})\.(tgz|(tar(\.(gz|lzo))?)))$!) {
+           $fn = "$dir/$1"; # untaint
+           my $t = timelocal ($7, $6, $5, $4, $3 - 1, $2 - 1900);
+           push @$bklist, [$fn, $t];
+       }
+    }
+
+    return $bklist;
+}
  
 sub exec_backup_task {
     my ($self, $task) = @_;
@@ -692,6 +714,14 @@ sub exec_backup_task {
        $lt->year + 1900, $lt->mon + 1, $lt->mday, 
        $lt->hour, $lt->min, $lt->sec;
 
+       my $maxfiles = $opts->{maxfiles};
+
+       if ($maxfiles && !$opts->{remove}) {
+           my $bklist = get_backup_file_list($opts->{dumpdir}, $bkname);
+           die "only $maxfiles backup(s) allowed - please consider to remove old backup files.\n" 
+               if scalar(@$bklist) >= $maxfiles;
+       }
+
        my $logfile = $task->{logfile} = "$opts->{dumpdir}/$basename.log";
 
        my $ext = '.tar';
@@ -877,26 +907,12 @@ sub exec_backup_task {
 
        # purge older backup
 
-       my $maxfiles = $opts->{maxfiles};
-
-       if ($maxfiles) {
-           my @bklist = ();
-           my $dir = $opts->{dumpdir};
-           foreach my $fn (<$dir/${bkname}-*>) {
-               next if $fn eq $task->{tarfile};
-               if ($fn =~ m!/(${bkname}-(\d{4})_(\d{2})_(\d{2})-(\d{2})_(\d{2})_(\d{2})\.(tgz|(tar(\.(gz|lzo))?)))$!) {
-                   $fn = "$dir/$1"; # untaint
-                   my $t = timelocal ($7, $6, $5, $4, $3 - 1, $2 - 1900);
-                   push @bklist, [$fn, $t];
-               }
-           }
-       
-           @bklist = sort { $b->[1] <=> $a->[1] } @bklist;
+       if ($maxfiles && $opts->{remove}) {
+           my $bklist = get_backup_file_list($opts->{dumpdir}, $bkname, $task->{tarfile});
+           $bklist = [ sort { $b->[1] <=> $a->[1] } @$bklist ];
 
-           my $ind = scalar (@bklist);
-
-           while (scalar (@bklist) >= $maxfiles) {
-               my $d = pop @bklist;
+           while (scalar (@$bklist) >= $maxfiles) {
+               my $d = pop @$bklist;
                debugmsg ('info', "delete old backup '$d->[0]'", $logfd);
                unlink $d->[0];
                my $logfn = $d->[0];
@@ -1161,6 +1177,12 @@ my $confdesc = {
        optional => 1,
        minimum => 1,
     },
+    remove => {
+       type => 'boolean',
+       description => "Remove old backup files if there are more than 'maxfiles' backup files.",
+       optional => 1,
+       default => 1,
+    },
 };
 
 sub option_exists {
index 16150c2a7f4a8d72f8ee012c08136fad52b8de83..d132835f4d6727e30e23996e9dc7a172c1b6b36a 100644 (file)
@@ -1,3 +1,12 @@
+pve-manager (2.0-44) unstable; urgency=low
+
+  * Disable automatic file removal on 'Backup now'
+  
+  * Option 'maxfiles' is now a storage option (to specify the maximal
+    number of allowed backups per VM)
+
+ -- Proxmox Support Team <support@proxmox.com>  Fri, 23 Mar 2012 10:03:23 +0100
+
 pve-manager (2.0-43) unstable; urgency=low
 
   * vzdump: do not use tar flag --ignore-failed-read
index fc57bdd028c1ee5ab1b5f936508bbb78d0084237..a0bb686b1da867e54628dce0bf4ab5fd6827f18b 100644 (file)
@@ -2,7 +2,7 @@ RELEASE=2.0
 
 VERSION=2.0
 PACKAGE=pve-manager
-PACKAGERELEASE=43
+PACKAGERELEASE=44
 
 BINDIR=${DESTDIR}/usr/bin
 PERLLIBDIR=${DESTDIR}/usr/share/perl5
index b68f837e5889edf99b7ca2cc9aa077533f21bd8e..34a56c97c54b70cdfb2181839429d9270a1d9dba 100644 (file)
@@ -164,15 +164,6 @@ Ext.define('PVE.dc.BackupEdit', {
                name: 'compress',
                value: me.create ? 'lzo' : ''
            },
-           {
-               xtype: 'numberfield',
-               fieldLabel: gettext('Max files'),
-               name: 'maxfiles',
-               minValue: 1,
-               maxValue: 365,
-               value: '1',
-               allowBlank: false
-           },
            {
                xtype: 'pveBackupModeSelector',
                fieldLabel: gettext('Mode'),
index 1eaf08a650e1aa5ef488bc5d7d91c440f8d6f9bc..166400ccab3b7d4787cd922bccdedcc038165ffc 100644 (file)
@@ -61,6 +61,15 @@ Ext.define('PVE.storage.DirInputPanel', {
                name: 'shared',
                uncheckedValue: 0,
                fieldLabel: gettext('Shared')
+           },
+           {
+               xtype: 'numberfield',
+               fieldLabel: gettext('Max Backups'),
+               name: 'maxfiles',
+               minValue: 0,
+               maxValue: 365,
+               value: me.create ? '1' : undefined,
+               allowBlank: false
            }
        ];
 
index 0c3a32bf3f91d476f8c16feebdaa9b74866172b2..520d490845e1f2e897c3cb54372cb644264131fc 100644 (file)
@@ -141,6 +141,15 @@ Ext.define('PVE.storage.NFSInputPanel', {
                checked: true,
                uncheckedValue: 0,
                fieldLabel: gettext('Enable')
+           },
+           {
+               xtype: 'numberfield',
+               fieldLabel: gettext('Max Backups'),
+               name: 'maxfiles',
+               minValue: 0,
+               maxValue: 365,
+               value: me.create ? '1' : undefined,
+               allowBlank: false
            }
        ];
 
index 46eb42a9a7104e44f5e1df3e5d26ae8a5957e146..f7b30d5f3ccd10a85c1fee3af671e6f0df609ade 100644 (file)
@@ -59,9 +59,10 @@ Ext.define('PVE.window.Backup', {
                var storage = storagesel.getValue();
                var values = form.getValues();
                var params = {
-                       storage: storage,
-                       vmid: me.vmid,
-                       mode: values.mode
+                   storage: storage,
+                   vmid: me.vmid,
+                   mode: values.mode,
+                   remove: 0
                };
                if (values.compress) {
                    params.compress = values.compress;