Abills NMS Addon
Abills Addons
В связи с тем, что появилась необходимость доработать Abills до уровня AI, сюда заношу действия которые были проделаны. Все что написано ниже устарело. новая статья в разработке.
Програмное обеспечение
Что бы полностью отвязать свой код от оригинального использую nginx вместо apache php подключаю через fastcgi (нужно установить lighttpd, от него я использую spawn-fcgi)
dev-lang/php apache2 berkdb bzip2 cli crypt ctype ftp gd gdbm iconv imap mysql ncurses nls pcre readline reflection session sockets spl ssl unicode xml zip zlib -adabas -bcmath -birdstep -calendar -cdb cgi -cjk -concurrentmodphp -curl -curlwrappers -db2 -dbase -dbmaker -debug -discard-path -doc -empress -empress-bcs -esoob -exif -fastbuild -fdftk -filter -firebird -flatfile -force-cgi-redirect -frontbase -gd-external -gmp -hash -inifile -interbase -iodbc -ipv6 (-java-external) -json -kerberos -kolab -ldap -ldap-sasl -libedit -mcve -mhash -msql -mssql -mysqli -oci8 -oci8-instant-client -odbc -pcntl pdo pic -posix -postgres -qdbm -recode -sapdb -sharedext -sharedmem -simplexml -snmp -soap -solid -spell -sqlite -suhosin -sybase -sybase-ct -sysvipc threads -tidy -tokenizer -truetype -wddx -xmlreader -xmlrpc -xmlwriter -xpm -xsl -yaz -zip-external www-servers/nginx imap pcre perl ssl zlib addition -debug fastcgi flv status sub webdav www-servers/lighttpd bzip2 gdbm mysql pcre ssl -doc fam fastcgi -ipv6 -ldap -lua -memcache -minimal php rrdtool -test -webdav -xattr
Сервер достался уже готовым, почему apache и php собраны именнно так - не разбирался.
Изменение в БД
Использование нужного мне функционала подразумевате, что в биллинге содержиться информация о каждом активном порту, т.к. эта информация необходима для использования option 82.
Я не нашел этой информации в имеющейся инсталляции, потому часть таблиц пришлось добавить. Не уверен что это идеальный вариант.
Для того что бы отвязать свой код от базы Abills и свести к минимуму возможные изменения в случае изменения формата базы, использую представления.
Предсьавление для авторизованных клииентов. (для них допустима нормальная работа)
DROP VIEW IF EXISTS view_dhcp_config_authorized; CREATE VIEW view_dhcp_config_authorized AS SELECT INET_NTOA(dhcphosts_hosts.ip) AS ip, INET_NTOA(dhcphosts_networks.network) AS subnet, 1 as enabled, dhcphosts_hosts.mac AS mac, nas.name AS bs_id, nas.ip AS bs_ip, dhcphosts_hosts.ports AS port_number, 300 AS lease_time, INET_NTOA(dhcphosts_networks.mask) AS netmask, INET_NTOA(dhcphosts_networks.network+1) AS router, INET_NTOA(dhcphosts_hosts.ip | (dhcphosts_networks.mask ^ (power(2, 32) - 1))) AS broadcast FROM dhcphosts_hosts, dhcphosts_networks, nas WHERE (dhcphosts_hosts.ip & dhcphosts_networks.mask=dhcphosts_networks.network) AND nas.id=dhcphosts_hosts.nas;
Представление для неавторизованных клиентов.
DROP VIEW IF EXISTS view_dhcp_config_jail; CREATE VIEW view_dhcp_config_jail AS SELECT dhcphosts_vlans.vlan_id AS vlan_id, INET_NTOA(dhcphosts_networks_jails.network_unauth) AS subnet, nas.id AS bs_id, nas.ip AS bs_ip, dhcphosts_nas_ports.port as port_number, 30 AS lease_time, INET_NTOA(dhcphosts_networks.mask) AS netmask, INET_NTOA(dhcphosts_networks_jails.network_unauth+1) AS router, INET_NTOA(dhcphosts_networks_jails.network_unauth | (dhcphosts_networks.mask ^ (power(2, 32) - 1))) AS broadcast, INET_NTOA(dhcphosts_networks_jails.network_unauth+2) AS first_addr, INET_NTOA(dhcphosts_networks_jails.network_unauth | (dhcphosts_networks.mask ^ (power(2, 32) - 2))) AS last_addr, dhcphosts_hosts.mac as mac FROM ( dhcphosts_vlans INNER JOIN ( nas INNER JOIN dhcphosts_nas_ports on(dhcphosts_nas_ports.nas_id=nas.id) ) ON(dhcphosts_nas_ports.vlan_id=dhcphosts_vlans.vlan_id) ) INNER JOIN dhcphosts_networks_jails ON (dhcphosts_networks_jails.id=dhcphosts_vlans.network_id) INNER JOIN dhcphosts_networks ON(dhcphosts_networks.id=dhcphosts_networks_jails.id) LEFT JOIN dhcphosts_hosts ON(dhcphosts_hosts.vid=dhcphosts_vlans.vlan_id);
Таблица с описанием всх портов всех NAS (в моем случае NAS - это коммутаторы, Dlink DES-3550)
DROP TABLE IF EXISTS dhcphosts_nas_ports; CREATE TABLE dhcphosts_nas_ports ( id smallint(3) unsigned NOT NULL, vlan_id int(10) unsigned NOT NULL default '0', nas_id int(10) unsigned NOT NULL default '0', port int(10) unsigned NOT NULL default '0', comments varchar(250) NOT NULL default '', UNIQUE KEY nas_port(nas_id,port) );
Описание вланов (что бы можно было сопоставить сеть и влан)
DROP TABLE IF EXISTS dhcphosts_vlans; CREATE TABLE dhcphosts_vlans ( id smallint(3) unsigned NOT NULL, name varchar(40) NOT NULL default '', vlan_id int(10) unsigned NOT NULL default '0', nas_id int(10) unsigned NOT NULL default '0', network_id int(10) unsigned NOT NULL default '0', comments varchar(250) NOT NULL default '' );
Описание для сетей которые используются для неавторизованных клиентов.
DROP TABLE IF EXISTS dhcphosts_networks_jails; CREATE TABLE dhcphosts_networks_jails ( id smallint(3) unsigned NOT NULL UNIQUE, name varchar(40) NOT NULL default '', network_unauth int(10) unsigned NOT NULL default '0', network_nopay int(10) unsigned NOT NULL default '0', dns_unauth varchar(100) NOT NULL default '', dns_nopay varchar(100) NOT NULL default '', routers_unauth int(11) unsigned NOT NULL default '0', routers_nopay int(11) unsigned NOT NULL default '0', disable tinyint(1) unsigned NOT NULL default '0', comments varchar(250) NOT NULL default '' );
Редирект абонентов на другой порт=
iptables -t nat -A PREROUTING -i eth1.101 -s 10.0.0.0/16 -p tcp --dport 80 -j DNAT --to-destination 172.16.253.2:998