]> git.proxmox.com Git - pve-firewall.git/commitdiff
correctly apply macros
authorDietmar Maurer <dietmar@proxmox.com>
Thu, 27 Feb 2014 06:23:42 +0000 (07:23 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Thu, 27 Feb 2014 06:23:42 +0000 (07:23 +0100)
Allow to set additional parameters if they do not conflict with macros settings.

PVE/Firewall.pm

index 1a74652ab0fe6db5bac7004b51902c2fb181917c..8cd8a1bf297e3e14896b5d12b77caab8a96088ff 100644 (file)
@@ -1079,19 +1079,33 @@ sub parse_fw_rule {
     if ($macro) {
        foreach my $templ (@$macro) {
            my $rule = {};
     if ($macro) {
        foreach my $templ (@$macro) {
            my $rule = {};
+           my $param_used = {};
            foreach my $k (keys %$templ) {
                my $v = $templ->{$k};
                if ($v eq 'PARAM') {
                    $v = $param->{$k};
            foreach my $k (keys %$templ) {
                my $v = $templ->{$k};
                if ($v eq 'PARAM') {
                    $v = $param->{$k};
+                   $param_used->{$k} = 1;
                } elsif ($v eq 'DEST') {
                    $v = $param->{dest};
                } elsif ($v eq 'DEST') {
                    $v = $param->{dest};
+                   $param_used->{dest} = 1;
                } elsif ($v eq 'SOURCE') {
                    $v = $param->{source};
                } elsif ($v eq 'SOURCE') {
                    $v = $param->{source};
+                   $param_used->{source} = 1;
                }
 
                die "missing parameter '$k' in macro '$macro_name'\n" if !defined($v);
                $rule->{$k} = $v;
            }
                }
 
                die "missing parameter '$k' in macro '$macro_name'\n" if !defined($v);
                $rule->{$k} = $v;
            }
+           foreach my $k (keys %$param) {
+               next if !defined($param->{$k});
+               next if $param_used->{$k};
+               if (defined($rule->{$k})) {
+                   die "parameter '$k' already define in macro (value = '$rule->{$k}')\n"
+                       if $rule->{$k} ne $param->{$k};
+               } else {
+                   $rule->{$k} = $param->{$k};
+               }
+           }
            push @$rules, $rule;
        }
     } else {
            push @$rules, $rule;
        }
     } else {