annet 0.0__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.
- annet/__init__.py +61 -0
- annet/adapters/__init__.py +0 -0
- annet/adapters/netbox/__init__.py +0 -0
- annet/adapters/netbox/common/__init__.py +0 -0
- annet/adapters/netbox/common/client.py +87 -0
- annet/adapters/netbox/common/manufacturer.py +62 -0
- annet/adapters/netbox/common/models.py +105 -0
- annet/adapters/netbox/common/query.py +23 -0
- annet/adapters/netbox/common/status_client.py +25 -0
- annet/adapters/netbox/common/storage_opts.py +14 -0
- annet/adapters/netbox/provider.py +34 -0
- annet/adapters/netbox/v24/__init__.py +0 -0
- annet/adapters/netbox/v24/api_models.py +73 -0
- annet/adapters/netbox/v24/client.py +59 -0
- annet/adapters/netbox/v24/storage.py +196 -0
- annet/adapters/netbox/v37/__init__.py +0 -0
- annet/adapters/netbox/v37/api_models.py +38 -0
- annet/adapters/netbox/v37/client.py +62 -0
- annet/adapters/netbox/v37/storage.py +149 -0
- annet/annet.py +25 -0
- annet/annlib/__init__.py +7 -0
- annet/annlib/command.py +49 -0
- annet/annlib/diff.py +158 -0
- annet/annlib/errors.py +8 -0
- annet/annlib/filter_acl.py +196 -0
- annet/annlib/jsontools.py +116 -0
- annet/annlib/lib.py +495 -0
- annet/annlib/netdev/__init__.py +0 -0
- annet/annlib/netdev/db.py +62 -0
- annet/annlib/netdev/devdb/__init__.py +28 -0
- annet/annlib/netdev/devdb/data/devdb.json +137 -0
- annet/annlib/netdev/views/__init__.py +0 -0
- annet/annlib/netdev/views/dump.py +121 -0
- annet/annlib/netdev/views/hardware.py +112 -0
- annet/annlib/output.py +246 -0
- annet/annlib/patching.py +533 -0
- annet/annlib/rbparser/__init__.py +0 -0
- annet/annlib/rbparser/acl.py +120 -0
- annet/annlib/rbparser/deploying.py +55 -0
- annet/annlib/rbparser/ordering.py +52 -0
- annet/annlib/rbparser/platform.py +51 -0
- annet/annlib/rbparser/syntax.py +115 -0
- annet/annlib/rulebook/__init__.py +0 -0
- annet/annlib/rulebook/common.py +350 -0
- annet/annlib/tabparser.py +648 -0
- annet/annlib/types.py +35 -0
- annet/api/__init__.py +826 -0
- annet/argparse.py +415 -0
- annet/cli.py +237 -0
- annet/cli_args.py +503 -0
- annet/configs/context.yml +18 -0
- annet/configs/logging.yaml +39 -0
- annet/connectors.py +77 -0
- annet/deploy.py +536 -0
- annet/diff.py +84 -0
- annet/executor.py +551 -0
- annet/filtering.py +40 -0
- annet/gen.py +865 -0
- annet/generators/__init__.py +435 -0
- annet/generators/base.py +136 -0
- annet/generators/common/__init__.py +0 -0
- annet/generators/common/initial.py +33 -0
- annet/generators/entire.py +97 -0
- annet/generators/exceptions.py +10 -0
- annet/generators/jsonfragment.py +125 -0
- annet/generators/partial.py +119 -0
- annet/generators/perf.py +79 -0
- annet/generators/ref.py +15 -0
- annet/generators/result.py +127 -0
- annet/hardware.py +45 -0
- annet/implicit.py +139 -0
- annet/lib.py +128 -0
- annet/output.py +167 -0
- annet/parallel.py +448 -0
- annet/patching.py +25 -0
- annet/reference.py +148 -0
- annet/rulebook/__init__.py +114 -0
- annet/rulebook/arista/__init__.py +0 -0
- annet/rulebook/arista/iface.py +16 -0
- annet/rulebook/aruba/__init__.py +16 -0
- annet/rulebook/aruba/ap_env.py +146 -0
- annet/rulebook/aruba/misc.py +8 -0
- annet/rulebook/cisco/__init__.py +0 -0
- annet/rulebook/cisco/iface.py +68 -0
- annet/rulebook/cisco/misc.py +57 -0
- annet/rulebook/cisco/vlandb.py +90 -0
- annet/rulebook/common.py +19 -0
- annet/rulebook/deploying.py +87 -0
- annet/rulebook/huawei/__init__.py +0 -0
- annet/rulebook/huawei/aaa.py +75 -0
- annet/rulebook/huawei/bgp.py +97 -0
- annet/rulebook/huawei/iface.py +33 -0
- annet/rulebook/huawei/misc.py +337 -0
- annet/rulebook/huawei/vlandb.py +115 -0
- annet/rulebook/juniper/__init__.py +107 -0
- annet/rulebook/nexus/__init__.py +0 -0
- annet/rulebook/nexus/iface.py +92 -0
- annet/rulebook/patching.py +143 -0
- annet/rulebook/ribbon/__init__.py +12 -0
- annet/rulebook/texts/arista.deploy +20 -0
- annet/rulebook/texts/arista.order +125 -0
- annet/rulebook/texts/arista.rul +59 -0
- annet/rulebook/texts/aruba.deploy +20 -0
- annet/rulebook/texts/aruba.order +83 -0
- annet/rulebook/texts/aruba.rul +87 -0
- annet/rulebook/texts/cisco.deploy +27 -0
- annet/rulebook/texts/cisco.order +82 -0
- annet/rulebook/texts/cisco.rul +105 -0
- annet/rulebook/texts/huawei.deploy +188 -0
- annet/rulebook/texts/huawei.order +388 -0
- annet/rulebook/texts/huawei.rul +471 -0
- annet/rulebook/texts/juniper.rul +120 -0
- annet/rulebook/texts/nexus.deploy +24 -0
- annet/rulebook/texts/nexus.order +85 -0
- annet/rulebook/texts/nexus.rul +83 -0
- annet/rulebook/texts/nokia.rul +31 -0
- annet/rulebook/texts/pc.order +5 -0
- annet/rulebook/texts/pc.rul +9 -0
- annet/rulebook/texts/ribbon.deploy +22 -0
- annet/rulebook/texts/ribbon.rul +77 -0
- annet/rulebook/texts/routeros.order +38 -0
- annet/rulebook/texts/routeros.rul +45 -0
- annet/storage.py +125 -0
- annet/tabparser.py +36 -0
- annet/text_term_format.py +95 -0
- annet/tracing.py +170 -0
- annet/types.py +227 -0
- annet-0.0.dist-info/AUTHORS +21 -0
- annet-0.0.dist-info/LICENSE +21 -0
- annet-0.0.dist-info/METADATA +26 -0
- annet-0.0.dist-info/RECORD +137 -0
- annet-0.0.dist-info/WHEEL +5 -0
- annet-0.0.dist-info/entry_points.txt +5 -0
- annet-0.0.dist-info/top_level.txt +2 -0
- annet_generators/__init__.py +0 -0
- annet_generators/example/__init__.py +12 -0
- annet_generators/example/lldp.py +53 -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,125 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
from typing import Any, Iterable, Optional, Type, Union, Protocol
|
|
3
|
+
|
|
4
|
+
try:
|
|
5
|
+
from annet.connectors import Connector
|
|
6
|
+
except ImportError:
|
|
7
|
+
from noc.annushka.annet.connectors import Connector # noqa: F401
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class _StorageConnector(Connector["StorageProvider"]):
|
|
11
|
+
name = "Storage"
|
|
12
|
+
ep_name = "storage"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
storage_connector = _StorageConnector()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class StorageProvider(abc.ABC):
|
|
19
|
+
@abc.abstractmethod
|
|
20
|
+
def storage(self) -> Type["Storage"]:
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
@abc.abstractmethod
|
|
24
|
+
def opts(self) -> Type["StorageOpts"]:
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
@abc.abstractmethod
|
|
28
|
+
def query(self) -> Type["Query"]:
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class Storage(abc.ABC):
|
|
33
|
+
@abc.abstractmethod
|
|
34
|
+
def __enter__(self):
|
|
35
|
+
pass
|
|
36
|
+
|
|
37
|
+
@abc.abstractmethod
|
|
38
|
+
def __exit__(self, _, __, ___):
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
@abc.abstractmethod
|
|
42
|
+
def resolve_object_ids_by_query(self, query: Any):
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
@abc.abstractmethod
|
|
46
|
+
def resolve_fdnds_by_query(self, query: Any):
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
@abc.abstractmethod
|
|
50
|
+
def make_devices(
|
|
51
|
+
self,
|
|
52
|
+
query: Any,
|
|
53
|
+
preload_neighbors: bool = False,
|
|
54
|
+
use_mesh: bool = None,
|
|
55
|
+
preload_extra_fields=False,
|
|
56
|
+
**kwargs,
|
|
57
|
+
):
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
@abc.abstractmethod
|
|
61
|
+
def get_device(self, obj_id, preload_neighbors=False, use_mesh=None, **kwargs) -> "Device":
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
@abc.abstractmethod
|
|
65
|
+
def flush_perf(self):
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class StorageOpts(abc.ABC):
|
|
70
|
+
@classmethod
|
|
71
|
+
@abc.abstractmethod
|
|
72
|
+
def from_cli_opts(cls, cli_opts) -> "StorageOpts":
|
|
73
|
+
pass
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class Query(abc.ABC):
|
|
77
|
+
@classmethod
|
|
78
|
+
@abc.abstractclassmethod
|
|
79
|
+
def new(cls, query: Union[str, Iterable[str]], hosts_range: Optional[slice] = None) -> "Query":
|
|
80
|
+
pass
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class Device(Protocol):
|
|
84
|
+
@property
|
|
85
|
+
@abc.abstractmethod
|
|
86
|
+
def storage(self) -> Storage:
|
|
87
|
+
pass
|
|
88
|
+
|
|
89
|
+
@abc.abstractmethod
|
|
90
|
+
def __hash__(self):
|
|
91
|
+
pass
|
|
92
|
+
|
|
93
|
+
@abc.abstractmethod
|
|
94
|
+
def is_pc(self):
|
|
95
|
+
pass
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
@abc.abstractmethod
|
|
99
|
+
def hw(self):
|
|
100
|
+
pass
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
@abc.abstractmethod
|
|
104
|
+
def id(self):
|
|
105
|
+
pass
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
@abc.abstractmethod
|
|
109
|
+
def fqdn(self):
|
|
110
|
+
pass
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
@abc.abstractmethod
|
|
114
|
+
def hostname(self):
|
|
115
|
+
pass
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
@abc.abstractmethod
|
|
119
|
+
def neighbours_ids(self):
|
|
120
|
+
pass
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
@abc.abstractmethod
|
|
124
|
+
def breed(self):
|
|
125
|
+
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]()))
|