annet 0.16.36__py3-none-any.whl → 0.16.37__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/common/models.py +12 -7
- annet/adapters/netbox/common/storage_opts.py +17 -2
- annet/adapters/netbox/v37/storage.py +5 -36
- annet/bgp_models.py +1 -0
- annet/mesh/executor.py +9 -8
- annet/mesh/peer_models.py +1 -0
- annet/rpl_generators/prefix_lists.py +14 -14
- {annet-0.16.36.dist-info → annet-0.16.37.dist-info}/METADATA +2 -2
- {annet-0.16.36.dist-info → annet-0.16.37.dist-info}/RECORD +14 -14
- {annet-0.16.36.dist-info → annet-0.16.37.dist-info}/AUTHORS +0 -0
- {annet-0.16.36.dist-info → annet-0.16.37.dist-info}/LICENSE +0 -0
- {annet-0.16.36.dist-info → annet-0.16.37.dist-info}/WHEEL +0 -0
- {annet-0.16.36.dist-info → annet-0.16.37.dist-info}/entry_points.txt +0 -0
- {annet-0.16.36.dist-info → annet-0.16.37.dist-info}/top_level.txt +0 -0
|
@@ -192,20 +192,25 @@ class NetboxDevice(Entity):
|
|
|
192
192
|
breed: str
|
|
193
193
|
|
|
194
194
|
interfaces: List[Interface]
|
|
195
|
-
|
|
195
|
+
|
|
196
|
+
@property
|
|
197
|
+
def neighbors(self) -> List["Entity"]:
|
|
198
|
+
return [
|
|
199
|
+
endpoint.device
|
|
200
|
+
for iface in self.interfaces
|
|
201
|
+
if iface.connected_endpoints
|
|
202
|
+
for endpoint in iface.connected_endpoints
|
|
203
|
+
if endpoint.device
|
|
204
|
+
]
|
|
196
205
|
|
|
197
206
|
# compat
|
|
198
207
|
@property
|
|
199
208
|
def neighbours_fqdns(self) -> list[str]:
|
|
200
|
-
|
|
201
|
-
return []
|
|
202
|
-
return [dev.fqdn for dev in self.neighbours]
|
|
209
|
+
return [dev.name for dev in self.neighbors]
|
|
203
210
|
|
|
204
211
|
@property
|
|
205
212
|
def neighbours_ids(self):
|
|
206
|
-
|
|
207
|
-
return []
|
|
208
|
-
return [dev.id for dev in self.neighbours]
|
|
213
|
+
return [dev.id for dev in self.neighbors]
|
|
209
214
|
|
|
210
215
|
def __hash__(self):
|
|
211
216
|
return hash((self.id, type(self)))
|
|
@@ -5,16 +5,25 @@ DEFAULT_URL = "http://localhost"
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class NetboxStorageOpts:
|
|
8
|
-
def __init__(
|
|
8
|
+
def __init__(
|
|
9
|
+
self,
|
|
10
|
+
url: str,
|
|
11
|
+
token: str,
|
|
12
|
+
insecure: bool = False,
|
|
13
|
+
exact_host_filter: bool = False,
|
|
14
|
+
threads: int = 1,
|
|
15
|
+
):
|
|
9
16
|
self.url = url
|
|
10
17
|
self.token = token
|
|
11
18
|
self.insecure = insecure
|
|
12
19
|
self.exact_host_filter = exact_host_filter
|
|
20
|
+
self.threads = threads
|
|
13
21
|
|
|
14
22
|
@classmethod
|
|
15
23
|
def parse_params(cls, conf_params: Optional[dict[str, str]], cli_opts: Any):
|
|
16
24
|
url = os.getenv("NETBOX_URL") or conf_params.get("url") or DEFAULT_URL
|
|
17
25
|
token = os.getenv("NETBOX_TOKEN", "").strip() or conf_params.get("token") or ""
|
|
26
|
+
threads = os.getenv("NETBOX_CLIENT_THREADS", "").strip() or conf_params.get("threads") or "1"
|
|
18
27
|
insecure = False
|
|
19
28
|
if insecure_env := os.getenv("NETBOX_INSECURE", "").lower():
|
|
20
29
|
insecure = insecure_env in ("true", "1", "t")
|
|
@@ -24,4 +33,10 @@ class NetboxStorageOpts:
|
|
|
24
33
|
exact_host_filter = exact_host_filter_env in ("true", "1", "t")
|
|
25
34
|
else:
|
|
26
35
|
exact_host_filter = bool(conf_params.get("exact_host_filter") or False)
|
|
27
|
-
return cls(
|
|
36
|
+
return cls(
|
|
37
|
+
url=url,
|
|
38
|
+
token=token,
|
|
39
|
+
insecure=insecure,
|
|
40
|
+
exact_host_filter=exact_host_filter,
|
|
41
|
+
threads=int(threads),
|
|
42
|
+
)
|
|
@@ -24,7 +24,6 @@ logger = getLogger(__name__)
|
|
|
24
24
|
@impl_converter(recipe=[
|
|
25
25
|
link(P[api_models.Device].name, P[models.NetboxDevice].hostname),
|
|
26
26
|
link(P[api_models.Device].name, P[models.NetboxDevice].fqdn),
|
|
27
|
-
link_constant(P[models.NetboxDevice].neighbours, value=None),
|
|
28
27
|
])
|
|
29
28
|
def extend_device_base(
|
|
30
29
|
device: api_models.Device,
|
|
@@ -39,7 +38,6 @@ def extend_device_base(
|
|
|
39
38
|
def extend_device(
|
|
40
39
|
device: api_models.Device,
|
|
41
40
|
interfaces: List[models.Interface],
|
|
42
|
-
neighbours: Optional[List[models.NetboxDevice]],
|
|
43
41
|
storage: Storage,
|
|
44
42
|
) -> models.NetboxDevice:
|
|
45
43
|
platform_name: str = ""
|
|
@@ -64,7 +62,6 @@ def extend_device(
|
|
|
64
62
|
hw=hw,
|
|
65
63
|
storage=storage,
|
|
66
64
|
)
|
|
67
|
-
res.neighbours = neighbours
|
|
68
65
|
return res
|
|
69
66
|
|
|
70
67
|
|
|
@@ -91,6 +88,7 @@ class NetboxStorageV37(Storage):
|
|
|
91
88
|
url = ""
|
|
92
89
|
token = ""
|
|
93
90
|
self.exact_host_filter = False
|
|
91
|
+
threads = 1
|
|
94
92
|
if opts:
|
|
95
93
|
if opts.insecure:
|
|
96
94
|
ctx = ssl.create_default_context()
|
|
@@ -98,8 +96,10 @@ class NetboxStorageV37(Storage):
|
|
|
98
96
|
ctx.verify_mode = ssl.CERT_NONE
|
|
99
97
|
url = opts.url
|
|
100
98
|
token = opts.token
|
|
99
|
+
threads = opts.threads
|
|
101
100
|
self.exact_host_filter = opts.exact_host_filter
|
|
102
|
-
|
|
101
|
+
|
|
102
|
+
self.netbox = NetboxV37(url=url, token=token, ssl_context=ctx, threads=threads)
|
|
103
103
|
self._all_fqdns: Optional[list[str]] = None
|
|
104
104
|
self._id_devices: dict[int, models.NetboxDevice] = {}
|
|
105
105
|
self._name_devices: dict[str, models.NetboxDevice] = {}
|
|
@@ -174,7 +174,6 @@ class NetboxStorageV37(Storage):
|
|
|
174
174
|
device.id: extend_device(
|
|
175
175
|
device=device,
|
|
176
176
|
interfaces=[],
|
|
177
|
-
neighbours=[],
|
|
178
177
|
storage=self,
|
|
179
178
|
)
|
|
180
179
|
for device in self._load_devices(query)
|
|
@@ -186,16 +185,8 @@ class NetboxStorageV37(Storage):
|
|
|
186
185
|
self._record_device(device)
|
|
187
186
|
|
|
188
187
|
interfaces = self._load_interfaces(list(device_ids))
|
|
189
|
-
neighbours = {x.id: x for x in self._load_neighbours(interfaces)}
|
|
190
|
-
neighbours_seen: dict[str, set] = defaultdict(set)
|
|
191
|
-
|
|
192
188
|
for interface in interfaces:
|
|
193
189
|
device_ids[interface.device.id].interfaces.append(interface)
|
|
194
|
-
for e in interface.connected_endpoints or []:
|
|
195
|
-
neighbour = neighbours[e.device.id]
|
|
196
|
-
if neighbour.id not in neighbours_seen[interface.device.id]:
|
|
197
|
-
neighbours_seen[interface.device.id].add(neighbour.id)
|
|
198
|
-
device_ids[interface.device.id].neighbours.append(neighbour)
|
|
199
190
|
|
|
200
191
|
return list(device_ids.values())
|
|
201
192
|
|
|
@@ -233,8 +224,7 @@ class NetboxStorageV37(Storage):
|
|
|
233
224
|
extended_ifaces[ip.assigned_object_id].ip_addresses.append(ip)
|
|
234
225
|
return list(extended_ifaces.values())
|
|
235
226
|
|
|
236
|
-
def _load_interfaces(self, device_ids: List[int]) -> List[
|
|
237
|
-
models.Interface]:
|
|
227
|
+
def _load_interfaces(self, device_ids: List[int]) -> List[models.Interface]:
|
|
238
228
|
interfaces = self.netbox.dcim_all_interfaces(device_id=device_ids)
|
|
239
229
|
return self._extend_interfaces(interfaces.results)
|
|
240
230
|
|
|
@@ -242,25 +232,6 @@ class NetboxStorageV37(Storage):
|
|
|
242
232
|
interfaces = self.netbox.dcim_all_interfaces_by_id(id=ids)
|
|
243
233
|
return self._extend_interfaces(interfaces.results)
|
|
244
234
|
|
|
245
|
-
def _load_neighbours(self, interfaces: List[models.Interface]) -> List[models.NetboxDevice]:
|
|
246
|
-
endpoints = [e for i in interfaces for e in i.connected_endpoints or []]
|
|
247
|
-
remote_interfaces_ids = [e.id for e in endpoints]
|
|
248
|
-
neighbours_ids = [e.device.id for e in endpoints]
|
|
249
|
-
neighbours_ifaces_dics = defaultdict(list)
|
|
250
|
-
# load only the connected interface to speed things up
|
|
251
|
-
for iface in self._load_interfaces_by_id(remote_interfaces_ids):
|
|
252
|
-
neighbours_ifaces_dics[iface.device.id].append(iface)
|
|
253
|
-
neighbours = []
|
|
254
|
-
for neighbour in self.netbox.dcim_all_devices_by_id(id=neighbours_ids).results:
|
|
255
|
-
extended_neighbour = extend_device(
|
|
256
|
-
device=neighbour,
|
|
257
|
-
storage=self,
|
|
258
|
-
interfaces=neighbours_ifaces_dics[neighbour.id],
|
|
259
|
-
neighbours=None, # do not load recursively
|
|
260
|
-
)
|
|
261
|
-
neighbours.append(extended_neighbour)
|
|
262
|
-
return neighbours
|
|
263
|
-
|
|
264
235
|
def get_device(
|
|
265
236
|
self, obj_id, preload_neighbors=False, use_mesh=None,
|
|
266
237
|
**kwargs,
|
|
@@ -270,13 +241,11 @@ class NetboxStorageV37(Storage):
|
|
|
270
241
|
|
|
271
242
|
device = self.netbox.dcim_device(obj_id)
|
|
272
243
|
interfaces = self._load_interfaces([device.id])
|
|
273
|
-
neighbours = self._load_neighbours(interfaces)
|
|
274
244
|
|
|
275
245
|
res = extend_device(
|
|
276
246
|
device=device,
|
|
277
247
|
storage=self,
|
|
278
248
|
interfaces=interfaces,
|
|
279
|
-
neighbours=neighbours,
|
|
280
249
|
)
|
|
281
250
|
self._record_device(res)
|
|
282
251
|
return res
|
annet/bgp_models.py
CHANGED
annet/mesh/executor.py
CHANGED
|
@@ -132,30 +132,30 @@ class MeshExecutor:
|
|
|
132
132
|
# we can have multiple rules for the same pair
|
|
133
133
|
# we merge them according to remote fqdn
|
|
134
134
|
neighbor_peers: dict[PeerKey, Pair] = {}
|
|
135
|
-
# TODO batch resolve
|
|
136
135
|
rules = self._registry.lookup_direct(device.fqdn, device.neighbours_fqdns)
|
|
137
136
|
fqdns = {
|
|
138
137
|
rule.name_right if rule.direct_order else rule.name_left
|
|
139
138
|
for rule in rules
|
|
140
139
|
}
|
|
141
|
-
|
|
140
|
+
logger.debug("Loading neighbor devices: %s", fqdns)
|
|
141
|
+
neighbors = {
|
|
142
142
|
d.fqdn: d for d in self._storage.make_devices(list(fqdns))
|
|
143
143
|
}
|
|
144
144
|
for rule in rules:
|
|
145
145
|
handler_name = self._handler_name(rule.handler)
|
|
146
146
|
if rule.direct_order:
|
|
147
|
-
if rule.name_right not in
|
|
148
|
-
print(list(neigbors), flush=True)
|
|
147
|
+
if rule.name_right not in neighbors:
|
|
149
148
|
raise ValueError(
|
|
150
|
-
f"Device `{device.fqdn}` has no neighbor `{rule.name_right}`
|
|
149
|
+
f"Device `{device.fqdn}` has no neighbor `{rule.name_right}` "
|
|
150
|
+
f"required for `{handler_name}`. {list(neighbors)}",
|
|
151
151
|
)
|
|
152
|
-
neighbor_device =
|
|
152
|
+
neighbor_device = neighbors[rule.name_right]
|
|
153
153
|
else:
|
|
154
|
-
if rule.name_left not in
|
|
154
|
+
if rule.name_left not in neighbors:
|
|
155
155
|
raise ValueError(
|
|
156
156
|
f"Device `{device.fqdn}` has no neighbor `{rule.name_left}` required for `{handler_name}`",
|
|
157
157
|
)
|
|
158
|
-
neighbor_device =
|
|
158
|
+
neighbor_device = neighbors[rule.name_left]
|
|
159
159
|
all_connected_ports = [
|
|
160
160
|
(p1.name, p2.name)
|
|
161
161
|
for p1, p2 in self._storage.search_connections(device, neighbor_device)
|
|
@@ -238,6 +238,7 @@ class MeshExecutor:
|
|
|
238
238
|
rule.name_right if rule.direct_order else rule.name_left
|
|
239
239
|
for rule in rules
|
|
240
240
|
}
|
|
241
|
+
logger.debug("Loading indirect connected devices: %s", fqdns)
|
|
241
242
|
connected_devices = {
|
|
242
243
|
d.fqdn: d for d in self._storage.make_devices(list(fqdns))
|
|
243
244
|
}
|
annet/mesh/peer_models.py
CHANGED
|
@@ -110,7 +110,9 @@ class PrefixListFilterGenerator(PartialGenerator, ABC):
|
|
|
110
110
|
def acl_arista(self, _):
|
|
111
111
|
return r"""
|
|
112
112
|
ip prefix-list
|
|
113
|
+
seq
|
|
113
114
|
ipv6 prefix-list
|
|
115
|
+
seq
|
|
114
116
|
"""
|
|
115
117
|
|
|
116
118
|
def _arista_prefix_list(
|
|
@@ -120,20 +122,18 @@ class PrefixListFilterGenerator(PartialGenerator, ABC):
|
|
|
120
122
|
match: PrefixMatchValue,
|
|
121
123
|
plist: IpPrefixList,
|
|
122
124
|
) -> Iterable[Sequence[str]]:
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
("le", str(match.less_equal)) if match.less_equal is not None else ()
|
|
136
|
-
)
|
|
125
|
+
with self.block(prefix_type, "prefix-list", name):
|
|
126
|
+
for i, prefix in enumerate(plist.members):
|
|
127
|
+
addr_mask = ip_interface(prefix)
|
|
128
|
+
yield (
|
|
129
|
+
f"seq {i * 10 + 10}",
|
|
130
|
+
"permit",
|
|
131
|
+
addr_mask.with_prefixlen,
|
|
132
|
+
) + (
|
|
133
|
+
("ge", str(match.greater_equal)) if match.greater_equal is not None else ()
|
|
134
|
+
) + (
|
|
135
|
+
("le", str(match.less_equal)) if match.less_equal is not None else ()
|
|
136
|
+
)
|
|
137
137
|
|
|
138
138
|
def run_arista(self, device: Any):
|
|
139
139
|
policies = self.get_policies(device)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: annet
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.37
|
|
4
4
|
Summary: annet
|
|
5
5
|
Home-page: https://github.com/annetutil/annet
|
|
6
6
|
License: MIT
|
|
@@ -23,7 +23,7 @@ Requires-Dist: yarl>=1.8.2
|
|
|
23
23
|
Requires-Dist: adaptix==3.0.0b7
|
|
24
24
|
Requires-Dist: dataclass-rest==0.4
|
|
25
25
|
Provides-Extra: netbox
|
|
26
|
-
Requires-Dist: annetbox[sync]>=0.
|
|
26
|
+
Requires-Dist: annetbox[sync]>=0.2.0; extra == "netbox"
|
|
27
27
|
Dynamic: home-page
|
|
28
28
|
Dynamic: license
|
|
29
29
|
Dynamic: provides-extra
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
annet/__init__.py,sha256=W8kkZ3Axu-6VJwgQ0cn4UeOVNy6jab0cqgHKLQny1D0,2141
|
|
2
2
|
annet/annet.py,sha256=TMdEuM7GJQ4TjRVmuK3bCTZN-21lxjQ9sXqEdILUuBk,725
|
|
3
3
|
annet/argparse.py,sha256=v1MfhjR0B8qahza0WinmXClpR8UiDFhmwDDWtNroJPA,12855
|
|
4
|
-
annet/bgp_models.py,sha256=
|
|
4
|
+
annet/bgp_models.py,sha256=NBPbMWwzo4uWFslrpE4blQO1k4CxJqeleRBDhDg9Rd0,9665
|
|
5
5
|
annet/cli.py,sha256=hDpjIr3w47lgQ_CvCQS1SXFDK-SJrf5slbT__5u6GIA,12342
|
|
6
6
|
annet/cli_args.py,sha256=KQlihxSl-Phhq1-9oJDdNSbIllEX55LlPfH6viEKOuw,13483
|
|
7
7
|
annet/connectors.py,sha256=-Lghz3PtWCBU8Ohrp0KKQcmm1AUZtN0EnOaZ6IQgCQI,5105
|
|
@@ -33,14 +33,14 @@ annet/adapters/netbox/provider.py,sha256=3IrfZ6CfCxf-lTnJlIC2TQ8M_rDxOB_B7HGXZ92
|
|
|
33
33
|
annet/adapters/netbox/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
34
|
annet/adapters/netbox/common/client.py,sha256=PaxHG4W9H8_uunIwMBNYkLq4eQJYoO6p6gY-ciQs7Nc,2563
|
|
35
35
|
annet/adapters/netbox/common/manufacturer.py,sha256=Y9kqU13q6fwYu0_HiotUKAy7OHFZngkC2s3s4IDAbDg,1745
|
|
36
|
-
annet/adapters/netbox/common/models.py,sha256=
|
|
36
|
+
annet/adapters/netbox/common/models.py,sha256=cnNf2oB_BDRz4ZYkHpib1qPxwY1iREJMiWlg8T0lORY,7559
|
|
37
37
|
annet/adapters/netbox/common/query.py,sha256=mv5WlU6gGge8gUYwloXDXEABmfP5teYyq8DyBtGdFkw,1761
|
|
38
38
|
annet/adapters/netbox/common/status_client.py,sha256=XXx0glomaBaglmkUEy6YtFOxQQkHb59CDA0h1I-IhxM,592
|
|
39
|
-
annet/adapters/netbox/common/storage_opts.py,sha256=
|
|
39
|
+
annet/adapters/netbox/common/storage_opts.py,sha256=wfv1spElomwgVYMCgGth3SWVF0RsRgtUgq9GpFL9hJs,1520
|
|
40
40
|
annet/adapters/netbox/v24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
41
41
|
annet/adapters/netbox/v24/storage.py,sha256=THI592VLx3ehixsPZQ1Ko3mYIAZQbnDY-toIziqBbL8,6005
|
|
42
42
|
annet/adapters/netbox/v37/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
|
-
annet/adapters/netbox/v37/storage.py,sha256=
|
|
43
|
+
annet/adapters/netbox/v37/storage.py,sha256=PYT2qffMVVkeIlBYg_Msj6u-68rVv1UlA9-5plioRUM,11094
|
|
44
44
|
annet/annlib/__init__.py,sha256=fT1l4xV5fqqg8HPw9HqmZVN2qwS8i6X1aIm2zGDjxKY,252
|
|
45
45
|
annet/annlib/command.py,sha256=uuBddMQphtn8P5MO5kzIa8_QrtMns-k05VeKv1bcAuA,1043
|
|
46
46
|
annet/annlib/diff.py,sha256=MZ6eQAU3cadQp8KaSE6uAYFtcfMDCIe_eNuVROnYkCk,4496
|
|
@@ -84,10 +84,10 @@ annet/generators/common/initial.py,sha256=qYBxXFhyOPy34cxc6hsIXseod-lYCmmbuNHpM0
|
|
|
84
84
|
annet/mesh/__init__.py,sha256=lcgdnBIxc2MAN7Er1bcErEKPqrjWO4uIp_1FldMXTYg,557
|
|
85
85
|
annet/mesh/basemodel.py,sha256=E6NTOneiMDwB1NCpjDRECoaeQ0f3n_fmTLnKTrSHTU4,4917
|
|
86
86
|
annet/mesh/device_models.py,sha256=aFbwVWNSDBcph_Kvv6qZT-uUz0Tbg3z45EvP4i1z2ao,3600
|
|
87
|
-
annet/mesh/executor.py,sha256=
|
|
87
|
+
annet/mesh/executor.py,sha256=z_3e2neRR4GoEQfJlvfbalelKzOz5yb78zm9lIcLYw4,17578
|
|
88
88
|
annet/mesh/match_args.py,sha256=CR3kdIV9NGtyk9E2JbcOQ3TRuYEryTWP3m2yCo2VCWg,5751
|
|
89
89
|
annet/mesh/models_converter.py,sha256=3q2zs7K8S3pfYSUKKRdtl5CJGbeg4TtYxofAVs_MBsk,3085
|
|
90
|
-
annet/mesh/peer_models.py,sha256=
|
|
90
|
+
annet/mesh/peer_models.py,sha256=Div4o1t6Z0TWvy-8WKg4-n9WOd2PKCmIpfbkILDlDtk,2791
|
|
91
91
|
annet/mesh/port_processor.py,sha256=RHiMS5W8qoDkTKiarQ748bcr8bNx4g_R4Y4vZg2k4TU,478
|
|
92
92
|
annet/mesh/registry.py,sha256=xmWF7yxWXmwqX2_jyMAKrbGd2G9sjb4rYDx4Xk61QKc,9607
|
|
93
93
|
annet/rpl/__init__.py,sha256=0kcIktE3AmS0rlm9xzVDf53xk08OeZXgD-6ZLCt_KCs,731
|
|
@@ -105,7 +105,7 @@ annet/rpl_generators/cumulus_frr.py,sha256=F-LRT-UPnztUqinp3KYKqh796L9dqkzPKBUxM
|
|
|
105
105
|
annet/rpl_generators/entities.py,sha256=DIpgAQ8Tslo2hq6iFBaYkJX12BFBiccN8GOaRVxR1Uk,1985
|
|
106
106
|
annet/rpl_generators/execute.py,sha256=wS6e6fwcPWywsHB0gBMqZ17eF0s4YOBgDgwPB_cr5Rw,431
|
|
107
107
|
annet/rpl_generators/policy.py,sha256=NeqB0reRN_KuY8LYkeGT3dRPe2HFDT9RfmVy5fcA3zw,32570
|
|
108
|
-
annet/rpl_generators/prefix_lists.py,sha256=
|
|
108
|
+
annet/rpl_generators/prefix_lists.py,sha256=D4WXeISevf62EmDu1GYdldjz2gmONFFlmgMyGAOa_m8,7248
|
|
109
109
|
annet/rpl_generators/rd.py,sha256=YGXgx1D2D0-pixgspXJzA6NvW8lx3AmHMxIY2l5rraI,1457
|
|
110
110
|
annet/rulebook/__init__.py,sha256=oafL5HC8QHdkO9CH2q_fxohPMxOgjn-dNQa5kPjuqsA,3942
|
|
111
111
|
annet/rulebook/common.py,sha256=zK1s2c5lc5HQbIlMUQ4HARQudXSgOYiZ_Sxc2I_tHqg,721
|
|
@@ -176,10 +176,10 @@ annet_generators/rpl_example/generator.py,sha256=zndIGfV4ZlTxPgAGYs7bMQvTc_tYScO
|
|
|
176
176
|
annet_generators/rpl_example/items.py,sha256=Ez1RF5YhcXNCusBmeApIjRL3rBlMazNZd29Gpw1_IsA,766
|
|
177
177
|
annet_generators/rpl_example/mesh.py,sha256=z_WgfDZZ4xnyh3cSf75igyH09hGvtexEVwy1gCD_DzA,288
|
|
178
178
|
annet_generators/rpl_example/route_policy.py,sha256=z6nPb0VDeQtKD1NIg9sFvmUxBD5tVs2frfNIuKdM-5c,2318
|
|
179
|
-
annet-0.16.
|
|
180
|
-
annet-0.16.
|
|
181
|
-
annet-0.16.
|
|
182
|
-
annet-0.16.
|
|
183
|
-
annet-0.16.
|
|
184
|
-
annet-0.16.
|
|
185
|
-
annet-0.16.
|
|
179
|
+
annet-0.16.37.dist-info/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
|
|
180
|
+
annet-0.16.37.dist-info/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
|
|
181
|
+
annet-0.16.37.dist-info/METADATA,sha256=-esXnAU-CbKx5Cp3QA41GqBb4w5eWxFUasMwdiljmVo,853
|
|
182
|
+
annet-0.16.37.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
183
|
+
annet-0.16.37.dist-info/entry_points.txt,sha256=5lIaDGlGi3l6QQ2ry2jZaqViP5Lvt8AmsegdD0Uznck,192
|
|
184
|
+
annet-0.16.37.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
|
|
185
|
+
annet-0.16.37.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|