aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--notes/projects/radius/sql/ippool-schema.sql130
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 */
234CREATE OR REPLACE FUNCTION ip_trigger_delete 234CREATE 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
252CREATE OR REPLACE FUNCTION ip_trigger_insert 252CREATE 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
275CREATE OR REPLACE FUNCTION ip_trigger_truncate 284CREATE 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
287CREATE OR REPLACE FUNCTION ip_trigger_update 296CREATE OR REPLACE FUNCTION ip_before_update
288( ) 297( )
289 RETURNS trigger 298 RETURNS trigger
290 LANGUAGE plpgsql 299 LANGUAGE plpgsql
291 AS $$ 300 AS $$
292DECLARE 301DECLARE
302 ipAssignable BOOLEAN;
293BEGIN 303BEGIN
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;
304END; 338END;
@@ -308,7 +342,7 @@ $$;
308/* 342/*
309 * trigger functions for nas table 343 * trigger functions for nas table
310 */ 344 */
311CREATE OR REPLACE FUNCTION nas_trigger_insert_or_update 345CREATE 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 */
330CREATE OR REPLACE FUNCTION netblock_trigger_insert_or_update 364CREATE 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;
424END;
425$$;
426
427
428CREATE OR REPLACE FUNCTION netblock_after_insert_or_update
429( )
430 RETURNS trigger
431 LANGUAGE plpgsql
432 AS $$
433DECLARE
434BEGIN
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;
370END; 443END;
371$$; 444$$;
@@ -374,7 +447,7 @@ $$;
374/* 447/*
375 * trigger functions for pool table 448 * trigger functions for pool table
376 */ 449 */
377CREATE OR REPLACE FUNCTION pool_trigger_insert_or_update 450CREATE 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 */
396CREATE OR REPLACE FUNCTION region_trigger_insert_or_update 469CREATE 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
419CREATE TRIGGER ip_trigger_delete 492CREATE 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();
424CREATE TRIGGER ip_trigger_insert 497CREATE 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();
429CREATE TRIGGER ip_trigger_truncate 502CREATE 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();
434CREATE TRIGGER ip_trigger_update 507CREATE 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
442CREATE TRIGGER netblock_trigger_insert_or_update 515CREATE 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();
520CREATE 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
450CREATE TRIGGER nas_trigger_insert_or_update 528CREATE 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
458CREATE TRIGGER pool_trigger_insert_or_update 536CREATE 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
466CREATE TRIGGER region_trigger_insert_or_update 544CREATE 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 */