WIP. создание реверсных зон по умолчанию для списка префиксов.
This commit is contained in:
90
arpa.sql
Normal file
90
arpa.sql
Normal file
@@ -0,0 +1,90 @@
|
||||
-- This file control sum
|
||||
SET vars.csum TO :'csum';
|
||||
-- This zone copy hostname
|
||||
SET vars.ns TO :'NSERVER';
|
||||
|
||||
DO $$
|
||||
-- Наполнение
|
||||
|
||||
DECLARE
|
||||
v_domain text; -- domain name
|
||||
v_domain_id integer; -- internal domain id
|
||||
v_ns_admin text := 'hostmaster.example.ru'; -- master DNS admin email
|
||||
v_soa text; -- zone SOA
|
||||
v_prefixes cidr[] := ARRAY[
|
||||
'10.0.0.0/8', -- Private-Use Networks
|
||||
'100.64.0.0/10', -- CG-NAT
|
||||
'127.0.0.0/8', -- Loopback
|
||||
'172.16.0.0/12', -- LLA
|
||||
'169.254.0.0/16', -- Private-Use Networks
|
||||
'192.0.0.0/24', -- IETF Protocol Assignments
|
||||
'192.0.2.0/24', -- TEST-NET-1
|
||||
'192.88.99.0/24', -- 6to4 Relay Anycast
|
||||
'192.168.0.0/16', -- Private-Use Networks
|
||||
'198.18.0.0/15', -- Network Interconnect Device Benchmark Testing
|
||||
'198.51.100.0/24', -- TEST-NET-2
|
||||
'203.0.113.0/24' -- TEST-NET-3
|
||||
];
|
||||
v_prefixes24 cidr[];
|
||||
v_prefix cidr;
|
||||
v_arr text[];
|
||||
|
||||
BEGIN
|
||||
-- пересобираем список префиксов по /24
|
||||
-- ToDo: префиксы выходящие за границы /8 =< prefix < /24 пропускать
|
||||
FOREACH v_prefix IN ARRAY v_prefixes LOOP
|
||||
-- получили размерность
|
||||
FOR i IN 0 .. 2^(24 - masklen(v_prefix))-1 LOOP
|
||||
-- добавили каждую /24
|
||||
v_prefixes24 := ARRAY_APPEND(v_prefixes24, set_masklen(v_prefix + 256 * i, 24));
|
||||
-- RAISE NOTICE '% %: %', v_prefix, i, set_masklen(v_prefix + 256 * i, 24);
|
||||
END LOOP;
|
||||
END LOOP;
|
||||
|
||||
FOREACH v_prefix IN ARRAY v_prefixes24 LOOP
|
||||
-- собираем имя зоны
|
||||
v_domain := concat_ws('.', -- собираем полностью итоговый v_domain в формате $oct3.$oct2.$oct1.in-addr.arpa
|
||||
array_to_string( -- результат превращаем в текст
|
||||
array_reverse( -- разворачиваем массив в обратном направлении для in-addr.arpa
|
||||
trim_array( -- отрезаем от массива последний октет с маской, так как для /24 в in-addr.arpa надо 3 октета
|
||||
string_to_array(v_prefix::text, '.'), -- v_prefix переводим в text и разбираем в массив через '.'
|
||||
1
|
||||
)
|
||||
),'.'
|
||||
),
|
||||
'in-addr.arpa'
|
||||
);
|
||||
|
||||
SELECT INTO v_domain_id id FROM domains WHERE name = v_domain;
|
||||
IF NOT FOUND THEN
|
||||
-- зона отсутствует, будем генерить зону по умолчанию
|
||||
RAISE NOTICE 'Stub generator for prefix:% zone:%', v_prefix, v_domain;
|
||||
ELSE
|
||||
-- зона уже создана, пропустить stub-функционал
|
||||
RAISE NOTICE 'zone:% already exists, skip stub generation', v_domain;
|
||||
CONTINUE;
|
||||
END IF;
|
||||
|
||||
/*
|
||||
чексуммы у зоны нет, поэтому достаточно будет первого запуска по
|
||||
файлу со спецификой зоны, чтобы затереть зону-заглушку
|
||||
получаем/создаём домен ID
|
||||
*/
|
||||
v_domain_id := domain_id(v_domain);
|
||||
|
||||
-- собираем SOA
|
||||
v_soa := soa_mk(v_domain_id, v_ns_admin);
|
||||
|
||||
-- в принципе если мы здесь, то предполагается, что зоны такой не существовало
|
||||
-- и записей, соответственно, нет. но тем не менее
|
||||
DELETE FROM records WHERE domain_id = v_domain_id;
|
||||
|
||||
-- генерим зону по умолчанию
|
||||
INSERT INTO records (domain_id, name, ttl, type, prio, content) VALUES
|
||||
(v_domain_id, v_domain, 10800, 'SOA', 0, v_soa)
|
||||
, (v_domain_id, v_domain, 10800, 'NS', 0, 'ns1.example.ru')
|
||||
, (v_domain_id, v_domain, 10800, 'NS', 0, 'ns2.example.ru')
|
||||
;
|
||||
END LOOP;
|
||||
END;
|
||||
$$;
|
||||
Reference in New Issue
Block a user