VMware-Photon-OS/installer/filedownloader.py

91 lines
3.7 KiB
Python

#
# © 2019 VMware Inc.,
#
# Date: Tue Oct 15 14:17:13 IST 2019
# Author: Siddharth Chandrasekaran <csiddharth@vmware.com>
import os
import tempfile
from commandutils import CommandUtils
from window import Window
from windowstringreader import WindowStringReader
from actionresult import ActionResult
from networkmanager import NetworkManager
from confirmwindow import ConfirmWindow
class FileDownloader(object):
def __init__(self, maxy, maxx, install_config, title, intro, dest, setup_network=False):
self.install_config = install_config
self.maxy = maxy
self.maxx = maxx
self.title = title
self.intro = intro
self.netmgr = None
self.dest = dest
self.setup_network = setup_network
if self.setup_network:
self.netmgr = NetworkManager(install_config)
def ask_proceed_unsafe_download(self, fingerprint):
msg = ('This server could not prove its authenticity. Its '
'fingerprint is:\n\n' + fingerprint +
'\n\nDo you wish to proceed?\n')
conf_message_height = 12
conf_message_width = 80
conf_message_button_y = (self.maxy - conf_message_height) // 2 + 8
r = ConfirmWindow(conf_message_height, conf_message_width, self.maxy, self.maxx,
conf_message_button_y, msg).do_action()
if not r.success or not r.result.get('yes', False):
return False
return True
def do_setup_network(self):
if not self.netmgr.setup_network():
msg = 'Failed to setup network configuration!'
conf_message_height = 12
conf_message_width = 80
conf_message_button_y = (self.maxy - conf_message_height) // 2 + 8
ConfirmWindow(conf_message_height, conf_message_width, self.maxy, self.maxx,
conf_message_button_y, msg, True).do_action()
return False
self.netmgr.restart_networkd()
return True
def display(self):
if self.setup_network and not self.do_setup_network():
return ActionResult(False, {'goBack': True})
file_source = {}
accepted_chars = list(range(ord('a'), ord('z')+1))
accepted_chars.extend(range(ord('A'), ord('Z')+1))
accepted_chars.extend(range(ord('0'), ord('9')+1))
accepted_chars.extend([ ord('-'), ord('_'), ord('.'), ord('~'), ord(':'), ord('/') ])
result = WindowStringReader(self.maxy, self.maxx, 18, 78, 'url',
None, None, accepted_chars, None, None,
self.title, self.intro, 10, file_source, 'https://',
True).get_user_string(None)
if not result.success:
return result
status_window = Window(10,70, self.maxy, self.maxx, 'Installing Photon', False)
status_window.addstr(1, 0, 'Downloading file...')
status_window.show_window()
temp_file = tempfile.mktemp()
result, msg = CommandUtils.wget(file_source['url'], temp_file,
ask_fn=self.ask_proceed_unsafe_download)
if not result:
status_window.adderror('Error: ' + msg + ' Press any key to go back...')
status_window.content_window().getch()
status_window.clearerror()
status_window.hide_window()
return ActionResult(False, {'goBack': True})
if 'additional_files' not in self.install_config:
self.install_config['additional_files'] = []
copy = { temp_file: self.dest }
self.install_config['additional_files'].append(copy)
return ActionResult(True, None)