annet 3.11.0__py3-none-any.whl → 3.12.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.

@@ -47,7 +47,7 @@ class NetboxAdapter(
47
47
  ],
48
48
  ):
49
49
  @abstractmethod
50
- def list_all_fqdns(self) -> list[str]:
50
+ def list_fqdns(self, query: dict[str, list[str]] | None = None) -> list[str]:
51
51
  raise NotImplementedError()
52
52
 
53
53
  @abstractmethod
@@ -37,19 +37,7 @@ class NetboxQuery(Query):
37
37
  return self.query
38
38
 
39
39
  def parse_query(self) -> Filter:
40
- query_groups = defaultdict(list)
41
- for q in self.globs:
42
- if FIELD_VALUE_SEPARATOR in q:
43
- glob_type, param = q.split(FIELD_VALUE_SEPARATOR, 2)
44
- if glob_type not in ALLOWED_GLOB_GROUPS:
45
- raise Exception(f"unknown query type: '{glob_type}'")
46
- if not param:
47
- raise Exception(f"empty param for '{glob_type}'")
48
- query_groups[glob_type].append(param)
49
- else:
50
- query_groups["name"].append(q)
51
-
52
- query_groups.default_factory = None
40
+ query_groups = parse_query(self.globs)
53
41
  return cast(Filter, query_groups)
54
42
 
55
43
  def is_empty(self) -> bool:
@@ -62,3 +50,18 @@ class NetboxQuery(Query):
62
50
  if FIELD_VALUE_SEPARATOR in q:
63
51
  return False
64
52
  return True
