Zino 2.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. zino-2.0.0/.codecov.yml +8 -0
  2. zino-2.0.0/.editorconfig +33 -0
  3. zino-2.0.0/.git-blame-ignore-revs +8 -0
  4. zino-2.0.0/.github/dependabot.yml +10 -0
  5. zino-2.0.0/.github/pull_request_template.md +30 -0
  6. zino-2.0.0/.github/workflows/linter.yml +44 -0
  7. zino-2.0.0/.github/workflows/publish-test-results.yml +73 -0
  8. zino-2.0.0/.github/workflows/tests.yml +83 -0
  9. zino-2.0.0/.github/workflows/towncrier.yml +24 -0
  10. zino-2.0.0/.gitignore +28 -0
  11. zino-2.0.0/.mega-linter.yml +16 -0
  12. zino-2.0.0/.pre-commit-config.yaml +30 -0
  13. zino-2.0.0/.readthedocs.yaml +32 -0
  14. zino-2.0.0/.sonarcloud.properties +13 -0
  15. zino-2.0.0/AUTHORS.md +14 -0
  16. zino-2.0.0/CHANGELOG.md +149 -0
  17. zino-2.0.0/LICENSE +202 -0
  18. zino-2.0.0/NOTICE +5 -0
  19. zino-2.0.0/PKG-INFO +639 -0
  20. zino-2.0.0/README.md +404 -0
  21. zino-2.0.0/changelog.d/.gitkeep +0 -0
  22. zino-2.0.0/docs/Makefile +20 -0
  23. zino-2.0.0/docs/conf.py +28 -0
  24. zino-2.0.0/docs/index.rst +16 -0
  25. zino-2.0.0/docs/make.bat +35 -0
  26. zino-2.0.0/polldevs.cf.example +36 -0
  27. zino-2.0.0/pyproject.toml +154 -0
  28. zino-2.0.0/requirements/dev.txt +18 -0
  29. zino-2.0.0/setup.cfg +4 -0
  30. zino-2.0.0/src/Zino.egg-info/PKG-INFO +639 -0
  31. zino-2.0.0/src/Zino.egg-info/SOURCES.txt +255 -0
  32. zino-2.0.0/src/Zino.egg-info/dependency_links.txt +1 -0
  33. zino-2.0.0/src/Zino.egg-info/entry_points.txt +3 -0
  34. zino-2.0.0/src/Zino.egg-info/not-zip-safe +1 -0
  35. zino-2.0.0/src/Zino.egg-info/requires.txt +14 -0
  36. zino-2.0.0/src/Zino.egg-info/top_level.txt +1 -0
  37. zino-2.0.0/src/zino/__init__.py +1 -0
  38. zino-2.0.0/src/zino/api/__init__.py +0 -0
  39. zino-2.0.0/src/zino/api/auth.py +63 -0
  40. zino-2.0.0/src/zino/api/legacy.py +620 -0
  41. zino-2.0.0/src/zino/api/notify.py +125 -0
  42. zino-2.0.0/src/zino/api/server.py +50 -0
  43. zino-2.0.0/src/zino/compat.py +20 -0
  44. zino-2.0.0/src/zino/config/__init__.py +41 -0
  45. zino-2.0.0/src/zino/config/models.py +107 -0
  46. zino-2.0.0/src/zino/config/polldevs.py +94 -0
  47. zino-2.0.0/src/zino/events.py +232 -0
  48. zino-2.0.0/src/zino/flaps.py +266 -0
  49. zino-2.0.0/src/zino/getuptime.py +41 -0
  50. zino-2.0.0/src/zino/getyellowalarms.py +41 -0
  51. zino-2.0.0/src/zino/oid.py +68 -0
  52. zino-2.0.0/src/zino/planned_maintenance.py +155 -0
  53. zino-2.0.0/src/zino/polltest.py +84 -0
  54. zino-2.0.0/src/zino/scheduler.py +133 -0
  55. zino-2.0.0/src/zino/snmp/__init__.py +67 -0
  56. zino-2.0.0/src/zino/snmp/base.py +77 -0
  57. zino-2.0.0/src/zino/snmp/mibdumps/BFD-STD-MIB.py +205 -0
  58. zino-2.0.0/src/zino/snmp/mibdumps/BFD-TC-STD-MIB.py +55 -0
  59. zino-2.0.0/src/zino/snmp/mibdumps/BGP4-MIB.py +278 -0
  60. zino-2.0.0/src/zino/snmp/mibdumps/BGP4-V2-MIB-JUNIPER.py +922 -0
  61. zino-2.0.0/src/zino/snmp/mibdumps/CISCO-BGP4-MIB.py +478 -0
  62. zino-2.0.0/src/zino/snmp/mibdumps/CISCO-CONFIG-MAN-MIB.py +82 -0
  63. zino-2.0.0/src/zino/snmp/mibdumps/CISCO-IETF-BFD-MIB.py +253 -0
  64. zino-2.0.0/src/zino/snmp/mibdumps/CISCO-PIM-MIB.py +69 -0
  65. zino-2.0.0/src/zino/snmp/mibdumps/CISCO-SMI.py +181 -0
  66. zino-2.0.0/src/zino/snmp/mibdumps/CISCOTRAP-MIB.py +30 -0
  67. zino-2.0.0/src/zino/snmp/mibdumps/DIFFSERV-DSCP-TC.py +36 -0
  68. zino-2.0.0/src/zino/snmp/mibdumps/DIFFSERV-MIB.py +602 -0
  69. zino-2.0.0/src/zino/snmp/mibdumps/IANA-BFD-TC-STD-MIB.py +65 -0
  70. zino-2.0.0/src/zino/snmp/mibdumps/IANA-RTPROTO-MIB.py +28 -0
  71. zino-2.0.0/src/zino/snmp/mibdumps/IANAifType-MIB.py +26 -0
  72. zino-2.0.0/src/zino/snmp/mibdumps/IF-MIB.py +232 -0
  73. zino-2.0.0/src/zino/snmp/mibdumps/INET-ADDRESS-MIB.py +250 -0
  74. zino-2.0.0/src/zino/snmp/mibdumps/INTEGRATED-SERVICES-MIB.py +192 -0
  75. zino-2.0.0/src/zino/snmp/mibdumps/IP-MIB.py +967 -0
  76. zino-2.0.0/src/zino/snmp/mibdumps/IPMROUTE-STD-MIB.py +170 -0
  77. zino-2.0.0/src/zino/snmp/mibdumps/JUNIPER-ALARM-MIB.py +35 -0
  78. zino-2.0.0/src/zino/snmp/mibdumps/JUNIPER-BFD-MIB.py +58 -0
  79. zino-2.0.0/src/zino/snmp/mibdumps/JUNIPER-EXPERIMENT-MIB.py +46 -0
  80. zino-2.0.0/src/zino/snmp/mibdumps/JUNIPER-SMI.py +114 -0
  81. zino-2.0.0/src/zino/snmp/mibdumps/OLD-CISCO-INTERFACES-MIB.py +265 -0
  82. zino-2.0.0/src/zino/snmp/mibdumps/OLD-CISCO-SYSTEM-MIB.py +60 -0
  83. zino-2.0.0/src/zino/snmp/mibdumps/OLD-CISCO-TCP-MIB.py +31 -0
  84. zino-2.0.0/src/zino/snmp/mibdumps/OLD-CISCO-TS-MIB.py +98 -0
  85. zino-2.0.0/src/zino/snmp/mibdumps/OSPF-MIB.py +584 -0
  86. zino-2.0.0/src/zino/snmp/mibdumps/OSPF-TRAP-MIB.py +86 -0
  87. zino-2.0.0/src/zino/snmp/mibdumps/PIM-MIB.py +174 -0
  88. zino-2.0.0/src/zino/snmp/mibdumps/TCP-MIB.py +124 -0
  89. zino-2.0.0/src/zino/snmp/mibs/BFD-STD-MIB +857 -0
  90. zino-2.0.0/src/zino/snmp/mibs/BFD-TC-STD-MIB +121 -0
  91. zino-2.0.0/src/zino/snmp/mibs/BGP4-MIB +1232 -0
  92. zino-2.0.0/src/zino/snmp/mibs/BGP4-V2-MIB-JUNIPER +4251 -0
  93. zino-2.0.0/src/zino/snmp/mibs/CISCO-BGP4-MIB +2280 -0
  94. zino-2.0.0/src/zino/snmp/mibs/CISCO-CONFIG-MAN-MIB +1007 -0
  95. zino-2.0.0/src/zino/snmp/mibs/CISCO-IETF-BFD-MIB +1246 -0
  96. zino-2.0.0/src/zino/snmp/mibs/CISCO-PIM-MIB +387 -0
  97. zino-2.0.0/src/zino/snmp/mibs/CISCO-SMI +554 -0
  98. zino-2.0.0/src/zino/snmp/mibs/CISCO-TC +2435 -0
  99. zino-2.0.0/src/zino/snmp/mibs/CISCOTRAP-MIB +102 -0
  100. zino-2.0.0/src/zino/snmp/mibs/DIFFSERV-DSCP-TC +64 -0
  101. zino-2.0.0/src/zino/snmp/mibs/DIFFSERV-MIB +3514 -0
  102. zino-2.0.0/src/zino/snmp/mibs/IANA-BFD-TC-STD-MIB +184 -0
  103. zino-2.0.0/src/zino/snmp/mibs/IANA-RTPROTO-MIB +87 -0
  104. zino-2.0.0/src/zino/snmp/mibs/IANAifType-MIB +593 -0
  105. zino-2.0.0/src/zino/snmp/mibs/IF-MIB +1814 -0
  106. zino-2.0.0/src/zino/snmp/mibs/INET-ADDRESS-MIB +402 -0
  107. zino-2.0.0/src/zino/snmp/mibs/INTEGRATED-SERVICES-MIB +750 -0
  108. zino-2.0.0/src/zino/snmp/mibs/IP-MIB +4993 -0
  109. zino-2.0.0/src/zino/snmp/mibs/IPMROUTE-STD-MIB +869 -0
  110. zino-2.0.0/src/zino/snmp/mibs/JUNIPER-ALARM-MIB +185 -0
  111. zino-2.0.0/src/zino/snmp/mibs/JUNIPER-BFD-MIB +177 -0
  112. zino-2.0.0/src/zino/snmp/mibs/JUNIPER-EXPERIMENT-MIB +96 -0
  113. zino-2.0.0/src/zino/snmp/mibs/JUNIPER-SMI +414 -0
  114. zino-2.0.0/src/zino/snmp/mibs/OLD-CISCO-INTERFACES-MIB +1358 -0
  115. zino-2.0.0/src/zino/snmp/mibs/OLD-CISCO-SYSTEM-MIB +233 -0
  116. zino-2.0.0/src/zino/snmp/mibs/OLD-CISCO-TCP-MIB +124 -0
  117. zino-2.0.0/src/zino/snmp/mibs/OLD-CISCO-TS-MIB +532 -0
  118. zino-2.0.0/src/zino/snmp/mibs/OSPF-MIB +4164 -0
  119. zino-2.0.0/src/zino/snmp/mibs/OSPF-TRAP-MIB +584 -0
  120. zino-2.0.0/src/zino/snmp/mibs/PIM-MIB +889 -0
  121. zino-2.0.0/src/zino/snmp/mibs/RFC1213-MIB +2613 -0
  122. zino-2.0.0/src/zino/snmp/mibs/SNMP-FRAMEWORK-MIB +526 -0
  123. zino-2.0.0/src/zino/snmp/mibs/SNMPv2-CONF +322 -0
  124. zino-2.0.0/src/zino/snmp/mibs/SNMPv2-MIB +854 -0
  125. zino-2.0.0/src/zino/snmp/mibs/SNMPv2-SMI +344 -0
  126. zino-2.0.0/src/zino/snmp/mibs/SNMPv2-TC +772 -0
  127. zino-2.0.0/src/zino/snmp/mibs/TCP-MIB +785 -0
  128. zino-2.0.0/src/zino/snmp/netsnmpy_backend.py +411 -0
  129. zino-2.0.0/src/zino/snmp/pysnmp_backend.py +499 -0
  130. zino-2.0.0/src/zino/state.py +68 -0
  131. zino-2.0.0/src/zino/stateconverter/__init__.py +0 -0
  132. zino-2.0.0/src/zino/stateconverter/bfd_converter.py +46 -0
  133. zino-2.0.0/src/zino/stateconverter/bgp_converter.py +60 -0
  134. zino-2.0.0/src/zino/stateconverter/convertstate.py +129 -0
  135. zino-2.0.0/src/zino/stateconverter/event_converter.py +172 -0
  136. zino-2.0.0/src/zino/stateconverter/flapping_converter.py +53 -0
  137. zino-2.0.0/src/zino/stateconverter/linedata.py +48 -0
  138. zino-2.0.0/src/zino/stateconverter/pm_converter.py +108 -0
  139. zino-2.0.0/src/zino/stateconverter/port_converter.py +45 -0
  140. zino-2.0.0/src/zino/stateconverter/utils.py +61 -0
  141. zino-2.0.0/src/zino/statemodels.py +627 -0
  142. zino-2.0.0/src/zino/tasks/__init__.py +32 -0
  143. zino-2.0.0/src/zino/tasks/addrs.py +94 -0
  144. zino-2.0.0/src/zino/tasks/bfdtask.py +154 -0
  145. zino-2.0.0/src/zino/tasks/bgpstatemonitortask.py +360 -0
  146. zino-2.0.0/src/zino/tasks/errors.py +2 -0
  147. zino-2.0.0/src/zino/tasks/juniperalarmtask.py +79 -0
  148. zino-2.0.0/src/zino/tasks/linkstatetask.py +200 -0
  149. zino-2.0.0/src/zino/tasks/reachabletask.py +85 -0
  150. zino-2.0.0/src/zino/tasks/task.py +33 -0
  151. zino-2.0.0/src/zino/tasks/vendor.py +31 -0
  152. zino-2.0.0/src/zino/time.py +8 -0
  153. zino-2.0.0/src/zino/trapd/__init__.py +29 -0
  154. zino-2.0.0/src/zino/trapd/base.py +168 -0
  155. zino-2.0.0/src/zino/trapd/netsnmpy_backend.py +109 -0
  156. zino-2.0.0/src/zino/trapd/pysnmp_backend.py +147 -0
  157. zino-2.0.0/src/zino/trapobservers/__init__.py +0 -0
  158. zino-2.0.0/src/zino/trapobservers/bfd_traps.py +65 -0
  159. zino-2.0.0/src/zino/trapobservers/bgp_traps.py +95 -0
  160. zino-2.0.0/src/zino/trapobservers/ignored_traps.py +23 -0
  161. zino-2.0.0/src/zino/trapobservers/link_traps.py +255 -0
  162. zino-2.0.0/src/zino/trapobservers/logged_traps.py +114 -0
  163. zino-2.0.0/src/zino/traptest.py +74 -0
  164. zino-2.0.0/src/zino/utils.py +48 -0
  165. zino-2.0.0/src/zino/version.py +21 -0
  166. zino-2.0.0/src/zino/zino.py +345 -0
  167. zino-2.0.0/tests/__init__.py +0 -0
  168. zino-2.0.0/tests/api/__init__.py +0 -0
  169. zino-2.0.0/tests/api/auth_test.py +70 -0
  170. zino-2.0.0/tests/api/conftest.py +29 -0
  171. zino-2.0.0/tests/api/legacy_test.py +1267 -0
  172. zino-2.0.0/tests/api/notify_test.py +151 -0
  173. zino-2.0.0/tests/api/server_test.py +9 -0
  174. zino-2.0.0/tests/bin_test.py +18 -0
  175. zino-2.0.0/tests/compat_test.py +21 -0
  176. zino-2.0.0/tests/config/__init__.py +0 -0
  177. zino-2.0.0/tests/config/models_test.py +13 -0
  178. zino-2.0.0/tests/config/polldevs_test.py +134 -0
  179. zino-2.0.0/tests/config_test.py +43 -0
  180. zino-2.0.0/tests/conftest.py +361 -0
  181. zino-2.0.0/tests/events_test.py +295 -0
  182. zino-2.0.0/tests/flaps_test.py +417 -0
  183. zino-2.0.0/tests/getuptime_test.py +30 -0
  184. zino-2.0.0/tests/oid_test.py +47 -0
  185. zino-2.0.0/tests/planned_maintenance_test.py +212 -0
  186. zino-2.0.0/tests/scheduler_test.py +228 -0
  187. zino-2.0.0/tests/snmp/__init__.py +0 -0
  188. zino-2.0.0/tests/snmp/netsnmpy_backend_test.py +289 -0
  189. zino-2.0.0/tests/snmp/pysnmp_backend_test.py +323 -0
  190. zino-2.0.0/tests/snmp_fixtures/cisco-bfd-down.snmprec +7 -0
  191. zino-2.0.0/tests/snmp_fixtures/cisco-bfd-up.snmprec +7 -0
  192. zino-2.0.0/tests/snmp_fixtures/cisco-bgp-admin-down.snmprec +9 -0
  193. zino-2.0.0/tests/snmp_fixtures/cisco-bgp-admin-up.snmprec +9 -0
  194. zino-2.0.0/tests/snmp_fixtures/cisco-bgp-external-reset.snmprec +9 -0
  195. zino-2.0.0/tests/snmp_fixtures/cisco-bgp-oper-down-short.snmprec +9 -0
  196. zino-2.0.0/tests/snmp_fixtures/cisco-bgp-oper-down.snmprec +9 -0
  197. zino-2.0.0/tests/snmp_fixtures/cisco-bgp.snmprec +8 -0
  198. zino-2.0.0/tests/snmp_fixtures/general-bgp-admin-down.snmprec +11 -0
  199. zino-2.0.0/tests/snmp_fixtures/general-bgp-admin-up.snmprec +11 -0
  200. zino-2.0.0/tests/snmp_fixtures/general-bgp-external-reset.snmprec +11 -0
  201. zino-2.0.0/tests/snmp_fixtures/general-bgp-oper-down-short.snmprec +11 -0
  202. zino-2.0.0/tests/snmp_fixtures/general-bgp-oper-down.snmprec +11 -0
  203. zino-2.0.0/tests/snmp_fixtures/general-bgp.snmprec +11 -0
  204. zino-2.0.0/tests/snmp_fixtures/ip-ad-ent-addr.snmprec +7 -0
  205. zino-2.0.0/tests/snmp_fixtures/juniper-alarm-wrong.snmprec +2 -0
  206. zino-2.0.0/tests/snmp_fixtures/juniper-alarm-zero.snmprec +2 -0
  207. zino-2.0.0/tests/snmp_fixtures/juniper-alarm.snmprec +2 -0
  208. zino-2.0.0/tests/snmp_fixtures/juniper-bfd-down.snmprec +20 -0
  209. zino-2.0.0/tests/snmp_fixtures/juniper-bfd-up.snmprec +20 -0
  210. zino-2.0.0/tests/snmp_fixtures/juniper-bgp-admin-down.snmprec +9 -0
  211. zino-2.0.0/tests/snmp_fixtures/juniper-bgp-admin-up.snmprec +9 -0
  212. zino-2.0.0/tests/snmp_fixtures/juniper-bgp-external-reset.snmprec +9 -0
  213. zino-2.0.0/tests/snmp_fixtures/juniper-bgp-oper-down-short.snmprec +9 -0
  214. zino-2.0.0/tests/snmp_fixtures/juniper-bgp-oper-down.snmprec +9 -0
  215. zino-2.0.0/tests/snmp_fixtures/juniper-bgp.snmprec +9 -0
  216. zino-2.0.0/tests/snmp_fixtures/linksadmindown.snmprec +90 -0
  217. zino-2.0.0/tests/snmp_fixtures/linksdown.snmprec +90 -0
  218. zino-2.0.0/tests/snmp_fixtures/linksup.snmprec +90 -0
  219. zino-2.0.0/tests/snmp_fixtures/missing-info-bgp.snmprec +4 -0
  220. zino-2.0.0/tests/snmp_fixtures/public.snmprec +1322 -0
  221. zino-2.0.0/tests/snmp_test.py +42 -0
  222. zino-2.0.0/tests/state_test.py +87 -0
  223. zino-2.0.0/tests/stateconverter/convertstate_test.py +233 -0
  224. zino-2.0.0/tests/stateconverter/fixtures/zino1_state.tcl +114 -0
  225. zino-2.0.0/tests/stateconverter/fixtures/zino1_state_invalid_event_attr.tcl +19 -0
  226. zino-2.0.0/tests/stateconverter/linedata_test.py +29 -0
  227. zino-2.0.0/tests/statemodels/conftest.py +36 -0
  228. zino-2.0.0/tests/statemodels/device_maintenance_test.py +113 -0
  229. zino-2.0.0/tests/statemodels/planned_maintenance_test.py +42 -0
  230. zino-2.0.0/tests/statemodels/portstate_maintenance_test.py +136 -0
  231. zino-2.0.0/tests/statemodels/statemodels_test.py +168 -0
  232. zino-2.0.0/tests/tasks/__init__.py +0 -0
  233. zino-2.0.0/tests/tasks/conftest.py +27 -0
  234. zino-2.0.0/tests/tasks/test_addrs.py +81 -0
  235. zino-2.0.0/tests/tasks/test_bfdtask.py +127 -0
  236. zino-2.0.0/tests/tasks/test_bgpstatemonitortask.py +385 -0
  237. zino-2.0.0/tests/tasks/test_init.py +6 -0
  238. zino-2.0.0/tests/tasks/test_juniperalarmtask.py +217 -0
  239. zino-2.0.0/tests/tasks/test_linkstatetask.py +242 -0
  240. zino-2.0.0/tests/tasks/test_reachabletask.py +133 -0
  241. zino-2.0.0/tests/tasks/test_run_all_tasks.py +58 -0
  242. zino-2.0.0/tests/tasks/test_task.py +31 -0
  243. zino-2.0.0/tests/tasks/test_vendor.py +29 -0
  244. zino-2.0.0/tests/trapd/__init__.py +13 -0
  245. zino-2.0.0/tests/trapd/netsnmp_backend_test.py +164 -0
  246. zino-2.0.0/tests/trapd/pysnmp_backend_test.py +170 -0
  247. zino-2.0.0/tests/trapobservers/__init__.py +0 -0
  248. zino-2.0.0/tests/trapobservers/bfd_traps_test.py +83 -0
  249. zino-2.0.0/tests/trapobservers/bgp_traps_test.py +102 -0
  250. zino-2.0.0/tests/trapobservers/conftest.py +15 -0
  251. zino-2.0.0/tests/trapobservers/ignored_traps_test.py +10 -0
  252. zino-2.0.0/tests/trapobservers/link_traps_test.py +356 -0
  253. zino-2.0.0/tests/trapobservers/logged_traps_test.py +155 -0
  254. zino-2.0.0/tests/utils_test.py +77 -0
  255. zino-2.0.0/tests/zino_test.py +281 -0
  256. zino-2.0.0/tox.ini +38 -0
  257. zino-2.0.0/zino.toml.example +55 -0
