scrapli 2024.7.30__py3-none-any.whl → 2024.7.30.post1__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.
Files changed (32) hide show
  1. scrapli/__init__.py +1 -1
  2. scrapli/channel/base_channel.py +2 -2
  3. scrapli/decorators.py +1 -1
  4. scrapli/driver/base/base_driver.py +2 -2
  5. scrapli/driver/core/arista_eos/async_driver.py +1 -1
  6. scrapli/driver/core/arista_eos/base_driver.py +3 -2
  7. scrapli/driver/core/arista_eos/sync_driver.py +1 -1
  8. scrapli/driver/core/cisco_iosxe/async_driver.py +1 -1
  9. scrapli/driver/core/cisco_iosxe/sync_driver.py +1 -1
  10. scrapli/driver/core/cisco_iosxr/async_driver.py +1 -1
  11. scrapli/driver/core/cisco_iosxr/sync_driver.py +1 -1
  12. scrapli/driver/core/cisco_nxos/async_driver.py +1 -1
  13. scrapli/driver/core/cisco_nxos/sync_driver.py +1 -1
  14. scrapli/driver/core/juniper_junos/async_driver.py +1 -1
  15. scrapli/driver/core/juniper_junos/sync_driver.py +1 -1
  16. scrapli/driver/generic/async_driver.py +5 -4
  17. scrapli/driver/generic/base_driver.py +5 -1
  18. scrapli/driver/generic/sync_driver.py +6 -5
  19. scrapli/driver/network/async_driver.py +1 -1
  20. scrapli/driver/network/base_driver.py +1 -1
  21. scrapli/driver/network/sync_driver.py +1 -1
  22. scrapli/factory.py +3 -3
  23. scrapli/helper.py +12 -6
  24. scrapli/logging.py +2 -4
  25. scrapli/response.py +12 -3
  26. scrapli/transport/plugins/asynctelnet/transport.py +0 -5
  27. scrapli/transport/plugins/telnet/transport.py +0 -5
  28. {scrapli-2024.7.30.dist-info → scrapli-2024.7.30.post1.dist-info}/METADATA +70 -76
  29. {scrapli-2024.7.30.dist-info → scrapli-2024.7.30.post1.dist-info}/RECORD +32 -32
  30. {scrapli-2024.7.30.dist-info → scrapli-2024.7.30.post1.dist-info}/WHEEL +1 -1
  31. {scrapli-2024.7.30.dist-info → scrapli-2024.7.30.post1.dist-info}/LICENSE +0 -0
  32. {scrapli-2024.7.30.dist-info → scrapli-2024.7.30.post1.dist-info}/top_level.txt +0 -0
scrapli/__init__.py CHANGED
@@ -3,7 +3,7 @@
3
3
  from scrapli.driver.base import AsyncDriver, Driver
4
4
  from scrapli.factory import AsyncScrapli, Scrapli
5
5
 
6
- __version__ = "2024.07.30"
6
+ __version__ = "2024.07.30.post1"
7
7
 
