summaryrefslogtreecommitdiff
path: root/recipes/nslu2-binary-only/unslung-rootfs/unsling
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/nslu2-binary-only/unslung-rootfs/unsling')
-rwxr-xr-xrecipes/nslu2-binary-only/unslung-rootfs/unsling264
1 files changed, 264 insertions, 0 deletions
diff --git a/recipes/nslu2-binary-only/unslung-rootfs/unsling b/recipes/nslu2-binary-only/unslung-rootfs/unsling
new file mode 100755
index 0000000000..539a1d2b58
--- /dev/null
+++ b/recipes/nslu2-binary-only/unslung-rootfs/unsling
@@ -0,0 +1,264 @@
+#!/bin/sh
+
+usage="Usage: $0 [-nopw] disk1|disk2"
+
+nopw=0
+if [ $# -gt 1 ] ; then
+ if [ "$1" = "-nopw" ] ; then
+ nopw=1
+ shift
+ fi
+fi
+
+# Set target disk
+
+if [ $# -eq 1 ] ; then
+ if [ "$1" = "disk1" ] ; then
+ mtch="/dev/sdb1 /share/hdd/data ext3 rw 0 0"
+ targ=/share/hdd/data
+ targconf=/share/hdd/conf
+ flag=.sdb1root
+ htmlinfo="disk1, /dev/sdb1"
+ fixconf=0
+ elif [ "$1" = "disk2" ] ; then
+ mtch="/dev/sda1 /share/flash/data ext3 rw 0 0"
+ targ=/share/flash/data
+ targconf=/share/flash/conf
+ flag=.sda1root
+ htmlinfo="disk2, /dev/sda1"
+ fixconf=1
+ else
+ echo $usage
+ exit 1
+ fi
+else
+ echo $usage
+ exit 1
+fi
+
+# MJW - The new "tar" method of unslinging does not care if the device
+# has already been unslung. The following test has been removed.
+#
+# Check that we can unsling at all! An unsling operation creates a new
+# rootfs, but it also marks the flash rootfs (with a flag file such as
+# ".sda1root") so that subsequent boots do not create the "var.state"
+# and "dev.state" mounts. Without those mounts, though, an attempt to
+# unsling will write a new rootfs on the target with an empty /dev
+# directory, which doesnt' work really well. So this check is all about
+# making sure that we are in a state in which we are capable of
+# performing the unsling operation.
+
+#echo "Checking if able to unsling..."
+#echo
+#m1="/dev/root /dev.state jffs2 rw 0 0"
+#m2="/dev/root /var.state jffs2 rw 0 0"
+#if ! grep "$m1" /proc/mounts >/dev/null 2>&1 || ! grep "$m2" /proc/mounts >/dev/null 2>&1 ; then
+# echo "Error: This system is unable to properly unsling because certain"
+# echo "required mounts (dev.state and/or var.state) are not available."
+# echo "This is most probably because you have already unslung this system."
+# echo
+#
+# if [ -f /.sda1root ] ; then
+# rm -f /.sda1root
+# elif [ -f /.sdb1root ] ; then
+# rm -f /.sdb1root
+# elif [ -f /.sda2root ] ; then
+# rm -f /.sda2root
+# elif [ -f /.sdb2root ] ; then
+# rm -f /.sdb2root
+# else
+# echo "However, in this case, the flags that indicate an already-unslung"
+# echo "system seem to be missing. Try restarting your NSLU2 to correct,"
+# echo "but if the problem persists, try re-flashing your NSLU2."
+# exit 1
+# fi
+# echo "The flags that indicate an already-unslung system have now been"
+# echo "removed and the required mounts should now become present after"
+# echo "reboot of the NSLU2."
+# echo
+# echo "1) Please unplug all drives from the NSLU2,"
+# echo "2) reboot,"
+# echo "3) and retry the unslinging process."
+# exit 1
+#fi
+
+# Check it's a real mount point
+
+echo "Waiting for $targ ..."
+CNT=120
+while [ $CNT -gt 0 ]
+do
+ if grep "$mtch" /proc/mounts >/dev/null 2>&1 ; then
+ echo
+ echo "Target disk is $targ"
+ CNT=-1
+ else
+ echo -ne "\r$CNT "
+ sleep 1
+ CNT=`expr $CNT - 1`
+ fi
+done
+if [ $CNT -eq 0 ] ; then
+ echo
+ echo "Error: $targ ($htmlinfo) is not a mounted disk"
+ exit 1
+fi
+
+# Do a quick sanity check to make sure we're unslinging to a disk that's been
+# formatted by the Linksys code.
+
+echo "Checking that $targ has been properly formatted..."
+if ! [ -d $targ/public ] || ! [ -f $targconf/.dongle ] || ! [ -f $targconf/passwd ] ; then
+ echo
+ echo "Error: $targ does not appear to have been formatted by the"
+ echo "Linksys formatting utility. Please go to the web interface,"
+ echo "and format the drive before unslinging."
+ exit 1
+fi
+
+echo "Checking that $targ is clean..."
+if [ -f $targ/.unslung ] ; then
+ echo
+ echo "Error: $targ appears to have already been unslung to:"
+ cat $targ/.unslung
+ echo "Please go to the web interface, and format the drive before"
+ echo "unslinging."
+ echo
+ echo "(Or, if you wish to unsling without removing the current root"
+ echo "filesystem, simply remove the file $targ/.unslung and retry"
+ echo "the unsling -- but beware, you enter uncharted territory!)"
+ exit 1
+fi
+
+# Change the root password
+if [ "$nopw" -eq 0 ] ; then
+ echo
+ echo "Please enter the new root password. This will be the new root"
+ echo "password used when the NSLU2 boots up with or without disks"
+ echo
+ passwd
+ if [ $? -ne 0 ] ; then
+ echo "Error setting password."
+ exit 1
+ fi
+# Quick sanity check, something may have gone wrong while we were
+# waiting at the passwd prompt...
+ if ! [ -d $targ/public ] || ! [ -f $targconf/.dongle ] || ! [ -f $targconf/passwd ] ; then
+ echo
+ echo "Error: $targ appears to have vanished into thin air."
+ echo "This would indicate some type of problem with the USB cable,"
+ echo "the device, or the formatting of the device."
+ exit 1
+ fi
+ cp /etc/passwd /usr/local/passwd
+ grep "^root:" /etc/passwd >$targconf/passwd.new
+ grep -v "^root:" $targconf/passwd >>$targconf/passwd.new
+ mv $targconf/passwd $targconf/passwd.save
+ mv $targconf/passwd.new $targconf/passwd
+ chmod 644 $targconf/passwd
+fi
+
+# Start at the root directory
+
+cd /
+
+# Save the existing ipkg database.
+
+rm -rf $targ/usr/lib/ipkg.old
+if [ -f $targ/usr/lib/ipkg/status ] ; then
+ mv $targ/usr/lib/ipkg $targ/usr/lib/ipkg.old
+fi
+
+# Copy the complete rootfs to the target.
+
+echo
+echo "Copying the complete rootfs from / to $targ ... "
+echo " (this will take just a couple of minutes)"
+# Quick sanity check to avoid filling the flash...
+if ! [ -d $targ/public ] || ! [ -f $targconf/.dongle ] || ! [ -f $targconf/passwd ] ; then
+ echo
+ echo "Error: $targ appears to have vanished into thin air."
+ echo "This would indicate some type of problem with the USB cable,"
+ echo "the device, or the formatting of the device."
+ exit 1
+fi
+
+echo "./var/tmp" > /tmp/xfile
+echo "./dev.state" >> /tmp/xfile
+echo "./var.state" >> /tmp/xfile
+echo "./lost+found" >>/tmp/xfile
+mkdir -p /tmp/tmprootfs
+/bin/mount /dev/mtdblock4 /tmp/tmprootfs
+/bin/tar -c -C /tmp/tmprootfs -X /tmp/xfile -f - . | (cd $targ; /bin/tar -x -f -)
+/bin/umount /tmp/tmprootfs
+echo "Copy complete ..."
+echo
+
+# Copy over the existing ipkg database.
+
+if [ -f $targ/usr/lib/ipkg.old/status ] ; then
+ echo "Preserving existing ipkg database on target disk."
+ ( cd $targ/usr/lib/ipkg.old ; tar cf - . ) | ( cd $targ/usr/lib/ipkg ; tar xf - )
+fi
+
+echo "Linking /usr/bin/ipkg executable on target disk."
+rm -f $targ/usr/bin/ipkg ; ln -s /usr/bin/ipkg-cl $targ/usr/bin/ipkg
+
+echo "Linking /etc/motd to the unslung motd on target disk."
+rm -f $targ/etc/motd ; ln -s /etc/motd-un $targ/etc/motd
+
+echo "Updating /home/httpd/html/home.htm with target disk info."
+sedcommand="s#Running.from.Internal.Flash#Unslung to $htmlinfo#"
+rm -f $targ/home/httpd/html/home.htm_bak
+cp $targ/home/httpd/html/home.htm $targ/home/httpd/html/home.htm_bak
+sed "$sedcommand" $targ/home/httpd/html/home.htm_bak > $targ/home/httpd/html/home.htm
+chmod 644 $targ/home/httpd/html/home.htm
+
+# Create a few empty files that are expected to be present
+touch $targ/var/log/wtmp
+chmod 644 $targ/var/log/wtmp
+touch $targ/var/run/utmp
+chmod 644 $targ/var/run/utmp
+mkdir -p $targ/var/tmp
+chmod 777 $targ/var/tmp
+
+# The "user password" Linksys utility is hard-coded to /share/hdd; also the
+# QuickSet utility seems to have some difficulty as well. Ugly fix is to
+# add symlinks if we are unslinging to /share/flash. It might seem more
+# reasonable to point to /etc/passwd, for example, but this approach seems to
+# be more likely to avoid looping symlinks.
+
+if [ "$fixconf" -eq 1 ] ; then
+ ln -s ../../flash/conf/.htpasswd $targ/share/hdd/conf/.htpasswd
+ ln -s ../../flash/conf/backup_sh.conf $targ/share/hdd/conf/backup_sh.conf
+ ln -s ../../flash/conf/config $targ/share/hdd/conf/config
+ ln -s ../../flash/conf/group $targ/share/hdd/conf/group
+ ln -s ../../flash/conf/passwd $targ/share/hdd/conf/passwd
+ ln -s ../../flash/conf/server.log $targ/share/hdd/conf/server.log
+ ln -s ../../flash/conf/share $targ/share/hdd/conf/share
+ ln -s ../../flash/conf/share.info $targ/share/hdd/conf/share.info
+ ln -s ../../flash/conf/smb.conf $targ/share/hdd/conf/smb.conf
+ ln -s ../../flash/conf/smbpasswd $targ/share/hdd/conf/smbpasswd
+ ln -s ../../flash/conf/tmp $targ/share/hdd/conf/tmp
+ ln -s ../../flash/conf/upgrade $targ/share/hdd/conf/upgrade
+ ln -s ../../flash/conf/usrgrp.info $targ/share/hdd/conf/usrgrp.info
+fi
+
+# Create the boot flag file.
+
+rm -f /.sd??root $targ/.sd??root
+
+echo "Creating /$flag to direct switchbox to boot from $targ."
+echo > /$flag
+echo > $targ/$flag
+
+# Done
+
+echo
+echo "Unsling complete."
+echo
+echo "Leave the device $htmlinfo, plugged in and reboot (using"
+echo "either the Web GUI, or the command \"DO_Reboot\") in order to boot"
+echo "this system up into unslung mode."
+
+exit 0