3 $etcdir= '/etc/userv/ipif';
4 chdir($etcdir) or die "$0: chdir $etcdir: $!\n";
6 $descallowd= '-][()+_\'":=;,./|';
10 Allocates an RFC1918 address and records it
11 usage: userv ipif-alloc <group|gid> [<prefix>]/<size> <description>
12 <description> may contain alphanums, spaces and $descallowed
17 ($group, $pfxsize, $desc) = @ARGV;
21 open X, "config" or die "$0: open config: $!\n";
26 if (m/^supergroup\s+(\w+)$/) {
28 } elsif (m/^maxpergid\s+(\d+)$/) {
30 } elsif (m,^range\s+([.0-9]+)/(\d+)$,) {
31 ($allow_p, $allow_m, $allow_l) = parse_range($1,$2);
33 die "$0: config:$.: unknown directive: $_\n";
36 close X or die "$0: read config: $!\n";
38 if ($pfxsize =~ m,^([.0-9]+)/(\d+)$,) {
39 ($want_p, $want_m, $want_l) = parse_range($1,$2);
40 if (!$super && !overlap($want_p,$want_m, $allow_p,$allow_m)) {
41 die "$0: permission denied (out of required range)\n";
43 } elsif ($pfxsize =~ m,^/(\d+)$,) {
48 die "$0: bad request: $pfxsize\n";
51 $gid= get_gid($group);
53 die "$0: you are not gid $gid\n";
59 open Y, "auto-nets" or die "$0: open auto-nets: $!\n";
61 $!= 0; chomp($_= <Y>);
62 length or die "$0: read auto-nets: $!\n";
66 m:^(\d+),([.0-9]+)/(\d+),.*: or die "$0: auto-nets:$.: syntax error: $_\n";
68 ($this_p, $this_m, $this_l) = parse_range($2,$3);
69 if (defined($want_p)) {
70 if (overlap($want_p,$want_m, $this_p,$this_m)) {
71 die "$0: overlaps with existing allocation (auto-nets:$.)\n";
74 if ($this_p > $max_p) {
75 ($this_p,$this_m) = ($max_p,$max_m);