BIND + MySQL (или Postgres)

27 сентября 2016 г. 15:00


Берем за основу драйверы подключения к БД из этого проекта: http://bind-dlz.sourceforge.net/

Изначально проект делается на MySQL, где используется сразу три таблицы для управления доменами:
_dns_records
_dns_domains
_dns_xfr_records

Однако, в postgresql используется только одна таблица, которая включает всю информацию по хостам. Этот вопрос решается. Об этом ниже.

Допустим, проект изначально строится на основе mysql.

В /etc/bind/named.conf вносим следующий конфиг для подключения к базе

dlz "mysql zone" {
   database "mysql
        {host=127.0.0.1 port=3306 dbname=named user=named pass=named}
        {select id from _dns_domains where zone = '$zone$'}
        {select ttl, type, mx_priority, case when lower(type)='txt' then CONCAT('\"', data, '\"') when lower(type)='soa' then CONCAT_WS(' ', data, resp_person, serial, refresh, retry, expire, minimum) else data end from _dns_domains, _dns_records where id=zone_id and zone = '$zone$' and host = '$record$' and not (type = 'SOA' or type = 'NS')}
        {select ttl, type, mx_priority, case when lower(type)='soa' then CONCAT_WS(' ', data, resp_person, serial, refresh, retry, expire, minimum) else data end from _dns_domains, _dns_records where id=zone_id and zone = '$zone$' and (type = 'SOA' or type='NS')}
        {select ttl, type, host, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') when lower(type)='soa' then CONCAT_WS(' ',data, resp_person,serial,refresh,retry,expire,minimum) else data end from _dns_domains, _dns_records where id=zone_id and zone = '$zone$'}
        {select zone from _dns_xfr_table where zone = '$zone$' and client = '$client$'}";
};

Перезапускаем bind.

Создаем базу данных named:
CREATE DATABASE `named` CHARACTER SET utf8 COLLATE utf8_general_ci;

Создаем три таблицы:
====
CREATE TABLE `_dns_domains` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `ttl` int(9) UNSIGNED NOT NULL DEFAULT '3600',
  `zone` varchar(255) NOT NULL DEFAULT '',
  `resp_person` varchar(255) DEFAULT 'your_name.example.com.',
  `serial` int(10) UNSIGNED NOT NULL DEFAULT '2004000001',
  `refresh` int(9) UNSIGNED NOT NULL DEFAULT '86400',
  `retry` int(9) UNSIGNED NOT NULL DEFAULT '7200',
  `expire` int(9) UNSIGNED NOT NULL DEFAULT '604800',
  `minimum` int(9) UNSIGNED NOT NULL DEFAULT '86400',
  PRIMARY KEY (`id`)
);

CREATE TABLE `_dns_records` (
  `did` int(9) NOT NULL AUTO_INCREMENT,
  `zone_id` int(11) UNSIGNED NOT NULL DEFAULT '0',
  `type` enum('SOA','NS','MX','A','CNAME','TXT','HINFO','PTR','SRV','AAAA') CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL DEFAULT 'SOA',
  `host` varchar(255) DEFAULT NULL,
  `mx_priority` int(3) UNSIGNED DEFAULT NULL,
  `data` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`did`)
);

