logstash-integration-snmp 4.0.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (324) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +23 -0
  3. data/CONTRIBUTORS +20 -0
  4. data/Gemfile +11 -0
  5. data/LICENSE +202 -0
  6. data/README.md +89 -0
  7. data/VERSION +1 -0
  8. data/docs/index.asciidoc +202 -0
  9. data/docs/input-snmp.asciidoc +524 -0
  10. data/docs/input-snmptrap.asciidoc +392 -0
  11. data/lib/logstash/inputs/snmp.rb +369 -0
  12. data/lib/logstash/inputs/snmptrap.rb +190 -0
  13. data/lib/logstash/plugin_mixins/snmp/common.rb +197 -0
  14. data/lib/logstash-integration-snmp_jars.rb +6 -0
  15. data/lib/mibs/ietf/ACCOUNTING-CONTROL-MIB.dic +1316 -0
  16. data/lib/mibs/ietf/ADSL-LINE-EXT-MIB.dic +1724 -0
  17. data/lib/mibs/ietf/ADSL-LINE-MIB.dic +7297 -0
  18. data/lib/mibs/ietf/ADSL-TC-MIB.dic +160 -0
  19. data/lib/mibs/ietf/ADSL2-LINE-MIB.dic +8663 -0
  20. data/lib/mibs/ietf/ADSL2-LINE-TC-MIB.dic +1462 -0
  21. data/lib/mibs/ietf/AGENTX-MIB.dic +817 -0
  22. data/lib/mibs/ietf/AGGREGATE-MIB.dic +708 -0
  23. data/lib/mibs/ietf/ALARM-MIB.dic +1734 -0
  24. data/lib/mibs/ietf/APM-MIB.dic +2870 -0
  25. data/lib/mibs/ietf/APPC-MIB.dic +8687 -0
  26. data/lib/mibs/ietf/APPLETALK-MIB.dic +4399 -0
  27. data/lib/mibs/ietf/APPLICATION-MIB.dic +3750 -0
  28. data/lib/mibs/ietf/APPN-DLUR-MIB.dic +972 -0
  29. data/lib/mibs/ietf/APPN-MIB.dic +9364 -0
  30. data/lib/mibs/ietf/APPN-TRAP-MIB.dic +664 -0
  31. data/lib/mibs/ietf/APS-MIB.dic +2430 -0
  32. data/lib/mibs/ietf/ARC-MIB.dic +552 -0
  33. data/lib/mibs/ietf/ATM-ACCOUNTING-INFORMATION-MIB.dic +816 -0
  34. data/lib/mibs/ietf/ATM-MIB.dic +4104 -0
  35. data/lib/mibs/ietf/ATM-TC-MIB.dic +914 -0
  36. data/lib/mibs/ietf/ATM2-MIB.dic +4715 -0
  37. data/lib/mibs/ietf/BFD-STD-MIB.dic +2367 -0
  38. data/lib/mibs/ietf/BFD-TC-STD-MIB.dic +202 -0
  39. data/lib/mibs/ietf/BGP4-MIB.dic +1931 -0
  40. data/lib/mibs/ietf/BLDG-HVAC-MIB.dic +812 -0
  41. data/lib/mibs/ietf/BRIDGE-MIB.dic +2257 -0
  42. data/lib/mibs/ietf/CAPWAP-BASE-MIB.dic +4128 -0
  43. data/lib/mibs/ietf/CAPWAP-DOT11-MIB.dic +482 -0
  44. data/lib/mibs/ietf/CHARACTER-MIB.dic +1140 -0
  45. data/lib/mibs/ietf/CIRCUIT-IF-MIB.dic +493 -0
  46. data/lib/mibs/ietf/CLNS-MIB.dic +1702 -0
  47. data/lib/mibs/ietf/COFFEE-POT-MIB.dic +282 -0
  48. data/lib/mibs/ietf/COPS-CLIENT-MIB.dic +1270 -0
  49. data/lib/mibs/ietf/DECNET-PHIV-MIB.dic +5837 -0
  50. data/lib/mibs/ietf/DIAL-CONTROL-MIB.dic +2139 -0
  51. data/lib/mibs/ietf/DIFFSERV-CONFIG-MIB.dic +378 -0
  52. data/lib/mibs/ietf/DIFFSERV-MIB.dic +5073 -0
  53. data/lib/mibs/ietf/DIRECTORY-SERVER-MIB.dic +1041 -0
  54. data/lib/mibs/ietf/DISMAN-EVENT-MIB.dic +3151 -0
  55. data/lib/mibs/ietf/DISMAN-EXPRESSION-MIB.dic +1716 -0
  56. data/lib/mibs/ietf/DISMAN-NSLOOKUP-MIB.dic +698 -0
  57. data/lib/mibs/ietf/DISMAN-PING-MIB.dic +2635 -0
  58. data/lib/mibs/ietf/DISMAN-SCHEDULE-MIB.dic +1744 -0
  59. data/lib/mibs/ietf/DISMAN-SCRIPT-MIB.dic +2820 -0
  60. data/lib/mibs/ietf/DISMAN-TRACEROUTE-MIB.dic +3239 -0
  61. data/lib/mibs/ietf/DLSW-MIB.dic +5635 -0
  62. data/lib/mibs/ietf/DNS-RESOLVER-MIB.dic +1765 -0
  63. data/lib/mibs/ietf/DNS-SERVER-MIB.dic +1593 -0
  64. data/lib/mibs/ietf/DOCS-BPI-MIB.dic +2634 -0
  65. data/lib/mibs/ietf/DOCS-CABLE-DEVICE-MIB.dic +5042 -0
  66. data/lib/mibs/ietf/DOCS-IETF-BPI2-MIB.dic +5478 -0
  67. data/lib/mibs/ietf/DOCS-IETF-CABLE-DEVICE-NOTIFICATION-MIB.dic +2447 -0
  68. data/lib/mibs/ietf/DOCS-IETF-QOS-MIB.dic +4886 -0
  69. data/lib/mibs/ietf/DOCS-IETF-SUBMGT-MIB.dic +1331 -0
  70. data/lib/mibs/ietf/DOCS-IF-MIB.dic +7980 -0
  71. data/lib/mibs/ietf/DOT12-IF-MIB.dic +1066 -0
  72. data/lib/mibs/ietf/DOT12-RPTR-MIB.dic +2669 -0
  73. data/lib/mibs/ietf/DOT3-EPON-MIB.dic +3297 -0
  74. data/lib/mibs/ietf/DOT3-OAM-MIB.dic +2830 -0
  75. data/lib/mibs/ietf/DS0-MIB.dic +466 -0
  76. data/lib/mibs/ietf/DS0BUNDLE-MIB.dic +468 -0
  77. data/lib/mibs/ietf/DS1-MIB.dic +4890 -0
  78. data/lib/mibs/ietf/DS3-MIB.dic +2719 -0
  79. data/lib/mibs/ietf/DSA-MIB.dic +888 -0
  80. data/lib/mibs/ietf/DSMON-MIB.dic +6177 -0
  81. data/lib/mibs/ietf/DVB-RCS-MIB.dic +5764 -0
  82. data/lib/mibs/ietf/EBN-MIB.dic +1026 -0
  83. data/lib/mibs/ietf/EFM-CU-MIB.dic +4335 -0
  84. data/lib/mibs/ietf/ENTITY-MIB.dic +2235 -0
  85. data/lib/mibs/ietf/ENTITY-SENSOR-MIB.dic +653 -0
  86. data/lib/mibs/ietf/ENTITY-STATE-MIB.dic +457 -0
  87. data/lib/mibs/ietf/ENTITY-STATE-TC-MIB.dic +260 -0
  88. data/lib/mibs/ietf/ETHER-CHIPSET-MIB.dic +787 -0
  89. data/lib/mibs/ietf/EtherLike-MIB.dic +2548 -0
  90. data/lib/mibs/ietf/FC-MGMT-MIB.dic +3465 -0
  91. data/lib/mibs/ietf/FCIP-MGMT-MIB.dic +1596 -0
  92. data/lib/mibs/ietf/FDDI-SMT73-MIB.dic +3378 -0
  93. data/lib/mibs/ietf/FIBRE-CHANNEL-FE-MIB.dic +2504 -0
  94. data/lib/mibs/ietf/FLOAT-TC-MIB.dic +128 -0
  95. data/lib/mibs/ietf/FLOW-METER-MIB.dic +3201 -0
  96. data/lib/mibs/ietf/FORCES-MIB.dic +598 -0
  97. data/lib/mibs/ietf/FR-ATM-PVC-SERVICE-IWF-MIB.dic +1601 -0
  98. data/lib/mibs/ietf/FR-MFR-MIB.dic +1351 -0
  99. data/lib/mibs/ietf/FRAME-RELAY-DTE-MIB.dic +1688 -0
  100. data/lib/mibs/ietf/FRNETSERV-MIB.dic +3940 -0
  101. data/lib/mibs/ietf/FRSLD-MIB.dic +2580 -0
  102. data/lib/mibs/ietf/Finisher-MIB.dic +1416 -0
  103. data/lib/mibs/ietf/GMPLS-LABEL-STD-MIB.dic +965 -0
  104. data/lib/mibs/ietf/GMPLS-LSR-STD-MIB.dic +693 -0
  105. data/lib/mibs/ietf/GMPLS-TC-STD-MIB.dic +180 -0
  106. data/lib/mibs/ietf/GMPLS-TE-STD-MIB.dic +2542 -0
  107. data/lib/mibs/ietf/GSMP-MIB.dic +2468 -0
  108. data/lib/mibs/ietf/HC-ALARM-MIB.dic +1050 -0
  109. data/lib/mibs/ietf/HC-PerfHist-TC-MIB.dic +310 -0
  110. data/lib/mibs/ietf/HC-RMON-MIB.dic +4456 -0
  111. data/lib/mibs/ietf/HDSL2-SHDSL-LINE-MIB.dic +3955 -0
  112. data/lib/mibs/ietf/HOST-RESOURCES-MIB.dic +2453 -0
  113. data/lib/mibs/ietf/HPR-IP-MIB.dic +640 -0
  114. data/lib/mibs/ietf/HPR-MIB.dic +1959 -0
  115. data/lib/mibs/ietf/IANA-ITU-ALARM-TC-MIB.dic +936 -0
  116. data/lib/mibs/ietf/IF-CAP-STACK-MIB.dic +356 -0
  117. data/lib/mibs/ietf/IF-INVERTED-STACK-MIB.dic +220 -0
  118. data/lib/mibs/ietf/IF-MIB.dic +2753 -0
  119. data/lib/mibs/ietf/IFCP-MGMT-MIB.dic +1717 -0
  120. data/lib/mibs/ietf/IGMP-STD-MIB.dic +809 -0
  121. data/lib/mibs/ietf/INET-ADDRESS-MIB.dic +570 -0
  122. data/lib/mibs/ietf/INTEGRATED-SERVICES-GUARANTEED-MIB.dic +319 -0
  123. data/lib/mibs/ietf/INTEGRATED-SERVICES-MIB.dic +1196 -0
  124. data/lib/mibs/ietf/INTERFACETOPN-MIB.dic +1705 -0
  125. data/lib/mibs/ietf/IP-FORWARD-MIB.dic +1853 -0
  126. data/lib/mibs/ietf/IP-MIB.dic +7064 -0
  127. data/lib/mibs/ietf/IPATM-IPMC-MIB.dic +4830 -0
  128. data/lib/mibs/ietf/IPFIX-MIB.dic +2334 -0
  129. data/lib/mibs/ietf/IPFIX-SELECTOR-MIB.dic +215 -0
  130. data/lib/mibs/ietf/IPMCAST-MIB.dic +3390 -0
  131. data/lib/mibs/ietf/IPMROUTE-STD-MIB.dic +1246 -0
  132. data/lib/mibs/ietf/IPOA-MIB.dic +2372 -0
  133. data/lib/mibs/ietf/IPS-AUTH-MIB.dic +1609 -0
  134. data/lib/mibs/ietf/IPSEC-SPD-MIB.dic +3989 -0
  135. data/lib/mibs/ietf/IPV6-FLOW-LABEL-MIB.dic +110 -0
  136. data/lib/mibs/ietf/IPV6-ICMP-MIB.dic +748 -0
  137. data/lib/mibs/ietf/IPV6-MIB.dic +2028 -0
  138. data/lib/mibs/ietf/IPV6-MLD-MIB.dic +659 -0
  139. data/lib/mibs/ietf/IPV6-TCP-MIB.dic +332 -0
  140. data/lib/mibs/ietf/IPV6-UDP-MIB.dic +209 -0
  141. data/lib/mibs/ietf/ISCSI-MIB.dic +4613 -0
  142. data/lib/mibs/ietf/ISDN-MIB.dic +1796 -0
  143. data/lib/mibs/ietf/ISIS-MIB.dic +6215 -0
  144. data/lib/mibs/ietf/ISNS-MIB.dic +6578 -0
  145. data/lib/mibs/ietf/ITU-ALARM-MIB.dic +665 -0
  146. data/lib/mibs/ietf/ITU-ALARM-TC-MIB.dic +137 -0
  147. data/lib/mibs/ietf/Job-Monitoring-MIB.dic +2519 -0
  148. data/lib/mibs/ietf/L2TP-MIB.dic +4050 -0
  149. data/lib/mibs/ietf/LANGTAG-TC-MIB.dic +104 -0
  150. data/lib/mibs/ietf/LISP-MIB.dic +4067 -0
  151. data/lib/mibs/ietf/LMP-MIB.dic +5166 -0
  152. data/lib/mibs/ietf/MALLOC-MIB.dic +2156 -0
  153. data/lib/mibs/ietf/MAU-MIB.dic +2619 -0
  154. data/lib/mibs/ietf/MIDCOM-MIB.dic +2856 -0
  155. data/lib/mibs/ietf/MIOX25-MIB.dic +828 -0
  156. data/lib/mibs/ietf/MIP-MIB.dic +3473 -0
  157. data/lib/mibs/ietf/MOBILEIPV6-MIB.dic +5228 -0
  158. data/lib/mibs/ietf/MPLS-FTN-STD-MIB.dic +1594 -0
  159. data/lib/mibs/ietf/MPLS-L3VPN-STD-MIB.dic +2548 -0
  160. data/lib/mibs/ietf/MPLS-LC-ATM-STD-MIB.dic +491 -0
  161. data/lib/mibs/ietf/MPLS-LC-FR-STD-MIB.dic +395 -0
  162. data/lib/mibs/ietf/MPLS-LDP-ATM-STD-MIB.dic +1019 -0
  163. data/lib/mibs/ietf/MPLS-LDP-FRAME-RELAY-STD-MIB.dic +862 -0
  164. data/lib/mibs/ietf/MPLS-LDP-GENERIC-STD-MIB.dic +445 -0
  165. data/lib/mibs/ietf/MPLS-LDP-STD-MIB.dic +3657 -0
  166. data/lib/mibs/ietf/MPLS-LSR-STD-MIB.dic +3103 -0
  167. data/lib/mibs/ietf/MPLS-TC-STD-MIB.dic +911 -0
  168. data/lib/mibs/ietf/MPLS-TE-STD-MIB.dic +3673 -0
  169. data/lib/mibs/ietf/MSDP-MIB.dic +1893 -0
  170. data/lib/mibs/ietf/MTA-MIB.dic +1898 -0
  171. data/lib/mibs/ietf/Modem-MIB.dic +2054 -0
  172. data/lib/mibs/ietf/NAT-MIB.dic +3866 -0
  173. data/lib/mibs/ietf/NETWORK-SERVICES-MIB.dic +1034 -0
  174. data/lib/mibs/ietf/NHDP-MIB.dic +3005 -0
  175. data/lib/mibs/ietf/NHRP-MIB.dic +3660 -0
  176. data/lib/mibs/ietf/NOTIFICATION-LOG-MIB.dic +1156 -0
  177. data/lib/mibs/ietf/NTPv4-MIB.dic +1535 -0
  178. data/lib/mibs/ietf/OPT-IF-MIB.dic +8972 -0
  179. data/lib/mibs/ietf/OSPF-MIB.dic +5963 -0
  180. data/lib/mibs/ietf/OSPF-TRAP-MIB.dic +1190 -0
  181. data/lib/mibs/ietf/OSPFV3-MIB.dic +5708 -0
  182. data/lib/mibs/ietf/P-BRIDGE-MIB.dic +1499 -0
  183. data/lib/mibs/ietf/PARALLEL-MIB.dic +476 -0
  184. data/lib/mibs/ietf/PIM-MIB.dic +1393 -0
  185. data/lib/mibs/ietf/PIM-STD-MIB.dic +6819 -0
  186. data/lib/mibs/ietf/PINT-MIB.dic +830 -0
  187. data/lib/mibs/ietf/PKTC-IETF-MTA-MIB.dic +3191 -0
  188. data/lib/mibs/ietf/PKTC-IETF-SIG-MIB.dic +4713 -0
  189. data/lib/mibs/ietf/PMIPV6-MIB.dic +3010 -0
  190. data/lib/mibs/ietf/PMIPV6-TC-MIB.dic +293 -0
  191. data/lib/mibs/ietf/POLICY-BASED-MANAGEMENT-MIB.dic +3316 -0
  192. data/lib/mibs/ietf/POWER-ETHERNET-MIB.dic +959 -0
  193. data/lib/mibs/ietf/PPP-BRIDGE-NCP-MIB.dic +587 -0
  194. data/lib/mibs/ietf/PPP-IP-NCP-MIB.dic +269 -0
  195. data/lib/mibs/ietf/PPP-LCP-MIB.dic +994 -0
  196. data/lib/mibs/ietf/PPP-SEC-MIB.dic +411 -0
  197. data/lib/mibs/ietf/PSAMP-MIB.dic +998 -0
  198. data/lib/mibs/ietf/PTOPO-MIB.dic +1135 -0
  199. data/lib/mibs/ietf/PW-ATM-MIB.dic +1642 -0
  200. data/lib/mibs/ietf/PW-CEP-STD-MIB.dic +3661 -0
  201. data/lib/mibs/ietf/PW-STD-MIB.dic +3592 -0
  202. data/lib/mibs/ietf/PW-TC-STD-MIB.dic +437 -0
  203. data/lib/mibs/ietf/PW-TDM-MIB.dic +1896 -0
  204. data/lib/mibs/ietf/PerfHist-TC-MIB.dic +152 -0
  205. data/lib/mibs/ietf/Printer-MIB.dic +6665 -0
  206. data/lib/mibs/ietf/Q-BRIDGE-MIB.dic +3115 -0
  207. data/lib/mibs/ietf/RADIUS-ACC-CLIENT-MIB.dic +991 -0
  208. data/lib/mibs/ietf/RADIUS-ACC-SERVER-MIB.dic +1183 -0
  209. data/lib/mibs/ietf/RADIUS-AUTH-CLIENT-MIB.dic +1073 -0
  210. data/lib/mibs/ietf/RADIUS-AUTH-SERVER-MIB.dic +1251 -0
  211. data/lib/mibs/ietf/RADIUS-DYNAUTH-CLIENT-MIB.dic +1116 -0
  212. data/lib/mibs/ietf/RADIUS-DYNAUTH-SERVER-MIB.dic +1003 -0
  213. data/lib/mibs/ietf/RAQMON-MIB.dic +2695 -0
  214. data/lib/mibs/ietf/RBRIDGE-MIB.dic +2981 -0
  215. data/lib/mibs/ietf/RDBMS-MIB.dic +1935 -0
  216. data/lib/mibs/ietf/RFC1065-SMI.dic +108 -0
  217. data/lib/mibs/ietf/RFC1155-SMI.dic +118 -0
  218. data/lib/mibs/ietf/RFC1158-MIB.dic +2440 -0
  219. data/lib/mibs/ietf/RFC1213-MIB.dic +3434 -0
  220. data/lib/mibs/ietf/RFC1269-MIB.dic +557 -0
  221. data/lib/mibs/ietf/RFC1271-MIB.dic +4135 -0
  222. data/lib/mibs/ietf/RFC1285-MIB.dic +2842 -0
  223. data/lib/mibs/ietf/RFC1316-MIB.dic +800 -0
  224. data/lib/mibs/ietf/RFC1381-MIB.dic +1347 -0
  225. data/lib/mibs/ietf/RFC1382-MIB.dic +3820 -0
  226. data/lib/mibs/ietf/RFC1414-MIB.dic +214 -0
  227. data/lib/mibs/ietf/RIPv2-MIB.dic +773 -0
  228. data/lib/mibs/ietf/RMON-MIB.dic +5551 -0
  229. data/lib/mibs/ietf/RMON2-MIB.dic +8224 -0
  230. data/lib/mibs/ietf/ROHC-MIB.dic +1613 -0
  231. data/lib/mibs/ietf/ROHC-RTP-MIB.dic +859 -0
  232. data/lib/mibs/ietf/ROHC-UNCOMPRESSED-MIB.dic +267 -0
  233. data/lib/mibs/ietf/RPKI-ROUTER-MIB.dic +1363 -0
  234. data/lib/mibs/ietf/RS-232-MIB.dic +1335 -0
  235. data/lib/mibs/ietf/RSERPOOL-MIB.dic +2501 -0
  236. data/lib/mibs/ietf/RSTP-MIB.dic +427 -0
  237. data/lib/mibs/ietf/RSVP-MIB.dic +4135 -0
  238. data/lib/mibs/ietf/RTP-MIB.dic +1376 -0
  239. data/lib/mibs/ietf/SCSI-MIB.dic +3804 -0
  240. data/lib/mibs/ietf/SCTP-MIB.dic +1924 -0
  241. data/lib/mibs/ietf/SFLOW-MIB.dic +568 -0
  242. data/lib/mibs/ietf/SIP-COMMON-MIB.dic +2769 -0
  243. data/lib/mibs/ietf/SIP-MIB.dic +1438 -0
  244. data/lib/mibs/ietf/SIP-SERVER-MIB.dic +1150 -0
  245. data/lib/mibs/ietf/SIP-TC-MIB.dic +257 -0
  246. data/lib/mibs/ietf/SIP-UA-MIB.dic +268 -0
  247. data/lib/mibs/ietf/SLAPM-MIB.dic +4527 -0
  248. data/lib/mibs/ietf/SMON-MIB.dic +1758 -0
  249. data/lib/mibs/ietf/SNA-NAU-MIB.dic +4042 -0
  250. data/lib/mibs/ietf/SNA-SDLC-MIB.dic +3858 -0
  251. data/lib/mibs/ietf/SNMP-COMMUNITY-MIB.dic +715 -0
  252. data/lib/mibs/ietf/SNMP-FRAMEWORK-MIB.dic +709 -0
  253. data/lib/mibs/ietf/SNMP-MPD-MIB.dic +230 -0
  254. data/lib/mibs/ietf/SNMP-NOTIFICATION-MIB.dic +859 -0
  255. data/lib/mibs/ietf/SNMP-PROXY-MIB.dic +414 -0
  256. data/lib/mibs/ietf/SNMP-REPEATER-MIB.dic +4335 -0
  257. data/lib/mibs/ietf/SNMP-SSH-TM-MIB.dic +447 -0
  258. data/lib/mibs/ietf/SNMP-TARGET-MIB.dic +924 -0
  259. data/lib/mibs/ietf/SNMP-TLS-TM-MIB.dic +1449 -0
  260. data/lib/mibs/ietf/SNMP-TSM-MIB.dic +315 -0
  261. data/lib/mibs/ietf/SNMP-USER-BASED-SM-MIB.dic +1164 -0
  262. data/lib/mibs/ietf/SNMP-USM-AES-MIB.dic +95 -0
  263. data/lib/mibs/ietf/SNMP-USM-DH-OBJECTS-MIB.dic +653 -0
  264. data/lib/mibs/ietf/SNMP-VIEW-BASED-ACM-MIB.dic +1202 -0
  265. data/lib/mibs/ietf/SNMPv2-MIB.dic +1382 -0
  266. data/lib/mibs/ietf/SNMPv2-SMI.dic +223 -0
  267. data/lib/mibs/ietf/SNMPv2-USEC-MIB.dic +405 -0
  268. data/lib/mibs/ietf/SONET-MIB.dic +3308 -0
  269. data/lib/mibs/ietf/SOURCE-ROUTING-MIB.dic +542 -0
  270. data/lib/mibs/ietf/SSPM-MIB.dic +1530 -0
  271. data/lib/mibs/ietf/SYSAPPL-MIB.dic +2092 -0
  272. data/lib/mibs/ietf/T11-FC-FABRIC-ADDR-MGR-MIB.dic +1779 -0
  273. data/lib/mibs/ietf/T11-FC-FABRIC-CONFIG-SERVER-MIB.dic +2822 -0
  274. data/lib/mibs/ietf/T11-FC-FABRIC-LOCK-MIB.dic +700 -0
  275. data/lib/mibs/ietf/T11-FC-FSPF-MIB.dic +1889 -0
  276. data/lib/mibs/ietf/T11-FC-NAME-SERVER-MIB.dic +1775 -0
  277. data/lib/mibs/ietf/T11-FC-ROUTE-MIB.dic +655 -0
  278. data/lib/mibs/ietf/T11-FC-RSCN-MIB.dic +1110 -0
  279. data/lib/mibs/ietf/T11-FC-VIRTUAL-FABRIC-MIB.dic +770 -0
  280. data/lib/mibs/ietf/T11-FC-ZONE-SERVER-MIB.dic +3886 -0
  281. data/lib/mibs/ietf/T11-TC-MIB.dic +110 -0
  282. data/lib/mibs/ietf/TCP-ESTATS-MIB.dic +3926 -0
  283. data/lib/mibs/ietf/TCP-MIB.dic +1319 -0
  284. data/lib/mibs/ietf/TCPIPX-MIB.dic +457 -0
  285. data/lib/mibs/ietf/TE-LINK-STD-MIB.dic +2876 -0
  286. data/lib/mibs/ietf/TE-MIB.dic +2924 -0
  287. data/lib/mibs/ietf/TED-MIB.dic +1749 -0
  288. data/lib/mibs/ietf/TIME-AGGREGATE-MIB.dic +550 -0
  289. data/lib/mibs/ietf/TN3270E-MIB.dic +2785 -0
  290. data/lib/mibs/ietf/TN3270E-RT-MIB.dic +1317 -0
  291. data/lib/mibs/ietf/TOKEN-RING-RMON-MIB.dic +2820 -0
  292. data/lib/mibs/ietf/TOKENRING-MIB.dic +1184 -0
  293. data/lib/mibs/ietf/TOKENRING-STATION-SR-MIB.dic +292 -0
  294. data/lib/mibs/ietf/TRANSPORT-ADDRESS-MIB.dic +610 -0
  295. data/lib/mibs/ietf/TRIP-MIB.dic +3159 -0
  296. data/lib/mibs/ietf/TRIP-TC-MIB.dic +241 -0
  297. data/lib/mibs/ietf/TUNNEL-MIB.dic +1095 -0
  298. data/lib/mibs/ietf/UDP-MIB.dic +751 -0
  299. data/lib/mibs/ietf/UDPLITE-MIB.dic +704 -0
  300. data/lib/mibs/ietf/UPS-MIB.dic +3088 -0
  301. data/lib/mibs/ietf/URI-TC-MIB.dic +193 -0
  302. data/lib/mibs/ietf/UUID-TC-MIB.dic +135 -0
  303. data/lib/mibs/ietf/VDSL-LINE-EXT-MCM-MIB.dic +989 -0
  304. data/lib/mibs/ietf/VDSL-LINE-EXT-SCM-MIB.dic +605 -0
  305. data/lib/mibs/ietf/VDSL-LINE-MIB.dic +4518 -0
  306. data/lib/mibs/ietf/VDSL2-LINE-MIB.dic +11029 -0
  307. data/lib/mibs/ietf/VDSL2-LINE-TC-MIB.dic +3152 -0
  308. data/lib/mibs/ietf/VPN-TC-STD-MIB.dic +121 -0
  309. data/lib/mibs/ietf/VRRP-MIB.dic +1163 -0
  310. data/lib/mibs/ietf/VRRPV3-MIB.dic +1403 -0
  311. data/lib/mibs/ietf/WWW-MIB.dic +1810 -0
  312. data/lib/mibs/logstash/iso.dic +18 -0
  313. data/logstash-integration-snmp.gemspec +40 -0
  314. data/spec/fixtures/RFC1213-MIB.dic +3445 -0
  315. data/spec/fixtures/collision.dic +25 -0
  316. data/spec/integration/inputs/snmp_spec.rb +443 -0
  317. data/spec/integration/inputs/snmptrap_spec.rb +383 -0
  318. data/spec/unit/inputs/common_spec.rb +264 -0
  319. data/spec/unit/inputs/snmp_spec.rb +510 -0
  320. data/spec/unit/inputs/snmptrap_spec.rb +141 -0
  321. data/vendor/jar-dependencies/org/logstash/integrations/plugin/4.0.0/plugin-4.0.0.jar +0 -0
  322. data/vendor/jar-dependencies/org/snakeyaml/snakeyaml-engine/2.7/snakeyaml-engine-2.7.jar +0 -0
  323. data/vendor/jar-dependencies/org/snmp4j/snmp4j/3.8.0/snmp4j-3.8.0.jar +0 -0
  324. metadata +523 -0
