lldpd.init 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. #!/bin/sh /etc/rc.common
  2. # Copyright (C) 2008-2015 OpenWrt.org
  3. # shellcheck disable=1091,2034,3037,3043,3045,3057
  4. START=90
  5. STOP=01
  6. CONFIG_LLDPD_WITH_CDP=y
  7. CONFIG_LLDPD_WITH_EDP=y
  8. CONFIG_LLDPD_WITH_FDP=y
  9. CONFIG_LLDPD_WITH_LLDPMED=y
  10. CONFIG_LLDPD_WITH_SNMP=y
  11. CONFIG_LLDPD_WITH_SONMP=y
  12. USE_PROCD=1
  13. LLDPDBIN=/usr/sbin/lldpd
  14. LLDPCLI=/usr/sbin/lldpcli
  15. LLDPSOCKET=/var/run/lldpd.socket
  16. LLDPD_CONF=/tmp/lldpd.conf
  17. LLDPD_CONFS_DIR=/tmp/lldpd.d
  18. LLDPD_RUN=/var/run/lldpd
  19. LLDPD_RESTART_HASH=${LLDPD_RUN}/lldpd.restart_hash
  20. . "$IPKG_INSTROOT/lib/functions/network.sh"
  21. # Load release info once for all 'find_*' functions
  22. [ -s /etc/os-release ] && . /etc/os-release
  23. # Helper function to truncate output to 31 characters
  24. truncate_output() {
  25. # Some devices have trouble decoding inventory TLV strings > 31 chars
  26. # lldpd truncates inventory TLV to a total TLV length of 36 (of which string = 32)
  27. echo "${1:0:31}"
  28. }
  29. find_release_info()
  30. {
  31. [ -z "$PRETTY_NAME" ] && [ -s /etc/openwrt_version ] && \
  32. PRETTY_NAME="$(cat /etc/openwrt_version)"
  33. echo "${PRETTY_NAME:-Unknown OpenWrt release} @ $(cat /proc/sys/kernel/hostname)"
  34. }
  35. find_hardware_revision()
  36. {
  37. echo "${OPENWRT_DEVICE_REVISION:-Unknown hardware revision}"
  38. }
  39. find_firmware_info()
  40. {
  41. echo "${PRETTY_NAME:-Unknown firmware release}"
  42. }
  43. find_software_revision()
  44. {
  45. echo "${BUILD_ID:-Unknown software revision}"
  46. }
  47. # Helper function to extract JSON values using jsonfilter
  48. extract_json_field() {
  49. local _path="$1"
  50. jsonfilter -q -i /etc/board.json -e "$_path" 2>/dev/null
  51. }
  52. find_manufacturer_info()
  53. {
  54. local _id
  55. # extract the model->id field, e.g.: "id": "glinet,gl-mt6000",
  56. _id=$(extract_json_field '@.model.id')
  57. # stash text up to first comma
  58. _id="${_id%%,*}"
  59. echo "${_id:-Unknown manufacturer}"
  60. }
  61. find_model_info()
  62. {
  63. local _name
  64. # extract the model->name field, e.g.: "name": "GL.iNet GL-MT6000"
  65. _name=$(extract_json_field '@.model.name')
  66. echo "${_name:-Unknown model name}"
  67. }
  68. get_config_restart_hash() {
  69. local var="$1"
  70. local _string _hash v
  71. config_load 'lldpd'
  72. if [ "$CONFIG_LLDPD_WITH_SNMP" = "y" ]; then
  73. config_get v 'config' 'agentxsocket'; append _string "$v" ","
  74. fi
  75. config_get v 'config' 'cid_interface'; append _string "$v" ","
  76. config_get v 'config' 'filter'; append _string "$v" ","
  77. config_get_bool v 'config' 'readonly_mode'; append _string "$v" ","
  78. config_get_bool v 'config' 'lldp_no_version'; append _string "$v" ","
  79. if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
  80. config_get_bool v 'config' 'lldpmed_no_inventory'; append _string "$v" ","
  81. config_get v 'config' 'lldp_class'; append _string "$v" ","
  82. fi
  83. config_get_bool v 'config' 'enable_lldp' 1; append _string "$v" ","
  84. config_get_bool v 'config' 'force_lldp'; append _string "$v" ","
  85. if [ "$CONFIG_LLDPD_WITH_CDP" = "y" ]; then
  86. config_get_bool v 'config' 'enable_cdp'; append _string "$v" ","
  87. config_get v 'config' 'cdp_version'; append _string "$v" ","
  88. config_get_bool v 'config' 'force_cdp'; append _string "$v" ","
  89. config_get_bool v 'config' 'force_cdpv2'; append _string "$v" ","
  90. fi
  91. if [ "$CONFIG_LLDPD_WITH_EDP" = "y" ]; then
  92. config_get_bool v 'config' 'enable_edp'; append _string "$v" ","
  93. config_get_bool v 'config' 'force_edp'; append _string "$v" ","
  94. fi
  95. if [ "$CONFIG_LLDPD_WITH_FDP" = "y" ]; then
  96. config_get_bool v 'config' 'enable_fdp'; append _string "$v" ","
  97. config_get_bool v 'config' 'force_fdp'; append _string "$v" ","
  98. fi
  99. if [ "$CONFIG_LLDPD_WITH_SONMP" = "y" ]; then
  100. config_get_bool v 'config' 'enable_sonmp'; append _string "$v" ","
  101. config_get_bool v 'config' 'force_sonmp'; append _string "$v" ","
  102. fi
  103. _hash=$(echo -n "${_string}" | md5sum | awk '{ print $1 }')
  104. export -n "$var=$_hash"
  105. }
  106. get_interface_csv() {
  107. local _ifaces
  108. config_get _ifaces "$2" "$3"
  109. local _iface _ifnames=""
  110. # Set noglob to prevent '*' capturing diverse file names in the for ... in
  111. set -o noglob
  112. for _iface in $_ifaces; do
  113. local _l2device=""
  114. if network_get_physdev _l2device "$_iface" || [ -e "/sys/class/net/$_iface" ]; then
  115. append _ifnames "${_l2device:-$_iface}" ","
  116. else
  117. # Glob case (interface is e.g. '!eth1' or 'eth*' or '*')
  118. append _ifnames "$_iface" ","
  119. fi
  120. done
  121. # Turn noglob off i.e. enable glob again
  122. set +o noglob
  123. export -n "${1}=$_ifnames"
  124. }
  125. add_custom_tlv_callback()
  126. {
  127. # syntax: configure [ports ethX[,…]] lldp custom-tlv [add|replace] oui XX,XX,XX subtype XX oui-info XX[,XX,...]
  128. # ex: configure ports br-lan,eth0 lldp custom-tlv replace oui 33,44,55 subtype 254 oui-info 55,55,55,55,55
  129. # ex: configure lldp custom-tlv oui 33,44,44 subtype 232
  130. local _ports
  131. local _tlv
  132. # CSV of device ports
  133. get_interface_csv _ports "$1" 'ports'
  134. config_get _tlv "$1" 'tlv'
  135. echo "configure ${_ports:+ports $_ports }lldp custom-tlv $_tlv" >> "$LLDPD_CONF"
  136. }
  137. write_lldpd_conf()
  138. {
  139. local lldp_description
  140. config_load 'lldpd'
  141. config_get lldp_description 'config' 'lldp_description' "$(find_release_info)"
  142. # Check the 'do not send inventory' flag
  143. local lldpmed_no_inventory
  144. config_get_bool lldpmed_no_inventory 'config' 'lldpmed_no_inventory' 0
  145. if [ "$lldpmed_no_inventory" = 0 ]; then
  146. # lldpmed_no_inventory=1 ('-i' in start_service()) prevents these from being sent
  147. # TIA TR-41 TLV 127 subtype 0x05
  148. local lldp_med_inv_hardware_revision
  149. config_get lldp_med_inv_hardware_revision 'config' 'lldp_med_inv_hardware_revision' "$(find_hardware_revision)"
  150. lldp_med_inv_hardware_revision=$(truncate_output "$lldp_med_inv_hardware_revision")
  151. # TIA TR-41 TLV 127 subtype 0x06
  152. local lldp_med_inv_firmware_revision
  153. config_get lldp_med_inv_firmware_revision 'config' 'lldp_med_inv_firmware_revision' "$(find_firmware_info)"
  154. lldp_med_inv_firmware_revision=$(truncate_output "$lldp_med_inv_firmware_revision")
  155. # TIA TR-41 TLV 127 subtype 0x07
  156. local lldp_med_inv_software_revision
  157. config_get lldp_med_inv_software_revision 'config' 'lldp_med_inv_software_revision' "$(find_software_revision)"
  158. lldp_med_inv_software_revision=$(truncate_output "$lldp_med_inv_software_revision")
  159. # TIA TR-41 TLV 127 subtype 0x08
  160. local lldp_med_inv_serial_number
  161. config_get lldp_med_inv_serial_number 'config' 'lldp_med_inv_serial_number'
  162. lldp_med_inv_serial_number=$(truncate_output "$lldp_med_inv_serial_number")
  163. # TIA TR-41 TLV 127 subtype 0x09
  164. local lldp_med_inv_manufacturer_name
  165. config_get lldp_med_inv_manufacturer_name 'config' 'lldp_med_inv_manufacturer_name' "$(find_manufacturer_info)"
  166. lldp_med_inv_manufacturer_name=$(truncate_output "$lldp_med_inv_manufacturer_name")
  167. # TIA TR-41 TLV 127 subtype 0x0a
  168. local lldp_med_inv_model_name
  169. config_get lldp_med_inv_model_name 'config' 'lldp_med_inv_model_name' "$(find_model_info)"
  170. lldp_med_inv_model_name=$(truncate_output "$lldp_med_inv_model_name")
  171. # TIA TR-41 TLV 127 subtype 0x0b
  172. local lldp_med_inv_asset_id
  173. config_get lldp_med_inv_asset_id 'config' 'lldp_med_inv_asset_id'
  174. lldp_med_inv_asset_id=$(truncate_output "$lldp_med_inv_asset_id")
  175. fi
  176. local lldp_hostname
  177. config_get lldp_hostname 'config' 'lldp_hostname' "$(cat /proc/sys/kernel/hostname)"
  178. local ifnames
  179. get_interface_csv ifnames 'config' "interface"
  180. local lldp_mgmt_ip
  181. config_get lldp_mgmt_ip 'config' 'lldp_mgmt_ip'
  182. # Configurable capabilities in lldpd >= v1.0.15: defaults to 'unconfigured' i.e. kernel info
  183. local lldp_syscapabilities
  184. config_get lldp_syscapabilities 'config' 'lldp_syscapabilities'
  185. # Configurable capabilities in lldpd >= v1.0.15: defaults to on in lldpd
  186. local lldp_capability_advertisements
  187. config_get_bool lldp_capability_advertisements 'config' 'lldp_capability_advertisements' 1
  188. # Broadcast management address in lldpd >= 0.7.15: defaults to on in lldpd
  189. local lldp_mgmt_addr_advertisements
  190. config_get_bool lldp_mgmt_addr_advertisements 'config' 'lldp_mgmt_addr_advertisements' 1
  191. if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
  192. local lldpmed_fast_start
  193. config_get_bool lldpmed_fast_start 'config' 'lldpmed_fast_start' 0
  194. local lldpmed_fast_start_tx_interval
  195. config_get lldpmed_fast_start_tx_interval 'config' 'lldpmed_fast_start_tx_interval' 0
  196. local lldp_location
  197. config_get lldp_location 'config' 'lldp_location'
  198. local lldp_class
  199. config_get lldp_class 'config' 'lldp_class'
  200. local lldp_policy
  201. config_get lldp_policy 'config' 'lldp_policy'
  202. fi
  203. local lldp_agenttype
  204. config_get lldp_agenttype 'config' 'lldp_agenttype' 'nearest-bridge'
  205. local lldp_portidsubtype
  206. config_get lldp_portidsubtype 'config' 'lldp_portidsubtype' 'macaddress'
  207. local lldp_platform
  208. config_get lldp_platform 'config' 'lldp_platform' ""
  209. local lldp_tx_interval
  210. config_get lldp_tx_interval 'config' 'lldp_tx_interval' 0
  211. local lldp_tx_hold
  212. config_get lldp_tx_hold 'config' 'lldp_tx_hold' 0
  213. # Clear out the config file first
  214. echo -n > "$LLDPD_CONF"
  215. [ -n "$ifnames" ] && echo "configure system interface pattern $ifnames" >> "$LLDPD_CONF"
  216. [ -n "$lldp_description" ] && echo "configure system description" "\"$lldp_description\"" >> "$LLDPD_CONF"
  217. [ -n "$lldp_hostname" ] && echo "configure system hostname" "\"$lldp_hostname\"" >> "$LLDPD_CONF"
  218. [ -n "$lldp_mgmt_ip" ] && echo "configure system ip management pattern" "\"$lldp_mgmt_ip\"" >> "$LLDPD_CONF"
  219. [ -n "$lldp_syscapabilities" ] && echo "configure system capabilities enabled $lldp_syscapabilities" >> "$LLDPD_CONF"
  220. if [ "$lldpmed_no_inventory" = 0 ]; then
  221. # Hardware inventory info
  222. [ -n "$lldp_med_inv_hardware_revision" ] && echo "configure inventory hardware-revision \"$lldp_med_inv_hardware_revision\"" >> "$LLDPD_CONF"
  223. [ -n "$lldp_med_inv_firmware_revision" ] && echo "configure inventory firmware-revision \"$lldp_med_inv_firmware_revision\"" >> "$LLDPD_CONF"
  224. [ -n "$lldp_med_inv_software_revision" ] && echo "configure inventory software-revision \"$lldp_med_inv_software_revision\"" >> "$LLDPD_CONF"
  225. [ -n "$lldp_med_inv_serial_number" ] && echo "configure inventory serial-number \"$lldp_med_inv_serial_number\"" >> "$LLDPD_CONF"
  226. [ -n "$lldp_med_inv_manufacturer_name" ] && echo "configure inventory manufacturer \"$lldp_med_inv_manufacturer_name\"" >> "$LLDPD_CONF"
  227. [ -n "$lldp_med_inv_model_name" ] && echo "configure inventory model \"$lldp_med_inv_model_name\"" >> "$LLDPD_CONF"
  228. [ -n "$lldp_med_inv_asset_id" ] && echo "configure inventory asset \"$lldp_med_inv_asset_id\"" >> "$LLDPD_CONF"
  229. fi
  230. if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ] && [ "$lldpmed_fast_start" -gt 0 ]; then
  231. if [ "$lldpmed_fast_start_tx_interval" -gt 0 ]; then
  232. echo "configure med fast-start tx-interval $lldpmed_fast_start_tx_interval" >> "$LLDPD_CONF"
  233. else
  234. echo "configure med fast-start enable" >> "$LLDPD_CONF"
  235. fi
  236. fi
  237. if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
  238. # other 'configure med xxx' statements go here
  239. [ -n "$lldp_location" ] && echo "configure med location" "$lldp_location" >> "$LLDPD_CONF"
  240. # Manual states that if Class (-M) is 2 or 3, at least one network policy must be defined
  241. case "$lldp_class" in
  242. 2 | 3 ) [ -n "$lldp_policy" ] && echo "configure med policy $lldp_policy" >> "$LLDPD_CONF"
  243. ;;
  244. esac
  245. fi
  246. [ -n "$lldp_agenttype" ] && echo "configure lldp agent-type" "\"$lldp_agenttype\"" >> "$LLDPD_CONF"
  247. [ -n "$lldp_portidsubtype" ] && echo "configure lldp portidsubtype" "\"$lldp_portidsubtype\"" >> "$LLDPD_CONF"
  248. [ -n "$lldp_platform" ] && echo "configure system platform" "\"$lldp_platform\"" >> "$LLDPD_CONF"
  249. [ -n "$lldp_tx_interval" ] && echo "configure lldp tx-interval $lldp_tx_interval" >> "$LLDPD_CONF"
  250. [ "$lldp_tx_hold" -gt 0 ] && echo "configure lldp tx-hold $lldp_tx_hold" >> "$LLDPD_CONF"
  251. [ "$lldp_capability_advertisements" -gt 0 ] && echo "configure lldp capabilities-advertisements" >> "$LLDPD_CONF" ||\
  252. echo "unconfigure lldp capabilities-advertisements" >> "$LLDPD_CONF"
  253. [ "$lldp_mgmt_addr_advertisements" -gt 0 ] && echo "configure lldp management-addresses-advertisements" >> "$LLDPD_CONF" ||\
  254. echo "unconfigure lldp management-addresses-advertisements" >> "$LLDPD_CONF"
  255. # Custom TLV handling
  256. config_foreach add_custom_tlv_callback 'custom-tlv'
  257. # Since lldpd's sysconfdir is /tmp, we'll symlink /etc/lldpd.d to /tmp/$LLDPD_CONFS_DIR
  258. [ -e "$LLDPD_CONFS_DIR" ] || ln -s /etc/lldpd.d "$LLDPD_CONFS_DIR"
  259. }
  260. start_service() {
  261. local enable_lldp
  262. local force_lldp
  263. local enable_cdp
  264. local cdp_version
  265. local force_cdp
  266. local force_cdpv2
  267. local enable_fdp
  268. local force_fdp
  269. local enable_sonmp
  270. local force_sonmp
  271. local enable_edp
  272. local force_edp
  273. local lldp_class
  274. local lldp_no_version
  275. local lldpmed_no_inventory
  276. local readonly_mode
  277. local agentxsocket
  278. local filter
  279. config_load 'lldpd'
  280. config_get_bool enable_lldp 'config' 'enable_lldp' 1
  281. config_get_bool force_lldp 'config' 'force_lldp' 0
  282. if [ "$CONFIG_LLDPD_WITH_CDP" = "y" ]; then
  283. config_get_bool enable_cdp 'config' 'enable_cdp' 0
  284. config_get cdp_version 'config' 'cdp_version' 'cdpv1v2'
  285. config_get_bool force_cdp 'config' 'force_cdp' 0
  286. config_get_bool force_cdpv2 'config' 'force_cdpv2' 0
  287. fi
  288. if [ "$CONFIG_LLDPD_WITH_FDP" = "y" ]; then
  289. config_get_bool enable_fdp 'config' 'enable_fdp' 0
  290. config_get_bool force_fdp 'config' 'force_fdp' 0
  291. fi
  292. if [ "$CONFIG_LLDPD_WITH_SONMP" = "y" ]; then
  293. config_get_bool enable_sonmp 'config' 'enable_sonmp' 0
  294. config_get_bool force_sonmp 'config' 'force_sonmp' 0
  295. fi
  296. if [ "$CONFIG_LLDPD_WITH_EDP" = "y" ]; then
  297. config_get_bool enable_edp 'config' 'enable_edp' 0
  298. config_get_bool force_edp 'config' 'force_edp' 0
  299. fi
  300. config_get_bool lldp_no_version 'config' 'lldp_no_version' 0
  301. if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
  302. config_get_bool lldpmed_no_inventory 'config' 'lldpmed_no_inventory' 0
  303. config_get lldp_class 'config' 'lldp_class'
  304. fi
  305. config_get_bool readonly_mode 'config' 'readonly_mode' 0
  306. if [ "$CONFIG_LLDPD_WITH_SNMP" = "y" ]; then
  307. config_get agentxsocket 'config' 'agentxsocket'
  308. fi
  309. config_get filter 'config' 'filter' 15
  310. mkdir -p ${LLDPD_RUN}
  311. chown lldp:lldp ${LLDPD_RUN}
  312. # When lldpd starts, it also loads up what we write in this config file
  313. write_lldpd_conf
  314. procd_open_instance
  315. procd_set_param command ${LLDPDBIN}
  316. procd_append_param command -d
  317. if [ "$enable_lldp" -gt 0 ]; then
  318. if [ "$force_lldp" -gt 0 ]; then
  319. procd_append_param command '-l'
  320. fi
  321. else
  322. # Disable LLDP
  323. procd_append_param command '-ll'
  324. fi
  325. if [ "$CONFIG_LLDPD_WITH_CDP" = "y" ] && [ "$enable_cdp" -gt 0 ]; then
  326. if [ "$cdp_version" = "cdpv2" ]; then
  327. if [ "$force_cdp" -gt 0 ]; then
  328. # CDPv1 disabled, CDPv2 forced
  329. procd_append_param command '-ccccc'
  330. else
  331. # CDPv1 disabled, CDPv2 enabled
  332. procd_append_param command '-cccc'
  333. fi
  334. elif [ "$cdp_version" = "cdpv1v2" ]; then
  335. if [ "$force_cdp" -gt 0 ] && [ "$force_cdpv2" -gt 0 ]; then
  336. # CDPv1 enabled, CDPv2 forced
  337. procd_append_param command '-ccc'
  338. elif [ "$force_cdp" -gt 0 ]; then
  339. # CDPv1 forced, CDPv2 enabled
  340. procd_append_param command '-cc'
  341. else
  342. # CDPv1 and CDPv2 enabled
  343. procd_append_param command '-c'
  344. fi
  345. fi
  346. fi
  347. if [ "$CONFIG_LLDPD_WITH_FDP" = "y" ] && [ "$enable_fdp" -gt 0 ]; then
  348. if [ "$force_fdp" -gt 0 ]; then
  349. # FDP enabled and forced
  350. procd_append_param command '-ff'
  351. else
  352. # FDP enabled
  353. procd_append_param command '-f'
  354. fi
  355. fi
  356. if [ "$CONFIG_LLDPD_WITH_SONMP" = "y" ] && [ "$enable_sonmp" -gt 0 ]; then
  357. if [ "$force_sonmp" -gt 0 ]; then
  358. # SONMP enabled and forced
  359. procd_append_param command '-ss'
  360. else
  361. # SONMP enabled
  362. procd_append_param command '-s'
  363. fi
  364. fi
  365. if [ "$CONFIG_LLDPD_WITH_EDP" = "y" ] && [ "$enable_edp" -gt 0 ]; then
  366. if [ "$force_edp" -gt 0 ]; then
  367. # EDP enabled and forced
  368. procd_append_param command '-ee'
  369. else
  370. # EDP enabled
  371. procd_append_param command '-e'
  372. fi
  373. fi
  374. [ "$readonly_mode" -gt 0 ] && procd_append_param command '-r'
  375. [ "$lldp_no_version" -gt 0 ] && procd_append_param command '-k'
  376. [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ] && [ "$lldpmed_no_inventory" -gt 0 ] && procd_append_param command '-i'
  377. [ -n "$lldp_class" ] && procd_append_param command -M "$lldp_class"
  378. [ "$CONFIG_LLDPD_WITH_SNMP" = "y" ] && [ -n "$agentxsocket" ] && procd_append_param command -x -X "$agentxsocket"
  379. [ -n "$filter" ] && procd_append_param command -H "$filter"
  380. # ChassisID interfaces
  381. local ifnames
  382. get_interface_csv ifnames 'config' "cid_interface"
  383. [ -n "$ifnames" ] && procd_append_param command -C "$ifnames"
  384. # Overwrite default configuration locations processed by lldpcli at start
  385. procd_append_param command -O "$LLDPD_CONF"
  386. local restart_hash
  387. get_config_restart_hash restart_hash
  388. echo -n "$restart_hash" > "$LLDPD_RESTART_HASH"
  389. # set auto respawn behavior
  390. procd_set_param respawn
  391. procd_close_instance
  392. }
  393. service_triggers() {
  394. procd_add_config_trigger "config.change" "lldpd" /etc/init.d/lldpd reload
  395. }
  396. reload_service() {
  397. running || return 1
  398. local running_hash=""
  399. local config_hash=""
  400. get_config_restart_hash config_hash
  401. [ -f ${LLDPD_RESTART_HASH} ] && running_hash=$(cat "$LLDPD_RESTART_HASH")
  402. if [ "x$running_hash" != "x$config_hash" ]; then
  403. # Restart LLDPd
  404. # Some parameters can't be configured at runtime
  405. restart
  406. return 0
  407. fi
  408. $LLDPCLI -u "$LLDPSOCKET" >/dev/null 2>&1 <<-EOF
  409. pause
  410. unconfigure lldp custom-tlv
  411. unconfigure lldp capabilities-advertisements
  412. unconfigure lldp management-addresses-advertisements
  413. # unconfigures user-configured system capabilities, and instead uses the kernel information:
  414. unconfigure system capabilities enabled
  415. unconfigure system interface pattern
  416. unconfigure system description
  417. unconfigure system hostname
  418. unconfigure system ip management pattern
  419. unconfigure system platform
  420. # Hardware inventory info
  421. unconfigure inventory hardware-revision
  422. unconfigure inventory firmware-revision
  423. unconfigure inventory software-revision
  424. unconfigure inventory serial-number
  425. unconfigure inventory manufacturer
  426. unconfigure inventory model
  427. unconfigure inventory asset
  428. EOF
  429. if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
  430. $LLDPCLI -u "$LLDPSOCKET" >/dev/null 2>&1 <<-EOF
  431. unconfigure med fast-start
  432. EOF
  433. fi
  434. # Rewrite lldpd.conf
  435. # If something changed it should be included by the lldpcli call
  436. write_lldpd_conf
  437. $LLDPCLI -u "$LLDPSOCKET" -c "$LLDPD_CONF" -c "$LLDPD_CONFS_DIR" >/dev/null 2>&1
  438. # Broadcast update over the wire
  439. $LLDPCLI -u "$LLDPSOCKET" >/dev/null 2>&1 <<-EOF
  440. resume
  441. update
  442. EOF
  443. return 0
  444. }
  445. stop_service() {
  446. rm -rf ${LLDPD_RUN} "$LLDPSOCKET" >/dev/null 2>&1
  447. }