cloudshell-cli 4.0.6__zip → 4.1.2__zip
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.
- {cloudshell-cli-4.0.6/cloudshell_cli.egg-info → cloudshell-cli-4.1.2}/PKG-INFO +2 -5
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/configurator.py +37 -38
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/examples/cli_demo/connect_to_switch/SwitchClihandler.py +0 -1
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/examples/cli_demo/connect_to_ubuntu/runnur.py +0 -1
- cloudshell-cli-4.1.2/cloudshell/cli/factory/session_factory.py +96 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/command_mode_helper.py +2 -2
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/expect_session.py +0 -1
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/scpi_session.py +0 -1
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/ssh_session.py +21 -1
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/tcp_session.py +0 -1
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/telnet_session.py +1 -1
- cloudshell-cli-4.1.2/cloudshell/cli/session_pool_context_manager.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2/cloudshell_cli.egg-info}/PKG-INFO +2 -5
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell_cli.egg-info/SOURCES.txt +2 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/setup.py +1 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/session/test_ssh_session.py +10 -15
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tox.ini +1 -1
- cloudshell-cli-4.1.2/version.txt +1 -0
- cloudshell-cli-4.0.6/version.txt +0 -1
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/LICENSE +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/MANIFEST.in +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/README.txt +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/cli.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/command_template/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/command_template/command_template.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/command_template/command_template_executor.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/examples/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/examples/cli_demo/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/examples/cli_demo/connect_to_AWS/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/examples/cli_demo/connect_to_AWS/runnur.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/examples/cli_demo/connect_to_switch/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/examples/cli_demo/connect_to_switch/runner.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/examples/cli_demo/connect_to_ubuntu/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/examples/cli_demo/connect_to_ubuntu/readfrom.txt +0 -0
- {cloudshell-cli-4.0.6/cloudshell/cli/service → cloudshell-cli-4.1.2/cloudshell/cli/factory}/__init__.py +0 -0
- /cloudshell-cli-4.0.6/cloudshell/cli/session_pool_context_manager.py → /cloudshell-cli-4.1.2/cloudshell/cli/service/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/cli.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/cli_exception.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/cli_service.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/cli_service_impl.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/command_mode.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/node.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/session_manager.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/session_manager_impl.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/session_pool.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/session_pool_context_manager.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/session_pool_manager.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/connection_params.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/helper/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/helper/normalize_buffer.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/session.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/session_exceptions.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/tl1_session.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell_cli.egg-info/dependency_links.txt +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell_cli.egg-info/requires.txt +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell_cli.egg-info/top_level.txt +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/dev_requirements.txt +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/requirements.txt +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/setup.cfg +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/test_requirements.txt +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/command_template/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/command_template/test_command_template.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/session/__init__.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/session/test_connection_params.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/session/test_expect_session.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/session/test_expect_session_py3.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/session/test_telnet_session.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/test_cli.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/test_cli_service_impl.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/test_command_mode.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/test_command_mode_helper.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/test_node.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/test_session_manager.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/test_session_pool_context_manager.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/test_session_pool_manager.py +0 -0
- {cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/conftest.py +0 -0
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: cloudshell-cli
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.1.2
|
|
4
4
|
Summary: QualiSystems CloudShell CLI support package
|
|
5
5
|
Home-page: http://www.qualisystems.com/
|
|
6
6
|
Author: QualiSystems
|
|
7
7
|
Author-email: info@qualisystems.com
|
|
8
|
-
License: UNKNOWN
|
|
9
|
-
Platform: UNKNOWN
|
|
10
8
|
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*, <4
|
|
11
9
|
License-File: LICENSE
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
QualiSystems CloudShell CLI support package
|
|
@@ -2,7 +2,13 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
import sys
|
|
4
4
|
from abc import ABCMeta, abstractmethod
|
|
5
|
+
from collections import defaultdict
|
|
5
6
|
|
|
7
|
+
from cloudshell.cli.factory.session_factory import (
|
|
8
|
+
CloudInfoAccessKeySessionFactory,
|
|
9
|
+
GenericSessionFactory,
|
|
10
|
+
SessionFactory,
|
|
11
|
+
)
|
|
6
12
|
from cloudshell.cli.service.cli import CLI
|
|
7
13
|
from cloudshell.cli.session.ssh_session import SSHSession
|
|
8
14
|
from cloudshell.cli.session.telnet_session import TelnetSession
|
|
@@ -16,39 +22,33 @@ else:
|
|
|
16
22
|
|
|
17
23
|
|
|
18
24
|
class CLIServiceConfigurator(object):
|
|
19
|
-
REGISTERED_SESSIONS = (SSHSession, TelnetSession)
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
REGISTERED_SESSIONS = (CloudInfoAccessKeySessionFactory(SSHSession), TelnetSession)
|
|
26
|
+
"""Using factories instead of """
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
resource_config,
|
|
31
|
+
logger,
|
|
32
|
+
cli=None,
|
|
33
|
+
registered_sessions=None,
|
|
34
|
+
access_key=None,
|
|
35
|
+
access_key_passphrase=None,
|
|
36
|
+
):
|
|
22
37
|
"""Initialize CLI service configurator.
|
|
23
38
|
|
|
24
39
|
:param cloudshell.shell.standards.resource_config_generic_models.GenericCLIConfig resource_config: # noqa: E501
|
|
25
40
|
:param logging.Logger logger:
|
|
26
41
|
:param cloudshell.cli.service.cli.CLI cli:
|
|
27
42
|
:param registered_sessions: Session types and order
|
|
43
|
+
:param access_key: access key for the resource
|
|
44
|
+
:param access_key_passphrase: access key passphrase for the resource
|
|
28
45
|
"""
|
|
29
46
|
self._cli = cli or CLI()
|
|
30
47
|
self._resource_config = resource_config
|
|
31
48
|
self._logger = logger
|
|
32
49
|
self._registered_sessions = registered_sessions or self.REGISTERED_SESSIONS
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def _username(self):
|
|
36
|
-
return self._resource_config.user
|
|
37
|
-
|
|
38
|
-
@property
|
|
39
|
-
@lru_cache()
|
|
40
|
-
def _password(self):
|
|
41
|
-
return self._resource_config.password
|
|
42
|
-
|
|
43
|
-
@property
|
|
44
|
-
def _resource_address(self):
|
|
45
|
-
"""Resource IP."""
|
|
46
|
-
return self._resource_config.address
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def _port(self):
|
|
50
|
-
"""Connection port property, to open socket on."""
|
|
51
|
-
return self._resource_config.cli_tcp_port
|
|
50
|
+
self._access_key = access_key
|
|
51
|
+
self._access_key_passphrase = access_key_passphrase
|
|
52
52
|
|
|
53
53
|
@property
|
|
54
54
|
def _cli_type(self):
|
|
@@ -58,29 +58,28 @@ class CLIServiceConfigurator(object):
|
|
|
58
58
|
@property
|
|
59
59
|
@lru_cache()
|
|
60
60
|
def _session_dict(self):
|
|
61
|
-
|
|
61
|
+
session_dict = defaultdict(list)
|
|
62
|
+
for sess in self._registered_sessions:
|
|
63
|
+
session_dict[sess.SESSION_TYPE.lower()].append(sess)
|
|
64
|
+
return session_dict
|
|
62
65
|
|
|
63
66
|
def _on_session_start(self, session, logger):
|
|
64
|
-
"""Perform some default commands when session just opened.
|
|
65
|
-
|
|
66
|
-
Like 'no logging console'
|
|
67
|
-
"""
|
|
68
67
|
pass
|
|
69
68
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
return
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
69
|
+
def initialize_session(self, session):
|
|
70
|
+
if not isinstance(session, SessionFactory):
|
|
71
|
+
session = GenericSessionFactory(session)
|
|
72
|
+
return session.init_session(
|
|
73
|
+
self._resource_config,
|
|
74
|
+
self._logger,
|
|
75
|
+
on_session_start=self._on_session_start,
|
|
76
|
+
access_key=self._access_key,
|
|
77
|
+
access_key_passphrase=self._access_key_passphrase,
|
|
78
|
+
)
|
|
80
79
|
|
|
81
80
|
def _defined_sessions(self):
|
|
82
81
|
return [
|
|
83
|
-
|
|
82
|
+
self.initialize_session(sess)
|
|
84
83
|
for sess in self._session_dict.get(
|
|
85
84
|
self._cli_type.lower(), self._registered_sessions
|
|
86
85
|
)
|
|
@@ -96,7 +96,6 @@ class SwitchCliHandler(CliHandlerImpl):
|
|
|
96
96
|
session.hardware_expect("exit", EnableCommandMode.PROMPT, logger)
|
|
97
97
|
|
|
98
98
|
def enter_enable_mode(self, session, logger):
|
|
99
|
-
|
|
100
99
|
enable_password = get_attribute_by_name(
|
|
101
100
|
attribute_name="Enable Password", context=self._context
|
|
102
101
|
)
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
from abc import ABCMeta, abstractmethod
|
|
4
|
+
|
|
5
|
+
ABC = ABCMeta("ABC", (object,), {"__slots__": ()})
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SessionFactory(ABC):
|
|
9
|
+
"""Session factory.
|
|
10
|
+
|
|
11
|
+
Help to initialize session for specified session class.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def __init__(self, session_class):
|
|
15
|
+
""":param session_class: Session class."""
|
|
16
|
+
self.session_class = session_class
|
|
17
|
+
|
|
18
|
+
@abstractmethod
|
|
19
|
+
def init_session(
|
|
20
|
+
self,
|
|
21
|
+
resource_config,
|
|
22
|
+
logger,
|
|
23
|
+
on_session_start=None,
|
|
24
|
+
access_key=None,
|
|
25
|
+
access_key_passphrase=None,
|
|
26
|
+
):
|
|
27
|
+
"""Initialize session instance.
|
|
28
|
+
|
|
29
|
+
Encapsulate the logic of the session instance creation.
|
|
30
|
+
:param resource_config:
|
|
31
|
+
:param logging.Logger logger:
|
|
32
|
+
:param on_session_start: function that will be called on session start
|
|
33
|
+
:param access_key: access key for the resource
|
|
34
|
+
:param access_key_passphrase: access key passphrase for the resource
|
|
35
|
+
"""
|
|
36
|
+
raise NotImplementedError
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class GenericSessionFactory(SessionFactory):
|
|
40
|
+
def init_session(
|
|
41
|
+
self,
|
|
42
|
+
resource_config,
|
|
43
|
+
logger,
|
|
44
|
+
on_session_start=None,
|
|
45
|
+
access_key=None,
|
|
46
|
+
access_key_passphrase=None,
|
|
47
|
+
):
|
|
48
|
+
return self.session_class(
|
|
49
|
+
**self._session_kwargs(
|
|
50
|
+
resource_config,
|
|
51
|
+
logger,
|
|
52
|
+
on_session_start,
|
|
53
|
+
access_key,
|
|
54
|
+
access_key_passphrase,
|
|
55
|
+
)
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def SESSION_TYPE(self):
|
|
60
|
+
return self.session_class.SESSION_TYPE
|
|
61
|
+
|
|
62
|
+
def _session_kwargs(
|
|
63
|
+
self,
|
|
64
|
+
resource_config,
|
|
65
|
+
logger,
|
|
66
|
+
on_session_start,
|
|
67
|
+
access_key,
|
|
68
|
+
access_key_passphrase,
|
|
69
|
+
):
|
|
70
|
+
return {
|
|
71
|
+
"host": resource_config.address,
|
|
72
|
+
"username": resource_config.user,
|
|
73
|
+
"password": resource_config.password,
|
|
74
|
+
"port": resource_config.cli_tcp_port,
|
|
75
|
+
"on_session_start": on_session_start,
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class CloudInfoAccessKeySessionFactory(GenericSessionFactory):
|
|
80
|
+
def _session_kwargs(
|
|
81
|
+
self,
|
|
82
|
+
resource_config,
|
|
83
|
+
logger,
|
|
84
|
+
on_session_start,
|
|
85
|
+
access_key,
|
|
86
|
+
access_key_passphrase,
|
|
87
|
+
):
|
|
88
|
+
return {
|
|
89
|
+
"host": resource_config.address,
|
|
90
|
+
"username": resource_config.user,
|
|
91
|
+
"password": resource_config.password,
|
|
92
|
+
"port": resource_config.cli_tcp_port,
|
|
93
|
+
"pkey": access_key,
|
|
94
|
+
"pkey_passphrase": access_key_passphrase,
|
|
95
|
+
"on_session_start": on_session_start,
|
|
96
|
+
}
|
|
@@ -35,7 +35,7 @@ class CommandModeHelper(NodeOperations):
|
|
|
35
35
|
|
|
36
36
|
:rtype: OrderedDict
|
|
37
37
|
"""
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
def _get_child_nodes(command_node):
|
|
40
40
|
return reduce(
|
|
41
41
|
lambda x, y: x + _get_child_nodes(y),
|
|
@@ -60,7 +60,7 @@ class CommandModeHelper(NodeOperations):
|
|
|
60
60
|
|
|
61
61
|
:rtype: dict
|
|
62
62
|
"""
|
|
63
|
-
|
|
63
|
+
|
|
64
64
|
def _create_child_modes(instance, child_dict):
|
|
65
65
|
instance_dict = {}
|
|
66
66
|
for mode_type in child_dict:
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from io import StringIO
|
|
2
|
+
|
|
1
3
|
import paramiko
|
|
2
4
|
from scp import SCPClient
|
|
3
5
|
|
|
@@ -22,6 +24,7 @@ class SSHSession(ExpectSession, ConnectionParams):
|
|
|
22
24
|
port=None,
|
|
23
25
|
on_session_start=None,
|
|
24
26
|
pkey=None,
|
|
27
|
+
pkey_passphrase=None,
|
|
25
28
|
*args,
|
|
26
29
|
**kwargs
|
|
27
30
|
):
|
|
@@ -36,6 +39,7 @@ class SSHSession(ExpectSession, ConnectionParams):
|
|
|
36
39
|
self.username = username
|
|
37
40
|
self.password = password
|
|
38
41
|
self.pkey = pkey
|
|
42
|
+
self.pkey_passphrase = pkey_passphrase
|
|
39
43
|
|
|
40
44
|
self._handler = None
|
|
41
45
|
self._current_channel = None
|
|
@@ -52,6 +56,7 @@ class SSHSession(ExpectSession, ConnectionParams):
|
|
|
52
56
|
self.username == other.username,
|
|
53
57
|
self.password == other.password,
|
|
54
58
|
self.pkey == other.pkey,
|
|
59
|
+
self.pkey_passphrase == other.pkey_passphrase,
|
|
55
60
|
]
|
|
56
61
|
)
|
|
57
62
|
|
|
@@ -80,7 +85,7 @@ class SSHSession(ExpectSession, ConnectionParams):
|
|
|
80
85
|
banner_timeout=30,
|
|
81
86
|
allow_agent=False,
|
|
82
87
|
look_for_keys=False,
|
|
83
|
-
pkey=self.pkey,
|
|
88
|
+
pkey=self._get_pkey_object(self.pkey, self.pkey_passphrase, logger),
|
|
84
89
|
)
|
|
85
90
|
except Exception as e:
|
|
86
91
|
logger.exception("Failed to initialize session:")
|
|
@@ -161,3 +166,18 @@ class SSHSession(ExpectSession, ConnectionParams):
|
|
|
161
166
|
sftp.putfo(file_stream, dest_pathname)
|
|
162
167
|
sftp.chmod(dest_pathname, int(dest_permissions, base=8))
|
|
163
168
|
sftp.close()
|
|
169
|
+
|
|
170
|
+
@staticmethod
|
|
171
|
+
def _get_pkey_object(key_material, passphrase, logger):
|
|
172
|
+
"""Try to detect private key type and return paramiko.PKey object."""
|
|
173
|
+
if not key_material:
|
|
174
|
+
return None
|
|
175
|
+
|
|
176
|
+
for cls in [paramiko.RSAKey, paramiko.DSSKey, paramiko.ECDSAKey]:
|
|
177
|
+
try:
|
|
178
|
+
key = cls.from_private_key(StringIO(key_material), password=passphrase)
|
|
179
|
+
except paramiko.ssh_exception.SSHException as e:
|
|
180
|
+
# Invalid key, try other key type
|
|
181
|
+
logger.warning(e)
|
|
182
|
+
else:
|
|
183
|
+
return key
|
|
File without changes
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: cloudshell-cli
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.1.2
|
|
4
4
|
Summary: QualiSystems CloudShell CLI support package
|
|
5
5
|
Home-page: http://www.qualisystems.com/
|
|
6
6
|
Author: QualiSystems
|
|
7
7
|
Author-email: info@qualisystems.com
|
|
8
|
-
License: UNKNOWN
|
|
9
|
-
Platform: UNKNOWN
|
|
10
8
|
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*, <4
|
|
11
9
|
License-File: LICENSE
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
QualiSystems CloudShell CLI support package
|
|
@@ -26,6 +26,8 @@ cloudshell/cli/examples/cli_demo/connect_to_switch/runner.py
|
|
|
26
26
|
cloudshell/cli/examples/cli_demo/connect_to_ubuntu/__init__.py
|
|
27
27
|
cloudshell/cli/examples/cli_demo/connect_to_ubuntu/readfrom.txt
|
|
28
28
|
cloudshell/cli/examples/cli_demo/connect_to_ubuntu/runnur.py
|
|
29
|
+
cloudshell/cli/factory/__init__.py
|
|
30
|
+
cloudshell/cli/factory/session_factory.py
|
|
29
31
|
cloudshell/cli/service/__init__.py
|
|
30
32
|
cloudshell/cli/service/cli.py
|
|
31
33
|
cloudshell/cli/service/cli_exception.py
|
|
@@ -443,9 +443,6 @@ class TestSshSession(TestCase):
|
|
|
443
443
|
)
|
|
444
444
|
)
|
|
445
445
|
|
|
446
|
-
pkey = paramiko.RSAKey.from_private_key(
|
|
447
|
-
StringIO(KEY_WITH_PASSPHRASE), password=KEY_PASSPHRASE
|
|
448
|
-
)
|
|
449
446
|
self.assertFalse(
|
|
450
447
|
self._instance.__eq__(
|
|
451
448
|
SSHSession(
|
|
@@ -454,23 +451,22 @@ class TestSshSession(TestCase):
|
|
|
454
451
|
"",
|
|
455
452
|
port=self._port,
|
|
456
453
|
on_session_start=self._on_session_start,
|
|
457
|
-
pkey=
|
|
454
|
+
pkey=KEY_WITH_PASSPHRASE,
|
|
455
|
+
pkey_passphrase=KEY_PASSPHRASE,
|
|
458
456
|
)
|
|
459
457
|
)
|
|
460
458
|
)
|
|
461
459
|
|
|
462
460
|
@patch("cloudshell.cli.session.ssh_session.ExpectSession")
|
|
463
461
|
def test_eq_rsa(self, expect_session):
|
|
464
|
-
pkey = paramiko.RSAKey.from_private_key(
|
|
465
|
-
StringIO(KEY_WITH_PASSPHRASE), password=KEY_PASSPHRASE
|
|
466
|
-
)
|
|
467
462
|
self._instance = SSHSession(
|
|
468
463
|
self._hostname,
|
|
469
464
|
self._username,
|
|
470
465
|
self._password,
|
|
471
466
|
port=self._port,
|
|
472
467
|
on_session_start=self._on_session_start,
|
|
473
|
-
pkey=
|
|
468
|
+
pkey=KEY_WITH_PASSPHRASE,
|
|
469
|
+
pkey_passphrase=KEY_PASSPHRASE,
|
|
474
470
|
)
|
|
475
471
|
|
|
476
472
|
self.assertTrue(
|
|
@@ -481,7 +477,8 @@ class TestSshSession(TestCase):
|
|
|
481
477
|
self._password,
|
|
482
478
|
port=self._port,
|
|
483
479
|
on_session_start=self._on_session_start,
|
|
484
|
-
pkey=
|
|
480
|
+
pkey=KEY_WITH_PASSPHRASE,
|
|
481
|
+
pkey_passphrase=KEY_PASSPHRASE,
|
|
485
482
|
)
|
|
486
483
|
)
|
|
487
484
|
)
|
|
@@ -640,16 +637,13 @@ class TestSshSession(TestCase):
|
|
|
640
637
|
"",
|
|
641
638
|
port=server.port,
|
|
642
639
|
on_session_start=self._on_session_start,
|
|
643
|
-
pkey=
|
|
640
|
+
pkey=KEY_WITH_PASSPHRASE,
|
|
641
|
+
pkey_passphrase=KEY_PASSPHRASE,
|
|
644
642
|
)
|
|
645
643
|
self._instance.connect(">", logger=Mock())
|
|
646
644
|
self._instance.hardware_expect("dummy command", ">", Mock())
|
|
647
645
|
|
|
648
646
|
def test_rsa_failure(self):
|
|
649
|
-
pkey = paramiko.RSAKey.from_private_key(
|
|
650
|
-
StringIO(KEY_WITH_PASSPHRASE), password=KEY_PASSPHRASE
|
|
651
|
-
)
|
|
652
|
-
|
|
653
647
|
server = SSHServer(user2key={})
|
|
654
648
|
|
|
655
649
|
with self.assertRaises(SSHSessionException):
|
|
@@ -659,7 +653,8 @@ class TestSshSession(TestCase):
|
|
|
659
653
|
"",
|
|
660
654
|
port=server.port,
|
|
661
655
|
on_session_start=self._on_session_start,
|
|
662
|
-
pkey=
|
|
656
|
+
pkey=KEY_WITH_PASSPHRASE,
|
|
657
|
+
pkey_passphrase=KEY_PASSPHRASE,
|
|
663
658
|
)
|
|
664
659
|
self._instance.connect(">", logger=Mock())
|
|
665
660
|
self._instance.hardware_expect("dummy command", ">", Mock())
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4.1.2
|
cloudshell-cli-4.0.6/version.txt
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
4.0.6
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/command_template/command_template.py
RENAMED
|
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
|
{cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/session_manager_impl.py
RENAMED
|
File without changes
|
|
File without changes
|
{cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/session_pool_context_manager.py
RENAMED
|
File without changes
|
{cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/service/session_pool_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/cloudshell/cli/session/helper/normalize_buffer.py
RENAMED
|
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
|
{cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/command_template/test_command_template.py
RENAMED
|
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
|
{cloudshell-cli-4.0.6 → cloudshell-cli-4.1.2}/tests/cli/test_session_pool_context_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|