@@ -0,0 +1,510 @@
1
+ # encoding: utf-8
2
+ require 'rspec/wait'
3
+ require "logstash/devutils/rspec/spec_helper"
4
+ require 'logstash/plugin_mixins/ecs_compatibility_support/spec_helper'
5
+ require_relative '../../../lib/logstash/inputs/snmp'
6
+
7
+ describe LogStash::Inputs::Snmp, :ecs_compatibility_support do
8
+ let(:mock_target) { double("org.snmp4j.Target") }
9
+ let(:mock_client) { double("org.logstash.snmp.SnmpClient") }
10
+ let(:mock_aggregator) { double("org.logstash.snmp.SnmpClientRequestAggregator") }
11
+ let(:mock_aggregator_request) { double("org.logstash.snmp.SnmpClientRequestAggregator#Request") }
12
+ let(:config) { {} }
13
+
14
+ subject(:plugin) { described_class.new(config) }
15
+
16
+ context "an interruptible input plugin" do
17
+ let(:config) {{ "get" => ["1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161", "community" => "public"}] }}
18
+
19
+ context "#stop" do
20
+ let(:queue) { SizedQueue.new(20) }
21
+
22
+ before(:each) do
23
+ allow(plugin).to receive(:build_client!).and_return(mock_client)
24
+ allow(mock_client).to receive(:listen)
25
+ allow(mock_client).to receive(:create_target).and_return(mock_target)
26
+ expect(mock_client).to receive(:close)
27
+
28
+ allow(plugin).to receive(:create_request_aggregator).and_return(mock_aggregator)
29
+ expect(mock_aggregator).to receive(:create_request).and_return(mock_aggregator_request)
30
+ expect(mock_aggregator).to receive(:await).and_return({})
31
+ expect(mock_aggregator).to receive(:close)
32
+
33
+ expect(mock_aggregator_request).to receive(:get)
34
+ expect(mock_aggregator_request).to receive(:get_result_async)
35
+
36
+ plugin.register
37
+ end
38
+
39
+ it "returns from run" do
40
+ Thread.new(queue) { |queue| loop { queue.pop } }
41
+
42
+ plugin_thread = Thread.new(plugin, queue) { |subject, queue| subject.run(queue) }
43
+ sleep 0.5
44
+ expect(plugin_thread).to be_alive
45
+
46
+ plugin.do_stop
47
+ plugin.do_close
48
+ wait(3).for { plugin_thread }.to_not be_alive
49
+ end
50
+ end
51
+ end
52
+
53
+ context "OIDs options validation" do
54
+ valid_configs = [
55
+ {"get" => ["1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
56
+ {"get" => [".1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
57
+ {"get" => [".1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}], "oid_root_skip" => 2},
58
+ {"get" => [".1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}], "oid_path_length" => 2},
59
+ {"get" => ["1.3.6.1.2.1.1.1.0", "1.3.6.1.2.1.1"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
60
+ {"get" => ["1.3.6.1.2.1.1.1.0", ".1.3.6.1.2.1.1"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
61
+ {"walk" => ["1.3.6.1.2.1.1.1"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
62
+ {"tables" => [{"name" => "ltmPoolStatTable", "columns" => ["1.3.6.1.4.1.3375.2.2.5.2.3.1.1", "1.3.6.1.4.1.3375.2.2.5.2.3.1.6"]}], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
63
+ ]
64
+
65
+ invalid_configs = [
66
+ {"get" => ["1.3.6.1.2.1.1.1.a"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
67
+ {"get" => ["test"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
68
+ {"get" => [], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
69
+ {"get" => "foo", "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
70
+ {"get" => [".1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}], "oid_path_length" => "a" },
71
+ {"get" => [".1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}], "oid_path_length" => 2, "oid_root_skip" => 2 },
72
+ {"walk" => "foo", "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
73
+ {"tables" => [{"columns" => ["1.2.3.4", "4.3.2.1"]}], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
74
+ ]
75
+
76
+ context "validates get oids" do
77
+ valid_configs.each_with_index do |config, index|
78
+ context "with valid config #{index}" do
79
+ let(:config) { config }
80
+ it 'should not raise' do
81
+ expect{ plugin.register }.not_to raise_error
82
+ end
83
+ end
84
+ end
85
+
86
+ invalid_configs.each_with_index do |config, index|
87
+ context "with invalid config #{index}" do
88
+ let(:config) { config }
89
+ it 'should raise' do
90
+ expect{ plugin.register }.to raise_error(LogStash::ConfigurationError)
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ context "hosts options validation" do
98
+ valid_configs = [
99
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
100
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
101
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:localhost/161"}]},
102
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/112345"}]},
103
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161", "community" => "public"}]},
104
+ {"get" => ["1.0"], "hosts" => [{"host" => "tcp:127.0.0.1/112345"}]},
105
+ {"get" => ["1.0"], "hosts" => [{"host" => "tcp:127.0.0.1/161", "community" => "public"}]},
106
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161", "version" => "1"}]},
107
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161", "version" => "2c"}]},
108
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161", "version" => "3"}], "security_name" => "v3user"},
109
+
110
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:[::1]/16100"}]},
111
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:[2001:db8:0:1:1:1:1:1]/16100"}]},
112
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:[2001:db8::2:1]/161"}]},
113
+ ]
114
+
115
+ invalid_configs = [
116
+ {"get" => ["1.0"], "hosts" => [{"host" => "aaa:127.0.0.1/161"}]},
117
+ {"get" => ["1.0"], "hosts" => [{"host" => "tcp.127.0.0.1/161"}]},
118
+ {"get" => ["1.0"], "hosts" => [{"host" => "localhost"}]},
119
+ {"get" => ["1.0"], "hosts" => [{"host" => "localhost/161"}]},
120
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1"}]},
121
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/"}]},
122
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/aaa"}]},
123
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}, {"host" => "udp:127.0.0.1/aaa"}]},
124
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161", "version" => "2"}]},
125
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161", "version" => "3a"}]},
126
+ {"get" => ["1.0"], "hosts" => ""},
127
+ {"get" => ["1.0"], "hosts" => []},
128
+ {"get" => ["1.0"] },
129
+ ]
130
+
131
+ context "validates hosts" do
132
+ valid_configs.each_with_index do |config, index|
133
+ context "with valid config #{index}" do
134
+ let(:config) { config }
135
+ it 'should not raise' do
136
+ expect{ plugin.register }.not_to raise_error
137
+ end
138
+ end
139
+ end
140
+
141
+ invalid_configs.each_with_index do |config, index|
142
+ context "with invalid config #{index}" do
143
+ let(:config) { config }
144
+ it 'should raise' do
145
+ expect{ plugin.register }.to raise_error(LogStash::ConfigurationError)
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ context "v3_users options validation" do
153
+ valid_configs = [
154
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161", "version" => "3"}], "security_name" => "ciscov3", "auth_protocol" => "sha", "auth_pass" => "myshapass", "priv_protocol" => "aes", "priv_pass" => "myprivpass", "security_level" => "authNoPriv"},
155
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:[2001:db8:0:1:1:1:1:1]/1610", "version" => "3"}], "security_name" => "dellv3", "auth_protocol" => "md5", "auth_pass" => "myshapass", "priv_protocol" => "3des", "priv_pass" => "myprivpass", "security_level" => "authNoPriv"}
156
+ ]
157
+
158
+ invalid_configs = [
159
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161", "version" => "3"}], "security_name" => "ciscov3", "auth_protocol" => "badauth", "auth_pass" => "myshapass", "priv_protocol" => "aes", "priv_pass" => "myprivpass", "security_level" => "authNoPriv"},
160
+ {"get" => ["1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161", "version" => "3"}], "security_name" => "ciscov3", "auth_protocol" => "sha"}
161
+ ]
162
+
163
+ context "validates v3_users" do
164
+ valid_configs.each_with_index do |config, index|
165
+ context "with valid config #{index}" do
166
+ let(:config) { config }
167
+ it 'should not raise' do
168
+ expect{ plugin.register }.not_to raise_error
169
+ end
170
+ end
171
+ end
172
+
173
+ invalid_configs.each_with_index do |config, index|
174
+ context "with invalid config #{index}" do
175
+ let(:config) { config }
176
+ it 'should raise' do
177
+ expect{ plugin.register }.to raise_error(LogStash::ConfigurationError)
178
+ end
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ describe 'local_engine_id validation' do
185
+ let(:local_engine_id) { nil }
186
+ let(:config) { super().merge('get' => ["1.0"], 'hosts' => [{'host' => "udp:127.0.0.1/161", "version" => "2c"}], 'local_engine_id' => local_engine_id) }
187
+
188
+ context 'with length lower than 5' do
189
+ let(:local_engine_id) { '1234' }
190
+
191
+ it 'should raise' do
192
+ error_message = '`local_engine_id` length must be greater or equal than 5'
193
+ expect { plugin.register }.to raise_error(LogStash::ConfigurationError, error_message)
194
+ end
195
+ end
196
+
197
+ context 'with valid length' do
198
+ let(:local_engine_id) { '0' * 32 }
199
+
200
+ it 'should not raise' do
201
+ expect { plugin.register }.to_not raise_error
202
+ end
203
+ end
204
+
205
+ context 'with length greater than 32' do
206
+ let(:local_engine_id) { '0' * 33 }
207
+
208
+ it 'should raise' do
209
+ error_message = '`local_engine_id` length must be lower or equal than 32'
210
+ expect { plugin.register }.to raise_error(LogStash::ConfigurationError, error_message)
211
+ end
212
+ end
213
+ end
214
+
215
+ ecs_compatibility_matrix(:disabled, :v1, :v8) do |ecs_select|
216
+ let(:queue) { Queue.new }
217
+ let(:run_once_runner) { RunOnceStoppableIntervalRunner.new(plugin) }
218
+ let(:config) { { 'ecs_compatibility' => ecs_select.active_mode } }
219
+
220
+ before(:each) do
221
+ allow(plugin).to receive(:stoppable_interval_runner).and_return(run_once_runner)
222
+ allow(plugin).to receive(:build_client!).and_return(mock_client)
223
+ allow(mock_client).to receive(:listen)
224
+ allow(mock_client).to receive(:create_target).and_return(mock_target)
225
+ allow(mock_client).to receive(:close).at_most(:once)
226
+
227
+ allow(plugin).to receive(:create_request_aggregator).and_return(mock_aggregator)
228
+ expect(mock_aggregator).to receive(:create_request).and_return(mock_aggregator_request)
229
+ expect(mock_aggregator).to receive(:await)
230
+ allow(mock_aggregator).to receive(:close)
231
+ end
232
+
233
+ context 'mocked get' do
234
+ before(:each) do
235
+ expect(mock_aggregator_request).to receive(:get)
236
+ expect(mock_aggregator_request).to receive(:get_result_async) do |consumer|
237
+ consumer.call({ 'foo' => 'bar' })
238
+ end
239
+ end
240
+
241
+ context 'should add' do
242
+ let(:config) { super().merge({ 'get' => ["1.3.6.1.2.1.1.1.0"], 'hosts' => [{ 'host' => "udp:127.0.0.1/161", 'community' => "public" }] }) }
243
+
244
+ it "@metadata and host fields to event" do
245
+ plugin.register
246
+ plugin.run(queue)
247
+ event = queue.pop
248
+
249
+ if ecs_select.active_mode == :disabled
250
+ expect(event.get("[@metadata][host_protocol]")).to eq("udp")
251
+ expect(event.get("[@metadata][host_address]")).to eq("127.0.0.1")
252
+ expect(event.get("[@metadata][host_port]")).to eq("161")
253
+ expect(event.get("[@metadata][host_community]")).to eq("public")
254
+ expect(event.get("host")).to eql("127.0.0.1")
255
+ else
256
+ expect(event.get("[@metadata][input][snmp][host][protocol]")).to eq("udp")
257
+ expect(event.get("[@metadata][input][snmp][host][address]")).to eq("127.0.0.1")
258
+ expect(event.get("[@metadata][input][snmp][host][port]")).to eq('161')
259
+ expect(event.get("[@metadata][input][snmp][host][community]")).to eq("public")
260
+ expect(event.get("host")).to eql('ip' => "127.0.0.1")
261
+ end
262
+ end
263
+ end
264
+
265
+ context 'with custom host field (legacy metadata)' do
266
+ let(:config) do
267
+ super().merge({
268
+ 'get' => ["1.3.6.1.2.1.1.1.0"],
269
+ 'hosts' => [{ 'host' => "udp:127.0.0.1/161", 'community' => "public" }],
270
+ 'add_field' => { 'host' => '%{[@metadata][host_protocol]}:%{[@metadata][host_address]}/%{[@metadata][host_port]},%{[@metadata][host_community]}' }
271
+ })
272
+ end
273
+
274
+ it "should add field to event" do
275
+ plugin.register
276
+ plugin.run(queue)
277
+ event = queue.pop
278
+
279
+ expect(event.get("host")).to eq("udp:127.0.0.1/161,public")
280
+ end
281
+ end if ecs_select.active_mode == :disabled
282
+
283
+ context "with custom host field (ECS mode)" do
284
+ let(:config) do
285
+ super().merge({
286
+ 'get' => ["1.3.6.1.2.1.1.1.0"],
287
+ 'hosts' => [{ 'host' => "tcp:192.168.1.11/1161" }],
288
+ 'add_field' => { '[host][formatted]' => '%{[@metadata][input][snmp][host][protocol]}://%{[@metadata][input][snmp][host][address]}:%{[@metadata][input][snmp][host][port]}' }
289
+ })
290
+ end
291
+
292
+ it "should add field to event" do
293
+ plugin.register
294
+ plugin.run(queue)
295
+ event = queue.pop
296
+
297
+ expect(event.get("host")).to eq('formatted' => "tcp://192.168.1.11:1161")
298
+ end
299
+ end if ecs_select.active_mode != :disabled
300
+
301
+ context 'with target configured' do
302
+ let(:config) do
303
+ super().merge({
304
+ 'get' => ['1.3.6.1.2.1.1.1.0'],
305
+ 'hosts' => [{ 'host' => 'udp:127.0.0.1/161', 'community' => 'public' }],
306
+ 'target' => 'snmp_data'
307
+ })
308
+ end
309
+
310
+ it 'should target event data' do
311
+ plugin.register
312
+ plugin.run(queue)
313
+ event = queue.pop
314
+
315
+ expect( event.include?('foo') ).to be false
316
+ expect( event.get('[snmp_data]') ).to eql 'foo' => 'bar'
317
+ end
318
+ end
319
+ end
320
+
321
+ context 'mocked empty request result' do
322
+ let(:config) do
323
+ super().merge({
324
+ 'get' => ['1.3.6.1.2.1.1.1.0'],
325
+ 'hosts' => [{ 'host' => 'udp:127.0.0.1/161', 'community' => 'public' }]
326
+ })
327
+ end
328
+
329
+ let(:logger) { double("Logger").as_null_object }
330
+
331
+ before(:each) do
332
+ expect(mock_aggregator_request).to receive(:get)
333
+ expect(mock_aggregator_request).to receive(:get_result_async) do |consumer|
334
+ consumer.call({})
335
+ end
336
+
337
+ allow(plugin).to receive(:logger).and_return(logger)
338
+ expect(logger).to receive(:debug?).and_return(true)
339
+ expect(logger).to receive(:debug).with('No SNMP data retrieved', anything)
340
+ end
341
+
342
+ it 'generates no events when client returns no response' do
343
+ plugin.register
344
+ plugin.poll_clients(queue)
345
+
346
+ expect(queue.size).to eql 0
347
+ end
348
+ end
349
+
350
+ context 'mocked no request response' do
351
+ let(:config) do
352
+ super().merge({
353
+ 'walk' => ["1.3.6.1.2.1.1"],
354
+ "hosts" => [{"host" => "udp:127.0.0.1/161", "community" => "public"}]
355
+ })
356
+ end
357
+
358
+ let(:logger) { double("Logger").as_null_object }
359
+
360
+ before do
361
+ expect(mock_aggregator_request).to receive(:walk)
362
+ expect(mock_aggregator_request).to receive(:get_result_async)
363
+ end
364
+
365
+ it 'generates no events when client returns no response' do
366
+ plugin.register
367
+ plugin.poll_clients(queue)
368
+
369
+ expect(queue.size).to eql 0
370
+ end
371
+ end
372
+ end
373
+
374
+ context "StoppableIntervalRunner" do
375
+ let(:stop_holder) { Struct.new(:value).new(false) }
376
+
377
+ before(:each) do
378
+ allow(plugin).to receive(:stop?) { stop_holder.value }
379
+ end
380
+
381
+ let(:plugin) do
382
+ double("Plugin").tap do |dbl|
383
+ allow(dbl).to receive(:logger).and_return(double("Logger").as_null_object)
384
+ allow(dbl).to receive(:stop?) { stop_holder.value }
385
+ end
386
+ end
387
+
388
+ subject(:interval_runner) { LogStash::Inputs::Snmp::StoppableIntervalRunner.new(plugin) }
389
+
390
+ context "#every" do
391
+ context "when the plugin is stopped" do
392
+ let(:interval_seconds) { 2 }
393
+ it 'does not yield the block' do
394
+ stop_holder.value = true
395
+ expect { |yielder| interval_runner.every(interval_seconds, &yielder) }.to_not yield_control
396
+ end
397
+ end
398
+
399
+ context "when the yield takes shorter than the interval" do
400
+ let(:duration_seconds) { 1 }
401
+ let(:interval_seconds) { 2 }
402
+
403
+ it 'sleeps off the remainder' do
404
+ allow(interval_runner).to receive(:sleep).and_call_original
405
+
406
+ interval_runner.every(interval_seconds) do
407
+ Kernel::sleep(duration_seconds) # non-stoppable
408
+ stop_holder.value = true # prevent re-runs
409
+ end
410
+
411
+ expect(interval_runner).to have_received(:sleep).with(a_value_within(0.1).of(1))
412
+ end
413
+ end
414
+
415
+ context "when the yield takes longer than the interval" do
416
+ let(:duration_seconds) { 2 }
417
+ let(:interval_seconds) { 1 }
418
+
419
+ it 'logs a warning to the plugin' do
420
+ allow(interval_runner).to receive(:sleep).and_call_original
421
+
422
+ interval_runner.every(interval_seconds) do
423
+ Kernel::sleep(duration_seconds) # non-stoppable
424
+ stop_holder.value = true # prevent re-runs
425
+ end
426
+
427
+ expect(interval_runner).to_not have_received(:sleep)
428
+
429
+ expect(plugin.logger).to have_received(:warn).with(a_string_including("took longer"), a_hash_including(:interval_seconds => interval_seconds, :duration_seconds => a_value_within(0.1).of(duration_seconds)))
430
+ end
431
+ end
432
+
433
+ it 'runs regularly until the plugin is stopped' do
434
+ timestamps = []
435
+
436
+ thread = Thread.new do
437
+ interval_runner.every(1) do
438
+ timestamps << Time.now
439
+ Kernel::sleep(Random::rand(0.8))
440
+ end
441
+ end
442
+
443
+ Kernel::sleep(5)
444
+ expect(thread).to be_alive
445
+
446
+ stop_holder.value = true
447
+ Kernel::sleep(1)
448
+
449
+ aggregate_failures do
450
+ expect(thread).to_not be_alive
451
+ expect(timestamps.count).to be_within(1).of(5)
452
+
453
+ timestamps.each_cons(2) do |previous, current|
454
+ # ensure each start time is very close to 1s after the previous.
455
+ expect(current - previous).to be_within(0.05).of(1)
456
+ end
457
+
458
+ thread.kill if thread.alive?
459
+ end
460
+ end
461
+ end
462
+ end
463
+
464
+ context "close" do
465
+ let(:config) do
466
+ {
467
+ 'get' => ["1.3.6.1.2.1.1.1.0"],
468
+ 'hosts' => [{'host' => "udp:127.0.0.1/161", 'community' => "public"}]
469
+ }
470
+ end
471
+
472
+ let(:run_once_runner) { RunOnceStoppableIntervalRunner.new(plugin) }
473
+
474
+ before(:each) do
475
+ allow(plugin).to receive(:stoppable_interval_runner).and_return(run_once_runner)
476
+ allow(plugin).to receive(:build_client!).and_return(mock_client)
477
+ allow(mock_client).to receive(:listen)
478
+ allow(mock_client).to receive(:create_target).and_return(mock_target)
479
+ allow(mock_client).to receive(:close)
480
+
481
+ allow(plugin).to receive(:create_request_aggregator).and_return(mock_aggregator)
482
+ expect(mock_aggregator).to receive(:await)
483
+ allow(mock_aggregator).to receive(:close)
484
+
485
+ expect(mock_aggregator).to receive(:create_request).and_return(mock_aggregator_request)
486
+ expect(mock_aggregator_request).to receive(:get)
487
+ expect(mock_aggregator_request).to receive(:get_result_async)
488
+ end
489
+
490
+ it "should call client close method upon termination" do
491
+ plugin.register
492
+ plugin.run(Queue.new)
493
+ plugin.do_close
494
+
495
+ expect(mock_client).to have_received(:close).once
496
+ expect(mock_aggregator).to have_received(:close).once
497
+ end
498
+ end
499
+ end
500
+
501
+ class RunOnceStoppableIntervalRunner
502
+ def initialize(plugin)
503
+ @plugin = plugin
504
+ end
505
+
506
+ def every(interval_seconds, desc = 'operation', &block)
507
+ yield
508
+ end
509
+ end
510
+
@@ -0,0 +1,141 @@
1
+ require "logstash/devutils/rspec/spec_helper"
2
+ require "logstash/devutils/rspec/shared_examples"
3
+ require 'logstash/plugin_mixins/ecs_compatibility_support/spec_helper'
4
+ require_relative '../../../lib/logstash/inputs/snmptrap'
5
+ require 'logstash-integration-snmp_jars'
6
+
7
+ describe LogStash::Inputs::Snmptrap, :ecs_compatibility_support do
8
+
9
+ java_import 'org.logstash.snmp.trap.SnmpTrapMessage'
10
+ java_import 'org.snmp4j.smi.IpAddress'
11
+
12
+ let(:mock_target) { double("org.snmp4j.Target") }
13
+ let(:mock_client) { double("org.logstash.snmp.SnmpClient") }
14
+ let(:config) { Hash.new }
15
+ let(:source_ip) { '192.168.1.11' }
16
+
17
+ subject(:plugin) { described_class.new(config) }
18
+
19
+ context "an interruptible input plugin" do
20
+ context "#stop" do
21
+ let(:queue) { SizedQueue.new(20) }
22
+
23
+ before(:each) do
24
+ plugin.register
25
+ end
26
+
27
+ it "returns from run" do
28
+ Thread.new(queue) { |queue| loop { queue.pop } }
29
+
30
+ plugin_thread = Thread.new(plugin, queue) { |subject, queue| subject.run(queue) }
31
+ sleep 0.5
32
+ expect(plugin_thread).to be_alive
33
+
34
+ plugin.do_stop
35
+ plugin.do_close
36
+ wait(3).for { plugin_thread }.to_not be_alive
37
+ end
38
+ end
39
+ end
40
+
41
+ ecs_compatibility_matrix(:disabled, :v1, :v8) do |ecs_select|
42
+
43
+ let(:config) { super().merge 'ecs_compatibility' => ecs_select.active_mode }
44
+
45
+ context 'with an SNMP v1 trap' do
46
+
47
+ let(:trap) do
48
+ bindings = {
49
+ "1.3.6.1.2.3.4" => 111
50
+ }
51
+
52
+ trap_event = {
53
+ "enterprise" => "enterprises.9",
54
+ "agent_addr" => source_ip,
55
+ "specific_trap" => 42,
56
+ "timestamp" => 12345,
57
+ "variable_bindings" => bindings
58
+ }
59
+
60
+ trap = org.logstash.snmp.trap.SnmpTrapMessage.new(0, 'public'.bytes, org.snmp4j.smi.IpAddress.new(source_ip), trap_event, bindings)
61
+ trap
62
+ end
63
+
64
+ before { @event = plugin.send :process_trap_message, trap }
65
+
66
+ it "extract snmp payload" do
67
+ expect( @event.get('message') ).to be_a String
68
+ expect( @event.get('1.3.6.1.2.3.4') ).to eql 111
69
+ end
70
+
71
+ it "sets source host" do
72
+ if ecs_select.active_mode == :disabled
73
+ expect( @event.get('host') ).to eql source_ip
74
+ else
75
+ expect( @event.get('host') ).to eql 'ip' => source_ip
76
+ end
77
+ end
78
+
79
+ end
80
+
81
+ context 'with an SNMP v2 trap' do
82
+
83
+ let(:trap) do
84
+ bindings = {
85
+ "1.2.3" => "foo",
86
+ "1.4.5.6" => "bar",
87
+ }
88
+
89
+ trap_event = {
90
+ "request_id" => 12345,
91
+ "error_status" => 0,
92
+ "timestamp" => 1011,
93
+ "variable_bindings" => bindings
94
+ }
95
+
96
+ trap = org.logstash.snmp.trap.SnmpTrapMessage.new(1, 'public'.bytes, org.snmp4j.smi.IpAddress.new(source_ip), trap_event, bindings)
97
+ trap
98
+ end
99
+
100
+ before { @event = plugin.send :process_trap_message, trap }
101
+
102
+ it "extract snmp payload" do
103
+ expect( @event.get('message') ).to be_a String
104
+ expect( @event.get('1.2.3') ).to eql 'foo'
105
+ expect( @event.get('1.4.5.6') ).to eql 'bar'
106
+ end
107
+
108
+ it "sets source host" do
109
+ if ecs_select.active_mode == :disabled
110
+ expect( @event.get('host') ).to eql source_ip
111
+ else
112
+ expect( @event.get('host') ).to eql 'ip' => source_ip
113
+ end
114
+ end
115
+
116
+ context 'with target' do
117
+
118
+ let(:config) { super().merge 'target' => '[snmp]' }
119
+
120
+ it "extract snmp payload" do
121
+ expect( @event.include?('1.2.3') ).to be false
122
+ expect( @event.include?('1.3.6.1.2.1.1.3.0') ).to be false
123
+ expect( @event.get('[snmp][1.2.3]') ).to eql 'foo'
124
+
125
+ expect( @event.get('message') ).to be_a String
126
+ end
127
+
128
+ it "sets source host" do
129
+ if ecs_select.active_mode == :disabled
130
+ expect( @event.get('host') ).to eql source_ip
131
+ else
132
+ expect( @event.get('host') ).to eql 'ip' => source_ip
133
+ end
134
+ end
135
+
136
+ end
137
+
138
+ end
139
+
140
+ end
141
+ end