annet 1.1.2__py3-none-any.whl → 2.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.
- annet/adapters/netbox/provider.py +2 -1
- annet/annet.py +2 -1
- annet/annlib/filter_acl.py +6 -2
- annet/api/__init__.py +34 -28
- annet/diff.py +71 -2
- annet/gen.py +0 -46
- annet/output.py +9 -2
- annet/rpl/__init__.py +2 -1
- annet/rpl/match_builder.py +10 -6
- annet/rpl/statement_builder.py +17 -2
- annet/rpl_generators/__init__.py +3 -1
- annet/rpl_generators/cumulus_frr.py +65 -53
- annet/rpl_generators/entities.py +80 -26
- annet/rpl_generators/policy.py +159 -55
- annet/rpl_generators/prefix_lists.py +36 -81
- {annet-1.1.2.dist-info → annet-2.0.1.dist-info}/METADATA +1 -1
- {annet-1.1.2.dist-info → annet-2.0.1.dist-info}/RECORD +23 -23
- {annet-1.1.2.dist-info → annet-2.0.1.dist-info}/WHEEL +1 -1
- annet_generators/rpl_example/items.py +3 -3
- {annet-1.1.2.dist-info → annet-2.0.1.dist-info}/AUTHORS +0 -0
- {annet-1.1.2.dist-info → annet-2.0.1.dist-info}/LICENSE +0 -0
- {annet-1.1.2.dist-info → annet-2.0.1.dist-info}/entry_points.txt +0 -0
- {annet-1.1.2.dist-info → annet-2.0.1.dist-info}/top_level.txt +0 -0
|
@@ -8,26 +8,6 @@ from annet.rpl import PrefixMatchValue, MatchField, SingleCondition, RoutingPoli
|
|
|
8
8
|
from .entities import IpPrefixList, PrefixListNameGenerator
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
def get_used_prefix_lists(
|
|
12
|
-
prefix_lists: Sequence[IpPrefixList], name_generator: PrefixListNameGenerator,
|
|
13
|
-
) -> list[IpPrefixList]:
|
|
14
|
-
return [c for c in prefix_lists if name_generator.is_used(c.name)]
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def new_prefix_list_name_generator(policies: list[RoutingPolicy]) -> PrefixListNameGenerator:
|
|
18
|
-
name_gen = PrefixListNameGenerator()
|
|
19
|
-
for policy in policies:
|
|
20
|
-
for statement in policy.statements:
|
|
21
|
-
condition: SingleCondition[PrefixMatchValue]
|
|
22
|
-
for condition in statement.match.find_all(MatchField.ipv6_prefix):
|
|
23
|
-
for name in condition.value.names:
|
|
24
|
-
name_gen.add_prefix(name, condition.value.greater_equal, condition.value.less_equal)
|
|
25
|
-
for condition in statement.match.find_all(MatchField.ip_prefix):
|
|
26
|
-
for name in condition.value.names:
|
|
27
|
-
name_gen.add_prefix(name, condition.value.greater_equal, condition.value.less_equal)
|
|
28
|
-
return name_gen
|
|
29
|
-
|
|
30
|
-
|
|
31
11
|
class PrefixListFilterGenerator(PartialGenerator, ABC):
|
|
32
12
|
TAGS = ["policy", "rpl", "routing"]
|
|
33
13
|
|
|
@@ -39,12 +19,6 @@ class PrefixListFilterGenerator(PartialGenerator, ABC):
|
|
|
39
19
|
def get_prefix_lists(self, device: Any) -> Sequence[IpPrefixList]:
|
|
40
20
|
raise NotImplementedError()
|
|
41
21
|
|
|
42
|
-
def get_used_prefix_lists(self, device: Any, name_generator: PrefixListNameGenerator) -> Sequence[IpPrefixList]:
|
|
43
|
-
return get_used_prefix_lists(
|
|
44
|
-
prefix_lists=self.get_prefix_lists(device),
|
|
45
|
-
name_generator=name_generator,
|
|
46
|
-
)
|
|
47
|
-
|
|
48
22
|
# huawei
|
|
49
23
|
def acl_huawei(self, _):
|
|
50
24
|
return r"""
|
|
@@ -54,57 +28,48 @@ class PrefixListFilterGenerator(PartialGenerator, ABC):
|
|
|
54
28
|
|
|
55
29
|
def _huawei_prefix_list(
|
|
56
30
|
self,
|
|
57
|
-
name: str,
|
|
58
31
|
prefix_type: Literal["ipv6-prefix", "ip-prefix"],
|
|
59
|
-
match: PrefixMatchValue,
|
|
60
32
|
plist: IpPrefixList,
|
|
61
33
|
) -> Iterable[Sequence[str]]:
|
|
62
|
-
for i,
|
|
63
|
-
|
|
34
|
+
for i, m in enumerate(plist.members):
|
|
35
|
+
ge, le = m.or_longer
|
|
64
36
|
yield (
|
|
65
37
|
"ip",
|
|
66
38
|
prefix_type,
|
|
67
|
-
name,
|
|
39
|
+
plist.name,
|
|
68
40
|
f"index {i * 5 + 5}",
|
|
69
41
|
"permit",
|
|
70
|
-
str(
|
|
71
|
-
str(
|
|
42
|
+
str(m.prefix.network_address).upper(),
|
|
43
|
+
str(m.prefix.prefixlen),
|
|
72
44
|
) + (
|
|
73
|
-
("greater-equal", str(
|
|
45
|
+
("greater-equal", str(ge)) if ge is not None else ()
|
|
74
46
|
) + (
|
|
75
|
-
("less-equal", str(
|
|
47
|
+
("less-equal", str(le)) if le is not None else ()
|
|
76
48
|
)
|
|
77
49
|
|
|
78
50
|
def run_huawei(self, device: Any):
|
|
51
|
+
prefix_lists = self.get_prefix_lists(device)
|
|
79
52
|
policies = self.get_policies(device)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
53
|
+
|
|
54
|
+
name_generator = PrefixListNameGenerator(prefix_lists, policies)
|
|
55
|
+
processed_names = set()
|
|
83
56
|
for policy in policies:
|
|
84
57
|
for statement in policy.statements:
|
|
85
58
|
cond: SingleCondition[PrefixMatchValue]
|
|
86
59
|
for cond in statement.match.find_all(MatchField.ip_prefix):
|
|
87
60
|
for name in cond.value.names:
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
greater_equal=cond.value.greater_equal,
|
|
91
|
-
less_equal=cond.value.less_equal,
|
|
92
|
-
)
|
|
93
|
-
if mangled_name in precessed_names:
|
|
61
|
+
plist = name_generator.get_prefix(name, cond.value)
|
|
62
|
+
if plist.name in processed_names:
|
|
94
63
|
continue
|
|
95
|
-
yield from self._huawei_prefix_list(
|
|
96
|
-
|
|
64
|
+
yield from self._huawei_prefix_list("ip-prefix", plist)
|
|
65
|
+
processed_names.add(plist.name)
|
|
97
66
|
for cond in statement.match.find_all(MatchField.ipv6_prefix):
|
|
98
67
|
for name in cond.value.names:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
greater_equal=cond.value.greater_equal,
|
|
102
|
-
less_equal=cond.value.less_equal,
|
|
103
|
-
)
|
|
104
|
-
if mangled_name in precessed_names:
|
|
68
|
+
plist = name_generator.get_prefix(name, cond.value)
|
|
69
|
+
if plist.name in processed_names:
|
|
105
70
|
continue
|
|
106
|
-
yield from self._huawei_prefix_list(
|
|
107
|
-
|
|
71
|
+
yield from self._huawei_prefix_list("ipv6-prefix", plist)
|
|
72
|
+
processed_names.add(plist.name)
|
|
108
73
|
|
|
109
74
|
# arista
|
|
110
75
|
def acl_arista(self, _):
|
|
@@ -117,51 +82,41 @@ class PrefixListFilterGenerator(PartialGenerator, ABC):
|
|
|
117
82
|
|
|
118
83
|
def _arista_prefix_list(
|
|
119
84
|
self,
|
|
120
|
-
name: str,
|
|
121
85
|
prefix_type: Literal["ipv6", "ip"],
|
|
122
|
-
match: PrefixMatchValue,
|
|
123
86
|
plist: IpPrefixList,
|
|
124
87
|
) -> Iterable[Sequence[str]]:
|
|
125
|
-
with self.block(prefix_type, "prefix-list", name):
|
|
126
|
-
for i,
|
|
127
|
-
|
|
88
|
+
with self.block(prefix_type, "prefix-list", plist.name):
|
|
89
|
+
for i, m in enumerate(plist.members):
|
|
90
|
+
ge, le = m.or_longer
|
|
128
91
|
yield (
|
|
129
92
|
f"seq {i * 10 + 10}",
|
|
130
93
|
"permit",
|
|
131
|
-
|
|
94
|
+
str(m.prefix),
|
|
132
95
|
) + (
|
|
133
|
-
("ge", str(
|
|
96
|
+
("ge", str(ge)) if ge is not None else ()
|
|
134
97
|
) + (
|
|
135
|
-
("le", str(
|
|
98
|
+
("le", str(le)) if le is not None else ()
|
|
136
99
|
)
|
|
137
100
|
|
|
138
101
|
def run_arista(self, device: Any):
|
|
102
|
+
prefix_lists = self.get_prefix_lists(device)
|
|
139
103
|
policies = self.get_policies(device)
|
|
140
|
-
name_generator =
|
|
141
|
-
|
|
142
|
-
precessed_names = set()
|
|
104
|
+
name_generator = PrefixListNameGenerator(prefix_lists, policies)
|
|
105
|
+
processed_names = set()
|
|
143
106
|
for policy in policies:
|
|
144
107
|
for statement in policy.statements:
|
|
145
108
|
cond: SingleCondition[PrefixMatchValue]
|
|
146
109
|
for cond in statement.match.find_all(MatchField.ip_prefix):
|
|
147
110
|
for name in cond.value.names:
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
greater_equal=cond.value.greater_equal,
|
|
151
|
-
less_equal=cond.value.less_equal,
|
|
152
|
-
)
|
|
153
|
-
if mangled_name in precessed_names:
|
|
111
|
+
plist = name_generator.get_prefix(name, cond.value)
|
|
112
|
+
if plist.name in processed_names:
|
|
154
113
|
continue
|
|
155
|
-
yield from self._arista_prefix_list(
|
|
156
|
-
|
|
114
|
+
yield from self._arista_prefix_list("ip", plist)
|
|
115
|
+
processed_names.add(plist.name)
|
|
157
116
|
for cond in statement.match.find_all(MatchField.ipv6_prefix):
|
|
158
117
|
for name in cond.value.names:
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
greater_equal=cond.value.greater_equal,
|
|
162
|
-
less_equal=cond.value.less_equal,
|
|
163
|
-
)
|
|
164
|
-
if mangled_name in precessed_names:
|
|
118
|
+
plist = name_generator.get_prefix(name, cond.value)
|
|
119
|
+
if plist.name in processed_names:
|
|
165
120
|
continue
|
|
166
|
-
yield from self._arista_prefix_list(
|
|
167
|
-
|
|
121
|
+
yield from self._arista_prefix_list("ipv6", plist)
|
|
122
|
+
processed_names.add(plist.name)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
annet/__init__.py,sha256=0OKkFkqog8As7B6ApdpKQkrEAcEELUREWp82D8WvGA8,1846
|
|
2
|
-
annet/annet.py,sha256=
|
|
2
|
+
annet/annet.py,sha256=8Hc-n0S6d-YhcMpMiMET_SsYKfHFJeCA_E2gKgzK-2Y,790
|
|
3
3
|
annet/argparse.py,sha256=v1MfhjR0B8qahza0WinmXClpR8UiDFhmwDDWtNroJPA,12855
|
|
4
4
|
annet/bgp_models.py,sha256=oibTSdipNkGL4t8Xn94bhyKHMOtwbPBqmYaAy4FmTxQ,12361
|
|
5
5
|
annet/cli.py,sha256=hDpjIr3w47lgQ_CvCQS1SXFDK-SJrf5slbT__5u6GIA,12342
|
|
@@ -7,14 +7,14 @@ annet/cli_args.py,sha256=KQlihxSl-Phhq1-9oJDdNSbIllEX55LlPfH6viEKOuw,13483
|
|
|
7
7
|
annet/connectors.py,sha256=aoiDVLPizx8CW2p8SAwGCzyO_WW8H9xc2aujbGC4bDg,4882
|
|
8
8
|
annet/deploy.py,sha256=3O96k17FbVt8KCvxF4gujXAB81U2-XRJyHLpbc9ekSQ,7529
|
|
9
9
|
annet/deploy_ui.py,sha256=SDTJ-CF6puW0KHQ0g_NDp61Tqh6xkTBMxv8PrBhGyNI,27977
|
|
10
|
-
annet/diff.py,sha256=
|
|
10
|
+
annet/diff.py,sha256=SOhl706lpXdbrAwElgZqIzsTZEJRyDxOQ51fi910H0M,6088
|
|
11
11
|
annet/executor.py,sha256=lcKI-EbYqeCiBNpL729kSltduzxbAzOkQ1L_QK7tNv8,5112
|
|
12
12
|
annet/filtering.py,sha256=ZtqxPsKdV9reZoRxtQyBg22BqyMqd-2SotYcxZ-68AQ,903
|
|
13
|
-
annet/gen.py,sha256=
|
|
13
|
+
annet/gen.py,sha256=m76bL6rVbusNV_uVHrHnA3D7TUvvLtckXx7hlr5HGA0,31897
|
|
14
14
|
annet/hardware.py,sha256=_iR28dWiPtt6ZYdk-qg1sxazkSRJE3ukqKB-fFFfQak,1141
|
|
15
15
|
annet/implicit.py,sha256=G6EwZbrtUp089qRAwh96hminp236-1pJbeKAedoEafg,6056
|
|
16
16
|
annet/lib.py,sha256=4N4X6jCCrig5rk7Ua4AofrV9zK9jhzkBq57fLsfBJjw,4812
|
|
17
|
-
annet/output.py,sha256=
|
|
17
|
+
annet/output.py,sha256=se8EpyNS9f9kPOlOaAV0ht4DjzDoBr8F2UafiezLPYw,7743
|
|
18
18
|
annet/parallel.py,sha256=hLkzEht0KhzmzUWDdO4QFYQHzhxs3wPlTA8DxbB2ziw,17160
|
|
19
19
|
annet/patching.py,sha256=nILbY5oJajN0b1j3f0HEJm05H3HVThnWvB7vDVh7UQw,559
|
|
20
20
|
annet/reference.py,sha256=B8mH8VUMcecPnzULiTVb_kTQ7jQrCL7zp4pfIZQa5fk,4035
|
|
@@ -30,7 +30,7 @@ annet/adapters/fetchers/stub/fetcher.py,sha256=FzpkIzPJBQVuNNSdXKoGzkALmIGMgo2gm
|
|
|
30
30
|
annet/adapters/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
31
|
annet/adapters/file/provider.py,sha256=KyHuA5w9E4T3Lxeko8b5M7jRmu7yhTJVLqLkas4ue1A,6654
|
|
32
32
|
annet/adapters/netbox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
33
|
-
annet/adapters/netbox/provider.py,sha256=
|
|
33
|
+
annet/adapters/netbox/provider.py,sha256=Y1WahJLNMIi_an3dY_m8h480CjyRTzKP5rqqDjFW_nc,1692
|
|
34
34
|
annet/adapters/netbox/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
35
|
annet/adapters/netbox/common/client.py,sha256=PaxHG4W9H8_uunIwMBNYkLq4eQJYoO6p6gY-ciQs7Nc,2563
|
|
36
36
|
annet/adapters/netbox/common/manufacturer.py,sha256=Y9kqU13q6fwYu0_HiotUKAy7OHFZngkC2s3s4IDAbDg,1745
|
|
@@ -46,7 +46,7 @@ annet/annlib/__init__.py,sha256=fT1l4xV5fqqg8HPw9HqmZVN2qwS8i6X1aIm2zGDjxKY,252
|
|
|
46
46
|
annet/annlib/command.py,sha256=uuBddMQphtn8P5MO5kzIa8_QrtMns-k05VeKv1bcAuA,1043
|
|
47
47
|
annet/annlib/diff.py,sha256=MZ6eQAU3cadQp8KaSE6uAYFtcfMDCIe_eNuVROnYkCk,4496
|
|
48
48
|
annet/annlib/errors.py,sha256=jBcSFzY6Vj-FxR__vqjFm-87AwYQ0xHuAopTirii5AU,287
|
|
49
|
-
annet/annlib/filter_acl.py,sha256=
|
|
49
|
+
annet/annlib/filter_acl.py,sha256=mxDga-3SXqpPEsdQypTq0ScqUqP625lxX-DmJalEc3s,7170
|
|
50
50
|
annet/annlib/jsontools.py,sha256=BS7s4rI8R9c_y3zz0zYl1l6con65oQ0MvfsC1dsXZts,5535
|
|
51
51
|
annet/annlib/lib.py,sha256=lxmYrbeablFMhFtvFmADVpVShSFi9TN4gNWaBs_Ygm0,14952
|
|
52
52
|
annet/annlib/output.py,sha256=_SjJ6G6bejvnTKqNHw6xeio0FT9oO3OIkLaOC3cEga4,7569
|
|
@@ -68,7 +68,7 @@ annet/annlib/rbparser/platform.py,sha256=65-r9mboRA3gaz9DRkSwPCdCRQneItqxppdMB6z
|
|
|
68
68
|
annet/annlib/rbparser/syntax.py,sha256=iZ7Y-4QQBw4L3UtjEh54qisiRDhobl7HZxFNdP8mi54,3577
|
|
69
69
|
annet/annlib/rulebook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
70
70
|
annet/annlib/rulebook/common.py,sha256=hqwmmNofm5q2f-hV2usMY-IPMeiANLth28tZcRBYJTw,16640
|
|
71
|
-
annet/api/__init__.py,sha256=
|
|
71
|
+
annet/api/__init__.py,sha256=YHhYDXAJVUijhjFaha_WxwpOMuc39zuy2e3PWt0yMCE,35106
|
|
72
72
|
annet/configs/context.yml,sha256=RVLrKLIHpCty7AGwOnmqf7Uu0iZQCn-AjYhophDJer8,259
|
|
73
73
|
annet/configs/logging.yaml,sha256=EUagfir99QqA73Scc3k7sfQccbU3E1SvEQdyhLFtCl4,997
|
|
74
74
|
annet/generators/__init__.py,sha256=rVHHDTPKHPZsml1eNEAj3o-8RweFTN8J7LX3tKMXdIY,16402
|
|
@@ -91,22 +91,22 @@ annet/mesh/models_converter.py,sha256=itfrxDd5zdTQpFNmo-YXIFQDpYyBuQ6g7xpcjxvK6u
|
|
|
91
91
|
annet/mesh/peer_models.py,sha256=Div4o1t6Z0TWvy-8WKg4-n9WOd2PKCmIpfbkILDlDtk,2791
|
|
92
92
|
annet/mesh/port_processor.py,sha256=RHiMS5W8qoDkTKiarQ748bcr8bNx4g_R4Y4vZg2k4TU,478
|
|
93
93
|
annet/mesh/registry.py,sha256=xmWF7yxWXmwqX2_jyMAKrbGd2G9sjb4rYDx4Xk61QKc,9607
|
|
94
|
-
annet/rpl/__init__.py,sha256=
|
|
94
|
+
annet/rpl/__init__.py,sha256=8nSiFpXH4OhzRGKr-013nHwwKk5Y50uh2gL7d_IoV8U,757
|
|
95
95
|
annet/rpl/action.py,sha256=PY6W66j908RuqQ1_ioxayqVN-70rxDk5Z59EGHtxI98,1246
|
|
96
96
|
annet/rpl/condition.py,sha256=MJri4MbWtPkLHIsLMAtsIEF7e8IAS9dIImjmJs5vS5U,3418
|
|
97
|
-
annet/rpl/match_builder.py,sha256=
|
|
97
|
+
annet/rpl/match_builder.py,sha256=8hvkNWF29yIAt8cpS7P797ePm3ikZBZwrVQj7QcCsP8,4749
|
|
98
98
|
annet/rpl/policy.py,sha256=P1Kt-8fHFxEczeP-RwkK_wrGN0p7IR-hOApEd2vC55E,448
|
|
99
99
|
annet/rpl/result.py,sha256=PHFn1zhDeqLBn07nkYw5vsoXew4nTwkklOwqvFWzBLg,141
|
|
100
100
|
annet/rpl/routemap.py,sha256=SIyk73OzPp2oH_XwrDv2xczuY2Zt1VsJmB0TT5r7F5g,2593
|
|
101
|
-
annet/rpl/statement_builder.py,sha256=
|
|
102
|
-
annet/rpl_generators/__init__.py,sha256=
|
|
101
|
+
annet/rpl/statement_builder.py,sha256=qKhLS34lygbhtbEIY-6jzs0Aisc6qmNc_iyk9iKPyHE,10076
|
|
102
|
+
annet/rpl_generators/__init__.py,sha256=V4rAZlBaOUSjeQ5eCNmWeD7BSJLIwy0lKU_01grebpc,832
|
|
103
103
|
annet/rpl_generators/aspath.py,sha256=kZakwPLfGGiXu9fC6I1z-pvy7Fe-4dy93_-lYcx39_4,2038
|
|
104
104
|
annet/rpl_generators/community.py,sha256=SWpaOvoQUNISuRm41-IvGPFmntvgFv9ee4zegsMyeo0,11496
|
|
105
|
-
annet/rpl_generators/cumulus_frr.py,sha256=
|
|
106
|
-
annet/rpl_generators/entities.py,sha256=
|
|
105
|
+
annet/rpl_generators/cumulus_frr.py,sha256=hCUK3o3ndgKhpL92cE0CWpL--0OJYtDad6b7YfCAUyQ,21530
|
|
106
|
+
annet/rpl_generators/entities.py,sha256=uO78iG2zHAGra5DqzpfnBgoc6slHEc6wDLvlnoySvJc,3750
|
|
107
107
|
annet/rpl_generators/execute.py,sha256=wS6e6fwcPWywsHB0gBMqZ17eF0s4YOBgDgwPB_cr5Rw,431
|
|
108
|
-
annet/rpl_generators/policy.py,sha256=
|
|
109
|
-
annet/rpl_generators/prefix_lists.py,sha256=
|
|
108
|
+
annet/rpl_generators/policy.py,sha256=j_2EtAsaxldhZZT4kRXKZacuAsGnHr3JSc2BMxr_Pow,37174
|
|
109
|
+
annet/rpl_generators/prefix_lists.py,sha256=5jM5Xj0dtx5xF9ap-TgExs0ofRAzm0LN2j3aL5Ub_yc,4778
|
|
110
110
|
annet/rpl_generators/rd.py,sha256=YGXgx1D2D0-pixgspXJzA6NvW8lx3AmHMxIY2l5rraI,1457
|
|
111
111
|
annet/rulebook/__init__.py,sha256=oafL5HC8QHdkO9CH2q_fxohPMxOgjn-dNQa5kPjuqsA,3942
|
|
112
112
|
annet/rulebook/common.py,sha256=zK1s2c5lc5HQbIlMUQ4HARQudXSgOYiZ_Sxc2I_tHqg,721
|
|
@@ -175,13 +175,13 @@ annet_generators/mesh_example/bgp.py,sha256=jzyDndSSGYyYBquDnLlR-7P5lzmUKcSyYCml
|
|
|
175
175
|
annet_generators/mesh_example/mesh_logic.py,sha256=DJS5JMCTs0rs0LN__0LulNgo2ekUcWiOMe02BlOeFas,1454
|
|
176
176
|
annet_generators/rpl_example/__init__.py,sha256=A7DTn-SVSlUpeO7mKT_obqimp29p9zWfVRPBSxmENQY,209
|
|
177
177
|
annet_generators/rpl_example/generator.py,sha256=zndIGfV4ZlTxPgAGYs7bMQvTc_tYScODqJz3fuyermY,3871
|
|
178
|
-
annet_generators/rpl_example/items.py,sha256=
|
|
178
|
+
annet_generators/rpl_example/items.py,sha256=d99HSXDHFjZq511EvGhIqRTWK3F4ZsCWfdUqFYQcyhE,772
|
|
179
179
|
annet_generators/rpl_example/mesh.py,sha256=z_WgfDZZ4xnyh3cSf75igyH09hGvtexEVwy1gCD_DzA,288
|
|
180
180
|
annet_generators/rpl_example/route_policy.py,sha256=z6nPb0VDeQtKD1NIg9sFvmUxBD5tVs2frfNIuKdM-5c,2318
|
|
181
|
-
annet-
|
|
182
|
-
annet-
|
|
183
|
-
annet-
|
|
184
|
-
annet-
|
|
185
|
-
annet-
|
|
186
|
-
annet-
|
|
187
|
-
annet-
|
|
181
|
+
annet-2.0.1.dist-info/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
|
|
182
|
+
annet-2.0.1.dist-info/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
|
|
183
|
+
annet-2.0.1.dist-info/METADATA,sha256=x3cpmknanwf6tSpC5mM7i_dBbYAQZwc0f7Sn5zHNfZ0,793
|
|
184
|
+
annet-2.0.1.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
|
|
185
|
+
annet-2.0.1.dist-info/entry_points.txt,sha256=5lIaDGlGi3l6QQ2ry2jZaqViP5Lvt8AmsegdD0Uznck,192
|
|
186
|
+
annet-2.0.1.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
|
|
187
|
+
annet-2.0.1.dist-info/RECORD,,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from annet.rpl_generators import AsPathFilter, CommunityList, CommunityType, RDFilter,
|
|
1
|
+
from annet.rpl_generators import AsPathFilter, CommunityList, CommunityType, RDFilter, ip_prefix_list
|
|
2
2
|
|
|
3
3
|
AS_PATH_FILTERS = [
|
|
4
4
|
AsPathFilter("ASP_EXAMPLE", [".*123456.*"]),
|
|
@@ -16,6 +16,6 @@ RD_FILTERS = [
|
|
|
16
16
|
]
|
|
17
17
|
|
|
18
18
|
PREFIX_LISTS = [
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
ip_prefix_list("IPV6_LIST_EXAMPLE", ["2a13:5941::/32"]),
|
|
20
|
+
ip_prefix_list("IPV4_LIST_EXAMPLE", ["0.0.0.0/8", "10.0.0.0/8"]),
|
|
21
21
|
]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|