aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid M. Syzdek <syzdek@bindlebinaries.com>2019-05-08 23:44:24 -0800
committerDavid M. Syzdek <syzdek@bindlebinaries.com>2019-05-08 23:44:24 -0800
commitbef73ac3138fd12f32446973eba5dd1cdd3afa88 (patch)
tree57c4e8d081159acdf5c4eb1aca8135bfda04bebf
parent676530cdc7ca1a54a00b8594b678d5c36694c28d (diff)
downloadscratchpad-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.sql42
-rw-r--r--notes/projects/radius/sql/ippool-schema.sql267
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
14SELECT pool_add( poolName := 'DHCP' ); 14SELECT pool_add( poolName := 'DHCP' );
15SELECT pool_add( poolName := 'PPPoE' ); 15SELECT pool_add( poolName := 'PPPoE' );
16SELECT pool_add( poolName := 'reserved' );
16 17
17 18
18SELECT region_add( regionName := 'Anchorage' ); 19SELECT region_add( regionName := 'Anchorage' );
19SELECT region_add( regionName := 'Soldotna' ); 20SELECT region_add( regionName := 'Soldotna' );
20SELECT region_add( regionName := 'Fairbanks' ); 21SELECT region_add( regionName := 'Fairbanks' );
22SELECT region_add( regionName := 'No where' );
21 23
22 24
23SELECT nas_add( nasName := 'br1.cwc', regionName := 'Anchorage' ); 25SELECT 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 );
34SELECT netblock_add 37SELECT 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 );
40SELECT netblock_add 44SELECT 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 );
53SELECT 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 );
62SELECT 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 72SELECT ip_add_network( ipNetwork := '209.112.192.0/19' );
50 73SELECT ip_add_network( ipNetwork := '209.112.128.0/18' );
51INSERT 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 */
209CREATE OR REPLACE FUNCTION ip_add_network
210(
211 ipNetwork CIDR
212)
213 RETURNS INTEGER
214 LANGUAGE plpgsql
215 AS $$
216DECLARE
217 ipAddress INET;
218 resultCount INTEGER;
219 ipAdded INTEGER;
220 ipMask INTEGER;
221BEGIN
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;
261END;
262$$;
263
264
265/*
198 * updates timestamp of addresses 266 * updates timestamp of addresses
199 * 267 *
200 * returns trigger 268 * returns trigger
201 */ 269 */
202CREATE OR REPLACE FUNCTION ip_timestamp 270CREATE OR REPLACE FUNCTION ip_trigger
203( ) 271( )
204 RETURNS trigger 272 RETURNS trigger
205 LANGUAGE plpgsql 273 LANGUAGE plpgsql
@@ -208,12 +276,82 @@ DECLARE
208BEGIN 276BEGIN
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;
303END;
304$$;
305
306
307/*
308 * updates timestamp of addresses
309 *
310 * returns trigger
311 */
312CREATE OR REPLACE FUNCTION ip_trigger_delete
313( )
314 RETURNS trigger
315 LANGUAGE plpgsql
316 AS $$
317DECLARE
318BEGIN
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;
330END;
331$$;
332
333
334/*
335 * updates timestamp of addresses
336 *
337 * returns trigger
338 */
339CREATE OR REPLACE FUNCTION ip_trigger_truncate
340( )
341 RETURNS trigger
342 LANGUAGE plpgsql
343 AS $$
344DECLARE
345 resultCount INTEGER;
346BEGIN
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;
219END; 357END;
@@ -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 */
307CREATE OR REPLACE FUNCTION netblock_add 449CREATE 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;
356END; 504END;
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
370DECLARE 518DECLARE
371 resultCount INTEGER; 519 resultCount INTEGER;
372BEGIN 520BEGIN
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 */
562CREATE OR REPLACE FUNCTION netblock_trigger_delete
563( )
564 RETURNS trigger
565 LANGUAGE plpgsql
566 AS $$
567DECLARE
568 resultCount INTEGER;
569BEGIN
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;
588END;
589$$;
590
591
592/*
593 * adds contraints to netblocks
594 *
595 * returns trigger
596 */
597CREATE OR REPLACE FUNCTION netblock_trigger_truncate
598( )
599 RETURNS trigger
600 LANGUAGE plpgsql
601 AS $$
602DECLARE
603 resultCount INTEGER;
604BEGIN
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;
613END;
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
502CREATE TRIGGER ip_timestamp 715CREATE 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 720CREATE TRIGGER ip_trigger_delete
721 BEFORE DELETE
722 ON ip
723 FOR EACH ROW
724 EXECUTE PROCEDURE ip_trigger_delete();
725CREATE 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
510CREATE TRIGGER netblock_trigger 732CREATE 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 737CREATE TRIGGER netblock_trigger_delete
738 BEFORE DELETE
739 ON netblock
740 FOR EACH ROW
741 EXECUTE PROCEDURE netblock_trigger_delete();
742CREATE 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 */