Add UCI section general which holds the uci parameter network defining on which interface(s) the snmp agent is reachable for inbound snmp requests in case the firewall zone does not allow INPUT traffic by default. For the different zones to which the different interfaces belong firewall procd input rules are created making the snmp agent reachable on udp port 161. Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
292 lines
7.9 KiB
Bash
292 lines
7.9 KiB
Bash
#!/bin/sh /etc/rc.common
|
|
# Copyright (C) 2008 OpenWrt.org
|
|
START=50
|
|
|
|
USE_PROCD=1
|
|
PROG="/usr/sbin/snmpd"
|
|
|
|
CONFIGFILE="/var/run/snmpd.conf"
|
|
|
|
snmpd_agent_add() {
|
|
local cfg="$1"
|
|
|
|
config_get agentaddress "$cfg" agentaddress
|
|
[ -n "$agentaddress" ] || return 0
|
|
echo "agentaddress $agentaddress" >> $CONFIGFILE
|
|
}
|
|
|
|
snmpd_agentx_add() {
|
|
local cfg="$1"
|
|
echo "master agentx" >> $CONFIGFILE
|
|
config_get agentxsocket "$cfg" agentxsocket
|
|
[ -n "$agentxsocket" ] && echo "agentXSocket $agentxsocket" >> $CONFIGFILE
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
snmpd_trap_hostname_add() {
|
|
local cfg="$1"
|
|
config_get hostname "$cfg" HostName
|
|
config_get port "$cfg" Port
|
|
config_get community "$cfg" Community
|
|
config_get type "$cfg" Type
|
|
echo "$type $hostname $community $port" >> $CONFIGFILE
|
|
}
|
|
|
|
snmpd_trap_ip_add() {
|
|
local cfg="$1"
|
|
config_get host_ip "$cfg" HostIP
|
|
config_get port "$cfg" Port
|
|
config_get community "$cfg" Community
|
|
config_get type "$cfg" Type
|
|
echo "$type $host_ip $community $port" >> $CONFIGFILE
|
|
}
|
|
|
|
snmpd_access_default_add() {
|
|
local cfg="$1"
|
|
config_get mode "$cfg" Mode
|
|
config_get community "$cfg" CommunityName
|
|
config_get oidrestrict "$cfg" RestrictOID
|
|
config_get oid "$cfg" RestrictedOID
|
|
echo -n "$mode $community default" >> $CONFIGFILE
|
|
[ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE
|
|
[ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE
|
|
}
|
|
|
|
snmpd_access_HostName_add() {
|
|
local cfg="$1"
|
|
config_get hostname "$cfg" HostName
|
|
config_get mode "$cfg" Mode
|
|
config_get community "$cfg" CommunityName
|
|
config_get oidrestrict "$cfg" RestrictOID
|
|
config_get oid "$cfg" RestrictedOID
|
|
echo -n "$mode $community $hostname" >> $CONFIGFILE
|
|
[ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE
|
|
[ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE
|
|
}
|
|
|
|
snmpd_access_HostIP_add() {
|
|
local cfg="$1"
|
|
config_get host_ip "$cfg" HostIP
|
|
config_get ip_mask "$cfg" IPMask
|
|
config_get mode "$cfg" Mode
|
|
config_get community "$cfg" CommunityName
|
|
config_get oidrestrict "$cfg" RestrictOID
|
|
config_get oid "$cfg" RestrictedOID
|
|
echo -n "$mode $community $host_ip/$ip_mask" >> $CONFIGFILE
|
|
[ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE
|
|
[ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
snmpd_engineid_add() {
|
|
local cfg="$1"
|
|
|
|
config_get engineid "$cfg" engineid
|
|
[ -n "$engineid" ] && echo "engineID $engineid" >> $CONFIGFILE
|
|
config_get engineidtype "$cfg" engineidtype
|
|
[ "$engineidtype" -ge 1 -a "$engineidtype" -le 3 ] && \
|
|
echo "engineIDType $engineidtype" >> $CONFIGFILE
|
|
config_get engineidnic "$cfg" engineidnic
|
|
[ -n "$engineidnic" ] && echo "engineIDNic $engineidnic" >> $CONFIGFILE
|
|
}
|
|
|
|
snmpd_setup_fw_rules() {
|
|
local net="$1"
|
|
local zone
|
|
|
|
zone=$(fw3 -q network "$net" 2>/dev/null)
|
|
|
|
local handled_zone
|
|
for handled_zone in $HANDLED_SNMP_ZONES; do
|
|
[ "$handled_zone" = "$zone" ] && return
|
|
done
|
|
|
|
json_add_object ""
|
|
json_add_string type rule
|
|
json_add_string src "$zone"
|
|
json_add_string proto udp
|
|
json_add_string dest_port 161
|
|
json_add_string target ACCEPT
|
|
json_close_object
|
|
|
|
HANDLED_SNMP_ZONES="$HANDLED_SNMP_ZONES $zone"
|
|
}
|
|
|
|
start_service() {
|
|
[ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE"
|
|
|
|
procd_open_instance
|
|
|
|
config_load snmpd
|
|
|
|
config_foreach snmpd_agent_add agent
|
|
config_foreach snmpd_agentx_add agentx
|
|
config_foreach snmpd_system_add system
|
|
config_foreach snmpd_com2sec_add com2sec
|
|
config_foreach snmpd_com2sec6_add com2sec6
|
|
config_foreach snmpd_group_add group
|
|
config_foreach snmpd_view_add view
|
|
config_foreach snmpd_access_add access
|
|
config_foreach snmpd_trap_hostname_add trap_HostName
|
|
config_foreach snmpd_trap_ip_add trap_HostIP
|
|
config_foreach snmpd_access_default_add access_default
|
|
config_foreach snmpd_access_HostName_add access_HostName
|
|
config_foreach snmpd_access_HostIP_add access_HostIP
|
|
config_foreach snmpd_pass_add pass
|
|
config_foreach snmpd_exec_add exec
|
|
config_foreach snmpd_disk_add disk
|
|
config_foreach snmpd_engineid_add engineid
|
|
|
|
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_open_data
|
|
|
|
json_add_array firewall
|
|
config_list_foreach general network snmpd_setup_fw_rules
|
|
json_close_array
|
|
|
|
procd_close_data
|
|
|
|
procd_close_instance
|
|
}
|
|
|
|
stop_service() {
|
|
[ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE"
|
|
}
|
|
|
|
service_triggers(){
|
|
local script=$(readlink "$initscript")
|
|
local name=$(basename ${script:-$initscript})
|
|
|
|
procd_open_trigger
|
|
procd_add_raw_trigger "interface.*" 2000 /etc/init.d/$name reload
|
|
procd_close_trigger
|
|
|
|
procd_add_reload_trigger 'snmpd'
|
|
}
|