8
8
  __all__ = (
9
9
  "AsyncDriver",
@@ -302,7 +302,7 @@ class BaseChannel:
302
302
  # ignore here
303
303
  # note that this will *always* be binary mode, so there doesn't need to be any
304
304
  # encoding, hence ignoring that pylint message!
305
- self.channel_log = open( # pylint: disable=W1514,R1732
305
+ self.channel_log = open( # pylint: disable=W1514,R1732,W1501
306
306
  channel_log_destination,
307
307
  mode=f"{self._base_channel_args.channel_log_mode}b", # type: ignore
308
308
  )
@@ -415,7 +415,7 @@ class BaseChannel:
415
415
 
416
416
  return regex_channel_outputs_pattern
417
417
 
418
- def _ssh_message_handler(self, output: bytes) -> None: # noqa: C901
418
+ def _ssh_message_handler(self, output: bytes) -> None: # pylint:disable=too-many-branches
419
419
  """
420
420
  Parse EOF messages from _pty_authenticate and create log/stack exception message
421
421
 
scrapli/decorators.py CHANGED
@@ -77,7 +77,7 @@ def _signal_raise_exception(
77
77
  return _handle_timeout(transport=transport, logger=logger, message=message)
78
78
 
79
79
 
80
- def _multiprocessing_timeout(
80
+ def _multiprocessing_timeout( # pylint: disable=R0917
81
81
  transport: "BaseTransport",
82
82
  logger: LoggerAdapterT,
83
83
  timeout: float,
@@ -1,4 +1,4 @@
1
- """scrapli.driver.base.base_driver""" # noqa: C0302
1
+ """scrapli.driver.base.base_driver""" # pylint:disable=too-many-lines
2
2
 
3
3
  import importlib
4
4
  from dataclasses import fields
@@ -18,7 +18,7 @@ from scrapli.transport.plugins.system.transport import SystemTransport
18
18
 
19
19
 
20
20
  class BaseDriver:
21
- def __init__(
21
+ def __init__( # pylint: disable=R0917
22
22
  self,
23
23
  host: str,
24
24
  port: Optional[int] = None,
@@ -48,7 +48,7 @@ async def eos_on_close(conn: AsyncNetworkDriver) -> None:
48
48
 
49
49
 
50
50
  class AsyncEOSDriver(AsyncNetworkDriver, EOSDriverBase):
51
- def __init__(
51
+ def __init__( # pylint: disable=R0917
52
52
  self,
53
53
  host: str,
54
54
  privilege_levels: Optional[Dict[str, PrivilegeLevel]] = None,
@@ -32,7 +32,7 @@ PRIVS = {
32
32
  ),
33
33
  "configuration": (
34
34
  PrivilegeLevel(
35
- pattern=r"^[\w.\-@()/: ]{1,63}\(config[\w.\-@/:]{0,63}\)#\s?$",
35
+ pattern=r"^[\w.\-@()/: ]{1,63}\(config[\w.\-@/:+]{0,63}\)#\s?$",
36
36
  name="configuration",
37
37
  previous_priv="privilege_exec",
38
38
  deescalate="end",
@@ -51,6 +51,7 @@ FAILED_WHEN_CONTAINS = [
51
51
  "% Invalid input",
52
52
  "% Cannot commit",
53
53
  "% Unavailable command",
54
+ "% Duplicate sequence number",
54
55
  ]
55
56
 
56
57
 
@@ -80,7 +81,7 @@ class EOSDriverBase:
80
81
  raise ScrapliValueError(msg)
81
82
  sess_prompt = re.escape(session_name[:6])
82
83
  pattern = (
83
- rf"^[a-z0-9.\-@()/: ]{{1,63}}\(config\-s\-{sess_prompt}[a-z0-9_.\-@/:]{{0,64}}\)#\s?$"
84
+ rf"^[a-z0-9.\-@()/: ]{{1,63}}\(config\-s\-{sess_prompt}[a-z0-9_.\-@/:+]{{0,64}}\)#\s?$"
84
85
  )
85
86
  name = session_name
86
87
  config_session = PrivilegeLevel(
@@ -48,7 +48,7 @@ def eos_on_close(conn: NetworkDriver) -> None:
48
48
 
49
49
 
50
50
  class EOSDriver(NetworkDriver, EOSDriverBase):
51
- def __init__(
51
+ def __init__( # pylint: disable=R0917
52
52
  self,
53
53
  host: str,
54
54
  privilege_levels: Optional[Dict[str, PrivilegeLevel]] = None,
@@ -48,7 +48,7 @@ async def iosxe_on_close(conn: AsyncNetworkDriver) -> None:
48
48
 
49
49
 
50
50
  class AsyncIOSXEDriver(AsyncNetworkDriver):
51
- def __init__(
51
+ def __init__( # pylint: disable=R0917
52
52
  self,
53
53
  host: str,
54
54
  privilege_levels: Optional[Dict[str, PrivilegeLevel]] = None,
@@ -48,7 +48,7 @@ def iosxe_on_close(conn: NetworkDriver) -> None:
48
48
 
49
49
 
50
50
  class IOSXEDriver(NetworkDriver):
51
- def __init__(
51
+ def __init__( # pylint: disable=R0917
52
52
  self,
53
53
  host: str,
54
54
  privilege_levels: Optional[Dict[str, PrivilegeLevel]] = None,
@@ -47,7 +47,7 @@ async def iosxr_on_close(conn: AsyncNetworkDriver) -> None:
47
47
 
48
48
 
49
49
  class AsyncIOSXRDriver(AsyncNetworkDriver):
50
- def __init__(
50
+ def __init__( # pylint: disable=R0917
51
51
  self,
52
52
  host: str,
53
53
  privilege_levels: Optional[Dict[str, PrivilegeLevel]] = None,
@@ -50,7 +50,7 @@ def iosxr_on_close(conn: NetworkDriver) -> None:
50
50
 
51
51
 
52
52
  class IOSXRDriver(NetworkDriver):
53
- def __init__(
53
+ def __init__( # pylint: disable=R0917
54
54
  self,
55
55
  host: str,
56
56
  privilege_levels: Optional[Dict[str, PrivilegeLevel]] = None,
@@ -48,7 +48,7 @@ async def nxos_on_close(conn: AsyncNetworkDriver) -> None:
48
48
 
49
49
 
50
50
  class AsyncNXOSDriver(AsyncNetworkDriver, NXOSDriverBase):
51
- def __init__(
51
+ def __init__( # pylint: disable=R0917
52
52
  self,
53
53
  host: str,
54
54
  privilege_levels: Optional[Dict[str, PrivilegeLevel]] = None,
@@ -48,7 +48,7 @@ def nxos_on_close(conn: NetworkDriver) -> None:
48
48
 
49
49
 
50
50
  class NXOSDriver(NetworkDriver, NXOSDriverBase):
51
- def __init__(
51
+ def __init__( # pylint: disable=R0917
52
52
  self,
53
53
  host: str,
54
54
  privilege_levels: Optional[Dict[str, PrivilegeLevel]] = None,
@@ -49,7 +49,7 @@ async def junos_on_close(conn: AsyncNetworkDriver) -> None:
49
49
 
50
50
 
51
51
  class AsyncJunosDriver(AsyncNetworkDriver):
52
- def __init__(
52
+ def __init__( # pylint: disable=R0917
53
53
  self,
54
54
  host: str,
55
55
  privilege_levels: Optional[Dict[str, PrivilegeLevel]] = None,
@@ -49,7 +49,7 @@ def junos_on_close(conn: NetworkDriver) -> None:
49
49
 
50
50
 
51
51
  class JunosDriver(NetworkDriver):
52
- def __init__(
52
+ def __init__( # pylint: disable=R0917
53
53
  self,
54
54
  host: str,
55
55
  privilege_levels: Optional[Dict[str, PrivilegeLevel]] = None,
@@ -35,7 +35,7 @@ async def generic_on_open(conn: "AsyncGenericDriver") -> None:
35
35
 
36
36
 
37
37
  class AsyncGenericDriver(AsyncDriver, BaseGenericDriver):
38
- def __init__(
38
+ def __init__( # pylint: disable=R0917
39
39
  self,
40
40
  host: str,
41
41
  port: Optional[int] = None,
@@ -115,7 +115,7 @@ class AsyncGenericDriver(AsyncDriver, BaseGenericDriver):
115
115
  return prompt
116
116
 
117
117
  @timeout_modifier
118
- async def _send_command(
118
+ async def _send_command( # pylint: disable=R0917
119
119
  self,
120
120
  command: str,
121
121
  strip_prompt: bool = True,
@@ -484,7 +484,7 @@ class AsyncGenericDriver(AsyncDriver, BaseGenericDriver):
484
484
  raw_response=raw_response, processed_response=processed_response, response=response
485
485
  )
486
486
 
487
- async def read_callback( # noqa: C901
487
+ async def read_callback( # pylint: disable=R0917
488
488
  self,
489
489
  callbacks: List["ReadCallback"],
490
490
  initial_input: Optional[str] = None,
@@ -594,7 +594,8 @@ class AsyncGenericDriver(AsyncDriver, BaseGenericDriver):
594
594
  _run_callback = callback.check(read_output=read_output)
595
595
 
596
596
  if (
597
- callback.only_once is True
597
+ _run_callback is True
598
+ and callback.only_once is True
598
599
  and callback._triggered is True # pylint: disable=W0212
599
600
  ):
600
601
  self.logger.warning(
@@ -24,7 +24,7 @@ if TYPE_CHECKING:
24
24
 
25
25
 
26
26
  class ReadCallback:
27
- def __init__(
27
+ def __init__( # pylint: disable=R0917
28
28
  self,
29
29
  callback: Callable[
30
30
  [Union["GenericDriver", "AsyncGenericDriver"], str],
@@ -123,6 +123,8 @@ class ReadCallback:
123
123
  """
124
124
  if self.contains and not self._contains_bytes:
125
125
  self._contains_bytes = self.contains.encode()
126
+ if self.case_insensitive:
127
+ self._contains_bytes = self._contains_bytes.lower()
126
128
 
127
129
  return self._contains_bytes
128
130
 
@@ -143,6 +145,8 @@ class ReadCallback:
143
145
  """
144
146
  if self.not_contains and not self._not_contains_bytes:
145
147
  self._not_contains_bytes = self.not_contains.encode()
148
+ if self.case_insensitive:
149
+ self._not_contains_bytes = self._not_contains_bytes.lower()
146
150
 
147
151
  return self._not_contains_bytes
148
152
 
@@ -35,7 +35,7 @@ def generic_on_open(conn: "GenericDriver") -> None:
35
35
 
36
36
 
37
37
  class GenericDriver(Driver, BaseGenericDriver):
38
- def __init__(
38
+ def __init__( # pylint: disable=R0917
39
39
  self,
40
40
  host: str,
41
41
  port: Optional[int] = None,
@@ -116,7 +116,7 @@ class GenericDriver(Driver, BaseGenericDriver):
116
116
  return prompt
117
117
 
118
118
  @timeout_modifier
119
- def _send_command(
119
+ def _send_command( # pylint: disable=R0917
120
120
  self,
121
121
  command: str,
122
122
  strip_prompt: bool = True,
@@ -209,7 +209,7 @@ class GenericDriver(Driver, BaseGenericDriver):
209
209
  )
210
210
  return response
211
211
 
212
- def send_commands(
212
+ def send_commands( # pylint: disable=R0917
213
213
  self,
214
214
  commands: List[str],
215
215
  *,
@@ -485,7 +485,7 @@ class GenericDriver(Driver, BaseGenericDriver):
485
485
  raw_response=raw_response, processed_response=processed_response, response=response
486
486
  )
487
487
 
488
- def read_callback(
488
+ def read_callback( # pylint: disable=R0917
489
489
  self,
490
490
  callbacks: List["ReadCallback"],
491
491
  initial_input: Optional[str] = None,
@@ -595,7 +595,8 @@ class GenericDriver(Driver, BaseGenericDriver):
595
595
  _run_callback = callback.check(read_output=read_output)
596
596
 
597
597
  if (
598
- callback.only_once is True
598
+ _run_callback is True
599
+ and callback.only_once is True
599
600
  and callback._triggered is True # pylint: disable=W0212
600
601
  ):
601
602
  self.logger.warning(
@@ -11,7 +11,7 @@ from scrapli.response import MultiResponse, Response
11
11
 
12
12
 
13
13
  class AsyncNetworkDriver(AsyncGenericDriver, BaseNetworkDriver):
14
- def __init__(
14
+ def __init__( # pylint: disable=R0917
15
15
  self,
16
16
  host: str,
17
17
  privilege_levels: Dict[str, PrivilegeLevel],
@@ -30,7 +30,7 @@ class PrivilegeLevel:
30
30
  "not_contains",
31
31
  )
32
32
 
33
- def __init__(
33
+ def __init__( # pylint: disable=R0917
34
34
  self,
35
35
  pattern: str,
36
36
  name: str,
@@ -11,7 +11,7 @@ from scrapli.response import MultiResponse, Response
11
11
 
12
12
 
13
13
  class NetworkDriver(GenericDriver, BaseNetworkDriver):
14
- def __init__(
14
+ def __init__( # pylint: disable=R0917
15
15
  self,
16
16
  host: str,
17
17
  privilege_levels: Dict[str, PrivilegeLevel],
scrapli/factory.py CHANGED
@@ -30,7 +30,7 @@ from scrapli.logging import logger
30
30
  from scrapli.transport import ASYNCIO_TRANSPORTS, CORE_TRANSPORTS
31
31
 
32
32
 
33
- def _build_provided_kwargs_dict( # pylint: disable=R0914
33
+ def _build_provided_kwargs_dict( # pylint: disable=R0914,R0917
34
34
  host: str,
35
35
  privilege_levels: Optional[Dict[str, PrivilegeLevel]],
36
36
  default_desired_privilege_level: Optional[str],
@@ -337,7 +337,7 @@ class Scrapli(NetworkDriver):
337
337
  logger.info(msg)
338
338
  return final_driver, additional_kwargs
339
339
 
340
- def __new__( # pylint: disable=R0914
340
+ def __new__( # pylint: disable=R0914,R0917
341
341
  cls,
342
342
  platform: str,
343
343
  host: str,
@@ -636,7 +636,7 @@ class AsyncScrapli(AsyncNetworkDriver):
636
636
  logger.info(msg)
637
637
  return final_driver, additional_kwargs
638
638
 
639
- def __new__( # pylint: disable=R0914
639
+ def __new__( # pylint: disable=R0914,R0917
640
640
  cls,
641
641
  platform: str,
642
642
  host: str,
scrapli/helper.py CHANGED
@@ -4,13 +4,13 @@ import importlib
4
4
  import importlib.resources
5
5
  import sys
6
6
  import urllib.request
7
- from io import BytesIO, TextIOWrapper
7
+ from io import BufferedReader, BytesIO, TextIOWrapper
8
8
  from pathlib import Path
9
9
  from shutil import get_terminal_size
10
10
  from typing import Any, Dict, List, Optional, TextIO, Tuple, Union
11
11
  from warnings import warn
12
12
 
13
- from scrapli.exceptions import ScrapliValueError
13
+ from scrapli.exceptions import ScrapliException, ScrapliValueError
14
14
  from scrapli.logging import logger
15
15
  from scrapli.settings import Settings
16
16
 
@@ -97,7 +97,7 @@ def _textfsm_to_dict(
97
97
 
98
98
 
99
99
  def textfsm_parse(
100
- template: Union[str, TextIOWrapper], output: str, to_dict: bool = True
100
+ template: Union[str, TextIOWrapper], output: str, to_dict: bool = True, raise_err: bool = False
101
101
  ) -> Union[List[Any], Dict[str, Any]]:
102
102
  """
103
103
  Parse output with TextFSM and ntc-templates, try to return structured output
@@ -107,16 +107,20 @@ def textfsm_parse(
107
107
  output: unstructured output from device to parse
108
108
  to_dict: convert textfsm output from list of lists to list of dicts -- basically create dict
109
109
  from header and row data so it is easier to read/parse the output
110
+ raise_err: exceptions in the textfsm parser will raised for the caller to handle
110
111
 
111
112
  Returns:
112
113
  output: structured data
113
114
 
114
115
  Raises:
115
- N/A
116
+ ScrapliException: If raise_err is set and a textfsm parsing error occurs, raises from the
117
+ originating textfsm.parser.TextFSMError exception.
116
118
 
117
119
  """
118
120
  import textfsm # pylint: disable=C0415
119
121
 
122
+ template_file: Union[BufferedReader, TextIOWrapper]
123
+
120
124
  if not isinstance(template, TextIOWrapper):
121
125
  if template.startswith("http://") or template.startswith("https://"):
122
126
  with urllib.request.urlopen(template) as response:
@@ -125,7 +129,7 @@ def textfsm_parse(
125
129
  encoding=response.headers.get_content_charset(),
126
130
  )
127
131
  else:
128
- template_file = TextIOWrapper(open(template, mode="rb")) # pylint: disable=R1732
132
+ template_file = open(template, mode="rb") # pylint: disable=R1732
129
133
  else:
130
134
  template_file = template
131
135
  re_table = textfsm.TextFSM(template_file)
@@ -136,8 +140,10 @@ def textfsm_parse(
136
140
  structured_output=structured_output, header=re_table.header
137
141
  )
138
142
  return structured_output
139
- except textfsm.parser.TextFSMError:
143
+ except textfsm.parser.TextFSMError as exc:
140
144
  logger.warning("failed to parse data with textfsm")
145
+ if raise_err:
146
+ raise ScrapliException(exc) from exc
141
147
  return []
142
148
 
143
149
 
scrapli/logging.py CHANGED
@@ -1,7 +1,5 @@
1
1
  """scrapli.logging"""
2
2
 
3
- from ast import literal_eval
4
-
5
3
  # slightly irritating renaming to prevent a cyclic lookup in griffe for mkdocstrings
6
4
  from logging import FileHandler as FileHandler_
7
5
  from logging import Formatter as Formatter_
@@ -223,13 +221,13 @@ class ScrapliFileHandler(FileHandler_):
223
221
  # no message in the buffer, set the current record to the _record_buf
224
222
  self._record_buf = record
225
223
  # get the payload of the message after "read: " and re-convert it to bytes
226
- self._record_msg_buf = literal_eval(record.msg[self._read_msg_prefix_len :]) # noqa
224
+ self._record_msg_buf = record.msg[self._read_msg_prefix_len :].encode()
227
225
  return
228
226
 
229
227
  # if we get here we know we are getting subsequent read messages we want to buffer -- the
230
228
  # log record data will all be the same, its just the payload that will be new, so add that
231
229
  # current payload to the _record_msg_buf buffer
232
- self._record_msg_buf += literal_eval(record.msg[self._read_msg_prefix_len :]) # noqa
230
+ self._record_msg_buf += record.msg[self._read_msg_prefix_len :].encode()
233
231
 
234
232
 
235
233
  def get_instance_logger(
scrapli/response.py CHANGED
@@ -10,7 +10,7 @@ from scrapli.helper import _textfsm_get_template, genie_parse, textfsm_parse, tt
10
10
 
11
11
 
12
12
  class Response:
13
- def __init__(
13
+ def __init__( # pylint: disable=R0917
14
14
  self,
15
15
  host: str,
16
16
  channel_input: str,
@@ -142,7 +142,10 @@ class Response:
142
142
  self.failed = False
143
143
 
144
144
  def textfsm_parse_output(
145
- self, template: Union[str, TextIO, None] = None, to_dict: bool = True
145
+ self,
146
+ template: Union[str, TextIO, None] = None,
147
+ to_dict: bool = True,
148
+ raise_err: bool = False,
146
149
  ) -> Union[Dict[str, Any], List[Any]]:
147
150
  """
148
151
  Parse results with textfsm, always return structured data
@@ -153,6 +156,7 @@ class Response:
153
156
  template: string path to textfsm template or opened textfsm template file
154
157
  to_dict: convert textfsm output from list of lists to list of dicts -- basically create
155
158
  dict from header and row data so it is easier to read/parse the output
159
+ raise_err: exceptions in the textfsm parser will raised for the caller to handle
156
160
 
157
161
  Returns:
158
162
  structured_result: empty list or parsed data from textfsm
@@ -170,7 +174,12 @@ class Response:
170
174
  return []
171
175
 
172
176
  template = cast(Union[str, TextIOWrapper], template)
173
- return textfsm_parse(template=template, output=self.result, to_dict=to_dict) or []
177
+ return (
178
+ textfsm_parse(
179
+ template=template, output=self.result, to_dict=to_dict, raise_err=raise_err
180
+ )
181
+ or []
182
+ )
174
183
 
175
184
  def genie_parse_output(self) -> Union[Dict[str, Any], List[Any]]:
176
185
  """
@@ -110,16 +110,11 @@ class AsynctelnetTransport(AsyncTransport):
110
110
 
111
111
  Raises:
112
112
  ScrapliConnectionNotOpened: if connection is not opened for some reason
113
- ScrapliConnectionNotOpened: if we read an empty byte string from the reader -- this
114
- indicates the server sent an EOF -- see #142
115
113
 
116
114
  """
117
115
  if not self.stdout:
118
116
  raise ScrapliConnectionNotOpened
119
117
 
120
- if self._raw_buf.find(NULL) != -1:
121
- raise ScrapliConnectionNotOpened("server returned EOF, connection not opened")
122
-
123
118
  index = self._raw_buf.find(IAC)
124
119
  if index == -1:
125
120
  self._cooked_buf = self._raw_buf
@@ -141,16 +141,11 @@ class TelnetTransport(Transport):
141
141
 
142
142
  Raises:
143
143
  ScrapliConnectionNotOpened: if connection is not opened for some reason
144
- ScrapliConnectionNotOpened: if we read an empty byte string from the reader -- this
145
- indicates the server sent an EOF -- see #142
146
144
 
147
145
  """
148
146
  if not self.socket:
149
147
  raise ScrapliConnectionNotOpened
150
148
 
151
- if self._raw_buf.find(NULL) != -1:
152
- raise ScrapliConnectionNotOpened("server returned EOF, connection not opened")
153
-
154
149
  index = self._raw_buf.find(IAC)
155
150
  if index == -1:
156
151
  self._cooked_buf = self._raw_buf
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: scrapli
3
- Version: 2024.7.30
3
+ Version: 2024.7.30.post1
4
4
  Summary: Fast, flexible, sync/async, Python 3.7+ screen scraping client specifically for network devices
5
5
  Author-email: Carl Montanari <carl.r.montanari@gmail.com>
6
6
  License: MIT License
@@ -43,86 +43,80 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
43
43
  Requires-Python: >=3.8
44
44
  Description-Content-Type: text/markdown
45
45
  License-File: LICENSE
46
- Provides-Extra: asyncssh
47
- Requires-Dist: asyncssh <3.0.0,>=2.2.1 ; extra == 'asyncssh'
48
- Provides-Extra: community
49
- Requires-Dist: scrapli-community >=2021.01.30 ; extra == 'community'
50
- Provides-Extra: dev
51
- Requires-Dist: black <25.0.0,>=23.3.0 ; extra == 'dev'
52
- Requires-Dist: darglint <2.0.0,>=1.8.1 ; extra == 'dev'
53
- Requires-Dist: isort <6.0.0,>=5.10.1 ; extra == 'dev'
54
- Requires-Dist: mypy <2.0.0,>=1.4.1 ; extra == 'dev'
55
- Requires-Dist: nox ==2024.4.15 ; extra == 'dev'
56
- Requires-Dist: pycodestyle <3.0.0,>=2.8.0 ; extra == 'dev'
57
- Requires-Dist: pydocstyle <7.0.0,>=6.1.1 ; extra == 'dev'
58
- Requires-Dist: pyfakefs <6.0.0,>=5.4.1 ; extra == 'dev'
59
- Requires-Dist: pylama <9.0.0,>=8.4.0 ; extra == 'dev'
60
- Requires-Dist: pylint <4.0.0,>=3.0.0 ; extra == 'dev'
61
- Requires-Dist: pytest-asyncio <1.0.0,>=0.17.0 ; extra == 'dev'
62
- Requires-Dist: pytest-cov <5.0.0,>=3.0.0 ; extra == 'dev'
63
- Requires-Dist: pytest <8.0.0,>=7.0.0 ; extra == 'dev'
64
- Requires-Dist: scrapli-cfg ==2023.7.30 ; extra == 'dev'
65
- Requires-Dist: scrapli-replay ==2023.7.30 ; extra == 'dev'
66
- Requires-Dist: toml <1.0.0,>=0.10.2 ; extra == 'dev'
67
- Requires-Dist: types-paramiko <4.0.0,>=2.8.6 ; extra == 'dev'
68
- Requires-Dist: types-pkg-resources <1.0.0,>=0.1.3 ; extra == 'dev'
69
- Requires-Dist: ntc-templates <5.0.0,>=1.1.0 ; extra == 'dev'
70
- Requires-Dist: textfsm <2.0.0,>=1.1.0 ; extra == 'dev'
71
- Requires-Dist: ttp <1.0.0,>=0.5.0 ; extra == 'dev'
72
- Requires-Dist: paramiko <4.0.0,>=2.6.0 ; extra == 'dev'
73
- Requires-Dist: asyncssh <3.0.0,>=2.2.1 ; extra == 'dev'
74
- Requires-Dist: scrapli-community >=2021.01.30 ; extra == 'dev'
75
46
  Provides-Extra: dev-darwin
76
- Requires-Dist: black <25.0.0,>=23.3.0 ; extra == 'dev-darwin'
77
- Requires-Dist: darglint <2.0.0,>=1.8.1 ; extra == 'dev-darwin'
78
- Requires-Dist: isort <6.0.0,>=5.10.1 ; extra == 'dev-darwin'
79
- Requires-Dist: mypy <2.0.0,>=1.4.1 ; extra == 'dev-darwin'
80
- Requires-Dist: nox ==2024.4.15 ; extra == 'dev-darwin'
81
- Requires-Dist: pycodestyle <3.0.0,>=2.8.0 ; extra == 'dev-darwin'
82
- Requires-Dist: pydocstyle <7.0.0,>=6.1.1 ; extra == 'dev-darwin'
83
- Requires-Dist: pyfakefs <6.0.0,>=5.4.1 ; extra == 'dev-darwin'
84
- Requires-Dist: pylama <9.0.0,>=8.4.0 ; extra == 'dev-darwin'
85
- Requires-Dist: pylint <4.0.0,>=3.0.0 ; extra == 'dev-darwin'
86
- Requires-Dist: pytest-asyncio <1.0.0,>=0.17.0 ; extra == 'dev-darwin'
87
- Requires-Dist: pytest-cov <5.0.0,>=3.0.0 ; extra == 'dev-darwin'
88
- Requires-Dist: pytest <8.0.0,>=7.0.0 ; extra == 'dev-darwin'
89
- Requires-Dist: scrapli-cfg ==2023.7.30 ; extra == 'dev-darwin'
90
- Requires-Dist: scrapli-replay ==2023.7.30 ; extra == 'dev-darwin'
91
- Requires-Dist: toml <1.0.0,>=0.10.2 ; extra == 'dev-darwin'
92
- Requires-Dist: types-paramiko <4.0.0,>=2.8.6 ; extra == 'dev-darwin'
93
- Requires-Dist: types-pkg-resources <1.0.0,>=0.1.3 ; extra == 'dev-darwin'
94
- Requires-Dist: ntc-templates <5.0.0,>=1.1.0 ; extra == 'dev-darwin'
95
- Requires-Dist: textfsm <2.0.0,>=1.1.0 ; extra == 'dev-darwin'
96
- Requires-Dist: ttp <1.0.0,>=0.5.0 ; extra == 'dev-darwin'
97
- Requires-Dist: paramiko <4.0.0,>=2.6.0 ; extra == 'dev-darwin'
98
- Requires-Dist: asyncssh <3.0.0,>=2.2.1 ; extra == 'dev-darwin'
99
- Requires-Dist: scrapli-community >=2021.01.30 ; extra == 'dev-darwin'
100
- Requires-Dist: genie <24.4,>=20.2 ; (sys_platform != "win32" and python_version < "3.11") and extra == 'dev-darwin'
101
- Requires-Dist: pyats >=20.2 ; (sys_platform != "win32" and python_version < "3.11") and extra == 'dev-darwin'
102
- Requires-Dist: ssh2-python <2.0.0,>=0.23.0 ; (python_version < "3.12") and extra == 'dev'
103
- Requires-Dist: genie <24.4,>=20.2 ; (sys_platform != "win32" and python_version < "3.11") and extra == 'dev'
104
- Requires-Dist: pyats >=20.2 ; (sys_platform != "win32" and python_version < "3.11") and extra == 'dev'
47
+ Requires-Dist: black<25.0.0,>=23.3.0; extra == "dev-darwin"
48
+ Requires-Dist: darglint<2.0.0,>=1.8.1; extra == "dev-darwin"
49
+ Requires-Dist: isort<6.0.0,>=5.10.1; extra == "dev-darwin"
50
+ Requires-Dist: mypy<2.0.0,>=1.4.1; extra == "dev-darwin"
51
+ Requires-Dist: nox==2024.4.15; extra == "dev-darwin"
52
+ Requires-Dist: pydocstyle<7.0.0,>=6.1.1; extra == "dev-darwin"
53
+ Requires-Dist: pyfakefs<6.0.0,>=5.4.1; extra == "dev-darwin"
54
+ Requires-Dist: pylint<4.0.0,>=3.0.0; extra == "dev-darwin"
55
+ Requires-Dist: pytest-asyncio<1.0.0,>=0.17.0; extra == "dev-darwin"
56
+ Requires-Dist: pytest-cov<5.0.0,>=3.0.0; extra == "dev-darwin"
57
+ Requires-Dist: pytest<8.0.0,>=7.0.0; extra == "dev-darwin"
58
+ Requires-Dist: scrapli-cfg==2023.7.30; extra == "dev-darwin"
59
+ Requires-Dist: scrapli-replay==2023.7.30; extra == "dev-darwin"
60
+ Requires-Dist: toml<1.0.0,>=0.10.2; extra == "dev-darwin"
61
+ Requires-Dist: types-paramiko<4.0.0,>=2.8.6; extra == "dev-darwin"
62
+ Requires-Dist: ntc-templates<7.0.0,>=1.1.0; extra == "dev-darwin"
63
+ Requires-Dist: textfsm<2.0.0,>=1.1.0; extra == "dev-darwin"
64
+ Requires-Dist: genie<24.4,>=20.2; (sys_platform != "win32" and python_version < "3.11") and extra == "dev-darwin"
65
+ Requires-Dist: pyats>=20.2; (sys_platform != "win32" and python_version < "3.11") and extra == "dev-darwin"
66
+ Requires-Dist: ttp<1.0.0,>=0.5.0; extra == "dev-darwin"
67
+ Requires-Dist: paramiko<4.0.0,>=2.6.0; extra == "dev-darwin"
68
+ Requires-Dist: asyncssh<3.0.0,>=2.2.1; extra == "dev-darwin"
69
+ Requires-Dist: scrapli_community>=2021.01.30; extra == "dev-darwin"
70
+ Provides-Extra: dev
71
+ Requires-Dist: black<25.0.0,>=23.3.0; extra == "dev"
72
+ Requires-Dist: darglint<2.0.0,>=1.8.1; extra == "dev"
73
+ Requires-Dist: isort<6.0.0,>=5.10.1; extra == "dev"
74
+ Requires-Dist: mypy<2.0.0,>=1.4.1; extra == "dev"
75
+ Requires-Dist: nox==2024.4.15; extra == "dev"
76
+ Requires-Dist: pydocstyle<7.0.0,>=6.1.1; extra == "dev"
77
+ Requires-Dist: pyfakefs<6.0.0,>=5.4.1; extra == "dev"
78
+ Requires-Dist: pylint<4.0.0,>=3.0.0; extra == "dev"
79
+ Requires-Dist: pytest-asyncio<1.0.0,>=0.17.0; extra == "dev"
80
+ Requires-Dist: pytest-cov<5.0.0,>=3.0.0; extra == "dev"
81
+ Requires-Dist: pytest<8.0.0,>=7.0.0; extra == "dev"
82
+ Requires-Dist: scrapli-cfg==2023.7.30; extra == "dev"
83
+ Requires-Dist: scrapli-replay==2023.7.30; extra == "dev"
84
+ Requires-Dist: toml<1.0.0,>=0.10.2; extra == "dev"
85
+ Requires-Dist: types-paramiko<4.0.0,>=2.8.6; extra == "dev"
86
+ Requires-Dist: ntc-templates<7.0.0,>=1.1.0; extra == "dev"
87
+ Requires-Dist: textfsm<2.0.0,>=1.1.0; extra == "dev"
88
+ Requires-Dist: genie<24.4,>=20.2; (sys_platform != "win32" and python_version < "3.11") and extra == "dev"
89
+ Requires-Dist: pyats>=20.2; (sys_platform != "win32" and python_version < "3.11") and extra == "dev"
90
+ Requires-Dist: ttp<1.0.0,>=0.5.0; extra == "dev"
91
+ Requires-Dist: paramiko<4.0.0,>=2.6.0; extra == "dev"
92
+ Requires-Dist: ssh2-python<2.0.0,>=0.23.0; python_version < "3.12" and extra == "dev"
93
+ Requires-Dist: asyncssh<3.0.0,>=2.2.1; extra == "dev"
94
+ Requires-Dist: scrapli_community>=2021.01.30; extra == "dev"
105
95
  Provides-Extra: docs
106
- Requires-Dist: mdx-gh-links <1.0,>=0.2 ; extra == 'docs'
107
- Requires-Dist: mkdocs <2.0.0,>=1.2.3 ; extra == 'docs'
108
- Requires-Dist: mkdocs-gen-files <1.0.0,>=0.4.0 ; extra == 'docs'
109
- Requires-Dist: mkdocs-literate-nav <1.0.0,>=0.5.0 ; extra == 'docs'
110
- Requires-Dist: mkdocs-material <10.0.0,>=8.1.6 ; extra == 'docs'
111
- Requires-Dist: mkdocs-material-extensions <2.0.0,>=1.0.3 ; extra == 'docs'
112
- Requires-Dist: mkdocs-section-index <1.0.0,>=0.3.4 ; extra == 'docs'
113
- Requires-Dist: mkdocstrings[python] <1.0.0,>=0.19.0 ; extra == 'docs'
96
+ Requires-Dist: mdx-gh-links<1.0,>=0.2; extra == "docs"
97
+ Requires-Dist: mkdocs<2.0.0,>=1.2.3; extra == "docs"
98
+ Requires-Dist: mkdocs-gen-files<1.0.0,>=0.4.0; extra == "docs"
99
+ Requires-Dist: mkdocs-literate-nav<1.0.0,>=0.5.0; extra == "docs"
100
+ Requires-Dist: mkdocs-material<10.0.0,>=8.1.6; extra == "docs"
101
+ Requires-Dist: mkdocs-material-extensions<2.0.0,>=1.0.3; extra == "docs"
102
+ Requires-Dist: mkdocs-section-index<1.0.0,>=0.3.4; extra == "docs"
103
+ Requires-Dist: mkdocstrings[python]<1.0.0,>=0.19.0; extra == "docs"
104
+ Provides-Extra: textfsm
105
+ Requires-Dist: ntc-templates<7.0.0,>=1.1.0; extra == "textfsm"
106
+ Requires-Dist: textfsm<2.0.0,>=1.1.0; extra == "textfsm"
114
107
  Provides-Extra: genie
115
- Requires-Dist: genie <24.4,>=20.2 ; (sys_platform != "win32" and python_version < "3.11") and extra == 'genie'
116
- Requires-Dist: pyats >=20.2 ; (sys_platform != "win32" and python_version < "3.11") and extra == 'genie'
108
+ Requires-Dist: genie<24.4,>=20.2; (sys_platform != "win32" and python_version < "3.11") and extra == "genie"
109
+ Requires-Dist: pyats>=20.2; (sys_platform != "win32" and python_version < "3.11") and extra == "genie"
110
+ Provides-Extra: ttp
111
+ Requires-Dist: ttp<1.0.0,>=0.5.0; extra == "ttp"
117
112
  Provides-Extra: paramiko
118
- Requires-Dist: paramiko <4.0.0,>=2.6.0 ; extra == 'paramiko'
113
+ Requires-Dist: paramiko<4.0.0,>=2.6.0; extra == "paramiko"
119
114
  Provides-Extra: ssh2
120
- Requires-Dist: ssh2-python <2.0.0,>=0.23.0 ; (python_version < "3.12") and extra == 'ssh2'
121
- Provides-Extra: textfsm
122
- Requires-Dist: ntc-templates <5.0.0,>=1.1.0 ; extra == 'textfsm'
123
- Requires-Dist: textfsm <2.0.0,>=1.1.0 ; extra == 'textfsm'
124
- Provides-Extra: ttp
125
- Requires-Dist: ttp <1.0.0,>=0.5.0 ; extra == 'ttp'
115
+ Requires-Dist: ssh2-python<2.0.0,>=0.23.0; python_version < "3.12" and extra == "ssh2"
116
+ Provides-Extra: asyncssh
117
+ Requires-Dist: asyncssh<3.0.0,>=2.2.1; extra == "asyncssh"
118
+ Provides-Extra: community
119
+ Requires-Dist: scrapli_community>=2021.01.30; extra == "community"
126
120
 
127
121
  <p center><a href=""><img src=https://github.com/carlmontanari/scrapli/blob/main/scrapli.svg?sanitize=true/></a></p>
128
122
 
@@ -1,51 +1,51 @@
1
- scrapli/__init__.py,sha256=uxxnFUBmyzthxJtctiapxFoYkCiphAypRtRkdTqxrzU,228
2
- scrapli/decorators.py,sha256=KlxKugMnfpAUgbkR_Ok7MPDRY98BNvCorXnpeakQcFE,10422
1
+ scrapli/__init__.py,sha256=io6HIkd_g_w3ixdJHtvWAtlSQkQ83P7D-wMPpVM_Cb0,234
2
+ scrapli/decorators.py,sha256=2JTmHCdWZBi5S_XZMISvmH-aFas7ddUNwXNeflAHkn4,10447
3
3
  scrapli/exceptions.py,sha256=AlWmOIGpdZhcEGgv4H7Tpw9B9QdoXBG-DPYooSKHlxM,1938
4
- scrapli/factory.py,sha256=SDVtvhqF8tAj5-cbwu3NWY31rkb508wHolMpGyDp3x0,37673
5
- scrapli/helper.py,sha256=M4TiGiLYqdpaPVLP_ffK87eG20Uwzd8dLbG9f0JBi4o,11553
6
- scrapli/logging.py,sha256=HJkDXhL9j9HfHkcEap3WSfKO3FnLHBg4v7wCFqgV99k,9802
4
+ scrapli/factory.py,sha256=WGBcjr3NUHCEdDvK8X1rQnjnFaMjpWEXKAKknkp6XWY,37691
5
+ scrapli/helper.py,sha256=ikOGFFbvWBuCji0m-XG8T1lq5vTXoJYFfMl8sYls5TQ,11970
6
+ scrapli/logging.py,sha256=LPG_zWNl1ZpbZndqxXvlbniCDPNMBm4YNGCFGsxdZc8,9746
7
7
  scrapli/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- scrapli/response.py,sha256=bQGuH-cKlOIlCfBHf3QVYzz852INUstiS_ivzKUMbqM,8866
8
+ scrapli/response.py,sha256=hdjvt-Zz7r0E6tLIKqPv-saM03NA-wqoPdsc9T2JqII,9121
9
9
  scrapli/settings.py,sha256=bbbNa5Aj4aR-rMaxGCLwogpdedadrQfar6sj9y95rlw,235
10
10
  scrapli/ssh_config.py,sha256=NJ0t4Waq1D5-k27Q93AU4FJGie0pDiag2PvJFMVhhG4,17911
11
11
  scrapli/channel/__init__.py,sha256=U06VyCKvvjUU4VDdwt5IrciwSvoigxClwQ72bVwvs7A,177
12
12
  scrapli/channel/async_channel.py,sha256=z3BbNt_l6wO_yvi-nkE90ZcbYtbupZsiE21OSRNeRa8,23234
13
- scrapli/channel/base_channel.py,sha256=hXKfzjkP1VD2v6hOgb2MUQuhksfkTdT1BEN2VVMeiKY,22033
13
+ scrapli/channel/base_channel.py,sha256=gOQIu41fyl5PlHoWRFzwZvxaCjgOn0Eb-JVuLQQcxEU,22061
14
14
  scrapli/channel/sync_channel.py,sha256=mSlAdvkX6GklOoHsoB-GUfB477arLRyPpeDVPdeidLE,23217
15
15
  scrapli/driver/__init__.py,sha256=oXZkMs5nZlDsLsUMdEShxxtx5-bakQ2xzf8EZLIQAfE,354
16
16
  scrapli/driver/base/__init__.py,sha256=-RPF8z1Qo7wXBCUZZMLjDYBTaXg4qZ0ofB_uMWi6hD4,183
17
17
  scrapli/driver/base/async_driver.py,sha256=pEf0B6TmkdOm6ytNmhgUHbUcyFasn9b5hMmcqQ2IPWM,9843
18
- scrapli/driver/base/base_driver.py,sha256=-owg7qqbmrFtFqQn7Lncc4t0hV1630sRf7RK04cw5bY,36622
18
+ scrapli/driver/base/base_driver.py,sha256=T3D6uL4tXRVgx9DIS7pqCHFnU8vI_dNjFzjrGiaHrYo,36665
19
19
  scrapli/driver/base/sync_driver.py,sha256=KsYvueu_gFFL0VQ0t4NFXLWHYjfLxFCsiT00JsDdrc8,6156
20
20
  scrapli/driver/core/__init__.py,sha256=dnxS1ibXoma7FMzb_6iMDdoC0ioivleDrzOAq6pD7BQ,615
21
21
  scrapli/driver/core/arista_eos/__init__.py,sha256=HoOP-do1Nb-6AAGEprUbJFdE3cziBzSB3so6tZASRKk,228
22
- scrapli/driver/core/arista_eos/async_driver.py,sha256=siHyelArMaV_TgOcrNwkciHUXrPpXYAxwRN1kXSX1Ic,7412
23
- scrapli/driver/core/arista_eos/base_driver.py,sha256=06BRyGH_iZT3cDccBdwmm5ElFMQz8FsljsgUsuAbpLs,2794
24
- scrapli/driver/core/arista_eos/sync_driver.py,sha256=rzdWaGbb14hOW-O19co1azDXzNnifST9RxMTX_OzIKQ,7367
22
+ scrapli/driver/core/arista_eos/async_driver.py,sha256=Vhd0eWaiG7cRi8qOjB8L7Gls07LRV-WS9sMK3Wb_IR4,7437
23
+ scrapli/driver/core/arista_eos/base_driver.py,sha256=WxrGmhH3DaQN6fuoc0wmoA9cQvB6qlbT-OfUa-UQbQ0,2831
24
+ scrapli/driver/core/arista_eos/sync_driver.py,sha256=XzH97y4h4AswspOohAwDIb20GuvYkm1mh7CyA8zrkjY,7392
25
25
  scrapli/driver/core/cisco_iosxe/__init__.py,sha256=gAIKcWEyuCKD7U6s7C8Tr60YRVpT2h3RMgbeqcXwKLQ,239
26
- scrapli/driver/core/cisco_iosxe/async_driver.py,sha256=beWsOkNRrdb8etTsdYZYe60BXomEMwMyMkuKdFI6Z70,6357
26
+ scrapli/driver/core/cisco_iosxe/async_driver.py,sha256=Z-djnwIAmKcbGKKEwo4SyudXDAe7GIVBHgn0lgH2Jhw,6382
27
27
  scrapli/driver/core/cisco_iosxe/base_driver.py,sha256=qewpK9mJPDM_WEIJnqCRPJ3Lp1F243WtJ6CrA9tW3bc,1568
28
- scrapli/driver/core/cisco_iosxe/sync_driver.py,sha256=YcYFcuakjIFRSyzLXTR_pQjYcIyyl0vE7kMNyizgt0g,6280
28
+ scrapli/driver/core/cisco_iosxe/sync_driver.py,sha256=e-OSp9gdQsZEtxdJ8FuqhMucZX_pObyBOW0V6qRlO5A,6305
29
29
  scrapli/driver/core/cisco_iosxr/__init__.py,sha256=mCyGrWDxDsCK-2lPidOkmgWz7p6ibISxkbmJTnLrNqc,239
30
- scrapli/driver/core/cisco_iosxr/async_driver.py,sha256=9efUWy-xJ3tXS274QuGmvYhbqK-JVZIxClfqgDIWzXc,6699
30
+ scrapli/driver/core/cisco_iosxr/async_driver.py,sha256=E5vq9cah7LypZcfQPRCY8fqMqPV0fuTSNgxAC_Q0gYo,6724
31
31
  scrapli/driver/core/cisco_iosxr/base_driver.py,sha256=TWkI6uBzfCniPPpK4HpSeJzpbKMjTgLfLHfCHPU-nBQ,1262
32
- scrapli/driver/core/cisco_iosxr/sync_driver.py,sha256=fskRc_ZQMXnyu9sIHhEh44VAwcr3YQXAx5SbQLHP-uY,6733
32
+ scrapli/driver/core/cisco_iosxr/sync_driver.py,sha256=6I2BNNsg2oDQHOdbHEWp2fLIYuZAfj50x_xRJwTGJVs,6758
33
33
  scrapli/driver/core/cisco_nxos/__init__.py,sha256=vtq65EDKjYqhg9HUGnZrdaRqpYVuz24Oe_WWdzqzQJs,232
34
- scrapli/driver/core/cisco_nxos/async_driver.py,sha256=92DkZkiSy3PXY5pr1BwMRlQWZRKzqMS71sjEYtmhQaE,7443
34
+ scrapli/driver/core/cisco_nxos/async_driver.py,sha256=9xvtiVn8DOP4J-atj1SRt9JvlH4Ai6TCWK2mqrgwHkI,7468
35
35
  scrapli/driver/core/cisco_nxos/base_driver.py,sha256=eNjYkMjWyOn6oLZ4vTc0rHpqOHUU8Yt09tZZQwFyUVg,3519
36
- scrapli/driver/core/cisco_nxos/sync_driver.py,sha256=icih-fn9yrU23XAH-J8BOLjSt2QXb5-yE53wPisRYU8,7359
36
+ scrapli/driver/core/cisco_nxos/sync_driver.py,sha256=EJdd7tK4gGjFsjR9rWFdYUH8ML7GCZKm_EL4-ajcmzE,7384
37
37
  scrapli/driver/core/juniper_junos/__init__.py,sha256=kKVB77xdHTVyL3sGzQFUPYGshMCqxoIJAHSxkw_wfZA,245
38
- scrapli/driver/core/juniper_junos/async_driver.py,sha256=b33RLXu1BWPy019w-T_ozO0IhhvqW96FpPdn8XjBZi4,6746
38
+ scrapli/driver/core/juniper_junos/async_driver.py,sha256=3ZGWjwh7mzjMZHv1SLJNasyym0GROV3BSuAaMrxibGM,6771
39
39
  scrapli/driver/core/juniper_junos/base_driver.py,sha256=uZMW5F8zOOE5TeAqVIA71OyiYh4gOUN4t5vj63glteM,2326
40
- scrapli/driver/core/juniper_junos/sync_driver.py,sha256=_3HmTv6Kz66x83KxBJ7Y6zkjFqrxAywy-H8vX0VrlGA,6683
40
+ scrapli/driver/core/juniper_junos/sync_driver.py,sha256=9ooJoz9iecRsPnoLA3qrp-WLf4aOc-LnSIv3V74REfI,6708
41
41
  scrapli/driver/generic/__init__.py,sha256=0mtOYfBKHqcjSwswPs0Bj2QQnmzW4ugaCAPgx1d9ddU,300
42
- scrapli/driver/generic/async_driver.py,sha256=oUb4RyTetu6eWzXDPAJB07jwUYGOsi_9Z2_2f8YFnRg,25951
43
- scrapli/driver/generic/base_driver.py,sha256=k-3FjbiGVG5QZKrE4ZGFkBpNuI0zqiMG7OMMWfVIabc,11715
44
- scrapli/driver/generic/sync_driver.py,sha256=1K4u-rd-xyFssap_AkS_UnH0g4nmDZdmaZNZIPPEXUY,25674
42
+ scrapli/driver/generic/async_driver.py,sha256=4WcvikBs7DueaSP-IIEDcZWmcpjz53PF8inaAcQ4p7g,26058
43
+ scrapli/driver/generic/base_driver.py,sha256=f1ejJlNCfiDeXtnvjF1DHLeiaswlUO7Zc7HwJcNQ24Q,11960
44
+ scrapli/driver/generic/sync_driver.py,sha256=Q9GtMAVe5MoZ-KWMs7R4WiH8JYaHYTcKn0-jwXjAnFc,25820
45
45
  scrapli/driver/network/__init__.py,sha256=RAF9vpgJgcpkFgogfSyoE6P_JMqf-ycLLcoBMaRFdeY,220
46
- scrapli/driver/network/async_driver.py,sha256=sMR3xb5iaKT7Je6LDmw-UJT6qwXo3q6t4KJnTCFeLwE,28099
47
- scrapli/driver/network/base_driver.py,sha256=P5G95FVoqpHrewcP0Pfcth8ICSBvssTHeauch_ZE0fY,21166
48
- scrapli/driver/network/sync_driver.py,sha256=B49sUt_1CJyOmbdnAn0n1pmrdCGJ0C7qmfQZjMt28Xg,27901
46
+ scrapli/driver/network/async_driver.py,sha256=h2rqUEMfdkRRiZIgKi79b322C8fgJB8jrjLlLSxZKJc,28124
47
+ scrapli/driver/network/base_driver.py,sha256=pTvZ9BCBHORSrjs6cbebaI7n57959gCbNKMuyludiew,21191
48
+ scrapli/driver/network/sync_driver.py,sha256=EoH4kOAd5NHh3hYYQxig9g7Yj2ljq6r54nGwmNKknjk,27926
49
49
  scrapli/transport/__init__.py,sha256=wHs6v4o_a_EWYfbItBgCy8lZOsOH3wFSTeImrPJhEcs,235
50
50
  scrapli/transport/base/__init__.py,sha256=VW-80qXrzoCRhiWXY2yLTRBZT-6q1RSc34-1dbLNiPw,359
51
51
  scrapli/transport/base/async_transport.py,sha256=yOBv6VnsPwZ-H_0PNhe_w-fUq20-z084atwFrrFNM2U,624
@@ -57,7 +57,7 @@ scrapli/transport/plugins/__init__.py,sha256=ZHtpJzgUgiuNI7-24rp-TcTRvpq8fpef9iO
57
57
  scrapli/transport/plugins/asyncssh/__init__.py,sha256=0Gk32fKg-7uPTOQLP_kqj6T5GSt26zE86fzRAqhCjtc,41
58
58
  scrapli/transport/plugins/asyncssh/transport.py,sha256=4kIuXJspknLLGgzJwwDYEZ1FIEs5BpIbIHGHbC1_avU,10402
59
59
  scrapli/transport/plugins/asynctelnet/__init__.py,sha256=eR0je4izyYOZtlyKkUTXwi_FtzJhzSoLZvCaJx31E70,44
60
- scrapli/transport/plugins/asynctelnet/transport.py,sha256=toAKK7jRd-p8cuupueSqRvke4RM7bak8W-LYAcQC7FI,8582
60
+ scrapli/transport/plugins/asynctelnet/transport.py,sha256=HT0P2_sJ-pOrMccU9EPz7xAQJpXQQcGh0GPTCFLowlQ,8290
61
61
  scrapli/transport/plugins/paramiko/__init__.py,sha256=6TD1vWG7vxDrSu33Olcs0Q_9mU2lita0Au6gTtq6-NE,41
62
62
  scrapli/transport/plugins/paramiko/transport.py,sha256=vFkVC_NJuKcalxdRirzsXnY9sSRCZ5iFdrDuqQYSS3I,9869
63
63
  scrapli/transport/plugins/ssh2/__init__.py,sha256=uM4oUBrI1lhw6IAhfRa_ixhwVqMeb9RoEe157QM4XIA,37
@@ -66,9 +66,9 @@ scrapli/transport/plugins/system/__init__.py,sha256=Fhudt-5pwvGZxbzb9JSzX2BkyPHU
66
66
  scrapli/transport/plugins/system/ptyprocess.py,sha256=wzy-z3UkKZY1ADZQVAOjsEdNaJ74b5LVPD2amP-dE8U,25165
67
67
  scrapli/transport/plugins/system/transport.py,sha256=asuq7tU_D9fWJEIvblKOELNbSdoUkvSMVpdTF71TptI,6935
68
68
  scrapli/transport/plugins/telnet/__init__.py,sha256=ce0syarhrpeD1NHtqbazPI09VLvF2n5oC2UE9G_Rbr0,39
69
- scrapli/transport/plugins/telnet/transport.py,sha256=VyIamvT_I8IyEqTv-DabJErbYZrBKDscHNFY1kto2wU,8293
70
- scrapli-2024.7.30.dist-info/LICENSE,sha256=IeyhkG2h_dAvJ7nAF0S4GSUg045jwI27YADV_KSJi50,1071
71
- scrapli-2024.7.30.dist-info/METADATA,sha256=qwRvwRUyCiYCpXTQ-ny2lsRoA7FHiBSIAcXn7ZGhAL4,11664
72
- scrapli-2024.7.30.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
73
- scrapli-2024.7.30.dist-info/top_level.txt,sha256=piC9TaaPt0z-1Ryrs69hDvsIQkmE5ceDAAW5donUvsI,8
74
- scrapli-2024.7.30.dist-info/RECORD,,
69
+ scrapli/transport/plugins/telnet/transport.py,sha256=DlcZoWtkTYQCoU633zd9iV7p8QcW-7_8zcKDClPthAw,8001
70
+ scrapli-2024.7.30.post1.dist-info/LICENSE,sha256=IeyhkG2h_dAvJ7nAF0S4GSUg045jwI27YADV_KSJi50,1071
71
+ scrapli-2024.7.30.post1.dist-info/METADATA,sha256=bLk0MtJbWP8nxa64swAwUV51lgv8IqrMjxl4o9fWtd0,11157
72
+ scrapli-2024.7.30.post1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
73
+ scrapli-2024.7.30.post1.dist-info/top_level.txt,sha256=piC9TaaPt0z-1Ryrs69hDvsIQkmE5ceDAAW5donUvsI,8
74
+ scrapli-2024.7.30.post1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (72.1.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5