Changeset 157 for trunk/cgi-bin/IPDB.pm
- Timestamp:
- 02/08/05 15:56:33 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/cgi-bin/IPDB.pm
r146 r157 58 58 59 59 # Initialize alloctypes hashes 60 $sth = $dbh->prepare("select *from alloctypes order by listorder");60 $sth = $dbh->prepare("select type,listname,dispname,listorder from alloctypes order by listorder"); 61 61 $sth->execute; 62 62 while (my @data = $sth->fetchrow_array) { … … 68 68 69 69 # City and POP listings 70 $sth = $dbh->prepare("select *from cities order by city");70 $sth = $dbh->prepare("select city,routing from cities order by city"); 71 71 $sth->execute; 72 72 return (undef,$sth->errstr) if $sth->err; … … 79 79 80 80 # Master block list 81 $sth = $dbh->prepare("select *from masterblocks order by cidr");81 $sth = $dbh->prepare("select cidr from masterblocks order by cidr"); 82 82 $sth->execute; 83 83 for (my $i=0; my @data = $sth->fetchrow_array(); $i++) { … … 120 120 # Return here if we can't select. Note that this indicates a 121 121 # problem executing the select. 122 my $sth = $dbh->prepare( 'select cidr from masterblocks');122 my $sth = $dbh->prepare("select cidr from masterblocks"); 123 123 $sth->execute(); 124 124 return (undef,$DBI::errstr) if ($sth->err); … … 154 154 } else { 155 155 # it connects, try a stmt. 156 my $sth = $dbh->prepare( 'select cidr from masterblocks');156 my $sth = $dbh->prepare("select cidr from masterblocks"); 157 157 my $err = $sth->execute(); 158 158 … … 189 189 local $dbh->{RaiseError} = 1; # step on our toes by accident. 190 190 191 if ($type =~ /^ [cdsmw]i$/) {191 if ($type =~ /^.i$/) { 192 192 $msg = "Unable to assign static IP $cidr to $custid"; 193 193 eval { 194 # We'll just have to put up with the oddities caused by SQL (un)sort order 195 $sth = $dbh->prepare("select * from poolips where pool='$alloc_from'". 196 " and available='y' order by ip"); 197 $sth->execute; 198 194 # We have to do this in two parts because otherwise we lose 195 # the ability to return the IP assigned. Should that change, 196 # the commented SQL statement below may become usable. 199 197 # update poolips set custid='$custid',city='$city',available='n', 200 198 # description='$desc',notes='$notes',circuitid='$circid' 201 199 # where ip=(select ip from poolips where pool='$alloc_from' 202 200 # and available='y' order by ip limit 1); 203 ##err Need better handling here; what if there's no free IPs when this sub gets called? 201 202 $sth = $dbh->prepare("select ip from poolips where pool='$alloc_from'". 203 " and available='y' order by ip"); 204 $sth->execute; 205 204 206 my @data = $sth->fetchrow_array; 205 $cidr = $data[ 1]; # $cidr is already declared when we get here!207 $cidr = $data[0]; # $cidr is already declared when we get here! 206 208 207 209 $sth = $dbh->prepare("update poolips set custid='$custid',". … … 234 236 " where cidr='$cidr'"); 235 237 $sth->execute; 236 $sth = $dbh->prepare("insert into routed values ('$cidr',".237 238 $sth = $dbh->prepare("insert into routed (cidr,maskbits,city)". 239 " values ('$cidr',".$cidr->masklen.",'$city')"); 238 240 $sth->execute; 239 241 } else { … … 242 244 $sth->execute; 243 245 244 $sth = $dbh->prepare("insert into allocations values ('$cidr',". 245 "'$custid','$type','$city','$desc','$notes',". 246 $sth = $dbh->prepare("insert into allocations". 247 " (cidr,custid,type,city,description,notes,maskbits,circuitid)". 248 " values ('$cidr','$custid','$type','$city','$desc','$notes',". 246 249 $cidr->masklen.",'$circid')"); 247 250 $sth->execute; 248 251 249 252 # And initialize the pool, if necessary 253 # PPPoE pools (currently dialup, DSL, and WiFi) get all IPs made available 254 # "DHCP" or "real-subnet" pools have the net, gw, and bcast IPs removed. 250 255 if ($type =~ /^.p$/) { 251 $msg = "Could not initialize IPs in new $disp_alloctypes{$type} pool $cidr"; 252 initPool($dbh,$cidr,$type,$city,($type eq 'dp' ? "all" : "normal")); 256 $msg = "Could not initialize IPs in new $disp_alloctypes{$type} $cidr"; 257 my ($code,$rmsg) = initPool($dbh,$cidr,$type,$city,"all"); 258 die $rmsg if $code eq 'FAIL'; 259 } elsif ($type =~ /^.d$/) { 260 $msg = "Could not initialize IPs in new $disp_alloctypes{$type} $cidr"; 261 my ($code,$rmsg) = initPool($dbh,$cidr,$type,$city,"normal"); 262 die $rmsg if $code eq 'FAIL'; 253 263 } 254 264 … … 258 268 }; # end of eval 259 269 if ($@) { 260 $msg =$@;270 $msg .= ": ".$@; 261 271 eval { $dbh->rollback; }; 262 return ('FAIL',$ @);272 return ('FAIL',$msg); 263 273 } else { 264 274 return ('OK',"OK"); … … 297 307 # Insert the new freeblocks entries 298 308 # Note that non-routed blocks are assigned to <NULL> 299 $sth = $dbh->prepare("insert into freeblocks values (?, ?, '<NULL>','n')"); 309 # and use the default value for the routed column ('n') 310 $sth = $dbh->prepare("insert into freeblocks (cidr,maskbits,city)". 311 " values (?, ?, '<NULL>')"); 300 312 foreach my $block (@newfreeblocks) { 301 313 $sth->execute("$block", $block->masklen); … … 303 315 304 316 # Insert the entry in the routed table 305 $sth = $dbh->prepare("insert into routed values ('$cidr',".306 317 $sth = $dbh->prepare("insert into routed (cidr,maskbits,city)". 318 " values ('$cidr',".$cidr->masklen.",'$city')"); 307 319 $sth->execute; 308 320 # Insert the (almost) same entry in the freeblocks table 309 $sth = $dbh->prepare("insert into freeblocks values ('$cidr',".310 321 $sth = $dbh->prepare("insert into freeblocks (cidr,maskbits,city,routed)". 322 " values ('$cidr',".$cidr->masklen.",'$city','y')"); 311 323 $sth->execute; 312 324 … … 314 326 315 327 # Insert the new freeblocks entries 316 $sth = $dbh->prepare("insert into freeblocks values (?, ?,".317 " (select city from routed where cidr >>= '$cidr'),'y')");328 $sth = $dbh->prepare("insert into freeblocks (cidr,maskbits,city,routed)". 329 " values (?, ?, (select city from routed where cidr >>= '$cidr'),'y')"); 318 330 foreach my $block (@newfreeblocks) { 319 331 $sth->execute("$block", $block->masklen); … … 321 333 322 334 # Insert the allocations entry 323 $sth = $dbh->prepare("insert into allocations values ('$cidr',". 324 "'$custid','$type','$city','$desc','$notes',".$cidr->masklen. 325 ",'$circid')"); 335 $sth = $dbh->prepare("insert into allocations (cidr,custid,type,city,". 336 "description,notes,maskbits,circuitid)". 337 " values ('$cidr','$custid','$type','$city','$desc','$notes',". 338 $cidr->masklen.",'$circid')"); 326 339 $sth->execute; 327 340 328 341 # And initialize the pool, if necessary 342 # PPPoE pools (currently dialup, DSL, and WiFi) get all IPs made available 343 # "DHCP" or "real-subnet" pools have the net, gw, and bcast IPs removed. 329 344 if ($type =~ /^.p$/) { 330 345 $msg = "Could not initialize IPs in new $disp_alloctypes{$type} $cidr"; 331 initPool($dbh,$cidr,$type,$city,($type eq 'dp' ? "all" : "normal")); 346 my ($code,$rmsg) = initPool($dbh,$cidr,$type,$city,"all"); 347 die $rmsg if $code eq 'FAIL'; 348 } elsif ($type =~ /^.d$/) { 349 $msg = "Could not initialize IPs in new $disp_alloctypes{$type} $cidr"; 350 my ($code,$rmsg) = initPool($dbh,$cidr,$type,$city,"normal"); 351 die $rmsg if $code eq 'FAIL'; 332 352 } 333 353 … … 361 381 my $pool = new NetAddr::IP $_[1]; 362 382 363 my ($pooltype) = ($type =~ /^(.)p$/); 383 ##fixme Need to just replace 2nd char of type with i rather than capturing 1st char of type 384 $type =~ s/[pd]$/i/; 364 385 my $sth; 365 366 # have to insert all pool IPs into poolips table as "unallocated". 367 $sth = $dbh->prepare("insert into poolips values ('$pool',". 368 " ?, '6750400', '$city', '$pooltype', 'y', '', '', '')"); 369 my @poolip_list = $pool->hostenum; 370 if ($class eq 'all') { # (DSL-ish block - *all* IPs available 371 $sth->execute($pool->addr); 372 for (my $i=0; $i<=$#poolip_list; $i++) { 373 $sth->execute($poolip_list[$i]->addr); 374 } 375 $pool--; 376 $sth->execute($pool->addr); 377 } else { # (real netblock) 378 for (my $i=1; $i<=$#poolip_list; $i++) { 379 $sth->execute($poolip_list[$i]->addr); 380 } 386 my $msg; 387 388 # Trap errors so we can pass them back to the caller. Even if the 389 # caller is only ever supposed to be local, and therefore already 390 # trapping errors. >:( 391 local $dbh->{AutoCommit} = 0; # These need to be local so we don't 392 local $dbh->{RaiseError} = 1; # step on our toes by accident. 393 394 eval { 395 # have to insert all pool IPs into poolips table as "unallocated". 396 $sth = $dbh->prepare("insert into poolips (pool,ip,custid,city,type)". 397 " values ('$pool', ?, '6750400', '$city', '$type')"); 398 my @poolip_list = $pool->hostenum; 399 if ($class eq 'all') { # (DSL-ish block - *all* IPs available 400 $sth->execute($pool->addr); 401 for (my $i=0; $i<=$#poolip_list; $i++) { 402 $sth->execute($poolip_list[$i]->addr); 403 } 404 $pool--; 405 $sth->execute($pool->addr); 406 } else { # (real netblock) 407 for (my $i=1; $i<=$#poolip_list; $i++) { 408 $sth->execute($poolip_list[$i]->addr); 409 } 410 } 411 }; 412 if ($@) { 413 $msg = "'".$sth->errstr."'"; 414 eval { $dbh->rollback; }; 415 return ('FAIL',$msg); 416 } else { 417 return ('OK',"OK"); 381 418 } 382 419 } # end initPool() … … 406 443 407 444 eval { 408 $msg = "Unable to deallocate $ type$cidr";445 $msg = "Unable to deallocate $disp_alloctypes{$type} $cidr"; 409 446 $sth = $dbh->prepare("update poolips set custid='6750400',available='y',". 410 447 "city=(select city from allocations where cidr >>= '$cidr'),". … … 455 492 $sth->execute; 456 493 # Set up query to start compacting free blocks. 457 $sth = $dbh->prepare("select *from freeblocks where ".494 $sth = $dbh->prepare("select cidr from freeblocks where ". 458 495 "maskbits<=".$cidr->masklen." and routed='n' order by maskbits desc"); 459 496 … … 463 500 $sth->execute; 464 501 # Special case - delete pool IPs 465 if ($type =~ /^. p$/) {502 if ($type =~ /^.[pd]$/) { 466 503 # We have to delete the IPs from the pool listing. 467 504 $sth = $dbh->prepare("delete from poolips where pool='$cidr'"); … … 470 507 471 508 # Set up query for compacting free blocks. 472 $sth = $dbh->prepare("select *from freeblocks where cidr <<= ".509 $sth = $dbh->prepare("select cidr from freeblocks where cidr <<= ". 473 510 "(select cidr from routed where cidr >>= '$cidr') ". 474 511 " and maskbits<=".$cidr->masklen." and routed='y' order by maskbits desc"); … … 513 550 # insert "new" freeblocks entry 514 551 if ($type eq 'rr') { 515 $sth = $dbh->prepare("insert into freeblocks values ('$cidr',".$cidr->masklen.516 " ,'<NULL>','n')");552 $sth = $dbh->prepare("insert into freeblocks (cidr,maskbits,city)". 553 " values ('$cidr',".$cidr->masklen.",'<NULL>')"); 517 554 } else { 518 $sth = $dbh->prepare("insert into freeblocks values ('$cidr',".$cidr->masklen. 555 $sth = $dbh->prepare("insert into freeblocks (cidr,maskbits,city,routed)". 556 " values ('$cidr',".$cidr->masklen. 519 557 ",(select city from routed where cidr >>= '$cidr'),'y')"); 520 558 }
Note:
See TracChangeset
for help on using the changeset viewer.