]> git.proxmox.com Git - pve-firewall.git/blobdiff - src/PVE/Firewall.pm
improve concurrent update handling
[pve-firewall.git] / src / PVE / Firewall.pm
index f4f0ccc7ea6e42db221c22b348201702d787f0f1..ca57a2437e8b8f87c36224a1416c23d0c7bbddea 100644 (file)
@@ -784,6 +784,50 @@ sub pve_fw_verify_protocol_spec {
 
 # helper function for API
 
+sub copy_opject_with_digest {
+    my ($object) = @_;
+
+    my $sha = Digest::SHA->new('sha1');
+
+    my $res = {};
+    foreach my $k (sort keys %$object) {
+       my $v = $object->{$k};
+       $res->{$k} = $v;
+       $sha->add($k, ':', $v, "\n");
+    }
+
+    my $digest = $sha->b64digest;
+
+    $res->{digest} = $digest;
+
+    return wantarray ? ($res, $digest) : $res;
+}
+
+sub copy_list_with_digest {
+    my ($list) = @_;
+
+    my $sha = Digest::SHA->new('sha1');
+
+    my $res = [];
+    foreach my $entry (@$list) {
+       my $data = {};
+       foreach my $k (sort keys %$entry) {
+           my $v = $entry->{$k};
+           $data->{$k} = $v;
+           $sha->add($k, ':', $v, "\n");
+       }
+       push @$res, $data;
+    }
+
+    my $digest = $sha->b64digest;
+
+    foreach my $entry (@$res) {
+       $entry->{digest} = $digest;
+    }
+
+    return wantarray ? ($res, $digest) : $res;
+}
+
 my $rule_properties = {
     pos => {
        description => "Update rule at position <pos>.",
@@ -841,23 +885,6 @@ my $rule_properties = {
     },
 };
 
-sub cleanup_fw_rule {
-    my ($rule, $digest, $pos) = @_;
-
-    my $r = {};
-
-    foreach my $k (keys %$rule) {
-       next if !$rule_properties->{$k};
-       my $v = $rule->{$k};
-       next if !defined($v);
-       $r->{$k} = $v;
-       $r->{digest} = $digest;
-       $r->{pos} = $pos;
-    }
-
-    return $r;
-}
-
 sub add_rule_properties {
     my ($properties) = @_;
 
@@ -1864,11 +1891,7 @@ sub parse_vm_fw_rules {
 
     my $section;
 
-    my $digest = Digest::SHA->new('sha1');
-
     while (defined(my $line = <$fh>)) {
-       $digest->add($line);
-
        next if $line =~ m/^#/;
        next if $line =~ m/^\s*$/;
 
@@ -1906,8 +1929,6 @@ sub parse_vm_fw_rules {
        push @{$res->{$section}}, $rule;
     }
 
-    $res->{digest} = $digest->b64digest;
-
     return $res;
 }
 
@@ -1918,11 +1939,7 @@ sub parse_host_fw_rules {
 
     my $section;
 
-    my $digest = Digest::SHA->new('sha1');
-
     while (defined(my $line = <$fh>)) {
-       $digest->add($line);
-
        next if $line =~ m/^#/;
        next if $line =~ m/^\s*$/;
 
@@ -1960,8 +1977,6 @@ sub parse_host_fw_rules {
        push @{$res->{$section}}, $rule;
     }
 
-    $res->{digest} = $digest->b64digest;
-
     return $res;
 }
 
@@ -1980,11 +1995,7 @@ sub parse_cluster_fw_rules {
        ipset_comments => {}, 
     };
 
-    my $digest = Digest::SHA->new('sha1');
-
     while (defined(my $line = <$fh>)) {
-       $digest->add($line);
-
        next if $line =~ m/^#/;
        next if $line =~ m/^\s*$/;
 
@@ -2001,7 +2012,8 @@ sub parse_cluster_fw_rules {
            $group = lc($1);
            my $comment = $2;
            $res->{$section}->{$group} = [];
-           $res->{group_comments}->{$group} = $comment if $comment;
+           $res->{group_comments}->{$group} =  decode('utf8', $comment)
+               if $comment;
            next;
        }
 
@@ -2015,7 +2027,8 @@ sub parse_cluster_fw_rules {
            $group = lc($1);
            my $comment = $2;
            $res->{$section}->{$group} = [];
-           $res->{ipset_comments}->{$group} = $comment if $comment;
+           $res->{ipset_comments}->{$group} = decode('utf8', $comment) 
+               if $comment;
            next;
        }
 
@@ -2070,7 +2083,6 @@ sub parse_cluster_fw_rules {
        }
     }
 
-    $res->{digest} = $digest->b64digest;
     return $res;
 }
 
@@ -2407,7 +2419,8 @@ sub save_clusterfw_conf {
 
     foreach my $ipset (sort keys %{$cluster_conf->{ipset}}) {
        if (my $comment = $cluster_conf->{ipset_comments}->{$ipset}) {
-           $raw .= "[IPSET $ipset] # $comment\n\n";
+           my $utf8comment = encode('utf8', $comment);
+           $raw .= "[IPSET $ipset] # $utf8comment\n\n";
        } else {
            $raw .= "[IPSET $ipset]\n\n";
        }
@@ -2426,7 +2439,8 @@ sub save_clusterfw_conf {
     foreach my $group (sort keys %{$cluster_conf->{groups}}) {
        my $rules = $cluster_conf->{groups}->{$group};
        if (my $comment = $cluster_conf->{group_comments}->{$group}) {
-           $raw .= "[group $group] # $comment\n\n";
+           my $utf8comment = encode('utf8', $comment);
+           $raw .= "[group $group] # $utf8comment\n\n";
        } else {
            $raw .= "[group $group]\n\n";
        }