-#!/usr/bin/perl -w
+#!/usr/bin/env perl
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
$CFG::netif = 'eth0';
%CFG::targets = (
'qemu' => '--qemu',
- "tud" => '--server=erwin.inf.tu-dresden.de:~sojka/boot/novaboot --rsync-flags="--chmod=Dg+s,ug+w,o-w,+rX --rsync-path=\"umask 002 && rsync\"" --grub --grub-prefix=(nd)/tftpboot/sojka/novaboot --grub-preamble="timeout 0" --concat --iprelay=141.76.48.80:2324 --scriptmod=s/\\\\bhostserial\\\\b/hostserialpci/g',
+ "tud" => '--copy=erwin.inf.tu-dresden.de:~sojka/boot/novaboot --rsync-flags="--chmod=Dg+s,ug+w,o-w,+rX --rsync-path=\"umask 002 && rsync\"" --grub --grub-prefix=(nd)/tftpboot/sojka/novaboot --grub-preamble="timeout 0" --concat --iprelay=141.76.48.80:2324 --scriptmod=s/\\\\bhostserial\\\\b/hostserialpci/g',
"novabox" => '--ssh=novabox@rtime.felk.cvut.cz',
- "localhost" => '--scriptmod=s/console=tty[A-Z0-9,]+// --server=/boot/novaboot/$NAME --grub2 --grub-prefix=/boot/novaboot/$NAME --grub2-prolog=" set root=\'(hd0,msdos1)\'"',
+ "localhost" => '--scriptmod=s/console=tty[A-Z0-9,]+// --copy=/boot/novaboot/$NAME --grub2 --grub-prefix=/boot/novaboot/$NAME --grub2-prolog=" set root=\'(hd0,msdos1)\'"',
"ryu" => '--uboot --uboot-init="mw f0000b00 \${psc_cfg}; sleep 1" --uboot-addr kernel=800000 --uboot-addr ramdisk=b00000 --uboot-addr fdt=7f0000',
"ryuglab" => '--target ryu --ssh=ryu@pc-sojkam.felk.cvut.cz',
"ryulocal" => '--target ryu --dhcp-tftp --serial --reset-cmd="if which dtrrts; then dtrrts $NB_SERIAL 0 1; sleep 0.1; dtrrts $NB_SERIAL 1 1; fi"',
"sendcont=s" => \&handle_send,
"serial|s:s" => \$serial,
"server:s" => \$server,
+ "copy:s" => \$server,
"ssh:s" => \&handle_novaboot_server,
"strip-rom" => sub { $rom_prefix = ''; },
"stty=s" => \$stty,
push @$generated, {filename => $1, command => $3};
return "$1$2";
}
+ s/\s*$//; # Strip trailing whitespace
return $_;
}
if (s/^load *//) { # Load line
if (system("file $kbin|grep 'Linux kernel'") == 0) {
my $initrd = @$modules_ref[1];
- die('To many "load" lines for Linux kernel') if (scalar @$modules_ref > 2);
+ die('Too many "load" lines for Linux kernel') if (scalar @$modules_ref > 2);
print $fg "LINUX $base$kbin\n";
print $fg "APPEND $kcmd\n";
print $fg "INITRD $base$initrd\n";
my $istty = -t STDOUT && ($ENV{'TERM'} || 'dumb') ne 'dumb';
my $progress = $istty ? "--progress" : "";
if ($files) {
- system_verbose("rsync $progress -RLp $rsync_flags $files $real_server");
+ system_verbose("rsync $progress -RL --chmod=ugo=rwX $rsync_flags $files $real_server");
if ($server =~ m|/\$NAME$| && $concat) {
my $cmd = join("; ", map { "( cd $path/.. && cat */$_ > $_ )" } @bootloader_configs);
system_verbose($hostname ? "ssh $hostname '$cmd'" : $cmd);
if (-f '/usr/lib/ISOLINUX/isolinux.bin') {
# Newer ISOLINUX version
@files = qw(/usr/lib/ISOLINUX/isolinux.bin /usr/lib/syslinux/modules/bios/mboot.c32 /usr/lib/syslinux/modules/bios/libcom32.c32 /usr/lib/syslinux/modules/bios/menu.c32 /usr/lib/syslinux/modules/bios/ldlinux.c32);
- } else {
+ } elsif (-f '/usr/lib/syslinux/isolinux.bin') {
# Older ISOLINUX version
@files = qw(/usr/lib/syslinux/isolinux.bin /usr/lib/syslinux/mboot.c32 /usr/lib/syslinux/menu.c32);
+ } else {
+ # NixOS and maybe others
+ my $syslinux = `which syslinux` || die "Cannot find syslinux";
+ chomp $syslinux;
+ $syslinux =~ s,/bin/syslinux$,,;
+ @files = ("$syslinux/share/syslinux/isolinux.bin", "$syslinux/share/syslinux/mboot.c32", "$syslinux/share/syslinux/libcom32.c32", "$syslinux/share/syslinux/menu.c32", "$syslinux/share/syslinux/ldlinux.c32");
}
- system_verbose("cp @files isolinux");
+ system_verbose("cp @files isolinux && chmod +w isolinux/*");
open(my $fh, ">isolinux/isolinux.cfg");
if ($#scripts) {
print $fh "TIMEOUT 50\n";
print STDERR "novaboot: Serial line interaction (press $interrupt to interrupt)...\n";
$exp->log_stdout(1);
if (@exiton) {
- $exp->expect($exiton_timeout, @expect_raw, @exiton) || die("exiton: " . ($! || "timeout"));
+ $exp->expect($exiton_timeout, @exiton, @expect_raw) || die("exiton: " . ($! || "timeout"));
} else {
my @inputs = ($exp);
my $infile = new IO::File;
depending on the used setup. The L<figure from the doc directory
|https://github.com/wentasah/novaboot/blob/master/doc/typical-setups.svg>
shows different setups that vary in how much effort is needed
-configure novaboot for them. The setups are:
+to configure novaboot for them. The setups are:
=over 3
This requires to configure everything on the laptop side, including a
serial line connection (L</--serial>, L</--remote-cmd>, ...), power
on/off/reset commands (L</--reset-cmd>, ...), TFTP server
-(L</--server>, L</--prefix>...), device IP addresses, etc.
+(L</--copy>, L</--prefix>...), device IP addresses, etc.
=item B: Laptop, target device and external TFTP server
Like the previous setup, but the TFTP (and maybe DHCP) configuration
is handled by a server. Novaboot users need to understand where to
-copy their files to the TFTP server (L</--server>) and which IP
+copy their files to the TFTP server (L</--copy>) and which IP
addresses their target will get, but do not need to configure the
servers themselves.
use a TCP/IP-controlled relay/serial-to-TCP converter to reset the
target and receive its serial output.
- ./mylinux --grub2 --server=192.168.1.1:/tftp --iprelay=192.168.1.2
+ ./mylinux --grub2 --copy=192.168.1.1:/tftp --iprelay=192.168.1.2
Alternatively, you can put these switches to the configuration file
and run:
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<--remote-expect>, B<--copy> B<--rsync-flags>, B<--prefix> and
B<--reset-cmd> manually in a way compatible with C<novaboot-shell>.
The server can be configured to provide other, safe bootloader-related
options, to the client. When this happens, novaboot prints them to
=item --server[=[[user@]server:]path]
+Alias of B<--copy> (kept for backward compatibility).
+
+=item --copy[=[[user@]server:]path]
+
Copy all files needed for booting to another location. The files will
be copied (by B<rsync> tool) to the directory I<path>. If the I<path>
contains string $NAME, it will be replaced with the name of the
=item --rsync-flags=I<flags>
Specifies I<flags> to append to F<rsync> command line when
-copying files as a result of I<--server> option.
+copying files as a result of I<--copy> option.
=item --concat
-If B<--server> is used and its value ends with $NAME, then after
+If B<--copy> is used and its value ends with $NAME, then after
copying the files, a new bootloader configuration file (e.g. menu.lst)
-is created at I<path-wo-name>, i.e. the path specified by B<--server>
+is created at I<path-wo-name>, i.e. the path specified by B<--copy>
with $NAME part removed. The content of the file is created by
concatenating all files of the same name from all subdirectories of
I<path-wo-name> found on the "server".
key is the identifier of the target, the value is the string with
command line options. For instance, if the configuration file contains:
- $targets{'mybox'} = '--server=boot:/tftproot --serial=/dev/ttyUSB0 --grub',
+ $targets{'mybox'} = '--copy=boot:/tftproot --serial=/dev/ttyUSB0 --grub',
then the following two commands are equivalent:
- ./myos --server=boot:/tftproot --serial=/dev/ttyUSB0 --grub
+ ./myos --copy=boot:/tftproot --serial=/dev/ttyUSB0 --grub
./myos -t mybox
=back