lldpd.init 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  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. # lldpd 1.0.20 configure med fast-start -> configure lldp fast-start (doesn't depend on med, enabled unconditionally)
  192. # See: https://github.com/lldpd/lldpd/commit/f2ea6e6a86e7d70104e1428a94ec37a24fe604ef
  193. local lldp_fast_start
  194. config_get_bool lldp_fast_start 'config' 'lldpmed_fast_start' 0
  195. local lldp_fast_start_tx_interval
  196. config_get lldp_fast_start_tx_interval 'config' 'lldpmed_fast_start_tx_interval' 0
  197. if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
  198. local lldp_location
  199. config_get lldp_location 'config' 'lldp_location'
  200. local lldp_class
  201. config_get lldp_class 'config' 'lldp_class'
  202. local lldp_policy
  203. config_get lldp_policy 'config' 'lldp_policy'
  204. fi
  205. local lldp_agenttype
  206. config_get lldp_agenttype 'config' 'lldp_agenttype' 'nearest-bridge'
  207. local lldp_portidsubtype
  208. config_get lldp_portidsubtype 'config' 'lldp_portidsubtype' 'macaddress'
  209. local lldp_platform
  210. config_get lldp_platform 'config' 'lldp_platform' ""
  211. local lldp_tx_interval
  212. config_get lldp_tx_interval 'config' 'lldp_tx_interval' 0
  213. local lldp_tx_hold
  214. config_get lldp_tx_hold 'config' 'lldp_tx_hold' 0
  215. # Clear out the config file first
  216. echo -n > "$LLDPD_CONF"
  217. [ -n "$ifnames" ] && echo "configure system interface pattern $ifnames" >> "$LLDPD_CONF"
  218. [ -n "$lldp_description" ] && echo "configure system description" "\"$lldp_description\"" >> "$LLDPD_CONF"
  219. [ -n "$lldp_hostname" ] && echo "configure system hostname" "\"$lldp_hostname\"" >> "$LLDPD_CONF"
  220. [ -n "$lldp_mgmt_ip" ] && echo "configure system ip management pattern" "\"$lldp_mgmt_ip\"" >> "$LLDPD_CONF"
  221. [ -n "$lldp_syscapabilities" ] && echo "configure system capabilities enabled $lldp_syscapabilities" >> "$LLDPD_CONF"
  222. if [ "$lldpmed_no_inventory" = 0 ]; then
  223. # Hardware inventory info
  224. [ -n "$lldp_med_inv_hardware_revision" ] && echo "configure inventory hardware-revision \"$lldp_med_inv_hardware_revision\"" >> "$LLDPD_CONF"
  225. [ -n "$lldp_med_inv_firmware_revision" ] && echo "configure inventory firmware-revision \"$lldp_med_inv_firmware_revision\"" >> "$LLDPD_CONF"
  226. [ -n "$lldp_med_inv_software_revision" ] && echo "configure inventory software-revision \"$lldp_med_inv_software_revision\"" >> "$LLDPD_CONF"
  227. [ -n "$lldp_med_inv_serial_number" ] && echo "configure inventory serial-number \"$lldp_med_inv_serial_number\"" >> "$LLDPD_CONF"
  228. [ -n "$lldp_med_inv_manufacturer_name" ] && echo "configure inventory manufacturer \"$lldp_med_inv_manufacturer_name\"" >> "$LLDPD_CONF"
  229. [ -n "$lldp_med_inv_model_name" ] && echo "configure inventory model \"$lldp_med_inv_model_name\"" >> "$LLDPD_CONF"
  230. [ -n "$lldp_med_inv_asset_id" ] && echo "configure inventory asset \"$lldp_med_inv_asset_id\"" >> "$LLDPD_CONF"
  231. fi
  232. if [ "$lldp_fast_start" -gt 0 ]; then
  233. if [ "$lldp_fast_start_tx_interval" -gt 0 ]; then
  234. echo "configure lldp fast-start tx-interval $lldp_fast_start_tx_interval" >> "$LLDPD_CONF"
  235. else
  236. echo "configure lldp fast-start enable" >> "$LLDPD_CONF"
  237. fi
  238. fi
  239. if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
  240. # other 'configure med xxx' statements go here
  241. [ -n "$lldp_location" ] && echo "configure med location" "$lldp_location" >> "$LLDPD_CONF"
  242. # Manual states that if Class (-M) is 2 or 3, at least one network policy must be defined
  243. case "$lldp_class" in
  244. 2 | 3 ) [ -n "$lldp_policy" ] && echo "configure med policy $lldp_policy" >> "$LLDPD_CONF"
  245. ;;
  246. esac
  247. fi
  248. [ -n "$lldp_agenttype" ] && echo "configure lldp agent-type" "\"$lldp_agenttype\"" >> "$LLDPD_CONF"
  249. [ -n "$lldp_portidsubtype" ] && echo "configure lldp portidsubtype" "\"$lldp_portidsubtype\"" >> "$LLDPD_CONF"
  250. [ -n "$lldp_platform" ] && echo "configure system platform" "\"$lldp_platform\"" >> "$LLDPD_CONF"
  251. [ -n "$lldp_tx_interval" ] && echo "configure lldp tx-interval $lldp_tx_interval" >> "$LLDPD_CONF"
  252. [ "$lldp_tx_hold" -gt 0 ] && echo "configure lldp tx-hold $lldp_tx_hold" >> "$LLDPD_CONF"
  253. [ "$lldp_capability_advertisements" -gt 0 ] && echo "configure lldp capabilities-advertisements" >> "$LLDPD_CONF" ||\
  254. echo "unconfigure lldp capabilities-advertisements" >> "$LLDPD_CONF"
  255. [ "$lldp_mgmt_addr_advertisements" -gt 0 ] && echo "configure lldp management-addresses-advertisements" >> "$LLDPD_CONF" ||\
  256. echo "unconfigure lldp management-addresses-advertisements" >> "$LLDPD_CONF"
  257. # Custom TLV handling
  258. config_foreach add_custom_tlv_callback 'custom-tlv'
  259. # Since lldpd's sysconfdir is /tmp, we'll symlink /etc/lldpd.d to /tmp/$LLDPD_CONFS_DIR
  260. [ -e "$LLDPD_CONFS_DIR" ] || ln -s /etc/lldpd.d "$LLDPD_CONFS_DIR"
  261. }
  262. start_service() {
  263. local enable_lldp
  264. local force_lldp
  265. local enable_cdp
  266. local cdp_version
  267. local force_cdp
  268. local force_cdpv2
  269. local enable_fdp
  270. local force_fdp
  271. local enable_sonmp
  272. local force_sonmp
  273. local enable_edp
  274. local force_edp
  275. local lldp_class
  276. local lldp_no_version
  277. local lldpmed_no_inventory
  278. local readonly_mode
  279. local agentxsocket
  280. local filter
  281. config_load 'lldpd'
  282. config_get_bool enable_lldp 'config' 'enable_lldp' 1
  283. config_get_bool force_lldp 'config' 'force_lldp' 0
  284. if [ "$CONFIG_LLDPD_WITH_CDP" = "y" ]; then
  285. config_get_bool enable_cdp 'config' 'enable_cdp' 0
  286. config_get cdp_version 'config' 'cdp_version' 'cdpv1v2'
  287. config_get_bool force_cdp 'config' 'force_cdp' 0
  288. config_get_bool force_cdpv2 'config' 'force_cdpv2' 0
  289. fi
  290. if [ "$CONFIG_LLDPD_WITH_FDP" = "y" ]; then
  291. config_get_bool enable_fdp 'config' 'enable_fdp' 0
  292. config_get_bool force_fdp 'config' 'force_fdp' 0
  293. fi
  294. if [ "$CONFIG_LLDPD_WITH_SONMP" = "y" ]; then
  295. config_get_bool enable_sonmp 'config' 'enable_sonmp' 0
  296. config_get_bool force_sonmp 'config' 'force_sonmp' 0
  297. fi
  298. if [ "$CONFIG_LLDPD_WITH_EDP" = "y" ]; then
  299. config_get_bool enable_edp 'config' 'enable_edp' 0
  300. config_get_bool force_edp 'config' 'force_edp' 0
  301. fi
  302. config_get_bool lldp_no_version 'config' 'lldp_no_version' 0
  303. if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
  304. config_get_bool lldpmed_no_inventory 'config' 'lldpmed_no_inventory' 0
  305. config_get lldp_class 'config' 'lldp_class'
  306. fi
  307. config_get_bool readonly_mode 'config' 'readonly_mode' 0
  308. if [ "$CONFIG_LLDPD_WITH_SNMP" = "y" ]; then
  309. config_get agentxsocket 'config' 'agentxsocket'
  310. fi
  311. config_get filter 'config' 'filter' 15
  312. mkdir -p ${LLDPD_RUN}
  313. chown lldp:lldp ${LLDPD_RUN}
  314. # When lldpd starts, it also loads up what we write in this config file
  315. write_lldpd_conf
  316. procd_open_instance
  317. procd_set_param command ${LLDPDBIN}
  318. procd_append_param command -d
  319. if [ "$enable_lldp" -gt 0 ]; then
  320. if [ "$force_lldp" -gt 0 ]; then
  321. procd_append_param command '-l'
  322. fi
  323. else
  324. # Disable LLDP
  325. procd_append_param command '-ll'
  326. fi
  327. if [ "$CONFIG_LLDPD_WITH_CDP" = "y" ] && [ "$enable_cdp" -gt 0 ]; then
  328. if [ "$cdp_version" = "cdpv2" ]; then
  329. if [ "$force_cdp" -gt 0 ]; then
  330. # CDPv1 disabled, CDPv2 forced
  331. procd_append_param command '-ccccc'
  332. else
  333. # CDPv1 disabled, CDPv2 enabled
  334. procd_append_param command '-cccc'
  335. fi
  336. elif [ "$cdp_version" = "cdpv1v2" ]; then
  337. if [ "$force_cdp" -gt 0 ] && [ "$force_cdpv2" -gt 0 ]; then
  338. # CDPv1 enabled, CDPv2 forced
  339. procd_append_param command '-ccc'
  340. elif [ "$force_cdp" -gt 0 ]; then
  341. # CDPv1 forced, CDPv2 enabled
  342. procd_append_param command '-cc'
  343. else
  344. # CDPv1 and CDPv2 enabled
  345. procd_append_param command '-c'
  346. fi
  347. fi
  348. fi
  349. if [ "$CONFIG_LLDPD_WITH_FDP" = "y" ] && [ "$enable_fdp" -gt 0 ]; then
  350. if [ "$force_fdp" -gt 0 ]; then
  351. # FDP enabled and forced
  352. procd_append_param command '-ff'
  353. else
  354. # FDP enabled
  355. procd_append_param command '-f'
  356. fi
  357. fi
  358. if [ "$CONFIG_LLDPD_WITH_SONMP" = "y" ] && [ "$enable_sonmp" -gt 0 ]; then
  359. if [ "$force_sonmp" -gt 0 ]; then
  360. # SONMP enabled and forced
  361. procd_append_param command '-ss'
  362. else
  363. # SONMP enabled
  364. procd_append_param command '-s'
  365. fi
  366. fi
  367. if [ "$CONFIG_LLDPD_WITH_EDP" = "y" ] && [ "$enable_edp" -gt 0 ]; then
  368. if [ "$force_edp" -gt 0 ]; then
  369. # EDP enabled and forced
  370. procd_append_param command '-ee'
  371. else
  372. # EDP enabled
  373. procd_append_param command '-e'
  374. fi
  375. fi
  376. [ "$readonly_mode" -gt 0 ] && procd_append_param command '-r'
  377. [ "$lldp_no_version" -gt 0 ] && procd_append_param command '-k'
  378. [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ] && [ "$lldpmed_no_inventory" -gt 0 ] && procd_append_param command '-i'
  379. [ -n "$lldp_class" ] && procd_append_param command -M "$lldp_class"
  380. [ "$CONFIG_LLDPD_WITH_SNMP" = "y" ] && [ -n "$agentxsocket" ] && procd_append_param command -x -X "$agentxsocket"
  381. [ -n "$filter" ] && procd_append_param command -H "$filter"
  382. # ChassisID interfaces
  383. local ifnames
  384. get_interface_csv ifnames 'config' "cid_interface"
  385. [ -n "$ifnames" ] && procd_append_param command -C "$ifnames"
  386. # Overwrite default configuration locations processed by lldpcli at start
  387. procd_append_param command -O "$LLDPD_CONF"
  388. local restart_hash
  389. get_config_restart_hash restart_hash
  390. echo -n "$restart_hash" > "$LLDPD_RESTART_HASH"
  391. # set auto respawn behavior
  392. procd_set_param respawn
  393. procd_close_instance
  394. }
  395. service_triggers() {
  396. procd_add_config_trigger "config.change" "lldpd" /etc/init.d/lldpd reload
  397. }
  398. reload_service() {
  399. running || return 1
  400. local running_hash=""
  401. local config_hash=""
  402. get_config_restart_hash config_hash
  403. [ -f ${LLDPD_RESTART_HASH} ] && running_hash=$(cat "$LLDPD_RESTART_HASH")
  404. if [ "x$running_hash" != "x$config_hash" ]; then
  405. # Restart LLDPd
  406. # Some parameters can't be configured at runtime
  407. restart
  408. return 0
  409. fi
  410. $LLDPCLI -u "$LLDPSOCKET" >/dev/null 2>&1 <<-EOF
  411. pause
  412. unconfigure lldp custom-tlv
  413. unconfigure lldp fast-start
  414. unconfigure lldp capabilities-advertisements
  415. unconfigure lldp management-addresses-advertisements
  416. # unconfigures user-configured system capabilities, and instead uses the kernel information:
  417. unconfigure system capabilities enabled
  418. unconfigure system interface pattern
  419. unconfigure system description
  420. unconfigure system hostname
  421. unconfigure system ip management pattern
  422. unconfigure system platform
  423. # Hardware inventory info
  424. unconfigure inventory hardware-revision
  425. unconfigure inventory firmware-revision
  426. unconfigure inventory software-revision
  427. unconfigure inventory serial-number
  428. unconfigure inventory manufacturer
  429. unconfigure inventory model
  430. unconfigure inventory asset
  431. EOF
  432. if [ "$CONFIG_LLDPD_WITH_LLDPMED" = "y" ]; then
  433. $LLDPCLI -u "$LLDPSOCKET" >/dev/null 2>&1 <<-EOF
  434. # unconfigure med xxxxxxx
  435. EOF
  436. fi
  437. # Rewrite lldpd.conf
  438. # If something changed it should be included by the lldpcli call
  439. write_lldpd_conf
  440. $LLDPCLI -u "$LLDPSOCKET" -c "$LLDPD_CONF" -c "$LLDPD_CONFS_DIR" >/dev/null 2>&1
  441. # Broadcast update over the wire
  442. $LLDPCLI -u "$LLDPSOCKET" >/dev/null 2>&1 <<-EOF
  443. resume
  444. update
  445. EOF
  446. return 0
  447. }
  448. stop_service() {
  449. rm -rf ${LLDPD_RUN} "$LLDPSOCKET" >/dev/null 2>&1
  450. }