Kucher2 Опубликовано: September 30, 2008 at 11:24 Опубликовано: September 30, 2008 at 11:24 Поясняю ситуацию: 1. У нас вылетел СТГ. Мы его поднимает таким скриптом. Но правила-то могли остаться (конечно маловероятно, если по крону проверка каждые 5-10 мин, но всё-таки), хотя наш юзер уже спать ушёл. 2. Мы установили юзеру переход с помегабайтного тарифа(512К) на безлим (128к) в начале месяца. Если не передёрнуть правила - у него по идее будет считаться трафик как за безлим 128К (т.е. грубо говоря - снимется абонка и всё), а вот скорость останется 512К, пока он не переподсоединится. Может можно как-то заставить авторизатор переконнектиться или проверить у кого сейчас активен авторизатор и сделать OnConnect для каждого активного юзера (у меня в этом скрипте все правила сначала убиваются, а потом снова поднимаются)? Ребут не предлагать. Вечный вопрос: чё делать?
madf Опубліковано: October 1, 2008 at 08:09 Опубліковано: October 1, 2008 at 08:09 Ответ: перед стартом сбрасывать все правила и ставить по новой. Авторизатор потом переконнектится сам и старгейзер добавит нужные правила.
Kucher2 Опубліковано: October 1, 2008 at 08:46 Автор Опубліковано: October 1, 2008 at 08:46 Это как? Кстати, при каких условиях авторизатор реконнектится? Я убил правила на свою машину - авторизатор зелёным горит и ничего не делает. Зараза. Хотя опция "переподключение" установлена.
madf Опубліковано: October 1, 2008 at 08:52 Опубліковано: October 1, 2008 at 08:52 Как? А как ты устанавливаеш правила? Скриптом, видимо... Переподключается по тайм-ауту.
Kucher2 Опубліковано: October 1, 2008 at 09:26 Автор Опубліковано: October 1, 2008 at 09:26 Не понял. Сбросить правила просто и всё? Но это ничего не даст, если их не восстановить. У юзеров не будет инета. А чтобы восстановить - надо знать кто сейчас подключён. Может готовый метод для этого есть уже? Может UDP закрыть на серв, секунд на 30-60, чтобы вынуждать авторизатор реконнектиться? Но это тогда обрыв связи. Пойдёт, если делать такое в начале месяца.
madf Опубліковано: October 1, 2008 at 09:32 Опубліковано: October 1, 2008 at 09:32 Я вобще не пойму в чем проблема. Сбрасываем правила, запускаем stg. Юзеры отпадают по тайм-ауту, после чего переконнекчиваются. Из опыта: когда пропадает инет, онлайновый юзер начинает нервничать и нажимать кнопку "Отключить/Подключить", после чего реконнект происходит сам собой. PS: UDP не может быть открытым или закрытым - это протокол без установки соединения.
Kucher2 Опубліковано: October 1, 2008 at 11:31 Автор Опубліковано: October 1, 2008 at 11:31 Если сбросить правила и рестартануть СТГ - прервётся соединение. Не есть гуд. Онлайновый юзер не будет ничего клацать, если это ночью происходит и у него просто закачка стоит. В итоге после такого фокуса у него не будет Инета до момента, пока он именно - не начнёт клацать. А если это игрок в ту же линейку - будут эмоции. Есть идея - закрыть на сервере пакеты UDP на минутку. При этом рядовой юзверь ничего не заметит, потому что сам работает по TCP. Т.к. авторизатор работает по UDP, по идее он попытается переконнектиться? Если да, то СТГ при этом перечитает правила? Например при ребуте сервера - так и происходит. А если произойдёт реконнект авторизатора и обновление правил - в этом случае произойдёт это настолько быстро, что возможно юзверь этого и не заметит. Вот к чему я веду.
madf Опубліковано: October 1, 2008 at 11:37 Опубліковано: October 1, 2008 at 11:37 Оставлять старые правила при рестарте stg - ненадежно. Невозможно предсказать, в каком состоянии находится файрвол. Рестарт - ситуация аварийная, по этому все правила нужно создавать заново. Игроков в линейку надо гнать в шею - дабы не повышали мировую энтропию По UDP: авторизатор сам переконнектится.
Kucher2 Опубліковано: October 1, 2008 at 11:39 Автор Опубліковано: October 1, 2008 at 11:39 Ладно, спасибо за мозговую атаку. Проверю - отпишусь. P.S. Проверил. Работает. Значит, что я сделал: 1. Включил ping ya.ru -t - на своей виндовой машине. 2. Изменил правила OnConnect для своей машины на сервере (дописал строку, чтобы явно было видно, если правила обновятся). 3. Закрыл на свою машину UDP-пакеты к серверу и от него. В итоге - примерно через минуту, авторизатор на моей виндовой машине "покраснел" и попытался переконнектиться. Потери связи в этот период, естественно, нет. После открытия доступа по UDP - СТГ перечитал правила из OnConnect и обновил их. При этом было потеряно 3-5 пакетов. По-моему приемлемо. Вывод: работает, можно добавить по Cron - скрипт для обновления правил после возможной смены тарифа (который может повлечь смену правил OnConnect для конкретного случая) юзеров в начале месяца. Пройдёт почти незаметно для пользователей. Так же, сброс правил и закрытие UDP-протокола на пару минут вызовет авторекконект авторизатора на всех активных машинах и восстановление связи с Интернетом для всех активных пользователей. Хотя потеря связи будет немного более продолжительная. При останове и последующем старте СТГ - он всё равно сбрасывает правила для юзеров, затем авторизатор сам коннектится повторно. Но если предварительно заставить авторизаторы у юзеров "искать связи с сервером", то вся процедура проходит существенно быстрее, почти незаметно для пользователей. Скрипт для проверки состояния СТГ и его рестарта: rstg.sh #!/bin/sh#Proverka raboty STG i ego RESTART v sluchae nadobnosti fwcmd="/sbin/ipfw" flag=`grep 'Tariff=' /var/stargazer/users/key/conf | cut -d '=' -f2` sgconf="/var/stargazer/cm/sgconf" #echo "`date +%Y.%m.%d-%H.%M.%S` Scaning STG status" >> /var/log/stargazer.log # Proverka i restart STG v sluchae nerabotosposobnosti ${sgconf} -s <IP-SERVERA> -p <PORT> -a <admin> -w <pass> -u key -t 128 flag=`grep 'Tariff=' /var/stargazer/users/key/conf | cut -d '=' -f2` if [ $flag = 128 ] then ${sgconf} -s <IP-SERVERA> -p <PORT> -a <admin> -w <pass> -u key -t 256 # Esli tarif ne smenilsa - restart # prinuditel'no zastavlyaem avtorizatory userov delat' reconnect (imitiruem potery connecta s serverom) else ${fwcmd} add 3 deny udp from any to any sleep 2 echo "Reinitialization..." echo "60 sec..." sleep 10 echo "50 sec..." sleep 10 echo "40 sec..." sleep 10 echo "30 sec..." sleep 10 echo "20 sec..." sleep 10 echo "10 sec..." sleep 10 #Ostanavlivaem STG echo "Stop Billing Server..." echo "`date +%Y.%m.%d-%H.%M.%S` Stop Billing Server..." >> /var/log/stargazer.log pid=$(ps -ax|grep stargazer|grep -v grep | awk '{print $1}') kill ${pid} > /dev/null 2>&1 #Sbros pravil IPFW sleep 2 /usr/local/etc/rc.d/ipfw.sh #Start STG echo "Starting Billing Server..." echo "`date +%Y.%m.%d-%H.%M.%S` Starting Billing Server..." >> /var/log/stargazer.log /usr/sbin/stargazer sleep 1 #vosstanavlivaem key ${sgconf} -s <IP-SERVERA> -p <PORT> -a <admin> -w <pass> -u key -t 256 fi exit Как видите - скрипт до нельзя примитивен и суть его в том, что он пытается менять тариф ключевого юзера (которого нужно создать перед запуском скрипта), проверяя сменился ли он на самом деле. Если нет - рестарт СТГ. Его существенным недостатком является засорение stargazer.log бесполезными сообщениями о смене тарифа ключевому юзеру. Но такова механика работы sgconf. Следующий скрипт для рестарта СТГ (например - в начале месяца, когда надо "передёрнуть" правила для юзеров в связи с возможной сменой тарифов и скоростей подключения). Так же можно прикрутить процедуру очистки логов и каталогов юзеров от старой инфы, что лучше делать при остановленном СТГ: rstgone.sh #!/bin/sh fwcmd="/sbin/ipfw" # prinuditel'no zastavlyaem avtorizatory userov delat' reconnect (imitiruem potery connecta s serverom) ${fwcmd} add 3 deny udp from any to any sleep 2 echo "Reinitialization..." echo "60 sec..." sleep 10 echo "50 sec..." sleep 10 echo "40 sec..." sleep 10 echo "30 sec..." sleep 10 echo "20 sec..." sleep 10 echo "10 sec..." sleep 10 #Ostanavlivaem STG pid=$(ps -ax|grep stargazer|grep -v grep | awk '{print $1}') kill ${pid} > /dev/null 2>&1 echo "Stop Billing Server..." echo "`date +%Y.%m.%d-%H.%M.%S` Stop Billing Server..." >> /var/log/stargazer.log #Sbros pravil IPFW /usr/local/etc/rc.d/ipfw.sh sleep 2 #Start STG /usr/sbin/stargazer echo "Starting Billing Server..." echo "`date +%Y.%m.%d-%H.%M.%S` Starting Billing Server..." >> /var/log/stargazer.log sleep 1 В /var/cron/tabs добавляем строки: */5 * * * * /var/stg_script/rstg.sh15 0 1 * * /var/stg_script/rstgone.sh Для верности можно так же добавить в cron безусловный перезапуск СТГ, например раз в сутки. Совет: не кладите скрипты в каталог, у которого в названии присутствует слово "stargazer". Спасибо за помощь.
Silitra Опубліковано: October 20, 2008 at 16:39 Опубліковано: October 20, 2008 at 16:39 ну вот типа патч возможно решающий проблему удаления/добавления правил при переходе на новый месяц --- user.cpp_ 2008-10-20 22:11:46.000000000 +0600 +++ user.cpp 2008-10-20 22:36:30.000000000 +0600 @@ -1328,6 +1328,11 @@ { property.tariffName.Set(nextTariff, sysAdmin, login, store); tariff = nt; + if (connected) + { + Connect(); + Disconnect(); + } } ResetNextTariff(); }
igal Опубліковано: November 26, 2008 at 21:37 Опубліковано: November 26, 2008 at 21:37 ну вот типа патч возможно решающий проблему удаления/добавления правил при переходе на новый месяц --- user.cpp_ 2008-10-20 22:11:46.000000000 +0600 +++ user.cpp 2008-10-20 22:36:30.000000000 +0600 @@ -1328,6 +1328,11 @@ { property.tariffName.Set(nextTariff, sysAdmin, login, store); tariff = nt; + if (connected) + { + Connect(); + Disconnect(); + } } ResetNextTariff(); } куда ставить это правило??
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас