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