diff options
Diffstat (limited to 'notes/projects')
| -rw-r--r-- | notes/projects/radius/sql/ippool-schema.sql | 130 |
1 files changed, 104 insertions, 26 deletions
diff --git a/notes/projects/radius/sql/ippool-schema.sql b/notes/projects/radius/sql/ippool-schema.sql index 9a92ef8..00288b0 100644 --- a/notes/projects/radius/sql/ippool-schema.sql +++ b/notes/projects/radius/sql/ippool-schema.sql | |||
| @@ -231,7 +231,7 @@ CREATE INDEX | |||
| 231 | /* | 231 | /* |
| 232 | * trigger functions for ip table | 232 | * trigger functions for ip table |
| 233 | */ | 233 | */ |
| 234 | CREATE OR REPLACE FUNCTION ip_trigger_delete | 234 | CREATE OR REPLACE FUNCTION ip_before_delete |
| 235 | ( ) | 235 | ( ) |
| 236 | RETURNS trigger | 236 | RETURNS trigger |
| 237 | LANGUAGE plpgsql | 237 | LANGUAGE plpgsql |
| @@ -249,7 +249,7 @@ END; | |||
| 249 | $$; | 249 | $$; |
| 250 | 250 | ||
| 251 | 251 | ||
| 252 | CREATE OR REPLACE FUNCTION ip_trigger_insert | 252 | CREATE OR REPLACE FUNCTION ip_before_insert |
| 253 | ( ) | 253 | ( ) |
| 254 | RETURNS trigger | 254 | RETURNS trigger |
| 255 | LANGUAGE plpgsql | 255 | LANGUAGE plpgsql |
| @@ -262,6 +262,15 @@ BEGIN | |||
| 262 | NEW.nasId := NULL; | 262 | NEW.nasId := NULL; |
| 263 | NEW.modified := TIMESTAMP 'epoch'; | 263 | NEW.modified := TIMESTAMP 'epoch'; |
| 264 | 264 | ||
| 265 | -- verifies netblock contains IP address | ||
| 266 | PERFORM id | ||
| 267 | FROM netblock | ||
| 268 | WHERE id = NEW.netblockId | ||
| 269 | AND network >>= NEW.address; | ||
| 270 | IF NOT FOUND THEN | ||
| 271 | RAISE EXCEPTION 'invalid netblock'; | ||
| 272 | END IF; | ||
| 273 | |||
| 265 | -- determines mask for single IP address | 274 | -- determines mask for single IP address |
| 266 | IF ( family(NEW.address) != 4 ) THEN | 275 | IF ( family(NEW.address) != 4 ) THEN |
| 267 | RAISE EXCEPTION 'only IPv4 addresses are supported'; | 276 | RAISE EXCEPTION 'only IPv4 addresses are supported'; |
| @@ -272,7 +281,7 @@ END; | |||
| 272 | $$; | 281 | $$; |
| 273 | 282 | ||
| 274 | 283 | ||
| 275 | CREATE OR REPLACE FUNCTION ip_trigger_truncate | 284 | CREATE OR REPLACE FUNCTION ip_before_truncate |
| 276 | ( ) | 285 | ( ) |
| 277 | RETURNS trigger | 286 | RETURNS trigger |
| 278 | LANGUAGE plpgsql | 287 | LANGUAGE plpgsql |
| @@ -284,12 +293,13 @@ END; | |||
| 284 | $$; | 293 | $$; |
| 285 | 294 | ||
| 286 | 295 | ||
| 287 | CREATE OR REPLACE FUNCTION ip_trigger_update | 296 | CREATE OR REPLACE FUNCTION ip_before_update |
| 288 | ( ) | 297 | ( ) |
| 289 | RETURNS trigger | 298 | RETURNS trigger |
| 290 | LANGUAGE plpgsql | 299 | LANGUAGE plpgsql |
| 291 | AS $$ | 300 | AS $$ |
| 292 | DECLARE | 301 | DECLARE |
| 302 | ipAssignable BOOLEAN; | ||
| 293 | BEGIN | 303 | BEGIN |
| 294 | 304 | ||
| 295 | -- prevents IP address from being modified | 305 | -- prevents IP address from being modified |
| @@ -297,8 +307,32 @@ BEGIN | |||
| 297 | RAISE EXCEPTION 'address cannot be modified'; | 307 | RAISE EXCEPTION 'address cannot be modified'; |
| 298 | END IF; | 308 | END IF; |
| 299 | 309 | ||
| 310 | -- verifies netblock contains IP address | ||
| 311 | IF ( NEW.netblockId != NEW.netblockId ) THEN | ||
| 312 | SELECT assignable INTO ipAssignable | ||
| 313 | FROM netblock | ||
| 314 | WHERE id = NEW.netblockId | ||
| 315 | AND network >>= NEW.address; | ||
| 316 | IF ipAssignable IS NULL THEN | ||
| 317 | RAISE EXCEPTION 'invalid netblock'; | ||
| 318 | END IF; | ||
| 319 | IF ipAssignable IS TRUE THEN | ||
| 320 | PERFORM id | ||
| 321 | FROM netblock | ||
| 322 | WHERE assignable IS TRUE | ||
| 323 | AND network >>= NEW.address; | ||
| 324 | IF FOUND THEN | ||
| 325 | RAISE EXCEPTION 'cannot associate assignable netblock if an unassignable netblock contains IP address'; | ||
| 326 | END IF; | ||
| 327 | END IF; | ||
| 328 | END IF; | ||
| 329 | |||
| 300 | -- update timestamp | 330 | -- update timestamp |
| 301 | NEW.modified := current_timestamp; | 331 | IF ( ( OLD.nasId != NEW.nasId ) OR ( OLD.username != NEW.username ) ) THEN |
| 332 | NEW.modified := current_timestamp; | ||
| 333 | ELSE | ||
| 334 | NEW.modified := OLD.modified; | ||
| 335 | END IF; | ||
| 302 | 336 | ||
| 303 | RETURN NEW; | 337 | RETURN NEW; |
| 304 | END; | 338 | END; |
| @@ -308,7 +342,7 @@ $$; | |||
| 308 | /* | 342 | /* |
| 309 | * trigger functions for nas table | 343 | * trigger functions for nas table |
| 310 | */ | 344 | */ |
| 311 | CREATE OR REPLACE FUNCTION nas_trigger_insert_or_update | 345 | CREATE OR REPLACE FUNCTION nas_before_insert_or_update |
| 312 | ( ) | 346 | ( ) |
| 313 | RETURNS trigger | 347 | RETURNS trigger |
| 314 | LANGUAGE plpgsql | 348 | LANGUAGE plpgsql |
| @@ -327,7 +361,7 @@ $$; | |||
| 327 | /* | 361 | /* |
| 328 | * trigger functions for netblock table | 362 | * trigger functions for netblock table |
| 329 | */ | 363 | */ |
| 330 | CREATE OR REPLACE FUNCTION netblock_trigger_insert_or_update | 364 | CREATE OR REPLACE FUNCTION netblock_before_insert_or_update |
| 331 | ( ) | 365 | ( ) |
| 332 | RETURNS trigger | 366 | RETURNS trigger |
| 333 | LANGUAGE plpgsql | 367 | LANGUAGE plpgsql |
| @@ -353,7 +387,7 @@ BEGIN | |||
| 353 | RAISE EXCEPTION 'conflict with existing network regions'; | 387 | RAISE EXCEPTION 'conflict with existing network regions'; |
| 354 | END IF; | 388 | END IF; |
| 355 | 389 | ||
| 356 | -- verifies that new region does not conflict with new network | 390 | -- verifies that new pool does not conflict with new network |
| 357 | SELECT count(id) INTO resultCount | 391 | SELECT count(id) INTO resultCount |
| 358 | FROM netblock | 392 | FROM netblock |
| 359 | WHERE poolId != NEW.poolId | 393 | WHERE poolId != NEW.poolId |
| @@ -366,6 +400,45 @@ BEGIN | |||
| 366 | RAISE EXCEPTION 'conflict with existing network pools'; | 400 | RAISE EXCEPTION 'conflict with existing network pools'; |
| 367 | END IF; | 401 | END IF; |
| 368 | 402 | ||
| 403 | -- verifies that IP address will not be orphaned | ||
| 404 | PERFORM netblockId | ||
| 405 | FROM ip | ||
| 406 | WHERE ip.netblockId = NEW.id | ||
| 407 | AND NOT ip.address <<= NEW.network; | ||
| 408 | IF FOUND THEN | ||
| 409 | RAISE EXCEPTION 'changing network will orphan existing IP addresses'; | ||
| 410 | END IF; | ||
| 411 | |||
| 412 | -- updates IP Association of netblock if an update and is now assignable | ||
| 413 | IF ( ( OLD.assignable IS FALSE ) AND ( NEW.assignable IS TRUE ) ) THEN | ||
| 414 | UPDATE ip | ||
| 415 | SET netblockId = nb.id | ||
| 416 | FROM ip | ||
| 417 | INNER JOIN netblock AS nb | ||
| 418 | ON nb.network >>= ip.address | ||
| 419 | WHERE ip.address <<= NEW.network | ||
| 420 | AND nb.assignable IS TRUE; | ||
| 421 | END IF; | ||
| 422 | |||
| 423 | RETURN NEW; | ||
| 424 | END; | ||
| 425 | $$; | ||
| 426 | |||
| 427 | |||
| 428 | CREATE OR REPLACE FUNCTION netblock_after_insert_or_update | ||
| 429 | ( ) | ||
| 430 | RETURNS trigger | ||
| 431 | LANGUAGE plpgsql | ||
| 432 | AS $$ | ||
| 433 | DECLARE | ||
| 434 | BEGIN | ||
| 435 | -- updates IP association of netblock is not assignable | ||
| 436 | IF ( NEW.assignable IS FALSE ) THEN | ||
| 437 | UPDATE ip | ||
| 438 | SET netblockId = NEW.id | ||
| 439 | WHERE address <<= NEW.network; | ||
| 440 | END IF; | ||
| 441 | |||
| 369 | RETURN NEW; | 442 | RETURN NEW; |
| 370 | END; | 443 | END; |
| 371 | $$; | 444 | $$; |
| @@ -374,7 +447,7 @@ $$; | |||
| 374 | /* | 447 | /* |
| 375 | * trigger functions for pool table | 448 | * trigger functions for pool table |
| 376 | */ | 449 | */ |
| 377 | CREATE OR REPLACE FUNCTION pool_trigger_insert_or_update | 450 | CREATE OR REPLACE FUNCTION pool_before_insert_or_update |
| 378 | ( ) | 451 | ( ) |
| 379 | RETURNS trigger | 452 | RETURNS trigger |
| 380 | LANGUAGE plpgsql | 453 | LANGUAGE plpgsql |
| @@ -393,7 +466,7 @@ $$; | |||
| 393 | /* | 466 | /* |
| 394 | * trigger functions for region table | 467 | * trigger functions for region table |
| 395 | */ | 468 | */ |
| 396 | CREATE OR REPLACE FUNCTION region_trigger_insert_or_update | 469 | CREATE OR REPLACE FUNCTION region_before_insert_or_update |
| 397 | ( ) | 470 | ( ) |
| 398 | RETURNS trigger | 471 | RETURNS trigger |
| 399 | LANGUAGE plpgsql | 472 | LANGUAGE plpgsql |
| @@ -416,58 +489,63 @@ $$; | |||
| 416 | -- //////////////// | 489 | -- //////////////// |
| 417 | 490 | ||
| 418 | -- address table triggers | 491 | -- address table triggers |
| 419 | CREATE TRIGGER ip_trigger_delete | 492 | CREATE TRIGGER ip_before_delete |
| 420 | BEFORE DELETE | 493 | BEFORE DELETE |
| 421 | ON ip | 494 | ON ip |
| 422 | FOR EACH ROW | 495 | FOR EACH ROW |
| 423 | EXECUTE PROCEDURE ip_trigger_delete(); | 496 | EXECUTE PROCEDURE ip_before_delete(); |
| 424 | CREATE TRIGGER ip_trigger_insert | 497 | CREATE TRIGGER ip_before_insert |
| 425 | BEFORE INSERT | 498 | BEFORE INSERT |
| 426 | ON ip | 499 | ON ip |
| 427 | FOR EACH ROW | 500 | FOR EACH ROW |
| 428 | EXECUTE PROCEDURE ip_trigger_insert(); | 501 | EXECUTE PROCEDURE ip_before_insert(); |
| 429 | CREATE TRIGGER ip_trigger_truncate | 502 | CREATE TRIGGER ip_before_truncate |
| 430 | BEFORE TRUNCATE | 503 | BEFORE TRUNCATE |
| 431 | ON ip | 504 | ON ip |
| 432 | FOR EACH STATEMENT | 505 | FOR EACH STATEMENT |
| 433 | EXECUTE PROCEDURE ip_trigger_truncate(); | 506 | EXECUTE PROCEDURE ip_before_truncate(); |
| 434 | CREATE TRIGGER ip_trigger_update | 507 | CREATE TRIGGER ip_before_update |
| 435 | BEFORE UPDATE | 508 | BEFORE UPDATE |
| 436 | ON ip | 509 | ON ip |
| 437 | FOR EACH ROW | 510 | FOR EACH ROW |
| 438 | EXECUTE PROCEDURE ip_trigger_update(); | 511 | EXECUTE PROCEDURE ip_before_update(); |
| 439 | 512 | ||
| 440 | 513 | ||
| 441 | -- netblock table triggers | 514 | -- netblock table triggers |
| 442 | CREATE TRIGGER netblock_trigger_insert_or_update | 515 | CREATE TRIGGER netblock_before_insert_or_update |
| 443 | BEFORE INSERT OR UPDATE | 516 | BEFORE INSERT OR UPDATE |
| 444 | ON netblock | 517 | ON netblock |
| 445 | FOR EACH ROW | 518 | FOR EACH ROW |
| 446 | EXECUTE PROCEDURE netblock_trigger_insert_or_update(); | 519 | EXECUTE PROCEDURE netblock_before_insert_or_update(); |
| 520 | CREATE TRIGGER netblock_after_insert_or_update | ||
| 521 | AFTER INSERT OR UPDATE | ||
| 522 | ON netblock | ||
| 523 | FOR EACH ROW | ||
| 524 | EXECUTE PROCEDURE netblock_after_insert_or_update(); | ||
| 447 | 525 | ||
| 448 | 526 | ||
| 449 | -- nas table triggers | 527 | -- nas table triggers |
| 450 | CREATE TRIGGER nas_trigger_insert_or_update | 528 | CREATE TRIGGER nas_before_insert_or_update |
| 451 | BEFORE INSERT OR UPDATE | 529 | BEFORE INSERT OR UPDATE |
| 452 | ON nas | 530 | ON nas |
| 453 | FOR EACH ROW | 531 | FOR EACH ROW |
| 454 | EXECUTE PROCEDURE nas_trigger_insert_or_update(); | 532 | EXECUTE PROCEDURE nas_before_insert_or_update(); |
| 455 | 533 | ||
| 456 | 534 | ||
| 457 | -- pool table triggers | 535 | -- pool table triggers |
| 458 | CREATE TRIGGER pool_trigger_insert_or_update | 536 | CREATE TRIGGER pool_before_insert_or_update |
| 459 | BEFORE INSERT OR UPDATE | 537 | BEFORE INSERT OR UPDATE |
| 460 | ON pool | 538 | ON pool |
| 461 | FOR EACH ROW | 539 | FOR EACH ROW |
| 462 | EXECUTE PROCEDURE pool_trigger_insert_or_update(); | 540 | EXECUTE PROCEDURE pool_before_insert_or_update(); |
| 463 | 541 | ||
| 464 | 542 | ||
| 465 | -- region table triggers | 543 | -- region table triggers |
| 466 | CREATE TRIGGER region_trigger_insert_or_update | 544 | CREATE TRIGGER region_before_insert_or_update |
| 467 | BEFORE INSERT OR UPDATE | 545 | BEFORE INSERT OR UPDATE |
| 468 | ON region | 546 | ON region |
| 469 | FOR EACH ROW | 547 | FOR EACH ROW |
| 470 | EXECUTE PROCEDURE region_trigger_insert_or_update(); | 548 | EXECUTE PROCEDURE region_before_insert_or_update(); |
| 471 | 549 | ||
| 472 | 550 | ||
| 473 | /* end of sql */ | 551 | /* end of sql */ |
