Browse Source

The database schema has been updated to the latest version
the indexes of the log tables have been redesigned, which significantly accelerated their operation
Log tables with text fields have been compressed
the processing of dhcp events received via the api has been moved through separate tables. there is no need to call the command via sudo anymore

root 11 months ago
parent
commit
316e21ef4b

+ 1688 - 0
docs/mysql/2-8-0/mysql.sql

@@ -0,0 +1,1688 @@
+-- phpMyAdmin SQL Dump
+-- version 5.2.1
+-- https://www.phpmyadmin.net/
+--
+-- Хост: localhost
+-- Время создания: Дек 03 2024 г., 14:57
+-- Версия сервера: 10.11.6-MariaDB-0+deb12u1-log
+-- Версия PHP: 8.2.26
+
+SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
+START TRANSACTION;
+SET time_zone = "+00:00";
+
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+
+--
+-- База данных: `stat`
+--
+
+CREATE TABLE `device_filter_instances` (
+   `id` INT NOT NULL AUTO_INCREMENT ,
+   `instance_id` INT NULL DEFAULT NULL ,
+   `device_id` INT NULL DEFAULT NULL , PRIMARY KEY (`id`)
+) ENGINE = InnoDB;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `acl`
+--
+
+CREATE TABLE `acl` (
+  `id` int(11) NOT NULL,
+  `name` varchar(30) NOT NULL,
+  `description.english` varchar(250) NOT NULL,
+  `description.russian` varchar(250) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `ad_comp_cache`
+--
+
+CREATE TABLE `ad_comp_cache` (
+  `id` int(11) NOT NULL,
+  `name` varchar(63) NOT NULL,
+  `last_found` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `auth_rules`
+--
+
+CREATE TABLE `auth_rules` (
+  `id` int(11) NOT NULL,
+  `user_id` int(11) DEFAULT NULL,
+  `ou_id` int(11) DEFAULT NULL,
+  `type` int(11) NOT NULL,
+  `rule` varchar(40) DEFAULT NULL,
+  `comment` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `building`
+--
+
+CREATE TABLE `building` (
+  `id` int(11) NOT NULL,
+  `name` varchar(50) NOT NULL,
+  `comment` varchar(250) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `building`
+--
+
+INSERT INTO `building` (`id`, `name`, `comment`) VALUES(1, 'Earth', 'Somewhere');
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `config`
+--
+
+CREATE TABLE `config` (
+  `id` int(11) NOT NULL,
+  `option_id` int(11) DEFAULT NULL,
+  `value` varchar(250) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `config`
+--
+
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(1, 1, '0');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(2, 11, 'public');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(3, 32, 'ORG');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(123, 19, '1');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(124, 35, '120');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(125, 9, '2');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(126, 41, '/opt/Eye/scripts/fetch_new_arp.pl');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(127, 26, '3');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(128, 27, '10');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(129, 48, '90');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(130, 49, '365');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(131, 47, '90');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(132, 53, '1');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(133, 55, '1');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(134, 56, '30');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(135, 34, '0');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(137, 65, '0');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(142, 54, '');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(143, 17, '1');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(144, 37, '/opt/Eye/scripts/sync_mikrotik.pl');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(145, 23, '1');
+INSERT INTO `config` (`id`, `option_id`, `value`) VALUES(148, 22, '1');
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `config_options`
+--
+
+CREATE TABLE `config_options` (
+  `id` int(11) NOT NULL,
+  `option_name` varchar(50) NOT NULL,
+  `description.russian` text DEFAULT NULL,
+  `description.english` text DEFAULT NULL,
+  `draft` tinyint(1) NOT NULL DEFAULT 0,
+  `uniq` tinyint(1) NOT NULL DEFAULT 1,
+  `type` varchar(100) NOT NULL,
+  `default_value` varchar(250) DEFAULT NULL,
+  `min_value` int(11) NOT NULL DEFAULT 0,
+  `max_value` int(11) NOT NULL DEFAULT 0
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `config_options`
+--
+
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(1, 'KB', 'Еденица измерения трафика - Килобайт (0) или кибибайт (1,default)', 'Traffic measurement unit - Kilobyte (1000b) or kibibyte (1024b,default)', 0, 1, 'bool', '1024', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(3, 'dns server', 'ip-адрес DNS-сервера', 'DNS server ip address', 0, 1, 'text', '127.0.0.1', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(5, 'dhcp server', 'ip-адрес DHCP-сервера', 'ip address of the DHCP server', 0, 1, 'text', '127.0.0.1', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(9, 'default snmp version', 'Версия snmp по умолчанию. В настоящий момент поддерживаются 1 и 2. Поддержка версии 3 в разработке.', 'The default version of snmp. Currently, 1 and 2 are supported. Support for version 3 is in development.', 0, 1, 'int', '2', 1, 3);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(11, 'default snmp community', 'Read snmp community по умолчанию', 'Read snmp community by default', 0, 1, 'text', 'public', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(21, 'admin email', 'E-mail администратора', 'Administrator e-mail', 0, 1, 'text', 'root', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(22, 'add user from netflow', 'Создавать ли новые записи для неизвестных адресов из анализа трафика netflow. Не включать, если netflow снимает данные с маршрутизатора локальной сети', 'Whether to create new records for unknown addresses from netflow traffic analysis. Do not enable if netflow get data from the local network router', 0, 1, 'bool', '0', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(23, 'save traffic detail', 'Сохранять ли детализацию трафика из netflow по ip-адресам пользователей', 'Whether to keep the details of traffic from netflow by ip addresses of users', 0, 1, 'bool', '1', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(26, 'history detail traffic', 'Глубина хранения детализации в сутках. Установка значения больше 3-7 дней приведёт к разрастанию базы данных и увеличит время отображения детализации в интерфейсе администратора', 'Depth of detail storage in days. Setting a value greater than 3-7 days will cause the database to grow and increase the time about to display details in the admin interface', 0, 1, 'int', '3', 1, 7);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(27, 'history dhcp lease', 'Глубина хранения аренды dhcp-сервера', 'Storage depth of the dhcp server lease', 0, 1, 'int', '1', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(28, 'router_login', 'Логин для входа на сетевые устройства по умолчанию', 'Default login for network devices', 0, 1, 'text', 'admin', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(29, 'router_password', 'Пароль по умолчанию на сетевые устройства', 'Default password for network devices', 0, 1, 'text', 'admin', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(30, 'router_ssh_port', 'Порт ssh по умолчанию', 'SSH default port', 0, 1, 'int', '22', 22, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(32, 'org name', 'Название организации', 'Organization name', 0, 1, 'text', 'ORG', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(33, 'office domain', 'Домен организации', 'Organization domain', 0, 1, 'text', 'local', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(34, 'debug', 'Включить отладку', 'Enable debugging', 0, 1, 'bool', '0', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(35, 'connections history, days', 'Время хранения истории мест подключения ip-адресов', 'Storage time of the history of connection locations of ip addresses', 0, 1, 'int', '90', 1, 365);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(37, 'refresh access lists', 'Расположение скрипта управления контролем доступа для роутеров Mikrotik', 'Location of the access control script for Mikrotik routers', 0, 1, 'text', '/opt/Eye/scripts/sync_mikrotik.pl', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(38, 'regenerate dhcp cconfig', 'Расположение скрипта управления конфигурацией dhcp-серверами', 'Location of the dhcp server configuration management script', 0, 1, 'text', '/opt/Eye/scripts/update-dnsmasq', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(39, 'regenerate dns cconfig', 'Расположение скрипта управления dns-сервером', 'Location of the dns server management script', 0, 1, 'text', '/opt/Eye/scripts/update-dns', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(40, 'regenerate nagios cconfig', 'Расположение скрипта конфигурирования Nagios', 'Location of the Nagios configuration script', 0, 1, 'text', '/etc/nagios/restart_nagios', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(41, 'discovery network', 'Расположение скрипта сканирования сети', 'Location of the network scan script', 0, 1, 'text', '/opt/Eye/scripts/fetch_new_arp.pl', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(44, 'Ignore hotspot dhcp log', 'Не писать лог событий dhcp-сервера хотспота. Имеет смысл вклчючать, поскольку время аренды в хот-споте как правило маленькое и в записях хот-спота становятся незаметны логи обычных пользователей', 'Do not write the event log of the hotspot dhcp server. It makes sense to include it, since the rental time in the hotspot is usually small and the logs of ordinary users become invisible in the hotspot records', 0, 1, 'bool', '1', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(45, 'ignore update dhcp event', 'Не писать события обновления ip-адреса dhcp-сервера. ', 'Do not write events for updating the IP address of the dhcp server. ', 0, 1, 'bool', '0', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(46, 'update hostname from dhcp', 'Обновлять имя хоста в DNS при получении адреса по DHCP', 'Update the hostname in DNS when receiving the address via DHCP', 0, 1, 'bool', '0', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(47, 'history worklog', 'Глубина хранения VERBOSE логов работы в интерфейсе администратора', 'Depth of VERBOSE work logs storage in the admin interface', 0, 1, 'int', '90', 0, 1095);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(48, 'history syslog', 'Глубина хранения логов работы syslog-сервера', 'Syslog server logs storage depth', 0, 1, 'int', '90', 0, 1095);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(49, 'history traffic stats', 'Глубина хранения статистики трафика юзеров', 'User traffic statistics storage depth', 0, 1, 'int', '365', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(50, 'urgent sync access', 'Немедленное изменение списков доступа на роутере после правки записи пользователя', 'Immediate change of access lists on the router after editing the user record ', 0, 1, 'bool', '0', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(51, 'Email_alert', 'Отправлять e-mail сообщения для уровней сообщений WARNING & ERROR', 'Send e-mail messages for message levels WARNING & ERROR', 0, 1, 'bool', '1', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(52, 'Sender email', 'E-mail адрес, с которого рассылается почта', 'E-mail address from which mail is sent', 0, 1, 'text', 'root', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(53, 'log level', 'Каждый уровень включает в себя предыдущий:\r\n0 - ERROR - писать только ошибки\r\n1 - WARNING - писать предупреждения\r\n2 - INFO - писать информационные сообщения\r\n3 - VERBOSE - писать подробную информацию о выполняемых операциях', 'Each level includes the previous one:\r\n0 - ERROR - write only errors\r\n1 - WARNING - write warnings\r\n2 - INFO - write informational\r\n3 - VERBOSE - write detailed information about the operations performed ', 0, 1, 'int', '2', 0, 3);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(54, 'enable_quotes', 'Включить обработку квот по трафику', 'Enable traffic quota processing', 0, 1, 'bool', '0', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(55, 'netflow_step', 'Интервал сброса данных из коллектора netflow, минуты', 'Data reset interval from netflow collector, minutes', 0, 1, 'int', '1', 1, 10);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(56, 'traffic_ipstat_history', 'Время хранения полной статистики по трафику для каждого ip-адреса в сутках. Таблица в 6 раз больше обычной часовой статистики. Врядли кому-то потребуется глубина хранения более месяца.', 'The storage time of complete traffic statistics for each ip address in days. The table is 6 times larger than the usual hourly statistic Hardly anyone will need a storage depth of more than a month.', 0, 1, 'int', '30', 0, 365);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(57, 'nagios_url', 'Адрес сайта nagios', 'nagios site address', 0, 1, 'text', 'http://127.0.0.1/nagios', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(58, 'cacti_url', 'Адрес сайта cacti', 'cacti site address', 0, 1, 'text', 'http://127.0.0.1/cacti', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(59, 'torrus_url', 'Адрес сайта Torrus', 'Torrus website address', 0, 1, 'text', 'http://127.0.0.1/torrus/CollectorName/', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(60, 'wiki_url', 'Адрес wiki', 'Wiki website address', 0, 1, 'text', 'http://127.0.0.1/wiki', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(61, 'wiki_path', 'Путь к каталогу данных вики', 'Path to wiki data directory', 0, 1, 'text', '/var/www/foswiki/data/', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(62, 'stat_url', 'Адрес этого сайта', 'Address of this site', 0, 1, 'text', 'http://127.0.0.1/stat', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(63, 'wiki_web', 'Web for Wiki. Default - Main. http://example.local/Main/WebHome', 'Web for Wiki. Default - Main. http://example.local/Main/WebHome', 0, 1, 'text', 'Main', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(64, 'auto_mac_rule', 'Создавать автоматическую привязку мак-адреса к юзеру. Т.е. все ip-адреса для найденного мака будут привязываться к одном и тому же юзеру.', 'Create an automatic binding of the mac address to the user. I.e. all ip addresses for the found mac will be bound to the same user.', 0, 1, 'bool', '0', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(65, 'mikrotik_command_interface', 'Используемый способ конфигурирования (0 - cli для ROS 6, 1 - rest api для ROS 7)', 'Configuration method used (0 - cli for ROS 6, 1 - rest api for ROS 7)', 1, 1, 'int', '0', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(66, 'mikrotik_rest_api_ssl', 'Использовать https для rest api', 'Use HTTPS for rest api', 1, 1, 'bool', '1', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(67, 'mikrotik_rest_api_port', 'Порт вэб-интерфейса для rest api', 'Web interface port for rest API', 1, 1, 'int', '443', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(68, 'config_mode', 'Режим конфигурирования. Скрипт опроса устройств не выполняется.', 'Configuration mode. The device polling script is not running.', 0, 1, 'bool', '0', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(69, 'clean_empty_user', 'Автоматически удалять записи пользователей, не содержащие ip-адресов или автоматических привязок', 'Automatically delete user records that do not contain IP addresses or automatic bindings', 0, 1, 'bool', '0', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(70, 'dns_server_type', 'Тип используемого dns-сервера: Windows, Bind. Если используется локальный dnsmasq - параметры dns-сервера указывать не надо.', 'The type of dns server used: Windows, Bind. If you are using a local dnsmasq, you do not need to specify the dns server parameters.', 0, 1, 'list;windows;bind', 'bind', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(71, 'enable_dns_updates', 'Включить обновления DNS имен при изменении dns-имени в ip-записи', 'Enable DNS name updates when dns name changes in an ip record', 0, 1, 'bool', '0', 0, 1);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(72, 'netflow_path', 'Каталог для хранения данных, полученных по netflow от маршрутизаторов', 'The directory for storing data received via netflow from routers', 0, 1, 'text', '/opt/Eye/netflow', 0, 0);
+INSERT INTO `config_options` (`id`, `option_name`, `description.russian`, `description.english`, `draft`, `uniq`, `type`, `default_value`, `min_value`, `max_value`) VALUES(73, 'check_computer_exists', 'Проверять существование компьютера в домене перед обновлением DNS по DHCP запросу', 'Verify the existence of a computer in the domain before updating DNS by DHCP request', 0, 1, 'bool', '1', 0, 0);
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `connections`
+--
+
+CREATE TABLE `connections` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `device_id` bigint(20) UNSIGNED NOT NULL,
+  `port_id` bigint(20) UNSIGNED NOT NULL,
+  `auth_id` bigint(20) UNSIGNED NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `Customers`
+--
+
+CREATE TABLE `Customers` (
+  `id` int(11) NOT NULL,
+  `Login` varchar(20) DEFAULT 'NULL',
+  `comment` varchar(100) DEFAULT 'NULL',
+  `password` varchar(255) DEFAULT 'NULL',
+  `api_key` varchar(255) DEFAULT NULL,
+  `rights` tinyint(1) NOT NULL DEFAULT 3
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `Customers`
+--
+
+INSERT INTO `Customers` (`id`, `Login`, `comment`, `password`, `api_key`, `rights`) VALUES(1, 'admin', '', '$2y$11$wohV8Tuqu0Yai9Shacei5OKfMxG5bnLxB5ACcZcJJ3pYEbIH0qLGG', 'Kot5miegiequaeseim3veequeiW2Iv3L', 1);
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `devices`
+--
+
+CREATE TABLE `devices` (
+  `id` int(11) NOT NULL,
+  `device_type` int(11) NOT NULL DEFAULT 1,
+  `device_model_id` int(11) DEFAULT 89,
+  `firmware` varchar(100) DEFAULT NULL,
+  `vendor_id` int(11) NOT NULL DEFAULT 1,
+  `device_name` varchar(50) DEFAULT NULL,
+  `building_id` int(11) NOT NULL DEFAULT 1,
+  `ip` varchar(15) DEFAULT NULL,
+  `ip_int` BIGINT(10) UNSIGNED DEFAULT NULL,
+  `login` varchar(50) DEFAULT NULL,
+  `password` varchar(255) DEFAULT NULL,
+  `protocol` int(11) NOT NULL DEFAULT 0,
+  `control_port` int(11) NOT NULL DEFAULT 23,
+  `port_count` int(11) NOT NULL DEFAULT 0,
+  `SN` varchar(80) DEFAULT NULL,
+  `comment` varchar(255) DEFAULT NULL,
+  `snmp_version` tinyint(4) NOT NULL DEFAULT 0,
+  `snmp3_auth_proto` varchar(10) NOT NULL DEFAULT 'sha512',
+  `snmp3_priv_proto` varchar(10) NOT NULL DEFAULT 'aes128',
+  `snmp3_user_rw` varchar(20) DEFAULT NULL,
+  `snmp3_user_rw_password` varchar(20) DEFAULT NULL,
+  `snmp3_user_ro` varchar(20) DEFAULT NULL,
+  `snmp3_user_ro_password` varchar(20) DEFAULT NULL,
+  `community` varchar(50) NOT NULL DEFAULT 'public',
+  `rw_community` varchar(50) NOT NULL DEFAULT 'private',
+  `fdb_snmp_index` tinyint(1) NOT NULL DEFAULT 0,
+  `discovery` tinyint(1) NOT NULL DEFAULT 1,
+  `netflow_save` tinyint(1) NOT NULL DEFAULT 0,
+  `user_acl` tinyint(1) NOT NULL DEFAULT 0,
+  `dhcp` tinyint(1) NOT NULL DEFAULT 0,
+  `nagios` tinyint(1) NOT NULL DEFAULT 0,
+  `active` tinyint(1) NOT NULL DEFAULT 1,
+  `nagios_status` varchar(10) NOT NULL DEFAULT 'UP',
+  `queue_enabled` tinyint(1) NOT NULL DEFAULT 0,
+  `connected_user_only` tinyint(1) NOT NULL DEFAULT 1,
+  `user_id` int(11) DEFAULT NULL,
+  `deleted` tinyint(1) NOT NULL DEFAULT 0,
+  `discovery_locked` tinyint(1) NOT NULL DEFAULT 0,
+  `locked_timestamp` timestamp NULL DEFAULT current_timestamp()
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `device_l3_interfaces`
+--
+
+CREATE TABLE `device_l3_interfaces` (
+  `id` int(11) NOT NULL,
+  `device_id` int(11) DEFAULT NULL,
+  `snmpin` int(11) DEFAULT NULL,
+  `interface_type` int(11) NOT NULL DEFAULT 0,
+  `name` varchar(100) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `device_models`
+--
+
+CREATE TABLE `device_models` (
+  `id` int(11) NOT NULL,
+  `model_name` varchar(200) DEFAULT NULL,
+  `vendor_id` int(11) DEFAULT 1,
+  `poe_in` tinyint(1) NOT NULL DEFAULT 0,
+  `poe_out` tinyint(1) NOT NULL DEFAULT 0,
+  `nagios_template` varchar(200) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `device_models`
+--
+
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(1, '2011LS', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(2, '2011UAS-2HnD', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(3, 'AT-8000S', 8, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(4, 'AT-8100S/48POE', 8, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(5, 'AT-9000/28', 8, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(6, 'AT-GS950/24', 8, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(7, 'CCR1009-7G-1C-1S+', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(8, 'CCR1036-8G-2S+', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(10, 'CRS317-1G-16S+', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(11, 'CRS326-24S+2Q+', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(12, 'CRS328-24P-4S+', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(14, 'CRS328-4C-20S-4S+', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(15, 'DGS-3120-48TC', 7, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(16, 'ES-2024', 4, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(17, 'ES-2024A', 4, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(18, 'ES-2108', 4, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(19, 'ES-2108-G', 4, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(20, 'ES-3124-4F', 4, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(21, 'GS110TP', 10, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(22, 'GS-4024', 4, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(23, 'HP 1910', 15, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(24, 'ISCOM2110A-MA', 5, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(25, 'ISCOM2110EA-MA', 5, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(26, 'ISCOM2126EA-MA', 5, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(27, 'ISCOM2128EA-MA', 5, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(28, 'Linux server', 1, 0, 0, '');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(29, 'MES2124F', 2, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(30, 'MES2124MB', 2, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(31, 'MES5248', 2, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(32, 'RB2011UAS', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(33, 'RB3011UiAS', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(34, 'RB960PGS', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(35, 'RBD52G-5HacD2HnD', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(36, 'S2940-8G-v2', 6, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(37, 'S2980G-24T', 6, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(38, 'S3750G-24S-E', 6, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(39, 'S5300-52P-LI-AC', 3, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(40, 'S5320-52X-PWR-SI-AC', 3, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(41, 'S5321-28X-SI-AC', 3, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(42, 'S5321-52X-SI-AC', 3, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(43, 'S6320-54C-EI-48S-AC', 3, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(44, 'SNR-S2980G-24T', 6, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(45, 'V1910-16G', 15, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(46, 'V1910-24G-PoE', 15, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(47, 'Windows server', 1, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(48, 'WS-C2960G-24TC-L', 16, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(49, 'WS-C3560G-24TS-S', 16, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(50, 'x210-16GT', 8, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(51, 'x210-24GT', 8, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(52, 'x610-24Ts/X', 8, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(53, 'x610-48Ts', 8, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(54, 'XGS-4728', 4, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(55, 'ZyWall 310', 4, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(56, 'APC Smart-UPS_3000', 20, 0, 0, 'ups.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(57, 'APC Smart-UPS_5000', 20, 0, 0, 'ups.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(58, 'Schneider Smart-UPS_3000', 21, 0, 0, 'ups.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(59, 'SMG-1016M', 2, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(60, 'EATON 9PX 1500i RT 2U', 64, 0, 0, 'ups.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(61, 'EATON 9PX3000i_RT_2U', 64, 0, 0, 'ups.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(62, 'EATON 9PX_6000i', 64, 0, 0, 'ups.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(63, 'EATON PW9130_3000', 64, 0, 0, 'ups.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(64, 'EATON PW9130_3000VA-R', 64, 0, 0, 'ups.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(65, 'Epson WF-5620 Series', 59, 0, 0, 'epson.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(66, 'Epson WF-8590 Series', 59, 0, 0, 'epson.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(67, 'HP Officejet-7000', 15, 0, 0, 'hp.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(68, 'OKI C610', 62, 0, 0, 'oki.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(69, 'OKI MB472', 62, 0, 0, 'oki.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(70, 'OKI MB491', 62, 0, 0, 'oki.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(71, 'OKI MC562', 62, 0, 0, 'oki.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(72, 'OKI MC573', 62, 0, 0, 'oki.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(73, 'OKI MC861', 62, 0, 0, 'oki.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(74, 'Panasonic KX-MB2000RU', 61, 0, 0, 'panasonic.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(75, 'PT-MZ10KE', 61, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(76, 'PT-VX41', 61, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(77, 'Rave 522AA', 33, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(78, 'DZ570E', 61, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(79, 'DZ6700', 61, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(80, 'Rcq80', 61, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(81, 'RZ12K', 61, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(82, 'RZ660', 61, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(83, 'RZ770', 61, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(84, 'RZ970', 61, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(85, 'XVR-5216', 66, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(86, 'HWg-STE', 68, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(87, 'Computer', 1, 0, 0, '');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(88, 'Mobile Phone', 1, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(89, 'Switch', 1, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(90, 'Projectiondesign F22', 34, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(91, 'DS-I252', 36, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(92, 'LTV-CNE-720-48', 37, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(93, 'U-100', 38, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(94, 'TAU-8', 2, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(95, 'SIP-T21P E2', 39, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(96, 'A510 IP', 40, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(97, 'W60B', 39, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(98, 'TAU-2M', 2, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(99, 'PAP2T', 41, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(100, 'VP-12', 2, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(101, 'SIP-T23P', 39, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(102, 'SPA-2102', 16, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(103, 'RB760iGS', 9, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(104, 'MES2324B', 2, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(105, 'MES2324FB', 2, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(106, 'MES2124P', 2, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(107, 'MES2428P', 2, 0, 0, NULL);
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(108, 'Symmetra LX 16000', 20, 0, 0, 'symmetra.cfg');
+INSERT INTO `device_models` (`id`, `model_name`, `vendor_id`, `poe_in`, `poe_out`, `nagios_template`) VALUES(109, 'SNR-UPS-ONT20', 6, 0, 0, 'ups.cfg');
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `device_ports`
+--
+
+CREATE TABLE `device_ports` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `device_id` int(11) DEFAULT NULL,
+  `snmp_index` int(11) DEFAULT NULL,
+  `port` int(11) DEFAULT NULL,
+  `ifName` varchar(40) DEFAULT NULL,
+  `port_name` varchar(40) DEFAULT NULL,
+  `comment` varchar(50) DEFAULT NULL,
+  `target_port_id` int(11) NOT NULL DEFAULT 0,
+  `auth_id` bigint(20) UNSIGNED DEFAULT NULL,
+  `last_mac_count` int(11) DEFAULT 0,
+  `uplink` tinyint(1) NOT NULL DEFAULT 0,
+  `nagios` tinyint(1) NOT NULL DEFAULT 0,
+  `skip` tinyint(1) NOT NULL DEFAULT 0,
+  `vlan` int(11) NOT NULL DEFAULT 1,
+  `tagged_vlan` varchar(250) DEFAULT NULL,
+  `untagged_vlan` varchar(250) DEFAULT NULL,
+  `forbidden_vlan` varchar(250) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `device_types`
+--
+
+CREATE TABLE `device_types` (
+  `id` int(11) NOT NULL,
+  `name.russian` varchar(50) DEFAULT NULL,
+  `name.english` varchar(50) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `device_types`
+--
+
+INSERT INTO `device_types` (`id`, `name.russian`, `name.english`) VALUES(0, 'Роутер', 'Router');
+INSERT INTO `device_types` (`id`, `name.russian`, `name.english`) VALUES(1, 'Свич', 'Switch');
+INSERT INTO `device_types` (`id`, `name.russian`, `name.english`) VALUES(2, 'Шлюз', 'Gateway');
+INSERT INTO `device_types` (`id`, `name.russian`, `name.english`) VALUES(3, 'Сервер', 'Server');
+INSERT INTO `device_types` (`id`, `name.russian`, `name.english`) VALUES(4, 'Точка доступа', 'Access Point');
+INSERT INTO `device_types` (`id`, `name.russian`, `name.english`) VALUES(5, 'Сетевое устройство', 'Network device');
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `dhcp_log`
+--
+
+CREATE TABLE `dhcp_log` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `mac` varchar(17) NOT NULL,
+  `ip_int` bigint(20) UNSIGNED NOT NULL,
+  `ip` varchar(15) NOT NULL,
+  `action` varchar(10) NOT NULL,
+  `timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
+  `auth_id` bigint(20) UNSIGNED NOT NULL,
+  `dhcp_hostname` varchar(250) DEFAULT NULL,
+  `circuit-id` varchar(255) DEFAULT NULL,
+  `remote-id` varchar(255) DEFAULT NULL,
+  `client-id` varchar(250) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci KEY_BLOCK_SIZE=8 ROW_FORMAT=COMPRESSED;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `dhcp_queue`
+--
+
+CREATE TABLE `dhcp_queue` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `mac` varchar(17) NOT NULL,
+  `ip` varchar(15) NOT NULL,
+  `action` varchar(10) NOT NULL,
+  `timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
+  `dhcp_hostname` varchar(250) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci KEY_BLOCK_SIZE=8 ROW_FORMAT=COMPRESSED;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `dns_cache`
+--
+
+CREATE TABLE `dns_cache` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `dns` varchar(250) DEFAULT NULL,
+  `ip` bigint(20) UNSIGNED DEFAULT NULL,
+  `timestamp` timestamp NOT NULL DEFAULT current_timestamp()
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `dns_queue`
+--
+
+CREATE TABLE `dns_queue` (
+  `id` int(11) NOT NULL,
+  `auth_id` int(11) DEFAULT NULL,
+  `name_type` varchar(10) NOT NULL DEFAULT 'A',
+  `name` varchar(200) DEFAULT NULL,
+  `type` varchar(10) NOT NULL DEFAULT 'add',
+  `value` varchar(100) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `Filter_list`
+--
+
+CREATE TABLE `Filter_list` (
+  `id` int(11) NOT NULL,
+  `name` varchar(50) DEFAULT NULL,
+  `comment` varchar(250) DEFAULT NULL,
+  `proto` varchar(10) DEFAULT NULL,
+  `dst` varchar(253) DEFAULT NULL,
+  `dstport` varchar(20) DEFAULT NULL,
+  `srcport` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+  `type` int(10) UNSIGNED NOT NULL DEFAULT 0
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `Filter_list`
+--
+
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(1, 'pop3', NULL, 'tcp', '0/0', '110', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(3, 'http', NULL, 'tcp', '0/0', '80', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(4, 'https', NULL, 'tcp', '0/0', '443', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(5, 'icq', NULL, 'tcp', '0/0', '5190', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(6, 'jabber', NULL, 'tcp', '0/0', '5222', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(9, 'allow_all', 'любой трафик', 'all', '0/0', '0', '0', 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(10, 'icmp', NULL, 'icmp', '0/0', '0', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(11, 'ftp', NULL, 'tcp', '0/0', '20-21', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(15, 'telnet', NULL, 'tcp', '0/0', '23', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(16, 'ssh', NULL, 'tcp', '0/0', '22', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(28, 'smtp', NULL, 'tcp', '0/0', '25', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(32, 'rdp', NULL, 'tcp', '0/0', '3389', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(40, 'ntp', NULL, 'udp', '0/0', '123', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(44, 'vnc', NULL, 'tcp', '0/0', '5800-5900', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(55, 'unprivileged tcp', NULL, 'tcp', '0/0', '1024-65500', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(76, 'ipsec', NULL, 'udp', '0/0', '500', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(77, 'isakmp', NULL, 'udp', '0/0', '4500', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(79, 'pop3s', NULL, 'tcp', '0/0', '995', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(80, 'smtps', NULL, 'tcp', '0/0', '465,587', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(81, 'imap', NULL, 'tcp', '0/0', '143', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(82, 'imaps', NULL, 'tcp', '0/0', '993', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(83, 'unprivileged udp', NULL, 'udp', '0/0', '1024-65000', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(84, 'pptp', NULL, 'tcp', '0/0', '1723', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(85, 'openvpn-udp', NULL, 'udp', '0/0', '1194', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(90, 'dns_udp', NULL, 'udp', '0/0', '53', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(91, 'dns_tcp', NULL, 'tcp', '0/0', '53', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(94, 'squid', NULL, 'tcp', '0/0', '3128', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(101, 'snmp', NULL, 'udp', '0/0', '161', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(105, 'http_udp', NULL, 'udp', '0/0', '80', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(106, 'https_udp', NULL, 'udp', '0/0', '443', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(107, 'l2tp-ipsec', NULL, 'udp', '0/0', '1701,4500,500', NULL, 0);
+INSERT INTO `Filter_list` (`id`, `name`, `comment`, `proto`, `dst`, `dstport`, `srcport`, `type`) VALUES(108, 'gre', NULL, 'gre', '0/0', NULL, NULL, 0);
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `gateway_subnets`
+--
+
+CREATE TABLE `gateway_subnets` (
+  `id` int(11) NOT NULL,
+  `device_id` int(11) DEFAULT NULL,
+  `subnet_id` int(11) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `Group_filters`
+--
+
+CREATE TABLE `Group_filters` (
+  `id` int(11) NOT NULL,
+  `group_id` int(11) NOT NULL DEFAULT 0,
+  `filter_id` int(11) NOT NULL DEFAULT 0,
+  `order` int(11) NOT NULL DEFAULT 0,
+  `action` tinyint(1) NOT NULL DEFAULT 0
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `Group_filters`
+--
+
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(1, 2, 90, 1, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(2, 2, 91, 2, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(3, 2, 11, 3, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(5, 2, 3, 4, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(6, 2, 105, 5, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(7, 2, 4, 6, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(8, 2, 106, 7, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(9, 2, 10, 8, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(10, 2, 81, 9, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(11, 2, 82, 10, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(15, 2, 40, 11, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(16, 2, 1, 12, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(17, 2, 79, 13, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(18, 2, 80, 14, 1);
+INSERT INTO `Group_filters` (`id`, `group_id`, `filter_id`, `order`, `action`) VALUES(19, 1, 9, 1, 1);
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `filter_instances`
+--
+
+CREATE TABLE `filter_instances` (
+  `id` int(11) NOT NULL,
+  `name` varchar(50) DEFAULT NULL,
+  `comment` varchar(200) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `filter_instances`
+--
+
+INSERT INTO `filter_instances` VALUES(1, 'default', NULL);
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `Group_list`
+--
+
+CREATE TABLE `Group_list` (
+  `id` int(11) NOT NULL,
+  `instance_id` int(11) NOT NULL DEFAULT 1,
+  `group_name` varchar(50) DEFAULT NULL,
+  `comment` varchar(250) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `Group_list`
+--
+
+INSERT INTO `Group_list` VALUES(0, 1, 'default', NULL);
+INSERT INTO `Group_list` VALUES(1, 1, 'Allow all', 'Разрешено всё');
+INSERT INTO `Group_list` VALUES(2, 1, 'Users', 'Для пользователей');
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `mac_history`
+--
+
+CREATE TABLE `mac_history` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `mac` varchar(12) DEFAULT NULL,
+  `timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
+  `device_id` bigint(20) UNSIGNED DEFAULT NULL,
+  `port_id` bigint(20) UNSIGNED DEFAULT NULL,
+  `ip` varchar(16) NOT NULL DEFAULT '',
+  `auth_id` bigint(20) UNSIGNED DEFAULT NULL,
+  `dhcp_hostname` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `mac_vendors`
+--
+
+CREATE TABLE `mac_vendors` (
+  `id` int(11) NOT NULL,
+  `oui` varchar(20) DEFAULT NULL,
+  `companyName` varchar(255) DEFAULT NULL,
+  `companyAddress` varchar(255) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `OU`
+--
+
+CREATE TABLE `OU` (
+  `id` int(11) NOT NULL,
+  `ou_name` varchar(40) DEFAULT NULL,
+  `comment` varchar(250) DEFAULT NULL,
+  `default_users` tinyint(1) NOT NULL DEFAULT 0,
+  `default_hotspot` tinyint(1) NOT NULL DEFAULT 0,
+  `nagios_dir` varchar(255) DEFAULT NULL,
+  `nagios_host_use` varchar(50) DEFAULT NULL,
+  `nagios_ping` tinyint(1) NOT NULL DEFAULT 1,
+  `nagios_default_service` varchar(100) DEFAULT NULL,
+  `enabled` int(11) NOT NULL DEFAULT 0,
+  `filter_group_id` int(11) NOT NULL DEFAULT 0,
+  `queue_id` int(11) NOT NULL DEFAULT 0,
+  `dynamic` tinyint(1) NOT NULL DEFAULT 0,
+  `life_duration` int(11) NOT NULL DEFAULT 24
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `OU`
+--
+
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(0, '!Всё', NULL, 0, 0, '/etc/nagios/any', 'generic-host', 1, NULL, 0, 0, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(1, 'Сервера', NULL, 0, 0, NULL, NULL, 1, NULL, 1, 1, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(2, 'Администраторы', NULL, 0, 0, NULL, NULL, 1, NULL, 0, 0, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(3, 'Пользователи', NULL, 0, 0, NULL, NULL, 1, NULL, 1, 1, 4);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(4, 'VOIP', NULL, 0, 0, 'voip', 'voip', 1, NULL, 1, 4, 5);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(5, 'IPCAM', NULL, 0, 0, 'videocam', 'ip-cam', 1, NULL, 0, 0, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(6, 'Принтеры', NULL, 0, 0, 'printers', 'printers', 1, 'printer-service', 0, 0, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(7, 'Свичи', NULL, 0, 0, 'switches', 'switches', 1, NULL, 0, 0, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(8, 'UPS', NULL, 0, 0, 'ups', 'ups', 1, NULL, 0, 0, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(9, 'Охрана', NULL, 0, 0, 'security', 'security', 1, NULL, 0, 0, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(10, 'Роутеры', NULL, 0, 0, 'routers', 'routers', 1, NULL, 0, 0, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(11, 'WiFi AP', NULL, 0, 0, 'ap', 'ap', 1, NULL, 0, 0, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(12, 'WiFi', NULL, 0, 0, NULL, NULL, 1, NULL, 1, 1, 4);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(13, 'VPN', NULL, 0, 0, NULL, NULL, 1, NULL, 0, 0, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(14, 'DHCP', NULL, 1, 0, NULL, NULL, 1, NULL, 0, 0, 0);
+INSERT INTO `OU` (`id`, `ou_name`, `comment`, `default_users`, `default_hotspot`, `nagios_dir`, `nagios_host_use`, `nagios_ping`, `nagios_default_service`, `enabled`, `filter_group_id`, `queue_id`) VALUES(15, 'Гости', NULL, 0, 0, NULL, NULL, 1, NULL, 1, 1, 4);
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `Queue_list`
+--
+
+CREATE TABLE `Queue_list` (
+  `id` int(11) NOT NULL,
+  `queue_name` varchar(20) NOT NULL,
+  `Download` int(11) NOT NULL DEFAULT 0,
+  `Upload` int(11) NOT NULL DEFAULT 0
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `Queue_list`
+--
+
+INSERT INTO `Queue_list` (`id`, `queue_name`, `Download`, `Upload`) VALUES(0, 'unlimited', 0, 0);
+INSERT INTO `Queue_list` (`id`, `queue_name`, `Download`, `Upload`) VALUES(1, '2M/2M', 2048, 2048);
+INSERT INTO `Queue_list` (`id`, `queue_name`, `Download`, `Upload`) VALUES(2, '10M/10M', 10240, 10240);
+INSERT INTO `Queue_list` (`id`, `queue_name`, `Download`, `Upload`) VALUES(3, '100M/100M', 102400, 102400);
+INSERT INTO `Queue_list` (`id`, `queue_name`, `Download`, `Upload`) VALUES(4, '50M/50M', 50000, 50000);
+INSERT INTO `Queue_list` (`id`, `queue_name`, `Download`, `Upload`) VALUES(5, '20M/20M', 20480, 20480);
+INSERT INTO `Queue_list` (`id`, `queue_name`, `Download`, `Upload`) VALUES(6, '200M/200M', 212400, 212400);
+INSERT INTO `Queue_list` (`id`, `queue_name`, `Download`, `Upload`) VALUES(7, '1G/1G', 1024000, 1024000);
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `remote_syslog`
+--
+
+CREATE TABLE `remote_syslog` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `date` timestamp NOT NULL DEFAULT current_timestamp(),
+  `device_id` bigint(20) UNSIGNED NOT NULL,
+  `ip` varchar(15) NOT NULL,
+  `message` text NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci KEY_BLOCK_SIZE=8 ROW_FORMAT=COMPRESSED;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `sessions`
+--
+
+CREATE TABLE `sessions` (
+  `id` varchar(128) NOT NULL,
+  `data` text NOT NULL,
+  `last_accessed` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `user_sessions`
+--
+
+CREATE TABLE `user_sessions` (
+  `id` int(11) NOT NULL,
+  `session_id` varchar(128) NOT NULL,
+  `user_id` int(11) NOT NULL,
+  `ip_address` varchar(45) NOT NULL,
+  `user_agent` text NOT NULL,
+  `created_at` int(11) NOT NULL,
+  `last_activity` int(11) NOT NULL,
+  `is_active` tinyint(1) DEFAULT 1
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `subnets`
+--
+
+CREATE TABLE `subnets` (
+  `id` int(11) NOT NULL,
+  `subnet` varchar(18) DEFAULT NULL,
+  `vlan_tag` int(11) NOT NULL DEFAULT 1,
+  `ip_int_start` bigint(20) NOT NULL,
+  `ip_int_stop` bigint(20) NOT NULL,
+  `dhcp_start` bigint(20) NOT NULL DEFAULT 0,
+  `dhcp_stop` bigint(20) NOT NULL DEFAULT 0,
+  `dhcp_lease_time` int(11) NOT NULL DEFAULT 480,
+  `gateway` bigint(20) NOT NULL DEFAULT 0,
+  `office` tinyint(1) NOT NULL DEFAULT 1,
+  `hotspot` tinyint(1) NOT NULL DEFAULT 0,
+  `vpn` tinyint(1) NOT NULL DEFAULT 0,
+  `free` tinyint(1) NOT NULL DEFAULT 0,
+  `dhcp` tinyint(1) NOT NULL DEFAULT 1,
+  `static` tinyint(1) NOT NULL DEFAULT 0,
+  `dhcp_update_hostname` tinyint(1) NOT NULL DEFAULT 0,
+  `discovery` tinyint(1) NOT NULL DEFAULT 1,
+  `comment` varchar(250) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `Traffic_detail`
+--
+
+CREATE TABLE `Traffic_detail` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `auth_id` bigint(20) UNSIGNED DEFAULT NULL,
+  `router_id` int(11) NOT NULL DEFAULT 0,
+  `timestamp` timestamp NULL DEFAULT NULL,
+  `proto` tinyint(3) UNSIGNED DEFAULT NULL,
+  `src_ip` int(10) UNSIGNED NOT NULL,
+  `dst_ip` int(10) UNSIGNED NOT NULL,
+  `src_port` smallint(5) UNSIGNED NOT NULL,
+  `dst_port` smallint(5) UNSIGNED NOT NULL,
+  `bytes` bigint(20) NOT NULL,
+  `pkt` int(10) UNSIGNED NOT NULL DEFAULT 0
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `Unknown_mac`
+--
+
+CREATE TABLE `Unknown_mac` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `mac` varchar(12) DEFAULT NULL,
+  `port_id` bigint(20) UNSIGNED DEFAULT NULL,
+  `device_id` int(11) DEFAULT NULL,
+  `timestamp` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `User_auth`
+--
+
+CREATE TABLE `User_auth` (
+  `id` int(11) NOT NULL,
+  `user_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
+  `ou_id` int(11) DEFAULT NULL,
+  `ip` varchar(18) NOT NULL DEFAULT '',
+  `ip_int` bigint(10) UNSIGNED NOT NULL DEFAULT 0,
+  `save_traf` tinyint(1) NOT NULL DEFAULT 0,
+  `enabled` tinyint(1) NOT NULL DEFAULT 0,
+  `dhcp` tinyint(1) NOT NULL DEFAULT 1,
+  `filter_group_id` tinyint(1) NOT NULL DEFAULT 0,
+  `dynamic` tinyint(1) NOT NULL DEFAULT 0,
+  `eof` datetime DEFAULT NULL,
+  `deleted` tinyint(4) NOT NULL DEFAULT 0,
+  `comments` varchar(250) DEFAULT NULL,
+  `dns_name` varchar(253) DEFAULT NULL,
+  `dns_ptr_only` BOOLEAN NOT NULL DEFAULT FALSE,
+  `WikiName` varchar(250) DEFAULT NULL,
+  `dhcp_acl` text DEFAULT NULL,
+  `queue_id` int(11) NOT NULL DEFAULT 0,
+  `mac` varchar(20) NOT NULL DEFAULT '',
+  `dhcp_action` varchar(10) NOT NULL DEFAULT '',
+  `dhcp_option_set` VARCHAR(50) NULL DEFAULT NULL,
+  `dhcp_time` datetime NOT NULL DEFAULT current_timestamp(),
+  `dhcp_hostname` varchar(60) DEFAULT NULL,
+  `last_found` datetime NOT NULL DEFAULT current_timestamp(),
+  `arp_found` datetime DEFAULT NULL,
+  `blocked` tinyint(1) NOT NULL DEFAULT 0,
+  `day_quota` int(11) NOT NULL DEFAULT 0,
+  `month_quota` int(11) NOT NULL DEFAULT 0,
+  `device_model_id` int(11) DEFAULT 87,
+  `firmware` varchar(100) DEFAULT NULL,
+  `timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
+  `client-id` varchar(250) DEFAULT NULL,
+  `nagios` tinyint(1) NOT NULL DEFAULT 0,
+  `nagios_status` varchar(10) NOT NULL DEFAULT '',
+  `nagios_handler` varchar(50) NOT NULL DEFAULT '',
+  `link_check` tinyint(1) NOT NULL DEFAULT 0,
+  `changed` tinyint(1) NOT NULL DEFAULT 0,
+  `dhcp_changed` int(11) NOT NULL DEFAULT 0,
+  `changed_time` datetime NOT NULL DEFAULT current_timestamp(),
+  `created_by` VARCHAR(10) NULL DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `User_auth_alias`
+--
+
+CREATE TABLE `User_auth_alias` (
+  `id` int(11) NOT NULL,
+  `auth_id` int(11) NOT NULL,
+  `alias` varchar(100) DEFAULT NULL,
+  `description` varchar(100) DEFAULT NULL,
+  `timestamp` timestamp NOT NULL DEFAULT current_timestamp()
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `User_list`
+--
+
+CREATE TABLE `User_list` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
+  `login` varchar(255) DEFAULT NULL,
+  `fio` varchar(255) DEFAULT NULL,
+  `enabled` tinyint(1) NOT NULL DEFAULT 1,
+  `blocked` tinyint(1) NOT NULL DEFAULT 0,
+  `deleted` tinyint(1) NOT NULL DEFAULT 0,
+  `ou_id` int(11) NOT NULL DEFAULT 0,
+  `device_id` int(11) DEFAULT NULL,
+  `filter_group_id` int(11) NOT NULL DEFAULT 0,
+  `queue_id` int(11) NOT NULL DEFAULT 0,
+  `day_quota` int(11) NOT NULL DEFAULT 0,
+  `month_quota` int(11) NOT NULL DEFAULT 0,
+  `permanent` BOOLEAN NOT NULL DEFAULT FALSE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `User_stats`
+--
+
+CREATE TABLE `User_stats` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `router_id` bigint(20) UNSIGNED DEFAULT 0,
+  `auth_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
+  `timestamp` datetime NOT NULL DEFAULT current_timestamp(),
+  `byte_in` bigint(20) NOT NULL DEFAULT 0,
+  `byte_out` bigint(20) NOT NULL DEFAULT 0
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `User_stats_full`
+--
+
+CREATE TABLE `User_stats_full` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `router_id` bigint(20) UNSIGNED DEFAULT 0,
+  `auth_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
+  `timestamp` datetime NOT NULL DEFAULT current_timestamp(),
+  `byte_in` bigint(20) NOT NULL DEFAULT 0,
+  `byte_out` bigint(20) NOT NULL DEFAULT 0,
+  `pkt_in` int(11) DEFAULT NULL,
+  `pkt_out` int(11) DEFAULT NULL,
+  `step` int(11) NOT NULL DEFAULT 600
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `variables`
+--
+
+CREATE TABLE `variables` (
+  `id` int(11) NOT NULL,
+  `name` varchar(30) NOT NULL,
+  `value` varchar(255) DEFAULT NULL,
+  `clear_time` timestamp NOT NULL DEFAULT current_timestamp(),
+  `created` timestamp NOT NULL DEFAULT current_timestamp()
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `vendors`
+--
+
+CREATE TABLE `vendors` (
+  `id` int(11) NOT NULL,
+  `name` varchar(40) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `vendors`
+--
+
+INSERT INTO `vendors` (`id`, `name`) VALUES(1, 'Unknown');
+INSERT INTO `vendors` (`id`, `name`) VALUES(2, 'Eltex');
+INSERT INTO `vendors` (`id`, `name`) VALUES(3, 'Huawei');
+INSERT INTO `vendors` (`id`, `name`) VALUES(4, 'Zyxel');
+INSERT INTO `vendors` (`id`, `name`) VALUES(5, 'Raisecom');
+INSERT INTO `vendors` (`id`, `name`) VALUES(6, 'SNR');
+INSERT INTO `vendors` (`id`, `name`) VALUES(7, 'Dlink');
+INSERT INTO `vendors` (`id`, `name`) VALUES(8, 'Allied Telesis');
+INSERT INTO `vendors` (`id`, `name`) VALUES(9, 'Mikrotik');
+INSERT INTO `vendors` (`id`, `name`) VALUES(10, 'NetGear');
+INSERT INTO `vendors` (`id`, `name`) VALUES(11, 'Ubiquiti');
+INSERT INTO `vendors` (`id`, `name`) VALUES(15, 'HP');
+INSERT INTO `vendors` (`id`, `name`) VALUES(16, 'Cisco');
+INSERT INTO `vendors` (`id`, `name`) VALUES(17, 'Maipu');
+INSERT INTO `vendors` (`id`, `name`) VALUES(18, 'Asus');
+INSERT INTO `vendors` (`id`, `name`) VALUES(19, 'Linux');
+INSERT INTO `vendors` (`id`, `name`) VALUES(20, 'APC');
+INSERT INTO `vendors` (`id`, `name`) VALUES(21, 'Schneider');
+INSERT INTO `vendors` (`id`, `name`) VALUES(33, 'QSC');
+INSERT INTO `vendors` (`id`, `name`) VALUES(34, 'Projectiondesign');
+INSERT INTO `vendors` (`id`, `name`) VALUES(35, 'Lenovo');
+INSERT INTO `vendors` (`id`, `name`) VALUES(36, 'HiWatch');
+INSERT INTO `vendors` (`id`, `name`) VALUES(37, 'LTV');
+INSERT INTO `vendors` (`id`, `name`) VALUES(38, 'Yeastar');
+INSERT INTO `vendors` (`id`, `name`) VALUES(39, 'Yealink');
+INSERT INTO `vendors` (`id`, `name`) VALUES(40, 'Gigaset');
+INSERT INTO `vendors` (`id`, `name`) VALUES(41, 'Linksys');
+INSERT INTO `vendors` (`id`, `name`) VALUES(42, 'Samsung');
+INSERT INTO `vendors` (`id`, `name`) VALUES(43, 'Supermicro');
+INSERT INTO `vendors` (`id`, `name`) VALUES(44, 'RDP');
+INSERT INTO `vendors` (`id`, `name`) VALUES(45, 'SANYO');
+INSERT INTO `vendors` (`id`, `name`) VALUES(46, 'Extreme');
+INSERT INTO `vendors` (`id`, `name`) VALUES(47, 'Intel');
+INSERT INTO `vendors` (`id`, `name`) VALUES(48, 'Micron');
+INSERT INTO `vendors` (`id`, `name`) VALUES(49, 'Gigabyte');
+INSERT INTO `vendors` (`id`, `name`) VALUES(50, 'Acer');
+INSERT INTO `vendors` (`id`, `name`) VALUES(51, 'Seagate');
+INSERT INTO `vendors` (`id`, `name`) VALUES(52, 'SanDisk');
+INSERT INTO `vendors` (`id`, `name`) VALUES(53, 'Toshiba');
+INSERT INTO `vendors` (`id`, `name`) VALUES(54, 'Kingston');
+INSERT INTO `vendors` (`id`, `name`) VALUES(55, 'AddPac');
+INSERT INTO `vendors` (`id`, `name`) VALUES(56, 'Devline');
+INSERT INTO `vendors` (`id`, `name`) VALUES(57, 'Canon');
+INSERT INTO `vendors` (`id`, `name`) VALUES(58, 'Brother');
+INSERT INTO `vendors` (`id`, `name`) VALUES(59, 'Epson');
+INSERT INTO `vendors` (`id`, `name`) VALUES(60, 'IP-COM');
+INSERT INTO `vendors` (`id`, `name`) VALUES(61, 'Panasonic');
+INSERT INTO `vendors` (`id`, `name`) VALUES(62, 'OKI');
+INSERT INTO `vendors` (`id`, `name`) VALUES(63, 'Apple');
+INSERT INTO `vendors` (`id`, `name`) VALUES(64, 'Eaton');
+INSERT INTO `vendors` (`id`, `name`) VALUES(65, 'Barco');
+INSERT INTO `vendors` (`id`, `name`) VALUES(66, 'Trassir');
+INSERT INTO `vendors` (`id`, `name`) VALUES(67, 'Testo');
+INSERT INTO `vendors` (`id`, `name`) VALUES(68, 'Hw-group');
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `version`
+--
+
+CREATE TABLE `version` (
+  `id` int(11) NOT NULL DEFAULT 1,
+  `version` varchar(10) NOT NULL DEFAULT '2.4.14'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+--
+-- Дамп данных таблицы `version`
+--
+
+INSERT INTO `version` (`id`, `version`) VALUES(1, '2.7.0');
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `Wan_stats`
+--
+
+CREATE TABLE `Wan_stats` (
+  `id` int(11) NOT NULL,
+  `time` datetime NOT NULL DEFAULT current_timestamp(),
+  `router_id` int(11) DEFAULT NULL,
+  `interface_id` int(11) DEFAULT NULL,
+  `in` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
+  `out` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
+  `forward_in` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
+  `forward_out` bigint(20) UNSIGNED NOT NULL DEFAULT 0
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `worklog`
+--
+
+CREATE TABLE `worklog` (
+  `id` bigint(20) UNSIGNED NOT NULL,
+  `timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
+  `auth_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
+  `customer` varchar(50) NOT NULL DEFAULT 'system',
+  `ip` varchar(18) NOT NULL DEFAULT '127.0.0.1',
+  `message` text NOT NULL,
+  `level` int(11) NOT NULL DEFAULT 1
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci KEY_BLOCK_SIZE=8 ROW_FORMAT=COMPRESSED;
+
+--
+-- Индексы сохранённых таблиц
+--
+
+--
+-- Индексы таблицы `acl`
+--
+ALTER TABLE `acl`
+  ADD PRIMARY KEY (`id`);
+
+--
+-- Индексы таблицы `ad_comp_cache`
+--
+ALTER TABLE `ad_comp_cache`
+  ADD PRIMARY KEY (`id`),
+  ADD UNIQUE KEY `comp_name` (`name`);
+
+--
+-- Индексы таблицы `auth_rules`
+--
+ALTER TABLE `auth_rules`
+  ADD PRIMARY KEY (`id`),
+  ADD UNIQUE KEY `rule` (`rule`),
+  ADD KEY `user_id` (`user_id`);
+
+--
+-- Индексы таблицы `building`
+--
+ALTER TABLE `building`
+  ADD PRIMARY KEY (`id`);
+
+--
+-- Индексы таблицы `config`
+--
+ALTER TABLE `config`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `option` (`option_id`);
+
+--
+-- Индексы таблицы `config_options`
+--
+ALTER TABLE `config_options`
+  ADD PRIMARY KEY (`id`);
+
+--
+-- Индексы таблицы `connections`
+--
+ALTER TABLE `connections`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `auth_id` (`auth_id`),
+  ADD KEY `device_id` (`device_id`,`port_id`);
+
+--
+-- Индексы таблицы `Customers`
+--
+ALTER TABLE `Customers`
+  ADD PRIMARY KEY (`id`);
+
+--
+-- Индексы таблицы `devices`
+--
+ALTER TABLE `devices`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `ip` (`ip`),
+  ADD KEY `device_type` (`device_type`);
+
+--
+-- Индексы таблицы `device_l3_interfaces`
+--
+ALTER TABLE `device_l3_interfaces`
+  ADD PRIMARY KEY (`id`);
+
+--
+-- Индексы таблицы `device_models`
+--
+ALTER TABLE `device_models`
+  ADD PRIMARY KEY (`id`);
+
+--
+-- Индексы таблицы `device_ports`
+--
+ALTER TABLE `device_ports`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `device_id` (`device_id`),
+  ADD KEY `port` (`port`),
+  ADD KEY `target_port_id` (`target_port_id`);
+
+--
+-- Индексы таблицы `device_types`
+--
+ALTER TABLE `device_types`
+  ADD PRIMARY KEY (`id`);
+
+--
+-- Индексы таблицы `dhcp_log`
+--
+ALTER TABLE `dhcp_log`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `timestamp` (`timestamp`,`action`);
+
+--
+-- Индексы таблицы `dhcp_queue`
+--
+ALTER TABLE `dhcp_queue`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `timestamp` (`timestamp`,`action`);
+
+--
+-- Индексы таблицы `dns_cache`
+--
+ALTER TABLE `dns_cache`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `dns` (`dns`,`ip`),
+  ADD KEY `timestamp` (`timestamp`);
+
+--
+-- Индексы таблицы `Filter_list`
+--
+ALTER TABLE `Filter_list`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `Name` (`name`);
+
+--
+-- Индексы таблицы `gateway_subnets`
+--
+ALTER TABLE `gateway_subnets`
+  ADD PRIMARY KEY (`id`);
+
+--
+-- Индексы таблицы `Group_filters`
+--
+ALTER TABLE `Group_filters`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `GroupId` (`group_id`,`filter_id`);
+
+--
+-- Индексы таблицы `Group_list`
+--
+ALTER TABLE `Group_list`
+  ADD PRIMARY KEY (`id`);
+
+--
+-- Индексы таблицы `mac_history`
+--
+ALTER TABLE `mac_history`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `mac` (`mac`,`timestamp`),
+  ADD KEY `ip` (`ip`,`timestamp`),
+  ADD KEY `timestamp` (`timestamp`) USING BTREE,
+  ADD KEY `mac_2` (`mac`),
+  ADD KEY `ip_2` (`ip`);
+
+--
+-- Индексы таблицы `mac_vendors`
+--
+ALTER TABLE `mac_vendors`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `oui` (`oui`);
+
+--
+-- Индексы таблицы `OU`
+--
+ALTER TABLE `OU`
+  ADD PRIMARY KEY (`id`);
+
+--
+-- Индексы таблицы `Queue_list`
+--
+ALTER TABLE `Queue_list`
+  ADD PRIMARY KEY (`id`),
+  ADD UNIQUE KEY `id` (`id`);
+
+--
+-- Индексы таблицы `remote_syslog`
+--
+ALTER TABLE `remote_syslog`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `date` (`date`,`device_id`,`ip`);
+
+--
+-- Индексы таблицы `sessions`
+--
+ALTER TABLE `sessions`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `last_accessed` (`last_accessed`);
+
+--
+-- Индексы таблицы `user_sessions`
+--
+ALTER TABLE `user_sessions`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `session_id` (`session_id`),
+  ADD KEY `user_id` (`user_id`),
+  ADD KEY `is_active` (`is_active`);
+
+--
+-- Индексы таблицы `subnets`
+--
+ALTER TABLE `subnets`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `ip_int_start` (`ip_int_start`,`ip_int_stop`),
+  ADD KEY `dhcp` (`dhcp`,`office`,`hotspot`,`static`);
+
+--
+-- Индексы таблицы `Traffic_detail`
+--
+ALTER TABLE `Traffic_detail`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `src` (`auth_id`,`timestamp`,`router_id`,`src_ip`),
+  ADD KEY `dst` (`auth_id`,`timestamp`,`router_id`,`dst_ip`);
+
+--
+-- Индексы таблицы `Unknown_mac`
+--
+ALTER TABLE `Unknown_mac`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `timestamp` (`timestamp`,`device_id`,`port_id`,`mac`);
+
+--
+-- Индексы таблицы `User_auth`
+--
+ALTER TABLE `User_auth`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `auth_index` (`id`,`user_id`,`ip_int`,`mac`,`ip`,`deleted`) USING BTREE,
+  ADD KEY `deleted` (`deleted`),
+  ADD KEY `ou_id` (`ou_id`);
+
+--
+-- Индексы таблицы `User_auth_alias`
+--
+ALTER TABLE `User_auth_alias`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `auth_id` (`auth_id`);
+
+--
+-- Индексы таблицы `User_list`
+--
+ALTER TABLE `User_list`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `users` (`id`,`ou_id`,`enabled`,`blocked`,`deleted`);
+
+--
+-- Индексы таблицы `User_stats`
+--
+ALTER TABLE `User_stats`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `timestamp` (`timestamp`,`auth_id`,`router_id`);
+
+--
+-- Индексы таблицы `User_stats_full`
+--
+ALTER TABLE `User_stats_full`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `timestamp` (`timestamp`,`auth_id`,`router_id`);
+
+--
+-- Индексы таблицы `variables`
+--
+ALTER TABLE `variables`
+  ADD PRIMARY KEY (`id`),
+  ADD UNIQUE KEY `name` (`name`),
+  ADD KEY `clear_time` (`clear_time`,`created`);
+
+--
+-- Индексы таблицы `vendors`
+--
+ALTER TABLE `vendors`
+  ADD PRIMARY KEY (`id`);
+
+--
+-- Индексы таблицы `version`
+--
+ALTER TABLE `version`
+  ADD UNIQUE KEY `id` (`id`);
+
+--
+-- Индексы таблицы `Wan_stats`
+--
+ALTER TABLE `Wan_stats`
+  ADD PRIMARY KEY (`id`),
+  ADD UNIQUE KEY `main` (`time`,`router_id`,`interface_id`),
+  ADD KEY `times` (`time`);
+
+--
+-- Индексы таблицы `worklog`
+--
+ALTER TABLE `worklog`
+  ADD PRIMARY KEY (`id`),
+  ADD KEY `idx_customer` (`customer`,`level`,`timestamp`),
+  ADD KEY `idx_timestamp` (`level`,`timestamp`),
+  ADD KEY `idx_auth_id` (`auth_id`,`level`,`timestamp`);
+
+
+--
+-- Индексы таблицы `dns_queue`
+--
+ALTER TABLE `dns_queue`
+  ADD PRIMARY KEY (`id`);
+
+
+--
+-- Индексы таблицы `filter_instances`
+--
+ALTER TABLE `filter_instances`
+  ADD PRIMARY KEY (`id`),
+  ADD UNIQUE KEY `name` (`name`);
+
+--
+-- AUTO_INCREMENT для сохранённых таблиц
+--
+
+--
+-- AUTO_INCREMENT для таблицы `acl`
+--
+ALTER TABLE `acl`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `ad_comp_cache`
+--
+ALTER TABLE `ad_comp_cache`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `auth_rules`
+--
+ALTER TABLE `auth_rules`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `building`
+--
+ALTER TABLE `building`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `config`
+--
+ALTER TABLE `config`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `config_options`
+--
+ALTER TABLE `config_options`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `connections`
+--
+ALTER TABLE `connections`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `Customers`
+--
+ALTER TABLE `Customers`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `devices`
+--
+ALTER TABLE `devices`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `device_l3_interfaces`
+--
+ALTER TABLE `device_l3_interfaces`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `device_models`
+--
+ALTER TABLE `device_models`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `device_ports`
+--
+ALTER TABLE `device_ports`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `device_types`
+--
+ALTER TABLE `device_types`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `dhcp_log`
+--
+ALTER TABLE `dhcp_log`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `dhcp_queue`
+--
+ALTER TABLE `dhcp_queue`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `dns_cache`
+--
+ALTER TABLE `dns_cache`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `dns_queue`
+--
+ALTER TABLE `dns_queue`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `Filter_list`
+--
+ALTER TABLE `Filter_list`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `gateway_subnets`
+--
+ALTER TABLE `gateway_subnets`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `Group_filters`
+--
+ALTER TABLE `Group_filters`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `Group_list`
+--
+ALTER TABLE `Group_list`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `mac_history`
+--
+ALTER TABLE `mac_history`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `mac_vendors`
+--
+ALTER TABLE `mac_vendors`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `OU`
+--
+ALTER TABLE `OU`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `Queue_list`
+--
+ALTER TABLE `Queue_list`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `remote_syslog`
+--
+ALTER TABLE `remote_syslog`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `user_sessions`
+--
+ALTER TABLE `user_sessions`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `subnets`
+--
+ALTER TABLE `subnets`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `Traffic_detail`
+--
+ALTER TABLE `Traffic_detail`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `Unknown_mac`
+--
+ALTER TABLE `Unknown_mac`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `User_auth`
+--
+ALTER TABLE `User_auth`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `User_auth_alias`
+--
+ALTER TABLE `User_auth_alias`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `User_list`
+--
+ALTER TABLE `User_list`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `User_stats`
+--
+ALTER TABLE `User_stats`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `User_stats_full`
+--
+ALTER TABLE `User_stats_full`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `variables`
+--
+ALTER TABLE `variables`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `vendors`
+--
+ALTER TABLE `vendors`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `Wan_stats`
+--
+ALTER TABLE `Wan_stats`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `filter_instances`
+--
+ALTER TABLE `filter_instances`
+  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
+
+--
+-- AUTO_INCREMENT для таблицы `worklog`
+--
+ALTER TABLE `worklog`
+  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
+COMMIT;
+
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

+ 1 - 1
docs/mysql/latest-mysql.sql

@@ -1 +1 @@
-./2-7-9/mysql.sql
+./2-8-0/mysql.sql

+ 2 - 4
docs/systemd/dhcp-log-truncate.service

@@ -1,8 +1,6 @@
 [Unit]
-Description=Clear dhcp-log after restart dnsmasq
-After=dnsmasq.service
-Requires=dnsmasq.service
-PartOf=dnsmasq.service
+Description=Clear dhcp.log before starting dhcp-log
+Before=dhcp-log.service
 
 [Service]
 Type=oneshot

+ 2 - 1
docs/systemd/dhcp-log.service

@@ -1,6 +1,7 @@
 [Unit]
 Description=Write dhcp events to Eye
-After=network.target mariadb.service dnsmasq.service dhcpd.service
+After=network.target mariadb.service dnsmasq.service dhcpd.service dhcp-log-truncate.service
+Requires=dhcp-log-truncate.service
 
 [Service]
 Type=forking

+ 2 - 0
docs/systemd/dnsmasq.service.d/override.conf

@@ -0,0 +1,2 @@
+[Service]
+ExecStartPre=/usr/bin/truncate -s 0 /var/log/dhcp.log

+ 20 - 8
html/admin/logs/index.php

@@ -6,6 +6,13 @@ $default_date_shift='d';
 require_once ($_SERVER['DOCUMENT_ROOT']."/inc/datefilter.php");
 require_once ($_SERVER['DOCUMENT_ROOT']."/inc/loglevelfilter.php");
 require_once ($_SERVER['DOCUMENT_ROOT']."/inc/logfilter.php");
+
+if (isset($_POST['user_ip'])) { $fuser_ip = $_POST['user_ip']; }
+if (isset($_GET['user_ip'])) { $fuser_ip = $_GET['user_ip']; }
+if (!isset($fuser_ip) and isset($_SESSION[$page_url]['user_ip'])) { $fuser_ip=$_SESSION[$page_url]['user_ip']; }
+if (!isset($fuser_ip)) { $fuser_ip=''; }
+$_SESSION[$page_url]['user_ip']=$fuser_ip;
+
 print_log_submenu($page_url);
 ?>
 <div id="cont">
@@ -16,8 +23,9 @@ print_log_submenu($page_url);
 <?php echo WEB_log_level_display; ?>:<?php print_loglevel_select('display_log_level',$display_log_level); ?>
 <?php print WEB_rows_at_page."&nbsp"; print_row_at_pages('rows',$displayed); ?>
 <input type="submit" value="<?php echo WEB_btn_show; ?>"><br><br>
-<?php echo WEB_log_filter_source; ?>:<input name="customer" value="<?php echo $fcustomer; ?>" />
-<?php echo WEB_log_event; ?>:<input name="message" value="<?php echo $fmessage; ?>" />
+<?php echo WEB_log_filter_source; ?>:&nbsp<input name="customer" value="<?php echo $fcustomer; ?>" /> &nbsp
+<?php echo WEB_log_event; ?>:&nbsp<input name="message" value="<?php echo $fmessage; ?>" /> &nbsp
+<?php echo WEB_msg_IP; ?>:&nbsp<input name="user_ip" value="<?php echo $fuser_ip; ?>" /><br>
 </form>
 
 <?php
@@ -29,8 +37,9 @@ if ($display_log_level == L_INFO) { $log_filter = " and `level`<=".L_INFO." "; }
 if ($display_log_level == L_VERBOSE) { $log_filter = " and `level`<=".L_VERBOSE." "; }
 if ($display_log_level == L_DEBUG) { $log_filter = ""; }
 
-if (!empty($fcustomer)) { $log_filter = $log_filter." and customer LIKE '%".$fcustomer."%'"; }
-if (!empty($fmessage)) { $log_filter = $log_filter." and message LIKE '%".$fmessage."%'"; }
+if (!empty($fcustomer)) { $log_filter = $log_filter." and customer LIKE '".$fcustomer."'"; }
+if (!empty($fmessage)) { $log_filter = $log_filter." and message LIKE '".$fmessage."'"; }
+if (!empty($fuser_ip)) { $log_filter = $log_filter." and ip LIKE '".$fuser_ip."'"; }
 
 $countSQL="SELECT Count(*) FROM worklog WHERE `timestamp`>='$date1' AND `timestamp`<'$date2' $log_filter";
 $res = mysqli_query($db_link, $countSQL);
@@ -41,21 +50,23 @@ if ($page>$total) { $page=$total; }
 if ($page<1) { $page=1; }
 $start = ($page * $displayed) - $displayed; 
 print_navigation($page_url,$page,$displayed,$count_records[0],$total);
+
+#speedup paging
+$sSQL = "SELECT * FROM (SELECT * FROM worklog WHERE `timestamp`>='$date1' AND `timestamp`<'$date2' $log_filter ) AS W ORDER BY timestamp DESC LIMIT $start,$displayed";
+
 ?>
 <br>
 
 <table class="data">
 <tr align="center">
 	<td class="data" width=150><b><?php echo WEB_log_time; ?></b></td>
-	<td class="data"><b><?php echo WEB_log_manager; ?></b></td>
+	<td class="data"><b><?php echo WEB_log_filter_source; ?></b></td>
+	<td class="data"><b><?php echo WEB_msg_IP; ?></b></td>
 	<td class="data"><b><?php echo WEB_log_level; ?></b></td>
 	<td class="data"><b><?php echo WEB_log_event; ?></b></td>
 </tr>
 
 <?php
-#speedup paging
-$sSQL = "SELECT `timestamp`,customer,message,level FROM worklog as S JOIN (SELECT id FROM worklog WHERE `timestamp`>='$date1' AND `timestamp`<'$date2' $log_filter ORDER BY id DESC LIMIT $start,$displayed) AS I ON S.id = I.id";
-
 $userlog = get_records_sql($db_link, $sSQL);
 foreach ($userlog as $row) {
     print "<tr align=center class=\"tr1\" onmouseover=\"className='tr2'\" onmouseout=\"className='tr1'\">\n";
@@ -66,6 +77,7 @@ foreach ($userlog as $row) {
     if ($row['level'] == L_WARNING) { $msg_level='WARNING'; }
     if ($row['level'] == L_DEBUG) { $msg_level='DEBUG'; }
     if ($row['level'] == L_VERBOSE) { $msg_level='VERBOSE'; }
+    print "<td class=\"data\">" . $row['ip'] . "</td>\n";
     print "<td class=\"data\">" . $msg_level . "</td>\n";
     $print_msg = expand_log_str($db_link, $row['message']);
     print "<td class=\"data\" align=left>" . $print_msg . "</td>\n";

+ 5 - 10
html/admin/logs/syslog.php

@@ -42,11 +42,10 @@ if ($f_id>0) {
 
 <?php
 
-if (!empty($fmessage)) {
-    if (!empty($log_filter)) { $log_filter = $log_filter." and message LIKE '%".$fmessage."%'"; } else { $log_filter = " message LIKE '%".$fmessage."%'"; }
-    }
+if (!empty($fmessage)) { $log_filter .= " AND `message` LIKE '%" . addslashes($fmessage) . "%'"; }
 
 $countSQL="SELECT Count(*) FROM `remote_syslog` WHERE `date`>='$date1' AND `date`<'$date2' $log_filter";
+
 $res = mysqli_query($db_link, $countSQL);
 $count_records = mysqli_fetch_array($res);
 $total=ceil($count_records[0]/$displayed);
@@ -54,6 +53,8 @@ if ($page>$total) { $page=$total; }
 if ($page<1) { $page=1; }
 $start = ($page * $displayed) - $displayed; 
 print_navigation($page_url,$page,$displayed,$count_records[0],$total);
+#speedup pageing
+$sSQL = "SELECT * FROM (SELECT * FROM `remote_syslog` WHERE `date`>='$date1' AND `date`<'$date2' $log_filter) as R ORDER BY `date` DESC LIMIT $start,$displayed";
 ?>
 
 <br>
@@ -66,13 +67,7 @@ print_navigation($page_url,$page,$displayed,$count_records[0],$total);
 
 <?php
 
-#speedup pageing
-$sSQL = "SELECT 
-`date`, `ip`, `message` 
-FROM `remote_syslog` as R 
-JOIN 
-(SELECT id FROM `remote_syslog` WHERE `date`>='$date1' AND `date`<'$date2' $log_filter ORDER BY `id` DESC LIMIT $start,$displayed) as I 
-ON R.id = I.id";
+
 $syslog = get_records_sql($db_link, $sSQL);
 if (!empty($syslog)) {
     foreach ($syslog as $row) {

+ 5 - 3
html/api.php

@@ -69,9 +69,11 @@ if (!empty($action)) {
               if ($faction == 0) { $dhcp_action = 'del'; }
               LOG_VERBOSE($db_link, "API: external dhcp request for $ip [$mac] $dhcp_action");
               if (checkValidIp($ip) and is_our_network($db_link, $ip)) {
-                    $run_cmd = "/opt/Eye/scripts/dnsmasq-hook.sh '".$dhcp_action."' '".$mac."' '".$ip."' '".$dhcp_hostname."'";
-                    $result = shell_exec("/usr/bin/sudo ".escapeshellcmd($run_cmd)." >/dev/null 2>/dev/null &");
-                    LOG_VERBOSE($db_link, "Run command: $run_cmd ");
+                    $new['action']=$dhcp_action;
+                    $new['mac']=$mac;
+                    $new['ip']=$ip;
+                    $new['dhcp_hostname']=$dhcp_hostname;
+                    insert_record($db_link,"dhcp_queue",$new);
                     } else { LOG_ERROR($db_link, "$ip - wrong network!"); }
               }
           }

+ 2 - 3
html/inc/common.php

@@ -2444,9 +2444,8 @@ function write_log($db, $msg, $level = L_INFO, $auth_id = 0)
     $currentIp = filter_var($_SESSION['ip'] ?? '127.0.0.1', FILTER_VALIDATE_IP) ?: '127.0.0.1';
     $currentLogin = htmlspecialchars($_SESSION['login'] ?? 'http', ENT_QUOTES, 'UTF-8');
     if (!isset($msg)) { return; }
-    $msg = 'From: '.$currentIp.' '.$msg;
-    $stmt = mysqli_prepare($db, "INSERT INTO worklog(customer, message, level, auth_id) VALUES (?, ?, ?, ?)");
-    mysqli_stmt_bind_param($stmt, 'ssii', $currentLogin, $msg, $level, $auth_id);
+    $stmt = mysqli_prepare($db, "INSERT INTO worklog(customer, message, level, auth_id, ip) VALUES (?, ?, ?, ?, ?)");
+    mysqli_stmt_bind_param($stmt, 'ssiis', $currentLogin, $msg, $level, $auth_id, $currentIp);
     mysqli_stmt_execute($stmt);
     mysqli_stmt_close($stmt);
 }

+ 2 - 2
html/inc/languages/english.php

@@ -461,8 +461,8 @@ define("WEB_ips_search_full","Search by comment/ip/mac/dhcp hostname");
 define("WEB_log_start_date","Start");
 define("WEB_log_stop_date","End");
 define("WEB_log_level_display","Log level");
-define("WEB_log_filter_source","Filter Source");
-define("WEB_log_filter_event","Filter - message");
+define("WEB_log_filter_source","Source");
+define("WEB_log_filter_event","Event");
 define("WEB_log_message","Message");
 define("WEB_log_time","Time");
 define("WEB_log_manager","Administrator");

+ 2 - 2
html/inc/languages/russian.php

@@ -461,8 +461,8 @@ define("WEB_ips_search_full","Поиск по комментарию/ip/mac/dhcp
 define("WEB_log_start_date","Начало");
 define("WEB_log_stop_date","Конец");
 define("WEB_log_level_display","Уровень логов");
-define("WEB_log_filter_source","Фильтр Источник");
-define("WEB_log_filter_event","Фильтр - сообщение");
+define("WEB_log_filter_source","Источник");
+define("WEB_log_filter_event","Событие");
 define("WEB_log_message","Сообщение");
 define("WEB_log_time","Время");
 define("WEB_log_manager","Администратор");

+ 3 - 136
scripts/dhcp-log.pl

@@ -129,76 +129,18 @@ if (!$pid) {
             next if (!$type);
             next if ($type!~/(old|add|del)/i);
 
-
             #mute doubles
             if (exists $leases{$ip} and $leases{$ip}{'type'} eq $type and time()-$leases{$ip}{'last_time'} <= $mute_time) { next; }
 
             #update config variables every 1 minute
             if (time()-$last_refresh_config>=60) { init_option($hdb); }
 
-            my $client_hostname='';
-            if ($hostname and $hostname ne "undef") { $client_hostname=$hostname; } else {
-                if ($sup_hostname) { $client_hostname=$sup_hostname; } else {
-                    if ($old_hostname) { $client_hostname=$old_hostname; }
-                    }
-                }
-
-            my $auth_network = $office_networks->match_string($ip);
-            if (!$auth_network) {
-                log_error("Unknown network in dhcp request! IP: $ip");
-                next;
-                }
-
-            if (!$timestamp) { $timestamp=time(); }
-
-            my $ip_aton=StrToIp($ip);
-
-            $mac=mac_splitted(isc_mac_simplify($mac));
-
-            my $dhcp_event_time = GetNowTime($timestamp);
-
-            my $dhcp_record;
-            $dhcp_record->{'mac'}=$mac;
-            $dhcp_record->{'ip'}=$ip;
-            $dhcp_record->{'ip_aton'}=$ip_aton;
-            $dhcp_record->{'hostname'}=$client_hostname;
-            $dhcp_record->{'tags'}=$tags;
-            $dhcp_record->{'network'}=$auth_network;
-            $dhcp_record->{'type'}=$type;
-            $dhcp_record->{'hostname_utf8'}=$converter->convert($client_hostname);
-            $dhcp_record->{'timestamp'} = $timestamp;
-            $dhcp_record->{'last_time'} = time();
-            $dhcp_record->{'circuit-id'} = $circuit_id;
-            $dhcp_record->{'client-id'} = $client_id;
-            $dhcp_record->{'remote-id'} = $remote_id;
-            $dhcp_record->{'hotspot'}=is_hotspot($dbh,$dhcp_record->{ip});
+            my $dhcp_record = process_dhcp_request($hdb, $type, $mac, $ip, $hostname, $client_id, $decoded_circuit_id, $decoded_remote_id);
+            next if (!$dhcp_record);
 
             #save record for mute
             $leases{$ip}=$dhcp_record;
-
-            #search actual record
-            my $auth_record = get_record_sql($hdb,'SELECT * FROM User_auth WHERE ip="'.$dhcp_record->{ip}.'" and mac="'.$mac.'" and deleted=0 ORDER BY last_found DESC');
-
-            #if record not found and type del => next event
-            if (!$type) { next; }
-            if (!$auth_record and $type eq 'del') {
-                next;
-                }
-
-            #if record not found - create it
-            if (!$auth_record and $type=~/(add|old)/i) {
-#                    db_log_warning($hdb,"Record for dhcp request type: ".$type." ip=".$dhcp_record->{ip}." and mac=".$mac." does not exists!");
-                    my $res_id = resurrection_auth($hdb,$dhcp_record);
-                    if (!$res_id) {
-                        db_log_error($hdb,"Error creating an ip address record for ip=".$dhcp_record->{ip}." and mac=".$mac."!");
-                        next;
-                        }
-                    $auth_record = get_record_sql($hdb,'SELECT * FROM User_auth WHERE id='.$res_id);
-                    db_log_info($hdb,"Check for new auth. Found id: $res_id",$res_id);
-                }
-
-            my $auth_id = $auth_record->{id};
-            my $auth_ou_id = $auth_record->{ou_id};
+            my $auth_id = $dhcp_record->{auth_id};
 
             my $switch;
             my $switch_port;
@@ -316,83 +258,8 @@ if (!$pid) {
                         }
                     }
                 }
-
-            log_debug(uc($type).">>");
-            log_debug("MAC:        ".$dhcp_record->{'mac'});
-            log_debug("IP:         ".$dhcp_record->{'ip'});
-            log_debug("TAGS:       ".$dhcp_record->{'tags'});
-            log_debug("CIRCUIT-ID: ".$dhcp_record->{'circuit-id'});
-            log_debug("REMOTE-ID:  ".$dhcp_record->{'remote-id'});
-            log_debug("HOSTNAME:   ".$dhcp_record->{'hostname'});
-            log_debug("TYPE:       ".$dhcp_record->{'type'});
-            log_debug("TIME:       ".$dhcp_event_time);
-            log_debug("UTF8 NAME:  ".$dhcp_record->{'hostname_utf8'});
             log_debug("SWITCH:     ".$switch->{'device_name'}) if ($switch);
             log_debug("SWITCH PORT:".$switch_port->{'ifName'}) if ($switch_port);
-            log_debug("END GET");
-
-            update_dns_record_by_dhcp($hdb,$dhcp_record,$auth_record);
-
-            if ($type=~/add/i and $dhcp_record->{hostname_utf8} and $dhcp_record->{hostname_utf8} !~/UNDEFINED/i) {
-                my $auth_rec;
-                $auth_rec->{dhcp_hostname} = $dhcp_record->{hostname_utf8};
-                $auth_rec->{dhcp_time}=$dhcp_event_time;
-                $auth_rec->{arp_found}=$dhcp_event_time;
-                $auth_rec->{created_by}='dhcp';
-                db_log_verbose($hdb,"Add lease by dhcp event for dynamic clients id: $auth_id ip: $dhcp_record->{ip}",$auth_id);
-                update_record($hdb,'User_auth',$auth_rec,"id=$auth_id");
-                }
-
-            if ($type=~/old/i) {
-                    my $auth_rec;
-                    $auth_rec->{dhcp_action}=$type;
-                    $auth_rec->{dhcp_time}=$dhcp_event_time;
-                    $auth_rec->{created_by}='dhcp';
-                    $auth_rec->{arp_found}=$dhcp_event_time;
-                    db_log_verbose($hdb,"Update lease by dhcp event for dynamic clients id: $auth_id ip: $dhcp_record->{ip}",$auth_id);
-                    update_record($hdb,'User_auth',$auth_rec,"id=$auth_id");
-                }
-
-            if ($type=~/del/i and $auth_id) {
-                if ($auth_record->{dhcp_time} =~ /([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})/) {
-                    my $d_time = mktime($6,$5,$4,$3,$2-1,$1-1900);
-                    if (time()-$d_time>60 and (is_dynamic_ou($hdb,$auth_ou_id) or is_default_ou($hdb,$auth_ou_id))) {
-                        db_log_info($hdb,"Remove user ip record by dhcp release event for dynamic clients id: $auth_id ip: $dhcp_record->{ip}",$auth_id);
-                        my $auth_rec;
-                        $auth_rec->{dhcp_action}=$type;
-                        $auth_rec->{dhcp_time}=$dhcp_event_time;
-                        update_record($hdb,'User_auth',$auth_rec,"id=$auth_id");
-                        #remove user auth record if it belongs to the default pool or it is dynamic
-                        if (is_default_ou($hdb,$auth_ou_id) or (is_dynamic_ou($hdb,$auth_ou_id) and $auth_record->{dynamic})) {
-                                delete_user_auth($hdb,$auth_id);
-                                my $u_count=get_count_records($hdb,'User_auth','deleted=0 and user_id='.$auth_record->{'user_id'});
-                                if (!$u_count) { delete_user($hdb,$auth_record->{'user_id'}); }
-                                }
-                        }
-                    }
-                }
-
-            if ($dhcp_record->{hotspot} and $ignore_hotspot_dhcp_log) { next; }
-
-            if ($ignore_update_dhcp_event and $type=~/old/i) { next; }
-
-            if ($decoded_remote_id) { $remote_id = $decoded_remote_id; }
-            if ($decoded_circuit_id) { $circuit_id = $decoded_circuit_id; }
-
-            my $dhcp_log;
-            if (!$auth_id) { $auth_id=0; }
-            $dhcp_log->{'auth_id'} = $auth_id;
-            $dhcp_log->{'ip'} = $dhcp_record->{'ip'};
-            $dhcp_log->{'ip_int'} = $dhcp_record->{'ip_aton'};
-            $dhcp_log->{'mac'} = $dhcp_record->{'mac'};
-            $dhcp_log->{'action'} = $type;
-            $dhcp_log->{'dhcp_hostname'} = $dhcp_record->{'hostname_utf8'};
-            $dhcp_log->{'timestamp'} = $dhcp_event_time;
-            $dhcp_log->{'circuit-id'} = $circuit_id;
-            $dhcp_log->{'client-id'} = $client_id;
-            $dhcp_log->{'remote-id'} = $remote_id;
-
-            insert_record($hdb,'dhcp_log',$dhcp_log);
             }
         };
         if ($@) { log_error("Exception found: $@"); sleep(60); }

+ 1 - 1
scripts/eye-statd.pl

@@ -601,7 +601,7 @@ if ($traf_record->{direction}) {
         #skip create router interface as user
         if (exists $routers_by_ip{$traf_record->{src_ip}}) { next; }
 	if (!$office_networks->match_string($traf_record->{src_ip})) {
-	    log_debug("Unknown src network at router $router_id:: proto=>$traf_record->{proto} src: $traf_record->{src_ip}:$traf_record->{src_port} dst: $traf_record->{dst_ip}:$traf_record->{dst_port}");
+	    log_debug("Unknown src network at router $router_id:: int_in => $traf_record->{snmp_in} int_out=>$traf_record->{snmp_out} proto=>$traf_record->{proto} src: $traf_record->{src_ip}:$traf_record->{src_port} dst: $traf_record->{dst_ip}:$traf_record->{dst_port}");
 	    next;
 	    }
         $user_ip = $traf_record->{src_ip};

+ 150 - 3
scripts/eyelib/database.pm

@@ -50,6 +50,7 @@ GetNowTime
 GetUnixTimeByStr
 GetTimeStrByUnixTime
 get_option
+process_dhcp_request
 get_subnets_ref
 init_db
 init_option
@@ -303,9 +304,8 @@ if ($level eq $L_VERBOSE and $log_level >= $L_VERBOSE) { log_verbose($msg); $db_
 if ($level eq $L_DEBUG and $log_level >= $L_DEBUG) { log_debug($msg); $db_log = 1; }
 
 if ($db_log) {
-    my $history_sql="INSERT INTO worklog(customer,message,level,auth_id) VALUES(".$db->quote($MY_NAME).",".$db->quote($msg).",$level,$auth_id)";
-    my $history_rf=$db->prepare($history_sql) or die "Unable to prepare $history_sql:" . $db->errstr;
-    $history_rf->execute() or die "Unable to execute $history_sql: " . $db->errstr;
+    #my $new_id = do_sql($dbh, 'INSERT INTO User_list (login) VALUES (?)', 'Ivan');
+    do_sql($db,'INSERT INTO worklog(customer,message,level,auth_id,ip) VALUES( ?, ?, ?, ?, ?)',$MY_NAME,$msg,$level,$auth_id,$config_ref{self_ip});
     }
 }
 
@@ -1830,6 +1830,14 @@ $config_ref{version}='';
 my $version_record = get_record_sql($db,"SELECT version FROM version WHERE version is NOT NULL");
 if ($version_record) { $config_ref{version}=$version_record->{version}; }
 
+$config_ref{self_ip} = '127.0.0.1';
+if ($DBHOST ne '127.0.0.1') {
+    my $ip_route = qx(ip r get $DBHOST 2>&1 | head -1);
+    if ($? == 0) {
+        if ($ip_route =~ /src\s+(\d+\.\d+\.\d+\.\d+)/) { $config_ref{self_ip} = $1; }
+        }
+    }
+
 $config_ref{dbh}=$db;
 $config_ref{save_detail}=get_option($db,23);
 $config_ref{add_unknown_user}=get_option($db,22);
@@ -2261,6 +2269,145 @@ my $clean_str = $dbh->quote($clean_date->ymd("-")." 00:00:00");
 do_sql($db,"DELETE FROM `ad_comp_cache` WHERE last_found<=$clean_str");
 }
 
+#--------------------------------------------------------------------------------
+
+sub process_dhcp_request {
+
+my ($db, $type, $mac, $ip, $hostname, $client_id, $circuit_id, $remote_id) = @_;
+
+return if (!$type);
+return if ($type!~/(old|add|del)/i);
+
+my $client_hostname='';
+if ($hostname and ($hostname ne "undef" or $hostname !~ /UNDEFINED/i)) { $client_hostname=$hostname; }
+
+my $auth_network = $office_networks->match_string($ip);
+if (!$auth_network) {
+    log_error("Unknown network in dhcp request! IP: $ip");
+    return;
+    }
+
+if (!$circuit_id) { $circuit_id=''; }
+if (!$client_id) { $client_id = ''; }
+if (!$remote_id) { $remote_id = ''; }
+
+my $timestamp=time();
+
+my $ip_aton=StrToIp($ip);
+$mac=mac_splitted(isc_mac_simplify($mac));
+
+my $dhcp_event_time = GetNowTime($timestamp);
+
+my $dhcp_record;
+$dhcp_record->{'mac'}=$mac;
+$dhcp_record->{'ip'}=$ip;
+$dhcp_record->{'ip_aton'}=$ip_aton;
+$dhcp_record->{'hostname'}=$client_hostname;
+$dhcp_record->{'network'}=$auth_network;
+$dhcp_record->{'type'}=$type;
+$dhcp_record->{'hostname_utf8'}=$client_hostname;
+$dhcp_record->{'timestamp'} = $timestamp;
+$dhcp_record->{'last_time'} = time();
+$dhcp_record->{'circuit-id'} = $circuit_id;
+$dhcp_record->{'client-id'} = $client_id;
+$dhcp_record->{'remote-id'} = $remote_id;
+$dhcp_record->{'hotspot'}=is_hotspot($dbh,$dhcp_record->{ip});
+
+#search actual record
+my $auth_record = get_record_sql($db,'SELECT * FROM User_auth WHERE ip="'.$dhcp_record->{ip}.'" and mac="'.$mac.'" and deleted=0 ORDER BY last_found DESC');
+
+#if record not found and type del => next event
+if (!$auth_record and $type eq 'del') { return; }
+
+#if record not found - create it
+if (!$auth_record and $type=~/(add|old)/i) {
+#        db_log_warning($db,"Record for dhcp request type: ".$type." ip=".$dhcp_record->{ip}." and mac=".$mac." does not exists!");
+        my $res_id = resurrection_auth($db,$dhcp_record);
+        if (!$res_id) {  db_log_error($db,"Error creating an ip address record for ip=".$dhcp_record->{ip}." and mac=".$mac."!");  return; }
+        $auth_record = get_record_sql($db,'SELECT * FROM User_auth WHERE id='.$res_id);
+        db_log_info($db,"Check for new auth. Found id: $res_id",$res_id);
+        }
+
+my $auth_id = $auth_record->{id};
+my $auth_ou_id = $auth_record->{ou_id};
+
+$dhcp_record->{'auth_id'} = $auth_id;
+$dhcp_record->{'auth_ou_id'} = $auth_ou_id;
+
+log_debug(uc($type).">>");
+log_debug("MAC:        ".$dhcp_record->{'mac'});
+log_debug("IP:         ".$dhcp_record->{'ip'});
+log_debug("CIRCUIT-ID: ".$dhcp_record->{'circuit-id'});
+log_debug("REMOTE-ID:  ".$dhcp_record->{'remote-id'});
+log_debug("HOSTNAME:   ".$dhcp_record->{'hostname'});
+log_debug("TYPE:       ".$dhcp_record->{'type'});
+log_debug("TIME:       ".$dhcp_event_time);
+log_debug("AUTH_ID:    ".$auth_id);
+log_debug("END GET");
+
+update_dns_record_by_dhcp($db,$dhcp_record,$auth_record);
+
+if ($type=~/add/i and $dhcp_record->{hostname_utf8}) {
+                my $auth_rec;
+                $auth_rec->{dhcp_hostname} = $dhcp_record->{hostname_utf8};
+                $auth_rec->{dhcp_time}=$dhcp_event_time;
+                $auth_rec->{arp_found}=$dhcp_event_time;
+                $auth_rec->{created_by}='dhcp';
+                db_log_verbose($db,"Add lease by dhcp event for dynamic clients id: $auth_id ip: $dhcp_record->{ip}",$auth_id);
+                update_record($db,'User_auth',$auth_rec,"id=$auth_id");
+                }
+
+if ($type=~/old/i) {
+                my $auth_rec;
+                $auth_rec->{dhcp_action}=$type;
+                $auth_rec->{dhcp_time}=$dhcp_event_time;
+                $auth_rec->{created_by}='dhcp';
+                $auth_rec->{arp_found}=$dhcp_event_time;
+                db_log_verbose($db,"Update lease by dhcp event for dynamic clients id: $auth_id ip: $dhcp_record->{ip}",$auth_id);
+                update_record($db,'User_auth',$auth_rec,"id=$auth_id");
+                }
+
+if ($type=~/del/i and $auth_id) {
+                if ($auth_record->{dhcp_time} =~ /([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})/) {
+                    my $d_time = mktime($6,$5,$4,$3,$2-1,$1-1900);
+                    if (time()-$d_time>60 and (is_dynamic_ou($db,$auth_ou_id) or is_default_ou($db,$auth_ou_id))) {
+                        db_log_info($db,"Remove user ip record by dhcp release event for dynamic clients id: $auth_id ip: $dhcp_record->{ip}",$auth_id);
+                        my $auth_rec;
+                        $auth_rec->{dhcp_action}=$type;
+                        $auth_rec->{dhcp_time}=$dhcp_event_time;
+                        update_record($db,'User_auth',$auth_rec,"id=$auth_id");
+                        #remove user auth record if it belongs to the default pool or it is dynamic
+                        if (is_default_ou($db,$auth_ou_id) or (is_dynamic_ou($db,$auth_ou_id) and $auth_record->{dynamic})) {
+                                delete_user_auth($db,$auth_id);
+                                my $u_count=get_count_records($db,'User_auth','deleted=0 and user_id='.$auth_record->{'user_id'});
+                                if (!$u_count) { delete_user($db,$auth_record->{'user_id'}); }
+                                }
+                        }
+                    }
+                }
+
+if ($dhcp_record->{hotspot} and $ignore_hotspot_dhcp_log) { return $dhcp_record; }
+
+if ($ignore_update_dhcp_event and $type=~/old/i) { return $dhcp_record; }
+
+my $dhcp_log;
+if (!$auth_id) { $auth_id=0; }
+$dhcp_log->{'auth_id'} = $auth_id;
+$dhcp_log->{'ip'} = $dhcp_record->{'ip'};
+$dhcp_log->{'ip_int'} = $dhcp_record->{'ip_aton'};
+$dhcp_log->{'mac'} = $dhcp_record->{'mac'};
+$dhcp_log->{'action'} = $type;
+$dhcp_log->{'dhcp_hostname'} = $dhcp_record->{'hostname_utf8'};
+$dhcp_log->{'timestamp'} = $dhcp_event_time;
+$dhcp_log->{'circuit-id'} = $circuit_id;
+$dhcp_log->{'client-id'} = $client_id;
+$dhcp_log->{'remote-id'} = $remote_id;
+
+insert_record($db,'dhcp_log',$dhcp_log);
+
+return $dhcp_record;
+}
+
 #---------------------------------------------------------------------------------------------------------------
 
 #skip init for upgrade

+ 1 - 0
scripts/eyelib/net_utils.pm

@@ -454,6 +454,7 @@ if ($ch ne ":") { $mac=~s/\:/$ch/g; }
 return $mac;
 }
 
+#--------------------------------------------------------------------------------
 
 InitSubnets();
 

+ 27 - 27
scripts/garbage.pl

@@ -18,6 +18,7 @@ use Date::Parse;
 use eyelib::config;
 use eyelib::database;
 use eyelib::net_utils;
+use eyelib::main;
 use DateTime;
 use Fcntl qw(:flock);
 
@@ -45,7 +46,7 @@ my $optimize = 0;
 
 if ($ARGV[0] =~/optimize/i) { $optimize = 1; }
 
-db_log_info($dbh,'Garbage started.');
+log_info($dbh,'Garbage started.');
 
 sub is_dhcp_pool {
 my $pools = shift;
@@ -94,14 +95,14 @@ $dhcp_conf{$subnet_name}->{last_ip}=$subnet->{dhcp_stop};
 }
 
 if ($day==1) {
-    db_log_info($dbh,'Monthly amnesty started');
-    db_log_verbose($dbh,"Amnistuyemo all blocked user by traffic for a month");
+    log_info($dbh,'Monthly amnesty started');
+    db_log_info($dbh,"Amnistuyemo all blocked user by traffic for a month");
     do_sql($dbh,"Update User_list set blocked=0");
     do_sql($dbh,"Update User_auth set blocked=0, changed=1  WHERE blocked=1 and deleted=0");
-    db_log_info($dbh,'Monthly amnesty stopped');
+    log_info($dbh,'Monthly amnesty stopped');
     } else {
     #month stat
-    db_log_info($dbh,'Daily statistics started');
+    log_info($dbh,'Daily statistics started');
     my $month_sql="SELECT User_list.id, User_list.login, SUM( traf_all ) AS traf_sum, User_list.month_quota as uquota
     FROM ( SELECT User_stats.auth_id, SUM( byte_in + byte_out ) AS traf_all FROM User_stats
     WHERE User_stats.`timestamp`>=$month_start AND User_stats.`timestamp`< $month_stop
@@ -115,10 +116,10 @@ if ($day==1) {
         do_sql($dbh,"UPDATE User_list set blocked=0 WHERE id=$row->{id}");
         do_sql($dbh,"UPDATE User_auth set blocked=0, changed=1 WHERE user_id=$row->{id}");
         }
-    db_log_info($dbh,'Daily statistics stopped');
+    log_info($dbh,'Daily statistics stopped');
     }
 
-db_log_info($dbh,'Clean dhcp leases for dynamic hosts with overdue lease time');
+log_info($dbh,'Clean dhcp leases for dynamic hosts with overdue lease time');
 #clean temporary dhcp leases & connections only for dhcp pool ip
 my $users_sql = "SELECT * FROM User_auth WHERE deleted=0 AND (`ou_id`=".$default_user_ou_id." OR `ou_id`=".$default_hotspot_ou_id.")";
 my @users_auth = get_records_sql($dbh,$users_sql);
@@ -138,7 +139,6 @@ if ($dhcp_networks->match_string($row->{ip})) {
         }
     }
 }
-db_log_info($dbh,'Finished');
 
 $now = DateTime->now(time_zone=>'local');
 
@@ -147,28 +147,28 @@ if ($history_dhcp) {
     my $day_dur = DateTime::Duration->new( days => $history_dhcp );
     my $clean_date = $now - $day_dur;
     my $clean_str = $dbh->quote($clean_date->ymd("-")." 00:00:00");
-    db_log_info($dbh,'Clearing outdated records dhcp log');
+    log_info($dbh,'Clearing outdated records dhcp log');
     do_sql($dbh,"DELETE FROM dhcp_log WHERE `timestamp` < $clean_str" );
-    db_log_verbose($dbh,"Clean dhcp leases for all older that ".$clean_str);
+    log_verbose($dbh,"Clean dhcp leases for all older that ".$clean_str);
 }
 
 ##### clean old connections ########
 if ($connections_history) {
-    db_log_info($dbh,'Clearing outdated connection records');
+    log_info($dbh,'Clearing outdated connection records');
     my $day_dur = DateTime::Duration->new( days => $connections_history );
     my $clean_date = $now - $day_dur;
     my $clean_str = $dbh->quote($clean_date->ymd("-")." 00:00:00");
     $users_sql = "SELECT id FROM User_auth WHERE `last_found` < $clean_str and last_found>0";
-    db_log_debug($dbh,$users_sql) if ($debug);
+    log_debug($dbh,$users_sql) if ($debug);
     @users_auth=get_records_sql($dbh,$users_sql);
     foreach my $row (@users_auth) {
-        db_log_debug($dbh,"Clear old connection for user_auth ".$row->{id});
+        log_debug($dbh,"Clear old connection for user_auth ".$row->{id});
         do_sql($dbh,"DELETE FROM connections WHERE auth_id='".$row->{id}."'");
     }
 }
 
 ##### clean dup connections ########
-db_log_info($dbh,'Clearing duplicated connection records');
+log_info($dbh,'Clearing duplicated connection records');
 my $conn_sql = "SELECT id,port_id,auth_id FROM connections order by port_id";
 my @conn_ref = get_records_sql($dbh,$conn_sql);
 my $old_port_id=0;
@@ -183,11 +183,11 @@ if ($old_port_id ==0 or $old_auth_id==0) { $old_port_id=$c_port_id; $old_auth_id
 if ($old_port_id >0 and $old_port_id != $c_port_id) { $old_port_id=$c_port_id; $old_auth_id=$c_auth_id; next; }
 if ($old_auth_id >0 and $old_auth_id != $c_auth_id) { $old_port_id=$c_port_id; $old_auth_id=$c_auth_id; next; }
 do_sql($dbh,"DELETE FROM connections WHERE id='".$c_id."'");
-db_log_info($dbh,"Remove dup connection $c_id: $c_port_id $c_auth_id");
+log_info($dbh,"Remove dup connection $c_id: $c_port_id $c_auth_id");
 }
 
 ##### clean empty user account and corresponded devices for dynamic users and hotspot ################
-db_log_info($dbh,'Clearing empty user account and corresponded devices for dynamic users and hotspot');
+log_info($dbh,'Clearing empty user account and corresponded devices for dynamic users and hotspot');
 my $u_sql = "SELECT * FROM User_list as U WHERE (U.ou_id=".$default_hotspot_ou_id." OR U.ou_id=".$default_user_ou_id.") AND (SELECT COUNT(*) FROM User_auth WHERE User_auth.deleted=0 AND User_auth.user_id = U.id)=0";
 my @u_ref = get_records_sql($dbh,$u_sql);
 foreach my $row (@u_ref) {
@@ -197,7 +197,7 @@ delete_user($dbh,$row->{id});
 
 ##### clean empty user account and corresponded devices ################
 if ($config_ref{clean_empty_user}) {
-    db_log_info($dbh,'Clearing empty user account and corresponded devices');
+    log_info($dbh,'Clearing empty user account and corresponded devices');
 #    my $u_sql = "SELECT * FROM User_list as U WHERE (SELECT COUNT(*) FROM User_auth WHERE User_auth.deleted=0 AND User_auth.user_id = U.id)=0 AND (SELECT COUNT(*) FROM auth_rules WHERE auth_rules.user_id = U.id)=0";
 #    my $u_sql = "SELECT * FROM User_list as U WHERE (SELECT COUNT(*) FROM User_auth WHERE User_auth.deleted=0 AND User_auth.user_id = U.id)=0";
     my $u_sql = "SELECT * FROM User_list as U WHERE U.permanent=0 AND (SELECT COUNT(*) FROM User_auth WHERE User_auth.deleted=0 AND User_auth.user_id = U.id)=0 AND (SELECT COUNT(*) FROM auth_rules WHERE auth_rules.user_id = U.id)=0;";
@@ -212,7 +212,7 @@ if ($config_ref{clean_empty_user}) {
 do_sql($dbh, "DELETE FROM `auth_rules` WHERE user_id NOT IN (SELECT id FROM User_list)");
 
 ##### unknown mac clean ############
-db_log_info($dbh,'Clearing unknown mac if it found in current User_auth table');
+log_info($dbh,'Clearing unknown mac if it found in current User_auth table');
 $users_sql = "SELECT mac FROM User_auth WHERE deleted=0";
 @users_auth = get_records_sql($dbh,$users_sql);
 foreach my $row (@users_auth) {
@@ -226,7 +226,7 @@ if ($history) {
     my $day_dur = DateTime::Duration->new( days => $history );
     my $clean_date = $now - $day_dur;
     my $clean_str = $dbh->quote($clean_date->ymd("-")." 00:00:00");
-    db_log_info($dbh,"Clean traffic detail older that ".$clean_str);
+    log_info($dbh,"Clean traffic detail older that ".$clean_str);
     #clean old traffic detail
     do_sql($dbh,"DELETE FROM Traffic_detail WHERE `timestamp` < $clean_str" );
 }
@@ -237,7 +237,7 @@ if ($history_log_day) {
     my $day_dur = DateTime::Duration->new( days => $history_log_day );
     my $clean_date = $now - $day_dur;
     my $clean_str = $dbh->quote($clean_date->ymd("-")." 00:00:00");
-    db_log_info($dbh,"Clean VERBOSE worklog older that ".$clean_str);
+    log_info($dbh,"Clean VERBOSE worklog older that ".$clean_str);
     do_sql($dbh,"DELETE FROM worklog WHERE level>$L_INFO AND `timestamp` < $clean_str" );
 }
 
@@ -246,7 +246,7 @@ if ($debug_history) {
     my $day_dur = DateTime::Duration->new( days => 3 );
     my $clean_date = $now - $day_dur;
     my $clean_str = $dbh->quote($clean_date->ymd("-")." 00:00:00");
-    db_log_info($dbh,"Clean debug worklog older that ".$clean_str);
+    log_info($dbh,"Clean debug worklog older that ".$clean_str);
     do_sql($dbh,"DELETE FROM worklog WHERE level>=$L_DEBUG AND `timestamp` < $clean_str" );
 }
 
@@ -256,7 +256,7 @@ if ($history_syslog_day) {
     my $day_dur = DateTime::Duration->new( days => $history_syslog_day );
     my $clean_date = $now - $day_dur;
     my $clean_str = $dbh->quote($clean_date->ymd("-")." 00:00:00");
-    db_log_info($dbh,"Clean syslog older that ".$clean_str);
+    log_info($dbh,"Clean syslog older that ".$clean_str);
     do_sql($dbh,"DELETE FROM remote_syslog WHERE `date` < $clean_str" );
 }
 
@@ -266,7 +266,7 @@ if ($history_trafstat_day) {
     my $day_dur = DateTime::Duration->new( days => $history_trafstat_day );
     my $clean_date = $now - $day_dur;
     my $clean_str = $dbh->quote($clean_date->ymd("-")." 00:00:00");
-    db_log_info($dbh,"Clean traffic statistics older that ".$clean_str);
+    log_info($dbh,"Clean traffic statistics older that ".$clean_str);
     do_sql($dbh,"DELETE FROM User_stats WHERE `timestamp` < $clean_str" );
 }
 
@@ -276,7 +276,7 @@ if ($iptraf_history) {
     my $day_dur = DateTime::Duration->new( days => $iptraf_history );
     my $clean_date = $now - $day_dur;
     my $clean_str = $dbh->quote($clean_date->ymd("-")." 00:00:00");
-    db_log_info($dbh,"Clean traffic full statistics older that ".$clean_str);
+    log_info($dbh,"Clean traffic full statistics older that ".$clean_str);
     do_sql($dbh,"DELETE FROM User_stats_full WHERE `timestamp` < $clean_str" );
 }
 
@@ -333,7 +333,7 @@ foreach my $auth (@auth_full_list) {
 }
 
 if ( $optimize ) {
-    db_log_info($dbh,'Start optimize tables');
+    log_info($dbh,'Start optimize tables');
     foreach my $table (@db_tables) {
         my $opt_sql = "optimize table ".$table;
         my $opt_rf=$dbh->prepare($opt_sql) or die "Unable to prepare $opt_sql:" . $dbh->errstr;
@@ -344,10 +344,10 @@ if ( $optimize ) {
         #RENAME TABLE `".$table.".new` TO $table;
         #DROP TABLE `".$table.".backup`;";
         }
-    db_log_info($dbh,'Optimize ended.');
+    log_info($dbh,'Optimize ended.');
     }
 
-db_log_info($dbh,'Garbage stopped.');
+log_info($dbh,'Garbage stopped.');
 $dbh->disconnect;
 
 exit 0;

+ 15 - 10
scripts/print-dnsmasq.pl

@@ -32,18 +32,9 @@ binmode(STDOUT,':utf8');
 
 setpriority(0,0,19);
 
-my %dhcp_conf;
-
-my $connected = new Net::Patricia;
 my $dhcp_networks = new Net::Patricia;
 
-my $int_addr=do_exec('/sbin/ip addr show | grep "scope global"');
-foreach my $address (split(/\n/,$int_addr)) {
-if ($address=~/inet\s+(.*)\s+brd/i) {
-    if ($1) { $connected->add_string($1); }
-    }
-}
-
+my %dhcp_conf;
 my %static_hole;
 my %mac_subnets;
 
@@ -77,6 +68,20 @@ next if (!$row->{mac});
 next if (!$row->{ip});
 next if (is_default_ou($dbh,$row->{ou_id}));
 if (exists $static_hole{$row->{ip}}) { $static_hole{$row->{ip}}{skip}=1; }
+
+my $subnet = $dhcp_networks->match_string($row->{ip});
+$mac_subnets{$subnet} ||= {
+        name => $subnet,
+        macs => {}
+    };
+if (exists $mac_subnets{$subnet}{macs}{$row->{mac}}) {
+    my $old_row = $mac_subnets{$subnet}{macs}{$row->{mac}};
+    db_log_warning($dbh,"Mac $row->{mac} already exists in DHCP fo subnet $subnet! auth_id: $row->{id} and auth_id: $old_row->{id}");
+    next;
+    }
+
+$mac_subnets{$subnet}{macs}{$row->{mac}} = $row;
+
 print '#Comment:'.$row->{comments}."\n" if ($row->{comments});
 my $dns_name = '';
 if ($row->{dns_name}) {

+ 83 - 62
scripts/stat-sync.pl

@@ -25,6 +25,8 @@ use Cwd;
 use Net::Netmask;
 use DateTime;
 
+my $mute_time=300;
+
 my $pf = '/run/eye/stat-sync.pid';
 
 my $daemon = Proc::Daemon->new(
@@ -84,79 +86,98 @@ if (!$pid) {
 
     setpriority(0,0,19);
 
+    my %leases;
+
     while (1) {
+
         eval {
+
         # Create new database handle. If we can't connect, die()
         my $hdb = init_db();
-        if (time()-$last_refresh_config>=60) { init_option($hdb); }
-        $urgent_sync=get_option($hdb,50);
-        if ($urgent_sync) {
-	    #clean changed for dynamic clients or hotspot
-	    do_sql($hdb,"UPDATE User_auth SET changed=0 WHERE ou_id=".$default_user_ou_id." OR ou_id=".$default_hotspot_ou_id);
-	    do_sql($hdb,"UPDATE User_auth SET dhcp_changed=0 WHERE ou_id=".$default_user_ou_id." OR ou_id=".$default_hotspot_ou_id);
-	    #clean unmanagment ip changed
-	    my @all_changed = get_records_sql($hdb,"SELECT id, ip FROM User_auth WHERE changed = 1 OR dhcp_changed = 1");
-	    foreach my $row(@all_changed) {
-		    next if ($office_networks->match_string($row->{ip}));
-		    do_sql($hdb,"UPDATE User_auth SET changed = 0, dhcp_changed = 0  WHERE id=".$row->{id});
-		}
-            #dhcp changed records
-            my $changed = get_record_sql($hdb,"SELECT COUNT(*) as c_count from User_auth WHERE dhcp_changed=1");
-            if ($changed->{"c_count"}>0) {
-        	    do_sql($hdb,"UPDATE User_auth SET dhcp_changed=0");
-                    log_info("Found changed dhcp variables in records: ".$changed->{'c_count'});
-                    my $dhcp_exec=get_option($hdb,38);
-	            my %result=do_exec_ref('/usr/bin/sudo '.$dhcp_exec);
-	            if ($result{status} ne 0) { log_error("Error sync dhcp config"); }
-	        }
-            #acl & dhcp changed records 
-            $changed = get_record_sql($hdb,"SELECT COUNT(*) as c_count from User_auth WHERE changed=1");
-	    if ($changed->{"c_count"}>0) {
-                    log_info("Found changed records: ".$changed->{'c_count'});
-                    my $acl_exec=get_option($hdb,37);
-                    my %result=do_exec_ref($acl_exec);
-	            if ($result{status} ne 0) { log_error("Error sync status at gateways"); }
-		}
-	    }
-
-        #dns changed records
-        my @dns_changed = get_records_sql($hdb,"SELECT auth_id FROM `dns_queue` GROUP BY auth_id");
-        if (@dns_changed and scalar @dns_changed) {
+
+        #process dhcp queue per 10 sec.
+        my @dhcp_events = get_records_sql($hdb,"SELECT * FROM dhcp_queue");
+        if (@dhcp_events and scalar @dhcp_events) {
+            foreach my $dhcp (@dhcp_events) {
+                process_dhcp_request($hdb, $dhcp->{action}, $dhcp->{mac}, $dhcp->{ip}, $dhcp->{dhcp_hostname}, '', '', '')
+                        unless exists $leases{$dhcp->{ip}} && $leases{$dhcp->{ip}}{'action'} ne $dhcp->{action} && time() - $leases{$dhcp->{ip}}{'last_time'} <= $mute_time;
+                $leases{$dhcp->{ip}}=$dhcp;
+                do_sql($hdb,"DELETE FROM dhcp_queue WHERE id=".$dhcp->{id});
+                }
+            }
+
+        #udpate 
+        if (time()-$last_refresh_config>=60)  {
+
+            #refresh settings
+            init_option($hdb);
+
+            $urgent_sync=get_option($hdb,50);
+            if ($urgent_sync) {
+                    #clean changed for dynamic clients or hotspot
+        	    do_sql($hdb,"UPDATE User_auth SET changed=0 WHERE ou_id=".$default_user_ou_id." OR ou_id=".$default_hotspot_ou_id);
+                    do_sql($hdb,"UPDATE User_auth SET dhcp_changed=0 WHERE ou_id=".$default_user_ou_id." OR ou_id=".$default_hotspot_ou_id);
+        	    #clean unmanagment ip changed
+	            my @all_changed = get_records_sql($hdb,"SELECT id, ip FROM User_auth WHERE changed = 1 OR dhcp_changed = 1");
+        	    foreach my $row(@all_changed) {
+	        	    next if ($office_networks->match_string($row->{ip}));
+		            do_sql($hdb,"UPDATE User_auth SET changed = 0, dhcp_changed = 0  WHERE id=".$row->{id});
+		            }
+                    #dhcp changed records
+                    my $changed = get_record_sql($hdb,"SELECT COUNT(*) as c_count from User_auth WHERE dhcp_changed=1");
+                    if ($changed->{"c_count"}>0) {
+                	    do_sql($hdb,"UPDATE User_auth SET dhcp_changed=0");
+                            log_info("Found changed dhcp variables in records: ".$changed->{'c_count'});
+                            my $dhcp_exec=get_option($hdb,38);
+	                    my %result=do_exec_ref('/usr/bin/sudo '.$dhcp_exec);
+	                    if ($result{status} ne 0) { log_error("Error sync dhcp config"); }
+                            }
+                    #acl & dhcp changed records 
+                    $changed = get_record_sql($hdb,"SELECT COUNT(*) as c_count from User_auth WHERE changed=1");
+	            if ($changed->{"c_count"}>0) {
+                            log_info("Found changed records: ".$changed->{'c_count'});
+                            my $acl_exec=get_option($hdb,37);
+                            my %result=do_exec_ref($acl_exec);
+	                    if ($result{status} ne 0) { log_error("Error sync status at gateways"); }
+		            }
+	            }
+            #dns changed records
+            my @dns_changed = get_records_sql($hdb,"SELECT auth_id FROM `dns_queue` GROUP BY auth_id");
+            if (@dns_changed and scalar @dns_changed) {
                     foreach my $auth (@dns_changed) {
                         update_dns_record($hdb,$auth->{auth_id});
                         log_info("Clear changed dns for auth id: ".$auth->{auth_id});
                         do_sql($hdb,"DELETE FROM `dns_queue` WHERE auth_id=".$auth->{auth_id});
-                    }
-	    }
-
-        #clear temporary user auth records
-        my $now = DateTime->now(time_zone=>'local');
-        my $clear_time =$dbh->quote($now->strftime('%Y-%m-%d %H:%M:%S'));
-        my $users_sql = "SELECT * FROM User_auth WHERE deleted=0 AND dynamic=1 AND `eof`<=".$clear_time;
-        my @users_auth = get_records_sql($hdb,$users_sql);
-        if (@users_auth and scalar @users_auth) {
-            foreach my $row (@users_auth) {
-                delete_record($hdb,"User_auth","id='".$row->{id}."'");
-                db_log_info($hdb,"Removed dynamic user auth record for auth_id: $row->{'id'} by eof time: $row->{'eof'}",$row->{'id'});
-                my $u_count=get_count_records($hdb,'User_auth','deleted=0 and user_id='.$row->{user_id});
-                if (!$u_count) {
-                    delete_record($hdb,"User_list","id=".$row->{'user_id'});
-                    db_log_info($hdb,"Removed dynamic user id: $row->{'user_id'} by eof time");
-                    #delete binded device
-                    my $user_device = get_record_sql($hdb,"SELECT * FROM devices WHERE user_id=".$row->{id});
-                    if ($user_device) {
-                        db_log_info($hdb,"Remove corresponded device id: $user_device->{id} name: $user_device->{device_name}");
-                        unbind_ports($hdb, $user_device->{id});
-                        do_sql($hdb, "DELETE FROM connections WHERE device_id=".$user_device->{id});
-                        do_sql($hdb, "DELETE FROM device_l3_interfaces WHERE device_id=".$user_device->{id});
-                        do_sql($hdb, "DELETE FROM device_ports WHERE device_id=".$user_device->{id});
-                        delete_record($hdb, "devices", "id=".$user_device->{id});
+                        }
+	            }
+            #clear temporary user auth records
+            my $now = DateTime->now(time_zone=>'local');
+            my $clear_time =$dbh->quote($now->strftime('%Y-%m-%d %H:%M:%S'));
+            my $users_sql = "SELECT * FROM User_auth WHERE deleted=0 AND dynamic=1 AND `eof`<=".$clear_time;
+            my @users_auth = get_records_sql($hdb,$users_sql);
+            if (@users_auth and scalar @users_auth) {
+                    foreach my $row (@users_auth) {
+                        delete_record($hdb,"User_auth","id='".$row->{id}."'");
+                        db_log_info($hdb,"Removed dynamic user auth record for auth_id: $row->{'id'} by eof time: $row->{'eof'}",$row->{'id'});
+                        my $u_count=get_count_records($hdb,'User_auth','deleted=0 and user_id='.$row->{user_id});
+                        if (!$u_count) {
+                                delete_record($hdb,"User_list","id=".$row->{'user_id'});
+                                db_log_info($hdb,"Removed dynamic user id: $row->{'user_id'} by eof time");
+                                #delete binded device
+                                my $user_device = get_record_sql($hdb,"SELECT * FROM devices WHERE user_id=".$row->{id});
+                                if ($user_device) {
+                                        db_log_info($hdb,"Remove corresponded device id: $user_device->{id} name: $user_device->{device_name}");
+                                        unbind_ports($hdb, $user_device->{id});
+                                        do_sql($hdb, "DELETE FROM connections WHERE device_id=".$user_device->{id});
+                                        do_sql($hdb, "DELETE FROM device_l3_interfaces WHERE device_id=".$user_device->{id});
+                                        do_sql($hdb, "DELETE FROM device_ports WHERE device_id=".$user_device->{id});
+                                        delete_record($hdb, "devices", "id=".$user_device->{id});
+                                        }
+                                }
                         }
                     }
-                }
             }
-
-	sleep(60);
+	sleep(10);
         };
         if ($@) { log_error("Exception found: $@"); sleep(300); }
         }

+ 1 - 0
scripts/updates/2-7-0/version.sql

@@ -0,0 +1 @@
+REPLACE INTO `version` (`version`) VALUES ('2.7.0');

+ 1 - 0
scripts/updates/2-7-1/version.sql

@@ -0,0 +1 @@
+REPLACE INTO `version` (`version`) VALUES ('2.7.1');

+ 1 - 0
scripts/updates/2-7-2/version.sql

@@ -0,0 +1 @@
+REPLACE INTO `version` (`version`) VALUES ('2.7.2');

+ 1 - 0
scripts/updates/2-7-3/version.sql

@@ -0,0 +1 @@
+REPLACE INTO `version` (`version`) VALUES ('2.7.3');

+ 4 - 0
scripts/updates/2-8-0/after_sql.pl

@@ -88,6 +88,10 @@ foreach my $row (@authlist_ref) {
     }
 }
 
+print "Stage 2: Fix systemd units\n";
+
+do_exec("2-8-0/udpate-services.sh");
+
 print "Done!\n";
 
 exit;

+ 3 - 0
scripts/updates/2-8-0/compact.sql

@@ -0,0 +1,3 @@
+ALTER TABLE worklog ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
+ALTER TABLE dhcp_log ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
+ALTER TABLE remote_syslog ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

+ 11 - 0
scripts/updates/2-8-0/dhcp-log-truncate.service

@@ -0,0 +1,11 @@
+[Unit]
+Description=Clear dhcp.log before starting dhcp-log
+Before=dhcp-log.service
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/truncate -s 0 /var/log/dhcp.log
+User=root
+
+[Install]
+WantedBy=multi-user.target

+ 19 - 0
scripts/updates/2-8-0/dhcp-log.service

@@ -0,0 +1,19 @@
+[Unit]
+Description=Write dhcp events to Eye
+After=network.target mariadb.service dnsmasq.service dhcpd.service dhcp-log-truncate.service
+Requires=dhcp-log-truncate.service
+
+[Service]
+Type=forking
+User=eye
+Group=eye
+RuntimeDirectory=eye
+RuntimeDirectoryMode=0700
+RuntimeDirectoryPreserve=yes
+ExecStart=/opt/Eye/scripts/dhcp-log.pl --start
+PIDFile=/run/eye/dhcp-log.pid
+RestartSec=30
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target

+ 1 - 0
scripts/updates/2-8-0/dhcp_queue.sql

@@ -0,0 +1 @@
+CREATE TABLE `dhcp_queue` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `mac` varchar(17) NOT NULL, `ip` varchar(15) NOT NULL, `action` varchar(10) NOT NULL, `timestamp` timestamp NOT NULL DEFAULT current_timestamp(), `dhcp_hostname` varchar(250) DEFAULT NULL, PRIMARY KEY (`id`), KEY `timestamp` (`timestamp`,`action`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

+ 2 - 0
scripts/updates/2-8-0/override.conf

@@ -0,0 +1,2 @@
+[Service]
+ExecStartPre=/usr/bin/truncate -s 0 /var/log/dhcp.log

+ 1 - 0
scripts/updates/2-8-0/remote_syslog.sql

@@ -0,0 +1 @@
+ALTER TABLE `remote_syslog` DROP INDEX `message`;

+ 17 - 0
scripts/updates/2-8-0/udpate-services.sh

@@ -0,0 +1,17 @@
+#!/bin/bash
+
+if [ ! -e /etc/systemd/system/dnsmasq.service.d ]; then
+    mkdir -p /etc/systemd/system/dnsmasq.service.d
+    fi
+
+cat 2-8-0/override.conf >/etc/systemd/system/dnsmasq.service.d/override.conf
+cat 2-8-0/dhcp-log-truncate.service >/etc/systemd/system/dhcp-log-truncate.service
+cat 2-8-0/dhcp-log.service >/etc/systemd/system/dhcp-log.service
+
+systemctl daemon-reload
+systemctl enable dhcp-log-truncate.service
+systemctl restart dhcp-log.service
+
+exit 0
+
+

+ 12 - 0
scripts/updates/2-8-0/worklog.sql

@@ -0,0 +1,12 @@
+ALTER TABLE `worklog` ADD `ip` VARCHAR(18) NOT NULL DEFAULT '127.0.0.1' AFTER `customer`;
+ALTER TABLE `worklog` CHANGE `level` `level` ENUM('0','1','2','3','255') NOT NULL DEFAULT '1';
+
+ALTER TABLE `worklog` DROP INDEX `timestamp`;
+ALTER TABLE `worklog` DROP INDEX `level`;
+ALTER TABLE `worklog` DROP INDEX `IP`;
+ALTER TABLE `worklog` DROP INDEX `customer`;
+ALTER TABLE `worklog` DROP INDEX `auth_id`;
+
+ALTER TABLE `worklog` ADD INDEX `idx_timestamp` (`level`, `timestamp`);
+ALTER TABLE `worklog` ADD INDEX `idx_customer` (`customer`, `level`, `timestamp`);
+ALTER TABLE `worklog` ADD INDEX `idx_auth_id` (`auth_id`, `level`, `timestamp`);