Jump to content

прывыд

Muggles
  • Posts

    6
  • Joined

  • Last visited

Everything posted by прывыд

  1. имхо - нужно снифить, может много паразитного\висрусного трафика?
  2. наверное у меня руки не из того места растут, или все-таки gcc 3.4.2.... как ни крутил - все время Storage plugin loading failed: /usr/lib/stg/mod_store_myslq.so: undefined symbol: compress сервер последнией на сейчас - stg-2.4-2007.01.20-13.47.20.tgz пробовал и с сервис паками (и тот и тот по очереди, не вместе )), все равно ругается. хелп
  3. хм, тогда замечательно ) спасибо.
  4. Очень прошу помощи, неужели никто не подскажет ? товарищи разработчики, отпишитесь, если не затруднит. будьте так добры. запускаются ли скрипты коннекта при переходе на следующий расчетный месяц ?
  5. сообственно сабж. стаим dayfee = 1 будет ли в этот самый момент глобального пересчета и смены тарифов запущены скрипты дисконнекта\конекта ? в моем скрипте вот тут http://local.com.ua/forum/index.php?act=ST&f=4&t=2020&st=0 от этого зависит наличие или отсутсвие логической ошибки...
  6. Вот такое, работать, в принцыпе, должно всюду где есть перл баш и iptables, изначально под линух.... брались идеи из постов повыше.... дорабатывалось по вкусу. считется что все таблицы по умолчанию дроп. все довольно примитивненько. для шейпинга собственно тоже создать немножко нужно... хотя можно и без него.... вот например так: имеем в виду что и iptables и iproute2 собирались с поддержкой коекаких штук (соответсвенно и ядро тоже) хотя можно и без них (esfq например...) поле userdata1 должно сожержать мак, регистр не важен... болванка для шейпера... номера меток нужно ставить побольше, чтобы они не могли случайно совпасть с ID пользователя. #!/bin/bash ipr=/ISP-serv/iproute2/usr/sbin/tc echo "Clear iproute2" $ipr qdisc del dev eth1 root $ipr qdisc del dev eth0 root IN_RATE=12 OUT_RATE=12 LOCAL=70 ceil=14kbps DEV_LAN=eth0 DEV_WAN=eth1 burst=1 echo "= in-LAN ==============================================" echo "Creating root qdisc and class" $ipr qdisc add dev $DEV_LAN root handle 1: htb default 100 $ipr class add dev $DEV_LAN parent 1:0 classid 1:1 htb rate $LOCAL'mbit' burst 150'k' # TOT --------------------------------------------------------- LOCAL echo "Creating class id: 5 for LAN" $ipr class add dev $DEV_LAN parent 1:1 classid 1:5 htb rate $LOCAL'mbit' ceil $LOCAL'mbit' burst 150'k' prio 5 echo "Attach qdisc: esfq to class id: 5 for LAN" $ipr qdisc add dev $DEV_LAN parent 1:5 esfq perturb 5 hash dst echo "Creating filters for class id: 5 for LAN" $ipr filter add dev $DEV_LAN protocol ip parent 1:0 prio 5 handle 5 fw flowid 1:5 # TOT --------------------------------------------------------- LOCAL echo "Creating class id: 100 for LAN" $ipr class add dev $DEV_LAN parent 1:1 classid 1:100 htb rate $LOCAL'mbit' ceil $LOCAL'mbit' burst $burst'k' prio 5 echo "Attach qdisc: esfq to class id: 100 for LAN" $ipr qdisc add dev $DEV_LAN parent 1:100 esfq perturb 5 hash dst echo "Creating filters for class id: 100 for LAN" $ipr filter add dev $DEV_LAN protocol ip parent 1:0 prio 1 handle 100 fw flowid 1:100 echo "= out-LAN ==============================================" echo "Creating root qdisc and class" $ipr qdisc add dev $DEV_WAN root handle 1: htb default 100 $ipr class add dev $DEV_WAN parent 1:0 classid 1:1 htb rate $LOCAL'mbit' burst $burst'k' ############ echo "Creating class id: 100 for WAN" $ipr class add dev $DEV_WAN parent 1:1 classid 1:100 htb rate $LOCAL'mbit' burst $burst'k' prio 5 echo "Attach qdisc: esfq to class id: 100 for WAN" $ipr qdisc add dev $DEV_WAN parent 1:100 esfq perturb 5 hash dst echo "Creating filters for class id: 100 for WAN" $ipr filter add dev $DEV_WAN protocol ip parent 1:0 prio 5 handle 100 fw flowid 1:100 # --------------------------------------------------------- OnConnect #!/bin/bash ### родные переменные, передаваемые биллингом # Login LOGIN=$1 #user IP IP=$2 #cash CASH=$3 #user ID - используется для ограничения скорости ID=$4 ### наши переменные DinM=( 31 28 31 30 31 30 31 31 30 31 30 31 ) D=`date '+%Y-%m-%d %H-%M-%S'` Month=${D:5:2} Day=${D:8:2} IPT="/ISP-serv/iptables/usr/local/sbin/iptables" IPR="/ISP-serv/iproute2/usr/sbin/tc" # в зависимости от версии сервера берем нужный sgconf sgconf="/etc/stargazer/sgconf" bc="/usr/bin/bc" usersconf="/var/stargazer/users/$LOGIN/conf" usersstat="/var/stargazer/users/$LOGIN/stat" tariffs="/var/stargazer/tariffs" unlim_key="unlim_" logfile="/var/log/stargazer-test" DEV_LAN=eth0 DEV_WAN=eth1.39 burst=1 if [ ! -e "$usersconf" ]; then echo "ERROR: User file '$usersconf' not found" >> $logfile exit fi #проверяем есть ли индивидуальный ОнКоннект test -x /var/stargazer/users/$login/OnConnect if [ $? eq 0 ] then /var/stargazer/users/$login/OnConnect exit 0 fi TariffName=`cat "$usersconf" | grep "Tariff=" | cut -d"=" -f2` ### сверяем МАК - не забыть потом убрать в сквиде... ### не забываем, что в биллинг МАК должен быть полностью из заглавных букв ### надо бы поправить, чтобы было все равно... #user MAC MAC1temp=`sed -n 's/Userdata1=//p' /var/stargazer/users/$LOGIN/conf` MAC2temp=`arp $IP | awk '/'$IP'/{print $3}'` MAC1=echo $MAC1temp | tr "[:lower:]" "[:upper:]" MAC2=echo $MAC2temp | tr "[:lower:]" "[:upper:]" #должно быть сравнение а не присваиваение - тобишь '=='? похоже в баше не имеет значения... if [ $MAC1 = $MAC2 ]; then #в добрый путь #открываем файр $IPT -t filter -A INPUT -s $IP -j ACCEPT $IPT -t filter -A FORWARD -s $IP -j ACCEPT $IPT -t filter -A FORWARD -d $IP -j ACCEPT $IPT -t filter -A OUTPUT -d $IP -j ACCEPT echo "C `date +%Y.%m.%d-%H.%M.%S` $IP $CASH " >> /var/stargazer/users/$LOGIN/connect.log ### безлимитный тариф должен называться по шаблону "unlim_xxx" - где 'ххх' - скорость доступа ### в интернет. смотрим если тариф анлим... if [ "_${TariffName#$unlim_key}" != "_${TariffName}" ]; then # анлим найден limit_value=${TariffName:${#unlim_key}:3} # параметр анлима из тарифа # # echo $TariffName $limit_value >> /var/stargazer/users/$LOGIN/connect.log # #маркеруем пакеты $IPT -t mangle -I INPUT -s $IP -j MARK --set-mark $ID $IPT -t mangle -I FORWARD -s $IP -j MARK --set-mark $ID $IPT -t mangle -I FORWARD -d $IP -j MARK --set-mark $ID $IPT -t mangle -I OUTPUT -d $IP -j MARK --set-mark $ID #Unlim - DEV_LAN - ограничиваем на локальном интерфейсе $IPR class add dev $DEV_LAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 2>> / connect $IPR qdisc add dev $DEV_LAN parent 1:$ID esfq perturb 5 hash dst 2>> /connect $IPR filter add dev $DEV_LAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID 2>> /connect #Unlim - DEV_WAN - ограничиваем на внешнем интерфейсе $IPR class add dev $DEV_WAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 2>> / connect $IPR qdisc add dev $DEV_WAN parent 1:$ID esfq perturb 5 hash dst 2>> /connect $IPR filter add dev $DEV_WAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID 2>> /connect fi #добавляем запись в лог, при удачной авторизации echo "$D Local login='$LOGIN' ip=$IP cash=$CASH" >> $logfile ### уведомления об оплате ### просто ищем символ '_' в имени тарифа, если его нет - абонплату не проверяем ### в таком случае имена тарифов могут быть любыми. # поставили $Month-1, это правильно, нумерация индексов массива с нуля if [ $(echo `expr "$TariffName" : '.*_.*'`) != 0 ]; then if [ $Day -ge $(( ${DinM[$Month-1]}-3 )) ]; then # осталось меньше 3-х дней Fee=$(cat $tariffs/$TariffName.tf | grep "Fee=" | cut -d"=" -f2) # Узнаем абонплату # echo "$CASH < $Fee = " $(echo "$CASH < $Fee" | bc) # for debug if [ $(echo "$CASH < $Fee" | $bc) != 0 ]; then echo "$sgconf -s 127.0.0.1 -p 4445 -a логин -w пасс \ -u $LOGIN -m ''сообщаем пользователю какой он плохой, и вставляем разные переменные, типа денег вот сколько а надо сколько, плати жадный! " | at now+1mi nutes 2>/dev/null fi fi fi else # если маки не совпадают - болт и досвидания. об чем пишем в лог echo "ERROR `date +%Y.%m.%d-%H.%M.%S` $MAC1 <--> $MAC2 " >> /var/stargazer/users/$LOGIN/badmac.log #и сообщаем об ошибке ) дабы подсказать ответ саппорту echo "$sgconf -s 127.0.0.1 -p 4445 -a mess -w cegth -u $LOGIN -m 'ERROR A1'" | at now+1minutes 2>/dev/null fi exit OnDisconnect #!/bin/bash IPR=/ISP-serv/iproute2/usr/sbin/tc IPT=/ISP-serv/iptables/usr/local/sbin/iptables ID=$4 IP=$2 LOGIN=$1 DEV_LAN=eth0 DEV_WAN=eth1.39 burst=1 unlim_key="unlim_" usersconf="/var/stargazer/users/$LOGIN/conf" TariffName=`cat "$usersconf" | grep "Tariff=" | cut -d"=" -f2` $IPT -t filter -D INPUT -s $IP -j ACCEPT while [ $? -eq 0 ] do $IPT -t filter -D INPUT -s $IP -j ACCEPT done ################################## $IPT -t filter -D FORWARD -s $IP -j ACCEPT while [ $? -eq 0 ] do $IPT -t filter -D FORWARD -s $IP -j ACCEPT done ################################## $IPT -t filter -D FORWARD -d $IP -j ACCEPT while [ $? -eq 0 ] do $IPT -t filter -D FORWARD -d $IP -j ACCEPT done ################################## $IPT -t filter -D OUTPUT -d $IP -j ACCEPT while [ $? -eq 0 ] do $IPT -t filter -D OUTPUT -d $IP -j ACCEPT done ######################################### - убираем метки $IPT -t mangle -D INPUT -s $IP -j MARK --set-mark $ID while [ $? -eq 0 ] do $IPT -t mangle -D INPUT -s $IP -j MARK --set-mark $ID done ######################################## $IPT -t mangle -D FORWARD -s $IP -j MARK --set-mark $ID while [ $? -eq 0 ] do $IPT -t mangle -D FORWARD -s $IP -j MARK --set-mark $ID done ######################################## $IPT -t mangle -D FORWARD -d $IP -j MARK --set-mark $ID while [ $? -eq 0 ] do $IPT -t mangle -D FORWARD -d $IP -j MARK --set-mark $ID done ####################################### $IPT -t mangle -D OUTPUT -d $IP -j MARK --set-mark $ID while [ $? -eq 0 ] do $IPT -t mangle -D OUTPUT -d $IP -j MARK --set-mark $ID done if [ "_${TariffName#$unlim_key}" != "_${TariffName}" ]; then # анлим найден limit_value=${TariffName:${#unlim_key}:3} # параметр анлима из тарифа echo "Unlim detected ($limit_value kbit) userid = $ID used by "$LOGIN"" >> /ss.log ################################################## - удаляем ограничение скорости #####Unlim - DEV_LAN - ограничиваем на локальном интерфейсе $IPR qdisc del dev $DEV_LAN parent 1:$ID esfq perturb 5 hash dst 2>> /discoonect while [ $? -eq 0 ] do $IPR qdisc del dev $DEV_LAN parent 1:$ID esfq perturb 5 hash dst done $IPR filter del dev $DEV_LAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID 2>> /discoonect while [ $? -eq 0 ] do $IPR filter del dev $DEV_LAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID done $IPR class del dev $DEV_LAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 2>> /discoonect while [ $? -eq 0 ] do $IPR class del dev $DEV_LAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 done #####Unlim - DEV_WAN - ограничиваем на внешнем интерфейсе $IPR qdisc del dev $DEV_WAN parent 1:$ID esfq perturb 5 hash dst while [ $? -eq 0 ] do $IPR qdisc del dev $DEV_WAN parent 1:$ID esfq perturb 5 hash dst done $IPR filter del dev $DEV_WAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID while [ $? -eq 0 ] do $IPR filter del dev $DEV_WAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID done $IPR class del dev $DEV_WAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 while [ $? -eq 0 ] do $IPR class del dev $DEV_WAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 done fi OnUserAdd - добавляем запись в dhcpd.conf и рестартим сервис #!/usr/bin/perl # Login #login=$1 #echo $login #password #password=$2 #echo $password #tariff name #tariff=$3 #echo $tariff #echo "added user $login $password $tariff" >> /tmp/add_del # argv[0]=login # argv[1]=IP # print $ARGV[0]."\n"; $configFile="/var/stargazer/users/".$ARGV[0]."/conf"; open (FH,"< /var/stargazer/users/".$ARGV[0]."/conf") or die "cannot open the file!"; my $MAC=""; my $IP=""; while ($line=<FH>) { if ($line=~m/^Userdata1\s*=\s*(\S+)/i) { $MAC=$1; } if ($line=~m/^IP\s*=\s*(\S+)/i) { $IP=$1; } } close(FH); $resultDHCPDstr="host ".$ARGV[0]."\t\t{hardware ethernet ".$MAC."; fixed-address ".$IP.";} # gen by perl\n"; print $resultDHCPDstr; open (OLD,"< "."/etc/dhcpd.conf") or die "cannot open file /etc/dhcpd.conf !\n"; open (NEW,"> "."dhcpd.conf.new") or die "cannot open dhcpd.conf.new!\n"; @array=<OLD>; for ($i=$#array; $i!=-1; $i--) { # изменяем только самую последнюю строку if ($array[$i]=~m/}/) { $array[$i]=$resultDHCPDstr."\n\n}\n"; last; } } print NEW @array; close (OLD); close (NEW); rename ("/etc/dhcpd.conf","/etc/dhcpd.conf.orig"); rename ("dhcpd.conf.new","/etc/dhcpd.conf"); `service dhcpd restart`; скрипты не идеальны, хочется услышать мнение разбирающихся, остальных просьба не тревожить.... ах да - большой вопрос ID пользователя откуда берется и где храниться... ибо заметил что он не постоянен (хотя возможно на старой версии сервера)... и большой вопрос номер два, когда старгейзер переходит на следующий месяц, будет ли он перезапускать скрипт OnConnect ? ибо если нет... придется еще немного посидеть. зы. местами есть еще дэбаги... в принцыпе работе никак не мешают. работать должно на любой версии старгейзера. очень хотелось бы пообщаться с автором если не сложно - пм мне кто-нить его асю. сохраню в строгой секретности. хотим немножко помочь проекту чем сможем.
×
×
  • Create New...