53
+
54
+
55
+ def parse_query(query: list[str]) -> dict[str, list[str]]:
56
+ query_groups = defaultdict(list)
57
+ for q in query:
58
+ if FIELD_VALUE_SEPARATOR in q:
59
+ glob_type, param = q.split(FIELD_VALUE_SEPARATOR, 2)
60
+ if glob_type not in ALLOWED_GLOB_GROUPS:
61
+ raise Exception(f"unknown query type: '{glob_type}'")
62
+ if not param:
63
+ raise Exception(f"empty param for '{glob_type}'")
64
+ query_groups[glob_type].append(param)
65
+ else:
66
+ query_groups["name"].append(q)
67
+ return dict(query_groups)
@@ -54,6 +54,7 @@ class BaseNetboxStorage(
54
54
  token = opts.token
55
55
  threads = opts.threads
56
56
  self.exact_host_filter = opts.exact_host_filter
57
+ self.all_hosts_filter = opts.all_hosts_filter
57
58
  self.netbox = self._init_adapter(url=url, token=token, ssl_context=ctx, threads=threads)
58
59
  self._all_fqdns: Optional[list[str]] = None
59
60
  self._id_devices: dict[int, NetboxDeviceT] = {}
@@ -87,7 +88,7 @@ class BaseNetboxStorage(
87
88
 
88
89
  def resolve_all_fdnds(self) -> list[str]:
89
90
  if self._all_fqdns is None:
90
- self._all_fqdns = self.netbox.list_all_fqdns()
91
+ self._all_fqdns = self.netbox.list_fqdns(self.all_hosts_filter)
91
92
  return self._all_fqdns
92
93
 
93
94
  def make_devices(
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  from typing import Any, Optional
3
+ from .query import parse_query
3
4
 
4
5
  DEFAULT_URL = "http://localhost"
5
6
 
@@ -12,17 +13,24 @@ class NetboxStorageOpts:
12
13
  insecure: bool = False,
13
14
  exact_host_filter: bool = False,
14
15
  threads: int = 1,
16
+ all_hosts_filter: dict[str, list[str]] | None = None,
15
17
  ):
16
18
  self.url = url
17
19
  self.token = token
18
20
  self.insecure = insecure
19
21
  self.exact_host_filter = exact_host_filter
20
22
  self.threads = threads
23
+ self.all_hosts_filter: dict[str, list[str]] = all_hosts_filter or {}
21
24
 
22
25
  @classmethod
23
26
  def parse_params(cls, conf_params: Optional[dict[str, str]], cli_opts: Any):
24
27
  url = os.getenv("NETBOX_URL") or conf_params.get("url") or DEFAULT_URL
25
28
  token = os.getenv("NETBOX_TOKEN", "").strip() or conf_params.get("token") or ""
29
+ all_hosts_filter = None
30
+ if all_hosts_filter_env := os.getenv("NETBOX_ALL_HOSTS_FILTER", "").strip():
31
+ all_hosts_filter = parse_query(all_hosts_filter_env.split(","))
32
+ elif all_hosts_filter_params := conf_params.get("all_hosts_filter"):
33
+ all_hosts_filter = all_hosts_filter_params
26
34
  threads = os.getenv("NETBOX_CLIENT_THREADS", "").strip() or conf_params.get("threads") or "1"
27
35
  insecure = False
28
36
  if insecure_env := os.getenv("NETBOX_INSECURE", "").lower():
@@ -39,4 +47,5 @@ class NetboxStorageOpts:
39
47
  insecure=insecure,
40
48
  exact_host_filter=exact_host_filter,
41
49
  threads=int(threads),
50
+ all_hosts_filter=all_hosts_filter,
42
51
  )
@@ -70,10 +70,11 @@ class NetboxV37Adapter(NetboxAdapter[
70
70
  list[FHRPGroupV37],
71
71
  )
72
72
 
73
- def list_all_fqdns(self) -> list[str]:
73
+ def list_fqdns(self, query: dict[str, list[str]] | None = None) -> list[str]:
74
+ query = query or {}
74
75
  return [
75
76
  d.name
76
- for d in self.netbox.dcim_all_devices_brief().results
77
+ for d in self.netbox.dcim_all_devices_brief(**query).results
77
78
  ]
78
79
 
79
80
  def list_devices(self, query: dict[str, list[str]]) -> list[NetboxDeviceV37]:
@@ -71,10 +71,11 @@ class NetboxV41Adapter(NetboxAdapter[
71
71
  list[FHRPGroupV41],
72
72
  )
73
73
 
74
- def list_all_fqdns(self) -> list[str]:
74
+ def list_fqdns(self, query: dict[str, list[str]] | None = None) -> list[str]:
75
+ query = query or {}
75
76
  return [
76
77
  d.name
77
- for d in self.netbox.dcim_all_devices_brief().results
78
+ for d in self.netbox.dcim_all_devices_brief(**query).results
78
79
  ]
79
80
 
80
81
  def list_devices(self, query: dict[str, list[str]]) -> list[NetboxDeviceV41]:
@@ -72,10 +72,11 @@ class NetboxV42Adapter(NetboxAdapter[
72
72
  list[FHRPGroupV41],
73
73
  )
74
74
 
75
- def list_all_fqdns(self) -> list[str]:
75
+ def list_fqdns(self, query: dict[str, list[str]] | None = None) -> list[str]:
76
+ query = query or {}
76
77
  return [
77
78
  d.name
78
- for d in self.netbox.dcim_all_devices_brief().results
79
+ for d in self.netbox.dcim_all_devices_brief(**query).results
79
80
  ]
80
81
 
81
82
  def list_devices(self, query: dict[str, list[str]]) -> list[NetboxDeviceV42]:
annet/api/__init__.py CHANGED
@@ -331,7 +331,16 @@ def diff(
331
331
  loader: ann_gen.Loader,
332
332
  device_ids: List[Any]
333
333
  ) -> tuple[Mapping[Device, Union[Diff, PCDiff]], Mapping[Device, Exception]]:
334
- """ Сгенерировать конфиг для устройств """
334
+ """ Сгенерировать дифф для устройств """
335
+ if args.config == "running":
336
+ fetcher = annet.deploy.get_fetcher()
337
+ ann_gen.live_configs = annet.lib.do_async(
338
+ fetcher.fetch(
339
+ [device for device in loader.devices if device.id in device_ids],
340
+ processes=args.parallel
341
+ ),
342
+ new_thread=True
343
+ )
335
344
  stdin = args.stdin(filter_acl=args.filter_acl, config=None)
336
345
 
337
346
  filterer = filtering.filterer_connector.get()
@@ -200,9 +200,11 @@ aaa
200
200
 
201
201
  hwtacacs-server template *
202
202
  hwtacacs-server shared-key
203
+ hwtacacs-server source-ip
203
204
 
204
205
  hwtacacs server template *
205
206
  hwtacacs server shared-key
207
+ hwtacacs server source-ip
206
208
 
207
209
  !radius-server template default
208
210
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: annet
3
- Version: 3.11.0
3
+ Version: 3.12.1
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
@@ -30,26 +30,26 @@ annet/adapters/file/provider.py,sha256=3hNt0QQg46SVymLQ4Bh9G4VNYyhnB7gV5yu5OiIJp
30
30
  annet/adapters/netbox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
31
  annet/adapters/netbox/provider.py,sha256=K6P5I2UjGZ3N3ayoUaVw10mf9lE5SD8W0kpB7TSefNA,2272
32
32
  annet/adapters/netbox/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- annet/adapters/netbox/common/adapter.py,sha256=L9xFMcYk7E7w6MH8N0qdg8h-CSP4nZzrOMFlw0_33EU,2600
33
+ annet/adapters/netbox/common/adapter.py,sha256=1rR9PZAU72hIreozWFVb9CKpFVjfUH_i9kQEbaNiEUI,2639
34
34
  annet/adapters/netbox/common/client.py,sha256=PaxHG4W9H8_uunIwMBNYkLq4eQJYoO6p6gY-ciQs7Nc,2563
35
35
  annet/adapters/netbox/common/manufacturer.py,sha256=9jTfzwx5XmETrjSbIJu_FhNaByaUbGQE787c5rBor-4,1137
36
36
  annet/adapters/netbox/common/models.py,sha256=wm0aIxsv7nvQfCXoqI5sWSxRW3guLCB_aQU7KDiB0YY,8925
37
- annet/adapters/netbox/common/query.py,sha256=kbNQSZwkjFeDArHwA8INHUauxCxYElXtNh58pZipWdo,1867
37
+ annet/adapters/netbox/common/query.py,sha256=0GeIiW_ttnESaNKHIziF61P-3DX0XD592UHQGn_1m60,1911
38
38
  annet/adapters/netbox/common/status_client.py,sha256=POaqiQJ0jPcqUQH-X_fWHVnKB7TBYveNriaT0eNTlfI,769
39
- annet/adapters/netbox/common/storage_base.py,sha256=GVF30gV4X828MPhUOZ3HsNhWvYp0J5k6LoRFd2UOk7c,9712
40
- annet/adapters/netbox/common/storage_opts.py,sha256=wfv1spElomwgVYMCgGth3SWVF0RsRgtUgq9GpFL9hJs,1520
39
+ annet/adapters/netbox/common/storage_base.py,sha256=lMRiDkzQylpA5Fxa4B6CUOWzq2d1cpjeSDbFGp8jH7o,9787
40
+ annet/adapters/netbox/common/storage_opts.py,sha256=8LCxX0m-Wd-jNZ2iRAzkBJnbDg-MuE7RS17uPxjZo3o,2066
41
41
  annet/adapters/netbox/v24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
42
  annet/adapters/netbox/v24/models.py,sha256=RH2ooUPHOtHT0q1ZQE7v23FgmcsGenzzSgJyft13o1k,7605
43
43
  annet/adapters/netbox/v24/storage.py,sha256=zptzrW4aZUv_exuGw0DqQPm_kXZR3DwL4zRHYL6twTk,6219
44
44
  annet/adapters/netbox/v37/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  annet/adapters/netbox/v37/models.py,sha256=LTjotRcTYWUR3KFvdg3LjBhek4OQblOvJr5yvP9AAPg,1940
46
- annet/adapters/netbox/v37/storage.py,sha256=XBYuDvNWngofXf7Kiy-V-AyGXfIszP8UQyf1N0Obq5c,5041
46
+ annet/adapters/netbox/v37/storage.py,sha256=1CO1s1lM01vjN5o6MOF-WK7nHsY8cSJg5KrAj4Z-N8Y,5115
47
47
  annet/adapters/netbox/v41/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
48
  annet/adapters/netbox/v41/models.py,sha256=RI8QHpNIcrXNubis1rUFJ1j9bL881fz4meLXvAY8Yi0,2197
49
- annet/adapters/netbox/v41/storage.py,sha256=kK_oyWNa_Ha2vSk66ca4Uxq9OZsep3y2XsRWrLp_L-Q,5095
49
+ annet/adapters/netbox/v41/storage.py,sha256=FDdaUugvFEMACSRLW8T8HRv_1V7VbTN95u5wvIgt4Mo,5169
50
50
  annet/adapters/netbox/v42/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
51
  annet/adapters/netbox/v42/models.py,sha256=JNrBMeZ1SznjRzaqKNBP5jtHEKHN40X1V-BlgrMpKwE,2054
52
- annet/adapters/netbox/v42/storage.py,sha256=zScnvOqjPuS39vwXcE-QDkCUosBr-nafDdgFA4jzioY,6022
52
+ annet/adapters/netbox/v42/storage.py,sha256=mXswX_wqXIcRFKAyTbjYkPR2IIm9_SNeGJDBw9-ZIl8,6096
53
53
  annet/annlib/__init__.py,sha256=fT1l4xV5fqqg8HPw9HqmZVN2qwS8i6X1aIm2zGDjxKY,252
54
54
  annet/annlib/command.py,sha256=GsgzQ8oFiHFan1Tfyo340rWgfhyU4_sCKJGhBm2jG6Y,1258
55
55
  annet/annlib/diff.py,sha256=MZ6eQAU3cadQp8KaSE6uAYFtcfMDCIe_eNuVROnYkCk,4496
@@ -75,7 +75,7 @@ annet/annlib/rbparser/platform.py,sha256=d1jFH8hGMOf_qiveKE4H-c0OfNnzwmt2VYpSiSO
75
75
  annet/annlib/rbparser/syntax.py,sha256=PlKyWqS3zwPwumILmKIci-DmEAbfZp8YycpW1mNqADM,3602
76
76
  annet/annlib/rulebook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  annet/annlib/rulebook/common.py,sha256=6A3sOkOanDRTuR7F426zakShGaGKRBmBLDCnqBbBJr8,13531
78
- annet/api/__init__.py,sha256=-VLQ-Uf2WSdNHXirzdMjgaY8UzrXbGpPHmUnwzB_5YI,33763
78
+ annet/api/__init__.py,sha256=yVF4742g45sdvVDtJrM4pIwchy5AsxROEmXcz31xFno,34090
79
79
  annet/configs/context.yml,sha256=RVLrKLIHpCty7AGwOnmqf7Uu0iZQCn-AjYhophDJer8,259
80
80
  annet/configs/logging.yaml,sha256=EUagfir99QqA73Scc3k7sfQccbU3E1SvEQdyhLFtCl4,997
81
81
  annet/generators/__init__.py,sha256=LnW6G_7K5ScGYkFjFk7_QfuUaFAk5oTSHYaTaL6xUwA,16735
@@ -160,7 +160,7 @@ annet/rulebook/texts/cisco.order,sha256=DarNICBBAEXR8VOFV8SNnuQmwGAG-TGwXlMWpFMT
160
160
  annet/rulebook/texts/cisco.rul,sha256=cX9CyqKpgpr8B1Qe3aEe66wZpfaGg7fmsIsmgW6Yip4,3619
161
161
  annet/rulebook/texts/huawei.deploy,sha256=5vrvhai2BjaJ793A3EHHCthic3dnGKp2_rAgViVIouI,10951
162
162
  annet/rulebook/texts/huawei.order,sha256=4qXuoqfJ8Hck11LACKwaWP2ARHwPrtLfCut1BDRAg7E,11244
163
- annet/rulebook/texts/huawei.rul,sha256=-Da3qjDaAWeW1IFMsLmAzo8XTCkqc2PGTqPGV8v3btA,13705
163
+ annet/rulebook/texts/huawei.rul,sha256=xVGFGOidwnQPaMbXhQCRuk-yUEMVTl5A9_TsOxQbjNY,13765
164
164
  annet/rulebook/texts/iosxr.deploy,sha256=Hu0NkcGv3f1CWUrnbzI3eQOPXJxtH4NNOPRV68IrW4U,1226
165
165
  annet/rulebook/texts/iosxr.order,sha256=gUp6XHwzqkDsArCUAwtx3rR1qlGfYsHy2vP9oZN2oDk,1922
166
166
  annet/rulebook/texts/iosxr.rul,sha256=JMFJ94ORNeDQo_X73iPS6pFUmXYTBuL5pkUypgHcOig,2966
@@ -199,8 +199,8 @@ annet/vendors/library/optixtrans.py,sha256=VdME69Ca4HAEgoaKN21fZxnmmsqqaxOe_HZja
199
199
  annet/vendors/library/pc.py,sha256=vfv31_NPi7M-4AUDL89UcpawK2E6xvCpELA209cd1ho,1086
200
200
  annet/vendors/library/ribbon.py,sha256=DDOBq-_-FL9dCxqXs2inEWZ-pvw-dJ-A-prA7cKMhec,1216
201
201
  annet/vendors/library/routeros.py,sha256=iQa7m_4wjuvcgBOI9gyZwlw1BvzJfOkvUbyoEk-NI9I,1254
202
- annet-3.11.0.dist-info/licenses/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
203
- annet-3.11.0.dist-info/licenses/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
202
+ annet-3.12.1.dist-info/licenses/AUTHORS,sha256=rh3w5P6gEgqmuC-bw-HB68vBCr-yIBFhVL0PG4hguLs,878
203
+ annet-3.12.1.dist-info/licenses/LICENSE,sha256=yPxl7dno02Pw7gAcFPIFONzx_gapwDoPXsIsh6Y7lC0,1079
204
204
  annet_generators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
205
205
  annet_generators/example/__init__.py,sha256=OJ77uj8axc-FIyIu_Xdcnzmde3oQW5mk5qbODkhuVc8,355
206
206
  annet_generators/example/hostname.py,sha256=RloLzNVetEoWPLITzfJ13Nk3CC0yi-cZB1RTd6dnuhI,2541
@@ -213,8 +213,8 @@ annet_generators/rpl_example/generator.py,sha256=EWah19gOH8G-QyNyWqxCqdRi0BK7GbM
213
213
  annet_generators/rpl_example/items.py,sha256=HPgxScDvSqJPdz0c2SppDrH82DZYC4zUaniQwcWmh4A,1176
214
214
  annet_generators/rpl_example/mesh.py,sha256=z_WgfDZZ4xnyh3cSf75igyH09hGvtexEVwy1gCD_DzA,288
215
215
  annet_generators/rpl_example/route_policy.py,sha256=z6nPb0VDeQtKD1NIg9sFvmUxBD5tVs2frfNIuKdM-5c,2318
216
- annet-3.11.0.dist-info/METADATA,sha256=uYU_GEvY0GCOzto2G9wko7JhgNLj8tP09uUGSg5nP2s,816
217
- annet-3.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
218
- annet-3.11.0.dist-info/entry_points.txt,sha256=5lIaDGlGi3l6QQ2ry2jZaqViP5Lvt8AmsegdD0Uznck,192
219
- annet-3.11.0.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
220
- annet-3.11.0.dist-info/RECORD,,
216
+ annet-3.12.1.dist-info/METADATA,sha256=h3TdAar1jeXr59n35Bw4ZfU5VlHSVsKov-8y5kXEwMA,816
217
+ annet-3.12.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
218
+ annet-3.12.1.dist-info/entry_points.txt,sha256=5lIaDGlGi3l6QQ2ry2jZaqViP5Lvt8AmsegdD0Uznck,192
219
+ annet-3.12.1.dist-info/top_level.txt,sha256=QsoTZBsUtwp_FEcmRwuN8QITBmLOZFqjssRfKilGbP8,23
220
+ annet-3.12.1.dist-info/RECORD,,
File without changes