CREATE TABLE `_dns_xfr_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `zone` varchar(60) DEFAULT NULL,
  `client` varchar(60) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

===

Где _dns_domains используется для хранения основной информации о доменах.
_dns_records используется для хранения информации о хостах
И _dns_xfr_table используется для хранения клиентов, которые могут выкачивать полный трансфер всех хостов по любому домену.

Пример.
В _dns_domains добавим домен для управления:
INSERT INTO `_dns_domains` (`id`, `ttl`, `zone`, `resp_person`, `serial`, `refresh`, `retry`, `expire`, `minimum`) VALUES (1, 3600, 's-telecom.net', 'nikolay.s-telecom.net.', 2016091302, 600, 60, 604800, 600);

Смотрим, с каким id создалась запись в таблице доменов:
SELECT id FROM _dns_domains WHERE zone='s-telecom.net';

В моём случае id равен 1.

Добавим хост в зону s-telecom.net, где zone_id соответствует id зоны в _dns_domains:
INSERT INTO `_dns_records` (`zone_id`, `type`, `host`, `mx_priority`, `data`) VALUES (1, 'A', 'support', NULL, '12.34.56.78');

Разрешим выполнять трансфер зоны для source-адреса:
INSERT INTO _dns_xfr_table (`zone`, `client`) VALUES ('s-telecom.net', '8.8.8.8');

Теперь с адреса 8.8.8.8 можно узнать все хосты по домену s-telecom.net

==================

Допустим, в какой-то момент мы решили мигрировать на postgresql. Для того, чтобы не нарушать структуру таблиц, мы создаем в базе данных view для запроса зон из базы данных, но обо все по порядку.

Для bind вводим следующую секцию в конфиг:
dlz "postgres zone" {
   database "postgres 2
   {host=127.0.0.1 port=5432 dbname=named user=named}
   {select zone from dns_view where zone = '$zone$'}
   {select ttl, type, mx_priority, case when lower(type)='txt' then '\"' || data || '\"' else data end from dns_view where zone = '$zone$' and host = '$record$' and not type = 'SOA'}
   {select ttl, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum from dns_view where zone = '$zone$' and type = 'SOA'}
   {select ttl, type, host, mx_priority, case when lower(type)='txt' then '\"' || data || '\"' when lower(type)='soa' then CONCAT_WS(' ',data, resp_person,serial,refresh,retry,expire,minimum) else data end from dns_view where zone = '$zone$'}
   {select zone from _dns_xfr_table where zone = '$zone$' and client = '$client$'}";
};

Создаем пользователя named в psql и собственно саму базу данных для этого пользователя. Переключаемся на базу и создаем таблицы:

CREATE TABLE _dns_domains (
    id integer DEFAULT nextval('_dns_domains_id_seq'::regclass) NOT NULL,
    ttl integer DEFAULT 3600 NOT NULL,
    zone text DEFAULT ''::character varying NOT NULL,
    resp_person text DEFAULT 'your_name.example.com.'::character varying,
    serial integer DEFAULT 2004000001 NOT NULL,
    refresh integer DEFAULT 86400 NOT NULL,
    retry integer DEFAULT 7200 NOT NULL, na
    expire integer DEFAULT 604800 NOT NULL,
    minimum integer DEFAULT 86400 NOT NULL
);
ALTER TABLE _dns_domains OWNER TO named;

CREATE TABLE _dns_records (
    did integer DEFAULT nextval('_dns_records_did_seq'::regclass) NOT NULL,
    zone_id bigint DEFAULT 0 NOT NULL,
    type text DEFAULT 'SOA'::character varying NOT NULL,
    host text DEFAULT ''::character varying,
    mx_priority integer,
    data text DEFAULT ''::character varying,
    primary_ns character varying(255),
    CONSTRAINT _dns_records_type_check CHECK ((type = ANY (ARRAY[('SOA'::character varying)::text, ('NS'::character varying)::text, ('MX'::character varying)::text, ('A'::character varying)::text, ('CNAME'::character varying)::text, ('TXT
'::character varying)::text, ('HINFO'::character varying)::text, ('PTR'::character varying)::text, ('SRV'::character varying)::text, ('AAAA'::character varying)::text])))
);
ALTER TABLE _dns_records OWNER TO named;

CREATE TABLE _dns_xfr_table (
    id integer DEFAULT nextval('_dns_xfr_table_id_seq'::regclass) NOT NULL,
    zone character varying(60) DEFAULT ''::character varying,
    client character varying(60) DEFAULT ''::character varying
);
ALTER TABLE _dns_xfr_table OWNER TO named;

Методы добавления доменов те же, однако драйвер postgres для bind умеет делать запросы только из одной таблицы.
Решаем этот вопрос добалвением вьюшки для нашего конфига:

CREATE VIEW dns_view AS SELECT d.ttl, d.zone, d.resp_person, d.serial, d.refresh, d.retry, d.expire, d.minimum, dr.type, dr.host, dr.mx_priority, dr.data FROM public._dns_records dr JOIN public._dns_domains d ON dr.zone_id = d.id;

Подключение к базе данных у этого драйвера работает только без пароля, хотя я не уверен. Однако именно с такой настройкой и без пароля всё прекрасно работает.

 

Далее

Named и postgres

17 сентября 2016 г. 18:47


Очень скоро напишу охуенную статью про то, как нормально раскидать днс

Далее

OPDS? Давно пора!

10 сентября 2016 г. 20:14


Когда я перевез в Москву свою семью, мне стало немного не до программирования, но я все же продолжил написание собственной библиотеки.

Итак, прямо сейчас готов OPDS, который работает по basic-авторизации, которую умеют абсолютно все клиенты. Проблемы были у coolreader, fbreader. Теперь этих проблем нет и не будет.

Почему этим нельзя пользоваться прямо сейчас? Чисто технически возможно, но полные шаблоны до конца так и не готовы.

Так выходит, что софт построен и интегрирован сам в себя. Если в SOPDS это было так - чувак сначала написал OPDS, а потом наебенил для него простенький веб-интерфейс, параллельно построив БД, то тут изначально строилась модель на основе MVC.

Я ничего не могу сказать про SOPDS плохого. Слишком много оттуда заимствовано, слишком многое пригодилось и прекрасно себя показало. Но пользователю надо чуть больше, а мне надо прогать больше, так что тут наши интересы сошлись.

В общем скоро логика opds будет списываться с веба и будет не такой большой.

А еще у меня нет картинок и обложек. Но картинки и обложки были внутри файлов. Пока я думаю, что пикчи можно подтягивать из внешних интернетов по ISBN. А если нет ISBN, то не подтягивать.

Далее

lprlb.ru

16 августа 2016 г. 20:26


Вот с таким доменом: lprlb.ru

С ним, то есть. Именно с ним будет работать новая лепробиблиотека.

А теперь по порядку. Что же сделано.

Сделан хуевый, но рабочий поиск. Сделана статистика скачиваний книги. Сделана авторизация и регистрация пользователей.

Каталог по авторам сейчас сканирует абсолютно все символы и с ними работает.

Библиотека переведена на postgres.

Дизайн, разумеется, но это было и так видно.

Конвертация файлов спизжена из SOPDS, но тем не менее она работает.

Осталось доделать избранное и можно пускать первых альфа-тестеров.

Далее

Конвертеры и библиотека

15 августа 2016 г. 9:54


Большая часть сделана и тестируется.

Думаю, что надо сделать еще топ скачиваемых книг. Всё же интересно, что читает лепра :-)

Конвертер работает, но работает выборочно. Так сложилось, что большую часть книг делали далеко не профессионалы. Спасибо им и на том. Но теперь эти книги подкидывают тучу сюрпризов.

Далее

Copyright © Bootstrap, Django и я