ark-sdk-python 2.0.4__py3-none-any.whl → 2.0.6__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.
- ark_sdk_python/ark.py +1 -1
- ark_sdk_python/common/connections/ssh/ark_pty_ssh_connection.py +1 -0
- ark_sdk_python/common/connections/ssh/ark_pty_ssh_win_connection.py +235 -0
- ark_sdk_python/examples/validate_ssh_connection.py +31 -14
- {ark_sdk_python-2.0.4.dist-info → ark_sdk_python-2.0.6.dist-info}/METADATA +3 -2
- {ark_sdk_python-2.0.4.dist-info → ark_sdk_python-2.0.6.dist-info}/NOTICES.md +44 -43
- {ark_sdk_python-2.0.4.dist-info → ark_sdk_python-2.0.6.dist-info}/RECORD +10 -9
- {ark_sdk_python-2.0.4.dist-info → ark_sdk_python-2.0.6.dist-info}/LICENSE.txt +0 -0
- {ark_sdk_python-2.0.4.dist-info → ark_sdk_python-2.0.6.dist-info}/WHEEL +0 -0
- {ark_sdk_python-2.0.4.dist-info → ark_sdk_python-2.0.6.dist-info}/entry_points.txt +0 -0
ark_sdk_python/ark.py
CHANGED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import re
|
|
3
|
+
import subprocess
|
|
4
|
+
import threading
|
|
5
|
+
import time
|
|
6
|
+
from shutil import which
|
|
7
|
+
from typing import Any, Final, Optional
|
|
8
|
+
|
|
9
|
+
from overrides import overrides
|
|
10
|
+
|
|
11
|
+
from ark_sdk_python.common.connections.ark_connection import ArkConnection
|
|
12
|
+
from ark_sdk_python.common.connections.ssh.ark_ssh_connection import SSH_PORT
|
|
13
|
+
from ark_sdk_python.models import ArkException
|
|
14
|
+
from ark_sdk_python.models.common.connections import ArkConnectionCommand, ArkConnectionDetails, ArkConnectionResult
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ArkPTYSSHWinConnection(ArkConnection):
|
|
18
|
+
__ANSI_COLOR_STRIPPER: Final[Any] = re.compile(r'\x1b[^m]*m|\x1b\[\?2004[hl]')
|
|
19
|
+
__ANSI_ESCAPE_STRIPPER: Final[Any] = re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]')
|
|
20
|
+
__PROMPT_REGEX: Final[Any] = re.compile(r"[#$]")
|
|
21
|
+
__PASSWORD_PROMPT_REGEX: Final[Any] = re.compile(
|
|
22
|
+
r"(?i)(?:password:)|(?:passphrase for key)|(?:^Please enter your password[\s\S]+.+ >:$)"
|
|
23
|
+
)
|
|
24
|
+
__EXIT_MAKRER: Final[str] = '__ARK_RC_MARK__'
|
|
25
|
+
__DEFAULT_COL_SIZE: Final[int] = 80
|
|
26
|
+
__DEFAULT_ROW_SIZE: Final[int] = 24
|
|
27
|
+
__DEFAULT_NONEAGER_TIMEOEUT: Final[float] = 1.0
|
|
28
|
+
__DEFAULT_PROMPT_OVERALL_TIMEOUT: Final[float] = 20.0
|
|
29
|
+
__CHAR_SLEEP_TIME: Final[float] = 0.05
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
super().__init__()
|
|
33
|
+
self.__is_connected: bool = False
|
|
34
|
+
self.__is_suspended: bool = False
|
|
35
|
+
self.__pty: Optional[Any] = None
|
|
36
|
+
self.__output_lock: threading.Lock = threading.Lock()
|
|
37
|
+
self.__buffer: str = ''
|
|
38
|
+
|
|
39
|
+
def __strip_ansi(self, ansi_input: str) -> str:
|
|
40
|
+
ansi_input = ansi_input.strip()
|
|
41
|
+
ansi_input = ArkPTYSSHWinConnection.__ANSI_COLOR_STRIPPER.sub('', ansi_input)
|
|
42
|
+
ansi_input = ArkPTYSSHWinConnection.__ANSI_ESCAPE_STRIPPER.sub('', ansi_input)
|
|
43
|
+
return ansi_input
|
|
44
|
+
|
|
45
|
+
def __reset_buffer(self) -> None:
|
|
46
|
+
with self.__output_lock:
|
|
47
|
+
self.__buffer = ''
|
|
48
|
+
|
|
49
|
+
def __read_until_latest_prompt(
|
|
50
|
+
self,
|
|
51
|
+
password: Optional[str] = None,
|
|
52
|
+
noneager_timeout: float = __DEFAULT_NONEAGER_TIMEOEUT,
|
|
53
|
+
overall_timeout: float = __DEFAULT_PROMPT_OVERALL_TIMEOUT,
|
|
54
|
+
login_prompt: bool = False,
|
|
55
|
+
expected_prompt: Any = __PROMPT_REGEX,
|
|
56
|
+
) -> None:
|
|
57
|
+
buffer = ''
|
|
58
|
+
prompt_found_at = -1
|
|
59
|
+
start_time = time.time()
|
|
60
|
+
noneager_start_time = start_time
|
|
61
|
+
|
|
62
|
+
while True:
|
|
63
|
+
char = self.__pty.read(1)
|
|
64
|
+
if not char:
|
|
65
|
+
if ArkPTYSSHWinConnection.__PASSWORD_PROMPT_REGEX.search(self.__strip_ansi(buffer)) and not password and login_prompt:
|
|
66
|
+
raise RuntimeError(f'Password prompt with no password given [{buffer}]')
|
|
67
|
+
if (time.time() - noneager_start_time > noneager_timeout) and prompt_found_at != -1:
|
|
68
|
+
break
|
|
69
|
+
if (time.time() - start_time) > overall_timeout and prompt_found_at == -1:
|
|
70
|
+
raise RuntimeError(f'Timeout while waiting for prompt [{buffer}]')
|
|
71
|
+
time.sleep(ArkPTYSSHWinConnection.__CHAR_SLEEP_TIME)
|
|
72
|
+
continue
|
|
73
|
+
|
|
74
|
+
buffer += char
|
|
75
|
+
|
|
76
|
+
with self.__output_lock:
|
|
77
|
+
self.__buffer += char
|
|
78
|
+
|
|
79
|
+
if ArkPTYSSHWinConnection.__PASSWORD_PROMPT_REGEX.search(self.__strip_ansi(buffer)) and login_prompt:
|
|
80
|
+
if not password:
|
|
81
|
+
raise RuntimeError(f'Password prompt with no password given [{buffer}]')
|
|
82
|
+
self.__pty.write(password + '\n')
|
|
83
|
+
buffer = ""
|
|
84
|
+
prompt_found_at = -1
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
if expected_prompt.search(buffer):
|
|
88
|
+
prompt_found_at = len(buffer)
|
|
89
|
+
|
|
90
|
+
noneager_start_time = time.time()
|
|
91
|
+
|
|
92
|
+
if prompt_found_at != -1:
|
|
93
|
+
with self.__output_lock:
|
|
94
|
+
self.__buffer = buffer
|
|
95
|
+
|
|
96
|
+
@overrides
|
|
97
|
+
def connect(self, connection_details: ArkConnectionDetails) -> None:
|
|
98
|
+
"""
|
|
99
|
+
Performs SSH connection with given details or keys
|
|
100
|
+
Saves the ssh session to be used for command executions
|
|
101
|
+
Done using windows pty
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
connection_details (ArkConnectionDetails): _description_
|
|
105
|
+
|
|
106
|
+
Raises:
|
|
107
|
+
ArkException: _description_
|
|
108
|
+
"""
|
|
109
|
+
# pylint: disable=import-error
|
|
110
|
+
import winpty
|
|
111
|
+
|
|
112
|
+
if self.__is_connected:
|
|
113
|
+
return
|
|
114
|
+
|
|
115
|
+
address = connection_details.address
|
|
116
|
+
user = connection_details.credentials.user
|
|
117
|
+
port = connection_details.port or SSH_PORT
|
|
118
|
+
password = None
|
|
119
|
+
key_path = None
|
|
120
|
+
if connection_details.credentials.password:
|
|
121
|
+
password = connection_details.credentials.password.get_secret_value()
|
|
122
|
+
elif connection_details.credentials.private_key_filepath:
|
|
123
|
+
key_path = connection_details.credentials.private_key_filepath
|
|
124
|
+
|
|
125
|
+
ssh_args = [f'{user}@{address}', '-p', str(port), '-o', 'StrictHostKeyChecking=no']
|
|
126
|
+
if key_path:
|
|
127
|
+
ssh_args.extend(['-i', str(key_path)])
|
|
128
|
+
try:
|
|
129
|
+
self.__pty = winpty.PTY(
|
|
130
|
+
cols=ArkPTYSSHWinConnection.__DEFAULT_COL_SIZE,
|
|
131
|
+
rows=ArkPTYSSHWinConnection.__DEFAULT_ROW_SIZE,
|
|
132
|
+
backend=winpty.enums.Backend.WinPTY,
|
|
133
|
+
)
|
|
134
|
+
ssh_full_cmd = which('ssh', path=os.environ.get('PATH', os.defpath))
|
|
135
|
+
self.__pty.spawn(ssh_full_cmd, cmdline=' ' + subprocess.list2cmdline(ssh_args))
|
|
136
|
+
self.__read_until_latest_prompt(password, login_prompt=True)
|
|
137
|
+
self.__is_connected = True
|
|
138
|
+
except Exception as ex:
|
|
139
|
+
raise ArkException(f'Failed to ssh connect [{str(ex)}]') from ex
|
|
140
|
+
|
|
141
|
+
@overrides
|
|
142
|
+
def disconnect(self) -> None:
|
|
143
|
+
"""
|
|
144
|
+
Disconnects the ssh session
|
|
145
|
+
"""
|
|
146
|
+
if self.__pty:
|
|
147
|
+
self.__pty.write('exit\n')
|
|
148
|
+
self.__pty = None
|
|
149
|
+
self.__is_connected = False
|
|
150
|
+
self.__is_suspended = False
|
|
151
|
+
|
|
152
|
+
@overrides
|
|
153
|
+
def suspend_connection(self) -> None:
|
|
154
|
+
"""
|
|
155
|
+
Suspends execution of ssh commands
|
|
156
|
+
"""
|
|
157
|
+
self.__is_suspended = True
|
|
158
|
+
|
|
159
|
+
@overrides
|
|
160
|
+
def restore_connection(self) -> None:
|
|
161
|
+
"""
|
|
162
|
+
Restores execution of ssh commands
|
|
163
|
+
"""
|
|
164
|
+
self.__is_suspended = False
|
|
165
|
+
|
|
166
|
+
@overrides
|
|
167
|
+
def is_suspended(self) -> bool:
|
|
168
|
+
"""
|
|
169
|
+
Checks whether ssh commands can be executed or not
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
bool: _description_
|
|
173
|
+
"""
|
|
174
|
+
return self.__is_suspended
|
|
175
|
+
|
|
176
|
+
@overrides
|
|
177
|
+
def is_connected(self) -> bool:
|
|
178
|
+
"""
|
|
179
|
+
Checks whether theres a ssh session connected
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
bool: _description_
|
|
183
|
+
"""
|
|
184
|
+
return self.__is_connected
|
|
185
|
+
|
|
186
|
+
@overrides
|
|
187
|
+
def run_command(self, command: ArkConnectionCommand) -> ArkConnectionResult:
|
|
188
|
+
"""
|
|
189
|
+
Runs a command over ssh session via pty, returning the result accordingly
|
|
190
|
+
stderr is not supported, only stdout is returned, and it'll contain everything including stderr
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
command (ArkConnectionCommand): _description_
|
|
194
|
+
|
|
195
|
+
Raises:
|
|
196
|
+
ArkException: _description_
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
ArkConnectionResult: _description_
|
|
200
|
+
"""
|
|
201
|
+
if not self.__is_connected or self.__is_suspended:
|
|
202
|
+
raise ArkException('Cannot run command while not connected or suspended')
|
|
203
|
+
|
|
204
|
+
self._logger.debug(f'Running command [{command.command}]')
|
|
205
|
+
|
|
206
|
+
self.__reset_buffer()
|
|
207
|
+
self.__pty.write(command.command + "\n")
|
|
208
|
+
self.__read_until_latest_prompt()
|
|
209
|
+
|
|
210
|
+
with self.__output_lock:
|
|
211
|
+
stdout = self.__buffer.strip()
|
|
212
|
+
|
|
213
|
+
self.__reset_buffer()
|
|
214
|
+
self.__pty.write(f'echo {ArkPTYSSHWinConnection.__EXIT_MAKRER}_$?;\n')
|
|
215
|
+
self.__read_until_latest_prompt()
|
|
216
|
+
|
|
217
|
+
with self.__output_lock:
|
|
218
|
+
lines = self.__buffer.strip().splitlines()
|
|
219
|
+
|
|
220
|
+
rc = None
|
|
221
|
+
for line in lines:
|
|
222
|
+
line = self.__strip_ansi(line)
|
|
223
|
+
if line.startswith(f'{ArkPTYSSHWinConnection.__EXIT_MAKRER}_'):
|
|
224
|
+
try:
|
|
225
|
+
rc = int(line[len(ArkPTYSSHWinConnection.__EXIT_MAKRER) + 1 :]) # +1 for the underscore
|
|
226
|
+
break
|
|
227
|
+
except ValueError:
|
|
228
|
+
continue
|
|
229
|
+
if rc is None:
|
|
230
|
+
raise ArkException(f"Failed to parse exit code from output - [{self.__buffer}]")
|
|
231
|
+
if rc != command.expected_rc and command.raise_on_error:
|
|
232
|
+
raise ArkException(f'Failed to execute command [{command.command}] - [{rc}] - [{stdout}]')
|
|
233
|
+
self._logger.debug(f'Command rc: [{rc}]')
|
|
234
|
+
self._logger.debug(f'Command stdout: [{stdout}]')
|
|
235
|
+
return ArkConnectionResult(stdout=stdout, rc=rc)
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import argparse
|
|
2
|
+
import platform
|
|
2
3
|
import tempfile
|
|
3
4
|
|
|
4
5
|
from ark_sdk_python.auth import ArkISPAuth
|
|
5
6
|
from ark_sdk_python.common.ark_jwt_utils import ArkJWTUtils
|
|
6
7
|
from ark_sdk_python.common.connections.ssh.ark_pty_ssh_connection import ArkPTYSSHConnection
|
|
8
|
+
from ark_sdk_python.common.connections.ssh.ark_pty_ssh_win_connection import ArkPTYSSHWinConnection
|
|
7
9
|
from ark_sdk_python.models.auth import ArkAuthMethod, ArkAuthProfile, ArkSecret
|
|
8
|
-
from ark_sdk_python.models.auth.ark_auth_method import
|
|
10
|
+
from ark_sdk_python.models.auth.ark_auth_method import (
|
|
11
|
+
ArkAuthMethodsDescriptionMap,
|
|
12
|
+
IdentityArkAuthMethodSettings,
|
|
13
|
+
IdentityServiceUserArkAuthMethodSettings,
|
|
14
|
+
)
|
|
9
15
|
from ark_sdk_python.models.common.connections.ark_connection_command import ArkConnectionCommand
|
|
10
16
|
from ark_sdk_python.models.common.connections.ark_connection_credentials import ArkConnectionCredentials
|
|
11
17
|
from ark_sdk_python.models.common.connections.ark_connection_details import ArkConnectionDetails
|
|
@@ -13,29 +19,36 @@ from ark_sdk_python.models.services.sia.sso.ark_sia_sso_get_ssh_key import ArkSI
|
|
|
13
19
|
from ark_sdk_python.services.sia.sso import ArkSIASSOService
|
|
14
20
|
|
|
15
21
|
|
|
16
|
-
def login_to_identity_security_platform(
|
|
22
|
+
def login_to_identity_security_platform(user: str, secret: str, is_service_user: bool, application_name: str) -> ArkISPAuth:
|
|
17
23
|
"""
|
|
18
|
-
This will perform login to the tenant with the given
|
|
24
|
+
This will perform login to the tenant with the given user credentials
|
|
25
|
+
Where the user is normal or service user based on the boolean
|
|
19
26
|
Caching the logged in token is disabled and will perform a full login on each call
|
|
20
27
|
Will return an identity security platform authenticated class
|
|
21
28
|
|
|
22
29
|
Args:
|
|
23
|
-
|
|
24
|
-
|
|
30
|
+
user (str): _description_
|
|
31
|
+
secret (str): _description_
|
|
25
32
|
application_name (str): _description_
|
|
26
33
|
|
|
27
34
|
Returns:
|
|
28
35
|
ArkISPAuth: _description_
|
|
29
36
|
"""
|
|
30
|
-
print('Logging in to the tenant')
|
|
31
37
|
isp_auth = ArkISPAuth(cache_authentication=False)
|
|
38
|
+
auth_method = ArkAuthMethod.IdentityServiceUser if is_service_user else ArkAuthMethod.Identity
|
|
39
|
+
auth_methods_settings = (
|
|
40
|
+
IdentityServiceUserArkAuthMethodSettings(identity_authorization_application=application_name)
|
|
41
|
+
if is_service_user
|
|
42
|
+
else IdentityArkAuthMethodSettings()
|
|
43
|
+
)
|
|
44
|
+
print(f'Logging in to the tenant with [{ArkAuthMethodsDescriptionMap[auth_method]}] user type and user [{user}]')
|
|
32
45
|
isp_auth.authenticate(
|
|
33
46
|
auth_profile=ArkAuthProfile(
|
|
34
|
-
username=
|
|
35
|
-
auth_method=
|
|
36
|
-
auth_method_settings=
|
|
47
|
+
username=user,
|
|
48
|
+
auth_method=auth_method,
|
|
49
|
+
auth_method_settings=auth_methods_settings,
|
|
37
50
|
),
|
|
38
|
-
secret=ArkSecret(secret=
|
|
51
|
+
secret=ArkSecret(secret=secret),
|
|
39
52
|
)
|
|
40
53
|
print('Logged in successfully')
|
|
41
54
|
return isp_auth
|
|
@@ -92,7 +105,10 @@ def connect_and_validate_connection(ssh_key_path: str, proxy_address: str, conne
|
|
|
92
105
|
command (str): _description_
|
|
93
106
|
"""
|
|
94
107
|
print(f'Connecting to proxy [{proxy_address}] and connection string [{connection_string}]')
|
|
95
|
-
|
|
108
|
+
if platform.system() == 'Windows':
|
|
109
|
+
ssh_connection = ArkPTYSSHWinConnection()
|
|
110
|
+
else:
|
|
111
|
+
ssh_connection = ArkPTYSSHConnection()
|
|
96
112
|
ssh_connection.connect(
|
|
97
113
|
ArkConnectionDetails(
|
|
98
114
|
address=proxy_address,
|
|
@@ -112,8 +128,9 @@ def connect_and_validate_connection(ssh_key_path: str, proxy_address: str, conne
|
|
|
112
128
|
if __name__ == '__main__':
|
|
113
129
|
# Construct an argument parser for CLI parameters for the script
|
|
114
130
|
parser = argparse.ArgumentParser()
|
|
115
|
-
parser.add_argument('--
|
|
116
|
-
parser.add_argument('--
|
|
131
|
+
parser.add_argument('--user', required=True, help='User to login and perform the operation with')
|
|
132
|
+
parser.add_argument('--secret', required=True, help='User secret to use for logging in and connecting')
|
|
133
|
+
parser.add_argument('--is-service-user', action='store_true', help='Whether this user is a service user and not a normal user')
|
|
117
134
|
parser.add_argument(
|
|
118
135
|
'--service-application',
|
|
119
136
|
default='__idaptive_cybr_user_oidc',
|
|
@@ -139,7 +156,7 @@ if __name__ == '__main__':
|
|
|
139
156
|
# - Generate an MFA Caching SSH key
|
|
140
157
|
# - Construct the ssh proxy address
|
|
141
158
|
# - Connect in SSH to the proxy / target with the MFA Caching SSH Key and perform the command
|
|
142
|
-
isp_auth = login_to_identity_security_platform(args.
|
|
159
|
+
isp_auth = login_to_identity_security_platform(args.user, args.secret, args.is_service_user, args.service_application)
|
|
143
160
|
ssh_key_path = generate_mfa_caching_ssh_key(isp_auth, temp_folder)
|
|
144
161
|
proxy_address = construct_ssh_proxy_address(isp_auth)
|
|
145
162
|
connect_and_validate_connection(ssh_key_path, proxy_address, args.connection_string, args.test_command)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: ark-sdk-python
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.6
|
|
4
4
|
Summary: Official Ark SDK / CLI for CyberArk Identity Security Platform
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Author: CyberArk
|
|
@@ -29,13 +29,14 @@ Requires-Dist: keyrings.cryptfile
|
|
|
29
29
|
Requires-Dist: overrides
|
|
30
30
|
Requires-Dist: packaging
|
|
31
31
|
Requires-Dist: paramiko
|
|
32
|
-
Requires-Dist: pexpect
|
|
32
|
+
Requires-Dist: pexpect ; sys_platform != "win32"
|
|
33
33
|
Requires-Dist: progress
|
|
34
34
|
Requires-Dist: pycryptodome
|
|
35
35
|
Requires-Dist: pydantic (==2.*)
|
|
36
36
|
Requires-Dist: pyhumps
|
|
37
37
|
Requires-Dist: pyjwt
|
|
38
38
|
Requires-Dist: python-dateutil
|
|
39
|
+
Requires-Dist: pywinpty ; sys_platform == "win32"
|
|
39
40
|
Requires-Dist: pywinrm
|
|
40
41
|
Requires-Dist: pyyaml
|
|
41
42
|
Requires-Dist: requests
|
|
@@ -32,9 +32,11 @@ of the license associated with each component.
|
|
|
32
32
|
- https://github.com/regebro/tzlocal - [Tzlocal](#Tzlocal)
|
|
33
33
|
- https://github.com/yaml/pyyaml - [Pyyaml](#Pyyaml)
|
|
34
34
|
- https://github.com/diyan/pywinrm - [Pywinrm](#Pywinrm)
|
|
35
|
+
- https://github.com/andfoy/pywinpty - [Pywinpty](#Pywinpty)
|
|
35
36
|
|
|
36
37
|
- [SECTION 5: ISC](<SECTION 5: ISC>)
|
|
37
38
|
- https://github.com/verigak/progress - [Progress](#Progress)
|
|
39
|
+
- https://github.com/pexpect/pexpect - [Pexpect](#Pexpect)
|
|
38
40
|
|
|
39
41
|
- [SECTION 6: LGPL-2.1](<SECTION 5: LGPL-2.1>)
|
|
40
42
|
- https://github.com/paramiko/paramiko - [Paramiko](#Paramiko)
|
|
@@ -2059,58 +2061,26 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
2059
2061
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
2060
2062
|
THE SOFTWARE.
|
|
2061
2063
|
|
|
2064
|
+
## Pywinpty
|
|
2062
2065
|
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
## Progress
|
|
2066
|
-
|
|
2067
|
-
https://github.com/verigak/progress
|
|
2066
|
+
https://github.com/andfoy/pywinpty
|
|
2068
2067
|
|
|
2069
2068
|
### Authors / Copyright
|
|
2070
2069
|
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
Copyright (c) 2012 Georgios Verigakis <verigak@gmail.com>
|
|
2070
|
+
Copyright (c) 2017 Spyder IDE
|
|
2074
2071
|
|
|
2075
2072
|
### License
|
|
2076
2073
|
|
|
2077
|
-
|
|
2074
|
+
MIT License
|
|
2078
2075
|
|
|
2079
|
-
|
|
2080
|
-
purpose with or without fee is hereby granted, provided that the above
|
|
2081
|
-
copyright notice and this permission notice appear in all copies.
|
|
2076
|
+
Copyright (c) 2017 Spyder IDE
|
|
2082
2077
|
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
## Pyyaml
|
|
2093
|
-
|
|
2094
|
-
https://github.com/yaml/pyyaml
|
|
2095
|
-
|
|
2096
|
-
### Authors / Copyright
|
|
2097
|
-
|
|
2098
|
-
The PyYAML module was written by Kirill Simonov xi@resolvent.net. It is currently maintained by the YAML and Python communities.
|
|
2099
|
-
|
|
2100
|
-
Copyright (c) 2017-2021 Ingy döt Net
|
|
2101
|
-
Copyright (c) 2006-2016 Kirill Simonov
|
|
2102
|
-
|
|
2103
|
-
### License
|
|
2104
|
-
|
|
2105
|
-
Copyright (c) 2017-2021 Ingy döt Net
|
|
2106
|
-
Copyright (c) 2006-2016 Kirill Simonov
|
|
2107
|
-
|
|
2108
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
2109
|
-
this software and associated documentation files (the "Software"), to deal in
|
|
2110
|
-
the Software without restriction, including without limitation the rights to
|
|
2111
|
-
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
2112
|
-
of the Software, and to permit persons to whom the Software is furnished to do
|
|
2113
|
-
so, subject to the following conditions:
|
|
2078
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
2079
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
2080
|
+
in the Software without restriction, including without limitation the rights
|
|
2081
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
2082
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
2083
|
+
furnished to do so, subject to the following conditions:
|
|
2114
2084
|
|
|
2115
2085
|
The above copyright notice and this permission notice shall be included in all
|
|
2116
2086
|
copies or substantial portions of the Software.
|
|
@@ -2152,6 +2122,37 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
|
2152
2122
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
2153
2123
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
2154
2124
|
|
|
2125
|
+
## Pexpect
|
|
2126
|
+
|
|
2127
|
+
https://github.com/pexpect/pexpect
|
|
2128
|
+
|
|
2129
|
+
### Authors / Copyright
|
|
2130
|
+
|
|
2131
|
+
Copyright (c) 2013-2014, Pexpect development team
|
|
2132
|
+
Copyright (c) 2012, Noah Spurrier <noah@noah.org>
|
|
2133
|
+
|
|
2134
|
+
### License
|
|
2135
|
+
|
|
2136
|
+
ISC LICENSE
|
|
2137
|
+
|
|
2138
|
+
This license is approved by the OSI and FSF as GPL-compatible.
|
|
2139
|
+
http://opensource.org/licenses/isc-license.txt
|
|
2140
|
+
|
|
2141
|
+
Copyright (c) 2013-2014, Pexpect development team
|
|
2142
|
+
Copyright (c) 2012, Noah Spurrier <noah@noah.org>
|
|
2143
|
+
|
|
2144
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
2145
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
2146
|
+
copyright notice and this permission notice appear in all copies.
|
|
2147
|
+
|
|
2148
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
2149
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
2150
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
2151
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
2152
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
2153
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
2154
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
2155
|
+
|
|
2155
2156
|
|
|
2156
2157
|
# SECTION 6: LGPL-2.1
|
|
2157
2158
|
|
|
@@ -10,7 +10,7 @@ ark_sdk_python/actions/ark_service_exec_action.py,sha256=IHIm9oISRThOD8WNJe4oJX-
|
|
|
10
10
|
ark_sdk_python/args/__init__.py,sha256=mCb4UrIRL4u58QyUbqqH2xAU0VN91pxjK5sa_UwCM_k,279
|
|
11
11
|
ark_sdk_python/args/ark_args_formatter.py,sha256=-Rs_rGMIr1bprD1SfYlMsLoSOFgr_RFrRdREvbmPU6k,9204
|
|
12
12
|
ark_sdk_python/args/ark_pydantic_argparse.py,sha256=uupNLnUmO5LrTrRZsBv7qRKgDsx4GaJMwOUh1TCc1-w,40083
|
|
13
|
-
ark_sdk_python/ark.py,sha256=
|
|
13
|
+
ark_sdk_python/ark.py,sha256=IYvZ-F-dZHqy6sd2TAPPYZTPEbBK2NsBSETI7mQb1kk,1280
|
|
14
14
|
ark_sdk_python/ark_api.py,sha256=qEB2j-xf8kiSdAvTXrvEdqGDQ-l1aoEvktxnq7BYNRI,12486
|
|
15
15
|
ark_sdk_python/auth/__init__.py,sha256=1l29Rf3VhwmV8z3YROiQVcgrZYSeeCqVN4zna77tnlk,620
|
|
16
16
|
ark_sdk_python/auth/ark_auth.py,sha256=2fPlABM3AwWmb1h0lQPQAz93u1ZluYKv7axlfg4lq5Q,12988
|
|
@@ -43,7 +43,8 @@ ark_sdk_python/common/ark_system_config.py,sha256=cl44cYSgXZEnoRYu048aBeJwWRPdCT
|
|
|
43
43
|
ark_sdk_python/common/connections/__init__.py,sha256=RyARha6jTeaUw1cIGBSR7nOYxCV3fC24juKb-17yXLw,104
|
|
44
44
|
ark_sdk_python/common/connections/ark_connection.py,sha256=wjYpn_9EJ-B679006VqQREFeTOhINmw-heiRqlpuCnY,1613
|
|
45
45
|
ark_sdk_python/common/connections/ssh/__init__.py,sha256=Ycv3BDI2iw-N7BdRkpAv2Qi90O4bp8sPyNsJnuQLfWo,256
|
|
46
|
-
ark_sdk_python/common/connections/ssh/ark_pty_ssh_connection.py,sha256=
|
|
46
|
+
ark_sdk_python/common/connections/ssh/ark_pty_ssh_connection.py,sha256=mhrVYV9vx81lSRXCcPoV3KjxKvMDEZlHEROOB1mynLs,5013
|
|
47
|
+
ark_sdk_python/common/connections/ssh/ark_pty_ssh_win_connection.py,sha256=vAAvJ7AMML66B4GVjsSeqzPlJVrrNK2M34TqeVDYg2k,8557
|
|
47
48
|
ark_sdk_python/common/connections/ssh/ark_ssh_connection.py,sha256=yVtrM_clLScg1uNY-Fextiup59h2AIbKxQQadLfiqpw,5195
|
|
48
49
|
ark_sdk_python/common/connections/winrm/__init__.py,sha256=TX8jEK5BPwvlzgo8lH4sGDcY9oL593rdEutQL4MMra4,164
|
|
49
50
|
ark_sdk_python/common/connections/winrm/ark_winrm_connection.py,sha256=O8ifpvmuzFpvqvjb3wFmg576v5jFZwFHi20wlV2UtwE,6854
|
|
@@ -57,7 +58,7 @@ ark_sdk_python/examples/create_sia_vm_environment.py,sha256=omk2mb1yrAU8w3mNSqjH
|
|
|
57
58
|
ark_sdk_python/examples/default_suffix.py,sha256=GEAnsrVhNdsIZ2YRJd4Xs4HYv86UdmXwPwOs7ajcQIQ,662
|
|
58
59
|
ark_sdk_python/examples/list_pcloud_accounts.py,sha256=Xzq_LIp_woRgCt73w1AMlXbB6P8yNRHr1VGIBCyQswk,810
|
|
59
60
|
ark_sdk_python/examples/session_monitoring_activites.py,sha256=WSGISA4Qye8q22WpiHq0HKYTfbwLK7038mRHp2Kr9IQ,1632
|
|
60
|
-
ark_sdk_python/examples/validate_ssh_connection.py,sha256=
|
|
61
|
+
ark_sdk_python/examples/validate_ssh_connection.py,sha256=K9RB8eosbV-5m0Q-gx9YQWrp57D8oLB4jfCgQy44gdU,7094
|
|
61
62
|
ark_sdk_python/models/__init__.py,sha256=2EKDAGANDadQfJrnTjm2Jc7JnINcZOwCRXWHEXmIH6o,1082
|
|
62
63
|
ark_sdk_python/models/actions/__init__.py,sha256=2xPZhoHco50bmPX7rm6uPOAcYURoTP9J5KF4E3XNaFA,743
|
|
63
64
|
ark_sdk_python/models/actions/ark_configure_action_consts.py,sha256=-YNgiGv1GsQx-JvO0eXXrrOlDcH6sRDLdO7kvTHto-M,1143
|
|
@@ -479,9 +480,9 @@ ark_sdk_python/services/sia/workspaces/targetsets/__init__.py,sha256=UjHr81LMcMl
|
|
|
479
480
|
ark_sdk_python/services/sia/workspaces/targetsets/ark_sia_target_sets_workspace_service.py,sha256=o9_DzskTV94kkfc4m0Qk8lj5FV8rexRa5RzRwfe9Tbo,11254
|
|
480
481
|
ark_sdk_python/services/sm/__init__.py,sha256=jzKxEkZYOCW9y_byLfd_odae9m2sh1UfjaaKBVySWY0,95
|
|
481
482
|
ark_sdk_python/services/sm/ark_sm_service.py,sha256=Rh2dFjNz7VMJUnl43hxL07HEZ8_33KrU_lqfUrqUDn4,11517
|
|
482
|
-
ark_sdk_python-2.0.
|
|
483
|
-
ark_sdk_python-2.0.
|
|
484
|
-
ark_sdk_python-2.0.
|
|
485
|
-
ark_sdk_python-2.0.
|
|
486
|
-
ark_sdk_python-2.0.
|
|
487
|
-
ark_sdk_python-2.0.
|
|
483
|
+
ark_sdk_python-2.0.6.dist-info/LICENSE.txt,sha256=d4EzYx2apA3-GqrFY23wLtc6UmQNXG05gyLfZ3oWVRs,11358
|
|
484
|
+
ark_sdk_python-2.0.6.dist-info/METADATA,sha256=0boyvZWm2psQTxDhsESJNY003jTvErvxXcKmU_iDYcE,20178
|
|
485
|
+
ark_sdk_python-2.0.6.dist-info/NOTICES.md,sha256=vRzFZEsfBw5q3H1_cgZV50AVhNTqF8Smz9fSvn49Y1E,125803
|
|
486
|
+
ark_sdk_python-2.0.6.dist-info/WHEEL,sha256=QymApwX2NnTrOAORdnrvo1YegSC1EN2pJY0mOd9rfdE,110
|
|
487
|
+
ark_sdk_python-2.0.6.dist-info/entry_points.txt,sha256=v5bcuRn8w42ZKQspfvX3AliKmLVO6f7Zb_bma77p3vQ,47
|
|
488
|
+
ark_sdk_python-2.0.6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|