summaryrefslogtreecommitdiff
path: root/packages/openslug-init/openslug-init-0.10/initscripts
diff options
context:
space:
mode:
authorJohn Bowler <jbowler@nslu2-linux.org>2005-06-11 00:06:10 +0000
committerJohn Bowler <jbowler@nslu2-linux.org>2005-06-11 00:06:10 +0000
commit7ff6b6a715852b1c7f56d6a30d42d54105bcc0a4 (patch)
tree338e32aa62856742cf73c97bd7dbd5b9940e882a /packages/openslug-init/openslug-init-0.10/initscripts
parent38adae358e41cd43d6c8c79a317e37e4a360af2b (diff)
Implementation of reflash without RedBoot/upslug.
Very limited testing. To try it run 'reflash help'. BKrev: 42aa2af2mr4JkjqtkaV8hSbfxSC9bw
Diffstat (limited to 'packages/openslug-init/openslug-init-0.10/initscripts')
-rw-r--r--packages/openslug-init/openslug-init-0.10/initscripts/sysconfsetup229
1 files changed, 229 insertions, 0 deletions
diff --git a/packages/openslug-init/openslug-init-0.10/initscripts/sysconfsetup b/packages/openslug-init/openslug-init-0.10/initscripts/sysconfsetup
index e69de29bb2..1940b00ff8 100644
--- a/packages/openslug-init/openslug-init-0.10/initscripts/sysconfsetup
+++ b/packages/openslug-init/openslug-init-0.10/initscripts/sysconfsetup
@@ -0,0 +1,229 @@
+#!/bin/sh
+# This script is run once when the system first boots. Its sole
+# purpose is to create /etc/default/sysconf (the overall system
+# configuration file) and other files derived from this.
+#
+# The script runs immediately after S10checkroot.sh - this is the
+# point at which the rootfs will be mounted rw even if the kernel
+# booted with it ro.
+#
+# rm or mv the file to run this again. If this is done the
+# following configuration files will be rewritten:
+#
+# /etc/default/sysconf
+# /etc/hostname
+# /etc/defaultdomain
+# /etc/network/interfaces
+# /etc/resolv.conf
+#
+# /etc/default/functions contains useful utility functions - it's
+# in a separate file so that it can be loaded by any script
+. /etc/default/functions
+#
+config valid && test "$1" != reload && exit 0
+#
+# Utility to deal with absence of DNS configuration
+echodns(){
+ local dns
+ if test $# -gt 0
+ then
+ for dns in "$@"
+ do
+ echo "nameserver $dns"
+ done
+ fi
+}
+#
+# The SysConf device must exist in /dev at this point for this script
+# to work.
+#
+# It is important not to hard-wire the name of the device because of
+# the posibility of changing the flash partition layout.
+#
+# The block device is used here because at present udev does not
+# show the character devices
+sysdev=
+config valid || sysdev="$(mtblockdev SysConf)"
+if test -n "$sysdev" -a -b "$sysdev"
+then
+ # Read the defined part of SysConf into /etc/default/sysconf.
+ # SysConf has lines of two forms:
+ #
+ # [section]
+ # name=value
+ #
+ # In practice SysConf also contains other stuff, use the command:
+ #
+ # devio '<</dev/mtd1;cpb'
+ #
+ # to examine the current settings. The badly formatted stuff
+ # is removed (to be exact, the sed script selects only lines
+ # which match one of the two above). The lan interface, which
+ # defaults to ixp0, is changed to the correct value for openslug,
+ # eth0
+ devio "<<$sysdev" cpb fb1,10 | sed -n '/^\[[^][]*\]$/p;
+ s/^lan_interface=ixp0$/lan_interface=eth0/;
+ /^[-a-zA-Z0-9_][-a-zA-Z0-9_]*=/p' >/etc/default/sysconf
+ #
+ # The SysConf must have a hardware id, if it doesn't it has
+ # probably been erased or never set in the first place and the
+ # hardware id is retrieved from the RedBoot partition. This is
+ # the only thing which cannot be defaulted.
+fi
+#
+# Error recovery: no SysConf or invalid SysConf. Make a new one from the
+# RedBoot hardware ID information.
+# NOTE: this block of code overwrites the shell script arguments.
+config valid || {
+ reddev="$(mtblockdev RedBoot)"
+ initmac=
+ if test -n "$reddev" -a -b "$reddev"
+ then
+ # The hardware id starts 80 bytes before the end of the
+ # block, the block ends (or should end) with the signature
+ # <4 bytes> sErCoMm <bytes> sErCoMm. Note that devio 'pf'
+ # empties the stack.
+ set -- $(devio "<<$reddev" '
+ <= $80-
+ .= @
+ pf %02X
+ A= 5
+ $( 1
+ A= @,A1-
+ pf :%02X
+ $) A
+ pn
+ <=f4+;cp7;pn
+ <=$7-;cp7;pn')
+ if test $# -eq 3 -a "$2" = sErCoMm -a "$3" = sErCoMm
+ then
+ initmac="$1"
+ fi
+ fi
+ #
+ # APEX: may need extra code to set initmac here.
+ #
+ if test -n "$initmac"
+ then
+ #
+ # Generate a complete /etc/default/sysconf based on just
+ # one number ;-)
+ { echo '[network]'
+ echo "hw_addr=$initmac"
+ } >/etc/default/sysconf
+ #
+ # See /etc/default/functions (the config function) for
+ # the derivation of the rest of the information.
+ fi
+}
+#
+# The config function will now return the correct values - even if sysconf
+# is still missing. 'config valid' says if valid configuration information
+# is available.
+#
+# Set up the 'standard' files in the root file system (these couldn't be set
+# up before because they depend on stuff which RedBoot puts into SysConf from
+# the ID info on the specific machine - in particular the hardware address of
+# eth0, which must be the one assigned for *this* box!)
+#
+# HOSTNAME: defaults to LGK<mac> i.e. something derived from
+# the ethernet hardware. LinkSys documentation explains how
+# to determine this. Set by the user in linksys setup software.
+# DOMAINNAME: LinkSys puts this in w_d_name.
+test -n "$(config host)" && config host >/etc/hostname
+domain="$(config domain)"
+test -n "$domain" && echo "$domain" >/etc/defaultdomain
+#
+# Ethernet information. This goes into /etc/network/interfaces,
+# however this is only used for static setup (and this is not
+# the default). With dhcp the openslug udhcp script,
+# /etc/udhcpc.d/50default, loads the values from sysconf. The
+# lan_interface config value must exist for the file to be
+# overwritten here.
+iface="$(config iface)"
+if test -n "$iface"
+then
+ boot="$(config boot)"
+ # Only dhcp and static are supported at present - bootp
+ # support requires installation of appropriate packages
+ # dhcp is the fail-safe
+ case "$boot" in
+ dhcp|static) ;;
+ *) boot=dhcp;;
+ esac
+ #
+ mac="$(config mac)"
+ ip="$(config ip)"
+ netmask="$(config netmask)"
+ gateway="$(config gateway)"
+ {
+ echo "# /etc/network/interfaces"
+ echo "# configuration file for ifup(8), ifdown(8)"
+ echo "#"
+ echo "# The loopback interface"
+ echo "auto lo"
+ echo "iface lo inet loopback"
+ echo "#"
+ echo "# The NSLU2 built-in ethernet"
+ echo "auto $iface"
+ echo "# Automatically generated from /etc/default/sysconf"
+ if config valid
+ then
+ echo "# The pre-up option must always be supplied, regardless"
+ echo "# of configuration, to set the hardware correctly."
+ echo "# Severe network problems may result if this option is"
+ echo "# removed."
+ c=
+ else
+ echo "# WARNING: improperly configured network interface."
+ echo "# WARNING: the pre-up line must be corrected or severe"
+ echo "# WARNING: network problems may result."
+ c='#'
+ mac='<WARNING: unknown hardware address>'
+ fi
+ echo "iface $iface inet $boot"
+ echo "${c} pre-up ifconfig $iface hw ether $mac"
+ # The following are ignored for DHCP but are harmless
+ test -n "$ip" && echo " address $ip"
+ test -n "$netmask" && echo " netmask $netmask"
+ test -n "$gateway" && echo " gateway $gateway"
+ } >/etc/network/interfaces
+fi
+#
+# The DNS server information gives up to three nameservers, but this
+# currently only binds in the first.
+{
+ test -n "$domain" && echo "search $domain"
+ echodns $(config dns) $(config dns1) $(config dns2)
+} >/etc/resolv.conf
+#
+# Invalid config must be handled, do this by hacking /etc/motd.
+if config valid
+then
+ echo "Host name: $(config host)"
+ echo "Host ID: $mac"
+ echo "Network boot method: $boot"
+ case "$boot" in
+ static) echo "Host IP address: $ip";;
+ esac
+ echo "Use 'turnup init' to reset the configuration"
+ echo "Use 'turnup disk|nfs -i <device> options to initialise a non-flash root"
+ echo "Use 'turnup help' for more information"
+else
+ echo "+=====================================================================+"
+ echo "| +-----------------------+ |"
+ echo "| | INITIALISATION FAILED | |"
+ echo "| +-----------------------+ |"
+ echo "| |"
+ echo "| This machine has been booted with a temporary ethernet id |"
+ echo "| The initialisation failed because the machine id was not available |"
+ echo "| within the flash memory of the NSLU2. You must run: |"
+ echo "| |"
+ echo "| turnup init |"
+ echo "| |"
+ echo "| To correct this problem. Severe network problems may occur if this |"
+ echo "| is not done. |"
+ echo "+=====================================================================+"
+fi >/etc/motd
+
+exit 0