|
@ -8,22 +8,26 @@ USE_PROCD=1 |
|
|
PROG=/usr/bin/mini_snmpd |
|
|
PROG=/usr/bin/mini_snmpd |
|
|
NAME=mini_snmpd |
|
|
NAME=mini_snmpd |
|
|
|
|
|
|
|
|
|
|
|
global_respawn_threshold= |
|
|
|
|
|
global_respawn_timeout= |
|
|
|
|
|
global_respawn_retry= |
|
|
|
|
|
|
|
|
_log() { |
|
|
_log() { |
|
|
logger -p daemon.info -t mini_snmpd "$@" |
|
|
|
|
|
|
|
|
logger -p daemon.info -t mini_snmpd "$@" |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
_err() { |
|
|
_err() { |
|
|
logger -p daemon.err -t mini_snmpd "$@" |
|
|
|
|
|
|
|
|
logger -p daemon.err -t mini_snmpd "$@" |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# mini_snmpd 1.3+ now starts later in the game. Expects filesystems monitored to be already mounted, or wont pass args to mini_snmpd |
|
|
|
|
|
|
|
|
# mini_snmpd 1.3+ now starts later in the game. Expects filesystems monitored to be already mounted, or wont pass args to mini_snmpd |
|
|
# and at least configuration entry for network physical interface defined in /etc/config/network |
|
|
# and at least configuration entry for network physical interface defined in /etc/config/network |
|
|
# It handles network interfaces not yet present (e.g. ppp) but will statfs() the root/wrong filesystem if device not mounted |
|
|
# It handles network interfaces not yet present (e.g. ppp) but will statfs() the root/wrong filesystem if device not mounted |
|
|
# Tip: complex scripts run faster without in openwrt if you stop busybox forking and searching for applets. Faster bootups |
|
|
# Tip: complex scripts run faster without in openwrt if you stop busybox forking and searching for applets. Faster bootups |
|
|
# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_NOFORK |
|
|
# CONFIG_BUSYBOX_CONFIG_FEATURE_SH_NOFORK |
|
|
# CONFIG_BUSYBOX_CONFIG_FEATURE_PREFER_APPLETS |
|
|
|
|
|
# BUSYBOX_CONFIG_ASH_OPTIMIZE_FOR_SIZE [=n] |
|
|
|
|
|
|
|
|
# CONFIG_BUSYBOX_CONFIG_FEATURE_PREFER_APPLETS |
|
|
|
|
|
# BUSYBOX_CONFIG_ASH_OPTIMIZE_FOR_SIZE [=n] |
|
|
# CONFIG_BUSYBOX_CONFIG_ASH_CMDCMD |
|
|
# CONFIG_BUSYBOX_CONFIG_ASH_CMDCMD |
|
|
|
|
|
|
|
|
mini_snmpd_validation="enabled:bool:0 \ |
|
|
mini_snmpd_validation="enabled:bool:0 \ |
|
@ -49,14 +53,14 @@ mini_snmpd_validation="enabled:bool:0 \ |
|
|
append_disk() { |
|
|
append_disk() { |
|
|
local disk="$1" disk_count |
|
|
local disk="$1" disk_count |
|
|
[ -z $disk_count ] && disk_count=0 |
|
|
[ -z $disk_count ] && disk_count=0 |
|
|
if grep -qF "$disk" /proc/mounts ; then |
|
|
|
|
|
|
|
|
if grep -qF "$disk" /proc/mounts; then |
|
|
# check the fileystem is mountpoint, and directory search permissions available for statfs() |
|
|
# check the fileystem is mountpoint, and directory search permissions available for statfs() |
|
|
# presence as a directory -d test done is already done by uci_validate_section() |
|
|
# presence as a directory -d test done is already done by uci_validate_section() |
|
|
[ -x "$disk" ] || { |
|
|
[ -x "$disk" ] || { |
|
|
_err "$cfg: mountpoint $disk for snmp monitoring EACCES error. Check permissions, ignoring" |
|
|
_err "$cfg: mountpoint $disk for snmp monitoring EACCES error. Check permissions, ignoring" |
|
|
return 1 |
|
|
return 1 |
|
|
} |
|
|
} |
|
|
if [ $disk_count -lt 4 ] ; then |
|
|
|
|
|
|
|
|
if [ $disk_count -lt 4 ]; then |
|
|
append disks_arg "$disk" ',' |
|
|
append disks_arg "$disk" ',' |
|
|
disk_count=$((disk_count++)) |
|
|
disk_count=$((disk_count++)) |
|
|
else |
|
|
else |
|
@ -72,15 +76,15 @@ append_interface() { |
|
|
[ -z $netdev_count ] && netdev_count=0 |
|
|
[ -z $netdev_count ] && netdev_count=0 |
|
|
# for the purposes of snmp monitoring it doesn't need to be up, it just needs to exist in /proc/net/dev |
|
|
# for the purposes of snmp monitoring it doesn't need to be up, it just needs to exist in /proc/net/dev |
|
|
network_get_device netdev "$name" |
|
|
network_get_device netdev "$name" |
|
|
if [ -n "$netdev" ] && grep -qF "$netdev" /proc/net/dev ]; then |
|
|
|
|
|
|
|
|
if [ -n "$netdev" ] && grep -qF "$netdev" /proc/net/dev ]; then |
|
|
[ $netdev_count -ge 4 ] && { |
|
|
[ $netdev_count -ge 4 ] && { |
|
|
_err "$cfg: too many network interfaces configured, ignoring $name" |
|
|
_err "$cfg: too many network interfaces configured, ignoring $name" |
|
|
return |
|
|
return |
|
|
} |
|
|
} |
|
|
netdev_count=$((netdev_count++)) |
|
|
|
|
|
if [ -n "$interfaces_arg" ]; then |
|
|
|
|
|
|
|
|
netdev_count=$((netdev_count++)) |
|
|
|
|
|
if [ -n "$interfaces_arg" ]; then |
|
|
append interfaces_arg "$netdev" ',' |
|
|
append interfaces_arg "$netdev" ',' |
|
|
else |
|
|
|
|
|
|
|
|
else |
|
|
append interfaces_arg "$netdev" |
|
|
append interfaces_arg "$netdev" |
|
|
fi |
|
|
fi |
|
|
else |
|
|
else |
|
@ -102,57 +106,50 @@ watch_interfaces() { |
|
|
config_get listen_interface "$cfg" listen_interface |
|
|
config_get listen_interface "$cfg" listen_interface |
|
|
# If the interface is up & instance is running we'll watch at the instance level and only restart that instance if it's bound interface changes |
|
|
# If the interface is up & instance is running we'll watch at the instance level and only restart that instance if it's bound interface changes |
|
|
# Regardless of ubus knowing about an interface (in the case it's not yet configured) |
|
|
# Regardless of ubus knowing about an interface (in the case it's not yet configured) |
|
|
[ -n "$listen_interface" ] && trigger_interfaces="${listen_interface} ${trigger_interfaces} " |
|
|
|
|
|
|
|
|
[ -n "$listen_interface" ] && trigger_interfaces="$listen_interface $trigger_interfaces" |
|
|
# Restart daemon if one of monitored interfaces changes |
|
|
# Restart daemon if one of monitored interfaces changes |
|
|
config_get reload_interfaces "$cfg" interfaces |
|
|
config_get reload_interfaces "$cfg" interfaces |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
validate_mini_snmpd_section() { |
|
|
validate_mini_snmpd_section() { |
|
|
# validate a mini_snmpd instance in uci config file mini_snmpd |
|
|
# validate a mini_snmpd instance in uci config file mini_snmpd |
|
|
# http://luci.subsignal.org/trac/wiki/Documentation/Datatypes ubox/validate/validate.c |
|
|
# http://luci.subsignal.org/trac/wiki/Documentation/Datatypes ubox/validate/validate.c |
|
|
uci_validate_section mini_snmpd mini_snmpd "${1}" $mini_snmpd_validation |
|
|
|
|
|
|
|
|
uci_load_validate mini_snmpd mini_snmpd "$1" "$2" $mini_snmpd_validation |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
service_triggers() { |
|
|
service_triggers() { |
|
|
config_load 'mini_snmpd' |
|
|
|
|
|
procd_open_trigger |
|
|
|
|
|
procd_add_config_trigger "config.change" "mini_snmpd" /etc/init.d/mini_snmpd reload |
|
|
|
|
|
config_foreach watch_interfaces 'mini_snmpd' |
|
|
|
|
|
|
|
|
config_load 'mini_snmpd' |
|
|
|
|
|
procd_open_trigger |
|
|
|
|
|
procd_add_config_trigger "config.change" "mini_snmpd" /etc/init.d/mini_snmpd reload |
|
|
|
|
|
config_foreach watch_interfaces 'mini_snmpd' |
|
|
# this only watches interfaces for which there is no running instance due to interface down / not in ubus |
|
|
# this only watches interfaces for which there is no running instance due to interface down / not in ubus |
|
|
# hence start not reload, this trigger will not affect running instances as another start will not change their procd command arguments |
|
|
# hence start not reload, this trigger will not affect running instances as another start will not change their procd command arguments |
|
|
# or stop the already running process |
|
|
# or stop the already running process |
|
|
[ -n "$trigger_interfaces" ] & { |
|
|
|
|
|
for n in $trigger_interfaces ; do |
|
|
|
|
|
|
|
|
[ -n "$trigger_interfaces" ] && { |
|
|
|
|
|
for n in $trigger_interfaces; do |
|
|
procd_add_interface_trigger "interface.*" $n /etc/init.d/mini_snmpd start |
|
|
procd_add_interface_trigger "interface.*" $n /etc/init.d/mini_snmpd start |
|
|
done |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
done |
|
|
|
|
|
} |
|
|
[ -n "$reload_interfaces" ] && { |
|
|
[ -n "$reload_interfaces" ] && { |
|
|
for n in $reload_interfaces; do |
|
|
for n in $reload_interfaces; do |
|
|
procd_add_reload_interface_trigger $n |
|
|
procd_add_reload_interface_trigger $n |
|
|
done |
|
|
done |
|
|
} |
|
|
} |
|
|
procd_close_trigger |
|
|
|
|
|
|
|
|
procd_close_trigger |
|
|
procd_add_validation validate_mini_snmpd_section |
|
|
procd_add_validation validate_mini_snmpd_section |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
start_instance() { |
|
|
start_instance() { |
|
|
local cfg validation_failed validation_err disks_arg interfaces_arg |
|
|
local cfg validation_failed validation_err disks_arg interfaces_arg |
|
|
cfg="$1" |
|
|
|
|
|
#uci_validate_section should unset undefined variables from other instances |
|
|
|
|
|
#however defining uci variables as local will scope them to this instance |
|
|
|
|
|
#"local variables are also visible to functions called by the parent function" so it's good practice |
|
|
|
|
|
local enabled ipv6 debug auth community contact location listen_interface \ |
|
|
|
|
|
udp_port tcp_port vendor_oid mib_timeout |
|
|
|
|
|
local disks="" interfaces="" |
|
|
|
|
|
validate_mini_snmpd_section "$cfg" 2>/dev/null || validation_failed=1 |
|
|
|
|
|
[ "$enabled" == 1 ] || { |
|
|
|
|
|
_log "instance:$cfg disabled not starting" |
|
|
|
|
|
|
|
|
cfg="$1" |
|
|
|
|
|
[ "$2" = 0 ] || validation_failed=1 |
|
|
|
|
|
[ "$enabled" == 1 ] || { |
|
|
|
|
|
_log "instance:$cfg disabled not starting" |
|
|
return 1 |
|
|
return 1 |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local listen_interface_json listen_interface_ip listen_interface_device listen_interface_up |
|
|
local listen_interface_json listen_interface_ip listen_interface_device listen_interface_up |
|
|
[ -n "$listen_interface" ] && { |
|
|
[ -n "$listen_interface" ] && { |
|
|
if [ "$ipv6" = 1 ]; then |
|
|
if [ "$ipv6" = 1 ]; then |
|
@ -168,11 +165,11 @@ start_instance() { |
|
|
network_get_physdev listen_interface_device "$listen_interface" |
|
|
network_get_physdev listen_interface_device "$listen_interface" |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
[ $validation_failed ] && { |
|
|
|
|
|
|
|
|
[ $validation_failed ] && { |
|
|
_err "validation of $NAME configuration for $cfg instance failed, all tests should be within constraints" |
|
|
_err "validation of $NAME configuration for $cfg instance failed, all tests should be within constraints" |
|
|
_err "please edit the configuration values below using [l]uci " |
|
|
_err "please edit the configuration values below using [l]uci " |
|
|
validation_err=`/sbin/validate_data mini_snmpd mini_snmpd "$cfg" $mini_snmpd_validation 2>&1 | sed '/with\ false$/!d;s/validates\ as\ /needs\ to\ be\ /;s/with\ false//' ` |
|
|
validation_err=`/sbin/validate_data mini_snmpd mini_snmpd "$cfg" $mini_snmpd_validation 2>&1 | sed '/with\ false$/!d;s/validates\ as\ /needs\ to\ be\ /;s/with\ false//' ` |
|
|
_err "${validation_err}" |
|
|
|
|
|
|
|
|
_err "$validation_err" |
|
|
return 1 |
|
|
return 1 |
|
|
} |
|
|
} |
|
|
config_list_foreach "$cfg" 'disks' append_disk |
|
|
config_list_foreach "$cfg" 'disks' append_disk |
|
@ -182,36 +179,47 @@ start_instance() { |
|
|
_err "$cfg: you haven't sucessfully configured any mountpoints or disks for this instance, not starting" |
|
|
_err "$cfg: you haven't sucessfully configured any mountpoints or disks for this instance, not starting" |
|
|
return 1 |
|
|
return 1 |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[ -z "$respawn_threshold$respawn_timeout$respawn_retry" ] && { |
|
|
|
|
|
respawn_threshold=$global_respawn_threshold |
|
|
|
|
|
respawn_timeout=$global_respawn_timeout |
|
|
|
|
|
respawn_retry=$global_respawn_retry |
|
|
|
|
|
} |
|
|
|
|
|
[ -z "$global_respawn_threshold$global_respawn_timeout$global_respawn_retry" ] && { |
|
|
|
|
|
global_respawn_threshold=$respawn_threshold |
|
|
|
|
|
global_respawn_timeout=$respawn_timeout |
|
|
|
|
|
global_respawn_retry=$respawn_retry |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
procd_open_instance |
|
|
procd_open_instance |
|
|
|
|
|
|
|
|
procd_set_param command "$PROG" -n |
|
|
procd_set_param command "$PROG" -n |
|
|
procd_set_param stdout "1" |
|
|
|
|
|
|
|
|
procd_set_param stdout "1" |
|
|
procd_set_param stderr "1" |
|
|
procd_set_param stderr "1" |
|
|
# don't the like default respawn values? you can override through uci. |
|
|
# don't the like default respawn values? you can override through uci. |
|
|
# vars left as global so you only need to do it in the first mini_snmpd instance |
|
|
|
|
|
|
|
|
# vars saved as global so you only need to do it in the first mini_snmpd instance |
|
|
procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-10} ${respawn_retry:-1} |
|
|
procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-10} ${respawn_retry:-1} |
|
|
# this monitors ubus changes |
|
|
# this monitors ubus changes |
|
|
[ -n "$listen_interface" ] && { |
|
|
[ -n "$listen_interface" ] && { |
|
|
#procd_open_trigger |
|
|
#procd_open_trigger |
|
|
#procd_add_interface_trigger "interface.*" $listen_interface /etc/init.d/mini_snmpd reload |
|
|
|
|
|
|
|
|
#procd_add_interface_trigger "interface.*" $listen_interface /etc/init.d/mini_snmpd reload |
|
|
#procd_close_trigger |
|
|
#procd_close_trigger |
|
|
procd_add_reload_interface_trigger $listen_interface #or use shorthand of above |
|
|
procd_add_reload_interface_trigger $listen_interface #or use shorthand of above |
|
|
} |
|
|
} |
|
|
# this re-starts the daemon if a properly configured network interface is changed whilst it is already running |
|
|
# this re-starts the daemon if a properly configured network interface is changed whilst it is already running |
|
|
# igmpproxy has this as well as "procd_set_param netdev" |
|
|
|
|
|
|
|
|
|
|
|
append_arg "-c" "$community" |
|
|
|
|
|
append_arg "-L" "${location}" |
|
|
|
|
|
append_arg "-C" "${contact}" |
|
|
|
|
|
append_arg "-p" $udp_port |
|
|
|
|
|
append_arg "-P" $tcp_port |
|
|
|
|
|
append_arg "-V" "${vendor_oid}" |
|
|
|
|
|
append_arg "-t" $mib_timeout |
|
|
|
|
|
|
|
|
|
|
|
[ "$ipv6" = 1 ] && procd_append_param command "-6" |
|
|
|
|
|
|
|
|
# igmpproxy has this as well as "procd_set_param netdev" |
|
|
|
|
|
|
|
|
|
|
|
append_arg "-c" "$community" |
|
|
|
|
|
append_arg "-L" "$location" |
|
|
|
|
|
append_arg "-C" "$contact" |
|
|
|
|
|
append_arg "-p" $udp_port |
|
|
|
|
|
append_arg "-P" $tcp_port |
|
|
|
|
|
append_arg "-V" "$vendor_oid" |
|
|
|
|
|
append_arg "-t" $mib_timeout |
|
|
|
|
|
|
|
|
|
|
|
[ "$ipv6" = 1 ] && procd_append_param command "-6" |
|
|
[ "$debug" = 1 ] && procd_append_param command "-v" |
|
|
[ "$debug" = 1 ] && procd_append_param command "-v" |
|
|
# uci_validate_section() aka /sbin/validate_data can only cast default values not defined in /etc/config/* to string |
|
|
|
|
|
|
|
|
# uci_validate_section() aka /sbin/validate_data can only cast default values not defined in /etc/config/* to string |
|
|
# e.g. ="1" however it sets bools defined in /etc/config/* to =1 / =0 |
|
|
# e.g. ="1" however it sets bools defined in /etc/config/* to =1 / =0 |
|
|
[ "$auth" = 1 -o "$auth" = "1" ] && procd_append_param command "-a" |
|
|
[ "$auth" = 1 -o "$auth" = "1" ] && procd_append_param command "-a" |
|
|
[ -n "$disks_arg" ] && procd_append_param command "-d" "$disks_arg" |
|
|
[ -n "$disks_arg" ] && procd_append_param command "-d" "$disks_arg" |
|
@ -232,6 +240,5 @@ start_service() { |
|
|
. /lib/functions/network.sh |
|
|
. /lib/functions/network.sh |
|
|
|
|
|
|
|
|
config_load 'mini_snmpd' |
|
|
config_load 'mini_snmpd' |
|
|
config_foreach start_instance 'mini_snmpd' |
|
|
|
|
|
|
|
|
config_foreach validate_mini_snmpd_section 'mini_snmpd' start_instance |
|
|
} |
|
|
} |
|
|
|
|
|
|