vop Опубликовано 5 октября, 2016 · Жалоба Зачем иметь два набора адресов, если рабочие ip один фиг управляются в индивидуальном порядке? Не могли бы пояснить? Что именно? Зачем городить огород с двумя наборами "хороших" и "не очень" ip адресов? В мир выпускаются только активные адреса. Все остальные - неактивные, должники и т.п., допускаются только к прафайлу и платежным формам. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
itt1b Опубликовано 5 октября, 2016 · Жалоба Зачем иметь два набора адресов, если рабочие ip один фиг управляются в индивидуальном порядке? Не могли бы пояснить? Что именно? Зачем городить огород с двумя наборами "хороших" и "не очень" ip адресов? В мир выпускаются только активные адреса. Все остальные - неактивные, должники и т.п., допускаются только к прафайлу и платежным формам. У меня сделано так: серые адреса выдаются еще неизвестному системе оборудованию, а белые адреса - уже известному и закрепленному за абонентом. При задолженности белые адреса на ISG заруливаются на личный кабинет. Перерасход белых адресов на должниках конечно есть, но пока не критично, а далее можно просто особо злостным неплательщикам (2-3 мес) просто снимать привязку. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
iValera Опубликовано 6 октября, 2016 · Жалоба Зачем иметь два набора адресов, если рабочие ip один фиг управляются в индивидуальном порядке? Не могли бы пояснить? Что именно? Зачем городить огород с двумя наборами "хороших" и "не очень" ip адресов? В мир выпускаются только активные адреса. Все остальные - неактивные, должники и т.п., допускаются только к прафайлу и платежным формам. Тогда видится навешивание forward policy на адрес ipoe портала, при удачной авторизации она снимается. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
gofman Опубликовано 9 октября, 2016 (изменено) · Жалоба Добрый вечер! Подскажите как обстоят дела с внешними пакетами и своей обработкой, можно ли сделать свой пакет на pl/sql и потом подвязать на выполнение определенные функции через "Задания", в документации вроде описано: - Внешнее — задание, которое выполняется не ядром системы, а некоторым внешним приложением; - Пользовательское — задание, разработанное для конкретного оператора связи. Но как повесить не нашел или это возможно только через ТП и когда они сами разрабатывают ? Или весь этот вэб подвязан к стандартному оракловскому планировщику заданий и собственно мне ни кто не мешает так запускать ? Просьба не пинать, только осваиваю данный биллинг. Изменено 9 октября, 2016 пользователем gofman Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
decuplet Опубликовано 9 октября, 2016 · Жалоба Лучше спросить ТП, они скажут какие процедуры вызывать, дадут пример, либо сами вызовут (там одна процедура на «регистрацию задания»). Планировщик свой, лучше делать через него, иначе потом будет сложнее управлять заданием. Процедура должна быть с определенным интерфейсом, но это требование несложно соблюсти. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dyadyajack Опубликовано 23 октября, 2016 (изменено) · Жалоба вам говорил, что цена взята “не с потолка” и в разы просто так не уменьшается, а без внедрения Гидру брать опасно. тю, так мож сразу тогда предупреждать, что мол хотите заюзать? так к цене лицензии прибавьте х1,5 стоимости внедрения, так как сами без наших специалистов с оплатой их работы вы не сможете это сделать. и немного отсыпьте для обучения своего колл-центра ити ТП. в чем проблема сразу так писать, что бы не было таких вот 11 компаний. Изменено 23 октября, 2016 пользователем dyadyajack Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Wingman Опубликовано 24 октября, 2016 · Жалоба вам говорил, что цена взята “не с потолка” и в разы просто так не уменьшается, а без внедрения Гидру брать опасно. тю, так мож сразу тогда предупреждать, что мол хотите заюзать? так к цене лицензии прибавьте х1,5 стоимости внедрения, так как сами без наших специалистов с оплатой их работы вы не сможете это сделать. и немного отсыпьте для обучения своего колл-центра ити ТП. в чем проблема сразу так писать, что бы не было таких вот 11 компаний. Насколько я помню наш процесс покупки, нам не раз и не два всячески указывали, что _крайне_ желательно брать внедрение. И да, оно стоит столько-то, столько-то. Цен никто не скрывал. Подробно отвечали на вопросы и описывали, что к чему. "Не сможете это сделать" - говорить нельзя, поскольку это не корректно. Кто-то сможет, кто-то (большинство) - нет, или потратит на порядок больше времени. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Wingman Опубликовано 27 октября, 2016 · Жалоба Делюсь своими наработками под гидру, мб кому-нибуть пригодится: Софтина на гошечке, пингующая на равсокете все коммутаторы в БД и ставящее/снимающее им флаг "живой". Кроме изменения в БД, при изменении состояния свитча дёргается указанная в конфиге ссылка - при событии можно какими-нибуть средствами слать уведомления заинтересованным. Несколько тысяч свитчей у нас обходит примерно за минуту. https://github.com/ircop/go-hpinger snmp-поллер для оборудования, хранящегося в Гидре. Шлёт данные в graphite/carbon-daemon. Несколько тысяч свитчей обходит за полторы-две минуты. https://github.com/ircop/hpoller PHP-Api для Гидры, работающее с её oracle API. Наверное, достаточно узкоприменимо, т.к. требует php7 и жестко привязано к фреймворку Laravel. Но с его помощью очень удобно творить с API почти всё, что угодно. https://repo.ip-home.net/wingman/hapi Сейчас поддерживаются только две версии: 3.4.5 и 4.0 (3.4.5 у нас в продакшне, на 4.0 потихоньку пробуем перелазить). Сответственно, ветки нужно выбирать releases/3.4.5 или releases/4.0 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
decuplet Опубликовано 27 октября, 2016 · Жалоба Респект за го :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
kamae1ka Опубликовано 1 ноября, 2016 · Жалоба Но с его помощью очень удобно творить с API почти всё, что угодно. а изкаробки не удобно? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Wingman Опубликовано 1 ноября, 2016 · Жалоба Но с его помощью очень удобно творить с API почти всё, что угодно. а изкаробки не удобно? Из коробки никто не опишет взаимосвязи моделей, юзабельные функции, и т.д. Но яж не навязываю ) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
kamae1ka Опубликовано 2 ноября, 2016 · Жалоба у них неплохой REST API к примеру Create account POST /rest/v1/subjects/customers/:customer_id/accounts Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Wingman Опубликовано 3 ноября, 2016 · Жалоба у них неплохой REST API к примеру Create account POST /rest/v1/subjects/customers/:customer_id/accounts Там (на текущий момент) ооооочень мало возможностей по сравнению с pl/sql api Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alexs200 Опубликовано 9 декабря, 2016 (изменено) · Жалоба VZP, вы похоже что-то перепутали. Биллинг Гида это который hydra-billing.ru. Во-первых, с него не было ни одного перехода на другой биллинг никогда. Это легко отследить разработчикам, потому что те, кто его внедрил оплачивают техподдержку. Не переходят, потому что читают такие условия: 1. Лицензионный договор полностью исполнен. Право пользования вам передано, экземпляр программы предоставлен и вами принят. Договор исполнен. Основания для возврата отсутствуют 2. По договору технической поддержки была оплата консультаций в течение 1 месяца. Консультации проведены. Основания для возврата отсутствуют 3. По договору внедрения все работы завершены кроме двух платежных систем. Причины препятствующие завершению внешние. Нами были согласованы альтернативы. На текущий момент по этим задачам ожидаем данных от вас, после чего готовы завершить задачу в течении нескольких дней. Основания для возврата отсутствуют Для ВАС, официально заявляю, вы обманываете. Человек, заплатив вам 100тр предоплаты, увидев РЕАЛЬНЫЕ его возможности и ценник, перешел на Абилс. На сайте одно и все красиво. В реале калькулятор с отсутствием системы заявок и т.д. Человек отвалив за такое гав-но конский прайс, прочитав такие ответы, не заморачивается. Развод полный. Хотели стекировать Гидру с Юзерсайдом, потому что там за 115тр есть все, что надо для работы, так ТП несколько дней выносила мозг, что это новая задача. Это сообщить данные стековки с модулем ЮС!!! 5 строчек!!! Ощущение, что хотят продать этот модуль второй раз за 21тр, а этот модуль в ЮС 15тр. Покупая этот "биллинг" хорошо подумайте! Умножьте цену в 2-3 раза и подкатите губу о возможностях, прочитанных на их сайте. И будьте готовы к "Основания для возврата отсутствуют" Изменено 9 декабря, 2016 пользователем alexs200 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Dimka88 Опубликовано 9 декабря, 2016 · Жалоба перешел на Абилс. И взял здоровенный напильник, и пилил он 3 года 3 месяца и 3 дня, плюнул и оставил как есть. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
~AsmodeuS~ Опубликовано 10 декабря, 2016 · Жалоба перешел на Абилс. И взял здоровенный напильник, и пилил он 3 года 3 месяца и 3 дня, плюнул и оставил как есть. Бородатая шутка, но лет 5 как не актуальна Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Dimka88 Опубликовано 10 декабря, 2016 · Жалоба Бородатая шутка, но лет 5 как не актуальна Сравнение Абилса и Гидры будет? Или Абилс это для домохозяекмелких ISP. Еще скажите, что mysql для АСР самое то! Обратите внимание на блокировки при высокой нагрузке, кстати с MVCC уже разобрались? Алгоритм выдачи IP адресов из пулов имеет занимательную логику, я сначала даже не поверил. PS:// Не знаю как сейчас в абилсе с апдейтами, но лотерея была еще та. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
~AsmodeuS~ Опубликовано 10 декабря, 2016 · Жалоба Сравнение Абилса и Гидры будет? Или Абилс это для домохозяекмелких ISP. Еще скажите, что mysql для АСР самое то! Обратите внимание на блокировки при высокой нагрузке, кстати с MVCC уже разобрались? Алгоритм выдачи IP адресов из пулов имеет занимательную логику, я сначала даже не поверил. PS:// Не знаю как сейчас в абилсе с апдейтами, но лотерея была еще та. - конечно все "плохо" и 200 тисячники это по Вашим словам мелкие ISP. - Кому не нравитcя может перейти на Oracle, механизм миграции освещён, правда не все готовы платить за издержки - по остальным пунктам я просто приведу Вашу цитату c других ресурсов 10 ноя 2014 - 5:29 PM ~AsmodeuS~ писал: ну как удалось еще что то найти ? У меня пока не совсем достаточно времени, для детальных тестов. По мере нахождения, я буду отписываться. Скорее всего ближе к концу ноября. прошло 2 года списка недочётов так и не получили Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Dimka88 Опубликовано 10 декабря, 2016 · Жалоба - конечно все "плохо" и 200 тисячники это по Вашим словам мелкие ISP. Начало попахивать ... прошло 2 года списка недочётов так и не получили Не до такой степени мне скучно. Вступаю в жуткий оффтоп, прошу прощения. Рассмотрим код из модуля авторизации функцию выдачи IP адресов, с позволения автора abills. #******************************************************************* 1759 # returns: 1760 # 1761 # -2 - No Free Address in TP pool 1762 # -1 - No free address in nas pool 1763 # 0 - No address pool using nas servers ip address 1764 # 192.168.101.1 - assign ip address 1765 # 1766 # get_ip($self, $nas_num, $nas_ip) 1767 #******************************************************************* 1768 sub get_ip { 1769 my $self = shift; 1770 my ($nas_num, $nas_ip, $attr) = @_; 1771 1772 if (! $self->{LOGINS}) { 1773 $self->{USER_NAME} = '' if (! $self->{USER_NAME}); 1774 $self->query2("SELECT INET_NTOA(framed_ip_address) AS ip FROM dv_calls 1775 WHERE user_name='$self->{USER_NAME}' 1776 AND status=11 1777 AND nas_id='$nas_num' 1778 AND framed_ip_address > 0;"); 1779 if ($self->{TOTAL} > 0) { 1780 return $self->{list}->[0]->[0]; 1781 } 1782 } 1783 1784 if ($attr->{TP_IPPOOL}) { 1785 $self->query2("SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id 1786 FROM ippools 1787 WHERE ippools.id='$attr->{TP_IPPOOL}' 1788 ORDER BY ippools.priority;" 1789 ); 1790 delete($attr->{TP_IPPOOL}); 1791 } 1792 else { 1793 $self->query2("SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id 1794 FROM ippools, nas_ippools 1795 WHERE ippools.id=nas_ippools.pool_id AND nas_ippools.nas_id='$nas_num' 1796 ORDER BY ippools.priority;" 1797 ); 1798 } 1799 1800 if ($self->{TOTAL} < 1) { 1801 return 0; 1802 } 1803 1804 my @pools_arr = (); 1805 my $list = $self->{list}; 1806 my @used_pools_arr = (); 1807 my $next_pool_id = 0; 1808 1809 foreach my $line (@$list) { 1810 my $sip = $line->[0]; 1811 my $count = $line->[1]; 1812 my $id = $line->[2]; 1813 $next_pool_id = $line->[3]; 1814 push @used_pools_arr, $id; 1815 my %pools = (); 1816 1817 for (my $i = $sip ; $i <= $sip + $count ; $i++) { 1818 $pools{$i} = 1; 1819 } 1820 push @pools_arr, \%pools; 1821 1822 if($next_pool_id) { 1823 last; 1824 } 1825 } 1826 1827 my $used_pools = join(', ', @used_pools_arr); 1828 1829 #Lock table for read 1830 $self->{db}->do('lock tables dv_calls as c read, nas_ippools as np read, dv_calls write'); 1831 #get active address and delete from pool 1832 # Select from active users and reserv ips 1833 $self->query2("SELECT c.framed_ip_address 1834 FROM dv_calls c 1835 INNER JOIN nas_ippools np ON (c.nas_id=np.nas_id) 1836 WHERE np.pool_id in ( $used_pools ) 1837 GROUP BY c.framed_ip_address;" 1838 ); 1839 1840 $list = $self->{list}; 1841 $self->{USED_IPS} = 0; 1842 1843 my %pool = %{ $pools_arr[0] }; 1844 1845 for (my $i = 0 ; $i <= $#pools_arr ; $i++) { 1846 %pool = %{ $pools_arr[$i] }; 1847 foreach my $ip (@$list) { 1848 if (exists($pool{ $ip->[0] })) { 1849 delete($pool{ $ip->[0] }); 1850 $self->{USED_IPS}++; 1851 } 1852 } 1853 last if (scalar(keys %pool) > 0); 1854 } 1855 1856 my @ips_arr = keys %pool; 1857 my $assign_ip = ($#ips_arr > -1) ? $ips_arr[ rand($#ips_arr + 1) ] : undef; 1858 1859 if ($assign_ip) { 1860 # Make reserv ip 1861 if (! $attr->{SKIP_RESERV}) { 1862 $self->online_add({ %$attr, 1863 NAS_ID => $nas_num, 1864 FRAMED_IP_ADDRESS => $assign_ip, 1865 NAS_IP_ADDRESS => $nas_ip 1866 }); 1867 } 1868 1869 $self->{db}->do('unlock tables'); 1870 if( $self->{errno} ) { 1871 return -1; 1872 } 1873 else { 1874 $assign_ip = int2ip($assign_ip); 1875 return $assign_ip; 1876 } 1877 } 1878 else { # no addresses available in pools 1879 $self->{db}->do('unlock tables'); 1880 if($next_pool_id) { 1881 return $self->get_ip($nas_num, $nas_ip, { TP_IPPOOL => $next_pool_id }); 1882 } 1883 elsif ($attr->{TP_IPPOOL}) { 1884 return $self->get_ip($nas_num, $nas_ip, $attr); 1885 } 1886 else { 1887 return -1; 1888 } 1889 1890 } 1891 return 0; 1892 } Запомним цифру 200000 ip адресов. Движемся по коду и останавливаемся на самых интересных местах. Предположим авторизацию проходит 130001 пользователь. Есть в базе пулы ip адресов, сомневаюсь что они там все внесены по /24, поэтому возьмем из реального примера /19. Есть пробелы в знаниях с perl поэтому предположение, что если выполняется данная конструкция if ($next_pool_id) last то в хэш еще добавятся много элементов. SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id FROM ippools WHERE ippools.id='$attr->{TP_IPPOOL}' ORDER BY ippools.priority Обрабатываем полученные данные и формируем из них хэш ~8189 эл. my %pools = (); 1816 1817 for (my $i = $sip ; $i <= $sip + $count ; $i++) { 1818 $pools{$i} = 1; 1819 } 1820 push @pools_arr, \%pools; 1821 1822 if($next_pool_id) { 1823 last; 1824 } Тут даже с комментариями код. Лочим таблицы с активными пользователями на чтение а потом еще и на запись, для меня это странно но тут я могу что то упускать (не гуру я sql да и perl). Вытягиваем ip адреса активных пользователей , их у нас там в данный момент 130000. #Lock table for read 1830 $self->{db}->do('lock tables dv_calls as c read, nas_ippools as np read, dv_calls write'); 1831 #get active address and delete from pool 1832 # Select from active users and reserv ips 1833 $self->query2("SELECT c.framed_ip_address 1834 FROM dv_calls c 1835 INNER JOIN nas_ippools np ON (c.nas_id=np.nas_id) 1836 WHERE np.pool_id in ( $used_pools ) 1837 GROUP BY c.framed_ip_address;" 1838 ); Далее происходит магия поиска свободного ip адреса методом вычитанием из всех сформированных в хэш и активных активных на текущий момент. $list = $self->{list}; 1841 $self->{USED_IPS} = 0; 1842 1843 my %pool = %{ $pools_arr[0] }; 1844 1845 for (my $i = 0 ; $i <= $#pools_arr ; $i++) { 1846 %pool = %{ $pools_arr[$i] }; 1847 foreach my $ip (@$list) { 1848 if (exists($pool{ $ip->[0] })) { 1849 delete($pool{ $ip->[0] }); 1850 $self->{USED_IPS}++; 1851 } 1852 } 1853 last if (scalar(keys %pool) > 0); 1854 } 1855 1856 my @ips_arr = keys %pool; 1857 my $assign_ip = ($#ips_arr > -1) ? $ips_arr[ rand($#ips_arr + 1) ] : undef; 1858 1859 if ($assign_ip) { 1860 # Make reserv ip 1861 if (! $attr->{SKIP_RESERV}) { 1862 $self->online_add({ %$attr, 1863 NAS_ID => $nas_num, 1864 FRAMED_IP_ADDRESS => $assign_ip, 1865 NAS_IP_ADDRESS => $nas_ip 1866 }); 1867 } 1868 1869 $self->{db}->do('unlock tables'); Фух, выдохнул скрипт, отдал IP и разлочил таблицу, но не тут то было, прилетел 130002 и давай по новой. В предыдущих версиях данного модуля было более интереснее, но как видим телодвижения разработчиков были. прошло 2 года списка недочётов так и не получили Ну не стоит у меня на тягомотину, скучно очень ... ps:/ Помните было от меня сообщение, как ваши клиенты оставляли свои логины и пароли от своих реальных биллинговых систем, которые получить не составляло реального труда. Я как порядочный человек проверил свою теорию на каком то Киевском ISP уже не помню название, потом на луганском ISP естественно ничего не трогая, получив accept я закрывал соединения, логи уже наверное потерлись у ребят, да и IP были восточных товарищей. Ваша оплошность в данной ситуации не велика, кто же заставлял товарищей администраторов в демке оставлять о себе инфу. Я отнесся по человечески и эту инфу нигде не разглашал, а сразу передал ее вам. Возможно когда то я всерьез поставлю цель заняться тестированием вашего продукта, но явно не ближайшие 2 года. ps:/ ps:/ Asmodeus, благодаря вам мне пришлось разобраться немного с perl, опыт был полезен, спасибо. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
~AsmodeuS~ Опубликовано 10 декабря, 2016 · Жалоба - конечно все "плохо" и 200 тисячники это по Вашим словам мелкие ISP. Начало попахивать ... прошло 2 года списка недочётов так и не получили Не до такой степени мне скучно. Вступаю в жуткий оффтоп, прошу прощения. Рассмотрим код из модуля авторизации функцию выдачи IP адресов, с позволения автора abills. #******************************************************************* 1759 # returns: 1760 # 1761 # -2 - No Free Address in TP pool 1762 # -1 - No free address in nas pool 1763 # 0 - No address pool using nas servers ip address 1764 # 192.168.101.1 - assign ip address 1765 # 1766 # get_ip($self, $nas_num, $nas_ip) 1767 #******************************************************************* 1768 sub get_ip { 1769 my $self = shift; 1770 my ($nas_num, $nas_ip, $attr) = @_; 1771 1772 if (! $self->{LOGINS}) { 1773 $self->{USER_NAME} = '' if (! $self->{USER_NAME}); 1774 $self->query2("SELECT INET_NTOA(framed_ip_address) AS ip FROM dv_calls 1775 WHERE user_name='$self->{USER_NAME}' 1776 AND status=11 1777 AND nas_id='$nas_num' 1778 AND framed_ip_address > 0;"); 1779 if ($self->{TOTAL} > 0) { 1780 return $self->{list}->[0]->[0]; 1781 } 1782 } 1783 1784 if ($attr->{TP_IPPOOL}) { 1785 $self->query2("SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id 1786 FROM ippools 1787 WHERE ippools.id='$attr->{TP_IPPOOL}' 1788 ORDER BY ippools.priority;" 1789 ); 1790 delete($attr->{TP_IPPOOL}); 1791 } 1792 else { 1793 $self->query2("SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id 1794 FROM ippools, nas_ippools 1795 WHERE ippools.id=nas_ippools.pool_id AND nas_ippools.nas_id='$nas_num' 1796 ORDER BY ippools.priority;" 1797 ); 1798 } 1799 1800 if ($self->{TOTAL} < 1) { 1801 return 0; 1802 } 1803 1804 my @pools_arr = (); 1805 my $list = $self->{list}; 1806 my @used_pools_arr = (); 1807 my $next_pool_id = 0; 1808 1809 foreach my $line (@$list) { 1810 my $sip = $line->[0]; 1811 my $count = $line->[1]; 1812 my $id = $line->[2]; 1813 $next_pool_id = $line->[3]; 1814 push @used_pools_arr, $id; 1815 my %pools = (); 1816 1817 for (my $i = $sip ; $i <= $sip + $count ; $i++) { 1818 $pools{$i} = 1; 1819 } 1820 push @pools_arr, \%pools; 1821 1822 if($next_pool_id) { 1823 last; 1824 } 1825 } 1826 1827 my $used_pools = join(', ', @used_pools_arr); 1828 1829 #Lock table for read 1830 $self->{db}->do('lock tables dv_calls as c read, nas_ippools as np read, dv_calls write'); 1831 #get active address and delete from pool 1832 # Select from active users and reserv ips 1833 $self->query2("SELECT c.framed_ip_address 1834 FROM dv_calls c 1835 INNER JOIN nas_ippools np ON (c.nas_id=np.nas_id) 1836 WHERE np.pool_id in ( $used_pools ) 1837 GROUP BY c.framed_ip_address;" 1838 ); 1839 1840 $list = $self->{list}; 1841 $self->{USED_IPS} = 0; 1842 1843 my %pool = %{ $pools_arr[0] }; 1844 1845 for (my $i = 0 ; $i <= $#pools_arr ; $i++) { 1846 %pool = %{ $pools_arr[$i] }; 1847 foreach my $ip (@$list) { 1848 if (exists($pool{ $ip->[0] })) { 1849 delete($pool{ $ip->[0] }); 1850 $self->{USED_IPS}++; 1851 } 1852 } 1853 last if (scalar(keys %pool) > 0); 1854 } 1855 1856 my @ips_arr = keys %pool; 1857 my $assign_ip = ($#ips_arr > -1) ? $ips_arr[ rand($#ips_arr + 1) ] : undef; 1858 1859 if ($assign_ip) { 1860 # Make reserv ip 1861 if (! $attr->{SKIP_RESERV}) { 1862 $self->online_add({ %$attr, 1863 NAS_ID => $nas_num, 1864 FRAMED_IP_ADDRESS => $assign_ip, 1865 NAS_IP_ADDRESS => $nas_ip 1866 }); 1867 } 1868 1869 $self->{db}->do('unlock tables'); 1870 if( $self->{errno} ) { 1871 return -1; 1872 } 1873 else { 1874 $assign_ip = int2ip($assign_ip); 1875 return $assign_ip; 1876 } 1877 } 1878 else { # no addresses available in pools 1879 $self->{db}->do('unlock tables'); 1880 if($next_pool_id) { 1881 return $self->get_ip($nas_num, $nas_ip, { TP_IPPOOL => $next_pool_id }); 1882 } 1883 elsif ($attr->{TP_IPPOOL}) { 1884 return $self->get_ip($nas_num, $nas_ip, $attr); 1885 } 1886 else { 1887 return -1; 1888 } 1889 1890 } 1891 return 0; 1892 } Запомним цифру 200000 ip адресов. Движемся по коду и останавливаемся на самых интересных местах. Предположим авторизацию проходит 130001 пользователь. Есть в базе пулы ip адресов, сомневаюсь что они там все внесены по /24, поэтому возьмем из реального примера /19. Есть пробелы в знаниях с perl поэтому предположение, что если выполняется данная конструкция if ($next_pool_id) last то в хэш еще добавятся много элементов. SELECT ippools.ip, ippools.counts, ippools.id, ippools.next_pool_id FROM ippools WHERE ippools.id='$attr->{TP_IPPOOL}' ORDER BY ippools.priority Обрабатываем полученные данные и формируем из них хэш ~8189 эл. my %pools = (); 1816 1817 for (my $i = $sip ; $i <= $sip + $count ; $i++) { 1818 $pools{$i} = 1; 1819 } 1820 push @pools_arr, \%pools; 1821 1822 if($next_pool_id) { 1823 last; 1824 } Тут даже с комментариями код. Лочим таблицы с активными пользователями на чтение а потом еще и на запись, для меня это странно но тут я могу что то упускать (не гуру я sql да и perl). Вытягиваем ip адреса активных пользователей , их у нас там в данный момент 130000. #Lock table for read 1830 $self->{db}->do('lock tables dv_calls as c read, nas_ippools as np read, dv_calls write'); 1831 #get active address and delete from pool 1832 # Select from active users and reserv ips 1833 $self->query2("SELECT c.framed_ip_address 1834 FROM dv_calls c 1835 INNER JOIN nas_ippools np ON (c.nas_id=np.nas_id) 1836 WHERE np.pool_id in ( $used_pools ) 1837 GROUP BY c.framed_ip_address;" 1838 ); Далее происходит магия поиска свободного ip адреса методом вычитанием из всех сформированных в хэш и активных активных на текущий момент. $list = $self->{list}; 1841 $self->{USED_IPS} = 0; 1842 1843 my %pool = %{ $pools_arr[0] }; 1844 1845 for (my $i = 0 ; $i <= $#pools_arr ; $i++) { 1846 %pool = %{ $pools_arr[$i] }; 1847 foreach my $ip (@$list) { 1848 if (exists($pool{ $ip->[0] })) { 1849 delete($pool{ $ip->[0] }); 1850 $self->{USED_IPS}++; 1851 } 1852 } 1853 last if (scalar(keys %pool) > 0); 1854 } 1855 1856 my @ips_arr = keys %pool; 1857 my $assign_ip = ($#ips_arr > -1) ? $ips_arr[ rand($#ips_arr + 1) ] : undef; 1858 1859 if ($assign_ip) { 1860 # Make reserv ip 1861 if (! $attr->{SKIP_RESERV}) { 1862 $self->online_add({ %$attr, 1863 NAS_ID => $nas_num, 1864 FRAMED_IP_ADDRESS => $assign_ip, 1865 NAS_IP_ADDRESS => $nas_ip 1866 }); 1867 } 1868 1869 $self->{db}->do('unlock tables'); Фух, выдохнул скрипт, отдал IP и разлочил таблицу, но не тут то было, прилетел 130002 и давай по новой. В предыдущих версиях данного модуля было более интереснее, но как видим телодвижения разработчиков были. прошло 2 года списка недочётов так и не получили Ну не стоит у меня на тягомотину, скучно очень ... ps:/ Помните было от меня сообщение, как ваши клиенты оставляли свои логины и пароли от своих реальных биллинговых систем, которые получить не составляло реального труда. Я как порядочный человек проверил свою теорию на каком то Киевском ISP уже не помню название, потом на луганском ISP естественно ничего не трогая, получив accept я закрывал соединения, логи уже наверное потерлись у ребят, да и IP были восточных товарищей. Ваша оплошность в данной ситуации не велика, кто же заставлял товарищей администраторов в демке оставлять о себе инфу. Я отнесся по человечески и эту инфу нигде не разглашал, а сразу передал ее вам. Возможно когда то я всерьез поставлю цель заняться тестированием вашего продукта, но явно не ближайшие 2 года. ps:/ ps:/ Asmodeus, благодаря вам мне пришлось разобраться немного с perl, опыт был полезен, спасибо. пример вообще не в тему и разяснения тоже 1 что бы произошло то что Вы пишите провайдер должен развадать 130000 ип /15 на одном сервере доступа и они должны быть все онлайн. 2 учитывая что у провайдера в среднем от 5 до 20 тис на одном сервере эта цифра уменьшается в разы. 3 если все таки не успевает универсальный механизм обработки раздать ип, можно адаптировать его к опрделенным тарифным планам провайдера. То что Вы показали это прямо с коробки скачал и поставил за 15 минут все без адаптаций. 4 провайдеры оставляли пароли в демо системе от своего аккаунта в сапорт системе, перепутав страницы входа p.s. - Если Вы так круто с этим разбираетесь, почему же за 3 года так и не предоставили более оптимальный механизм для опен сорс сообщества ? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Dimka88 Опубликовано 10 декабря, 2016 · Жалоба - Если Вы так круто с этим разбираетесь, почему же за 3 года так и не предоставили более оптимальный механизм для опен сорс сообщества ? Я бы с огромным удовольствием предоставил, но мое "но" будет звучать как оправдание. Дайте пищу для размышления по поводу 200к и репликации. Asmodeus, никто не спорит что вы выполнили огромный труд и для open source сообщества, лично мне бы хотелось увидеть форк вашего продукта с db postgresql и некоторыми компонентами на си. Гидра не зря использует mongodb кроме oracle db. ps:// Узкие места abills с 2011 года я своей жопой как по кочкам все ощутил, и даже больно иногда становится как вспоминаю. =) ps:// ps:// Еще немного офтопа, как все эти 200к конектятся после аварий, механизм же предусматривали? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
~AsmodeuS~ Опубликовано 10 декабря, 2016 · Жалоба - Если Вы так круто с этим разбираетесь, почему же за 3 года так и не предоставили более оптимальный механизм для опен сорс сообщества ? Я бы с огромным удовольствием предоставил, но мое "но" будет звучать как оправдание. Дайте пищу для размышления по поводу 200к и репликации. Asmodeus, никто не спорит что вы выполнили огромный труд и для open source сообщества, лично мне бы хотелось увидеть форк вашего продукта с db postgresql и некоторыми компонентами на си. Гидра не зря использует mongodb кроме oracle db. ps:// Узкие места abills с 2011 года я своей жопой как по кочкам все ощутил, и даже больно иногда становится как вспоминаю. =) 1 для распределённых решений мы уже боле года как разаработали сателиты с использованием mongodb 2 компоненты на C скорости не прибавят (5-8% я считаю это не существенно), а ошибок добавят и время решения растянут - есть уже наработки компонентов на go но пока чисто в тестовых целях, провадерам до 50 тис они в принципе не нужны, ну и финансовые затраты выростают в разы 3 postgresql есть ценник, но также пока никто не решился, форкать никто не будет слишком много все уже в системе, а как показала практика форки не успевают за основным заработчиком. 4 я ж писал что за 5 лет много изменилось, а за последних пол года мы вообще переписали большую часть системы, обложив много моментов тестами. Ну и как тут уже упоминалось если хотите чтобы все было хорошо закажите установку и сопровождение, а Вы решили самостоятельно все делать. ps:// ps:// Еще немного офтопа, как все эти 200к конектятся после аварий, механизм же предусматривали? Если не ипользуется технология сателитов то сервера доступа запускаются по очереди Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
taf_321 Опубликовано 12 декабря, 2016 · Жалоба 3 postgresql есть ценник, но также пока никто не решился, форкать никто не будет слишком много все уже в системе, а как показала практика форки не успевают за основным заработчиком. Если автор вкорячил в код все возмодные методы вендорлока на определенную БД, какой смысл платить ему второй раз чтобы он их оттуда удалил? Дурный нема. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
~AsmodeuS~ Опубликовано 12 декабря, 2016 · Жалоба 3 postgresql есть ценник, но также пока никто не решился, форкать никто не будет слишком много все уже в системе, а как показала практика форки не успевают за основным заработчиком. Если автор вкорячил в код все возмодные методы вендорлока на определенную БД, какой смысл платить ему второй раз чтобы он их оттуда удалил? Дурный нема. если использовать базу как хранилище, без использования сильных сторон, тогда смысл теряется вообще в такой работе. при поддержке PG абоненты обязательно захотят - дорожные карты при нештатных ситуациях - кластеризацию - оптимизации и т д Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
taf_321 Опубликовано 12 декабря, 2016 · Жалоба если использовать базу как хранилище, без использования сильных сторон, тогда смысл теряется вообще в такой работе. Чем вам не угодили хранилищные функции СУБД? Заметим, по части надежности PG даст 100 очков вперед мысклю и его производным. - кластеризацию PG не умеет в кластеры??? Или может быть кому-то просто лень почитать доки. - оптимизации Оптимизация этот бесконечный сизифов труд. Но если на него забить, то рано или поздно проект превращается в копролит. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...