annet 0.16.11__tar.gz → 0.16.12__tar.gz

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.

Files changed (168) hide show
  1. {annet-0.16.11/annet.egg-info → annet-0.16.12}/PKG-INFO +1 -1
  2. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/common/client.py +3 -1
  3. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/common/storage_opts.py +8 -2
  4. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/provider.py +3 -2
  5. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/v37/storage.py +7 -0
  6. {annet-0.16.11 → annet-0.16.12}/annet/implicit.py +1 -0
  7. {annet-0.16.11 → annet-0.16.12}/annet/output.py +18 -4
  8. {annet-0.16.11 → annet-0.16.12/annet.egg-info}/PKG-INFO +1 -1
  9. {annet-0.16.11 → annet-0.16.12}/AUTHORS +0 -0
  10. {annet-0.16.11 → annet-0.16.12}/LICENSE +0 -0
  11. {annet-0.16.11 → annet-0.16.12}/MANIFEST.in +0 -0
  12. {annet-0.16.11 → annet-0.16.12}/README.md +0 -0
  13. {annet-0.16.11 → annet-0.16.12}/annet/__init__.py +0 -0
  14. {annet-0.16.11 → annet-0.16.12}/annet/adapters/__init__.py +0 -0
  15. {annet-0.16.11 → annet-0.16.12}/annet/adapters/fetchers/__init__.py +0 -0
  16. {annet-0.16.11 → annet-0.16.12}/annet/adapters/fetchers/stub/__init__.py +0 -0
  17. {annet-0.16.11 → annet-0.16.12}/annet/adapters/fetchers/stub/fetcher.py +0 -0
  18. {annet-0.16.11 → annet-0.16.12}/annet/adapters/file/__init__.py +0 -0
  19. {annet-0.16.11 → annet-0.16.12}/annet/adapters/file/provider.py +0 -0
  20. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/__init__.py +0 -0
  21. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/common/__init__.py +0 -0
  22. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/common/manufacturer.py +0 -0
  23. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/common/models.py +0 -0
  24. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/common/query.py +0 -0
  25. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/common/status_client.py +0 -0
  26. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/v24/__init__.py +0 -0
  27. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/v24/storage.py +0 -0
  28. {annet-0.16.11 → annet-0.16.12}/annet/adapters/netbox/v37/__init__.py +0 -0
  29. {annet-0.16.11 → annet-0.16.12}/annet/annet.py +0 -0
  30. {annet-0.16.11 → annet-0.16.12}/annet/annlib/__init__.py +0 -0
  31. {annet-0.16.11 → annet-0.16.12}/annet/annlib/command.py +0 -0
  32. {annet-0.16.11 → annet-0.16.12}/annet/annlib/diff.py +0 -0
  33. {annet-0.16.11 → annet-0.16.12}/annet/annlib/errors.py +0 -0
  34. {annet-0.16.11 → annet-0.16.12}/annet/annlib/filter_acl.py +0 -0
  35. {annet-0.16.11 → annet-0.16.12}/annet/annlib/jsontools.py +0 -0
  36. {annet-0.16.11 → annet-0.16.12}/annet/annlib/lib.py +0 -0
  37. {annet-0.16.11 → annet-0.16.12}/annet/annlib/netdev/__init__.py +0 -0
  38. {annet-0.16.11 → annet-0.16.12}/annet/annlib/netdev/db.py +0 -0
  39. {annet-0.16.11 → annet-0.16.12}/annet/annlib/netdev/devdb/__init__.py +0 -0
  40. {annet-0.16.11 → annet-0.16.12}/annet/annlib/netdev/devdb/data/devdb.json +0 -0
  41. {annet-0.16.11 → annet-0.16.12}/annet/annlib/netdev/views/__init__.py +0 -0
  42. {annet-0.16.11 → annet-0.16.12}/annet/annlib/netdev/views/dump.py +0 -0
  43. {annet-0.16.11 → annet-0.16.12}/annet/annlib/netdev/views/hardware.py +0 -0
  44. {annet-0.16.11 → annet-0.16.12}/annet/annlib/output.py +0 -0
  45. {annet-0.16.11 → annet-0.16.12}/annet/annlib/patching.py +0 -0
  46. {annet-0.16.11 → annet-0.16.12}/annet/annlib/rbparser/__init__.py +0 -0
  47. {annet-0.16.11 → annet-0.16.12}/annet/annlib/rbparser/acl.py +0 -0
  48. {annet-0.16.11 → annet-0.16.12}/annet/annlib/rbparser/deploying.py +0 -0
  49. {annet-0.16.11 → annet-0.16.12}/annet/annlib/rbparser/ordering.py +0 -0
  50. {annet-0.16.11 → annet-0.16.12}/annet/annlib/rbparser/platform.py +0 -0
  51. {annet-0.16.11 → annet-0.16.12}/annet/annlib/rbparser/syntax.py +0 -0
  52. {annet-0.16.11 → annet-0.16.12}/annet/annlib/rulebook/__init__.py +0 -0
  53. {annet-0.16.11 → annet-0.16.12}/annet/annlib/rulebook/common.py +0 -0
  54. {annet-0.16.11 → annet-0.16.12}/annet/annlib/tabparser.py +0 -0
  55. {annet-0.16.11 → annet-0.16.12}/annet/annlib/types.py +0 -0
  56. {annet-0.16.11 → annet-0.16.12}/annet/api/__init__.py +0 -0
  57. {annet-0.16.11 → annet-0.16.12}/annet/argparse.py +0 -0
  58. {annet-0.16.11 → annet-0.16.12}/annet/bgp_models.py +0 -0
  59. {annet-0.16.11 → annet-0.16.12}/annet/cli.py +0 -0
  60. {annet-0.16.11 → annet-0.16.12}/annet/cli_args.py +0 -0
  61. {annet-0.16.11 → annet-0.16.12}/annet/configs/context.yml +0 -0
  62. {annet-0.16.11 → annet-0.16.12}/annet/configs/logging.yaml +0 -0
  63. {annet-0.16.11 → annet-0.16.12}/annet/connectors.py +0 -0
  64. {annet-0.16.11 → annet-0.16.12}/annet/deploy.py +0 -0
  65. {annet-0.16.11 → annet-0.16.12}/annet/diff.py +0 -0
  66. {annet-0.16.11 → annet-0.16.12}/annet/executor.py +0 -0
  67. {annet-0.16.11 → annet-0.16.12}/annet/filtering.py +0 -0
  68. {annet-0.16.11 → annet-0.16.12}/annet/gen.py +0 -0
  69. {annet-0.16.11 → annet-0.16.12}/annet/generators/__init__.py +0 -0
  70. {annet-0.16.11 → annet-0.16.12}/annet/generators/base.py +0 -0
  71. {annet-0.16.11 → annet-0.16.12}/annet/generators/common/__init__.py +0 -0
  72. {annet-0.16.11 → annet-0.16.12}/annet/generators/common/initial.py +0 -0
  73. {annet-0.16.11 → annet-0.16.12}/annet/generators/entire.py +0 -0
  74. {annet-0.16.11 → annet-0.16.12}/annet/generators/exceptions.py +0 -0
  75. {annet-0.16.11 → annet-0.16.12}/annet/generators/jsonfragment.py +0 -0
  76. {annet-0.16.11 → annet-0.16.12}/annet/generators/partial.py +0 -0
  77. {annet-0.16.11 → annet-0.16.12}/annet/generators/perf.py +0 -0
  78. {annet-0.16.11 → annet-0.16.12}/annet/generators/ref.py +0 -0
  79. {annet-0.16.11 → annet-0.16.12}/annet/generators/result.py +0 -0
  80. {annet-0.16.11 → annet-0.16.12}/annet/hardware.py +0 -0
  81. {annet-0.16.11 → annet-0.16.12}/annet/lib.py +0 -0
  82. {annet-0.16.11 → annet-0.16.12}/annet/mesh/__init__.py +0 -0
  83. {annet-0.16.11 → annet-0.16.12}/annet/mesh/basemodel.py +0 -0
  84. {annet-0.16.11 → annet-0.16.12}/annet/mesh/device_models.py +0 -0
  85. {annet-0.16.11 → annet-0.16.12}/annet/mesh/executor.py +0 -0
  86. {annet-0.16.11 → annet-0.16.12}/annet/mesh/match_args.py +0 -0
  87. {annet-0.16.11 → annet-0.16.12}/annet/mesh/models_converter.py +0 -0
  88. {annet-0.16.11 → annet-0.16.12}/annet/mesh/peer_models.py +0 -0
  89. {annet-0.16.11 → annet-0.16.12}/annet/mesh/registry.py +0 -0
  90. {annet-0.16.11 → annet-0.16.12}/annet/parallel.py +0 -0
  91. {annet-0.16.11 → annet-0.16.12}/annet/patching.py +0 -0
  92. {annet-0.16.11 → annet-0.16.12}/annet/reference.py +0 -0
  93. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/__init__.py +0 -0
  94. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/arista/__init__.py +0 -0
  95. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/arista/iface.py +0 -0
  96. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/aruba/__init__.py +0 -0
  97. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/aruba/ap_env.py +0 -0
  98. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/aruba/misc.py +0 -0
  99. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/b4com/__init__.py +0 -0
  100. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/b4com/file.py +0 -0
  101. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/cisco/__init__.py +0 -0
  102. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/cisco/iface.py +0 -0
  103. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/cisco/misc.py +0 -0
  104. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/cisco/vlandb.py +0 -0
  105. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/common.py +0 -0
  106. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/deploying.py +0 -0
  107. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/huawei/__init__.py +0 -0
  108. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/huawei/aaa.py +0 -0
  109. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/huawei/bgp.py +0 -0
  110. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/huawei/iface.py +0 -0
  111. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/huawei/misc.py +0 -0
  112. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/huawei/vlandb.py +0 -0
  113. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/juniper/__init__.py +0 -0
  114. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/nexus/__init__.py +0 -0
  115. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/nexus/iface.py +0 -0
  116. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/patching.py +0 -0
  117. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/ribbon/__init__.py +0 -0
  118. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/routeros/__init__.py +0 -0
  119. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/routeros/file.py +0 -0
  120. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/arista.deploy +0 -0
  121. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/arista.order +0 -0
  122. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/arista.rul +0 -0
  123. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/aruba.deploy +0 -0
  124. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/aruba.order +0 -0
  125. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/aruba.rul +0 -0
  126. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/b4com.deploy +0 -0
  127. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/b4com.order +0 -0
  128. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/b4com.rul +0 -0
  129. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/cisco.deploy +0 -0
  130. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/cisco.order +0 -0
  131. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/cisco.rul +0 -0
  132. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/huawei.deploy +0 -0
  133. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/huawei.order +0 -0
  134. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/huawei.rul +0 -0
  135. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/juniper.rul +0 -0
  136. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/nexus.deploy +0 -0
  137. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/nexus.order +0 -0
  138. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/nexus.rul +0 -0
  139. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/nokia.rul +0 -0
  140. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/optixtrans.deploy +0 -0
  141. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/optixtrans.order +0 -0
  142. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/optixtrans.rul +0 -0
  143. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/pc.deploy +0 -0
  144. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/pc.order +0 -0
  145. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/pc.rul +0 -0
  146. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/ribbon.deploy +0 -0
  147. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/ribbon.rul +0 -0
  148. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/routeros.order +0 -0
  149. {annet-0.16.11 → annet-0.16.12}/annet/rulebook/texts/routeros.rul +0 -0
  150. {annet-0.16.11 → annet-0.16.12}/annet/storage.py +0 -0
  151. {annet-0.16.11 → annet-0.16.12}/annet/tabparser.py +0 -0
  152. {annet-0.16.11 → annet-0.16.12}/annet/text_term_format.py +0 -0
  153. {annet-0.16.11 → annet-0.16.12}/annet/tracing.py +0 -0
  154. {annet-0.16.11 → annet-0.16.12}/annet/types.py +0 -0
  155. {annet-0.16.11 → annet-0.16.12}/annet.egg-info/SOURCES.txt +0 -0
  156. {annet-0.16.11 → annet-0.16.12}/annet.egg-info/dependency_links.txt +0 -0
  157. {annet-0.16.11 → annet-0.16.12}/annet.egg-info/entry_points.txt +0 -0
  158. {annet-0.16.11 → annet-0.16.12}/annet.egg-info/requires.txt +0 -0
  159. {annet-0.16.11 → annet-0.16.12}/annet.egg-info/top_level.txt +0 -0
  160. {annet-0.16.11 → annet-0.16.12}/annet_generators/__init__.py +0 -0
  161. {annet-0.16.11 → annet-0.16.12}/annet_generators/example/__init__.py +0 -0
  162. {annet-0.16.11 → annet-0.16.12}/annet_generators/example/lldp.py +0 -0
  163. {annet-0.16.11 → annet-0.16.12}/annet_generators/mesh_example/__init__.py +0 -0
  164. {annet-0.16.11 → annet-0.16.12}/annet_generators/mesh_example/bgp.py +0 -0
  165. {annet-0.16.11 → annet-0.16.12}/annet_generators/mesh_example/mesh_logic.py +0 -0
  166. {annet-0.16.11 → annet-0.16.12}/requirements.txt +0 -0
  167. {annet-0.16.11 → annet-0.16.12}/setup.cfg +0 -0
  168. {annet-0.16.11 → annet-0.16.12}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: annet
