From 0728675fb321aa8e60631f68395022415af20373 Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Fri, 25 Aug 2017 08:16:14 +0200 Subject: [PATCH] Add initial implementation of --ssh option to connect to novaboot-shell --- README.pod | 16 ++++++++++++++-- novaboot | 38 +++++++++++++++++++++++++++++++++++--- tests/server.wv | 7 +++++++ 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/README.pod b/README.pod index 83ea88e..f686d8b 100644 --- a/README.pod +++ b/README.pod @@ -193,6 +193,18 @@ When this option is not given, novaboot tries to determine the target to use from either B environment variable or B<$default_target> configuration file variable. +=item --ssh=I + +Configures novaboot to control the target via C +running remotely via SSH. + +Using this option is the same as specifying B<--remote-cmd>, +B<--remote-expect>, B<--server> B<--rsync-flags>, B<--prefix> and +B<--reset-cmd> manually in a way compatible with V. + +Currently, this in an initial experimental implementation. We plan to +change/extend this feature soon! + =back =head2 Script preprocessing phase @@ -519,8 +531,8 @@ B<--iprelay>, B<--reset-cmd> and B<--reset-send>. =item --on, --off Switch on/off the target machine and exit. The script (if any) is -completely ignored. Currently, it works only with B<--iprelay> or -B<--amt>. +completely ignored. Currently, it works only with the following +options: B<--iprelay>, B<--amt>, B<--ssh>. =item -Q, --qemu[=I] diff --git a/novaboot b/novaboot index b06971c..5426f2e 100755 --- a/novaboot +++ b/novaboot @@ -120,8 +120,11 @@ read_config($_) foreach $cfg or @cfgs; my $explicit_target = $ENV{'NOVABOOT_TARGET'}; GetOptions ("target|t=s" => \$explicit_target); +# Variables for command line options my ($amt, @append, $bender, @chainloaders, $concat, $config_name_opt, $dhcp_tftp, $dump_opt, $dump_config, @exiton, $exiton_timeout, @expect_raw, $final_eol, $gen_only, $grub_config, $grub_prefix, $grub_preamble, $grub2_prolog, $grub2_config, $help, $ider, $interaction, $iprelay, $iprelay_cmd, $iso_image, $interactive, $kernel_opt, $make, $man, $netif, $no_file_gen, $off_opt, $on_opt, $pulsar, $pulsar_root, $qemu, $qemu_append, $qemu_flags_cmd, $remote_cmd, $remote_expect, $remote_expect_silent, $remote_expect_timeout, $reset, $reset_cmd, $reset_send, $rom_prefix, $rsync_flags, @scriptmod, $scons, $serial, $server, $stty, $tftp, $tftp_port, $uboot, %uboot_addr, $uboot_cmd, @uboot_init); +my ($target_reset, $target_power_on, $target_power_off); + # Default values of certain command line options %uboot_addr = ( 'kernel' => '${kernel_addr_r}', @@ -155,6 +158,23 @@ sub handle_send @expect_seen = (); } +sub handle_novaboot_server +{ + my ($n, $val) = @_; + my $xdg_runtime_dir = $ENV{XDG_RUNTIME_DIR} || '/var/run'; + my $ssh_ctl_path = "${xdg_runtime_dir}/novaboot-%r@%h%p"; + + $remote_cmd = "ssh -tt -M -S '${ssh_ctl_path}' '${val}' console"; + $remote_expect = "novaboot-shell: Connected"; + $server = "$val:"; + $rsync_flags = "--rsh='ssh -S \'${ssh_ctl_path}\''"; + ($grub_prefix = $val) =~ s/@.*// if index($val, '@') != -1; + $reset_cmd = "ssh -tt -S '${ssh_ctl_path}' '${val}' reset"; + + $target_power_off = sub { system_verbose("ssh -tt -S '${ssh_ctl_path}' '${val}' off"); }; + $target_power_on = sub { system_verbose("ssh -tt -S '${ssh_ctl_path}' '${val}' on"); }; +} + my %opt_spec; %opt_spec = ( "amt=s" => \$amt, @@ -211,6 +231,7 @@ my %opt_spec; "sendcont=s" => \&handle_send, "serial|s:s" => \$serial, "server:s" => \$server, + "ssh:s" => \&handle_novaboot_server, "strip-rom" => sub { $rom_prefix = ''; }, "stty=s" => \$stty, "tftp" => \$tftp, @@ -618,7 +639,6 @@ if (exists $variables->{WVDESC}) { my $exp; # Expect object to communicate with the target over serial line -my ($target_reset, $target_power_on, $target_power_off); my ($amt_user, $amt_password, $amt_host, $amt_port); if (defined $iprelay || defined $iprelay_cmd) { @@ -1449,6 +1469,18 @@ When this option is not given, novaboot tries to determine the target to use from either B environment variable or B<$default_target> configuration file variable. +=item --ssh=I + +Configures novaboot to control the target via C +running remotely via SSH. + +Using this option is the same as specifying B<--remote-cmd>, +B<--remote-expect>, B<--server> B<--rsync-flags>, B<--prefix> and +B<--reset-cmd> manually in a way compatible with V. + +Currently, this in an initial experimental implementation. We plan to +change/extend this feature soon! + =back =head2 Script preprocessing phase @@ -1775,8 +1807,8 @@ B<--iprelay>, B<--reset-cmd> and B<--reset-send>. =item --on, --off Switch on/off the target machine and exit. The script (if any) is -completely ignored. Currently, it works only with B<--iprelay> or -B<--amt>. +completely ignored. Currently, it works only with the following +options: B<--iprelay>, B<--amt>, B<--ssh>. =item -Q, --qemu[=I] diff --git a/tests/server.wv b/tests/server.wv index 034f56d..2342d5b 100755 --- a/tests/server.wv +++ b/tests/server.wv @@ -69,4 +69,11 @@ WVPASS run_server reset WVPASS test -e reset WVPASS kill $COPROC_PID +WVSTART "Novaboot --ssh option" +date > file +WVPASS novaboot --ssh novaboot-test@localhost <