1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
|
"""scrapli.driver.base.async_driver"""
from types import TracebackType
from typing import Any, Optional, Type, TypeVar
from scrapli.channel import AsyncChannel
from scrapli.driver.base.base_driver import BaseDriver
from scrapli.exceptions import ScrapliValueError
from scrapli.transport import ASYNCIO_TRANSPORTS
_T = TypeVar("_T", bound="AsyncDriver")
class AsyncDriver(BaseDriver):
def __init__(self, **kwargs: Any):
super().__init__(**kwargs)
if self.transport_name not in ASYNCIO_TRANSPORTS:
raise ScrapliValueError(
"provided transport is *not* an asyncio transport, must use an async transport with"
" the AsyncDriver(s)"
)
self.channel = AsyncChannel(
transport=self.transport,
base_channel_args=self._base_channel_args,
)
if self.on_init:
self.on_init(self)
async def __aenter__(self: _T) -> _T:
"""
Enter method for context manager
Args:
N/A
Returns:
_T: a concrete implementation of the opened AsyncDriver object
Raises:
N/A
"""
await self.open()
return self
async def __aexit__(
self,
exception_type: Optional[Type[BaseException]],
exception_value: Optional[BaseException],
traceback: Optional[TracebackType],
) -> None:
"""
Exit method to cleanup for context manager
Args:
exception_type: exception type being raised
exception_value: message from exception being raised
traceback: traceback from exception being raised
Returns:
None
Raises:
N/A
"""
await self.close()
async def open(self) -> None:
"""
Open the scrapli connection
Args:
N/A
Returns:
None
Raises:
N/A
"""
self._pre_open_closing_log(closing=False)
await self.transport.open()
self.channel.open()
if (
self.transport_name
in (
"telnet",
"asynctelnet",
)
and not self.auth_bypass
):
await self.channel.channel_authenticate_telnet(
auth_username=self.auth_username, auth_password=self.auth_password
)
if self.on_open:
await self.on_open(self)
self._post_open_closing_log(closing=False)
async def close(self) -> None:
"""
Close the scrapli connection
Args:
N/A
Returns:
None
Raises:
N/A
"""
self._post_open_closing_log(closing=True)
if self.on_close:
await self.on_close(self)
self.transport.close()
self.channel.close()
self._post_open_closing_log(closing=True)
async def commandeer(self, conn: "AsyncDriver", execute_on_open: bool = True) -> None:
"""
Commandeer an existing connection
See docstring in sync version for more details: `scrapli.driver.base.sync_driver.commandeer`
Args:
conn: connection to commandeer
execute_on_open: execute the `on_open` function of the current object once the existing
connection has been commandeered
Returns:
None
Raises:
N/A
"""
original_logger = conn.logger
original_transport = conn.transport
original_transport_logger = conn.transport.logger
original_channel_logger = conn.channel.logger
original_channel_channel_log = conn.channel.channel_log
self.logger = original_logger
self.channel.logger = original_channel_logger
self.channel.transport = original_transport
self.transport = original_transport
self.transport.logger = original_transport_logger
if original_channel_channel_log is not None:
# if the original connection had a channel log we also commandeer that; note that when
# the new connection is closed this will also close the channel log; see docstring.
self.channel.channel_log = original_channel_channel_log
if execute_on_open and self.on_open is not None:
await self.on_open(self)
@staticmethod
def ___getwide___() -> None: # pragma: no cover
"""
Dumb inside joke easter egg :)
Args:
N/A
Returns:
None
Raises:
N/A
"""
wide = r"""
KKKXXXXXXXXXXNNNNNNNNNNNNNNNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
000000000000KKKKKKKKKKXXXXXXXXXXXXXXXXXNNXXK0Okxdoolllloodxk0KXNNWWNWWWWWWWWWWWWWWWWWWWWWWWWWWWWNNNN
kkkkkkkOOOOOOOOOOO00000000000000000000kdl:,... ..';coxOKKKKKKKKKKKKXKKXXKKKXXXXXKKKK000
kkkkkkkOOOOOOOOOOOO000000000000000Od:,. .,cdOKKKKKKKKKKKK0000OOOOOOOOOOOO
kkkkkkkkOOOOOOOOOOO0000000000000kc' .:d0KKKKKKKKK0KKOkOOOOOOOOOO0
kkkkkkkkOOOOOOOOOOOO00000000000o' ,o0KKKKKKKKKKOkOOOOOOOOO00
kkkkkkkkOOOOOOOOOOOOO000000000o. ;kKKKKKKKKKOkOOOOOOOOO00
OOOOOOOOOO0000000000000000K0Kk' 'xKKKKKKKKOkOOOOOOOOO00
KKKKKKKKKXXXXXXXXXXXXXXNNNNNNd. cXNNNNNNNK0000O00O0000
KKKKKKKKKXXXXXXXXXXXXNNNNNNNXl ............... :XWWWWWWWX000000000000
KKKKKKKKKXXXXXXXXXXXXXXNNNNNXc ...''',,,,,,;;,,,,,,'''...... .xWWWWWWWWX000000000000
KKKKKKKKKKKXXXXXXXXXXXXXNNNNK; ...',,,,;;;;;;;:::::::;;;;;;,,'. .oNWWWWWWWNK000000OOOO00
KKKKKKKKKKKKXXXXXXXXXXXXXXXN0, ...'',,,;;;;;;:::::::::::::::;;;;,'. .dNWWWWWWWWNK0000OOOOOOOO
0000KKKKKKKKKKKKKXXXXXXXXXXN0, ..'',,,,;;;;;;:::::::::::::::::;;;;,,.. ;ONNNNNWWWWWNK00OOOOOOOOOO
kkkkkkOOOOOOOOOOOOOOOOOOO000k; ..,,,,,,'',,;;::::::::::::::::;;;;;;,'. .lOKKKKXXKXXKK0OOOOOOOOOOOOO
xxxkkkkkkkkkkkkkkkkkkOOOOkdll;..',,,,,,,''...';::ccccc:::::::::;;;;;,...o0000000000000OkkOOOkkOOOOOO
xxxxxxkkkkkkkkkkkkkkkkkkOd:;;,..,;;;;;;;;;;,'',,;:ccccccccc:::;;;;;;,..cO0000000000000Oxkkkkkkkkkkkk
xxxxxxxxkkkkkkkkkkkkkkkkkl:;;,'';;;;;,'''''',,,,,;::ccc::;,,'.'''',;,,lO00000000000000kxkkkkkkkkkkkk
xxxxxxxxkkkkkkkkkkkkkkkkko::;'';;;;;;,''....,'',,,,;:c:;,,'''',,;;;;,:x00000000000000Okxkkkkkkkkkkkk
xxxxxxxxxxkkkkkkkkkkkkkkkxl;,,;;;;:::;;;,,,,,,,,,,,,:c:;,'....''',;;,;cxO000000000000Okxkkkkkkkkkkkk
kkkkOOOOOOOOOOOOOO00000000x:;;;;;:::c::::::;;;;;;;;;:c:;,,,,'',,',;:::lOKKKKKKXXXXXXKKOkkkkkkkkkkkkk
000000000000000KKKKKKKKKKK0dc;,;;:::ccccccc::::;;;;;:cc:;;;;:::::::::lOXXXXXNNNNNNNNXX0Okkkkkkkkkkkk
OO00000000000000000KKKKKKKK0d::;;;::ccccccccc:;;;;;;;:c:;::ccccccc::cOXXXXXXXXXNNNNNXX0kkkkkkkkkkkkk
OOO00000000000000000000KKKKKOxxc;;;::ccccccc:;;;;;;;:ccc:::cccllcc;:kKXXXXXXXXXXXXXXXKOkkkkkkkkkkkkk
OOOOO00000000000000000000KKK0kdl;;;;;:ccccc::;,,,,;;:clc:::cclllcc:oKXXXXXXXXXXXXXXXXKOkkkkkkkkkkkkk
OOOOOOO0000000000000000Okxdlc;,,;;::;;::cc::;;,,,,,;:::;;:cccccc::clxkO00KKKKKKKKKXKK0kkkkkkkkkkkxkk
kkkkkkkkkkkkkkkkkkkxdoc:,''.....,;:::;;;::;;;;;;;;;;;;;;;:ccc:::;,',;;:clodxkOOOOOOOOkxxxxxxxxxxxxxx
ddddddddddddddoolc;,'''..........,;;:;;;::;,,,,,;;;;;::::::c:::;'.',,;;;;;::clodxkkkkxdxxxxxxxxxxxxx
dddddddoolc::;,'''....... ..',;;;;;;;;,'........',;::::::;;,,;;;;;;;;:::::ccloddddxxxxxxxxxxxxx
dollc:;,,''......... ..'''',,,,;;;;;,'''.....'',::::;,,;;;::::;;,,;;;;;;;;;::cldxxxxxxdxxdxx
l;'''.''...... ..'',,''',,,,;;;::;;,,,,,,;;::;;'.....',;;,,''',,,,,,'',,,',:odxddddddddd
............. .'',,,,,''',,,;;;;::::;::::::;;;........'''''''..'.....,,'...';cdddddddddd
. ....... .',,,,,;,,'',,,,;;;::::::::::;;cc. .....''...'''.......','......':odxdddddd
... .',,;;;;;;,'',;;,,,;;;::::::::;cxo....................''''.......'';lddddddd
.. .,;,;;;;;;,,,',;;;,,,,;;;;;;;;:dKO:..................''''.. .......',cdddddd
,:;;;;;,,,,;,,;::;,,,,,;::::::dK0c..................'''.. ........',codddd
.;:;;;;;,,;;;,,;:;;:;,,;:::::clc,... ...........'''.... .... .....':oddd
.',;;;;;;;;;,,;:;;;;,;::::::;'...... ......'......... .....'',cood
..,;;;;;;;;;;;:;;;;:::::;'. . .............. ...''',:od
..',;;;;:;;;:::::::,,'. ............... ....''.':o
...',,;;,,;,,'.. ............... .. .....'c
__ _ __.... ................ .... ......'
____ ____ / /_ _ __(_)___/ /__ .............. .. ... .......
/ __ `/ _ \/ __/ | | /| / / / __ / _ \ ................ . ......
/ /_/ / __/ /_ | |/ |/ / / /_/ / __/ ................. ......
\__, /\___/\__/ |__/|__/_/\__,_/\___/ ............... ......
/____/ ............... .. ........
"""
print(wide)
|