1
1
import urllib3
2
+ from base64 import urlsafe_b64encode
2
3
3
4
from CommonServerPython import *
4
5
5
6
6
7
class Client :
7
- def __init__ (self , server_url , verify , proxy , headers , client_cert , client_key ):
8
+ def __init__ (self , server_url , verify , proxy , headers , client_cert , client_key , ca_cert ):
9
+ ca_cert_path = ''
10
+ if ca_cert :
11
+ ca_cert_path = 'ca.cert'
12
+ with open (ca_cert_path , 'wb' ) as file :
13
+ file .write (ca_cert .encode ())
14
+ self ._verify = ca_cert_path
15
+ else :
16
+ self ._verify = verify
8
17
self ._base_url = server_url
9
- self ._verify = verify
10
18
self ._proxy = proxy
11
- self ._headers = headers
19
+ self ._headers = headers if headers else dict ()
12
20
self ._client_cert = client_cert
13
21
self ._client_key = client_key
14
22
23
+ def reg_auth (self , identitytoken , registry_username , registry_password , registry_serveraddress ):
24
+ if identitytoken and any ([registry_username , registry_password , registry_serveraddress ]):
25
+ raise ValueError (
26
+ "Registry IdentityToken and Credential auth paramaters provided. \
27
+ Can only use one authentication method not both." )
28
+ if identitytoken :
29
+ json_string = json .dumps ({"identitytoken" : identitytoken })
30
+ self ._headers ['X-Registry-Auth' ] = urlsafe_b64encode (json_string .encode ('utf-8' ))
31
+ else :
32
+ if not all ([registry_username , registry_password , registry_serveraddress ]):
33
+ raise ValueError ("Credential Auth method requires registry_username, registry_password, registry_serveraddress" )
34
+ json_string = json .dumps ({"username" : registry_username , "password" : registry_password ,
35
+ "serveraddress" : registry_serveraddress })
36
+ self ._headers ['X-Registry-Auth' ] = urlsafe_b64encode (json_string .encode ('utf-8' ))
37
+
15
38
def _http_request (self , method , url_suffix = '' , full_url = None , params = None , headers = None , data = None , json_data = None ):
16
39
address = full_url if full_url else urljoin (self ._base_url , url_suffix )
17
40
headers = headers if headers else self ._headers
@@ -25,6 +48,7 @@ def _http_request(self, method, url_suffix='', full_url=None, params=None, heade
25
48
client_key_path = 'client_key.key'
26
49
with open (client_key_path , 'wb' ) as file :
27
50
file .write (self ._client_key .encode ())
51
+
28
52
response = requests .session ().request (
29
53
method ,
30
54
address ,
@@ -34,11 +58,16 @@ def _http_request(self, method, url_suffix='', full_url=None, params=None, heade
34
58
json = json_data ,
35
59
headers = headers ,
36
60
cert = (client_cert_path , client_key_path ),
37
- timeout = 2 ,
38
-
61
+ timeout = None
39
62
)
63
+
64
+ # Some docker commands return no data, just a status code.
65
+ # Better pass the status code on as the result, rather than nothing
66
+ if not response .content :
67
+ return {'Status Code' : response .status_code }
68
+
40
69
if response .headers .get ('Content-Type' ) == 'application/json' :
41
- return json .loads (response .content )
70
+ return json .loads (response .content . splitlines ()[ - 1 ]) # If content is jsonl, latest message is the most relevant
42
71
else :
43
72
return response .content
44
73
@@ -212,7 +241,7 @@ def container_kill_request(self, id_, signal):
212
241
return response
213
242
214
243
def container_list_request (self , list_all , limit , size , filters ):
215
- params = assign_params (list_all = list_all , limit = limit , size = size , filters = filters )
244
+ params = assign_params (all = list_all , limit = limit , size = size , filters = filters )
216
245
217
246
headers = self ._headers
218
247
@@ -457,15 +486,14 @@ def image_commit_request(self, containerconfig_hostname, containerconfig_domainn
457
486
458
487
return response
459
488
460
- def image_create_request (self , from_image , from_src , repo , tag , message , input_image , platform ):
461
- params = assign_params (from_image = from_image , from_src = from_src , repo = repo , tag = tag , message = message ,
489
+ def image_create_request (self , from_image , from_src , repo , tag , message , platform ):
490
+ params = assign_params (fromImage = from_image , fromSrc = from_src , repo = repo , tag = tag , message = message ,
462
491
platform = platform )
463
- data = assign_params (input_image = input_image )
464
492
465
493
headers = self ._headers
466
494
headers ['Content-Type' ] = 'text/plain'
467
495
468
- response = self ._http_request ('post' , 'images/create' , params = params , json_data = data , headers = headers )
496
+ response = self ._http_request ('post' , 'images/create' , params = params , headers = headers )
469
497
470
498
return response
471
499
@@ -1230,7 +1258,7 @@ def container_delete_command(client, args):
1230
1258
1231
1259
response = client .container_delete_request (id_ , v , force , link )
1232
1260
command_results = CommandResults (
1233
- outputs_prefix = 'Docker' ,
1261
+ outputs_prefix = 'Docker.ContainerDelete ' ,
1234
1262
outputs_key_field = '' ,
1235
1263
outputs = response ,
1236
1264
raw_response = response
@@ -1789,13 +1817,12 @@ def image_create_command(client, args):
1789
1817
repo = str (args .get ('repo' , '' ))
1790
1818
tag = str (args .get ('tag' , '' ))
1791
1819
message = str (args .get ('message' , '' ))
1792
- input_image = str (args .get ('input_image' , '' ))
1793
1820
platform = str (args .get ('platform' , '' ))
1794
1821
1795
- response = client .image_create_request (from_image , from_src , repo , tag , message , input_image , platform )
1822
+ response = client .image_create_request (from_image , from_src , repo , tag , message , platform )
1796
1823
command_results = CommandResults (
1797
- outputs_prefix = 'Docker' ,
1798
- outputs_key_field = '' ,
1824
+ outputs_prefix = 'Docker.ImageCreate ' ,
1825
+ outputs_key_field = 'Status ' ,
1799
1826
outputs = response ,
1800
1827
raw_response = response
1801
1828
)
@@ -1926,7 +1953,7 @@ def image_push_command(client, args):
1926
1953
1927
1954
response = client .image_push_request (name , tag )
1928
1955
command_results = CommandResults (
1929
- outputs_prefix = 'Docker' ,
1956
+ outputs_prefix = 'Docker.ImagePush ' ,
1930
1957
outputs_key_field = '' ,
1931
1958
outputs = response ,
1932
1959
raw_response = response
@@ -1958,7 +1985,7 @@ def image_tag_command(client, args):
1958
1985
1959
1986
response = client .image_tag_request (name , repo , tag )
1960
1987
command_results = CommandResults (
1961
- outputs_prefix = 'Docker' ,
1988
+ outputs_prefix = 'Docker.ImageTag ' ,
1962
1989
outputs_key_field = '' ,
1963
1990
outputs = response ,
1964
1991
raw_response = response
@@ -2866,17 +2893,27 @@ def main():
2866
2893
args = demisto .args ()
2867
2894
url = params .get ('url' )
2868
2895
client_cert = params .get ('client_certificate' )
2869
- client_key = params .get ('client_key' )
2896
+ client_key = params .get ('client_key' , {}).get ('credentials' , {}).get ('sshkey' )
2897
+ ca_cert = params .get ('ca_certificate' )
2870
2898
verify_certificate = not params .get ('insecure' , False )
2871
2899
proxy = params .get ('proxy' , False )
2900
+ identitytoken = params .get ('identitytoken' , False )
2901
+ registry_username = params .get ('Registry Username' , {}).get ('identifier' , False )
2902
+ registry_password = params .get ('Registry Username' , {}).get ('password' , False )
2903
+ registry_serveraddress = params .get ('registry_serveraddress' , False )
2872
2904
2873
2905
command = demisto .command ()
2874
2906
LOG (f'Command being called is { command } ' )
2875
2907
2876
2908
try :
2877
2909
urllib3 .disable_warnings ()
2878
2910
client = Client (urljoin (url , "/v1.41" ), verify_certificate , proxy , headers = None ,
2879
- client_cert = client_cert , client_key = client_key )
2911
+ client_cert = client_cert , client_key = client_key , ca_cert = ca_cert )
2912
+
2913
+ if any ([identitytoken , registry_username , registry_password , registry_serveraddress ]):
2914
+ client .reg_auth (identitytoken = identitytoken , registry_username = registry_username ,
2915
+ registry_password = registry_password , registry_serveraddress = registry_serveraddress )
2916
+
2880
2917
commands = {
2881
2918
'docker-build-prune' : build_prune_command ,
2882
2919
'docker-config-create' : config_create_command ,
0 commit comments