Перейти к содержанию

AltGrF13

Участники форума
  • Постов

    2
  • Зарегистрирован

Весь контент AltGrF13

  1. Разместим в iflayerchanged логирование всех событий logger -t 'ndm-event' -p 'debug' "iflayerchanged.d: ${id}|${system_name} ${level} in ${layer}" И выполним такой код # проверяем level каждого layer curl -s '127.0.0.1:79/rci/show/interface/L2TP0/summary/layer' # отключаем curl -s -d '{"down":"true"}' '127.0.0.1:79/rci/interface/L2TP0' # снова проверяем level каждого layer curl -s '127.0.0.1:79/rci/show/interface/L2TP0/summary/layer' # каждые 0,1 секунды пишем сообщение в лог в течении 7 секунд attempt=70 while [ $attempt -gt 0 ] ; do logger -t 'timer' -p 'debug' "Отсечка ${attempt}" usleep 100000 attempt=$(( $attempt - 1 )) done # снова проверяем level каждого layer curl -s '127.0.0.1:79/rci/show/interface/L2TP0/summary/layer' В итоге мы выясним, что после команды «отключи интерфейс» с ним происходит: на 0 секунде pending in ctrl; на 0,4с pending in ipv4; на 1с pending in link; на 1,6с running in link; на 2,1с running in ipv4; на 2,6с running in ctrl; на 3с disabled in ctrl; на 3,6с disabled in ipv4; на 4с disabled in link; на 4,4с disabled in conf. Последовательность выглядит логичной (кроме running, но он в контексте вопроса/темы не важен). Но в show/interface/L2TP0/summary/layer сразу после вызова отключения (на 0 секунде) вместо running прописываются disabled и не меняются { "conf": "disabled", "link": "disabled", "ipv4": "disabled", "ipv6": "disabled", "ctrl": "disabled" } Разве я не должен на 1 секунде увидеть там картину типа { "conf": "running", "link": "pending", "ipv4": "pending", "ipv6": "disabled",#отключен для интерфейса, к вопросу отношение не имеет "ctrl": "pending" } А на 3,8с из примера { "conf": "running", "link": "pending", "ipv4": "disabled", "ipv6": "disabled", "ctrl": "disabled" } И лишь только после 4,4с увидеть везде disabled? Я правильно понимаю, что при помощи API сейчас никак невозможно определить, что интерфейс отключается (команда дана, но ещё не отключен)? Т.к. сразу после команды «отключайся» все layer помечаются как disabled, их значения меняются "на будущее" и с хуком iflayerchanged никак не синхронизированы?
  2. Сейчас вводится новая схема на сопоставлениях по IP (функция nets__set_common). Но, как уже указали Опять же, если пользователь отключил интерфейс в админке; то не очень-то и хочет, чтобы его использовали в утилите. Но к означенному есть ещё проблема. Если Вам нужны ещё некоторые гостевые VPN (PPTP, SSTP, OpenConnect, L2TP, IKEv2); то ни этот код не поможет, ни новое поле в API. В терминах Linux у них есть сетевые интерфейсы (можно рулить в iptables через, как пример, pptp+, sstp+, oc+, l2tp+ и xfrms+ начиная с 4.2), но в терминах API у них отдельного сетевого интерфейса нет (упоминаний в /rci/show/interface). Даже чтобы посмотреть их диапазон IP (pool-start, как пример), нужно скакать по разным разделам API. При этом если проверять этот раздел API на наличие (чтобы узнать включен ли сервер), то при его отсутствии в логе роутера будут ошибки. Чтобы предположить, можно ли обращаться к этому разделу API, я использую теги (127.0.0.1:79/rci/show/tags/). В итоге картина получается такой: есть тег ipsec-xauth, можно обращаться к 127.0.0.1:79/rci/crypto/virtual-ip-server-ikev2 (для pool-start, как пример); для ipsec-l2tp crypto/l2tp-server; для vpn-oc просто oc-server; для sstp sstp-server. Ужасная не консистентность; но, видимо, «так исторически сложилось». Итоговый код для гостевых без своего API-интерфейса примерно такой # замена Singleton, чтобы скан был лишь при первом вызове NETS_INCOMING='' nets__set_incoming() { if [ -n "${NETS_INCOMING}" ]; then return fi local api_tags api_info # Запрос конкретного раздела может оставить ошибки в логе роутера, если он отключен. # Поэтому проверять включенность будем через тэги. api_tags=$(curl -s '127.0.0.1:79/rci/show/tags/') # IPsec в crypto if echo "${api_tags}" | grep -qF 'ipsec-xauth' ; then api_info=$(curl -s '127.0.0.1:79/rci/crypto/virtual-ip-server-ikev2') if [ -n "${api_info}" ] ; then NETS_INCOMING="${NETS_INCOMING}"'xfrms+|'$(echo "${api_info}" \ | jq -r '."pool-start" // empty')'|crypto/virtual-ip-server-ikev2|"VPN-сервер IKEv2/IPsec"'$'\n' fi fi if echo "${api_tags}" | grep -qF 'ipsec-l2tp' ; then api_info=$(curl -s '127.0.0.1:79/rci/crypto/l2tp-server') if [ -n "${api_info}" ] ; then NETS_INCOMING="${NETS_INCOMING}"'l2tp+|'$(echo "${api_info}" \ | jq -r '."pool-start" // empty')'|crypto/l2tp-server|"VPN-сервер L2TP/IPsec"'$'\n' fi fi # остальные в глобальном if echo "${api_tags}" | grep -qF 'vpn-oc' ; then api_info=$(curl -s '127.0.0.1:79/rci/oc-server') if [ -n "${api_info}" ] ; then NETS_INCOMING="${NETS_INCOMING}"'oc+|'$(echo "${api_info}" \ | jq -r '.config."pool-start" // empty')'|oc-server|"VPN-сервер OpenConnect"'$'\n' fi fi if echo "${api_tags}" | grep -qF 'sstp' ; then api_info=$(curl -s '127.0.0.1:79/rci/sstp-server') if [ -n "${api_info}" ] ; then NETS_INCOMING="${NETS_INCOMING}"'sstp+|'$(echo "${api_info}" \ | jq -r '.config."pool-start" // empty')'|sstp-server|"VPN-сервер SSTP"'$'\n' fi fi # чтобы не сканировало повторно, если ничего не найдено if [ -z "${NETS_INCOMING}" ]; then NETS_INCOMING=$'\n' fi } nets__set_incoming echo "${NETS_INCOMING}"
×
×
  • Создать...

Важная информация

На этом сайте используются файлы cookie. Нажимая "Я принимаю" или продолжая просмотр сайта, вы разрешаете их использование: Политика конфиденциальности.