3
- Version: 0.16.11
3
+ Version: 0.16.12
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
@@ -79,9 +79,11 @@ def collect(func: Func, field: str = "", batch_size: int = 100) -> Func:
79
79
 
80
80
 
81
81
  class BaseNetboxClient(RequestsClient):
82
- def __init__(self, url: str, token: str):
82
+ def __init__(self, url: str, token: str, insecure: bool = False):
83
83
  url = url.rstrip("/") + "/api/"
84
84
  session = Session()
85
+ if insecure:
86
+ session.verify = False
85
87
  if token:
86
88
  session.headers["Authorization"] = f"Token {token}"
87
89
  super().__init__(url, session)
@@ -5,12 +5,18 @@ DEFAULT_URL = "http://localhost"
5
5
 
6
6
 
7
7
  class NetboxStorageOpts:
8
- def __init__(self, url: str, token: str):
8
+ def __init__(self, url: str, token: str, insecure: bool = False):
9
9
  self.url = url
10
10
  self.token = token
11
+ self.insecure = insecure
11
12
 
12
13
  @classmethod
13
14
  def parse_params(cls, conf_params: Optional[dict[str, str]], cli_opts: Any):
14
15
  url = os.getenv("NETBOX_URL") or conf_params.get("url") or DEFAULT_URL
