API fix: allow aliases in IPSets
authorDietmar Maurer <dietmar@proxmox.com>
Fri, 30 May 2014 07:31:25 +0000 (09:31 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 30 May 2014 07:37:27 +0000 (09:37 +0200)
src/PVE/API2/Firewall/IPSet.pm
src/PVE/Firewall.pm

index 56dd4f2..6c7ab5e 100644 (file)
@@ -12,7 +12,7 @@ use base qw(PVE::RESTHandler);
 my $api_properties = { 
     cidr => {
        description => "Network/IP specification in CIDR format.",
-       type => 'string', format => 'IPv4orCIDR',
+       type => 'string', format => 'IPv4orCIDRorAlias',
     },
     name => get_standard_option('ipset-name'),
     comment => {
@@ -145,6 +145,17 @@ sub register_delete_ipset {
        }});
 }
 
+my $verify_alias_exists = sub {
+    my ($cluster_conf, $fw_conf, $cidr) = @_;
+
+    if ($cidr !~ m/^\d/) {
+       my $alias = lc($cidr);
+       die "no such alias '$cidr'\n"
+           if !(($cluster_conf && $cluster_conf->{aliases}->{$alias}) || 
+                ($fw_conf && $fw_conf->{aliases}->{$alias}));
+    }
+};
+
 sub register_create_ip {
     my ($class) = @_;
 
@@ -178,7 +189,10 @@ sub register_create_ip {
                    if $entry->{cidr} eq $cidr;
            }
 
+           &$verify_alias_exists($cluster_conf, $fw_conf, $cidr);
+
            my $data = { cidr => $cidr };
+
            $data->{nomatch} = 1 if $param->{nomatch};
            $data->{comment} = $param->{comment} if $param->{comment};
 
index 62ce4d1..669c5d5 100644 (file)
@@ -56,6 +56,21 @@ sub pve_verify_ipv4_or_cidr {
     die "value does not look like a valid IP address or CIDR network\n";
 }
 
+PVE::JSONSchema::register_format('IPv4orCIDRorAlias', \&pve_verify_ipv4_or_cidr_or_alias);
+sub pve_verify_ipv4_or_cidr_or_alias {
+    my ($cidr, $noerr) = @_;
+
+    return if $cidr =~ m/^(?:$ip_alias_pattern)$/;
+
+    if ($cidr =~ m!^(?:$IPV4RE)(/(\d+))?$!) {
+       return $cidr if Net::IP->new($cidr);
+       return undef if $noerr;
+       die Net::IP::Error() . "\n";
+    }
+    return undef if $noerr;
+    die "value does not look like a valid IP address or CIDR network\n";
+}
+
 PVE::JSONSchema::register_standard_option('ipset-name', {
     description => "IP set name.",
     type => 'string',