... trap __exit EXIT __exit() { local ret=$? rm -f $TMPDIR/*.$$ return $ret } function __radclient() { res=$(radclient -c 1 -r 2 -t 1 -x $nas_ip:$coa_port $1 $coa_psw) ret=$? set +x echo "$res" | grep -q "Error-Cause = 0\|Error-Cause = 200" && ret=0 echo "$res" | grep -q "Error-Cause = Resources Unavailable" && ret=254 echo "$res" | grep -q "no response from server" && ret=254 if echo "$res" | grep -q "Error-Cause = Session-Context-Not-Found\|Missing-Attribute"; then echo -e "clear subscriber session username $login\nclear subscriber session username $ip"\ | ssh_send -q -e "$telnet_enpassword" -t "$telnet_type" -u "$telnet_login" -p "$telnet_password" "$telnet_ip" --port "${telnet_port:-22}" fi echo $res set -x return $ret } # Приходит при создании пользователя в биллинге # И при смене критичных параметров(ip, vlan, port etc.)(с новыми значениями) # Обычно/ используется для ip авторизации user_add() { : } # Приходит при удалении пользователя из биллинга # И при смене критичных параметров(ip, vlan, port etc.)(со старыми значениями) # Обычно используется для ВСЕХ видов авторизации user_del() { user_disconnect } # Приходит после авторизации пользователя # Рекомендуется политику пользователя передавать в радиус replay параметрах, А НЕ В ЭТОМ СОБЫТИИ, # т.к. у любого оборудования есть ограничения на колличество отправляемых команд в секунду user_accept() { echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_BLOCKED_TRUSTED\",\ cisco-avpair+=\"subscriber:command=deactivate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_BLOCKED_REDIRECT\",\ cisco-avpair+=\"subscriber:command=deactivate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_ACCEPT\",\ cisco-avpair+=\"subscriber:command=activate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_NOSHAPE\",\ cisco-avpair+=\"subscriber:command=activate-service\"" | __radclient coa } # Приходит при отключении пользователя # Рекомендуется избегать удаления пользователя из списков, для экономии очереди команд на оборудовании user_drop() { echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_ACCEPT\",\ cisco-avpair+=\"subscriber:command=deactivate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_NOSHAPE\",\ cisco-avpair+=\"subscriber:command=deactivate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_BLOCKED_TRUSTED\",\ cisco-avpair+=\"subscriber:command=activate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_BLOCKED_REDIRECT\",\ cisco-avpair+=\"subscriber:command=activate-service\"" | __radclient coa } # Приходит при превышении лимита, либо при отключении услуги user_redirect() { echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_ACCEPT\",\ cisco-avpair+=\"subscriber:command=deactivate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_NOSHAPE\",\ cisco-avpair+=\"subscriber:command=deactivate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_NEGBAL_REDIRECT\",\ cisco-avpair+=\"subscriber:command=activate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_NEGBAL_TRUSTED\",\ cisco-avpair+=\"subscriber:command=activate-service\"" | __radclient coa } # Приходит после оплаты, если хватило денег на включение услуги user_redirect_cancel() { echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_NEGBAL_TRUSTED\",\ cisco-avpair+=\"subscriber:command=deactivate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_NEGBAL_REDIRECT\",\ cisco-avpair+=\"subscriber:command=deactivate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_ACCEPT\",\ cisco-avpair+=\"subscriber:command=activate-service\"" | __radclient coa echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_NOSHAPE\",\ cisco-avpair+=\"subscriber:command=activate-service\"" | __radclient coa } # Приходит при изменении скорости подключения # Или включения\выключении услуги(турбокнопка, ночной форсаж и т.д.) user_rate_set() { echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ Cisco-Account-Info+=\"QU;${ceil_in}000;D;${ceil_out}000\"" | __radclient coa } # Приходит при отключении пользователя администратором user_disconnect() { # на самом деле User-Name cisco игнорирует, но он должен быть и быть не пустым иначе ошибка echo "User-Name=\"$login\",Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:command=account-logoff\"" | __radclient coa #TODO_OSV echo "User-name=\"1\",Cisco-Account-Info=\"S10.255.0.2\",cisco-avpair+=\"subscriber:command=account-logoff\"" | radclient 185.8.158.73:3799 coa servicemode } # Приходит при нажатии кнопки info в учетной записи user_info() { echo '<pre>' > /tmp/${user_id}_user_info.new # echo "User-Name=\"$login\",Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ # cisco-avpair+=\"subscriber:command=profile-status-query\"" | __radclient coa &>>/tmp/${user_id}_user_info.new ( . $EVENT_HANDLERS_DIR/${NAS_SCRIPT_NAME%.sh}.d/user_info ) >> /tmp/${user_id}_user_info.new || true echo '</pre>' >> /tmp/${user_id}_user_info.new mv -f /tmp/${user_id}_user_info.new /tmp/${user_id}_user_info chown apache:apache /tmp/${user_id}_user_info [ "${is_daemon:--}" != 1 ] && cat /tmp/${user_id}_user_info } # Приходит при нажатии кнопки тест в учетной записи user_test() { echo > "/tmp/${user_id}_user_info" echo "User-Name=\"$login\",Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",cisco-avpair+=\"subscriber:command=profile-status-query\"" | __radclient coa &>>"/tmp/${user_id}_user_info" cat /tmp/${user_id}_user_info } # Хук - вызывается перед каждым событием user_event_before() { : } # Хук - вызывается после каждого события user_event_after() { : } # Приходит при добавлении услуги абоненту usluga_add(){ # Доступ к социально значимым ресурсам для физиков if [ "$usluga_system_type_id" == "15" ]; then echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ Cisco-Account-Info=\"AFWPOL_FREE_INTERNET\"" | __radclient coa fi } # Приходит при удалении услуги у абонента usluga_del(){ # Отмена доступа к социально значимым ресурсам для физиков if [ "$usluga_system_type_id" == "15" ]; then echo "Cisco-Account-Info=\"S${ip}:vrf-id=${vrf}\",\ cisco-avpair+=\"subscriber:service-name=FWPOL_FREE_INTERNET\",\ cisco-avpair+=\"subscriber:command=deactivate-service\"" | __radclient coa fi } users_from_nas(){ : } # Приходит при активации услуги usluga_activated(){ : } # Приходит при деактивации услуги usluga_deactivated(){ : } send_cmd() { ip=$1 cmd=user_${2} set -x echo "env $env_str" $cmd set +x } main() { . /usr/local/bin/user_env $ip . $oss_pathname/main.ini [ -z "$vrf" ] && vrf="global" abonent_log_dir="/var/log/abonents/${abonent_id}/" mkdir -p "$abonent_log_dir" PS4=" \D{%Y-%m-%d %T} ssh ${SSH_CLIENT%% *} $HOSTNAME rtsh session "$@"[$$]: " echo '' >> "${abonent_log_dir}/rtsh_${user_id}.log" send_cmd "$@" 2>&1 | tee -a "${abonent_log_dir}/rtsh_${user_id}.log" } ### Все функции должны быть определены до подключения ubin_session bin_session=$BASH_SOURCE ubin_session="${bin_session//bin/ubin}.hook" [ -f "$ubin_session" ] && source "${ubin_session}" # пока временно if [ "${is_daemon:--}" != 1 ]; then main "$@" exit $? fi oss_pathname=${EVENT_HANDLERS_DIR%/*} #todo export from daemon . $oss_pathname/main.ini {code}
|