15
16
  token = os.getenv("NETBOX_TOKEN", "").strip() or conf_params.get("token") or ""
16
- return cls(url=url, token=token)
17
+ insecure = False
18
+ if insecure_env := os.getenv("NETBOX_INSECURE", "").lower():
19
+ insecure = insecure_env in ("true", "1", "t")
20
+ else:
21
+ insecure = bool(conf_params.get("insecure") or False)
22
+ return cls(url=url, token=token, insecure=insecure)
@@ -12,7 +12,7 @@ from .v37.storage import NetboxStorageV37
12
12
 
13
13
 
14
14
  def storage_factory(opts: NetboxStorageOpts) -> Storage:
15
- client = NetboxStatusClient(opts.url, opts.token)
15
+ client = NetboxStatusClient(opts.url, opts.token, opts.insecure)
16
16
  try:
17
17
  status = client.status()
18
18
  except ClientError as e:
@@ -27,9 +27,10 @@ def storage_factory(opts: NetboxStorageOpts) -> Storage:
27
27
 
28
28
 
29
29
  class NetboxProvider(StorageProvider, AdapterWithName, AdapterWithConfig):
30
- def __init__(self, url: Optional[str] = None, token: Optional[str] = None):
30
+ def __init__(self, url: Optional[str] = None, token: Optional[str] = None, insecure: bool = False):
31
31
  self.url = url
