subiquity: add --ssh option to print ssh login details.

This commit is contained in:
Dimitri John Ledkov 2020-04-16 00:08:56 +01:00
parent 5cca44b70d
commit 5be2961a62
3 changed files with 60 additions and 33 deletions

View File

@ -108,12 +108,7 @@ def write_login_details(fp, username, ips):
first_ip=first_ip,
version=version))
def write_login_details_standalone():
owner = get_device_owner()
if owner is None:
print("No device owner details found.")
return 0
def get_ips_standalone():
from probert.prober import Prober
from subiquitycore.models.network import NETDEV_IGNORED_IFACE_TYPES
prober = Prober()
@ -126,6 +121,15 @@ def write_login_details_standalone():
for addr in l['addresses']:
if addr['scope'] == "global":
ips.append(addr['address'].split('/')[0])
return ips
def write_login_details_standalone():
owner = get_device_owner()
if owner is None:
print("No device owner details found.")
return 0
ips = get_ips_standalone()
if len(ips) == 0:
tty_name = os.ttyname(0)[5:]
version = get_core_version() or "16"

View File

@ -47,6 +47,9 @@ def parse_options(argv):
parser.add_argument('--serial', action='store_true',
dest='run_on_serial',
help='Run the installer over serial console.')
parser.add_argument('--ssh', action='store_true',
dest='ssh',
help='Print ssh login details')
parser.add_argument('--ascii', action='store_true',
dest='ascii',
help='Run the installer in ascii mode.')
@ -160,6 +163,20 @@ def main():
logging.getLogger('curtin').addHandler(handler)
logging.getLogger('block-discover').addHandler(handler)
if opts.ssh:
from subiquity.ui.views.help import ssh_help_texts, get_installer_password
from console_conf.controllers.identity import get_ips_standalone
texts = ssh_help_texts(get_ips_standalone(), get_installer_password(opts.dry_run))
for line in texts:
if hasattr(line, 'text'):
if line.text.startswith('installer@'):
print(' ' * 4 + line.text)
else:
print(line.text)
else:
print(line)
return 0
if opts.answers is None and os.path.exists(AUTO_ANSWERS_FILE):
logger.debug("Autoloading answers from %s", AUTO_ANSWERS_FILE)
opts.answers = AUTO_ANSWERS_FILE

View File

@ -124,6 +124,32 @@ Unfortunately the installer was unable to detect the password that has
been set.
""")
def ssh_help_texts(ips, password):
texts = [_(SSH_HELP_PROLOGUE), ""]
if len(ips) > 0:
if len(ips) > 1:
texts.append(rewrap(_(SSH_HELP_MULTIPLE_ADDRESSES)))
texts.append("")
for ip in ips:
texts.append(Text(
"installer@" + str(ip), align='center'))
else:
texts.append(_(SSH_HELP_ONE_ADDRESSES).format(
ip=str(ips[0])))
texts.append("")
texts.append(
rewrap(_(SSH_HELP_EPILOGUE).format(
password=password)))
texts.append("")
texts.append(Text(host_key_info()))
else:
texts.append("")
texts.append(_(SSH_HELP_NO_ADDRESSES))
return texts
class SimpleTextStretchy(Stretchy):
@ -345,29 +371,9 @@ class HelpMenu(WidgetWrap):
return ips
def _ssh_help(self, sender=None):
texts = [_(SSH_HELP_PROLOGUE), ""]
ips = self.get_global_addresses()
if len(ips) > 0:
if len(ips) > 1:
texts.append(rewrap(_(SSH_HELP_MULTIPLE_ADDRESSES)))
texts.append("")
for ip in ips:
texts.append(Text(
"installer@" + str(ip), align='center'))
else:
texts.append(_(SSH_HELP_ONE_ADDRESSES).format(
ip=str(ips[0])))
texts.append("")
texts.append(
rewrap(_(SSH_HELP_EPILOGUE).format(
password=self.parent.ssh_password)))
texts.append("")
texts.append(Text(host_key_info()))
else:
texts.append("")
texts.append(_(SSH_HELP_NO_ADDRESSES))
texts = ssh_help_texts(
self.get_global_addresses(),
self.parent.ssh_password)
self._show_overlay(
SimpleTextStretchy(
@ -405,9 +411,9 @@ class HelpMenu(WidgetWrap):
self.parent.app.ui.body))
def get_installer_password(app):
if app.opts.dry_run:
fp = io.StringIO('installe:rAnd0Mpass')
def get_installer_password(dry_run=False):
if dry_run:
fp = io.StringIO('installer:rAnd0Mpass')
else:
try:
fp = open("/var/log/cloud-init-output.log")
@ -437,7 +443,7 @@ class HelpButton(PopUpLauncher):
def create_pop_up(self):
if self.ssh_password is None:
self.ssh_password = get_installer_password(self.app)
self.ssh_password = get_installer_password(self.app.opts.dry_run)
self._menu = HelpMenu(self)
return self._menu