annet 0.16.33__py3-none-any.whl → 0.16.34__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.

@@ -165,17 +165,28 @@ class NetboxStorageV37(Storage):
165
165
  def _load_devices(self, query: NetboxQuery) -> List[api_models.Device]:
166
166
  if not query.globs:
167
167
  return []
168
+ devices = []
169
+ device_ids = set()
170
+ query_groups = parse_glob(query.globs)
168
171
  if self.exact_host_filter:
169
- devices = self.netbox.dcim_all_devices(name__ie=query.globs).results
170
- else:
171
- query = _hostname_dot_hack(query)
172
- devices = [
173
- device
174
- for device in self.netbox.dcim_all_devices(
175
- name__ic=query.globs,
176
- ).results
177
- if _match_query(query, device)
178
- ]
172
+ name_ies = [_hostname_dot_hack(query) for query in query_groups.pop("name__ic", [])]
173
+ query_groups["name__ie"].extend(name_ies)
174
+ for grp, params in query_groups.items():
175
+ if not params:
176
+ continue
177
+ try:
178
+ new_devices = self.netbox.dcim_all_devices(**{grp: params}).results
179
+ except Exception as e:
180
+ # tag and site lookup returns 400 in case of unknown tag or site
181
+ if "is not one of the available choices" in str(e):
182
+ continue
183
+ raise
184
+ if grp == "name__ic":
185
+ new_devices = [device for device in new_devices if _match_query(query, device)]
186
+ for device in new_devices:
187
+ if device.id not in device_ids:
188
+ device_ids.add(device.id)
189
+ devices.extend(new_devices)
179
190
  return devices
180
191
 
181
192
  def _extend_interfaces(self, interfaces: List[models.Interface]) -> List[models.Interface]:
@@ -268,7 +279,7 @@ def _match_query(query: NetboxQuery, device_data: api_models.Device) -> bool:
268
279
  return False
269
280
 
270
281
 
271
- def _hostname_dot_hack(netbox_query: NetboxQuery) -> NetboxQuery:
282
+ def _hostname_dot_hack(raw_query: str) -> str:
272
283
  # there is no proper way to lookup host by its hostname
273
284
  # ie find "host" with fqdn "host.example.com"
274
285
  # besides using name__ic (ie startswith)
@@ -280,9 +291,23 @@ def _hostname_dot_hack(netbox_query: NetboxQuery) -> NetboxQuery:
280
291
  raw_query = raw_query + "."
281
292
  return raw_query
282
293
 
283
- raw_query = netbox_query.query
284
294
  if isinstance(raw_query, list):
285
295
  for i, name in enumerate(raw_query):
286
296
  raw_query[i] = add_dot(name)
287
297
 
288
- return NetboxQuery(raw_query)
298
+ return raw_query
299
+
300
+
301
+ def parse_glob(globs: list[str]) -> dict[str, list[str]]:
302
+ query_groups: dict[str, list[str]] = {"tag": [], "site": [], "name__ic": []}
303
+ for q in globs:
304
+ if ":" in q:
305
+ glob_type, param = q.split(":", 2)
306
+ if glob_type not in query_groups:
307
+ raise Exception(f"unknown query type: '{glob_type}'")
308
+ if not param:
309
+ raise Exception(f"empty param for '{glob_type}'")
310
+ query_groups[glob_type].append(param)
311
+ else:
312
+ query_groups["name__ic"].append(q)
313
+ return query_groups
@@ -166,6 +166,8 @@
166
166
 
167
167
  "B4com": "^[Bb]4com",
168
168
  "B4com.CS2148P": "^[Bb]4com B4T-CS2148P.*",
169
+ "B4com.CS4100": "^[Bb]4com B4T-CS41.*",
170
+ "B4com.CS4132U": "^[Bb]4com B4T-CS4132U.*",
169
171
  "B4com.CS4148Q": "^[Bb]4com B4T-CS4148Q.*",
170
- "B4com.CS4146U": "^[Bb]4com B4T-CS4146U.*"
172
+ "B4com.CS4164U": "^[Bb]4com B4T-CS4164U.*"
171
173
  }
@@ -346,14 +346,14 @@ def apply(hw, do_commit, do_finalize, **_):
346
346
  after.add_cmd(Command("exit"))
