diff options
| author | David M. Syzdek <syzdek@bindlebinaries.com> | 2019-05-08 23:44:24 -0800 |
|---|---|---|
| committer | David M. Syzdek <syzdek@bindlebinaries.com> | 2019-05-08 23:44:24 -0800 |
| commit | bef73ac3138fd12f32446973eba5dd1cdd3afa88 (patch) | |
| tree | 57c4e8d081159acdf5c4eb1aca8135bfda04bebf | |
| parent | 676530cdc7ca1a54a00b8594b678d5c36694c28d (diff) | |
| download | scratchpad-bef73ac3138fd12f32446973eba5dd1cdd3afa88.tar.gz scratchpad-bef73ac3138fd12f32446973eba5dd1cdd3afa88.tar.bz2 scratchpad-bef73ac3138fd12f32446973eba5dd1cdd3afa88.tar.xz scratchpad-bef73ac3138fd12f32446973eba5dd1cdd3afa88.zip | |
Adding triggers
| -rw-r--r-- | notes/projects/radius/sql/= | 0 | ||||
| -rw-r--r-- | notes/projects/radius/sql/ippool-demo.sql | 42 | ||||
| -rw-r--r-- | notes/projects/radius/sql/ippool-schema.sql | 267 |
3 files changed, 277 insertions, 32 deletions
diff --git a/notes/projects/radius/sql/= b/notes/projects/radius/sql/= new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/notes/projects/radius/sql/= | |||
diff --git a/notes/projects/radius/sql/ippool-demo.sql b/notes/projects/radius/sql/ippool-demo.sql index 4775d5f..d00ebf1 100644 --- a/notes/projects/radius/sql/ippool-demo.sql +++ b/notes/projects/radius/sql/ippool-demo.sql | |||
| @@ -13,11 +13,13 @@ SET ROLE radius_ippool; | |||
| 13 | 13 | ||
| 14 | SELECT pool_add( poolName := 'DHCP' ); | 14 | SELECT pool_add( poolName := 'DHCP' ); |
| 15 | SELECT pool_add( poolName := 'PPPoE' ); | 15 | SELECT pool_add( poolName := 'PPPoE' ); |
| 16 | SELECT pool_add( poolName := 'reserved' ); | ||
| 16 | 17 | ||
| 17 | 18 | ||
| 18 | SELECT region_add( regionName := 'Anchorage' ); | 19 | SELECT region_add( regionName := 'Anchorage' ); |
| 19 | SELECT region_add( regionName := 'Soldotna' ); | 20 | SELECT region_add( regionName := 'Soldotna' ); |
| 20 | SELECT region_add( regionName := 'Fairbanks' ); | 21 | SELECT region_add( regionName := 'Fairbanks' ); |
| 22 | SELECT region_add( regionName := 'No where' ); | ||
| 21 | 23 | ||
| 22 | 24 | ||
| 23 | SELECT nas_add( nasName := 'br1.cwc', regionName := 'Anchorage' ); | 25 | SELECT nas_add( nasName := 'br1.cwc', regionName := 'Anchorage' ); |
| @@ -29,13 +31,15 @@ SELECT netblock_add | |||
| 29 | ( | 31 | ( |
| 30 | netAddress := '209.112.192.0/19', | 32 | netAddress := '209.112.192.0/19', |
| 31 | poolName := 'DHCP', | 33 | poolName := 'DHCP', |
| 32 | regionName := 'Anchorage' | 34 | regionName := 'Anchorage', |
| 35 | addIpEntries := TRUE | ||
| 33 | ); | 36 | ); |
| 34 | SELECT netblock_add | 37 | SELECT netblock_add |
| 35 | ( | 38 | ( |
| 36 | netAddress := '209.112.128.0/18', | 39 | netAddress := '209.112.128.0/18', |
| 37 | poolName := 'DHCP', | 40 | poolName := 'DHCP', |
| 38 | regionName := 'Anchorage' | 41 | regionName := 'Anchorage', |
| 42 | addIpEntries := TRUE | ||
| 39 | ); | 43 | ); |
| 40 | SELECT netblock_add | 44 | SELECT netblock_add |
| 41 | ( | 45 | ( |
| @@ -43,20 +47,30 @@ SELECT netblock_add | |||
| 43 | poolName := 'DHCP', | 47 | poolName := 'DHCP', |
| 44 | regionName := 'Anchorage', | 48 | regionName := 'Anchorage', |
| 45 | netActive := FALSE, | 49 | netActive := FALSE, |
| 46 | netDesc := 'Admin Network' | 50 | netDesc := 'Admin Network', |
| 51 | addIpEntries := TRUE | ||
| 52 | ); | ||
| 53 | SELECT netblock_add | ||
| 54 | ( | ||
| 55 | netAddress := '209.193.4.0/28', | ||
| 56 | poolName := 'DHCP', | ||
| 57 | regionName := 'Anchorage', | ||
| 58 | netActive := FALSE, | ||
| 59 | netDesc := 'Admin Network', | ||
| 60 | addIpEntries := TRUE | ||
| 61 | ); | ||
| 62 | SELECT netblock_add | ||
| 63 | ( | ||
| 64 | netAddress := '209.193.4.0/29', | ||
| 65 | poolName := 'DHCP', | ||
| 66 | regionName := 'Anchorage', | ||
| 67 | netActive := FALSE, | ||
| 68 | netDesc := 'Admin Network', | ||
| 69 | addIpEntries := TRUE | ||
| 47 | ); | 70 | ); |
| 48 | 71 | ||
| 49 | 72 | SELECT ip_add_network( ipNetwork := '209.112.192.0/19' ); | |
| 50 | 73 | SELECT ip_add_network( ipNetwork := '209.112.128.0/18' ); | |
| 51 | INSERT INTO block ( poolId, regionId, net, description ) VALUES | ||
| 52 | ( ( SELECT id FROM pool WHERE name LIKE 'dhcp' ), | ||
| 53 | ( SELECT id FROM region WHERE name LIKE 'anchorage' ), | ||
| 54 | '209.112.156.0/23', | ||
| 55 | 'Admin Blocks' ), | ||
| 56 | ( ( SELECT id FROM pool WHERE name LIKE 'dhcp' ), | ||
| 57 | ( SELECT id FROM region WHERE name LIKE 'anchorage' ), | ||
| 58 | '209.112.128.0/24', | ||
| 59 | 'User Blocks' ); | ||
| 60 | 74 | ||
| 61 | 75 | ||
| 62 | /* end of sql */ | 76 | /* end of sql */ |
diff --git a/notes/projects/radius/sql/ippool-schema.sql b/notes/projects/radius/sql/ippool-schema.sql index df2bfeb..6db3a0a 100644 --- a/notes/projects/radius/sql/ippool-schema.sql +++ b/notes/projects/radius/sql/ippool-schema.sql | |||
| @@ -195,11 +195,79 @@ CREATE INDEX | |||
| 195 | -- ///////////////// | 195 | -- ///////////////// |
| 196 | 196 | ||
| 197 | /* | 197 | /* |
| 198 | * Creates IP entries for the given network block | ||
| 199 | * | ||
| 200 | * % SELECT ip_add_network( | ||
| 201 | * ipNetwork := '198.51.100.0/24' | ||
| 202 | * ); | ||
| 203 | * | ||
| 204 | * ipNetwork | ||
| 205 | * : network address and network size being added to database | ||
| 206 | * | ||
| 207 | * Returns the number of new IP addresses registered | ||
| 208 | */ | ||
| 209 | CREATE OR REPLACE FUNCTION ip_add_network | ||
| 210 | ( | ||
| 211 | ipNetwork CIDR | ||
| 212 | ) | ||
| 213 | RETURNS INTEGER | ||
| 214 | LANGUAGE plpgsql | ||
| 215 | AS $$ | ||
| 216 | DECLARE | ||
| 217 | ipAddress INET; | ||
| 218 | resultCount INTEGER; | ||
| 219 | ipAdded INTEGER; | ||
| 220 | ipMask INTEGER; | ||
| 221 | BEGIN | ||
| 222 | |||
| 223 | -- searches for a matching netblock | ||
| 224 | SELECT count(network) INTO resultCount | ||
| 225 | FROM netblock | ||
| 226 | WHERE network >>= ipNetwork; | ||
| 227 | IF ( resultCount = 0 ) THEN | ||
| 228 | RAISE EXCEPTION 'matching netblock not found'; | ||
| 229 | END IF; | ||
| 230 | |||
| 231 | -- restricts access to IPv4 addresses | ||
| 232 | IF ( family(ipNetwork) != 4 ) THEN | ||
| 233 | RAISE EXCEPTION 'only IPv4 addresses are supported'; | ||
| 234 | END IF; | ||
| 235 | |||
| 236 | -- sets starting values | ||
| 237 | ipAdded := 0; | ||
| 238 | ipAddress := set_masklen( network(ipNetwork), 32 ); | ||
| 239 | |||
| 240 | -- loops through individual IP addresses | ||
| 241 | LOOP | ||
| 242 | EXIT WHEN ipAddress > set_masklen( broadcast(ipNetwork), 32 ); | ||
| 243 | |||
| 244 | -- searches for existing IP address | ||
| 245 | SELECT count( address ) INTO resultCount | ||
| 246 | FROM ip | ||
| 247 | WHERE address = ipAddress; | ||
| 248 | |||
| 249 | -- defines IP address if not defined and counts results | ||
| 250 | IF ( resultCount = 0 ) THEN | ||
| 251 | INSERT INTO ip | ||
| 252 | ( address ) | ||
| 253 | VALUES ( ipAddress ); | ||
| 254 | ipAdded := ipAdded + 1; | ||
| 255 | END IF; | ||
| 256 | ipAddress := ipAddress + 1; | ||
| 257 | |||
| 258 | END LOOP; | ||
| 259 | |||
| 260 | RETURN ipAdded; | ||
| 261 | END; | ||
| 262 | $$; | ||
| 263 | |||
| 264 | |||
| 265 | /* | ||
| 198 | * updates timestamp of addresses | 266 | * updates timestamp of addresses |
| 199 | * | 267 | * |
| 200 | * returns trigger | 268 | * returns trigger |
| 201 | */ | 269 | */ |
| 202 | CREATE OR REPLACE FUNCTION ip_timestamp | 270 | CREATE OR REPLACE FUNCTION ip_trigger |
| 203 | ( ) | 271 | ( ) |
| 204 | RETURNS trigger | 272 | RETURNS trigger |
| 205 | LANGUAGE plpgsql | 273 | LANGUAGE plpgsql |
| @@ -208,12 +276,82 @@ DECLARE | |||
| 208 | BEGIN | 276 | BEGIN |
| 209 | 277 | ||
| 210 | -- prevents IP address from being modified | 278 | -- prevents IP address from being modified |
| 211 | IF ( NEW.address != OLD.address ) THEN | 279 | IF ( ( TG_OP = 'UPDATE' ) AND ( NEW.address != OLD.address ) ) THEN |
| 212 | RAISE EXCEPTION 'address cannot be modified'; | 280 | RAISE EXCEPTION 'address cannot be modified'; |
| 281 | END IF; | ||
| 282 | |||
| 283 | -- forces initial values | ||
| 284 | IF ( TG_OP = 'INSERT' ) THEN | ||
| 285 | NEW.username := NULL; | ||
| 286 | NEW.acctSession := NULL; | ||
| 287 | NEW.nasId := NULL; | ||
| 288 | END IF; | ||
| 289 | |||
| 290 | -- determines mask for single IP address | ||
| 291 | IF ( family(NEW.address) != 4 ) THEN | ||
| 292 | RAISE EXCEPTION 'only IPv4 addresses are supported'; | ||
| 213 | END IF; | 293 | END IF; |
| 214 | 294 | ||
| 215 | -- update timestamp | 295 | -- update timestamp |
| 216 | NEW.lastModified := current_timestamp; | 296 | IF ( TG_OP = 'INSERT' ) THEN |
| 297 | NEW.modified := current_timestamp; | ||
| 298 | ELSIF ( TG_OP = 'UPDATE' ) THEN | ||
| 299 | NEW.modified := TIMESTAMP 'epoch'; | ||
| 300 | END IF; | ||
| 301 | |||
| 302 | RETURN NEW; | ||
| 303 | END; | ||
| 304 | $$; | ||
| 305 | |||
| 306 | |||
| 307 | /* | ||
| 308 | * updates timestamp of addresses | ||
| 309 | * | ||
| 310 | * returns trigger | ||
| 311 | */ | ||
| 312 | CREATE OR REPLACE FUNCTION ip_trigger_delete | ||
| 313 | ( ) | ||
| 314 | RETURNS trigger | ||
| 315 | LANGUAGE plpgsql | ||
| 316 | AS $$ | ||
| 317 | DECLARE | ||
| 318 | BEGIN | ||
| 319 | -- verifies ip is not assigned to a RADIUS accounting session | ||
| 320 | IF ( OLD.acctSession IS NOT NULL ) THEN | ||
| 321 | RAISE EXCEPTION 'IP address is still assigned to accounting session'; | ||
| 322 | END IF; | ||
| 323 | |||
| 324 | -- verifies ip is not assigned to a RADIUS accounting session | ||
| 325 | IF ( OLD.nasId IS NOT NULL ) THEN | ||
| 326 | RAISE EXCEPTION 'IP address is still assigned to NAS session'; | ||
| 327 | END IF; | ||
| 328 | |||
| 329 | RETURN NEW; | ||
| 330 | END; | ||
| 331 | $$; | ||
| 332 | |||
| 333 | |||
| 334 | /* | ||
| 335 | * updates timestamp of addresses | ||
| 336 | * | ||
| 337 | * returns trigger | ||
| 338 | */ | ||
| 339 | CREATE OR REPLACE FUNCTION ip_trigger_truncate | ||
| 340 | ( ) | ||
| 341 | RETURNS trigger | ||
| 342 | LANGUAGE plpgsql | ||
| 343 | AS $$ | ||
| 344 | DECLARE | ||
| 345 | resultCount INTEGER; | ||
| 346 | BEGIN | ||
| 347 | -- searches for assigned IP addresses | ||
| 348 | SELECT count( address ) INTO resultCount | ||
| 349 | FROM ip | ||
| 350 | WHERE acctSession IS NOT NULL | ||
| 351 | OR nasId IS NOT NULL; | ||
| 352 | IF ( resultCount != 0 ) THEN | ||
| 353 | RAISE EXCEPTION 'IP addresses are still assigned to sessions'; | ||
| 354 | END IF; | ||
| 217 | 355 | ||
| 218 | RETURN NEW; | 356 | RETURN NEW; |
| 219 | END; | 357 | END; |
| @@ -275,15 +413,16 @@ $$; | |||
| 275 | * Creates entry for network block | 413 | * Creates entry for network block |
| 276 | * | 414 | * |
| 277 | * % SELECT netblock_add( | 415 | * % SELECT netblock_add( |
| 278 | * netAddress := '198.51.100.0/24', | 416 | * netAddress := '198.51.100.0/24', |
| 279 | * poolName := 'PPPoE' | 417 | * poolName := 'PPPoE' |
| 280 | * ); | 418 | * ); |
| 281 | * % SELECT netblock_add( | 419 | * % SELECT netblock_add( |
| 282 | * netAddress := '203.0.113.0/24', | 420 | * netAddress := '203.0.113.0/24', |
| 283 | * poolName := 'DHCP', | 421 | * poolName := 'DHCP', |
| 284 | * regionName := 'Soldotna', | 422 | * regionName := 'Soldotna', |
| 285 | * netActive := FALSE, | 423 | * netActive := FALSE, |
| 286 | * netDesc := 'Lab IP Pool' | 424 | * netDesc := 'Lab IP Pool', |
| 425 | * addIpEntries := TRUE | ||
| 287 | * ); | 426 | * ); |
| 288 | * | 427 | * |
| 289 | * netAddress | 428 | * netAddress |
| @@ -302,6 +441,9 @@ $$; | |||
| 302 | * netDesc | 441 | * netDesc |
| 303 | * : human readable description of the network | 442 | * : human readable description of the network |
| 304 | * | 443 | * |
| 444 | * addIpEntries | ||
| 445 | * : add coorisponding ip table entries for network | ||
| 446 | * | ||
| 305 | * Returns the `id` of the created nas client | 447 | * Returns the `id` of the created nas client |
| 306 | */ | 448 | */ |
| 307 | CREATE OR REPLACE FUNCTION netblock_add | 449 | CREATE OR REPLACE FUNCTION netblock_add |
| @@ -310,7 +452,8 @@ CREATE OR REPLACE FUNCTION netblock_add | |||
| 310 | poolName VARCHAR(32), | 452 | poolName VARCHAR(32), |
| 311 | regionName VARCHAR(32) DEFAULT NULL, | 453 | regionName VARCHAR(32) DEFAULT NULL, |
| 312 | netActive BOOLEAN DEFAULT TRUE, | 454 | netActive BOOLEAN DEFAULT TRUE, |
| 313 | netDesc VARCHAR(128) DEFAULT NULL | 455 | netDesc VARCHAR(128) DEFAULT NULL, |
| 456 | addIpEntries BOOLEAN DEFAULT FALSE | ||
| 314 | ) | 457 | ) |
| 315 | RETURNS INTEGER | 458 | RETURNS INTEGER |
| 316 | LANGUAGE plpgsql | 459 | LANGUAGE plpgsql |
| @@ -352,13 +495,18 @@ BEGIN | |||
| 352 | ) | 495 | ) |
| 353 | RETURNING id INTO returnId; | 496 | RETURNING id INTO returnId; |
| 354 | 497 | ||
| 498 | -- adds IP entries | ||
| 499 | if ( addIpEntries IS NOT FALSE ) THEN | ||
| 500 | PERFORM ip_add_network( ipNetwork := netAddress ); | ||
| 501 | END IF; | ||
| 502 | |||
| 355 | RETURN returnId; | 503 | RETURN returnId; |
| 356 | END; | 504 | END; |
| 357 | $$; | 505 | $$; |
| 358 | 506 | ||
| 359 | 507 | ||
| 360 | /* | 508 | /* |
| 361 | * updates timestamp of addresses | 509 | * adds contraints to netblocks |
| 362 | * | 510 | * |
| 363 | * returns trigger | 511 | * returns trigger |
| 364 | */ | 512 | */ |
| @@ -370,6 +518,10 @@ CREATE OR REPLACE FUNCTION netblock_trigger | |||
| 370 | DECLARE | 518 | DECLARE |
| 371 | resultCount INTEGER; | 519 | resultCount INTEGER; |
| 372 | BEGIN | 520 | BEGIN |
| 521 | -- verifies network is IPv4 | ||
| 522 | IF ( family(NEW.network) != 4 ) THEN | ||
| 523 | RAISE EXCEPTION 'only IPv4 networks are supported'; | ||
| 524 | END IF; | ||
| 373 | 525 | ||
| 374 | -- verifies that new region does not conflict with new network | 526 | -- verifies that new region does not conflict with new network |
| 375 | SELECT count(id) INTO resultCount | 527 | SELECT count(id) INTO resultCount |
| @@ -403,6 +555,67 @@ $$; | |||
| 403 | 555 | ||
| 404 | 556 | ||
| 405 | /* | 557 | /* |
| 558 | * adds contraints to netblocks | ||
| 559 | * | ||
| 560 | * returns trigger | ||
| 561 | */ | ||
| 562 | CREATE OR REPLACE FUNCTION netblock_trigger_delete | ||
| 563 | ( ) | ||
| 564 | RETURNS trigger | ||
| 565 | LANGUAGE plpgsql | ||
| 566 | AS $$ | ||
| 567 | DECLARE | ||
| 568 | resultCount INTEGER; | ||
| 569 | BEGIN | ||
| 570 | -- checks for IP addresses which would be orphaned | ||
| 571 | SELECT count( address ) INTO resultCount | ||
| 572 | FROM ip | ||
| 573 | WHERE address NOT IN | ||
| 574 | ( | ||
| 575 | SELECT address | ||
| 576 | FROM ip | ||
| 577 | INNER JOIN netblock | ||
| 578 | ON ip.address <<= netblock.network | ||
| 579 | WHERE ip.address <<= OLD.network | ||
| 580 | AND netblock.network <> OLD.network | ||
| 581 | ) | ||
| 582 | AND address <<= OLD.network; | ||
| 583 | IF ( resultCount != 0 ) THEN | ||
| 584 | RAISE EXCEPTION 'IP addresses still defined within netblock'; | ||
| 585 | END IF; | ||
| 586 | |||
| 587 | RETURN NEW; | ||
| 588 | END; | ||
| 589 | $$; | ||
| 590 | |||
| 591 | |||
| 592 | /* | ||
| 593 | * adds contraints to netblocks | ||
| 594 | * | ||
| 595 | * returns trigger | ||
| 596 | */ | ||
| 597 | CREATE OR REPLACE FUNCTION netblock_trigger_truncate | ||
| 598 | ( ) | ||
| 599 | RETURNS trigger | ||
| 600 | LANGUAGE plpgsql | ||
| 601 | AS $$ | ||
| 602 | DECLARE | ||
| 603 | resultCount INTEGER; | ||
| 604 | BEGIN | ||
| 605 | -- checks for IP addresses which would be orphaned | ||
| 606 | SELECT count( address ) INTO resultCount | ||
| 607 | FROM ip; | ||
| 608 | IF ( resultCount != 0 ) THEN | ||
| 609 | RAISE EXCEPTION 'IP addresses still defined'; | ||
| 610 | END IF; | ||
| 611 | |||
| 612 | RETURN NEW; | ||
| 613 | END; | ||
| 614 | $$; | ||
| 615 | |||
| 616 | |||
| 617 | |||
| 618 | /* | ||
| 406 | * Creates entry for IP Pool | 619 | * Creates entry for IP Pool |
| 407 | * | 620 | * |
| 408 | * % SELECT pool_add( | 621 | * % SELECT pool_add( |
| @@ -499,12 +712,21 @@ $$; | |||
| 499 | -- //////////////// | 712 | -- //////////////// |
| 500 | 713 | ||
| 501 | -- address table triggers | 714 | -- address table triggers |
| 502 | CREATE TRIGGER ip_timestamp | 715 | CREATE TRIGGER ip_trigger |
| 503 | BEFORE UPDATE | 716 | BEFORE INSERT OR UPDATE |
| 504 | ON ip | 717 | ON ip |
| 505 | FOR EACH ROW | 718 | FOR EACH ROW |
| 506 | EXECUTE PROCEDURE ip_timestamp(); | 719 | EXECUTE PROCEDURE ip_trigger(); |
| 507 | 720 | CREATE TRIGGER ip_trigger_delete | |
| 721 | BEFORE DELETE | ||
| 722 | ON ip | ||
| 723 | FOR EACH ROW | ||
| 724 | EXECUTE PROCEDURE ip_trigger_delete(); | ||
| 725 | CREATE TRIGGER ip_trigger_truncate | ||
| 726 | BEFORE TRUNCATE | ||
| 727 | ON ip | ||
| 728 | FOR EACH STATEMENT | ||
| 729 | EXECUTE PROCEDURE ip_trigger_truncate(); | ||
| 508 | 730 | ||
| 509 | -- netblock table triggers | 731 | -- netblock table triggers |
| 510 | CREATE TRIGGER netblock_trigger | 732 | CREATE TRIGGER netblock_trigger |
| @@ -512,6 +734,15 @@ CREATE TRIGGER netblock_trigger | |||
| 512 | ON netblock | 734 | ON netblock |
| 513 | FOR EACH ROW | 735 | FOR EACH ROW |
| 514 | EXECUTE PROCEDURE netblock_trigger(); | 736 | EXECUTE PROCEDURE netblock_trigger(); |
| 515 | 737 | CREATE TRIGGER netblock_trigger_delete | |
| 738 | BEFORE DELETE | ||
| 739 | ON netblock | ||
| 740 | FOR EACH ROW | ||
| 741 | EXECUTE PROCEDURE netblock_trigger_delete(); | ||
| 742 | CREATE TRIGGER netblock_trigger_truncate | ||
| 743 | BEFORE TRUNCATE | ||
| 744 | ON netblock | ||
| 745 | FOR EACH STATEMENT | ||
| 746 | EXECUTE PROCEDURE netblock_trigger_truncate(); | ||
| 516 | 747 | ||
| 517 | /* end of sql */ | 748 | /* end of sql */ |
