11#!/usr/bin/env python3
22import sys
33import re
4+
45from os .path import basename , dirname , join , exists
56from collections import OrderedDict
67from typing import Union
@@ -276,7 +277,17 @@ def get_info(host, *, users=None, connection=None):
276277 data ["role" ] = "hub" if discovery .get ("NTD_CFHUB" ) else "client"
277278
278279 data ["bin" ] = {}
279- for bin in ["dpkg" , "rpm" , "yum" , "apt" , "pkg" , "zypper" , "curl" ]:
280+ for bin in [
281+ "dpkg" ,
282+ "rpm" ,
283+ "yum" ,
284+ "apt" ,
285+ "pkg" ,
286+ "zypper" ,
287+ "curl" ,
288+ "wget" ,
289+ "sha256sum" ,
290+ ]:
280291 path = discovery .get ("NTD_{}" .format (bin .upper ()))
281292 if path :
282293 data ["bin" ][bin ] = path
@@ -432,7 +443,7 @@ def bootstrap_host(host_data, policy_server, *, connection=None, trust_server=Tr
432443def _package_from_list (tags , extension , packages ):
433444 artifacts = [Artifact (None , p ) for p in packages ]
434445 artifact = filter_artifacts (artifacts , tags , extension )[- 1 ]
435- return artifact .url
446+ return artifact .url , artifact
436447
437448
438449def _package_from_releases (
@@ -445,7 +456,7 @@ def _package_from_releases(
445456 release = releases .pick_version (version )
446457 if release is None :
447458 print ("Could not find a release for version {}" .format (version ))
448- return None
459+ return None , None
449460
450461 release .init_download ()
451462
@@ -455,7 +466,7 @@ def _package_from_releases(
455466 version , edition
456467 )
457468 )
458- return None
469+ return None , None
459470
460471 artifacts = release .find (tags , extension )
461472 if not artifacts :
@@ -464,13 +475,16 @@ def _package_from_releases(
464475 "hub" if "hub" in tags else "client"
465476 )
466477 )
467- return None
478+ return None , None
468479 artifact = artifacts [- 1 ]
469480 if remote_download :
470- return artifact .url
481+ return artifact .url , artifact
471482 else :
472- return download_package (
473- artifact .url , checksum = artifact .checksum , insecure = insecure
483+ return (
484+ download_package (
485+ artifact .url , checksum = artifact .checksum , insecure = insecure
486+ ),
487+ artifact ,
474488 )
475489
476490
@@ -514,13 +528,44 @@ def get_package_from_host_info(
514528 tags .extend (tag for tag in package_tags if tag != "msi" )
515529
516530 if packages is None : # No command line argument given
517- package = _package_from_releases (
531+ package , artifact = _package_from_releases (
518532 tags , extension , version , edition , remote_download , insecure
519533 )
520534 else :
521- package = _package_from_list (tags , extension , packages )
535+ package , artifact = _package_from_list (tags , extension , packages )
536+
537+ return package , artifact
538+
539+
540+ def _remote_download (host , package , artifact , insecure = False , connection = None ):
541+
542+ cf_remote_dir = dirname (__file__ )
543+ script_path = join (cf_remote_dir , "remote-download.sh" )
544+ if not exists (script_path ):
545+ sys .exit ("%s does not exist" % script_path )
546+ scp (
547+ script_path ,
548+ host ,
549+ connection ,
550+ hide = True ,
551+ )
552+ args = ""
553+ if insecure :
554+ args += "-I "
555+ if artifact :
556+ args += "-c {} " .format (artifact .checksum )
557+ args += package
522558
523- return package
559+ ret = ssh_cmd (connection , "bash remote-download.sh {}" .format (args ), errors = True )
560+
561+ if ret is None :
562+ return None
563+ if insecure :
564+ log .warning (ret )
565+
566+ log .debug ("Successfully remotely installed package on host" )
567+
568+ return basename (package )
524569
525570
526571@auto_connect
@@ -552,9 +597,10 @@ def install_host(
552597 elif packages and len (packages ) == 1 :
553598 package = packages [0 ]
554599
600+ artifact = None
555601 if not package :
556602 try :
557- package = get_package_from_host_info (
603+ package , artifact = get_package_from_host_info (
558604 data .get ("package_tags" ),
559605 data .get ("bin" ),
560606 data .get ("arch" ),
@@ -574,19 +620,11 @@ def install_host(
574620 return 1
575621
576622 if remote_download :
577- if ("bin" not in data ) or ("curl" not in data ["bin" ]):
578- log .error (
579- "Couldn't download remotely. Curl is not installed on host '%s'" % host
580- )
581- return 1
582-
583- print ("Downloading '%s' on '%s' using curl" % (package , host ))
584- r = ssh_cmd (
585- cmd = "curl --fail -O {}" .format (package ), connection = connection , errors = True
623+ package = _remote_download (
624+ host , package , artifact , connection = connection , insecure = insecure
586625 )
587- if r is None :
626+ if package is None :
588627 return 1
589- package = basename (package )
590628 elif not getattr (connection , "is_local" , False ):
591629 scp (package , host , connection = connection )
592630 package = basename (package )
0 commit comments