347
347
  elif hw.B4com.CS2148P:
348
348
  before.add_cmd(Command("conf t"))
349
- after.add_cmd(Command("exit"))
349
+ after.add_cmd(Command("end"))
350
350
  if do_finalize:
351
351
  after.add_cmd(Command("write", timeout=40))
352
352
  elif hw.B4com:
353
353
  before.add_cmd(Command("conf t"))
354
- after.add_cmd(Command("exit"))
355
354
  if do_commit:
356
355
  after.add_cmd(Command("commit"))
356
+ after.add_cmd(Command("end"))
357
357
  if do_finalize:
358
358
  after.add_cmd(Command("write", timeout=40))
359
359
  elif hw.H3C:
annet/bgp_models.py CHANGED
@@ -142,7 +142,6 @@ class Peer:
142
142
  class Aggregate:
143
143
  policy: str = ""
144
144
  routes: tuple[str, ...] = () # "182.168.1.0/24",
145
- export_policy: str = ""
146
145
  as_path: str = ""
147
146
  reference: str = ""
148
147
  suppress: bool = False
@@ -290,21 +289,18 @@ def _used_policies(peer: Union[Peer, PeerGroup]) -> Iterable[str]:
290
289
 
291
290
 
292
291
  def _used_redistribute_policies(opts: Union[GlobalOptions, VrfOptions]) -> Iterable[str]:
293
- for red in opts.ipv4_unicast.redistributes:
294
- if red.policy:
295
- yield red.policy
296
- for red in opts.ipv6_unicast.redistributes:
297
- if red.policy:
298
- yield red.policy
299
- for red in opts.ipv4_labeled_unicast.redistributes:
300
- if red.policy:
301
- yield red.policy
302
- for red in opts.ipv6_labeled_unicast.redistributes:
303
- if red.policy:
304
- yield red.policy
305
- for red in opts.l2vpn_evpn.redistributes:
306
- if red.policy:
307
- yield red.policy
292
+ for family_opts in (
293
+ opts.ipv4_unicast,
294
+ opts.ipv6_unicast,
295
+ opts.ipv4_labeled_unicast,
296
+ opts.ipv6_labeled_unicast,
297
+ opts.l2vpn_evpn,
298
+ ):
299
+ for red in family_opts.redistributes:
300
+ if red.policy:
301
+ yield red.policy
302
+ if family_opts.aggregate and family_opts.aggregate.policy:
303
+ yield family_opts.aggregate.policy
308
304
 
309
305
 
310
306
  def extract_policies(config: BgpConfig) -> Sequence[str]:
@@ -8,7 +8,6 @@ from .peer_models import MeshPeerGroup
8
8
  class Aggregate(BaseMeshModel):
9
9
  policy: str
10
10
  routes: Annotated[tuple[str, ...], Concat()]
11
- export_policy: str
12
11
  as_path: str
13
12
  reference: str
14
13
  suppress: bool
@@ -22,7 +21,7 @@ class FamilyOptions(BaseMeshModel):
22
21
  super().__init__(**kwargs)
23
22
  family: Family
24
23
  vrf_name: str
25
- multipath: int = 0
24
+ multipath: int
26
25
  global_multipath: int
27
26
  aggregate: Annotated[Aggregate, Merge()]
28
27
  redistributes: Annotated[tuple[Redistribute, ...], Concat()]
annet/mesh/executor.py CHANGED
@@ -144,8 +144,17 @@ class MeshExecutor:
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 neigbors:
148
+ print(list(neigbors), flush=True)
149
+ raise ValueError(
150
+ f"Device `{device.fqdn}` has no neighbor `{rule.name_right}` required for `{handler_name}`. {list(neigbors)}",
151
+ )
147
152
  neighbor_device = neigbors[rule.name_right]
148
153
  else:
154
+ if rule.name_left not in neigbors:
155
+ raise ValueError(
156
+ f"Device `{device.fqdn}` has no neighbor `{rule.name_left}` required for `{handler_name}`",
157
+ )
149
158
  neighbor_device = neigbors[rule.name_left]
