]> git.proxmox.com Git - pmg-api.git/blobdiff - PMG/Backup.pm
rewrite config log followup: move common log message out in closure
[pmg-api.git] / PMG / Backup.pm
index 81f2ba591793e731b81512b1ef90efb9bffb83cf..a451c6c9082b16eea4d377ce8ef96c25583cf1eb 100644 (file)
@@ -11,6 +11,8 @@ use PVE::Tools;
 use PMG::pmgcfg;
 use PMG::AtomicFile;
 
+my $sa_custom_config_fn = "/etc/mail/spamassassin/custom.cf";
+
 sub dump_table {
     my ($dbh, $table, $ofh, $seq, $seqcol) = @_;
 
@@ -179,28 +181,18 @@ sub pmg_backup {
        print $vfh "product: $pkg\nversion: $ver\nbackuptime:$time:$now\n";
        $vfh->close(1);
 
-       my $sshfiles = -d '/root/.ssh' ? '/root/.ssh' : '';
-
-       my $extra_cfgs = '/etc/passwd /etc/group';
-
-       my $extra_fn = '/etc/shadow';
-       $extra_cfgs .= " $extra_fn" if -e $extra_fn;
+       my $extra_cfgs =  [];
 
-       $extra_fn = '/etc/gshadow';
-       $extra_cfgs .= " $extra_fn" if -e $extra_fn;
+       push @$extra_cfgs, $sa_custom_config_fn;
 
-       $extra_fn = '/etc/mail/spamassassin/custom.cf';
-       $extra_cfgs .= " $extra_fn" if -e $extra_fn;
-
-       #$extra_fn = '/etc/postfix/tls_policy';
-       #$extra_cfgs .= " $extra_fn" if -e $extra_fn;
+       #push @$extra_cfgs, '/etc/postfix/tls_policy';
 
        my $extradb = $include_statistics ? $statfn : '';
 
-       # we do not store cluster configurations (cluster.cfg)
+       my $extra = join(' ', @$extra_cfgs);
 
        system("/bin/tar cf $dirname/$tarfn -C / " .
-              "/etc/pmg $sshfiles $extra_cfgs>/dev/null 2>&1") == 0 ||
+              "/etc/pmg $extra>/dev/null 2>&1") == 0 ||
               die "unable to create system configuration backup: ERROR";
 
        system("cd $dirname; md5sum $tarfn $dbfn $extradb $verfn> $sigfn") == 0 ||
@@ -219,4 +211,107 @@ sub pmg_backup {
     }
 }
 
+sub pmg_restore {
+    my ($filename, $restore_database, $restore_config, $restore_statistics) = @_;
+
+    my $dbname = 'Proxmox_ruledb';
+
+    my $time = time;
+    my $dirname = "/tmp/proxrestore_$$.$time";
+    my $dbfn = "Proxmox_ruledb.sql";
+    my $statfn = "Proxmox_statdb.sql";
+    my $tarfn = "config_backup.tar";
+    my $sigfn = "proxmox_backup_v1.md5";
+
+    eval {
+       # create a temporary directory
+       mkdir $dirname;
+
+       system("cd $dirname; tar xzf $filename >/dev/null 2>&1") == 0 ||
+           die "unable to extract backup archive: ERROR";
+
+       system("cd $dirname; md5sum -c $sigfn") == 0 ||
+           die "proxmox backup signature check failed: ERROR";
+
+       if ($restore_config) {
+           # restore the tar file
+           mkdir "$dirname/config/";
+           system("tar xpf $dirname/$tarfn -C $dirname/config/") == 0 ||
+               die "unable to restore configuration tar archive: ERROR";
+
+           -d "$dirname/config/etc/pmg" ||
+               die "backup does not contain a valid system configuration directory (/etc/pmg)\n";
+           # unlink unneeded files
+           unlink "$dirname/config/etc/pmg/cluster.conf"; # never restore cluster config
+           rmtree "$dirname/config/etc/pmg/master";
+
+           # remove current config, but keep directory for INotify
+           rmtree("/etc/pmg", { keep_root => 1 });
+           # copy files
+           system("cp -a $dirname/config/etc/pmg/* /etc/pmg/") == 0 ||
+               die "unable to restore system configuration: ERROR";
+
+           if (-f "$dirname/config/${sa_custom_config_fn}") {
+               my $data = PVE::Tools::file_get_contents(
+                   "$dirname/config/${sa_custom_config_fn}", 1024*1024);
+               PVE::Tools::file_set_contents($sa_custom_config_fn, $data);
+           }
+
+           my $cfg = PMG::Config->new();
+           my $ruledb = PMG::RuleDB->new();
+           my $rulecache = PMG::RuleCache->new($ruledb);
+           $cfg->rewrite_config($rulecache, 1);
+       }
+
+       if ($restore_database) {
+           # recreate the database
+
+           # stop all services accessing the database
+           PMG::Utils::service_wait_stopped(40, $PMG::Utils::db_service_list);
+
+           print "Destroy existing rule database\n";
+           PMG::DBTools::delete_ruledb($dbname);
+
+           print "Create new database\n";
+           my $dbh = PMG::DBTools::create_ruledb($dbname);
+
+           system("cat $dirname/$dbfn|psql $dbname >/dev/null 2>&1") == 0 ||
+               die "unable to restore rule database: ERROR";
+
+           if ($restore_statistics) {
+               if (-f "$dirname/$statfn") {
+                   system("cat $dirname/$statfn|psql $dbname >/dev/null 2>&1") == 0 ||
+                       die "unable to restore statistic database: ERROR";
+               }
+           }
+
+           print STDERR "run analyze to speed up database queries\n";
+           PMG::DBTools::postgres_admin_cmd('psql', { input => 'analyze;' }, $dbname);
+
+           print "Analyzing/Upgrading existing Databases...";
+           my $ruledb = PMG::RuleDB->new($dbh);
+           PMG::DBTools::upgradedb($ruledb);
+           print "done\n";
+
+           # cleanup old spam/virus storage
+           PMG::MailQueue::create_spooldirs(0, 1);
+
+           my $cfg = PMG::Config->new();
+           my $rulecache = PMG::RuleCache->new($ruledb);
+           $cfg->rewrite_config($rulecache, 1);
+
+           # and restart services as soon as possible
+           foreach my $service (reverse @$PMG::Utils::db_service_list) {
+               eval { PVE::Tools::run_command(['systemctl', 'start', $service]); };
+               warn $@ if $@;
+           }
+       }
+    };
+    my $err = $@;
+
+    rmtree $dirname;
+
+    die $err if $err;
+}
+
 1;