annet 0.1__py3-none-any.whl

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 (113) hide show
  1. annet/__init__.py +61 -0
  2. annet/annet.py +25 -0
  3. annet/annlib/__init__.py +7 -0
  4. annet/annlib/command.py +49 -0
  5. annet/annlib/diff.py +158 -0
  6. annet/annlib/errors.py +8 -0
  7. annet/annlib/filter_acl.py +196 -0
  8. annet/annlib/jsontools.py +89 -0
  9. annet/annlib/lib.py +495 -0
  10. annet/annlib/netdev/__init__.py +0 -0
  11. annet/annlib/netdev/db.py +62 -0
  12. annet/annlib/netdev/devdb/__init__.py +28 -0
  13. annet/annlib/netdev/devdb/data/devdb.json +137 -0
  14. annet/annlib/netdev/views/__init__.py +0 -0
  15. annet/annlib/netdev/views/dump.py +121 -0
  16. annet/annlib/netdev/views/hardware.py +112 -0
  17. annet/annlib/output.py +246 -0
  18. annet/annlib/patching.py +533 -0
  19. annet/annlib/rbparser/__init__.py +0 -0
  20. annet/annlib/rbparser/acl.py +120 -0
  21. annet/annlib/rbparser/deploying.py +55 -0
  22. annet/annlib/rbparser/ordering.py +52 -0
  23. annet/annlib/rbparser/platform.py +51 -0
  24. annet/annlib/rbparser/syntax.py +115 -0
  25. annet/annlib/rulebook/__init__.py +0 -0
  26. annet/annlib/rulebook/common.py +350 -0
  27. annet/annlib/tabparser.py +648 -0
  28. annet/annlib/types.py +35 -0
  29. annet/api/__init__.py +807 -0
  30. annet/argparse.py +415 -0
  31. annet/cli.py +192 -0
  32. annet/cli_args.py +493 -0
  33. annet/configs/context.yml +18 -0
  34. annet/configs/logging.yaml +39 -0
  35. annet/connectors.py +64 -0
  36. annet/deploy.py +441 -0
  37. annet/diff.py +85 -0
  38. annet/executor.py +551 -0
  39. annet/filtering.py +40 -0
  40. annet/gen.py +828 -0
  41. annet/generators/__init__.py +987 -0
  42. annet/generators/common/__init__.py +0 -0
  43. annet/generators/common/initial.py +33 -0
  44. annet/hardware.py +45 -0
  45. annet/implicit.py +139 -0
  46. annet/lib.py +128 -0
  47. annet/output.py +170 -0
  48. annet/parallel.py +448 -0
  49. annet/patching.py +25 -0
  50. annet/reference.py +148 -0
  51. annet/rulebook/__init__.py +114 -0
  52. annet/rulebook/arista/__init__.py +0 -0
  53. annet/rulebook/arista/iface.py +16 -0
  54. annet/rulebook/aruba/__init__.py +16 -0
  55. annet/rulebook/aruba/ap_env.py +146 -0
  56. annet/rulebook/aruba/misc.py +8 -0
  57. annet/rulebook/cisco/__init__.py +0 -0
  58. annet/rulebook/cisco/iface.py +68 -0
  59. annet/rulebook/cisco/misc.py +57 -0
  60. annet/rulebook/cisco/vlandb.py +90 -0
  61. annet/rulebook/common.py +19 -0
  62. annet/rulebook/deploying.py +87 -0
  63. annet/rulebook/huawei/__init__.py +0 -0
  64. annet/rulebook/huawei/aaa.py +75 -0
  65. annet/rulebook/huawei/bgp.py +97 -0
  66. annet/rulebook/huawei/iface.py +33 -0
  67. annet/rulebook/huawei/misc.py +337 -0
  68. annet/rulebook/huawei/vlandb.py +115 -0
  69. annet/rulebook/juniper/__init__.py +107 -0
  70. annet/rulebook/nexus/__init__.py +0 -0
  71. annet/rulebook/nexus/iface.py +92 -0
  72. annet/rulebook/patching.py +143 -0
  73. annet/rulebook/ribbon/__init__.py +12 -0
  74. annet/rulebook/texts/arista.deploy +20 -0
  75. annet/rulebook/texts/arista.order +125 -0
  76. annet/rulebook/texts/arista.rul +59 -0
  77. annet/rulebook/texts/aruba.deploy +20 -0
  78. annet/rulebook/texts/aruba.order +83 -0
  79. annet/rulebook/texts/aruba.rul +87 -0
  80. annet/rulebook/texts/cisco.deploy +27 -0
  81. annet/rulebook/texts/cisco.order +82 -0
  82. annet/rulebook/texts/cisco.rul +105 -0
  83. annet/rulebook/texts/huawei.deploy +188 -0
  84. annet/rulebook/texts/huawei.order +388 -0
  85. annet/rulebook/texts/huawei.rul +471 -0
  86. annet/rulebook/texts/juniper.rul +120 -0
  87. annet/rulebook/texts/nexus.deploy +24 -0
  88. annet/rulebook/texts/nexus.order +85 -0
  89. annet/rulebook/texts/nexus.rul +83 -0
  90. annet/rulebook/texts/nokia.rul +31 -0
  91. annet/rulebook/texts/pc.order +5 -0
  92. annet/rulebook/texts/pc.rul +9 -0
  93. annet/rulebook/texts/ribbon.deploy +22 -0
  94. annet/rulebook/texts/ribbon.rul +77 -0
  95. annet/rulebook/texts/routeros.order +38 -0
  96. annet/rulebook/texts/routeros.rul +45 -0
  97. annet/storage.py +121 -0
  98. annet/tabparser.py +36 -0
  99. annet/text_term_format.py +95 -0
  100. annet/tracing.py +170 -0
  101. annet/types.py +223 -0
  102. annet-0.1.dist-info/AUTHORS +21 -0
  103. annet-0.1.dist-info/LICENSE +21 -0
  104. annet-0.1.dist-info/METADATA +24 -0
  105. annet-0.1.dist-info/RECORD +113 -0
  106. annet-0.1.dist-info/WHEEL +5 -0
  107. annet-0.1.dist-info/entry_points.txt +6 -0
  108. annet-0.1.dist-info/top_level.txt +3 -0
  109. annet_generators/__init__.py +0 -0
  110. annet_generators/example/__init__.py +12 -0
  111. annet_generators/example/lldp.py +52 -0
  112. annet_nbexport/__init__.py +220 -0
  113. annet_nbexport/main.py +46 -0
