
Initial submission for a Python-based virtualbox installer for StarlingX Co-Authored-By: Ovidiu.Poncea <ovidiu.poncea@windriver.com> Co-Authored-By: Wei Zhou <wei.zhou@windriver.com> Co-Authored-By: William Jia <william.jia@windriver.com> Co-Authored-By: Sebastien Papineau <sebastien.papineau@windriver.com> Co-Authored-By: Timothy Mather <timothy.mather@windriver.com> Co-Authored-By: Paul Buzuloiu <paul.buzuloiu@windriver.com> DocImpact Story: 2005051 Task: 29552 Signed-off-by: Maria Yousaf <maria.yousaf@windriver.com> Change-Id: Iad5b6d8103886d7eeeab7bf2782eca4adb95e3e6
124 lines
4.4 KiB
Python
124 lines
4.4 KiB
Python
#!/usr/bin/python3
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
|
|
import getpass
|
|
import os
|
|
import time
|
|
import subprocess
|
|
import paramiko
|
|
from utils.install_log import LOG
|
|
|
|
|
|
def sftp_send(source, remote_host, remote_port, destination, username, password):
|
|
"""
|
|
Send files to remote server
|
|
"""
|
|
LOG.info("Connecting to server %s with username %s", remote_host, username)
|
|
|
|
ssh_client = paramiko.SSHClient()
|
|
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
|
|
## TODO(WEI): need to make this timeout handling better
|
|
retry = 0
|
|
while retry < 8:
|
|
try:
|
|
ssh_client.connect(remote_host, port=remote_port,
|
|
username=username, password=password,
|
|
look_for_keys=False, allow_agent=False)
|
|
sftp_client = ssh_client.open_sftp()
|
|
retry = 8
|
|
except Exception as e:
|
|
LOG.info("******* try again")
|
|
retry += 1
|
|
time.sleep(10)
|
|
|
|
LOG.info("Sending file from %s to %s", source, destination)
|
|
sftp_client.put(source, destination)
|
|
LOG.info("Done")
|
|
sftp_client.close()
|
|
ssh_client.close()
|
|
|
|
def send_dir(source, remote_host, remote_port, destination, username,
|
|
password, follow_links=True, clear_known_hosts=True):
|
|
# Only works from linux for now
|
|
if not source.endswith('/') or not source.endswith('\\'):
|
|
source = source + '/'
|
|
params = {
|
|
'source': source,
|
|
'remote_host': remote_host,
|
|
'destination': destination,
|
|
'port': remote_port,
|
|
'username': username,
|
|
'password': password,
|
|
'follow_links': "L" if follow_links else "",
|
|
}
|
|
if clear_known_hosts:
|
|
if remote_host == '127.0.0.1':
|
|
keygen_arg = "[127.0.0.1]:{}".format(remote_port)
|
|
else:
|
|
keygen_arg = remote_host
|
|
cmd = 'ssh-keygen -f "/home/%s/.ssh/known_hosts" -R' \
|
|
' %s', getpass.getuser(), keygen_arg
|
|
LOG.info("CMD: %s", cmd)
|
|
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
|
|
for line in iter(process.stdout.readline, b''):
|
|
LOG.info("%s", line.decode("utf-8").strip())
|
|
process.wait()
|
|
|
|
LOG.info("Running rsync of dir: {source} ->" \
|
|
"{username}@{remote_host}:{destination}".format(**params))
|
|
cmd = ("rsync -av{follow_links} "
|
|
"--rsh=\"/usr/bin/sshpass -p {password} ssh -p {port} -o StrictHostKeyChecking=no -l {username}\" "
|
|
"{source}* {username}@{remote_host}:{destination}".format(**params))
|
|
LOG.info("CMD: %s", cmd)
|
|
|
|
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
|
|
for line in iter(process.stdout.readline, b''):
|
|
LOG.info("%s", line.decode("utf-8").strip())
|
|
process.wait()
|
|
if process.returncode:
|
|
raise Exception("Error in rsync, return code:{}".format(process.returncode))
|
|
|
|
|
|
def send_dir_fallback(source, remote_host, destination, username, password):
|
|
"""
|
|
Send directory contents to remote server, usually controller-0
|
|
Note: does not send nested directories only files.
|
|
args:
|
|
- source: full path to directory
|
|
e.g. /localhost/loadbuild/jenkins/latest_build/
|
|
- Remote host: name of host to log into, controller-0 by default
|
|
e.g. myhost.com
|
|
- destination: where to store the file on host: /home/myuser/
|
|
"""
|
|
LOG.info("Connecting to server %s with username %s", remote_host, username)
|
|
ssh_client = paramiko.SSHClient()
|
|
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
ssh_client.connect(remote_host, username=username, password=password, look_for_keys=False, allow_agent=False)
|
|
sftp_client = ssh_client.open_sftp()
|
|
path = ''
|
|
send_img = False
|
|
for items in os.listdir(source):
|
|
path = source+items
|
|
if os.path.isfile(path):
|
|
if items.endswith('.img'):
|
|
remote_path = destination+'images/'+items
|
|
LOG.info("Sending file from %s to %s", path, remote_path)
|
|
sftp_client.put(path, remote_path)
|
|
send_img = True
|
|
elif items.endswith('.iso'):
|
|
pass
|
|
else:
|
|
remote_path = destination+items
|
|
LOG.info("Sending file from %s to %s", path, remote_path)
|
|
sftp_client.put(path, remote_path)
|
|
LOG.info("Done")
|
|
sftp_client.close()
|
|
ssh_client.close()
|
|
if send_img:
|
|
time.sleep(10)
|
|
|