Добрый день!
Установил SNMP-Агент. Запустил, но данные получаю STRING. Можно ли как-то их преобразовать в Integer? Если да, то подскажите пожалуйста и было бы замечательно, если были бы примеры
Добрый день.
Если источник отдает string - то преобразовать можно с помощью скрипта wb-rules например. Сам сервис - не преобразовывает значения.
Добрый день. А есть какой нибудь туториал по написанию скрипта?
Да, описание особенностей реализации стандартного JS тут: wb-rules/README.md at master · wirenboard/wb-rules · GitHub
Можно воспользоваться примерами.
То есть, после написания скрипта wb-rules, при запросе скрипта по SSH, вместо String будет выдавать Integer?
Так… Возможно я не совсем понимаю… Вы получаете на контроллере значения по SNMP и сервис публикует их в топики?
Я с контроллера передаю значения по SNMP. Я как понял стандартно значения передаются в строке. Мне нужно строку конвертировать в целочисленное значение
Так, теперь понятно.
Если использовать extend то snmpd отдает только string.
Для integer используется pass
В файл конфигурации добавил строку :
pass .1.3.6.1.4.1.2.10 /var/lib/snmp/mqtt-snmp_Status_QF.sh
Скрипт начинается : #!/bin/sh -f
При запуске snmpwalk ничего не происходит
Так… А что ожидается?
А что выдает скрипт на stdout, что он должен выдавать?
Можно глянуть в https://sourceforge.net/p/net-snmp/code/ci/master/tree/local/passtes как образец.
На stdout выдает следующее:
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.1 = STRING: “0”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.2 = STRING: “1”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.3 = STRING: “0”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.4 = STRING: “1”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.5 = STRING: “0”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.6 = STRING: “1”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.7 = STRING: “0”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.8 = STRING: “1”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.9 = STRING: “0”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.10 = STRING: “1”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.11 = STRING: “0”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.12 = STRING: “1”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.13 = STRING: “0”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.14 = STRING: “1”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.15 = STRING: “1”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.16 = STRING: “0”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.17 = STRING: “0”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.18 = STRING: “0”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.19 = STRING: “0”
.1.3.6.1.4.1.2.10.4.1.2.2.116.116.20 = STRING: “0”
К данной ссылке нет доступа
Во всех мануалах рекомендуют явно указывать шел:
pass .1.3.6.1.4.1.2.10 /bin/sh / var/lib/snmp/mqtt-snmp_Status_QF.sh
И при дебаге остановить сервис snmpd и запустить его в фореграунде с ключами : " snmpd -f -Lo -Ducd-snmp/pass"
Это я так понимаю это указывается, если используется один скрипт. А если скриптов 5 и из них один только для которого нужно получать int?
По-моему это эквивалентно указанию шелла в самом скрипте.
Для удобства - да, это нелишне.
Можно так (как раз пример из ссылки):
#!/bin/sh -f
PLACE=".1.3.6.1.4.1.8072.2.255" # NET-SNMP-PASS-MIB::netSnmpPassExamples
REQ="$2" # Requested OID
#
# Process SET requests by simply logging the assigned value
# Note that such "assignments" are not persistent,
# nor is the syntax or requested value validated
#
if [ "$1" = "-s" ]; then
echo $* >> /tmp/passtest.log
exit 0
fi
#
# GETNEXT requests - determine next valid instance
#
if [ "$1" = "-n" ]; then
case "$REQ" in
$PLACE| \
$PLACE.0| \
$PLACE.0.*| \
$PLACE.1) RET=$PLACE.1.0 ;; # netSnmpPassString.0
$PLACE.1.*| \
$PLACE.2| \
$PLACE.2.0| \
$PLACE.2.0.*| \
$PLACE.2.1| \
$PLACE.2.1.0| \
$PLACE.2.1.0.*| \
$PLACE.2.1.1| \
$PLACE.2.1.1.*| \
$PLACE.2.1.2| \
$PLACE.2.1.2.0) RET=$PLACE.2.1.2.1 ;; # netSnmpPassInteger.1
$PLACE.2.1.2.*| \
$PLACE.2.1.3| \
$PLACE.2.1.3.0) RET=$PLACE.2.1.3.1 ;; # netSnmpPassOID.1
$PLACE.2.*| \
$PLACE.3) RET=$PLACE.3.0 ;; # netSnmpPassTimeTicks.0
$PLACE.3.*| \
$PLACE.4) RET=$PLACE.4.0 ;; # netSnmpPassIpAddress.0
$PLACE.4.*| \
$PLACE.5) RET=$PLACE.5.0 ;; # netSnmpPassCounter.0
$PLACE.5.*| \
$PLACE.6) RET=$PLACE.6.0 ;; # netSnmpPassGauge.0
*) exit 0 ;;
esac
else
#
# GET requests - check for valid instance
#
case "$REQ" in
$PLACE.1.0| \
$PLACE.2.1.2.1| \
$PLACE.2.1.3.1| \
$PLACE.3.0| \
$PLACE.4.0| \
$PLACE.5.0| \
$PLACE.6.0) RET=$REQ ;;
*) exit 0 ;;
esac
fi
#
# "Process" GET* requests - return hard-coded value
#
echo "$RET"
case "$RET" in
$PLACE.1.0) echo "string"; echo "Life, the Universe, and Everything"; exit 0 ;;
$PLACE.2.1.2.1) echo "integer"; echo "42"; exit 0 ;;
$PLACE.2.1.3.1) echo "objectid"; echo "$PLACE.99"; exit 0 ;;
$PLACE.3.0) echo "timeticks"; echo "363136200"; exit 0 ;;
$PLACE.4.0) echo "ipaddress"; echo "127.0.0.1"; exit 0 ;;
$PLACE.5.0) echo "counter"; echo "42"; exit 0 ;;
$PLACE.6.0) echo "gauge"; echo "42"; exit 0 ;;
*) echo "string"; echo "ack... $RET $REQ"; exit 0 ;; # Should not happen
esac
Нет! проверено. С явным вызовом - работает. При надежде на шебанг - тихо ничего не делает.
Благодарю за помощь, буду разбираться
Благодарю, дополню документацию.