summaryrefslogtreecommitdiffstats
path: root/src/boot-env/preboot
diff options
context:
space:
mode:
authorSebastian Schmelzer2010-09-02 17:50:49 +0200
committerSebastian Schmelzer2010-09-02 17:50:49 +0200
commit416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5 (patch)
tree4715f7d742fec50931017f38fe6ff0a89d4ceccc /src/boot-env/preboot
parentFix for the problem reported on the list (sed filter forgotten for the (diff)
downloadcore-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.tar.gz
core-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.tar.xz
core-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.zip
change dir structure
Diffstat (limited to 'src/boot-env/preboot')
-rw-r--r--src/boot-env/preboot/conf/apache-openslx-preboot.conf24
-rwxr-xr-xsrc/boot-env/preboot/http-server/user_settings.pl97
-rwxr-xr-xsrc/boot-env/preboot/http-server/users.pl90
-rw-r--r--src/boot-env/preboot/preboot-scripts/dialog.functions105
-rwxr-xr-xsrc/boot-env/preboot/preboot.sh95
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/init216
l---------src/boot-env/preboot/uclib-rootfs/lib/libcurses.so1
l---------src/boot-env/preboot/uclib-rootfs/lib/libncurses.so1
l---------src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.51
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5.6bin0 -> 229164 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/bin/clearbin0 -> 5156 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/bin/dialogbin0 -> 108520 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/bin/w3mbin0 -> 1093832 bytes
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so1
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so.0.9.8bin0 -> 1143120 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libcurses.so11
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so1
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.51
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5.6bin0 -> 39044 bytes
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so1
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.51
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5.6bin0 -> 21968 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libncurses.so11
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so1
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.51
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5.6bin0 -> 9212 bytes
l---------src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so1
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so.0.9.8bin0 -> 237392 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/sbin/kdumpbin0 -> 5200 bytes
-rwxr-xr-xsrc/boot-env/preboot/uclib-rootfs/usr/sbin/kexecbin0 -> 104068 bytes
30 files changed, 660 insertions, 0 deletions
diff --git a/src/boot-env/preboot/conf/apache-openslx-preboot.conf b/src/boot-env/preboot/conf/apache-openslx-preboot.conf
new file mode 100644
index 00000000..4eb58809
--- /dev/null
+++ b/src/boot-env/preboot/conf/apache-openslx-preboot.conf
@@ -0,0 +1,24 @@
+ ScriptAlias /openslx-preboot/cgi-bin/ "/opt/openslx/share/boot-env/preboot/http-server/"
+
+ Alias "/openslx-preboot/users/" "/srv/openslx/preboot-users/"
+ <Directory "/srv/openslx/preboot-users/">
+ Options -Indexes -ExecCGI FollowSymLinks MultiViews
+ AllowOverride None
+ Order allow,deny
+ allow from all
+ </Directory>
+
+ Alias /openslx-preboot/ "/srv/openslx/preboot/"
+ <Directory "/srv/openslx/preboot/">
+ Options -Indexes -ExecCGI FollowSymLinks MultiViews
+ AllowOverride None
+ Order allow,deny
+ allow from all
+ </Directory>
+
+ <Directory "/opt/openslx/share/boot-env/preboot/http-server/">
+ AllowOverride None
+ Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
+ Order allow,deny
+ Allow from all
+ </Directory>
diff --git a/src/boot-env/preboot/http-server/user_settings.pl b/src/boot-env/preboot/http-server/user_settings.pl
new file mode 100755
index 00000000..6c135267
--- /dev/null
+++ b/src/boot-env/preboot/http-server/user_settings.pl
@@ -0,0 +1,97 @@
+#!/usr/bin/perl -w
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# cgi-bin script that accepts user settings and stores them in a special
+# folder on the openslx server
+
+use strict;
+use warnings;
+
+use CGI;
+use CGI::Carp qw(fatalsToBrowser);
+use File::Path;
+
+# add openslx stuff to @INC
+use FindBin;
+use lib "$FindBin::RealBin/../../../../lib";
+use lib "$FindBin::RealBin";
+
+# read default config
+use OpenSLX::Basics;
+openslxInit();
+
+# die "*** Taint mode must be active! ***" unless ${^TAINT};
+
+my $cgi = CGI->new;
+
+my $system = $cgi->param('system') || '';
+my $client = $cgi->param('client') || '';
+my $prebootID = $cgi->param('preboot_id') || '';
+my $type = $cgi->param('type') || 'directkiosk';
+my $errormsg = 'None';
+
+die "must give 'system' ($system), 'client' ($client) and 'preboot_id' ($prebootID)!\n"
+ unless $system && $client && $prebootID;
+
+my $webPath = "$openslxConfig{'public-path'}/preboot";
+my $src = "$webPath/client-config/$system/$prebootID.tgz";
+my $destPath = "$webPath/$prebootID/client-config/$system";
+
+# if fastboot (default) is selected and a ConfTGZ exist just proceed ...
+if ($type eq "fastboot" && !-e "$destPath/$client.tgz") { $type = "slxconfig"; }
+# directkiosk/cfgkiosk/slxconfig
+if ($type ne "fastboot") {
+ mkpath($destPath."/".$client);
+ system(qq{tar -xzf $src -C $destPath/$client/});
+
+
+ # from here on the modifications of client configuration should take place
+ # within $destPath/$client directory
+ if ($type eq "slxconfig") {
+ # configuration of a WAN boot SLX client
+ print STDERR "slxconfig sub";
+ }
+ elsif ($type eq "cfgkiosk") {
+ # configuration of a WAN boot SLX kiosk
+ }
+ elsif (!$type || $type eq "directkiosk") {
+ # deactivate the desktop plugin for the kiosk mode
+ open (CFGFILE, ">>$destPath/$client/initramfs/plugin-conf/desktop.conf");
+ print CFGFILE 'desktop_active="0"';
+ close (CFGFILE);
+ # activate the kiosk plugin
+ if (!-e "$destPath/$client/initramfs/plugin-conf/kiosk.conf") {
+ $errormsg = "The kiosk plugin seems not to be installed";
+ print STDERR $errormsg;
+ } else {
+ open (CFGFILE, ">>$destPath/$client/initramfs/plugin-conf/kiosk.conf");
+ print CFGFILE 'kiosk_active="1"';
+ close (CFGFILE);
+ }
+ }
+ else {
+ # unknown type
+ $errormsg = "You have passed an unknown boot type $type";
+ print STDERR $errormsg;
+ }
+ system(qq{cd $destPath/$client; tar -czf $destPath/$client.tgz *});
+ rmtree($destPath."/".$client);
+}
+
+# resulting page is not shown to the user (error reporting that way, or
+# completely empty reply?)
+print
+ $cgi->header(-charset => 'iso8859-1'),
+ $cgi->start_html('...');
+if ($errormsg) { print $cgi->p("Error: $errormsg"); }
+print
+ $cgi->end_html();
+
diff --git a/src/boot-env/preboot/http-server/users.pl b/src/boot-env/preboot/http-server/users.pl
new file mode 100755
index 00000000..cde3d227
--- /dev/null
+++ b/src/boot-env/preboot/http-server/users.pl
@@ -0,0 +1,90 @@
+#!/usr/bin/perl -w
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# cgi-bin script that accepts user settings and stores them in a special
+# folder on the openslx server
+
+use strict;
+use warnings;
+
+use CGI;
+use CGI::Carp qw(fatalsToBrowser);
+use File::Path;
+use Switch;
+
+# add openslx stuff to @INC
+use FindBin;
+use lib "$FindBin::RealBin/../../../../lib";
+use lib "$FindBin::RealBin";
+
+# read default config
+use OpenSLX::Basics;
+openslxInit();
+
+my $cgi = CGI->new;
+my $mac = $cgi->param('user') || '';
+my $action = $cgi->param('action');
+my $data = $cgi->param('data');
+
+# global requirements
+die "must give 'mac' ($mac)!\n"
+ unless $mac;
+
+my $webPath = "$openslxConfig{'public-path'}/preboot-users";
+my $userConfFile = "$webPath/$mac.conf";
+
+# makes only sense if public path is writeable for www-data
+# otherwise you have to create directory manualy
+if ( ! -e $webPath ) {
+ mkpath ($webPath) or die _tr("Can't create user config directory (%s). Reason: %s", $webPath, @_);
+}
+
+my $output = "";
+my $error;
+
+switch ($action) {
+ case 'set' {
+ if ($data) {
+ open (MYFILE, ">$userConfFile");
+ print MYFILE $data;
+ close (MYFILE);
+ } else {
+ $error = "no data";
+ }
+ }
+ case 'read' {
+ if ( -e $userConfFile ) {
+ open (MYFILE, $userConfFile);
+ while (<MYFILE>) {
+ chomp;
+ $output .= "$_\n";
+ }
+ close (MYFILE);
+ } else {
+ $error = "foobar";
+ }
+
+ }
+ else {
+ #default case check if we have a user config
+ if ( -e $userConfFile ) { $output = "1"; }
+ else { $output = "0"; };
+ }
+}
+
+print $cgi->header('Content-type: text/plain');
+if ($error) {
+ print $error;
+} else {
+ print $output;
+}
+
+exit 0;
diff --git a/src/boot-env/preboot/preboot-scripts/dialog.functions b/src/boot-env/preboot/preboot-scripts/dialog.functions
new file mode 100644
index 00000000..7c6dd784
--- /dev/null
+++ b/src/boot-env/preboot/preboot-scripts/dialog.functions
@@ -0,0 +1,105 @@
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# dialog.functions
+# provides shell scripts for dialog handling
+# -----------------------------------------------------------------------------
+
+# set -x
+
+if [ "x" == "x$DIALOG_HEIGHT" ]; then
+ DIALOG_HEIGHT="10"
+fi
+
+if [ "x" == "x$DIALOG_WIDTH" ]; then
+ DIALOG_WIDTH="40"
+fi
+
+_ddownload_checkpercentage () {
+ local lf=$1
+ percentage=$(tail -n 5 $lf | sed 's/\.//g' | awk '{print $2}'| sed -n "s/%//p"| tail -n 1)
+ return $percentage
+}
+
+ddownload () {
+ local dl_url=$1
+ local dl_titel=$2
+ local dl_outfile=$3
+ local dl_logfile=$4
+
+ local dl_server=$(dirname $dl_url)
+ local dl_file=$(basename $dl_url)
+
+ local dl_count
+
+ if [ "x" == "x$dl_logfile" ]; then
+ dl_logfile="/tmp/logfile.$$"
+ fi
+
+ if [ "x" == "x$dl_outfile" ]; then
+ dl_outfile="$dl_file"
+ fi
+
+ if [ "x" == "x$dl_title" ]; then
+ dl_title="Downloading $dl_file .."
+ fi
+
+ if [ -f "$dl_logfile" ]; then
+ rm $dl_logfile
+ fi
+
+ # start wget in background
+ wget -v -b $dl_url -o "$dl_logfile" -O $dl_outfile
+
+ sleep 0.1;
+ _ddownload_checkpercentage "$dl_logfile"
+
+ dl_count=$?
+
+ while [ $dl_count -le 99 ];
+ do
+ echo $dl_count |dialog --gauge "$dl_title" $DIALOG_HEIGHT $DIALOG_WIDTH
+ sleep 0.5
+ _ddownload_checkpercentage "$dl_logfile"
+ dl_count=$?
+ done
+
+ local finished=0
+ while [ ! $finished ]; do
+ finished=$(tail -n 4 $dl_logfile | grep -c "$dl_file");
+ done
+
+ echo 100 | dialog --gauge "$dl_title" $DIALOG_HEIGHT $DIALOG_WIDTH;
+
+}
+
+
+
+menu_firststart () {
+ while [ "x$(cat result)" = "x" ] ; do
+ dialog --menu "OpenSLX" 30 60 22 \
+ 01 "Kiosk" \
+ 02 "Kiosk Setup" \
+ 03 "Custom System" \
+ 2>result
+ done
+}
+
+menu_oldconfig () {
+ oldconf=$1;
+ while [ "x$(cat result)" = "x" ] ; do
+ dialog --menu "OpenSLX" 30 60 22 \
+ 01 "Kiosk" \
+ 02 "Kiosk Setup" \
+ 03 "Custom System" \
+ 04 "Custom System"
+ 2>result
+ done
+}
diff --git a/src/boot-env/preboot/preboot.sh b/src/boot-env/preboot/preboot.sh
new file mode 100755
index 00000000..703af974
--- /dev/null
+++ b/src/boot-env/preboot/preboot.sh
@@ -0,0 +1,95 @@
+#!/bin/ash
+# Copyright (c) 2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# preboot script for user interaction with OpenSLX preloading environment for
+# Linux stateless clients (fetched by Preboot init over the net)
+
+# get configuration
+. /etc/initramfs-setup
+. ./preboot-scripts/dialog.functions
+
+# bring the mac address into the standard format 01-<MAC>
+client=$(echo 01-$macaddr|sed "s/:/-/g")
+
+# check if already a configuration is available to decide if user interaction
+# is required (path is to be fixed)
+wget -q -O /tmp/have-user-config "$boot_uri/users.pl?user=${client}"
+have_user_config=$(cat /tmp/have-user-config);
+
+if [ "x1" == "x$have_user_config" ]; then
+ wget -q -O /tmp/oldconfig "$boot_uri/users.pl?user=${client}&action=read"
+ . /tmp/oldconfig
+ menu_oldconfig $oldconfig
+else
+ menu_firststart
+fi
+rm result;
+
+# Switch here for several boot TYPE=fastboot/directkiosk/cfgkiosk/slxconfig
+# fastboot - no interaction use system from client config
+# directkiosk - start the default slx system into kiosk (using vmchooser)
+# cfgkiosk - offer the user changes to his kiosk system (GUI environment)
+# slxconfig - offer the user set of configuration options, like setting a non-
+# priviledged user, root password, standard gui, plugins to activate ...
+
+# we expect to have a system selection dialog file in /preboot/bootmenu.dialog
+while [ "x$(cat result)" = "x" ] ; do
+ dialog --file bootmenu.dialog 2>result
+done
+# source the system to boot configuration ($kernel, $initramfs, $append,
+# $label)
+sysname=$(cat result)
+. ./$sysname
+sysname=$(readlink $sysname)
+
+# set basic post data information
+postdata="system=${sysname}&preboot_id=${preboot_id}&client=${client}"
+
+# ask for desired debug level in stage3 if debug!=0 in preboot
+echo "0" >result
+[ x$DEBUGLEVEL != x0 ] && dialog --no-cancel --menu "Choose Debug Level:" \
+ 20 65 10 "0" "no debug output (splash)" \
+ "2" "standard debug output" \
+ "3" "debug output and shell" 2>result
+
+# change debug level here if required (adjusted for the rest of the interactive
+# part)
+DEBUGLEVEL=$(cat result)
+if [ x$DEBUGLEVEL != x0 ]; then
+ debug="debug=$DEBUGLEVEL"
+else
+ debug=""
+fi
+
+# send information to configuration host via http
+wget --post-data "$postdata" -O /tmp/cfg-error \
+ $boot_uri/cgi-bin/user_settings.pl
+
+[ "x$DEBUGLEVEL" != x0 -a grep -qe "Error:" /tmp/cfg-error 2>/dev/null ] && \
+ dialog --msgbox "An error occured ..." # to be elaborated
+
+# fetch kernel and initramfs of selected system
+dialog --infobox "Loading kernel of ${sysname} ..." 3 65
+wget -q -O /tmp/kernel $boot_uri/$kernel
+dialog --infobox "Loading initial ramfs of ${sysname} ..." 3 65
+wget -q -O /tmp/initramfs $boot_uri/$initramfs
+
+# read primary IP configuration to pass it on (behaviour like IPAPPEND=1 of
+# PXElinux)
+. /tmp/ipstuff
+
+[ "x$DEBUGLEVEL" != x0 ] && { clear; ash; }
+
+# start the new kernel with initialramfs and composed cmdline
+dialog --infobox "Booting OpenSLX client $label ..." 3 65
+kexec -l /tmp/kernel --initrd=/tmp/initramfs \
+ --append="$append file=$boot_uri/${preboot_id}/client-config/${sysname}/${client}.tgz $quiet ip=$ip:$siaddr:$router:$subnet:$dnssrv $debug" 2>/dev/null
+kexec -e >/dev/null 2>&1
diff --git a/src/boot-env/preboot/uclib-rootfs/init b/src/boot-env/preboot/uclib-rootfs/init
new file mode 100755
index 00000000..ab2f9ca0
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/init
@@ -0,0 +1,216 @@
+#!/bin/ash
+# Copyright (c) 2008..2009 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Main script for preboot initial ramfs - preloading environment for running
+# OpenSLX linux stateless clients version 5.
+
+fetchip () {
+# we expect to get an ip address within 10++ seconds
+( sleep 10 ; killall udhcpc >/dev/null 2>&1 ) &
+for i in 1 2 ; do
+ udhcpc -f -n -q $vci -s /usr/share/udhcpc/default.script -i $nwif 2>/dev/null
+ if grep "ip=" /tmp/ipstuff >/dev/null 2>&1 ; then
+ . /tmp/ipstuff
+ for ns in $dns ; do
+ echo "nameserver $ns" >>/etc/resolv.conf
+ done
+ # simply add a single dns server for passing via kernel cmdline to stage3
+ # (quickhack, just the last, list of dns might be better ...)
+ echo "dnssrv=$ns" >>/tmp/ipstuff
+ return
+ else
+ if [ $i -eq 1 ] ; then
+ sleep 1
+ else
+ dialog --msgbox "Did not get any proper IP configuration: Please check \
+that your Ethernet card is supported, the machine is connected to the network \
+and a DHCP server is answering your requests." 7 65
+ ash
+ echo "o" >/proc/sysrq-trigger
+ fi
+ fi
+done
+}
+
+#############################################################################
+# PreBoot init main part
+
+# device files get their own filesystem
+devdir="/dev"
+mount -n -t tmpfs -o 'size=25%,mode=0755' initramfsdevs ${devdir}
+export DEBUGLEVEL=0
+
+# create basic device files an directories in dev
+for i in "/dev/mem c 1 1" "/dev/null c 1 3" "/dev/zero c 1 5" \
+ "/dev/urandom c 1 9" "/dev/kmsg c 1 11" "/dev/tty0 c 4 0" \
+ "/dev/tty1 c 4 1" "/dev/tty2 c 4 2" "/dev/tty3 c 4 3" \
+ "/dev/tty4 c 4 4" "/dev/tty5 c 4 5" "/dev/tty6 c 4 6" \
+ "/dev/tty7 c 4 7" "/dev/tty8 c 4 8" "/dev/tty9 c 4 9" \
+ "/dev/tty10 c 4 10" "/dev/tty c 5 0" "/dev/console c 5 1" \
+ "/dev/ptmx c 5 2" "/dev/psaux c 10 1" "/dev/agpgart c 10 175" \
+ "/dev/fb0 c 29 0" "/dev/bootsplash p" "/dev/xconsole p"; do
+ mknod $i
+done
+mkdir -p ${devdir}/pts ${devdir}/shm
+export PATH=/bin:/sbin:/usr/bin/:/usr/sbin
+
+# redirect kernel messages to tty10 instead of tty1
+getty -i -n -l /bin/cat 38400 tty10 &
+setlogcons 10
+
+# initramfs-setup configuration (common settings for all clients using a
+# certain InitRamFS generated by slxmkramfs/mkdxsinitrd)
+[ -f /etc/initramfs-setup ] && . /etc/initramfs-setup 2>/dev/null
+
+# set a default LAN interface, has to be modified for WLAN or on machines
+# with more than one ethernet card built in
+nwif="eth0"
+
+# mount the important standard directories
+[ ! -f /proc/cpuinfo ] && mount -n -t proc proc /proc
+[ ! -d /sys/class ] && mount -n -t sysfs sysfs /sys
+
+# load framebuffer modules if needed
+for mod in vesafb fbcon; do
+ if [ x != x$(find /lib/modules -name ${mod}.ko) ]; then
+ modprobe $mod || \
+ dialog --infobox "Module $mod did not load for some reason." 3 65
+ usleep 1000
+ fi
+done
+
+# give startup information
+dialog --infobox "Starting OpenSLX preboot environment ..." 3 65
+
+# load usb keyboard and network adaptor modules
+for mod in ${ramfs_nicmods} af_packet unix hid hid-bright usbhid \
+ uhci-hcd ohci-hcd ; do
+ if [ x != x$(find /lib/modules -name ${mod}.ko) ]; then
+ modprobe $mod || \
+ dialog --infobox "Module $mod did not load for some reason." 3 65
+ usleep 10000
+ fi
+done
+
+# set the default for boot type and read kernel commandline (for this and
+# other options)
+export TYPE=fastboot
+read KCMDLINE </proc/cmdline
+# read the system wide machine-setup and then the kernel commandline
+for opts in ${KCMDLINE} ; do
+ case ${opts} in
+ debug)
+ DEBUGLEVEL=1;;
+ # ... or a specified debug level (will be passed to next stage)
+ debug=*)
+ DEBUGLEVEL=${opts#debug=};;
+ # WLAN ssid (most probably passed that way, unused yet ...)
+ ssid=*)
+ SSID=${opts#SSID=};;
+ # Boot type (fastboot)/directkiosk/cfgkiosk/slxconfig
+ type=*)
+ TYPE=${opts#type=};;
+ esac
+done
+
+# start a watchdog to ensure an automated reboot or halt of the machine if the
+# preboot init does not succeed (e.g. missing kernel module/firmware for the
+# network adaptor)
+if [ "${DEBUGLEVEL}" -eq 0 ] ; then
+ cat<<EOF >/bin/watchdog
+#!/bin/ash
+echo \$$ > /tmp/watchdogpid
+[ ! -f /proc/version ] && mount -n -t proc proc /proc
+sleep 120 2>/dev/null
+echo "o" >/proc/sysrq-trigger
+EOF
+ chmod u+x /bin/watchdog
+ watchdog &
+else
+ getty -i -n -l /bin/ash 38400 tty2 &
+fi
+
+if [ -n "${SSID}" ] ; then
+ # WLAN setup will most probably change the network interface name stored in
+ # nwif (to wlan0 or something like that)
+ [ $DEBUGLEVEL -gt 0 ] && echo "set essid to ${essid}";
+ #value of essid unchecked yet
+ # load network adaptor modules
+ cd /lib/modules/$(ls /lib/modules/)/kernel/drivers/net/wireless
+ for mod in $(find . | grep .ko | sed 's,.*/\([^/]*\).ko,\1',); do
+ echo "Mod:";
+ echo $mod;
+ modprobe $mod || echo "module $mod did not load for some reason"
+ usleep 10000
+ done
+ cd /
+ wlanif=$(iwconfig 2>/dev/null|sed -n "/ESSID:/p"|sed "s/ .*//")
+ [ $DEBUGLEVEL -gt 0 ] && echo "wlancard recognized as ${wlanif}";
+ ip link set dev ${wlanif} up
+ if iwconfig ${wlanif} mode managed essid "${essid}"; then
+ nwif=${wlanif}
+ else
+ error " Unable to configure the WLAN interface."
+ fi
+ :
+else
+ # check here for the active Ethernet link
+ ip link show dev eth1 >/dev/null 2>&1 && \
+ dialog --msgbox "More than one network interface found. This could cause \
+some trouble as their activation and ordering depends on the module load \
+order ..." 7 65
+fi
+
+# set up loopback networking and power up ethernet
+ip link set dev lo up
+ip addr add 127.0.0.1/8 dev lo
+ip link set dev $nwif up || echo "I did not find any usable network adaptor."
+
+# run udhcpc and start a debug shell if no lease could be obtained
+mkdir -p /usr/share/udhcpc
+echo -e "#!/bin/ash\nunset infomsg HOME IFS mask lease interface DEBUGLEVEL \
+BOOT_IMAGE\nset >/tmp/ipstuff" >/usr/share/udhcpc/default.script
+chmod u+x /usr/share/udhcpc/default.script
+modprobe -q af_packet
+[ -n $vci ] && vci="-V $vci"
+fetchip
+ip addr add $ip/$(ipcalc -s -p $ip $subnet|sed s/.*=//) dev $nwif
+ip route add default via $router
+
+# get the mac address of the boot network adaptor
+macaddr=$(ip link show dev $nwif 2>/dev/null | \
+ sed -n "/ether [0-9e-f]\{2\}:.*/p" | sed -e "s/.*ether //;s/ .*//")
+echo "macaddr=$macaddr" >>/etc/initramfs-setup
+
+# at this point a little selection script could be downloaded, which lets the
+# user choose what kind of SLX client he wants to get
+dialog --infobox "Fetching preboot interactive part and configuration from \
+the net ($boot_uri) ..." 4 65
+wget -q -O /tmp/preboot.env $boot_uri/bootloader/${preboot_id}.env
+mkdir /preboot
+tar -xzf /tmp/preboot.env -C /preboot
+# start a debug shell if needed, else set quiet kernel parameter
+if [ "${DEBUGLEVEL}" -gt 0 ] ; then
+ echo "Starting shell, leaving it would continue init."
+ /bin/ash
+else
+ # no debugging output for stage3 run
+ echo "quiet=quiet" >>/etc/initramfs-setup
+fi
+# run the preboot interactive part which finally will execute kexec
+cd /preboot
+exec ./preboot.sh
+# we should never return from that one ...
+dialog --msgbox "The execution of the main preboot component failed. Please \
+check network access of your box. Is $boot_uri reachable!?" 6 65
+# ping -c 1 $boot_uri
+sleep 20 && echo "o" >/proc/sysrq-trigger
+
diff --git a/src/boot-env/preboot/uclib-rootfs/lib/libcurses.so b/src/boot-env/preboot/uclib-rootfs/lib/libcurses.so
new file mode 120000
index 00000000..c7b1e02a
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/lib/libcurses.so
@@ -0,0 +1 @@
+libncurses.so.5.6 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so
new file mode 120000
index 00000000..7257b6af
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so
@@ -0,0 +1 @@
+libncurses.so.5 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5 b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5
new file mode 120000
index 00000000..c7b1e02a
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5
@@ -0,0 +1 @@
+libncurses.so.5.6 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5.6 b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5.6
new file mode 100755
index 00000000..a395c6b7
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/lib/libncurses.so.5.6
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/bin/clear b/src/boot-env/preboot/uclib-rootfs/usr/bin/clear
new file mode 100755
index 00000000..acc13246
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/bin/clear
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/bin/dialog b/src/boot-env/preboot/uclib-rootfs/usr/bin/dialog
new file mode 100755
index 00000000..6929569f
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/bin/dialog
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/bin/w3m b/src/boot-env/preboot/uclib-rootfs/usr/bin/w3m
new file mode 100755
index 00000000..2766a681
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/bin/w3m
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so
new file mode 120000
index 00000000..cda623f3
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so
@@ -0,0 +1 @@
+libcrypto.so.0.9.8 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so.0.9.8 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so.0.9.8
new file mode 100755
index 00000000..bb1b8163
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcrypto.so.0.9.8
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libcurses.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcurses.so
new file mode 100755
index 00000000..32ad8efe
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libcurses.so
@@ -0,0 +1,11 @@
+/* GNU ld script
+ Since Gentoo has critical dynamic libraries in /lib, and the static versions
+ in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we
+ run into linking problems. This "fake" dynamic lib is a linker script that
+ redirects the linker to the real lib. And yes, this works in the cross-
+ compiling scenario as the sysroot-ed linker will prepend the real path.
+
+ See bug http://bugs.gentoo.org/4411 for more info.
+ */
+OUTPUT_FORMAT ( elf32-i386 )
+GROUP ( /lib/libcurses.so )
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so
new file mode 120000
index 00000000..10e91696
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so
@@ -0,0 +1 @@
+libform.so.5 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5
new file mode 120000
index 00000000..4a80f6b6
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5
@@ -0,0 +1 @@
+libform.so.5.6 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5.6 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5.6
new file mode 100755
index 00000000..888adb22
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libform.so.5.6
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so
new file mode 120000
index 00000000..b12b5cfb
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so
@@ -0,0 +1 @@
+libmenu.so.5 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5
new file mode 120000
index 00000000..869f4a57
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5
@@ -0,0 +1 @@
+libmenu.so.5.6 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5.6 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5.6
new file mode 100755
index 00000000..fb190a90
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libmenu.so.5.6
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libncurses.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libncurses.so
new file mode 100755
index 00000000..e7122a85
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libncurses.so
@@ -0,0 +1,11 @@
+/* GNU ld script
+ Since Gentoo has critical dynamic libraries in /lib, and the static versions
+ in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we
+ run into linking problems. This "fake" dynamic lib is a linker script that
+ redirects the linker to the real lib. And yes, this works in the cross-
+ compiling scenario as the sysroot-ed linker will prepend the real path.
+
+ See bug http://bugs.gentoo.org/4411 for more info.
+ */
+OUTPUT_FORMAT ( elf32-i386 )
+GROUP ( /lib/libncurses.so )
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so
new file mode 120000
index 00000000..b5cd4a70
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so
@@ -0,0 +1 @@
+libpanel.so.5 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5
new file mode 120000
index 00000000..ff2e80a5
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5
@@ -0,0 +1 @@
+libpanel.so.5.6 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5.6 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5.6
new file mode 100755
index 00000000..4acbc076
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libpanel.so.5.6
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so b/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so
new file mode 120000
index 00000000..7874414f
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so
@@ -0,0 +1 @@
+libssl.so.0.9.8 \ No newline at end of file
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so.0.9.8 b/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so.0.9.8
new file mode 100755
index 00000000..194078c5
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/lib/libssl.so.0.9.8
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/sbin/kdump b/src/boot-env/preboot/uclib-rootfs/usr/sbin/kdump
new file mode 100755
index 00000000..07226a4b
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/sbin/kdump
Binary files differ
diff --git a/src/boot-env/preboot/uclib-rootfs/usr/sbin/kexec b/src/boot-env/preboot/uclib-rootfs/usr/sbin/kexec
new file mode 100755
index 00000000..cc49c45c
--- /dev/null
+++ b/src/boot-env/preboot/uclib-rootfs/usr/sbin/kexec
Binary files differ