@@ -0,0 +1,8 @@
1
+ ---
2
+ coverage:
3
+ range: 57..100
4
+ round: nearest
5
+ precision: 2
6
+
7
+ ignore:
8
+ - "tests/**/*.py"
@@ -0,0 +1,33 @@
1
+ # https://editorconfig.org/
2
+
3
+ root = true
4
+
5
+ [*]
6
+ indent_style = space
7
+ indent_size = 4
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+ end_of_line = lf
11
+ charset = utf-8
12
+
13
+ [*.py]
14
+ max_line_length = 120
15
+
16
+ [*.html]
17
+ indent_size = 2
18
+
19
+ [*.json]
20
+ indent_size = 2
21
+ insert_final_newline = ignore
22
+
23
+ [Makefile]
24
+ indent_style = tab
25
+
26
+ [docs/**.txt]
27
+ max_line_length = 79
28
+
29
+ [docs/**.rst]
30
+ max_line_length = 79
31
+
32
+ [*.yml]
33
+ indent_size = 2
@@ -0,0 +1,8 @@
1
+ # Rerun black after upgrade to version 22.4.0 @johannaengland 22/05/2024
2
+ e0ac8815008114743f6fb2d8a918005bb32dd94f
3
+ # Rerun black for commits merged before black 22.4.0 pre-commit was merged @lunkwill42 31/05/2024
4
+ 85118701a98b71e1a1340674592c9d07cfb5c05d
5
+ # Reformat test using black v25.1.0 @johannaengland 04/02/2024
6
+ 905e7a01fc720732bc3513e074719bae78dddfe3
7
+ # Fix trailing whitespace in towncrier workflow @johannaengland 04/02/2024
8
+ e41cd16efb5f8bcb399a5b85b8d820dc8c5cf670
@@ -0,0 +1,10 @@
1
+ # Set update schedule for GitHub Actions
2
+
3
+ version: 2
4
+ updates:
5
+
6
+ - package-ecosystem: "github-actions"
7
+ directory: "/"
8
+ schedule:
9
+ # Check for updates to GitHub Actions every week
10
+ interval: "weekly"
@@ -0,0 +1,30 @@
1
+ ## Scope and purpose
2
+
3
+ Fixes #<!-- ISSUE-ID -->. Dependent on #<!-- PULL-REQUEST-ID -->. <!-- Reference: https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue -->
4
+
5
+ Add a description of what this PR does and why it is needed. If a linked ticket(s) fully
6
+ cover it, you can omit this.
7
+
8
+ <!-- remove things that do not apply -->
9
+ ### This pull request
10
+ * adds/changes/removes a dependency
11
+ * changes the API
12
+
13
+
14
+ ## Contributor Checklist
15
+
16
+ Every pull request should have this checklist filled out, no matter how small it is.
17
+ More information about contributing to Zino can be found in the
18
+ [README](https://github.com/Uninett/zino/blob/master/README.md#developing-zino).
19
+
20
+ <!-- Add an "X" inside the brackets to confirm -->
21
+ <!-- If not checking one or more of the boxes, please explain why below each. -->
22
+
23
+ * [ ] Added a changelog fragment for [towncrier](https://github.com/Uninett/zino/blob/master/README.md#before-merging-a-pull-request)
24
+ * [ ] Added/amended tests for new/changed code <!-- In case CodeCov Upload makes the tests fail, simply rerun them a few minutes later -->
25
+ * [ ] Added/changed documentation
26
+ * [ ] Linted/formatted the code with black, ruff and isort, easiest by using [pre-commit](https://github.com/Uninett/zino/blob/master/README.md#code-style)
27
+ * [ ] The first line of the commit message continues the sentence "If applied, this commit will ...", starts with a capital letter, does not end with punctuation and is 50 characters or less long. See https://cbea.ms/git-commit/
28
+ * [ ] If applicable: Created new issues if this PR does not fix the issue completely/there is further work to be done
29
+
30
+ <!-- Make this a draft PR if the content is subject to change, cannot be merged or if it is for initial feedback -->
@@ -0,0 +1,44 @@
1
+ ---
2
+ # MegaLinter GitHub Action configuration file
3
+ # More info at https://megalinter.io
4
+ name: MegaLinter
5
+ on:
6
+ push:
7
+ branches: "master"
8
+ pull_request:
9
+
10
+ jobs:
11
+ megalinter:
12
+ name: MegaLinter
13
+ runs-on: ubuntu-latest
14
+ permissions:
15
+ # Give the linter write permission to comment on PRs (if PR is not from fork)
16
+ issues: write
17
+ pull-requests: write
18
+ steps:
19
+ # Git Checkout
20
+ - name: Checkout Code
21
+ uses: actions/checkout@v4
22
+ with:
23
+ token: ${{ secrets.GITHUB_TOKEN }}
24
+ fetch-depth: 0
25
+ # MegaLinter
26
+ - name: MegaLinter
27
+ id: ml
28
+ # You can override MegaLinter flavor used to have faster performances
29
+ # More info at https://megalinter.io/flavors/
30
+ uses: oxsecurity/megalinter/flavors/python@v8
31
+ env:
32
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
33
+ # Validate whole codebase on pushes and only changes on pull requests
34
+ VALIDATE_ALL_CODEBASE: ${{ github.event_name == 'push'}}
35
+
36
+ # Upload MegaLinter artifacts
37
+ - name: Archive production artifacts
38
+ if: success() || failure()
39
+ uses: actions/upload-artifact@v4
40
+ with:
41
+ name: MegaLinter reports
42
+ path: |
43
+ megalinter-reports
44
+ mega-linter.log
@@ -0,0 +1,73 @@
1
+ name: Publish test and coverage results
2
+
3
+ on:
4
+ workflow_run:
5
+ workflows: ["Run test suite"]
6
+ types:
7
+ - completed
8
+
9
+ jobs:
10
+ publish-test-results:
11
+ name: "Publish test and coverage results"
12
+ runs-on: ubuntu-latest
13
+ if: github.event.workflow_run.conclusion != 'skipped' && github.repository_owner == 'Uninett'
14
+
15
+ steps:
16
+ # Checking out the repo is necessary codecov/codecov-action@v5 to work properly
17
+ # Codecov requires source code to process the coverage file and generate coverage
18
+ # reports
19
+ - name: Checkout Code
20
+ uses: actions/checkout@v4
21
+ with:
22
+ ref: ${{ github.event.workflow_run.head_sha }}
23
+
24
+ - name: Download and Extract Artifacts
25
+ env:
26
+ GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
27
+ run: |
28
+ mkdir -p artifacts && cd artifacts
29
+
30
+ artifacts_url=${{ github.event.workflow_run.artifacts_url }}
31
+
32
+ gh api "$artifacts_url" -q '.artifacts[] | [.name, .archive_download_url] | @tsv' | while read artifact
33
+ do
34
+ IFS=$'\t' read name url <<< "$artifact"
35
+ gh api $url > "$name.zip"
36
+ unzip -d "$name" "$name.zip"
37
+ done
38
+
39
+ - name: "Publish test results"
40
+ uses: EnricoMi/publish-unit-test-result-action@v2
41
+ with:
42
+ commit: ${{ github.event.workflow_run.head_sha }}
43
+ check_name: "Test results"
44
+ files: artifacts/**/*-results.xml
45
+
46
+ - name: Read PR number file
47
+ if: ${{ hashFiles('artifacts/extra/pr_number') != '' }}
48
+ run: |
49
+ pr_number=$(cat artifacts/extra/pr_number)
50
+ re='^[0-9]+$'
51
+ if [[ $pr_number =~ $re ]] ; then
52
+ echo "PR_NUMBER=$pr_number" >> $GITHUB_ENV
53
+ fi
54
+
55
+ - name: Read base SHA file
56
+ if: ${{ hashFiles('artifacts/extra/base_sha') != '' }}
57
+ run: |
58
+ base_sha=$(cat artifacts/extra/base_sha)
59
+ re='[0-9a-f]{40}'
60
+ if [[ $base_sha =~ $re ]] ; then
61
+ echo "BASE_SHA=$base_sha" >> $GITHUB_ENV
62
+ fi
63
+
64
+ - name: Upload to Codecov
65
+ uses: codecov/codecov-action@v5
66
+ with:
67
+ fail_ci_if_error: true
68
+ token: ${{ secrets.CODECOV_TOKEN }}
69
+ verbose: true
70
+ override_branch: ${{ github.event.workflow_run.head_branch}}
71
+ override_commit: ${{ github.event.workflow_run.head_sha}}
72
+ commit_parent: ${{ env.BASE_SHA }}
73
+ override_pr: ${{ env.PR_NUMBER }}
@@ -0,0 +1,83 @@
1
+ name: Run test suite
2
+
3
+ ###########################################################
4
+ # Start the job on pushes to master and all pull requests #
5
+ ###########################################################
6
+ on:
7
+ push:
8
+ branches: master
9
+ pull_request:
10
+ schedule: # Run daily at 08:00 CEST (06:00 UST)
11
+ - cron: '0 6 * * *'
12
+
13
+ ###############
14
+ # Set the Job #
15
+ ###############
16
+ jobs:
17
+ tests:
18
+ # Name the Job
19
+ name: "Test on Python ${{ matrix.python-version}}"
20
+ # Set the agent to run on
21
+ runs-on: ubuntu-latest
22
+
23
+ strategy:
24
+ max-parallel: 4
25
+ matrix:
26
+ python-version: ["3.9", "3.10", "3.11", "3.12"]
27
+
28
+ steps:
29
+ - name: Checkout Code
30
+ uses: actions/checkout@v4
31
+
32
+ - name: Cache
33
+ uses: actions/cache@v4
34
+ id: cache
35
+ with:
36
+ path: ~/.cache/pip
37
+ key: ${{ runner.os }}-pip-${{ hashFiles('**/pyproject.toml') }}
38
+ restore-keys: |
39
+ ${{ runner.os }}-pip-
40
+
41
+
42
+ - name: "Set up Python ${{ matrix.python-version }}"
43
+ uses: actions/setup-python@v5
44
+ with:
45
+ python-version: ${{ matrix.python-version }}
46
+
47
+ - name: Install dependencies
48
+ run: |
49
+ python -m pip install --upgrade pip
50
+ python -m pip install "tox<4" tox-gh-actions coverage
51
+ sudo apt-get install -y --no-install-recommends snmp libsnmp-dev
52
+
53
+ - name: Test with tox
54
+ run: tox
55
+
56
+ - name: Upload test reports (${{ matrix.python-version }})
57
+ if: always()
58
+ uses: actions/upload-artifact@v4
59
+ with:
60
+ name: reports-${{ matrix.python-version }}
61
+ path: |
62
+ reports/**/*
63
+
64
+ upload-pr-number-base-sha:
65
+ name: Save PR number and base SHA in artifact
66
+ runs-on: ubuntu-latest
67
+ if: ${{ github.event.number && always() }}
68
+ env:
69
+ PR_NUMBER: ${{ github.event.number }}
70
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
71
+ steps:
72
+ - name: Make PR number file
73
+ run: |
74
+ mkdir -p ./extra
75
+ echo $PR_NUMBER > ./extra/pr_number
76
+ - name: Make base SHA file
77
+ run: |
78
+ echo $BASE_SHA > ./extra/base_sha
79
+ - name: Upload PR number file and base SHA file
80
+ uses: actions/upload-artifact@v4
81
+ with:
82
+ name: extra
83
+ path: extra/
@@ -0,0 +1,24 @@
1
+ name: Check for changelog file
2
+
3
+ on:
4
+ pull_request:
5
+ # labeled/unlabeled = label is added/removed
6
+ # synchronize = PR's head branch was updated
7
+ types: [labeled, unlabeled, opened, reopened, synchronize]
8
+
9
+ jobs:
10
+ towncrier:
11
+ if: ${{ github.actor != 'dependabot[bot]' && !contains(github.event.pull_request.labels.*.name, 'nonews') && !contains(github.event.pull_request.labels.*.name, 'github_actions') }}
12
+ runs-on: ubuntu-latest
13
+ name: Towncrier check
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ with:
17
+ fetch-depth: 0
18
+
19
+ - name: Install towncrier
20
+ run: |
21
+ sudo apt-get install -y pipx
22
+ pipx install towncrier
23
+ - name: Check for changelog file
24
+ run: towncrier check --compare-with origin/master
zino-2.0.0/.gitignore ADDED
@@ -0,0 +1,28 @@
1
+ # Directories generated/used by development tools
2
+ .idea/
3
+ .ve/
4
+ .venv/
5
+ .tox/
6
+ .pytest_cache/
7
+ reports/
8
+ build/
9
+ dist/
10
+
11
+ # Generated files
12
+ src/zino/version.py
13
+ old-events/
14
+ docs/_build/
15
+ .coverage
16
+ *.pyc
17
+ *.egg-info/
18
+ *.whl
19
+
20
+ # avoid accidental commits of config and state files
21
+ polldevs.cf
22
+ polldevs.cf.*
23
+ zino-state.json
24
+ zino.toml
25
+ save-state.tcl
26
+
27
+ # avoid accidental commit of the secrets file
28
+ secrets
@@ -0,0 +1,16 @@
1
+ # All available variables are described in documentation
2
+ # https://megalinter.io/configuration/
3
+
4
+ LINTER_RULES_PATH: .
5
+
6
+ ENABLE_LINTERS:
7
+ - PYTHON_BLACK
8
+ - PYTHON_ISORT
9
+ - PYTHON_RUFF
10
+
11
+ # Make workflow fail even on non blocking errors
12
+ FORMATTERS_DISABLE_ERRORS: false
13
+
14
+ PYTHON_BLACK_CONFIG_FILE: pyproject.toml
15
+ PYTHON_ISORT_CONFIG_FILE: pyproject.toml
16
+ PYTHON_RUFF_CONFIG_FILE: pyproject.toml
@@ -0,0 +1,30 @@
1
+ ---
2
+ exclude: 'mibdumps/.*|mibs/.*'
3
+ repos:
4
+ - repo: https://github.com/pre-commit/pre-commit-hooks
5
+ rev: v5.0.0
6
+ hooks:
7
+ - id: trailing-whitespace
8
+ - id: mixed-line-ending
9
+ - id: end-of-file-fixer
10
+ exclude: &exclude_pattern '^changelog.d/'
11
+ - id: debug-statements
12
+ - repo: https://github.com/pycqa/isort
13
+ rev: 6.0.0
14
+ hooks:
15
+ - id: isort
16
+ name: isort (python)
17
+ - repo: https://github.com/psf/black
18
+ rev: 25.1.0
19
+ hooks:
20
+ - id: black
21
+ - repo: https://github.com/astral-sh/ruff-pre-commit
22
+ rev: v0.9.4
23
+ hooks:
24
+ - id: ruff
25
+ - repo: https://github.com/twisted/towncrier
26
+ rev: 24.8.0
27
+ hooks:
28
+ - id: towncrier-check
29
+ files: $changelog\.d/
30
+ args: [--compare-with origin/master]
@@ -0,0 +1,32 @@
1
+ # .readthedocs.yaml
2
+ # Read the Docs configuration file
3
+ # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
4
+
5
+ # Required
6
+ version: 2
7
+
8
+ # Set the OS, Python version and other tools you might need
9
+ build:
10
+ os: ubuntu-22.04
11
+ tools:
12
+ python: "3.11"
13
+ # You can also specify other tool versions:
14
+ # nodejs: "19"
15
+ # rust: "1.64"
16
+ # golang: "1.19"
17
+
18
+ # Build documentation in the "docs/" directory with Sphinx
19
+ sphinx:
20
+ configuration: docs/conf.py
21
+
22
+ # Optionally build your docs in additional formats such as PDF and ePub
23
+ # formats:
24
+ # - pdf
25
+ # - epub
26
+
27
+ # Optional but recommended, declare the Python requirements required
28
+ # to build your documentation
29
+ # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
30
+ # python:
31
+ # install:
32
+ # - requirements: docs/requirements.txt
@@ -0,0 +1,13 @@
1
+ sonar.projectKey=Uninett_zino
2
+ sonar.organization=uninett-1
3
+
4
+ # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
5
+ sonar.sources=src
6
+
7
+ # Encoding of the source code. Default is default system encoding
8
+ #sonar.sourceEncoding=UTF-8
9
+
10
+ sonar.python.version=3.9, 3.10, 3.11
11
+ sonar.tests=tests
12
+
13
+ sonar.exclusions=src/zino/snmp/mibdumps/**
zino-2.0.0/AUTHORS.md ADDED
@@ -0,0 +1,14 @@
1
+ # Authors
2
+
3
+ This file lists all individuals having contributed content to the project.
4
+
5
+ ## Project Founders
6
+
7
+ - Håvard Eidnes <havard.eidnes@sikt.no>
8
+
9
+ ## Contributors
10
+
11
+ - Hanne Moa <hanne.moa@sikt.no> ([hmpf](https://github.com/hmpf))
12
+ - Johanna England <johanna.england@sikt.no> ([johannaengland](https://github.com/johannaengland))
13
+ - Morten Brekkevold <morten.brekkevold@sikt.no> ([lunkwill42](https://github.com/lunkwill42))
14
+ - Simon Oliver Tveit <simon.tveit@sikt.no> ([stveit](https://github.com/stveit))
@@ -0,0 +1,149 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ Zino 2 is a full rewrite of the original Tcl-based Zino state monitor. This
9
+ changelog only details changes from Zino 2 on and out.
10
+
11
+ This project uses [*towncrier*](https://towncrier.readthedocs.io/) and the changes for the upcoming release can be found in <https://github.com/Uninett/zino/tree/master/changelog.d/>.
12
+
13
+ <!-- towncrier release notes start -->
14
+
15
+ ## [2.0.0] - 2025-03-14
16
+
17
+ ### Added
18
+
19
+ - Calculate downtime for BGP events ([#368](https://github.com/Uninett/zino/issues/368))
20
+ - Added debug logging of low-level SNMP session details to aid in debugging low-level OS resource management problems
21
+ - Added directory for Sphinx documentation in order to set up ReadTheDocs site and secure the name `zino` there.
22
+
23
+ ### Fixed
24
+
25
+ - Added alternative C-based SNMP back-end for massive performance gains ([#383](https://github.com/Uninett/zino/issues/383))
26
+ - Log "home" address changes as `DEBUG` level information, to avoid unnecessary verbosity in VRRP setups ([#215](https://github.com/Uninett/zino/issues/215))
27
+ - Fix Zino dependencies to allow running on Python 3.12 ([#386](https://github.com/Uninett/zino/issues/386))
28
+ - Fixed unintended symbolic translations in the SNMP abstraction layer, and removed now obsolete workarounds for the problem ([#389](https://github.com/Uninett/zino/issues/389))
29
+ - Removed development tools from list of optional package runtime requirements ([#399](https://github.com/Uninett/zino/issues/399))
30
+
31
+
32
+ # ## [2.0.0-beta.2] - 2024-09-03
33
+
34
+ ### Added
35
+
36
+ - Added full implementation of the `CLEARFLAP` API command ([#113](https://github.com/Uninett/zino/issues/113))
37
+ - Log warning if `secrets` file is world-readable ([#280](https://github.com/Uninett/zino/issues/280))
38
+ - Only load and parse pollfile if it has been changed since last load ([#282](https://github.com/Uninett/zino/issues/282))
39
+ - Added customized logging of multiple traps, just as in Zino 1:
40
+ - `CISCOTRAP-MIB::reload`
41
+ - `CISCO-CONFIG-MAN-MIB::ciscoConfigManEvent`
42
+ - `CISCO-PIM-MIB::ciscoPimInvalidRegister`
43
+ - `CISCO-PIM-MIB::ciscoPimInvalidJoinPrune`
44
+ - `OSPF-TRAP-MIB::ospfIfConfigError`
45
+
46
+ ([#319](https://github.com/Uninett/zino/issues/319))
47
+ - Added support for tracking accumulated event downtime for reachability and portstate events ([#332](https://github.com/Uninett/zino/issues/332))
48
+ - Custom logging configuration can now be applied in `zino.toml`
49
+
50
+ ### Changed
51
+
52
+ - Rename/alias BGP and Juniper alarm event attributes in order to have more useful variable names in Python code, while retaining aliases that are compatible with the legacy API protocol ([#352](https://github.com/Uninett/zino/issues/352))
53
+
54
+ ### Fixed
55
+
56
+ - Properly use dashes in event attribute names in the legacy API ([#281](https://github.com/Uninett/zino/issues/281))
57
+ - Use Zino 1-compatible field names for serialization of planned maintenance ([#287](https://github.com/Uninett/zino/issues/287))
58
+ - Use Zino 1 field names for serialization of BGP/BFD events ([#331](https://github.com/Uninett/zino/issues/331))
59
+ - Match against port alias instead of port description when `match_type` is `regexp` or `str` for portstate maintenance events. Still matches port description for `intf-regexp`. ([#297](https://github.com/Uninett/zino/issues/297))
60
+ - Fix BGP-related Pydantic serialization warnings ([#312](https://github.com/Uninett/zino/issues/312))
61
+ - Stop logging empty interface descriptions on first discovery ([#314](https://github.com/Uninett/zino/issues/314))
62
+ - Reschedule devices whose configuration attributes where changed in the pollfile ([#330](https://github.com/Uninett/zino/issues/330))
63
+ - Use default interval from pollfile to stagger new jobs ([#337](https://github.com/Uninett/zino/issues/337))
64
+ - When matching an event to a planned maintenance, check that event is of the correct subclass ([#344](https://github.com/Uninett/zino/issues/344))
65
+ - Avoid potential state corruption issues by saving the running state to a temporary file before overwriting the existing state file ([#364](https://github.com/Uninett/zino/issues/364))
66
+ - Properly encode timedelta values as an integer number of seconds in the legacy API
67
+
68
+
69
+ ## [2.0.0-beta.1] - 2024-07-09
70
+
71
+
72
+ ### Removed
73
+
74
+ - Remove test-only commands from API ([#286](https://github.com/Uninett/zino/issues/286))
75
+
76
+ ### Added
77
+
78
+ - Add generic Zino config file ([#224](https://github.com/Uninett/zino/issues/224))
79
+ - Add most important SNMP trap handlers
80
+ - Port basic link trap handling from Zino 1
81
+ - Add port flapping detection to link trap transition handlers, in accordance with Zino 1 ([#284](https://github.com/Uninett/zino/issues/284))
82
+ - Schedule re-verification of port states after link traps are received
83
+ - Handle incoming Juniper BGP traps ([#291](https://github.com/Uninett/zino/issues/291))
84
+ - Update BFD session information on incoming BFD session traps ([#305](https://github.com/Uninett/zino/issues/305))
85
+ - Add planned maintenance feature ([#61](https://github.com/Uninett/zino/issues/61))
86
+ - Add the `PM` family of API commands to manipulate planned maintenance ([#298](https://github.com/Uninett/zino/issues/298))
87
+ - Add framework support for API "sub-commands", to support the `PM` set of commands. ([#274](https://github.com/Uninett/zino/issues/274))
88
+ - Add `POLLRTR` API command ([#219](https://github.com/Uninett/zino/issues/219))
89
+ - Add `POLLINTF` API command ([#300](https://github.com/Uninett/zino/issues/300))
90
+ - Add a dummy `CLEARFLAP` API command in order not to crash older clients
91
+ - Add `zinoconv` program for converting state from Zino 1 to Zino 2 ([#66](https://github.com/Uninett/zino/issues/66))
92
+ - Add support for `neigh_rdns` attribute in BFD events. ([#199](https://github.com/Uninett/zino/issues/199))
93
+ - Add more tests for event deletion ([#209](https://github.com/Uninett/zino/issues/209))
94
+ - Fix log message on initial Juniper chassis alarm ([#213](https://github.com/Uninett/zino/issues/213))
95
+ - Add towncrier to automatically produce changelog ([#218](https://github.com/Uninett/zino/issues/218))
96
+ - Fully support multi-varbind SNMP-GET operations ([#303](https://github.com/Uninett/zino/issues/303))
97
+ - Add tests to show that one will not get closed events using `get_or_create_event()`
98
+ - Index recently closed events to facilitate updating of prematurely closed flapping events
99
+
100
+ ### Changed
101
+
102
+ - Handle errors from changed SNMP interface in Juniper alarm task ([#212](https://github.com/Uninett/zino/issues/212))
103
+
104
+ ### Fixed
105
+
106
+ - Improve error reporting, including line/block location, for `polldevs.cf` parsing errors ([#248](https://github.com/Uninett/zino/issues/248))
107
+ - Properly handle Juniper devices without SNMP values for red/yellow alarm count ([#231](https://github.com/Uninett/zino/issues/231))
108
+ - Properly handle "varbind" error values for SNMP v2 GET operations ([#261](https://github.com/Uninett/zino/issues/261))
109
+ - API now listens to all interfaces, not just loopback ([#285](https://github.com/Uninett/zino/issues/285))
110
+ - Resolve value types of incoming SNMP traps correctly ([#290](https://github.com/Uninett/zino/issues/290))
111
+ - Ensure polling single interfaces does not crash in the event of timeout errors
112
+ - Ensure polling single interfaces works for `ifindex=0`
113
+
114
+
115
+ ## [2.0.0-alpha.2] - 2024-04-09
116
+
117
+ ### Added
118
+
119
+ - SNMP traps can now be received, logged and ignored (although no useful
120
+ handlers have been implemented yet)
121
+ (([#189](https://github.com/Uninett/zino/pull/189),
122
+ [#193](https://github.com/Uninett/zino/pull/193))
123
+ - Closed events now properly expire and are evicted from the running state
124
+ after 8 hours ([#203](https://github.com/Uninett/zino/pull/203)).
125
+ - Expired events are dumped to separate JSON files in the `old-events/`
126
+ directory ([#204](https://github.com/Uninett/zino/pull/204)).
127
+
128
+ ### Fixed
129
+
130
+ - BGP events are now presented with correctly named attributes in the legacy
131
+ API ([#172](https://github.com/Uninett/zino/issues/172))
132
+ - BGP task no longer crashes on unexpected SNMP responses while probing for
133
+ which BGP MIB to use for a device ([#184](https://github.com/Uninett/zino/issues/184))
134
+ - Legacy API now correctly hides closed events ([#192](https://github.com/Uninett/zino/issues/192))
135
+ - Legacy API now correctly denies re-opening of closed events ([#201](https://github.com/Uninett/zino/issues/201))
136
+ - BFD events now have the expected `lastevent` attribute ([#200](https://github.com/Uninett/zino/issues/200))
137
+ - Fixed potential bug with how `portstate` events are indexed internally in
138
+ Zino's running state ([#206](https://github.com/Uninett/zino/issues/206))
139
+ - API now responds with a proper message on user authentication failures
140
+ ([#210](https://github.com/Uninett/zino/pull/210))
141
+
142
+ ### Changed
143
+
144
+ - Functions for parsing the many ways IP addresses are represented in SNMP MIBs
145
+ have been consolidated into a single function ([#183](https://github.com/Uninett/zino/issues/183))
146
+
147
+ ## [2.0.0-alpha.1] - 2024-01-26
148
+
149
+ This is the first official release of Zino 2.