annet 3.5.0__tar.gz → 3.5.1__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.

Potentially problematic release.


This version of annet might be problematic. Click here for more details.

Files changed (228) hide show
  1. {annet-3.5.0/annet.egg-info → annet-3.5.1}/PKG-INFO +1 -1
  2. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/common/models.py +2 -0
  3. {annet-3.5.0 → annet-3.5.1}/annet/annlib/command.py +1 -0
  4. {annet-3.5.0 → annet-3.5.1}/annet/annlib/rulebook/common.py +5 -5
  5. {annet-3.5.0 → annet-3.5.1}/annet/bgp_models.py +2 -0
  6. {annet-3.5.0 → annet-3.5.1}/annet/cli_args.py +6 -0
  7. {annet-3.5.0 → annet-3.5.1}/annet/deploy.py +2 -3
  8. {annet-3.5.0 → annet-3.5.1}/annet/mesh/peer_models.py +1 -0
  9. annet-3.5.1/annet/rulebook/b4com/iface.py +119 -0
  10. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/cisco/iface.py +1 -1
  11. annet-3.5.1/annet/rulebook/generic/misc.py +14 -0
  12. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/huawei/aaa.py +12 -1
  13. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/b4com.order +4 -0
  14. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/b4com.rul +13 -5
  15. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/cisco.order +0 -1
  16. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/cisco.rul +18 -17
  17. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/huawei.deploy +8 -0
  18. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/huawei.order +14 -0
  19. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/huawei.rul +13 -1
  20. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/b4com.py +3 -0
  21. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/iosxr.py +1 -1
  22. {annet-3.5.0 → annet-3.5.1/annet.egg-info}/PKG-INFO +1 -1
  23. {annet-3.5.0 → annet-3.5.1}/annet.egg-info/SOURCES.txt +2 -0
  24. annet-3.5.1/annet_generators/__init__.py +0 -0
  25. annet-3.5.0/annet/rulebook/b4com/iface.py +0 -56
  26. {annet-3.5.0 → annet-3.5.1}/AUTHORS +0 -0
  27. {annet-3.5.0 → annet-3.5.1}/LICENSE +0 -0
  28. {annet-3.5.0 → annet-3.5.1}/MANIFEST.in +0 -0
  29. {annet-3.5.0 → annet-3.5.1}/README.md +0 -0
  30. {annet-3.5.0 → annet-3.5.1}/annet/__init__.py +0 -0
  31. {annet-3.5.0 → annet-3.5.1}/annet/adapters/__init__.py +0 -0
  32. {annet-3.5.0 → annet-3.5.1}/annet/adapters/fetchers/__init__.py +0 -0
  33. {annet-3.5.0 → annet-3.5.1}/annet/adapters/fetchers/stub/__init__.py +0 -0
  34. {annet-3.5.0 → annet-3.5.1}/annet/adapters/fetchers/stub/fetcher.py +0 -0
  35. {annet-3.5.0 → annet-3.5.1}/annet/adapters/file/__init__.py +0 -0
  36. {annet-3.5.0 → annet-3.5.1}/annet/adapters/file/provider.py +0 -0
  37. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/__init__.py +0 -0
  38. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/common/__init__.py +0 -0
  39. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/common/adapter.py +0 -0
  40. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/common/client.py +0 -0
  41. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/common/manufacturer.py +0 -0
  42. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/common/query.py +0 -0
  43. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/common/status_client.py +0 -0
  44. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/common/storage_base.py +0 -0
  45. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/common/storage_opts.py +0 -0
  46. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/provider.py +0 -0
  47. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v24/__init__.py +0 -0
  48. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v24/models.py +0 -0
  49. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v24/storage.py +0 -0
  50. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v37/__init__.py +0 -0
  51. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v37/models.py +0 -0
  52. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v37/storage.py +0 -0
  53. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v41/__init__.py +0 -0
  54. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v41/models.py +0 -0
  55. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v41/storage.py +0 -0
  56. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v42/__init__.py +0 -0
  57. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v42/models.py +0 -0
  58. {annet-3.5.0 → annet-3.5.1}/annet/adapters/netbox/v42/storage.py +0 -0
  59. {annet-3.5.0 → annet-3.5.1}/annet/annet.py +0 -0
  60. {annet-3.5.0 → annet-3.5.1}/annet/annlib/__init__.py +0 -0
  61. {annet-3.5.0 → annet-3.5.1}/annet/annlib/diff.py +0 -0
  62. {annet-3.5.0 → annet-3.5.1}/annet/annlib/errors.py +0 -0
  63. {annet-3.5.0 → annet-3.5.1}/annet/annlib/filter_acl.py +0 -0
  64. {annet-3.5.0 → annet-3.5.1}/annet/annlib/jsontools.py +0 -0
  65. {annet-3.5.0 → annet-3.5.1}/annet/annlib/lib.py +0 -0
  66. {annet-3.5.0 → annet-3.5.1}/annet/annlib/netdev/__init__.py +0 -0
  67. {annet-3.5.0 → annet-3.5.1}/annet/annlib/netdev/db.py +0 -0
  68. {annet-3.5.0 → annet-3.5.1}/annet/annlib/netdev/devdb/__init__.py +0 -0
  69. {annet-3.5.0 → annet-3.5.1}/annet/annlib/netdev/devdb/data/devdb.json +0 -0
  70. {annet-3.5.0 → annet-3.5.1}/annet/annlib/netdev/views/__init__.py +0 -0
  71. {annet-3.5.0 → annet-3.5.1}/annet/annlib/netdev/views/dump.py +0 -0
  72. {annet-3.5.0 → annet-3.5.1}/annet/annlib/netdev/views/hardware.py +0 -0
  73. {annet-3.5.0 → annet-3.5.1}/annet/annlib/output.py +0 -0
  74. {annet-3.5.0 → annet-3.5.1}/annet/annlib/patching.py +0 -0
  75. {annet-3.5.0 → annet-3.5.1}/annet/annlib/rbparser/__init__.py +0 -0
  76. {annet-3.5.0 → annet-3.5.1}/annet/annlib/rbparser/acl.py +0 -0
  77. {annet-3.5.0 → annet-3.5.1}/annet/annlib/rbparser/deploying.py +0 -0
  78. {annet-3.5.0 → annet-3.5.1}/annet/annlib/rbparser/ordering.py +0 -0
  79. {annet-3.5.0 → annet-3.5.1}/annet/annlib/rbparser/platform.py +0 -0
  80. {annet-3.5.0 → annet-3.5.1}/annet/annlib/rbparser/syntax.py +0 -0
  81. {annet-3.5.0 → annet-3.5.1}/annet/annlib/rulebook/__init__.py +0 -0
  82. {annet-3.5.0 → annet-3.5.1}/annet/annlib/types.py +0 -0
  83. {annet-3.5.0 → annet-3.5.1}/annet/api/__init__.py +0 -0
  84. {annet-3.5.0 → annet-3.5.1}/annet/argparse.py +0 -0
  85. {annet-3.5.0 → annet-3.5.1}/annet/cli.py +0 -0
  86. {annet-3.5.0 → annet-3.5.1}/annet/configs/context.yml +0 -0
  87. {annet-3.5.0 → annet-3.5.1}/annet/configs/logging.yaml +0 -0
  88. {annet-3.5.0 → annet-3.5.1}/annet/connectors.py +0 -0
  89. {annet-3.5.0 → annet-3.5.1}/annet/deploy_ui.py +0 -0
  90. {annet-3.5.0 → annet-3.5.1}/annet/diff.py +0 -0
  91. {annet-3.5.0 → annet-3.5.1}/annet/executor.py +0 -0
  92. {annet-3.5.0 → annet-3.5.1}/annet/filtering.py +0 -0
  93. {annet-3.5.0 → annet-3.5.1}/annet/gen.py +0 -0
  94. {annet-3.5.0 → annet-3.5.1}/annet/generators/__init__.py +0 -0
  95. {annet-3.5.0 → annet-3.5.1}/annet/generators/base.py +0 -0
  96. {annet-3.5.0 → annet-3.5.1}/annet/generators/common/__init__.py +0 -0
  97. {annet-3.5.0 → annet-3.5.1}/annet/generators/common/initial.py +0 -0
  98. {annet-3.5.0 → annet-3.5.1}/annet/generators/entire.py +0 -0
  99. {annet-3.5.0 → annet-3.5.1}/annet/generators/exceptions.py +0 -0
  100. {annet-3.5.0 → annet-3.5.1}/annet/generators/jsonfragment.py +0 -0
  101. {annet-3.5.0 → annet-3.5.1}/annet/generators/partial.py +0 -0
  102. {annet-3.5.0 → annet-3.5.1}/annet/generators/perf.py +0 -0
  103. {annet-3.5.0 → annet-3.5.1}/annet/generators/ref.py +0 -0
  104. {annet-3.5.0 → annet-3.5.1}/annet/generators/result.py +0 -0
  105. {annet-3.5.0 → annet-3.5.1}/annet/hardware.py +0 -0
  106. {annet-3.5.0 → annet-3.5.1}/annet/implicit.py +0 -0
  107. {annet-3.5.0 → annet-3.5.1}/annet/lib.py +0 -0
  108. {annet-3.5.0 → annet-3.5.1}/annet/mesh/__init__.py +0 -0
  109. {annet-3.5.0 → annet-3.5.1}/annet/mesh/basemodel.py +0 -0
  110. {annet-3.5.0 → annet-3.5.1}/annet/mesh/device_models.py +0 -0
  111. {annet-3.5.0 → annet-3.5.1}/annet/mesh/executor.py +0 -0
  112. {annet-3.5.0 → annet-3.5.1}/annet/mesh/match_args.py +0 -0
  113. {annet-3.5.0 → annet-3.5.1}/annet/mesh/models_converter.py +0 -0
  114. {annet-3.5.0 → annet-3.5.1}/annet/mesh/port_processor.py +0 -0
  115. {annet-3.5.0 → annet-3.5.1}/annet/mesh/registry.py +0 -0
  116. {annet-3.5.0 → annet-3.5.1}/annet/output.py +0 -0
  117. {annet-3.5.0 → annet-3.5.1}/annet/parallel.py +0 -0
  118. {annet-3.5.0 → annet-3.5.1}/annet/patching.py +0 -0
  119. {annet-3.5.0 → annet-3.5.1}/annet/reference.py +0 -0
  120. {annet-3.5.0 → annet-3.5.1}/annet/rpl/__init__.py +0 -0
  121. {annet-3.5.0 → annet-3.5.1}/annet/rpl/action.py +0 -0
  122. {annet-3.5.0 → annet-3.5.1}/annet/rpl/condition.py +0 -0
  123. {annet-3.5.0 → annet-3.5.1}/annet/rpl/match_builder.py +0 -0
  124. {annet-3.5.0 → annet-3.5.1}/annet/rpl/policy.py +0 -0
  125. {annet-3.5.0 → annet-3.5.1}/annet/rpl/result.py +0 -0
  126. {annet-3.5.0 → annet-3.5.1}/annet/rpl/routemap.py +0 -0
  127. {annet-3.5.0 → annet-3.5.1}/annet/rpl/statement_builder.py +0 -0
  128. {annet-3.5.0 → annet-3.5.1}/annet/rpl_generators/__init__.py +0 -0
  129. {annet-3.5.0 → annet-3.5.1}/annet/rpl_generators/aspath.py +0 -0
  130. {annet-3.5.0 → annet-3.5.1}/annet/rpl_generators/community.py +0 -0
  131. {annet-3.5.0 → annet-3.5.1}/annet/rpl_generators/cumulus_frr.py +0 -0
  132. {annet-3.5.0 → annet-3.5.1}/annet/rpl_generators/entities.py +0 -0
  133. {annet-3.5.0 → annet-3.5.1}/annet/rpl_generators/execute.py +0 -0
  134. {annet-3.5.0 → annet-3.5.1}/annet/rpl_generators/policy.py +0 -0
  135. {annet-3.5.0 → annet-3.5.1}/annet/rpl_generators/prefix_lists.py +0 -0
  136. {annet-3.5.0 → annet-3.5.1}/annet/rpl_generators/rd.py +0 -0
  137. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/__init__.py +0 -0
  138. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/arista/__init__.py +0 -0
  139. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/arista/aaa.py +0 -0
  140. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/arista/iface.py +0 -0
  141. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/aruba/__init__.py +0 -0
  142. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/aruba/ap_env.py +0 -0
  143. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/aruba/misc.py +0 -0
  144. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/b4com/__init__.py +0 -0
  145. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/b4com/file.py +0 -0
  146. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/cisco/__init__.py +0 -0
  147. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/cisco/misc.py +0 -0
  148. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/cisco/vlandb.py +0 -0
  149. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/common.py +0 -0
  150. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/deploying.py +0 -0
  151. {annet-3.5.0/annet/rulebook/huawei → annet-3.5.1/annet/rulebook/generic}/__init__.py +0 -0
  152. {annet-3.5.0/annet/rulebook/nexus → annet-3.5.1/annet/rulebook/huawei}/__init__.py +0 -0
  153. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/huawei/bgp.py +0 -0
  154. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/huawei/iface.py +0 -0
  155. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/huawei/misc.py +0 -0
  156. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/huawei/vlandb.py +0 -0
  157. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/juniper/__init__.py +0 -0
  158. {annet-3.5.0/annet/rulebook/routeros → annet-3.5.1/annet/rulebook/nexus}/__init__.py +0 -0
  159. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/nexus/iface.py +0 -0
  160. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/patching.py +0 -0
  161. {annet-3.5.0/annet/vendors/library → annet-3.5.1/annet/rulebook/routeros}/__init__.py +0 -0
  162. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/routeros/file.py +0 -0
  163. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/arista.deploy +0 -0
  164. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/arista.order +0 -0
  165. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/arista.rul +0 -0
  166. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/aruba.deploy +0 -0
  167. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/aruba.order +0 -0
  168. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/aruba.rul +0 -0
  169. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/b4com.deploy +0 -0
  170. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/cisco.deploy +0 -0
  171. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/iosxr.deploy +0 -0
  172. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/iosxr.order +0 -0
  173. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/iosxr.rul +0 -0
  174. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/juniper.order +0 -0
  175. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/juniper.rul +0 -0
  176. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/nexus.deploy +0 -0
  177. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/nexus.order +0 -0
  178. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/nexus.rul +0 -0
  179. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/nokia.rul +0 -0
  180. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/optixtrans.deploy +0 -0
  181. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/optixtrans.order +0 -0
  182. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/optixtrans.rul +0 -0
  183. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/pc.deploy +0 -0
  184. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/pc.order +0 -0
  185. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/pc.rul +0 -0
  186. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/ribbon.deploy +0 -0
  187. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/ribbon.rul +0 -0
  188. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/routeros.order +0 -0
  189. {annet-3.5.0 → annet-3.5.1}/annet/rulebook/texts/routeros.rul +0 -0
  190. {annet-3.5.0 → annet-3.5.1}/annet/storage.py +0 -0
  191. {annet-3.5.0 → annet-3.5.1}/annet/text_term_format.py +0 -0
  192. {annet-3.5.0 → annet-3.5.1}/annet/tracing.py +0 -0
  193. {annet-3.5.0 → annet-3.5.1}/annet/types.py +0 -0
  194. {annet-3.5.0 → annet-3.5.1}/annet/vendors/__init__.py +0 -0
  195. {annet-3.5.0 → annet-3.5.1}/annet/vendors/base.py +0 -0
  196. {annet-3.5.0/annet_generators → annet-3.5.1/annet/vendors/library}/__init__.py +0 -0
  197. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/arista.py +0 -0
  198. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/aruba.py +0 -0
  199. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/cisco.py +0 -0
  200. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/h3c.py +0 -0
  201. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/huawei.py +0 -0
  202. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/juniper.py +0 -0
  203. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/nexus.py +0 -0
  204. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/nokia.py +0 -0
  205. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/optixtrans.py +0 -0
  206. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/pc.py +0 -0
  207. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/ribbon.py +0 -0
  208. {annet-3.5.0 → annet-3.5.1}/annet/vendors/library/routeros.py +0 -0
  209. {annet-3.5.0 → annet-3.5.1}/annet/vendors/registry.py +0 -0
  210. {annet-3.5.0 → annet-3.5.1}/annet/vendors/tabparser.py +0 -0
  211. {annet-3.5.0 → annet-3.5.1}/annet.egg-info/dependency_links.txt +0 -0
  212. {annet-3.5.0 → annet-3.5.1}/annet.egg-info/entry_points.txt +0 -0
  213. {annet-3.5.0 → annet-3.5.1}/annet.egg-info/requires.txt +0 -0
  214. {annet-3.5.0 → annet-3.5.1}/annet.egg-info/top_level.txt +0 -0
  215. {annet-3.5.0 → annet-3.5.1}/annet_generators/example/__init__.py +0 -0
  216. {annet-3.5.0 → annet-3.5.1}/annet_generators/example/hostname.py +0 -0
  217. {annet-3.5.0 → annet-3.5.1}/annet_generators/example/lldp.py +0 -0
  218. {annet-3.5.0 → annet-3.5.1}/annet_generators/mesh_example/__init__.py +0 -0
  219. {annet-3.5.0 → annet-3.5.1}/annet_generators/mesh_example/bgp.py +0 -0
  220. {annet-3.5.0 → annet-3.5.1}/annet_generators/mesh_example/mesh_logic.py +0 -0
  221. {annet-3.5.0 → annet-3.5.1}/annet_generators/rpl_example/__init__.py +0 -0
  222. {annet-3.5.0 → annet-3.5.1}/annet_generators/rpl_example/generator.py +0 -0
  223. {annet-3.5.0 → annet-3.5.1}/annet_generators/rpl_example/items.py +0 -0
  224. {annet-3.5.0 → annet-3.5.1}/annet_generators/rpl_example/mesh.py +0 -0
  225. {annet-3.5.0 → annet-3.5.1}/annet_generators/rpl_example/route_policy.py +0 -0
  226. {annet-3.5.0 → annet-3.5.1}/requirements.txt +0 -0
  227. {annet-3.5.0 → annet-3.5.1}/setup.cfg +0 -0
  228. {annet-3.5.0 → annet-3.5.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: annet
3
- Version: 3.5.0
3
+ Version: 3.5.1
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
@@ -207,6 +207,8 @@ class NetboxDevice(Entity, Generic[_InterfaceT]):
207
207
  created: datetime
208
208
  last_updated: datetime
209
209
  cluster: Optional[Entity]
210
+ config_context: Optional[dict[str, Any]]
211
+ config_template: Optional[dict[str, Any]]
210
212
 
211
213
  fqdn: str
212
214
  hostname: str
@@ -12,6 +12,7 @@ class Question:
12
12
  question: str # frame it using / if it is a regular expression
13
13
  answer: str
14
14
  is_regexp: Optional[bool] = False
15
+ not_send_nl: bool = False
15
16
 
16
17
 
17
18
  @dataclass
@@ -10,7 +10,7 @@ from annet.vendors import registry_connector
10
10
  # =====
11
11
  def default(rule, key, diff, **_):
12
12
  r"""
13
- Функция default() обеспичвает базовую логику обработки всех правил. Ее можно заменить с помощью
13
+ Функция default() обеспечивает базовую логику обработки всех правил. Ее можно заменить с помощью
14
14
  параметра %logic в текстовом рулбуке. Она вызывается для каждой команды с уникальным ключом и
15
15
  должна возвратить сгенерированный текст патча на основе предоставленного диффа, и, при необходимости,
16
16
  вызвать обработку дочерних правил/данных.
@@ -49,8 +49,8 @@ def default(rule, key, diff, **_):
49
49
  """
50
50
  for op in [Op.ADDED, Op.REMOVED, Op.AFFECTED, Op.MOVED]:
51
51
  # Дефолтная функция генерации патчей считает, что не бывает команд с одинаковыми
52
- # ключами и разным значением. при этом unchanged мы так не проверяем поскольку
53
- # такие случаи возможны когда у нас подмешиваются implicit команды
52
+ # ключами и разным значением. При этом unchanged мы так не проверяем, поскольку
53
+ # такие случаи возможны, когда у нас подмешиваются implicit команды
54
54
  assert 0 <= len(diff[op]) <= 1, "Too many %s actions for rows %r" % (op, [x["row"] for x in diff[op]])
55
55
  if diff[Op.AFFECTED]:
56
56
  # При изменении блока нужно вызвать обработку чилдов
@@ -60,7 +60,7 @@ def default(rule, key, diff, **_):
60
60
  # При модификации строки удаление нас не интересует, добавление проходит как affected
61
61
  yield (True, diff[key][0]["row"], diff[key][0]["children"])
62
62
  elif diff[Op.REMOVED]:
63
- # При удалении или перемещеннии блока просто снести строку
63
+ # При удалении или перемещении блока просто снести строку
64
64
  yield (False, rule["reverse"].format(*key), None)
65
65
 
66
66
 
@@ -179,7 +179,7 @@ def multiline_diff(old: odict, new: odict, diff_pre: odict, _pops: tuple[Op, ...
179
179
  Особая логика diff'a для хуавейных мультилайнов.
180
180
  Она трактует все дочерние элементы %multiline-команды как
181
181
  одну общую команду, покидывая внутрь тот Op который был
182
- определен на вернем уровне
182
+ определен на верхнем уровне
183
183
  """
184
184
 
185
185
  def process_multiline(op, tree):
@@ -199,6 +199,7 @@ class PeerOptions:
199
199
  soft_reconfiguration_inbound: Optional[bool] = None
200
200
  not_active: Optional[bool] = None
201
201
  mtu: Optional[int] = None
202
+ password: Optional[str] = None
202
203
 
203
204
 
204
205
  @dataclass
@@ -312,6 +313,7 @@ class PeerGroup:
312
313
  soft_reconfiguration_inbound: bool = False
313
314
  not_active: bool = False
314
315
  mtu: int = 0
316
+ password: Optional[str] = None
315
317
 
316
318
 
317
319
  @dataclass
@@ -248,6 +248,11 @@ opt_max_slots = Arg(
248
248
  help="The amount of devices parsed at the same time with asyncio"
249
249
  )
250
250
 
251
+ opt_max_deploy = Arg(
252
+ "--max-deploy", default=0, type=int,
253
+ help="The amount of devices deployed at the same time"
254
+ )
255
+
251
256
  opt_hosts_range = Arg(
252
257
  "--hosts-range", type=valid_range,
253
258
  help="Only work with the specified hosts range: 10 - the first 10. 10:20 - host from 10th up to 20th"
@@ -498,6 +503,7 @@ class DeployOptions(ShowDiffOptions, PatchOptions, DeviceCliOptions):
498
503
  no_check_diff = opt_no_check_diff
499
504
  entire_reload = opt_entire_reload
500
505
  rollback = opt_rollback
506
+ max_parallel = opt_max_deploy
501
507
 
502
508
 
503
509
  class SelectContext(ArgGroup):
@@ -157,14 +157,13 @@ class RulebookQuestionHandler:
157
157
 
158
158
 
159
159
  def rb_question_to_question(q: MakeMessageMatcher, a: Answer) -> Question: # TODO: drop MakeMessageMatcher
160
- if not a.send_nl:
161
- raise Exception("not supported false send_nl")
162
160
  text: str = q._text # pylint: disable=protected-access
161
+ answer: str = a.text
163
162
  is_regexp = False
164
163
  if text.startswith("/") and text.endswith("/"):
165
164
  is_regexp = True
166
165
  text = text[1:-1]
167
- res = Question(question=text, answer=a.text, is_regexp=is_regexp)
166
+ res = Question(question=text, answer=answer, is_regexp=is_regexp, not_send_nl=not a.send_nl)
168
167
  return res
169
168
 
170
169
 
@@ -17,6 +17,7 @@ class _SharedOptionsDTO(BaseMeshModel):
17
17
  send_community: bool
18
18
  bfd: bool
19
19
  bfd_timers: BFDTimers
20
+ password: str
20
21
 
21
22
 
22
23
  class MeshSession(_SharedOptionsDTO):
@@ -0,0 +1,119 @@
1
+ from annet.annlib.types import Op
2
+
3
+ from annet.rulebook import common
4
+
5
+
6
+ def diff(old, new, diff_pre, _pops=(Op.AFFECTED,)):
7
+ for iface_row in old:
8
+ _filter_channel_members(old[iface_row])
9
+ for iface_row in new:
10
+ _filter_channel_members(new[iface_row])
11
+
12
+ ret = common.default_diff(old, new, diff_pre, _pops)
13
+ vpn_changed = False
14
+ for (op, cmd, _, _) in ret:
15
+ if op in {Op.ADDED, Op.REMOVED}:
16
+ vpn_changed |= is_vpn_cmd(cmd)
17
+ if vpn_changed:
18
+ for cmd in list(old.keys()):
19
+ if is_ip_cmd(cmd) and not is_vpn_cmd(cmd):
20
+ del old[cmd]
21
+ ret = common.default_diff(old, new, diff_pre, _pops)
22
+ return ret
23
+
24
+
25
+ # ===
26
+
27
+ # Вырезает все команды не разрешенные
28
+ # на членах агрегата. В running-config
29
+ # листинге они наследуются от самого port-channel
30
+
31
+
32
+ def _filter_channel_members(tree):
33
+ if any(is_in_channel(x) for x in tree):
34
+ for cmd in list(tree.keys()):
35
+ if not _is_allowed_on_channel(cmd):
36
+ del tree[cmd]
37
+
38
+
39
+ def is_in_channel(cmd_line):
40
+ """
41
+ Признак того, что это lagg member
42
+ """
43
+ return cmd_line.startswith("channel-group")
44
+
45
+
46
+ # Возможно тут есть еще какие-то команды
47
+ def _is_allowed_on_channel(cmd_line):
48
+ return cmd_line.startswith((
49
+ "channel-group",
50
+ "cdp",
51
+ "description",
52
+ "inherit",
53
+ "ip port",
54
+ "ipv6 port",
55
+ "mac port",
56
+ "lacp",
57
+ "switchport host",
58
+ "shutdown",
59
+ "rate-limit cpu",
60
+ "snmp trap link-status",
61
+ ))
62
+
63
+
64
+ def is_vpn_cmd(cmd):
65
+ return cmd.startswith("vrf member")
66
+
67
+
68
+ def is_ip_cmd(cmd):
69
+ return cmd.startswith(("ip ", "ipv6 "))
70
+
71
+
72
+ def mtu(rule, key, diff, **kwargs):
73
+ """
74
+ Удаляем mtu без указания значения
75
+ """
76
+ if diff[Op.REMOVED]:
77
+ yield (False, "no mtu", None)
78
+ elif diff[Op.ADDED]:
79
+ yield from common.default(rule, key, diff, **kwargs)
80
+
81
+
82
+ def description(rule, key, diff, **kwargs):
83
+ """
84
+ Удаляем description без указания значения
85
+ """
86
+ if diff[Op.REMOVED]:
87
+ yield (False, "no description", None)
88
+ elif diff[Op.ADDED]:
89
+ yield from common.default(rule, key, diff, **kwargs)
90
+
91
+
92
+ def sflow(rule, key, diff, **kwargs):
93
+ """
94
+ Команда sflow sampling-rate * direction ingress max-header-size *
95
+ сносится без указания sampling-rate и max-header-size
96
+ """
97
+ if diff[Op.REMOVED]:
98
+ if "ingress" in diff[Op.REMOVED][0]["row"]:
99
+ yield (False, "no sflow sampling-rate direction ingress", None)
100
+ elif "egress" in diff[Op.REMOVED][0]["row"]:
101
+ yield (False, "no sflow sampling-rate direction egress", None)
102
+ else:
103
+ yield from common.default(rule, key, diff, **kwargs)
104
+
105
+
106
+ def lldp(rule, key, diff, **kwargs):
107
+ """
108
+ Обрабатываем блок lldp-agent
109
+ """
110
+ result = common.default(rule, key, diff, **kwargs)
111
+ for op, cmd, ch in result:
112
+ # Не удаляем все что начинается с set, т.к. set перезаписывает предыдущий конфиг
113
+ if diff[Op.REMOVED] and "set lldp" in cmd:
114
+ pass
115
+ # В случае lldp tlv ... select удаляем все что до select
116
+ elif diff[Op.REMOVED] and cmd.endswith("select"):
117
+ yield (op, " ".join(cmd.split()[:-1]), ch)
118
+ else:
119
+ yield (op, cmd, ch)
@@ -23,7 +23,7 @@ def diff(old, new, diff_pre, _pops=(Op.AFFECTED,)):
23
23
 
24
24
 
25
25
  def is_vpn_cmd(cmd):
26
- return cmd.startswith("vrf member")
26
+ return cmd.startswith(("ip vrf forwarding", "vrf forwarding"))
27
27
 
28
28
 
29
29
  def is_ip_cmd(cmd):
@@ -0,0 +1,14 @@
1
+ from annet.annlib.types import Op
2
+
3
+ from annet.rulebook import common
4
+
5
+
6
+ def remove_last_param(rule, key, diff, **_):
7
+ if diff[Op.REMOVED]:
8
+ for rem in diff[Op.REMOVED]:
9
+ # Обрабатывать удаление последнего параметра команды
10
+ cmd_parts = rem["row"].split(" ")
11
+ cmd_parts.remove(cmd_parts[len(cmd_parts) - 1])
12
+ yield False, "undo %s" % " ".join(cmd_parts), None
13
+ else:
14
+ yield from common.default(rule, key, diff)
@@ -14,13 +14,24 @@ def user(key, diff, **_):
14
14
  check_for_remove = False
15
15
  if check_for_remove:
16
16
  for rem in diff[Op.REMOVED]:
17
- # Обрабатывать удаление только пароля, если меняется что-то другое, можно просто накатить без удаления
17
+ # Обрабатывать удаление только пароля или привилегий, если меняется что-то другое, можно просто накатить без удаления
18
18
  if rem["row"].startswith("local-user %s password" % key[0]):
19
19
  yield (False, "undo local-user %s" % key[0], None)
20
20
  return
21
+ if (rem["row"].startswith("local-user %s privilege" % key[0])
22
+ and not _added_contains(diff[Op.ADDED], "local-user %s privilege" % key[0])):
23
+ yield (False, "undo local-user %s" % key[0], None)
24
+ return
21
25
  yield from added
22
26
 
23
27
 
28
+ def _added_contains(array: list[dict], lookup_string: str) -> bool:
29
+ for item in array:
30
+ if item["row"].startswith(lookup_string):
31
+ return True
32
+ return False
33
+
34
+
24
35
  def domain(rule, key, diff, **_):
25
36
  """
26
37
  При удалении метода для accounting|authorization|authentication
@@ -7,6 +7,9 @@
7
7
  feature
8
8
  # Далее нужно будет указать команды и их порядок
9
9
  sflow
10
+ ip prefix-list
11
+ ipv6 prefix-list
12
+ route-map
10
13
  interface *
11
14
  description
12
15
  ip vrf forwarding
@@ -18,3 +21,4 @@ interface *
18
21
  dcbx
19
22
  exit
20
23
  sflow
24
+ ip community-list
@@ -11,17 +11,25 @@
11
11
  # Сделано в основном для того чтобы генерировать специальные команды для наливки
12
12
  # -----
13
13
  # Physical
14
- sflow *
15
-
16
- interface */(ce|xe|eth|vlan)[0-9\/]+$/ %logic=common.permanent %diff_logic=cisco.iface.diff
17
- description * %logic=b4com.iface.description
14
+ sflow
15
+ aaa group server tacacs\+ *
16
+ ~ %global
17
+ ip prefix-list *
18
+ ~ %global
19
+ ipv6 prefix-list *
20
+ ~ %global
21
+ route-map ~
22
+ ~ %global
23
+ interface */(ce|xe|po|eth|vlan1\.)[0-9\/]+$/ %logic=common.permanent %diff_logic=b4com.iface.diff
24
+ description
18
25
  ip vrf forwarding *
19
26
  ip address *
20
27
  ipv6 address *
21
28
  ipv6 nd *
22
- mtu * %logic=b4com.iface.mtu
29
+ mtu
23
30
  sflow * %logic=b4com.iface.sflow
24
31
  lldp-agent
25
32
  ~ %global %logic=b4com.iface.lldp
26
33
  !dcbx *
27
34
  !exit
35
+ ip community-list ~
@@ -64,7 +64,6 @@ interface *
64
64
  encapsulation
65
65
  ip vrf forwarding
66
66
  vrf forwarding
67
- vrf member
68
67
  ip
69
68
  ipv6
70
69
  no ipv6 nd %order_reverse
@@ -40,34 +40,35 @@ snmp-server host ~
40
40
  # Disabling this SNMP option throws WARNING which stops mpdaemon set-up process
41
41
  no snmp-server sysobjectid type stack-oid
42
42
 
43
- !interface */(mgmt|ipmi|Vlan1$)/
44
-
45
- interface Loopback
46
- ipv6 address *
47
- ip address ~
48
- ! no ip address
49
-
50
43
  # SVI/Subifs/Lagg
51
- interface */(Vlan|Ethernet.*\.|port-channel.*\.?)\d+$/ %diff_logic=cisco.iface.diff
52
- vrf member
44
+ interface */(Loopback|vasileft|vasiright|Tunnel|BDI|multiservice|Virtual-Template|Vlan|\w*Ethernet.*\.|[Pp]ort-channel.*\.?)\d+/
45
+ ip vrf forwarding %diff_logic=cisco.iface.diff
46
+ vrf forwarding %diff_logic=cisco.iface.diff
47
+ ip address ~ %diff_logic=cisco.iface.diff
48
+ ip unnumbered * %diff_logic=cisco.iface.diff
49
+ ! no ip address
53
50
  ipv6 link-local
54
- ipv6 address *
51
+ ipv6 address ~ %diff_logic=cisco.iface.diff
52
+ ipv6 unnumbered * %diff_logic=cisco.iface.diff
53
+ ipv6 enable %diff_logic=cisco.iface.diff
55
54
  ipv6 nd ~ %logic=cisco.misc.no_ipv6_nd_suppress_ra
56
- ip address ~
57
- ! no ip address
58
55
  mtu
59
56
 
60
57
  # Physical
61
- interface */\w*Ethernet[0-9\/]+$/ %logic=common.permanent %diff_logic=cisco.iface.diff
58
+ interface */\w*Ethernet[0-9\/]+$/ %logic=common.permanent %diff_logic=cisco.iface.diff
62
59
  switchport mode
63
60
  switchport trunk native vlan
64
61
  switchport access vlan
65
62
  switchport trunk allowed vlan %logic=cisco.vlandb.swtrunk
66
- vrf member
67
- ipv6 link-local
68
- ipv6 address *
69
- ip address ~
63
+ ip vrf forwarding %diff_logic=cisco.iface.diff
64
+ vrf forwarding %diff_logic=cisco.iface.diff
65
+ ip address ~ %diff_logic=cisco.iface.diff
66
+ ip unnumbered * %diff_logic=cisco.iface.diff
70
67
  ! no ip address
68
+ ipv6 link-local
69
+ ipv6 address ~ %diff_logic=cisco.iface.diff
70
+ ipv6 unnumbered * %diff_logic=cisco.iface.diff
71
+ ipv6 enable %diff_logic=cisco.iface.diff
71
72
  channel-group
72
73
  mtu
73
74
  storm-control * level
@@ -105,6 +105,8 @@ system tcam acl
105
105
  local-user * privilege level
106
106
  dialog: Warning: This operation may affect online users, are you sure to change the user privilege level ?[Y/N] ::: Y
107
107
  dialog: Warning: This operation may affect online users and will change the user privilege level, Continue? [Y/N]: ::: Y
108
+ local-user * password
109
+ dialog: Warning: The user using this account will be logged out, and needs to log in again. Do you want to continue? [Y/N] ::: Y
108
110
 
109
111
  stp *
110
112
  dialog: Warning: The global STP state will be changed. Continue? [Y/N] ::: Y
@@ -185,4 +187,10 @@ force transceiver *
185
187
  undo force transceiver *
186
188
  dialog: /.*Continue\?/ ::: Y
187
189
 
190
+ undo local-aaa-user change-password verify
191
+ dialog: Warning: This command will disable the function of verifying the old password when administrators changes their own passwords. Continue?[Y/N] ::: Y
192
+
193
+ undo local-user ~
194
+ dialog: Warning: This operation may affect online users, are you sure to change the user privilege level ?[Y/N] ::: Y
195
+
188
196
  # vim: set syntax=annrulebook:
@@ -95,6 +95,7 @@ vlan
95
95
 
96
96
  hwtacacs-server
97
97
  hwtacacs server
98
+ radius-server
98
99
 
99
100
  aaa
100
101
  undo local-user policy security-enhance
@@ -112,6 +113,12 @@ aaa
112
113
 
113
114
  task-group
114
115
  user-group
116
+
117
+ #pin removal order to ensure that local-user will be deleted last
118
+ undo local-user * ftp-directory %order_reverse
119
+ undo local-user * privilege %order_reverse
120
+ undo local-user * level %order_reverse
121
+ undo local-user * %order_reverse
115
122
  ~
116
123
 
117
124
 
@@ -257,6 +264,9 @@ bgp
257
264
  peer * as-number *
258
265
  peer * enable
259
266
  peer * ~
267
+ l2vpn-ad-family
268
+ peer * enable
269
+ peer * ~
260
270
  # [NOCDEV-2043] Остальное в глобальном блоке делаем тут
261
271
  undo peer * description %order_reverse
262
272
  undo peer * * * %order_reverse
@@ -385,4 +395,8 @@ undo sflow %order_reverse
385
395
  # индекс референсится в логике патчинга префикс-листа huawei.misc.prefix_list
386
396
  undo ip */(ip|ipv6)/-prefix * index 99999999 %order_reverse
387
397
 
398
+ #remove template only after all references will be cleared
399
+ undo radius-server template %order_reverse
400
+ undo hwtacacs-server template %order_reverse
401
+
388
402
  ~
@@ -180,13 +180,23 @@ aaa
180
180
  undo user-password complexity-check
181
181
  task-group *
182
182
  task *
183
- local-user * privilege level %diff_logic=huawei.aaa.local_user_diff
183
+ local-user * ftp-directory
184
+ local-user * privilege level %diff_logic=huawei.aaa.local_user_diff %logic=huawei.aaa.user
184
185
  local-user * level %diff_logic=huawei.aaa.local_user_diff
185
186
  local-user * %diff_logic=huawei.aaa.local_user_diff %logic=huawei.aaa.user
186
187
  */(accounting|authentication|authorization)/-scheme *
187
188
  */(accounting|authentication|authorization)/-mode
189
+
190
+ domain default
191
+ */(accounting|authentication|authorization)/-scheme * %logic=huawei.aaa.domain
192
+ !radius-server default
193
+ radius-server * %logic=generic.misc.remove_last_param
194
+ hwtacacs-server * %logic=generic.misc.remove_last_param
195
+
188
196
  domain *
189
197
  */(accounting|authentication|authorization)/-scheme * %logic=huawei.aaa.domain
198
+ radius-server * %logic=generic.misc.remove_last_param
199
+ hwtacacs-server * %logic=generic.misc.remove_last_param
190
200
  ~ %global
191
201
 
192
202
  hwtacacs-server template *
@@ -195,6 +205,8 @@ hwtacacs-server template *
195
205
  hwtacacs server template *
196
206
  hwtacacs server shared-key
197
207
 
208
+ !radius-server template default
209
+
198
210
  radius-server template *
199
211
  radius-server accounting * *
200
212
  radius-server authentication * *
@@ -44,3 +44,6 @@ class B4ComVendor(AbstractVendor):
44
44
  @property
45
45
  def exit(self) -> str:
46
46
  return "exit"
47
+
48
+ def svi_name(self, num: int) -> str:
49
+ return f"vlan1.{num}"
@@ -14,7 +14,7 @@ class IosXrVendor(AbstractVendor):
14
14
 
15
15
  before.add_cmd(Command("configure exclusive"))
16
16
  if do_commit:
17
- after.add_cmd(Command("commit"))
17
+ after.add_cmd(Command("commit show-error"))
18
18
  after.add_cmd(Command("exit"))
19
19
 
20
20
  return before, after
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: annet
3
- Version: 3.5.0
3
+ Version: 3.5.1
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
@@ -145,6 +145,8 @@ annet/rulebook/cisco/__init__.py
145
145
  annet/rulebook/cisco/iface.py
146
146
  annet/rulebook/cisco/misc.py
147
147
  annet/rulebook/cisco/vlandb.py
148
+ annet/rulebook/generic/__init__.py
149
+ annet/rulebook/generic/misc.py
148
150
  annet/rulebook/huawei/__init__.py
149
151
  annet/rulebook/huawei/aaa.py
150
152
  annet/rulebook/huawei/bgp.py
File without changes
@@ -1,56 +0,0 @@
1
- from annet.annlib.types import Op
2
-
3
- from annet.rulebook import common
4
-
5
-
6
- def mtu(rule, key, diff, **kwargs):
7
- """
8
- Удаляем mtu без указания значения
9
- """
10
- if diff[Op.REMOVED]:
11
- yield (False, "no mtu", None)
12
- elif diff[Op.ADDED]:
13
- yield from common.default(rule, key, diff, **kwargs)
14
-
15
-
16
- def description(rule, key, diff, **kwargs):
17
- """
18
- Удаляем description без указания значения
19
- """
20
- if diff[Op.REMOVED]:
21
- yield (False, "no description", None)
22
- elif diff[Op.ADDED]:
23
- yield from common.default(rule, key, diff, **kwargs)
24
-
25
-
26
- def sflow(rule, key, diff, **kwargs):
27
- """
28
- Команда sflow sampling-rate * direction ingress max-header-size *
29
- сносится без указания sampling-rate и max-header-size
30
- """
31
- result = common.default(rule, key, diff, **kwargs)
32
- for op, cmd, ch in result:
33
- if diff[Op.REMOVED]:
34
- if "ingress" in diff[Op.REMOVED][0]["row"]:
35
- yield (op, "no sflow sampling-rate direction ingress", ch)
36
- elif "egress" in diff[Op.REMOVED][0]["row"]:
37
- yield (op, "no sflow sampling-rate direction egress", ch)
38
- else:
39
- yield (op, cmd, ch)
40
- return result
41
-
42
-
43
- def lldp(rule, key, diff, **kwargs):
44
- """
45
- Обрабатываем блок lldp-agent
46
- """
47
- result = common.default(rule, key, diff, **kwargs)
48
- for op, cmd, ch in result:
49
- # Не удаляем все что начинается с set, т.к. set перезаписывает предыдущий конфиг
50
- if diff[Op.REMOVED] and "set lldp" in cmd:
51
- pass
52
- # В случае lldp tlv ... select удаляем все что до select
53
- elif diff[Op.REMOVED] and cmd.endswith("select"):
54
- yield (op, " ".join(cmd.split()[:-1]), ch)
55
- else:
56
- yield (op, cmd, ch)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes