- Timestamp:
- 11/10/04 16:57:34 (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/cgi-bin/admin.cgi
r54 r58 43 43 my %webvar = parse_post(); 44 44 cleanInput(\%webvar); 45 46 my %full_alloc_types = ( 47 "ci","Cable pool IP", 48 "di","DSL pool IP", 49 "si","Server pool IP", 50 "mi","Static dialup IP", 51 "wi","Static wireless IP", 52 "cp","Cable pool", 53 "dp","DSL pool", 54 "sp","Server pool", 55 "mp","Static dialup pool", 56 "wp","Static wireless pool", 57 "dn","Dialup netblock", 58 "dy","Dynamic DSL netblock", 59 "dc","Dynamic cable netblock", 60 "cn","Customer netblock", 61 "ee","End-use netblock", 62 "rr","Routed netblock", 63 "ii","Internal netblock", 64 "mm","Master block" 65 ); 66 45 67 my $ip_dbh = connectDB; 46 68 my $sth; 47 69 48 70 print "Content-type: text/html\n\n". 49 "<html>\n<head>\n\t<title> IPDB admin tools</title>\n</head>\n<body>\n".71 "<html>\n<head>\n\t<title>TEST [IPDB admin tools] TEST</title>\n</head>\n<body>\n". 50 72 "<h2>IPDB - Administrative Tools</h2>\n<hr>\n"; 51 73 … … 76 98 } elsif ($webvar{action} eq 'update') { 77 99 update(); 100 } elsif ($webvar{action} eq 'assign') { 101 # Display a list of possible blocks within the requested block. 102 open (HTML, "../admin_alloc.html") 103 or croak "Could not open admin_alloc.html :$!"; 104 my $html = join('', <HTML>); 105 $html =~ s/\$\$MASK\$\$/$webvar{masklen}/g; 106 $html =~ s/\$\$ALLOCFROM\$\$/$webvar{allocfrom}/g; 107 108 my $from = new NetAddr::IP $webvar{allocfrom}; 109 my @blocklist = $from->split($webvar{masklen}); 110 my $availblocks; 111 foreach (@blocklist) { 112 $availblocks .= qq(<tr><td colspan=2 align=center><input type=radio name=block value="$_">$_</td></tr>\n); 113 } 114 $html =~ s/\$\$BLOCKLIST\$\$/$availblocks/g; 115 116 print $html; 117 } elsif ($webvar{action} eq 'confirm') { 118 print "Assigning $webvar{block} to $webvar{custid} (\"$webvar{desc}\")...\n"; 119 allocBlock($ip_dbh, $webvar{allocfrom}, $webvar{block}, $webvar{alloctype}, 120 $webvar{custid}, $webvar{city}, $webvar{desc}, $webvar{notes}); 121 #my ($dbh,from,block,$type,$custid,$city,$desc,$notes) = @_; 122 } else { 123 print "webvar{action} check failed"; 78 124 } 79 125 … … 90 136 exit; 91 137 92 93 # List free blocks in a /24 for arbitrary manual allocation94 sub showfree($) {95 my $cidr = $_[0];96 print "Showing free blocks in $cidr\n";97 }98 138 99 139 # Tweak allocfrom into shape. … … 106 146 $webvar{allocfrom} .= "/24"; 107 147 } 148 } 149 150 151 # Do the gruntwork of allocating a block. This should really be in IPDB.pm. 152 sub allocBlock($$$$$$$$) { 153 my ($dbh,undef,undef,$type,$custid,$city,$desc,$notes) = @_; 154 my $from = new NetAddr::IP $_[1]; 155 my $block = new NetAddr::IP $_[2]; 156 157 # First, figure out what free blocks will get mangled. 158 if ($from eq $block) { 159 # Whee! Easy. Just allocate the block 160 } else { 161 # The complex case. An allocation from a larger block. 162 163 # Gotta snag the free blocks left over. 164 my $wantmaskbits = $block->masklen; 165 my $maskbits = $from->masklen; 166 167 my @newfreeblocks; # Holds free blocks generated from splitting the source freeblock. 168 169 my $i=0; 170 my $tmp_from = $from; # So we don't munge $from 171 while ($maskbits++ < $wantmaskbits) { 172 my @subblocks = $tmp_from->split($maskbits); 173 $newfreeblocks[$i++] = (($block->within($subblocks[0])) ? $subblocks[1] : $subblocks[0]); 174 $tmp_from = ( ($block->within($subblocks[0])) ? $subblocks[0] : $subblocks[1] ); 175 } # while 176 177 # insert the data here. Woo. 178 # Begin SQL transaction block 179 eval { 180 # Delete old freeblocks entry 181 $sth = $ip_dbh->prepare("delete from freeblocks where cidr='$from'"); 182 $sth->execute(); 183 184 # Insert the new freeblocks entries 185 $sth = $ip_dbh->prepare("insert into freeblocks values (?, ?, ". 186 "(select city from routed where cidr >>= '$block'),'y')"); 187 foreach my $block (@newfreeblocks) { 188 $sth->execute("$block", $block->masklen); 189 } 190 # Insert the allocations entry 191 $sth = $ip_dbh->prepare("insert into allocations values ('$block',". 192 "'$custid','$type','$city','$desc','$notes',".$block->masklen.")"); 193 $sth->execute; 194 195 $ip_dbh->commit; 196 }; # end eval 197 if ($@) { 198 carp "Transaction aborted because $@"; 199 eval { $ip_dbh->rollback; }; 200 syslog "err", "Allocation of '$block' to '$custid' as ". 201 "'$type' by $authuser failed: '$@'"; 202 print "Allocation of $block as $full_alloc_types{$type} failed.\n"; 203 } else { 204 syslog "notice", "$authuser allocated '$block' to '$custid'". 205 " as '$type'"; 206 print "OK!<br>\n"; 207 } 208 209 } 210 # need to get /24 that block is part of 211 my @bits = split /\./, $webvar{block}; 212 $bits[3] = "0/24"; 213 showAllocs((join ".", @bits)); 214 } 215 216 # List free blocks in a /24 for arbitrary manual allocation 217 sub showfree($) { 218 my $cidr = new NetAddr::IP $_[0]; 219 print "Showing free blocks in $cidr<br>\n". 220 "<table border=1>\n"; 221 $sth = $ip_dbh->prepare("select * from freeblocks where cidr <<= '$cidr' order by cidr"); 222 $sth->execute; 223 while (my @data = $sth->fetchrow_array) { 224 my $temp = new NetAddr::IP $data[0]; 225 print "<tr><form action=admin.cgi method=POST><input type=hidden name=action value=assign>\n". 226 qq(<td>$temp<input type=hidden name=allocfrom value="$temp"></td>\n). 227 "<td>". 228 (($temp->masklen == 30) ? '<input type=hidden name=masklen value=30>30' 229 : "<select name=masklen><option>30</option>\n<option>29</option>\n") . 230 (($temp->masklen < 29) ? "<option>28</option>\n" : '') . 231 (($temp->masklen < 28) ? "<option>27</option>\n" : '') . 232 (($temp->masklen < 27) ? "<option>26</option>\n" : '') . 233 (($temp->masklen < 26) ? "<option>25</option>\n" : '') . 234 (($temp->masklen < 25) ? "<option>24</option>\n" : '') . 235 "</td>". 236 qq(<td>$data[2]</td><td><input type=submit value="Allocate from here"></td>). 237 "\n</form></tr>\n"; 238 } 239 print "</table>\n"; 108 240 } 109 241
Note:
See TracChangeset
for help on using the changeset viewer.