150
159
  all_connected_ports = [
151
160
  (p1.name, p2.name)
annet/mesh/registry.py CHANGED
@@ -208,11 +208,11 @@ class MeshRulesRegistry:
208
208
 
209
209
  def lookup_direct(self, device: str, neighbors: list[str]) -> list[MatchedDirectPair]:
210
210
  found = []
211
- device = self._normalize_host(device)
211
+ device_norm = self._normalize_host(device)
212
212
  for neighbor in neighbors:
213
- neighbor = self._normalize_host(neighbor)
213
+ neighbor_norm = self._normalize_host(neighbor)
214
214
  for rule in self.direct_rules:
215
- if args := rule.matcher.match_pair(device, neighbor):
215
+ if args := rule.matcher.match_pair(device_norm, neighbor_norm):
216
216
  found.append(MatchedDirectPair(
217
217
  handler=rule.handler,
218
218
  port_processor=rule.port_processor,
@@ -222,7 +222,7 @@ class MeshRulesRegistry:
222
222
  match_left=args[0],
223
223
  match_right=args[1],
224
224
  ))
225
- if args := rule.matcher.match_pair(neighbor, device):
225
+ if args := rule.matcher.match_pair(neighbor_norm, device_norm):
226
226
  found.append(MatchedDirectPair(
227
227
  handler=rule.handler,
228
228
  port_processor=rule.port_processor,
@@ -238,11 +238,11 @@ class MeshRulesRegistry:
238
238
 
239
239
  def lookup_indirect(self, device: str, devices: list[str]) -> list[MatchedIndirectPair]:
240
240
  found = []
241
- device = self._normalize_host(device)
241
+ device_norm = self._normalize_host(device)
242
242
  for other_device in devices:
243
- other_device = self._normalize_host(other_device)
243
+ other_device_norm = self._normalize_host(other_device)
244
244
  for rule in self.indirect_rules:
245
- if args := rule.matcher.match_pair(device, other_device):
245
+ if args := rule.matcher.match_pair(device_norm, other_device_norm):
246
246
  found.append(MatchedIndirectPair(
247
247
  handler=rule.handler,
248
248
  direct_order=True,
@@ -251,7 +251,7 @@ class MeshRulesRegistry:
251
251
  match_left=args[0],
252
252
  match_right=args[1],
253
253
  ))
254
- if args := rule.matcher.match_pair(other_device, device):
254
+ if args := rule.matcher.match_pair(other_device_norm, device_norm):
255
255
  found.append(MatchedIndirectPair(
256
256
  handler=rule.handler,
257
257
  direct_order=False,
@@ -266,9 +266,9 @@ class MeshRulesRegistry:
266
266
 
267
267
  def lookup_virtual(self, device: str) -> list[MatchedVirtualPair]:
268
268
  found = []
269
- device = self._normalize_host(device)
269
+ device_norm = self._normalize_host(device)
270
270
  for rule in self.virtual_rules:
271
- if args := rule.matcher.match_one(device):
271
+ if args := rule.matcher.match_one(device_norm):
272
272
  found.append(MatchedVirtualPair(
273
273
  handler=rule.handler,
274
274
  match=args,
@@ -280,9 +280,9 @@ class MeshRulesRegistry:
280
280
 
281
281
  def lookup_global(self, device: str) -> list[MatchedGlobal]:
282
282
  found = []
283
- device = self._normalize_host(device)
283
+ device_norm = self._normalize_host(device)
284
284
  for rule in self.global_rules:
285
- if args := rule.matcher.match_one(device):
285
+ if args := rule.matcher.match_one(device_norm):
286
286
  found.append(MatchedGlobal(
287
287
  handler=rule.handler,
288
288
  match=args,
@@ -0,0 +1,42 @@
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 sflow(rule, key, diff, **kwargs):
17
+ """
18
+ Команда sflow sampling-rate * direction ingress max-header-size *
19
+ сносится без указания sampling-rate и max-header-size
20
+ """
21
+ result = common.default(rule, key, diff, **kwargs)
22
+ for op, cmd, ch in result:
23
+ if diff[Op.REMOVED]:
24
+ if "ingress" in diff[Op.REMOVED][0]["row"]:
25
+ yield (op, "no sflow sampling-rate direction ingress", ch)
26
+ elif "egress" in diff[Op.REMOVED][0]["row"]:
27
+ yield (op, "no sflow sampling-rate direction egress", ch)
28
+ else:
29
+ yield (op, cmd, ch)
30
+ return result
31
+
32
+
33
+ def lldp(rule, key, diff, **kwargs):
34
+ """
35
+ Не удаляем все что начинается с set, т.к. set перезаписывает предыдущий конфиг
36
+ """
37
+ result = common.default(rule, key, diff, **kwargs)
38
+ for op, cmd, ch in result:
39
+ if diff[Op.REMOVED] and "set lldp" in cmd:
40
+ pass
41
+ else:
42
+ yield (op, cmd, ch)
@@ -1,6 +1,6 @@
1
1
  # Операторы:
2
- # * Один аргумент в undo
3
- # ~ Несколько аргументов (минимум один) в undo
2
+ # * Один аргумент в no
3
+ # ~ Несколько аргументов (минимум один) в no
4
4
  #
5
5
  # Параметры:
6
6
  # %global Команда действует на любом уровне ниже
@@ -11,8 +11,13 @@
11
11
  # Сделано в основном для того чтобы генерировать специальные команды для наливки
12
12
  # -----
13
13
  # Physical
14
+ sflow *
15
+
14
16
  interface */(ce|xe)[0-9\/]+$/ %logic=common.permanent %diff_logic=cisco.iface.diff
15
17
  ipv6 address *
16
- mtu *
18
+ mtu * %logic=b4com.iface.mtu
19
+ sflow * %logic=b4com.iface.sflow
17
20
  lldp-agent
18
- ~ %rewrite %global
21
+ ~ %global %logic=b4com.iface.lldp
22
+ !dcbx *
23
+ !exit
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: annet
3
- Version: 0.16.33
3
+ Version: 0.16.34
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.1.10; extra == "netbox"
26
+ Requires-Dist: annetbox[sync]>=0.1.12; 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=I9DQpf3LU71RBk9kCUdA-RnGkA3eORngYkC3_obsLmk,9669
4
+ annet/bgp_models.py,sha256=M2gtOJMsua8SlUySc57VtG71-TmydxP1bthQEcUVpNo,9528
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
@@ -40,7 +40,7 @@ annet/adapters/netbox/common/storage_opts.py,sha256=5tt6wxUUJTIzNbOVXMnYBwZedNAI
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=G-nj-iuNN5inR0tY2XnjFnXXFYrgMZeTJ9DQ7OgjK44,10336
43
+ annet/adapters/netbox/v37/storage.py,sha256=fBs7bUyk-3KnGpuygf8skPwHZfzxPJmCVCpfzifRrYo,11458
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
@@ -55,7 +55,7 @@ annet/annlib/types.py,sha256=VHU0CBADfYmO0xzB_c5f-mcuU3dUumuJczQnqGlib9M,852
55
55
  annet/annlib/netdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
56
  annet/annlib/netdev/db.py,sha256=fI_u5aya4l61mbYSjj4JwlVfi3s7obt2jqERSuXGRUI,1634
57
57
  annet/annlib/netdev/devdb/__init__.py,sha256=aKYjjLbJebdKBjnGDpVLQdSqrV2JL24spGm58tmMWVU,892
58
- annet/annlib/netdev/devdb/data/devdb.json,sha256=Zt9pj6h2clMi0i26bGVsx0gqQl8vCSk6iLajIYWeKX4,6192
58
+ annet/annlib/netdev/devdb/data/devdb.json,sha256=DBl8iU2K_tydteB_a8mXUlgrv_Na3UXSJschuhyjsqs,6284
59
59
  annet/annlib/netdev/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  annet/annlib/netdev/views/dump.py,sha256=rIlyvnA3uM8bB_7oq1nS2KDxTp6dQh2hz-FbNhYIpOU,4630
61
61
  annet/annlib/netdev/views/hardware.py,sha256=3JCZLH7deIHhCguwPJTUX-WDvWjG_xt6BdSEZSO6zkQ,4226
@@ -66,7 +66,7 @@ annet/annlib/rbparser/ordering.py,sha256=DiKqyY8Khz-5MTxNF1GSNtZgtyKwT3YYCXpahIP
66
66
  annet/annlib/rbparser/platform.py,sha256=hnxznTfV9txXi1PkR1hZrprTrQJvlwgqXVL8vXkYmv4,1558
67
67
  annet/annlib/rbparser/syntax.py,sha256=iZ7Y-4QQBw4L3UtjEh54qisiRDhobl7HZxFNdP8mi54,3577
68
68
  annet/annlib/rulebook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
- annet/annlib/rulebook/common.py,sha256=bx_Iwui-JJeyctUPF1OsEll0Aa-IQZadBPQjaeuoWgw,16638
69
+ annet/annlib/rulebook/common.py,sha256=hqwmmNofm5q2f-hV2usMY-IPMeiANLth28tZcRBYJTw,16640
70
70
  annet/api/__init__.py,sha256=WGpVMfIxVy9F_jH6nqHSQypEEcsSNa9yF2WFEwhUVwI,34156
71
71
  annet/configs/context.yml,sha256=RVLrKLIHpCty7AGwOnmqf7Uu0iZQCn-AjYhophDJer8,259
72
72
  annet/configs/logging.yaml,sha256=EUagfir99QqA73Scc3k7sfQccbU3E1SvEQdyhLFtCl4,997
@@ -83,13 +83,13 @@ annet/generators/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
83
83
  annet/generators/common/initial.py,sha256=qYBxXFhyOPy34cxc6hsIXseod-lYCmmbuNHpM0uteY0,1244
84
84
  annet/mesh/__init__.py,sha256=lcgdnBIxc2MAN7Er1bcErEKPqrjWO4uIp_1FldMXTYg,557
85
85
  annet/mesh/basemodel.py,sha256=E6NTOneiMDwB1NCpjDRECoaeQ0f3n_fmTLnKTrSHTU4,4917
86
- annet/mesh/device_models.py,sha256=KkbD8tuWfnh4gR8iOV9C7ihLR4jxjyuF52AU2DPPLXA,3627
87
- annet/mesh/executor.py,sha256=0RLsdtldozoFgDGFuhU5mdckuMwGg0y_DFIji1RfTQg,16969
86
+ annet/mesh/device_models.py,sha256=aFbwVWNSDBcph_Kvv6qZT-uUz0Tbg3z45EvP4i1z2ao,3600
87
+ annet/mesh/executor.py,sha256=6NBi7KBZzKf_92TgxypkoBN0WhZt1egXx0qALzo9Cq8,17497
88
88
  annet/mesh/match_args.py,sha256=CR3kdIV9NGtyk9E2JbcOQ3TRuYEryTWP3m2yCo2VCWg,5751
89
89
  annet/mesh/models_converter.py,sha256=3q2zs7K8S3pfYSUKKRdtl5CJGbeg4TtYxofAVs_MBsk,3085
90
90
  annet/mesh/peer_models.py,sha256=9vn5ENiEZqOZFRFSOJReT8E3E2GzBte628mkmS3cplI,2770
91
91
  annet/mesh/port_processor.py,sha256=RHiMS5W8qoDkTKiarQ748bcr8bNx4g_R4Y4vZg2k4TU,478
92
- annet/mesh/registry.py,sha256=BCRIOrINP0krcgvF59uFJqyhmSviQ03GSzWpxLVYlIg,9527
92
+ annet/mesh/registry.py,sha256=xmWF7yxWXmwqX2_jyMAKrbGd2G9sjb4rYDx4Xk61QKc,9607
93
93
  annet/rpl/__init__.py,sha256=0kcIktE3AmS0rlm9xzVDf53xk08OeZXgD-6ZLCt_KCs,731
94
94
  annet/rpl/action.py,sha256=PY6W66j908RuqQ1_ioxayqVN-70rxDk5Z59EGHtxI98,1246
95
95
  annet/rpl/condition.py,sha256=MJri4MbWtPkLHIsLMAtsIEF7e8IAS9dIImjmJs5vS5U,3418
@@ -118,6 +118,7 @@ annet/rulebook/aruba/ap_env.py,sha256=5fUVLhXH4-0DAtv8t0yoqJUibaRMuzF8Q7mGFzNsEN
118
118
  annet/rulebook/aruba/misc.py,sha256=O0p_wsR07gtB8rm1eJvJ7VYnGm5T8Uau_SVKR9FVInI,234
119
119
  annet/rulebook/b4com/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
120
  annet/rulebook/b4com/file.py,sha256=zK7RwBk1YaVoDSFSg1u7Pt8u0Fk3nhhu27aJRngemwc,137
121
+ annet/rulebook/b4com/iface.py,sha256=0MXq01fhgd0ZxrS99TMxEP9qqIW2ofadsIBthCZVPTc,1392
121
122
  annet/rulebook/cisco/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
123
  annet/rulebook/cisco/iface.py,sha256=WISkzjp_G7WKPpg098FCIm4b7ipOxtRLOQbu-7gMUL0,1792
123
124
  annet/rulebook/cisco/misc.py,sha256=zgKdWGmjRYmvq58dh7Lbn7ofwSYZoISgXsUh5lkGKF8,2318
@@ -142,7 +143,7 @@ annet/rulebook/texts/aruba.order,sha256=ZMakkn0EJ9zomgY6VssoptJImrHrUmYnCqivzLBF
142
143
  annet/rulebook/texts/aruba.rul,sha256=zvGVpoYyJvMoL0fb1NQ8we_GCLZXno8nwWpZIOScLQQ,2584
143
144
  annet/rulebook/texts/b4com.deploy,sha256=SVX8-yLHM90tJC4M-ekpGuGM1aQZW3euSGyg67l--R0,781
144
145
  annet/rulebook/texts/b4com.order,sha256=G3aToAIHHzKzDCM3q7_lyr9wJvuVOXVbVvF3wm5PiTE,707
145
- annet/rulebook/texts/b4com.rul,sha256=5mqyUg_oLRSny2iH6QdhfDWVu6kzgDURtlSATD7DFno,1056
146
+ annet/rulebook/texts/b4com.rul,sha256=OiQroBySk33he1YNN3jOn5sGL_WDBJEejDI6F7jIWo0,1224
146
147
  annet/rulebook/texts/cisco.deploy,sha256=Hu0NkcGv3f1CWUrnbzI3eQOPXJxtH4NNOPRV68IrW4U,1226
147
148
  annet/rulebook/texts/cisco.order,sha256=OvNHMNqkCc-DN2dEjLCTKv_7ZhiaHt4q2X4Y4Z8dvR4,1901
148
149
  annet/rulebook/texts/cisco.rul,sha256=jgL5_xnSwd_H4E8cx4gcneSvJC5W1zz6_BWSb64iuxI,3017
@@ -175,10 +176,10 @@ annet_generators/rpl_example/generator.py,sha256=zndIGfV4ZlTxPgAGYs7bMQvTc_tYScO
175
176
  annet_generators/rpl_example/items.py,sha256=Ez1RF5YhcXNCusBmeApIjRL3rBlMazNZd29Gpw1_IsA,766
176
177
  annet_generators/rpl_example/mesh.py,sha256=z_WgfDZZ4xnyh3cSf75igyH09hGvtexEVwy1gCD_DzA,288
177
178
  annet_generators/rpl_example/route_policy.py,sha256=z6nPb0VDeQtKD1NIg9sFvmUxBD5tVs2frfNIuKdM-5c,2318
178
- annet-0.16.33.dist-info/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
179
- annet-0.16.33.dist-info/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
180
- annet-0.16.33.dist-info/METADATA,sha256=4FDrHTUVwwM6GIzoAZ96e3XHrSiSHvSShAY7v7jw4qg,854
181
- annet-0.16.33.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
182
- annet-0.16.33.dist-info/entry_points.txt,sha256=5lIaDGlGi3l6QQ2ry2jZaqViP5Lvt8AmsegdD0Uznck,192
183
- annet-0.16.33.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
184
- annet-0.16.33.dist-info/RECORD,,
179
+ annet-0.16.34.dist-info/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
180
+ annet-0.16.34.dist-info/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
181
+ annet-0.16.34.dist-info/METADATA,sha256=C2fqE9miXLSOMaYpyOLpD0LfEOsFpbFvndCqLqdOEhw,854
182
+ annet-0.16.34.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
183
+ annet-0.16.34.dist-info/entry_points.txt,sha256=5lIaDGlGi3l6QQ2ry2jZaqViP5Lvt8AmsegdD0Uznck,192
184
+ annet-0.16.34.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
185
+ annet-0.16.34.dist-info/RECORD,,