]> git.proxmox.com Git - pmg-api.git/commitdiff
PMG/Cluster.pm: implement sync_ruledb_from_master()
authorDietmar Maurer <dietmar@proxmox.com>
Tue, 18 Apr 2017 09:40:33 +0000 (11:40 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 18 Apr 2017 09:40:33 +0000 (11:40 +0200)
PMG/Cluster.pm

index bd5be57af07ce9236f11215291fc4fad1e5d1e00..5956143562cf8590dcfe77b23b5a656cf829b0c6 100644 (file)
@@ -13,6 +13,9 @@ use PVE::INotify;
 use PMG::Utils;
 use PMG::Config;
 use PMG::ClusterConfig;
+use PMG::RuleDB;
+use PMG::RuleCache;
+use PVE::APIClient::LWP;
 
 our $spooldir = "/var/spool/proxmox";
 
@@ -296,7 +299,7 @@ sub sync_config_from_master {
     my $ssh_cmd = '--rsh=ssh -l root -o BatchMode=yes';
     $ssh_cmd .=  " -o HostKeyAlias=${master_name}" if $master_name;
 
-    my $cmd = ['rsync', '--rsh=ssh -l root -o BatchMode=yes -o HostKeyAlias=${master_name}', '-lpgoq',
+    my $cmd = ['rsync', "--rsh=ssh -l root -o BatchMode=yes -o HostKeyAlias=${master_name}", '-lpgoq',
               "${master_ip}:$cfgdir/* ${sa_conf_dir}/${sa_custom_cf}",
               "$syncdir/",
               '--exclude', '*~',
@@ -353,4 +356,66 @@ sub sync_config_from_master {
     $cfg->rewrite_config(1, $force_restart);
 }
 
+sub sync_ruledb_from_master {
+    my ($ldb, $rdb, $ni, $ticket) = @_;
+
+    my $ruledb = PMG::RuleDB->new($ldb);
+    my $rulecache = PMG::RuleCache->new($ruledb);
+
+    my $conn = PVE::APIClient::LWP->new(
+       ticket => $ticket,
+       cookie_name => 'PMGAuthCookie',
+       host => $ni->{ip},
+       cached_fingerprints => {
+           $ni->{fingerprint} => 1,
+       });
+
+    my $digest = $conn->get("/config/ruledb/digest", {});
+
+    return if $digest eq $rulecache->{digest}; # no changes
+
+    syslog('info', "detected rule database changes - starting sync from '$ni->{ip}'");
+
+    eval {
+       $ldb->begin_work;
+
+       $ldb->do("DELETE FROM Rule");
+       $ldb->do("DELETE FROM RuleGroup");
+       $ldb->do("DELETE FROM ObjectGroup");
+       $ldb->do("DELETE FROM Object");
+       $ldb->do("DELETE FROM Attribut");
+
+       eval {
+           $rdb->begin_work;
+
+           # read a consistent snapshot
+           $rdb->do("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");
+
+           PMG::DBTools::copy_table($ldb, $rdb, "Rule");
+           PMG::DBTools::copy_table($ldb, $rdb, "RuleGroup");
+           PMG::DBTools::copy_table($ldb, $rdb, "ObjectGroup");
+           PMG::DBTools::copy_table($ldb, $rdb, "Object", 'value');
+           PMG::DBTools::copy_table($ldb, $rdb, "Attribut", 'value');
+       };
+
+       $rdb->rollback; # end transaction
+
+       die $@ if $@;
+
+       # update sequences
+
+       $ldb->do("SELECT setval('rule_id_seq', max(id)+1) FROM Rule");
+       $ldb->do("SELECT setval('object_id_seq', max(id)+1) FROM Object");
+       $ldb->do("SELECT setval('objectgroup_id_seq', max(id)+1) FROM ObjectGroup");
+
+       $ldb->commit;
+    };
+    if (my $err = $@) {
+       $ldb->rollback;
+       die $err;
+    }
+
+    syslog('info', "finished rule database sync from host '$ni->{ip}'");
+}
+
 1;