@@ -0,0 +1,83 @@
1
+ # Операторы:
2
+ # * Один аргумент в undo
3
+ # ~ Несколько аргументов (минимум один) в undo
4
+ #
5
+ # Параметры:
6
+ # %global Команда действует на любом уровне ниже
7
+ # %logic=... Кастомная функция обработки правила
8
+ # %diff_logic=... Кастомная функция построения диффа.
9
+ # данная функция работает для подблоков (в отличие от %logic)
10
+ # %comment=... Добавить коммент после строки который будет видно с опцией patch --add-comments
11
+ # Сделано в основном для того чтобы генерировать специальные команды для наливки
12
+ # -----
13
+
14
+ ip community-list standard ~
15
+
16
+ vrf context *
17
+
18
+ vlan group * vlan-list %logic=cisco.vlandb.simple
19
+ vlan */[^\d].*/
20
+ vlan %logic=cisco.vlandb.simple
21
+ name
22
+
23
+ ip ssh version 2 %logic=cisco.misc.ssh_key
24
+
25
+ # ordering of SNMP blocks
26
+ ip access-list ~
27
+ snmp-server view ~
28
+ snmp-server community ~
29
+ snmp-server host ~
30
+ # Deleting a user using either SNMP or the CLI results in the user being deleted for both SNMP and the CLI.
31
+ # User-role mapping changes are synchronized in SNMP and the CLI.
32
+ !snmp-server user admin ~
33
+ !snmp-server user *
34
+
35
+ ntp distribute %logic=cisco.misc.no_ntp_distribute
36
+
37
+ !interface */(mgmt|ipmi|Vlan1$)/
38
+
39
+ # SVI/Subifs/Lagg
40
+ interface */(Vlan|Ethernet.*\.|port-channel.*\.?)\d+$/ %diff_logic=nexus.iface.diff
41
+ vrf member
42
+ ipv6 link-local
43
+ ipv6 address *
44
+ ipv6 nd ~ %logic=cisco.misc.no_ipv6_nd_suppress_ra
45
+ mtu
46
+
47
+ # Physical
48
+ interface */\w*Ethernet[0-9\/]+$/ %logic=common.permanent %diff_logic=nexus.iface.diff
49
+ switchport mode
50
+ switchport trunk native vlan
51
+ switchport access vlan
52
+ switchport trunk allowed vlan %logic=cisco.vlandb.swtrunk
53
+ vrf member
54
+ ipv6 link-local
55
+ ipv6 address *
56
+ channel-group
57
+ mtu
58
+ storm-control * level
59
+
60
+ router bgp *
61
+ router-id
62
+ vrf *
63
+ router-id
64
+ address-family ~
65
+ maximum-paths
66
+ neighbor ~
67
+ update-source
68
+
69
+ policy-map type qos *
70
+ class * %ordered
71
+ ~ %global
72
+
73
+ # Нельзя сказать no bandwidth пока политика глобально применена
74
+ policy-map type queuing *
75
+ class type queuing *
76
+ bandwidth *
77
+
78
+ description %global
79
+
80
+ no ~ %global
81
+ ~ %global
82
+
83
+ # vim: set syntax=annrulebook:
@@ -0,0 +1,31 @@
1
+ # Операторы:
2
+ # * Один аргумент в undo
3
+ # ~ Несколько аргументов (минимум один) в undo
4
+ #
5
+ # Параметры:
6
+ # %global Команда действует на любом уровне ниже
7
+ # %logic=... Кастомная функция обработки правила
8
+ # %diff_logic=... Кастомная функция построения диффа.
9
+ # данная функция работает для подблоков (в отличие от %logic)
10
+ # %comment=... Добавить коммент после строки который будет видно с опцией patch --add-comments
11
+ # Сделано в основном для того чтобы генерировать специальные команды для наливки
12
+ # -----
13
+
14
+ system
15
+ name *
16
+ dns
17
+ ~
18
+ time
19
+ ~
20
+
21
+ policy-options
22
+ policy-statement *
23
+ ~ %ordered
24
+ ~ %global
25
+
26
+
27
+ router *
28
+ isis *
29
+ overload
30
+
31
+ ~ %global
@@ -0,0 +1,5 @@
1
+ ######################################################
2
+ ######################################################
3
+ ### THIS IS A STUB FILE PLEASE DO NOT ADD ANYTHING ###
4
+ ######################################################
5
+ ######################################################
@@ -0,0 +1,9 @@
1
+ ######################################################
2
+ ######################################################
3
+ ### THIS IS A STUB FILE PLEASE DO NOT ADD ANYTHING ###
4
+ ######################################################
5
+ ######################################################
6
+
7
+
8
+ undo ~ %global
9
+ ~ %global
@@ -0,0 +1,22 @@
1
+ # Рулбук деплоя на устройства
2
+ #
3
+ # Операторы:
4
+ # * Один аргумент
5
+ # ~ Несколько аргументов (минимум один)
6
+ #
7
+ # Параметры:
8
+ # %timeout=... Таймаут выполнения команды (в секундах, по умолчанию 30)
9
+ #
10
+ # Ответы на вопросы
11
+ #
12
+ # <команда>
13
+ # dialog: <вопрос> ::: <ответ> <параметры>
14
+ #
15
+ # Если <вопрос> заключён в слеши (//), то воспринимается как регулярка, иначе - точное совпадение.
16
+ # Параметы:
17
+ # %send_nl=... Посылать ли перевод строки после ответа (bool, по умолчанию true)
18
+ # -----
19
+
20
+
21
+ exit
22
+ dialog: Exit configure exclusive mode? [yes,no] (no) ::: yes %send_nl=1
@@ -0,0 +1,77 @@
1
+ # Операторы:
2
+ # * Один аргумент в undo
3
+ # ~ Несколько аргументов (минимум один) в undo
4
+ #
5
+ # Параметры:
6
+ # %global Команда действует на любом уровне ниже
7
+ # %logic=... Кастомная функция обработки правила
8
+ # %diff_logic=... Кастомная функция построения диффа.
9
+ # данная функция работает для подблоков (в отличие от %logic)
10
+ # %comment=... Добавить коммент после строки который будет видно с опцией patch --add-comments
11
+ # Сделано в основном для того чтобы генерировать специальные команды для наливки
12
+ # -----
13
+
14
+ system
15
+ host-name
16
+
17
+ time-zone
18
+
19
+ tacplus-server
20
+ * secret
21
+
22
+ event-log
23
+ files
24
+ size
25
+
26
+ ntp
27
+ server ~
28
+
29
+ services
30
+ ssh
31
+ root-login
32
+
33
+ management-network
34
+ network-bridge
35
+ allow-6to4-tunnel-packets
36
+
37
+ root-authentication
38
+ encrypted-password
39
+
40
+ login
41
+ user *
42
+ authentication
43
+ user-encrypted-password
44
+ class
45
+ full-name
46
+
47
+ interfaces
48
+ *
49
+ description
50
+
51
+ chassis
52
+ slot * *
53
+ port *
54
+ port-type
55
+ otuc-options
56
+ line-rate
57
+ transceiver-options
58
+ exp-transceiver-type
59
+ tx-wavelength
60
+ fiber-connectivity (internal|external) (uni-in|uni-out|bidirectional)
61
+ peer-ne
62
+ peer-slot
63
+ peer-port
64
+ fiber-length
65
+ input-fiber-loss
66
+ output-fiber-loss
67
+ ots-options
68
+ los-threshold
69
+ oa-options (booster|preamp|amp)
70
+ edfa-mode
71
+ initial-gain
72
+ exp-raman-gain
73
+ max-number-channels
74
+ output-pwr-per-channel
75
+ tilt
76
+
77
+ ~ %global
@@ -0,0 +1,38 @@
1
+ # В этом файле определяется порядок команд, в котором их следует подавать на устройство.
2
+ # - Если порядок команды не важен - ее можно не писать сюда совсем.
3
+ # - Если команда начинается с undo и прописан параметр %order_reverse - команда считается
4
+ # обратной, но занимает место между прямыми там, где указано (т.е. undo vlan batch
5
+ # будет стоять после блоков interface).
6
+
7
+ file
8
+ print
9
+ set
10
+
11
+ snmp
12
+ community
13
+ set
14
+ add
15
+
16
+ snmp
17
+ set
18
+
19
+ system
20
+ logging
21
+ action
22
+ set
23
+ add
24
+ set
25
+ add
26
+
27
+ interface
28
+ gre
29
+ add
30
+
31
+ interface
32
+ list
33
+ member
34
+ add
35
+
36
+ ip
37
+ address
38
+ add
@@ -0,0 +1,45 @@
1
+ # Операторы:
2
+ # * Один аргумент в undo
3
+ # ~ Несколько аргументов (минимум один) в undo
4
+ #
5
+ # Параметры:
6
+ # %global Команда действует на любом уровне ниже
7
+ # %logic=... Кастомная функция обработки правила
8
+ # %diff_logic=... Кастомная функция построения диффа.
9
+ # данная функция работает для подблоков (в отличие от %logic)
10
+ # %comment=... Добавить коммент после строки который будет видно с опцией patch --add-comments
11
+ # Сделано в основном для того чтобы генерировать специальные команды для наливки
12
+ # -----
13
+
14
+
15
+ user
16
+ ~
17
+ group
18
+ add ~
19
+
20
+ file
21
+ print file=*
22
+ set * %logic=routeros.file.change
23
+
24
+ system
25
+ logging
26
+ action
27
+ set ~
28
+ add ~
29
+ set ~
30
+ add ~
31
+
32
+ interface
33
+ gre
34
+ add
35
+
36
+ interface
37
+ list
38
+ member
39
+ add
40
+
41
+ ip
42
+ address
43
+ add ~
44
+
45
+ ~ %global
annet/storage.py ADDED
@@ -0,0 +1,121 @@
1
+ import abc
2
+ from typing import Any, Iterable, Optional, Type, Union
3
+
4
+
5
+ try:
6
+ from annet.connectors import Connector
7
+ except ImportError:
8
+ from noc.annushka.annet.connectors import Connector # noqa: F401
9
+
10
+
11
+ class _StorageConnector(Connector["StorageProvider"]):
12
+ name = "Storage"
13
+ ep_name = "storage"
14
+
15
+
16
+ storage_connector = _StorageConnector()
17
+
18
+
19
+ class StorageProvider(abc.ABC):
20
+ @abc.abstractmethod
21
+ def storage(self) -> Type["Storage"]:
22
+ pass
23
+
24
+ @abc.abstractmethod
25
+ def opts(self) -> Type["StorageOpts"]:
26
+ pass
27
+
28
+ @abc.abstractmethod
29
+ def query(self) -> Type["Query"]:
30
+ pass
31
+
32
+
33
+ class Storage(abc.ABC):
34
+ @abc.abstractmethod
35
+ def __enter__(self):
36
+ pass
37
+
38
+ @abc.abstractmethod
39
+ def __exit__(self, _, __, ___):
40
+ pass
41
+
42
+ @abc.abstractmethod
43
+ def resolve_object_ids_by_query(self, query: Any):
44
+ pass
45
+
46
+ @abc.abstractmethod
47
+ def resolve_fdnds_by_query(self, query: Any):
48
+ pass
49
+
50
+ @abc.abstractmethod
51
+ def make_devices(
52
+ self,
53
+ query: Any,
54
+ preload_neighbors: bool = False,
55
+ use_mesh: bool = None,
56
+ preload_extra_fields=False,
57
+ **kwargs,
58
+ ):
59
+ pass
60
+
61
+ @abc.abstractmethod
62
+ def get_device(self, obj_id, preload_neighbors=False, use_mesh=None, **kwargs) -> "Device":
63
+ pass
64
+
65
+ @abc.abstractmethod
66
+ def flush_perf(self):
67
+ pass
68
+
69
+
70
+ class StorageOpts(abc.ABC):
71
+ @classmethod
72
+ @abc.abstractmethod
73
+ def from_cli_opts(cls, cli_opts) -> "StorageOpts":
74
+ pass
75
+
76
+
77
+ class Query(abc.ABC):
78
+ @classmethod
79
+ @abc.abstractclassmethod
80
+ def new(cls, query: Union[str, Iterable[str]], hosts_range: Optional[slice] = None) -> "Query":
81
+ pass
82
+
83
+
84
+ class Device(abc.ABC):
85
+ @abc.abstractmethod
86
+ def __hash__(self):
87
+ pass
88
+
89
+ @abc.abstractmethod
90
+ def is_pc(self):
91
+ pass
92
+
93
+ @property
94
+ @abc.abstractmethod
95
+ def hw(self):
96
+ pass
97
+
98
+ @property
99
+ @abc.abstractmethod
100
+ def id(self):
101
+ pass
102
+
103
+ @property
104
+ @abc.abstractmethod
105
+ def fqdn(self):
106
+ pass
107
+
108
+ @property
109
+ @abc.abstractmethod
110
+ def hostname(self):
111
+ pass
112
+
113
+ @property
114
+ @abc.abstractmethod
115
+ def neighbours_ids(self):
116
+ pass
117
+
118
+ @property
119
+ @abc.abstractmethod
120
+ def breed(self):
121
+ pass
annet/tabparser.py ADDED
@@ -0,0 +1,36 @@
1
+ from annet.annlib.tabparser import ( # pylint: disable=unused-import
2
+ AsrFormatter,
3
+ CiscoFormatter,
4
+ CommonFormatter,
5
+ HuaweiFormatter,
6
+ JuniperFormatter,
7
+ JuniperList,
8
+ NokiaFormatter,
9
+ ParserError,
10
+ RibbonFormatter,
11
+ RosFormatter,
12
+ parse_to_tree,
13
+ )
14
+
15
+
16
+ def make_formatter(hw, **kwargs):
17
+ if hw.Huawei:
18
+ cls = HuaweiFormatter
19
+ elif hw.Cisco.ASR or hw.Cisco.XRV:
20
+ cls = AsrFormatter
21
+ elif hw.Nexus or hw.Cisco or hw.Arista or hw.Aruba:
22
+ cls = CiscoFormatter
23
+ elif hw.Juniper:
24
+ cls = JuniperFormatter
25
+ elif hw.Nokia:
26
+ cls = NokiaFormatter
27
+ elif hw.RouterOS:
28
+ cls = RosFormatter
29
+ elif hw.PC:
30
+ cls = CommonFormatter
31
+ elif hw.Ribbon:
32
+ cls = RibbonFormatter
33
+ else:
34
+ raise NotImplementedError("Unknown formatter for hw '%s'" % hw)
35
+
36
+ return cls(**kwargs)
@@ -0,0 +1,95 @@
1
+ from itertools import groupby
2
+ from operator import itemgetter
3
+ from typing import Dict, List
4
+
5
+ from pygments import lex
6
+ from pygments.formatter import Formatter
7
+ from pygments.lexer import RegexLexer
8
+ from pygments.lexers import DiffLexer, YamlLexer # pylint: disable=no-name-in-module
9
+ from pygments.token import Token
10
+
11
+ from .output import TextArgs
12
+
13
+
14
+ # =====
15
+ Warning = Token.Warning # pylint: disable=redefined-builtin
16
+ Error = Token.Error
17
+
18
+ YAML_TERMINAL_COLORS = {
19
+ Token.Literal.String: "green",
20
+ Token.Literal.Scalar.Plain: "darkblue",
21
+ Token.Punctuation.Indicator: "darkblue",
22
+ }
23
+
24
+ DIFF_TERMINAL_COLORS = {
25
+ Token.Generic.Inserted: "green",
26
+ Token.Generic.Deleted: "red",
27
+ Token.Generic.Heading: "cyan_blue",
28
+ }
29
+
30
+ SWITCH_OUTPUT_TERMINAL_COLORS = {
31
+ Warning: "yellow",
32
+ Error: "red",
33
+ }
34
+
35
+
36
+ class SwitchOutputLexer(RegexLexer):
37
+ name = "SwitchOutputLexer"
38
+ aliases = ["switch_output_lexer"]
39
+ tokens = {
40
+ "root": [
41
+ (r"[wW]arning.*\n", Warning),
42
+ (r"Info.*\n", Warning),
43
+ (r"Error.*\n", Error),
44
+ (r".*\n", Token.Text),
45
+ ]
46
+ }
47
+
48
+
49
+ class CursesFormatter(Formatter):
50
+ def __init__(self, **options):
51
+ self.colorscheme = options.pop("scheme")
52
+ Formatter.__init__(self, **options)
53
+
54
+ def format(self, tokensource, outfile="") -> Dict[int, List[TextArgs]]:
55
+ res = {}
56
+ tokensource = list(tokensource)
57
+ tmp_res = {}
58
+ line_no = 0
59
+ for ttype, values in groupby(tokensource, itemgetter(0)):
60
+ color = self.colorscheme.get(ttype)
61
+ for value in values:
62
+ if line_no not in tmp_res:
63
+ tmp_res[line_no] = []
64
+ if value[1].endswith("\n"):
65
+ if len(value[1]) > 1:
66
+ tmp_res[line_no].append([color, value[1].rstrip()])
67
+ line_no += 1
68
+ else:
69
+ tmp_res[line_no].append([color, value[1]])
70
+
71
+ for line_no, color_values in tmp_res.items():
72
+ res[line_no] = []
73
+ for color, values in groupby(color_values, itemgetter(0)):
74
+ str_values = "".join([v[1] for v in values])
75
+ res[line_no].append(TextArgs(str_values, color))
76
+ return res
77
+
78
+
79
+ def format_yaml(txt):
80
+ return CursesFormatter(scheme=YAML_TERMINAL_COLORS).format(lex(txt, YamlLexer()))
81
+
82
+
83
+ def format_diff(txt):
84
+ return CursesFormatter(scheme=DIFF_TERMINAL_COLORS).format(lex(txt, DiffLexer()))
85
+
86
+
87
+ LEXERS = {
88
+ "diff": (DiffLexer, DIFF_TERMINAL_COLORS),
89
+ "yaml": (YamlLexer, YAML_TERMINAL_COLORS),
90
+ "switch_out": (SwitchOutputLexer, SWITCH_OUTPUT_TERMINAL_COLORS),
91
+ }
92
+
93
+
94
+ def curses_format(txt, lexer) -> Dict[int, List[TextArgs]]:
95
+ return CursesFormatter(scheme=LEXERS[lexer][1]).format(lex(txt, LEXERS[lexer][0]()))