32
32
  self.token = token
33
+ self.insecure = insecure
33
34
 
34
35
  @classmethod
35
36
  def with_config(cls, **kwargs: Dict[str, Any]) -> T:
@@ -2,6 +2,7 @@ from logging import getLogger
2
2
  from typing import Any, Optional, List, Union, Dict
3
3
  from ipaddress import ip_interface
4
4
  from collections import defaultdict
5
+ import ssl
5
6
 
6
7
  from adaptix import P
7
8
  from adaptix.conversion import impl_converter, link, link_constant
@@ -86,9 +87,15 @@ def extend_ip_address(
86
87
 
87
88
  class NetboxStorageV37(Storage):
88
89
  def __init__(self, opts: Optional[NetboxStorageOpts] = None):
90
+ ctx: ssl.con | ssl.SSLContext = None
91
+ if opts.insecure:
92
+ ctx = ssl.create_default_context()
93
+ ctx.check_hostname = False
94
+ ctx.verify_mode = ssl.CERT_NONE
89
95
  self.netbox = NetboxV37(
90
96
  url=opts.url,
91
97
  token=opts.token,
98
+ ssl_context=ctx,
92
99
  )
93
100
  self._all_fqdns: Optional[list[str]] = None
94
101
 
@@ -46,6 +46,7 @@ def _implicit_tree(device):
46
46
  !user-interface vty ~
47
47
  protocol inbound all
48
48
  netconf
49
+ port link-flap trigger error-down
49
50
  """
50
51
  elif device.hw.Huawei.NE:
51
52
  text = """
@@ -2,9 +2,12 @@ import abc
2
2
  import os
3
3
  import posixpath
4
4
  import sys
5
- from typing import List, Optional, Tuple, Type, Dict
5
+ from typing import Dict, List, Optional, Tuple, Type
6
+ from urllib.parse import urlparse
6
7
 
7
8
  import colorama
9
+ from contextlog import get_logger
10
+
8
11
  from annet.annlib.output import ( # pylint: disable=unused-import
9
12
  LABEL_NEW_PREFIX,
10
13
  OutputWriter,
@@ -17,8 +20,6 @@ from annet.annlib.output import ( # pylint: disable=unused-import
17
20
  print_err_label,
18
21
  print_label,
19
22
  )
20
- from contextlog import get_logger
21
-
22
23
  from annet.cli_args import FileOutOptions, QueryOptions
23
24
  from annet.connectors import Connector
24
25
  from annet.storage import Device, storage_connector
@@ -112,9 +113,11 @@ class OutputDriverBasic(OutputDriver):
112
113
  if label.startswith(os.sep):
113
114
  # just in case.
114
115
  label = label.lstrip(os.sep)
116
+
115
117
  if os.sep not in label:
116
118
  # vendor config
117
119
  label = os.path.basename(label)
120
+
118
121
  else:
119
122
  # entire generated file
120
123
  parts = label.split(os.sep)
@@ -125,6 +128,7 @@ class OutputDriverBasic(OutputDriver):
125
128
  if query_result_count > 1 or arg_out.dest_force_create_dir:
126
129
  label = os.path.join(hostname, label)
127
130
  file_dest = os.path.join(dest, "errors") if is_fail else dest
131
+
128
132
  out_file = os.path.normpath(os.path.join(file_dest, label))
129
133
  logger.info("writing '%s'", out_file)
130
134
  dirname = os.path.dirname(out_file)
@@ -164,12 +168,22 @@ class OutputDriverBasic(OutputDriver):
164
168
  >>>
165
169
  ```
166
170
  """
171
+
167
172
  # NOTE: с полученным `config_path` работаем через `posixpath`, а не через `os.path`, потому что
168
173
  # entire-путь POSIX-специфичный; но в конце формируем путь через `os.path` для текущей платформы
169
174
  if not posixpath.abspath(config_path):
170
175
  raise RuntimeError(f"Want absolute config path, but relative received: {config_path}")
176
+
171
177
  cfg_files = self.cfg_file_names(device)
172
- # NOTE: получаем путь без "/" в начале, например, "etc/frr/frr.conf"
178
+
179
+ parsed_config_path = urlparse(config_path)
180
+ scheme, config_path = parsed_config_path.scheme or "file", parsed_config_path.path
181
+
173
182
  relative_config_path = posixpath.relpath(config_path, "/")
183
+ if scheme != "file":
184
+ host = parsed_config_path.hostname + f":{parsed_config_path.port}" if parsed_config_path.port else ""
185
+ relative_config_path = os.path.join(host, relative_config_path)
186
+
174
187
  dest_config_path_parts = [cfg_files[0]] + relative_config_path.split(posixpath.sep)
188
+
175
189
  return os.path.join(*dest_config_path_parts)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: annet
3
- Version: 0.16.11
3
+ Version: 0.16.12
4
4
  Summary: annet
5
5
  Home-page: https://github.com/annetutil/annet
6
6
  License: MIT
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes