1 2------------------------------------------------------------------------------ 3-- changement de type de rr.date : devient une vraie date 4------------------------------------------------------------------------------ 5 6-- n�cessite que le langage pltcl soit charg� dans la base 7-- correspondante : 8-- createlang pltcl dns 9 10 11-- cr�ation de la fonction de modification 12CREATE OR REPLACE FUNCTION int2date (INTEGER) 13 RETURNS TIMESTAMP WITHOUT TIME ZONE AS ' 14 return [clock format $1] 15 ' LANGUAGE 'pltcl' WITH (isStrict) ; 16 17-- ajout du champ 18ALTER TABLE rr ADD COLUMN date2 TIMESTAMP WITHOUT TIME ZONE ; 19 20-- suppression temporaire des triggers pour acc�l�rer la mise � jour 21DROP TRIGGER tr_modifier_rr ON rr ; 22 23-- mise � jour effective : c'est le moteur qui travaille 24UPDATE rr SET date2 = int2date (date) ; 25 26-- nettoyage et renommage 27ALTER TABLE rr DROP COLUMN date ; 28ALTER TABLE rr RENAME COLUMN date2 TO date ; 29DROP FUNCTION int2date (INTEGER) ; 30 31-- valeur par d�faut du champ 32ALTER TABLE rr ALTER COLUMN date SET DEFAULT CURRENT_TIMESTAMP ; 33 34-- on remet le trigger tel qu'il �tait initialement 35CREATE TRIGGER tr_modifier_rr 36 AFTER INSERT OR UPDATE OR DELETE 37 ON rr 38 FOR EACH ROW 39 EXECUTE PROCEDURE modifier_rr () 40 ; 41 42------------------------------------------------------------------------------ 43-- nouvelle colonne rr.mac associ�e � un nom 44-- simplification : une seule adresse MAC par nom 45------------------------------------------------------------------------------ 46 47ALTER TABLE rr 48 ADD COLUMN mac MACADDR -- adresse MAC associ�e au nom, ou NULL 49 ; 50 51------------------------------------------------------------------------------ 52-- Le n�cessaire pour le trigger de d�tection des modifications d'adresse MAC 53------------------------------------------------------------------------------ 54 55-- une table � une seule ligne pour la configuration globale de DHCP 56CREATE TABLE dhcp ( 57 generer INTEGER -- 1 s'il faut reg�nerer la config 58) ; 59 60INSERT INTO dhcp (generer) VALUES (0) ; 61 62 63-- fonction de trigger pour actualiser le bool�en 64CREATE OR REPLACE FUNCTION modifier_rr () RETURNS trigger AS ' 65 BEGIN 66 IF TG_OP = ''INSERT'' 67 THEN 68 PERFORM sum (gen_norm_iddom (NEW.iddom)) ; 69 PERFORM sum (gen_rev4 (adr)) FROM rr_ip WHERE idrr = NEW.idrr ; 70 PERFORM sum (gen_rev6 (adr)) FROM rr_ip WHERE idrr = NEW.idrr ; 71 72 IF NEW.mac IS NOT NULL 73 THEN 74 UPDATE dhcp SET generer = 1 ; 75 END IF ; 76 END IF ; 77 78 IF TG_OP = ''UPDATE'' 79 THEN 80 PERFORM sum (gen_norm_iddom (NEW.iddom)) ; 81 PERFORM sum (gen_rev4 (adr)) FROM rr_ip WHERE idrr = NEW.idrr ; 82 PERFORM sum (gen_rev6 (adr)) FROM rr_ip WHERE idrr = NEW.idrr ; 83 PERFORM sum (gen_norm_iddom (OLD.iddom)) ; 84 PERFORM sum (gen_rev4 (adr)) FROM rr_ip WHERE idrr = OLD.idrr ; 85 PERFORM sum (gen_rev6 (adr)) FROM rr_ip WHERE idrr = OLD.idrr ; 86 87 IF OLD.mac IS DISTINCT FROM NEW.mac 88 OR OLD.iddhcpprofil IS DISTINCT FROM NEW.iddhcpprofil 89 THEN 90 UPDATE dhcp SET generer = 1 ; 91 END IF ; 92 END IF ; 93 94 IF TG_OP = ''DELETE'' 95 THEN 96 PERFORM sum (gen_norm_iddom (OLD.iddom)) ; 97 PERFORM sum (gen_rev4 (adr)) FROM rr_ip WHERE idrr = OLD.idrr ; 98 PERFORM sum (gen_rev6 (adr)) FROM rr_ip WHERE idrr = OLD.idrr ; 99 100 IF OLD.mac IS NOT NULL 101 THEN 102 UPDATE dhcp SET generer = 1 ; 103 END IF ; 104 END IF ; 105 106 RETURN NEW ; 107 END ; 108 ' LANGUAGE 'plpgsql' ; 109 110-- autre fonction de trigger 111CREATE OR REPLACE FUNCTION generer_dhcp () RETURNS trigger AS ' 112 BEGIN 113 UPDATE dhcp SET generer = 1 ; 114 RETURN NEW ; 115 END ; 116 ' LANGUAGE 'plpgsql' ; 117 118-- encore une ! 119CREATE OR REPLACE FUNCTION modifier_ip () RETURNS trigger AS ' 120 BEGIN 121 IF TG_OP = ''INSERT'' 122 THEN 123 PERFORM sum (gen_rev4 (NEW.adr)) ; 124 PERFORM sum (gen_rev6 (NEW.adr)) ; 125 PERFORM sum (gen_norm_idrr (NEW.idrr)) ; 126 127 UPDATE dhcp SET generer = 1 128 FROM rr WHERE rr.idrr = NEW.idrr AND rr.mac IS NOT NULL ; 129 130 UPDATE dhcp SET generer = 1 131 FROM rr WHERE rr.idrr = NEW.idrr AND rr.mac IS NOT NULL ; 132 END IF ; 133 134 IF TG_OP = ''UPDATE'' 135 THEN 136 PERFORM sum (gen_rev4 (NEW.adr)) ; 137 PERFORM sum (gen_rev4 (OLD.adr)) ; 138 PERFORM sum (gen_rev6 (NEW.adr)) ; 139 PERFORM sum (gen_rev6 (OLD.adr)) ; 140 PERFORM sum (gen_norm_idrr (NEW.idrr)) ; 141 PERFORM sum (gen_norm_idrr (OLD.idrr)) ; 142 143 UPDATE dhcp SET generer = 1 144 FROM rr WHERE rr.idrr = OLD.idrr AND rr.mac IS NOT NULL ; 145 UPDATE dhcp SET generer = 1 146 FROM rr WHERE rr.idrr = NEW.idrr AND rr.mac IS NOT NULL ; 147 END IF ; 148 149 IF TG_OP = ''DELETE'' 150 THEN 151 PERFORM sum (gen_rev4 (OLD.adr)) ; 152 PERFORM sum (gen_rev6 (OLD.adr)) ; 153 PERFORM sum (gen_norm_idrr (OLD.idrr)) ; 154 155 UPDATE dhcp SET generer = 1 156 FROM rr WHERE rr.idrr = OLD.idrr AND rr.mac IS NOT NULL ; 157 END IF ; 158 159 RETURN NEW ; 160 END ; 161 ' LANGUAGE 'plpgsql' ; 162 163 164ALTER TABLE reseau 165 ADD COLUMN dhcp INTEGER -- activer DHCP (1) ou non (0) 166 ; 167 168ALTER TABLE reseau 169 ALTER COLUMN dhcp SET DEFAULT 0 170 ; 171 172UPDATE reseau SET dhcp = 0 ; 173 174ALTER TABLE reseau 175 ADD COLUMN gw4 INET -- routeur par d�faut du r�seau 176 ; 177 178ALTER TABLE reseau 179 ADD CONSTRAINT gw4_in_net CHECK (gw4 <<= adr4) 180 ; 181 182ALTER TABLE reseau 183 ADD COLUMN gw6 INET -- pour plus tard, mais soyons homog�nes 184 ; 185 186ALTER TABLE reseau 187 ADD CONSTRAINT gw6_in_net CHECK (gw6 <<= adr6) 188 ; 189 190ALTER TABLE reseau 191 ADD CONSTRAINT dhcp_needs_ipv4_gateway 192 CHECK (dhcp = 0 OR (dhcp != 0 AND gw4 IS NOT NULL)); 193 194-- le trigger associ� 195CREATE TRIGGER tr_modifier_reseau 196 AFTER INSERT OR UPDATE OR DELETE 197 ON reseau 198 FOR EACH ROW 199 EXECUTE PROCEDURE generer_dhcp () 200 ; 201 202------------------------------------------------------------------------------ 203-- Extension des droits associ�s aux r�seaux 204------------------------------------------------------------------------------ 205 206ALTER TABLE plage 207 RENAME TO dr_reseau 208 ; 209 210ALTER TABLE dr_reseau 211 ADD COLUMN tri INTEGER -- classe tri pour l'affichage 212 ; 213 214ALTER TABLE dr_reseau 215 ADD COLUMN dhcp INTEGER -- acc�s � la gestion DHCP (dynamique) 216 ; 217 218ALTER TABLE dr_reseau 219 ADD COLUMN acl INTEGER -- acc�s aux ACL 220 ; 221 222ALTER TABLE dr_reseau ALTER COLUMN dhcp SET DEFAULT 0 ; 223ALTER TABLE dr_reseau ALTER COLUMN acl SET DEFAULT 0 ; 224 225UPDATE dr_reseau SET tri = 10, dhcp = 0, acl = 0 ; 226 227------------------------------------------------------------------------------ 228-- Table des intervalles d'adresses dynamiques 229------------------------------------------------------------------------------ 230 231CREATE SEQUENCE seq_dhcprange START 1 ; 232CREATE TABLE dhcprange ( 233 iddhcprange INT -- seulement pour l'�dition de tableau 234 DEFAULT NEXTVAL ('seq_dhcprange'), 235 min INET UNIQUE, -- d�but de l'intervalle dynamique 236 max INET UNIQUE, -- fin de l'intervalle dynamique 237 iddom INT, -- domaine fourni par DHCP 238 default_lease_time INT DEFAULT 0, -- en secondes 239 max_lease_time INT DEFAULT 0, -- en secondes 240 241 CHECK (min <= max), 242 FOREIGN KEY (iddom) REFERENCES domaine (iddom), 243 PRIMARY KEY (iddhcprange) 244) ; 245 246-- le trigger associ� 247CREATE TRIGGER tr_modifier_dhcprange 248 AFTER INSERT OR UPDATE OR DELETE 249 ON dhcprange 250 FOR EACH ROW 251 EXECUTE PROCEDURE generer_dhcp () 252 ; 253 254GRANT ALL ON dhcp, seq_dhcprange, dhcprange TO dns ; 255GRANT ALL ON dhcp, seq_dhcprange, dhcprange TO pda ; 256GRANT ALL ON dhcp, seq_dhcprange, dhcprange TO jean ; 257 258 259------------------------------------------------------------------------------ 260-- Table des profils DHCP et des droits associ�s 261------------------------------------------------------------------------------ 262 263CREATE SEQUENCE seq_dhcpprofil START 1 ; 264CREATE TABLE dhcpprofil ( 265 iddhcpprofil INT -- identifiant du profil DHCP 266 DEFAULT NEXTVAL ('seq_dhcpprofil'), 267 nom TEXT UNIQUE, -- nom du profil 268 texte TEXT, -- texte � ajouter avant les hosts 269 270 CHECK (iddhcpprofil >= 1), 271 PRIMARY KEY (iddhcpprofil) 272) ; 273 274CREATE TABLE dr_dhcpprofil ( 275 idgrp INT, -- identifiant du groupe 276 iddhcpprofil INT, -- identifiant du profil DHCP 277 tri INT, -- classe de tri pour les menus 278 279 FOREIGN KEY (idgrp) REFERENCES groupe (idgrp), 280 FOREIGN KEY (iddhcpprofil) REFERENCES dhcpprofil (iddhcpprofil), 281 PRIMARY KEY (idgrp, iddhcpprofil) 282) ; 283 284GRANT ALL ON dhcpprofil, seq_dhcpprofil, dr_dhcpprofil TO dns ; 285GRANT ALL ON dhcpprofil, seq_dhcpprofil, dr_dhcpprofil TO pda ; 286GRANT ALL ON dhcpprofil, seq_dhcpprofil, dr_dhcpprofil TO jean ; 287 288 289------------------------------------------------------------------------------ 290-- nouvelle colonne rr.iddhcpprofil associ�e � un nom 291------------------------------------------------------------------------------ 292 293ALTER TABLE rr 294 ADD COLUMN iddhcpprofil INT -- identifiant du profil DHCP ou NULL 295 ; 296 297ALTER TABLE rr ADD 298 FOREIGN KEY (iddhcpprofil) REFERENCES dhcpprofil (iddhcpprofil) ; 299 300------------------------------------------------------------------------------ 301-- valeurs par d�faut des param�tres de g�n�ration 302------------------------------------------------------------------------------ 303 304INSERT INTO config (clef, valeur) VALUES ('default_lease_time', 600) ; 305INSERT INTO config (clef, valeur) VALUES ('max_lease_time', 3600) ; 306INSERT INTO config (clef, valeur) VALUES ('min_lease_time', 300) ; 307 308------------------------------------------------------------------------------ 309-- valide un intervalle DHCP (min-max) par rapport aux droits du groupe 310------------------------------------------------------------------------------ 311-- $1 : idgrp 312-- $2 : dhcp min 313-- $3 : dhcp max 314CREATE OR REPLACE FUNCTION valide_dhcprange_grp (INTEGER, INET, INET) 315 RETURNS BOOLEAN AS ' 316 set min {} 317 foreach o [split $2 "."] { 318 lappend min [format "%02x" $o] 319 } 320 set min [join $min ""] 321 set min [expr 0x$min] 322 set ipbin [expr 0x$min] 323 324 set max {} 325 foreach o [split $3 "."] { 326 lappend max [format "%02x" $o] 327 } 328 set max [join $max ""] 329 set max [expr 0x$max] 330 331 set r t 332 for {set ipbin $min} {$ipbin <= $max} {incr ipbin} { 333 # Preparer la nouvelle adresse IP 334 set ip {} 335 set o $ipbin 336 for {set i 0} {$i < 4} {incr i} { 337 set ip [linsert $ip 0 [expr $o & 0xff]] 338 set o [expr $o >> 8] 339 } 340 set ip [join $ip "."] 341 342 # Tester la validite 343 spi_exec "SELECT valide_ip_grp (\'$ip\', $1) AS v" 344 345 if {! [string equal $v "t"]} then { 346 set r f 347 break 348 } 349 } 350 return $r 351 ' LANGUAGE pltcl ; 352