You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

243 lines
7.6 KiB
Bash

#!/bin/sh /etc/rc.common
# Copyright (C) 2008 OpenWrt.org
# Copyright (C) 2016 devolo AG
START=50
USE_PROCD=1
PROG="/usr/sbin/snmpd"
LOG="/usr/bin/logger"
CONFIGFILE="/var/run/snmpd.conf"
USERFILE="/usr/lib/snmp/snmpd.conf"
disabled="0"
snmpd_agent_add() {
local cfg="$1"
config_get agentaddress "$cfg" agentaddress
[ -n "$agentaddress" ] || return 0
echo "agentaddress $agentaddress" >> $CONFIGFILE
# add each UDP agent as UDP6 agent too
[ "${agentaddress:0:4}" = "UDP:" ] || return 0
echo "agentaddress UDP6:${agentaddress:4}" >>$CONFIGFILE
}
get_snmpd_agent_disabled() {
local cfg="$1"
config_get disabled "$cfg" disabled
[ -n "$disabled" ] || disabled="0" && return 0
disabled="$disabled"
}
snmpd_system_add() {
local cfg="$1"
config_get syslocation "$cfg" sysLocation
[ -n "$syslocation" ] && echo "sysLocation $syslocation" >> $CONFIGFILE
config_get syscontact "$cfg" sysContact
[ -n "$syscontact" ] && echo "sysContact $syscontact" >> $CONFIGFILE
config_get sysname "$cfg" sysName
[ -n "$sysname" ] && echo "sysName $sysname" >> $CONFIGFILE
config_get sysservice "$cfg" sysService
[ -n "$sysservice" ] && echo "sysService $sysservice" >> $CONFIGFILE
config_get sysdescr "$cfg" sysDescr
[ -n "$sysdescr" ] && echo "sysDescr $sysdescr" >> $CONFIGFILE
config_get sysobjectid "$cfg" sysObjectID
[ -n "$sysobjectid" ] && echo "sysObjectID $sysobjectid" >> $CONFIGFILE
}
snmpd_com2sec_add() {
local cfg="$1"
config_get secname "$cfg" secname
[ -n "$secname" ] || return 0
config_get source "$cfg" source
[ -n "$source" ] || return 0
config_get community "$cfg" community
[ -n "$community" ] || return 0
echo "com2sec $secname $source $community" >> $CONFIGFILE
}
snmpd_com2sec6_add() {
local cfg="$1"
config_get secname "$cfg" secname
[ -n "$secname" ] || return 0
config_get source "$cfg" source
[ -n "$source" ] || return 0
config_get community "$cfg" community
[ -n "$community" ] || return 0
echo "com2sec6 $secname $source $community" >> $CONFIGFILE
}
snmpd_group_add() {
local cfg="$1"
config_get group "$cfg" group
[ -n "$group" ] || return 0
config_get version "$cfg" version
[ -n "$version" ] || return 0
config_get secname "$cfg" secname
[ -n "$secname" ] || return 0
echo "group $group $version $secname" >> $CONFIGFILE
}
snmpd_view_add() {
local cfg="$1"
config_get viewname "$cfg" viewname
[ -n "$viewname" ] || return 0
config_get type "$cfg" type
[ -n "$type" ] || return 0
config_get oid "$cfg" oid
[ -n "$oid" ] || return 0
# optional mask
config_get mask "$cfg" mask
echo "view $viewname $type $oid $mask" >> $CONFIGFILE
}
snmpd_access_add() {
local cfg="$1"
config_get group "$cfg" group
[ -n "$group" ] || return 0
config_get context "$cfg" context
[ -n $context ] || return 0
[ "$context" == "none" ] && context='""'
config_get version "$cfg" version
[ -n "$version" ] || return 0
config_get level "$cfg" level
[ -n "$level" ] || return 0
config_get prefix "$cfg" prefix
[ -n "$prefix" ] || return 0
config_get read "$cfg" read
[ -n "$read" ] || return 0
config_get write "$cfg" write
[ -n "$write" ] || return 0
config_get notify "$cfg" notify
[ -n "$notify" ] || return 0
echo "access $group $context $version $level $prefix $read $write $notify" >> $CONFIGFILE
#save access level for upcoming user_add
access_level="$level"
}
snmpd_user_add() {
[ -n "$access_level" ] || return 0
local cfg="$1"
config_get name "$cfg" name
[ -n "$name" ] || return 0
config_get access "$cfg" access
[ -n "$access" ] || return 0
config_get authpass "$cfg" authpass
config_get authtype "$cfg" authtype
config_get secpass "$cfg" secpass
config_get sectype "$cfg" sectype
if [ -z "$authpass" ] ; then
authtype=""
sectype=""
elif [ -z "$secpass" ] ; then
sectype=""
fi
[ -n "$authpass" ] && [ -z "$authtype" ] && return 0
[ -n "$secpass" ] && [ -z "$sectype" ] && return 0
args=
[ -n "$authpass" ] && args="$args $authtype \"$authpass\""
[ -n "$secpass" ] && args="$args $sectype \"$secpass\""
local ro="-ro"
rm -rf /usr/share/snmp/snmpd.conf
if [ "$access" != "ro" ]; then
$LOG "snmpd: access rw not available, ro only"
#ro=""
#echo "rwuser $name $access_level" >> $CONFIGFILE
else
echo "rouser $name $access_level" >> $CONFIGFILE
fi
#do not add, replace
echo "createUser $name $args" > $USERFILE
}
snmpd_pass_add() {
local cfg="$1"
local pass='pass'
config_get miboid "$cfg" miboid
[ -n "$miboid" ] || return 0
config_get prog "$cfg" prog
[ -n "$prog" ] || return 0
config_get_bool persist "$cfg" persist 0
[ $persist -ne 0 ] && pass='pass_persist'
config_get priority "$cfg" priority
priority=${priority:+-p $priority}
echo "$pass $priority $miboid $prog" >> $CONFIGFILE
}
snmpd_exec_add() {
local cfg="$1"
config_get name "$cfg" name
[ -n "$name" ] || return 0
config_get prog "$cfg" prog
[ -n "$prog" ] || return 0
config_get args "$cfg" args
config_get miboid "$cfg" miboid
echo "exec $miboid $name $prog $args" >> $CONFIGFILE
}
snmpd_disk_add() {
local cfg="$1"
local disk='disk'
config_get partition "$cfg" partition
[ -n "$partition" ] || return 0
config_get size "$cfg" size
[ -n "$size" ] || return 0
echo "$disk $partition $size" >> $CONFIGFILE
}
service_triggers()
{
procd_add_reload_trigger snmpd
}
start_service() {
[ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE"
[ -f "$USERFILE" ] && rm -f "$USERFILE"
config_load snmpd
#assume only one
config_foreach get_snmpd_agent_disabled agent
if [ "$disabled" = "0" ]; then
config_foreach snmpd_agent_add agent
config_foreach snmpd_system_add system
config_foreach snmpd_com2sec_add com2sec
# add each com2sec section as com2sec6 too but ignore explicit com2sec6 sections!
config_foreach snmpd_com2sec6_add com2sec
config_foreach snmpd_group_add group
config_foreach snmpd_view_add view
config_foreach snmpd_access_add access
# user add must be executed after access_add!
config_foreach snmpd_user_add userv3
config_foreach snmpd_pass_add pass
config_foreach snmpd_exec_add exec
config_foreach snmpd_disk_add disk
procd_open_instance
procd_set_param command $PROG -Lf /dev/null -f
procd_set_param file $CONFIGFILE
procd_set_param respawn
for iface in $(ls /sys/class/net 2>/dev/null); do
procd_append_param netdev "$iface"
done
procd_close_instance
else
$LOG "SNMP agent disabled"
fi
}
stop_service() {
[ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE"
[ -f "$USERFILE" ] && rm -f "$USERFILE"
}
reload_service() {
stop
start
}