source: trunk/dns.sql@ 649

Last change on this file since 649 was 599, checked in by Kris Deugau, 11 years ago

/trunk

Prepare for changes to allow any record in either forward or reverse
zones, no matter how silly.

This commit adds a database function to catch errors with CASTing a
column as inet, so that any place we need to sort records based on the
IP value of a column succeeds by treating non-IP values as 0.0.0.0/0.

File size: 11.5 KB
Line 
1-- these lines could be run as a superuser. alter database name, username, password, group as appropriate.
2-- make sure to alter dnsdb.conf to match
3-- CREATE GROUP dnsdb;
4-- CREATE USER dnsdb WITH UNENCRYPTED PASSWORD 'secret' IN GROUP dnsdb;
5-- CREATE DATABASE dnsdb OWNED BY dnsdb;
6-- SET SESSION AUTHORIZATION 'dnsdb';
7
8-- pre-pg8.3, this must be run as a superuser
9CREATE LANGUAGE plpgsql;
10-- it's required for:
11
12-- Return proper conversion of string to inet, or 0.0.0.0/0 if the string is
13-- not a valid inet value. We need to do this to support "funky" records that
14-- may not actually have valid IP address values. Used for ORDER BY
15CREATE OR REPLACE FUNCTION inetlazy (rdata text) RETURNS inet AS $$
16BEGIN
17 RETURN CAST(rdata AS inet);
18EXCEPTION
19 WHEN OTHERS THEN
20 RETURN CAST('0.0.0.0/0' AS inet);
21END;
22$$ LANGUAGE plpgsql;
23
24
25-- need a handy place to put eg a DB version identifier - useful for auto-upgrading a DB
26CREATE TABLE misc (
27 misc_id serial NOT NULL,
28 key text DEFAULT '' NOT NULL,
29 value text DEFAULT '' NOT NULL
30);
31
32COPY misc (misc_id, key, value) FROM stdin;
331 dbversion 1.2.4
34\.
35
36CREATE TABLE locations (
37 location character varying (4) PRIMARY KEY,
38 loc_id serial UNIQUE,
39 group_id integer NOT NULL DEFAULT 1,
40 iplist text NOT NULL DEFAULT '',
41 description character varying(40) NOT NULL DEFAULT '',
42 comments text NOT NULL DEFAULT ''
43);
44
45CREATE TABLE default_records (
46 record_id serial NOT NULL,
47 group_id integer DEFAULT 1 NOT NULL,
48 host text DEFAULT '' NOT NULL,
49 "type" integer DEFAULT 1 NOT NULL,
50 val text DEFAULT '' NOT NULL,
51 distance integer DEFAULT 0 NOT NULL,
52 weight integer DEFAULT 0 NOT NULL,
53 port integer DEFAULT 0 NOT NULL,
54 ttl integer DEFAULT 86400 NOT NULL,
55 description text
56);
57
58-- default records for the default group
59COPY default_records (record_id, group_id, host, "type", val, distance, weight, port, ttl, description) FROM stdin;
601 1 ns1.example.com:hostmaster.DOMAIN 6 10800:3600:604800:5400 0 0 0 86400 \N
612 1 DOMAIN 2 ns2.example.com 0 0 0 7200 \N
623 1 DOMAIN 2 ns1.example.com 0 0 0 7200 \N
634 1 DOMAIN 1 10.0.0.4 0 0 0 7200 \N
645 1 DOMAIN 15 mx1.example.com 10 0 0 7200 \N
656 1 www.DOMAIN 5 DOMAIN 0 0 0 10800 \N
667 1 DOMAIN 16 "v=spf1 a mx -all" 0 0 0 10800 \N
67\.
68
69CREATE TABLE default_rev_records (
70 record_id serial NOT NULL,
71 group_id integer DEFAULT 1 NOT NULL,
72 host text DEFAULT '' NOT NULL,
73 "type" integer DEFAULT 1 NOT NULL,
74 val text DEFAULT '' NOT NULL,
75 ttl integer DEFAULT 86400 NOT NULL,
76 description text
77);
78
79COPY default_rev_records (record_id, group_id, host, "type", val, ttl, description) FROM stdin;
801 1 hostmaster.ADMINDOMAIN:ns1.ADMINDOMAIN 6 3600:900:1048576:2560 3600
812 1 unused-%r.ADMINDOMAIN 65283 ZONE 3600
823 1 ns2.example.com 2 ZONE 7200 \N
834 1 ns1.example.com 2 ZONE 7200 \N
84\.
85
86CREATE TABLE domains (
87 domain_id serial NOT NULL,
88 "domain" character varying(80) NOT NULL PRIMARY KEY,
89 group_id integer DEFAULT 1 NOT NULL,
90 description character varying(255) DEFAULT ''::character varying NOT NULL,
91 status integer DEFAULT 1 NOT NULL,
92 zserial integer,
93 sertype character(1) DEFAULT 'D'::bpchar,
94 changed boolean DEFAULT true NOT NULL,
95 default_location character varying (4) DEFAULT '' NOT NULL
96);
97-- ~2x performance boost iff most zones are fed to output from the cache
98CREATE INDEX dom_status_index ON domains (status);
99
100
101CREATE TABLE revzones (
102 rdns_id serial NOT NULL,
103 revnet cidr NOT NULL PRIMARY KEY,
104 group_id integer DEFAULT 1 NOT NULL,
105 description character varying(255) DEFAULT ''::character varying NOT NULL,
106 status integer DEFAULT 1 NOT NULL,
107 zserial integer,
108 sertype character(1) DEFAULT 'D'::bpchar,
109 changed boolean DEFAULT true NOT NULL,
110 default_location character varying (4) DEFAULT '' NOT NULL
111);
112CREATE INDEX rev_status_index ON revzones USING btree (status);
113
114CREATE TABLE groups (
115 group_id serial NOT NULL,
116 parent_group_id integer DEFAULT 1 NOT NULL,
117 group_name character varying(255) DEFAULT ''::character varying NOT NULL,
118 permission_id integer DEFAULT 1 NOT NULL,
119 inherit_perm boolean DEFAULT true NOT NULL
120);
121
122-- Provide a basic default group
123COPY groups (group_id, parent_group_id, permission_id, group_name) FROM stdin;
1241 1 1 default
125\.
126
127-- entry is text due to possible long entries from AXFR - a domain with "many"
128-- odd records will overflow varchar(200)
129CREATE TABLE log (
130 log_id serial NOT NULL,
131 domain_id integer,
132 user_id integer,
133 group_id integer,
134 email character varying(60),
135 name character varying(60),
136 entry text,
137 stamp timestamp with time zone DEFAULT now(),
138 rdns_id integer
139);
140
141CREATE TABLE permissions (
142 permission_id serial NOT NULL,
143 "admin" boolean DEFAULT false NOT NULL,
144 self_edit boolean DEFAULT false NOT NULL,
145 group_create boolean DEFAULT false NOT NULL,
146 group_edit boolean DEFAULT false NOT NULL,
147 group_delete boolean DEFAULT false NOT NULL,
148 user_create boolean DEFAULT false NOT NULL,
149 user_edit boolean DEFAULT false NOT NULL,
150 user_delete boolean DEFAULT false NOT NULL,
151 domain_create boolean DEFAULT false NOT NULL,
152 domain_edit boolean DEFAULT false NOT NULL,
153 domain_delete boolean DEFAULT false NOT NULL,
154 record_create boolean DEFAULT false NOT NULL,
155 record_edit boolean DEFAULT false NOT NULL,
156 record_delete boolean DEFAULT false NOT NULL,
157 user_id integer UNIQUE,
158 group_id integer UNIQUE,
159 record_locchg boolean DEFAULT false NOT NULL,
160 location_create boolean DEFAULT false NOT NULL,
161 location_edit boolean DEFAULT false NOT NULL,
162 location_delete boolean DEFAULT false NOT NULL,
163 location_view boolean DEFAULT false NOT NULL
164);
165
166-- Need *two* basic permissions; one for the initial group, one for the default admin user
167COPY permissions (permission_id, "admin", self_edit, group_create, group_edit, group_delete, user_create, user_edit, user_delete, domain_create, domain_edit, domain_delete, record_create, record_edit, record_delete, user_id, group_id, record_locchg, location_create, location_edit, location_delete, location_view) FROM stdin;
1681 f f f f f f f f t t t t t t \N 1 f f f f f
1692 t f f f f f f f f f f f f f 1 \N f f f f f
170\.
171
172-- rdns_id defaults to 0 since many records will not have an associated rDNS entry.
173CREATE TABLE records (
174 domain_id integer NOT NULL DEFAULT 0,
175 record_id serial NOT NULL,
176 host text DEFAULT '' NOT NULL,
177 "type" integer DEFAULT 1 NOT NULL,
178 val text DEFAULT '' NOT NULL,
179 distance integer DEFAULT 0 NOT NULL,
180 weight integer DEFAULT 0 NOT NULL,
181 port integer DEFAULT 0 NOT NULL,
182 ttl integer DEFAULT 7200 NOT NULL,
183 description text,
184 rdns_id integer NOT NULL DEFAULT 0,
185 location character varying (4) DEFAULT '' NOT NULL,
186 stamp TIMESTAMP WITH TIME ZONE DEFAULT 'epoch' NOT NULL,
187 expires boolean DEFAULT 'n' NOT NULL,
188 stampactive boolean DEFAULT 'n' NOT NULL
189);
190CREATE INDEX rec_domain_index ON records USING btree (domain_id);
191CREATE INDEX rec_revzone_index ON records USING btree (rdns_id);
192CREATE INDEX rec_types_index ON records USING btree ("type");
193
194CREATE TABLE rectypes (
195 val integer NOT NULL,
196 name character varying(20) NOT NULL,
197 stdflag integer DEFAULT 1 NOT NULL,
198 listorder integer DEFAULT 255 NOT NULL,
199 alphaorder integer DEFAULT 32768 NOT NULL
200);
201
202-- Types are required. NB: these are vaguely read-only too
203-- data from http://www.iana.org/assignments/dns-parameters
204COPY rectypes (val, name, stdflag, listorder, alphaorder) FROM stdin;
2051 A 1 1 1
2062 NS 2 10 37
2073 MD 5 255 29
2084 MF 5 255 30
2095 CNAME 2 12 9
2106 SOA 0 0 53
2117 MB 5 255 28
2128 MG 5 255 31
2139 MR 5 255 33
21410 NULL 5 255 43
21511 WKS 5 255 64
21612 PTR 3 5 46
21713 HINFO 5 255 18
21814 MINFO 5 255 32
21915 MX 1 11 34
22016 TXT 2 13 60
22117 RP 4 255 48
22218 AFSDB 5 255 4
22319 X25 5 255 65
22420 ISDN 5 255 21
22521 RT 5 255 50
22622 NSAP 5 255 38
22723 NSAP-PTR 5 255 39
22824 SIG 5 255 51
22925 KEY 5 255 23
23026 PX 5 255 47
23127 GPOS 5 255 17
23228 AAAA 1 3 3
23329 LOC 5 255 25
23430 NXT 5 255 44
23531 EID 5 255 15
23632 NIMLOC 5 255 36
23733 SRV 1 14 55
23834 ATMA 5 255 6
23935 NAPTR 5 255 35
24036 KX 5 255 24
24137 CERT 5 255 8
24238 A6 5 3 2
24339 DNAME 5 255 12
24440 SINK 5 255 52
24541 OPT 5 255 45
24642 APL 5 255 5
24743 DS 5 255 14
24844 SSHFP 5 255 56
24945 IPSECKEY 5 255 20
25046 RRSIG 5 255 49
25147 NSEC 5 255 40
25248 DNSKEY 5 255 13
25349 DHCID 5 255 10
25450 NSEC3 5 255 41
25551 NSEC3PARAM 5 255 42
25655 HIP 5 255 19
25799 SPF 5 255 54
258100 UINFO 5 255 62
259101 UID 5 255 61
260102 GID 5 255 16
261103 UNSPEC 5 255 63
262249 TKEY 5 255 58
263250 TSIG 5 255 59
264251 IXFR 5 255 22
265252 AXFR 5 255 7
266253 MAILB 5 255 27
267254 MAILA 5 255 26
26832768 TA 5 255 57
26932769 DLV 5 255 11
270\.
271
272-- Custom types (ab)using the "Private use" range from 65280 to 65534
273COPY rectypes (val, name, stdflag, listorder, alphaorder) FROM stdin;
27465280 A+PTR 2 2 2
27565281 AAAA+PTR 2 4 4
27665282 PTR template 3 6 2
27765283 A+PTR template 2 7 2
27865284 AAAA+PTR template 2 8 2
27965285 Delegation 2 9 2
280\.
281
282CREATE TABLE users (
283 user_id serial NOT NULL,
284 group_id integer DEFAULT 1 NOT NULL,
285 username character varying(60) NOT NULL,
286 "password" character varying(34) NOT NULL,
287 firstname character varying(60),
288 lastname character varying(60),
289 phone character varying(15),
290 "type" character(1) DEFAULT 'S'::bpchar NOT NULL,
291 status integer DEFAULT 1 NOT NULL,
292 permission_id integer DEFAULT 1 NOT NULL,
293 inherit_perm boolean DEFAULT true NOT NULL
294);
295
296-- create initial default user? may be better to create an "initialize" script or something
297COPY users (user_id, group_id, username, "password", firstname, lastname, phone, "type", status, permission_id, inherit_perm) FROM stdin;
2981 1 admin $1$PfEBUv9d$wV2/UG4gmKk08DLmdE8/d. Initial User \N S 1 2 f
299\.
300
301--
302-- contraints. add these here so initial data doesn't get added strangely.
303--
304
305-- primary keys
306ALTER TABLE ONLY permissions
307 ADD CONSTRAINT permissions_permission_id_key UNIQUE (permission_id);
308
309ALTER TABLE ONLY groups
310 ADD CONSTRAINT groups_group_id_key UNIQUE (group_id);
311
312ALTER TABLE ONLY domains
313 ADD CONSTRAINT domains_domain_id_key UNIQUE (domain_id);
314
315ALTER TABLE ONLY default_records
316 ADD CONSTRAINT default_records_pkey PRIMARY KEY (record_id);
317
318ALTER TABLE ONLY records
319 ADD CONSTRAINT records_pkey PRIMARY KEY (record_id);
320
321ALTER TABLE ONLY rectypes
322 ADD CONSTRAINT rectypes_pkey PRIMARY KEY (val, name);
323
324ALTER TABLE ONLY users
325 ADD CONSTRAINT users_pkey PRIMARY KEY (username);
326
327ALTER TABLE ONLY users
328 ADD CONSTRAINT uidu UNIQUE (user_id);
329
330-- foreign keys
331-- fixme: permissions FK refs
332ALTER TABLE ONLY locations
333 ADD CONSTRAINT "locations_group_id_fkey" FOREIGN KEY (group_id) REFERENCES groups(group_id);
334
335ALTER TABLE ONLY domains
336 ADD CONSTRAINT "$1" FOREIGN KEY (group_id) REFERENCES groups(group_id);
337
338ALTER TABLE ONLY default_records
339 ADD CONSTRAINT "$1" FOREIGN KEY (group_id) REFERENCES groups(group_id);
340
341ALTER TABLE ONLY users
342 ADD CONSTRAINT "$1" FOREIGN KEY (group_id) REFERENCES groups(group_id);
343
344ALTER TABLE ONLY revzones
345 ADD CONSTRAINT "$1" FOREIGN KEY (group_id) REFERENCES groups(group_id);
346
347ALTER TABLE ONLY groups
348 ADD CONSTRAINT group_parent FOREIGN KEY (parent_group_id) REFERENCES groups(group_id);
349
350-- set starting sequence numbers, since we've inserted data before they're active
351-- only set the ones that have data loaded with \copy, and obey the convention
352-- that comes out of pg_dump
353SELECT pg_catalog.setval('misc_misc_id_seq', 1, true);
354SELECT pg_catalog.setval('default_records_record_id_seq', 8, true);
355SELECT pg_catalog.setval('default_rev_records_record_id_seq', 4, true);
356SELECT pg_catalog.setval('groups_group_id_seq', 1, true);
357SELECT pg_catalog.setval('permissions_permission_id_seq', 2, true);
358SELECT pg_catalog.setval('users_user_id_seq', 1, true);
Note: See TracBrowser for help on using the repository browser.