#!/bin/sh
# Enables use of busybox instead of full Debian programs.
set -e

mode="$1"

TAB="	"
	
bb_utils () {
	busybox --help | grep -A 100 'Currently defined functions' | \
		tail -n +2 | grep "^$TAB" | sed 's/,/ /g'
}

warn () {
	echo "Warning: $1" >&2
}

case "$mode" in
on|enable)
	# The following are a bunch of changes that make the Debian
	# init scripts play nice with Busybox. This is certianly not complete,
	# but it is enough to make the system work.
	save_files busybox-links /etc/init.d/hwclock.sh
	{
	echo 'g/hwclock --noadjfile/s/--noadjfile//'
	echo 'x'
	} | ex - /etc/init.d/hwclock.sh || warn "Didn't munge /etc/init.d/hwclock.sh"
	save_files busybox-links /etc/rcS.d/S09hwclockearly.sh
	{
	echo 'g/hwclock --noadjfile/s/--noadjfile//'
	echo 'x'
	} | ex - /etc/rcS.d/S09hwclockearly.sh || warn "Didn't munge /etc/rcS.d/S09hwclockearly.sh"
	
	if [ -e /etc/init.d/procps.sh ]; then
		save_files busybox-links /etc/init.d/procps.sh
		sed -i -e 's/-q//' /etc/init.d/procps.sh || warn "Didn't munge /etc/init.d/procps.sh"
	elif [ -e /etc/init.d/procps ]; then
		save_files busybox-links /etc/init.d/procps
		sed -i -e 's/-q//' /etc/init.d/procps || warn "Didn't munge /etc/init.d/procps"
	fi
	
	save_files busybox-links /etc/init.d/umountfs
	sed -i -e 's/-f -r -d/-r/' /etc/init.d/umountfs || warn "Didn't munge /etc/init.d/umountfs"
	sed -i -e 's/swapoff -a -v/swapoff -a/' /etc/init.d/umountfs \
		|| warn "Didn't munge /etc/init.d/umountfs"
	sed -i -e 's/umount -f -v -r/umount -r/' /etc/init.d/umountfs \
		|| warn "Didn't munge /etc/init.d/umountfs"
	
	save_files busybox-links /etc/init.d/bootmisc.sh
	{
	echo 'g/chmod -f/s/-f //'
	echo 'g/chown -f/s/-f //'
	echo 'x'
	} | ex - /etc/init.d/bootmisc.sh || warn "Didn't munge /etc/init.d/bootmisc.sh"
	
	save_files busybox-links /etc/ppp/ip-down.d/0000usepeerdns
	{
	echo 'g/readlink --canonicalize/s/--canonicalize/-f/'
	echo 'x'
	} | ex - /etc/ppp/ip-down.d/0000usepeerdns || warn "Didn't munge /etc/ppp/ip-down.d/0000usepeerdns"
	
	save_files busybox-links /etc/init.d/module-init-tools
	{
	echo 'g/depmod --quick/s/--quick//'
	echo 'x'
	} | ex - /etc/init.d/module-init-tools || warn "Didn't munge /etc/init.d/module-init-tools"
	{
	echo 'g/modprobe --list --type boot/s/modprobe --list --type boot/true/'
	echo 'x'
	} | ex - /etc/init.d/module-init-tools || warn "Didn't munge /etc/init.d/module-init-tools"
	
	save_files busybox-links /etc/init.d/mountall.sh
	sed -i -e 's/log_action_begin_msg "Activating swapfile swap"/return 0/' \
		/etc/init.d/mountall.sh || warn "Didn't munge /etc/init.d/mountall.sh"
	sed -i -e 's/log_action_msg "Will now activate swapfile swap"/return 0/' \
		/etc/init.d/mountall.sh || warn "Didn't munge /etc/init.d/mountall.sh"
	sed -i -e 's/nonfs/nonfs,nodevpts/' \
		/etc/init.d/mountall.sh || warn "Didn't munge /etc/init.d/mountall.sh"
	sed -i -e 's/swapon -a/#swapon -a/' \
		/etc/init.d/mountall.sh || warn "Didn't munge /etc/init.d/mountall.sh"

	save_files busybox-links /etc/init.d/checkroot.sh
	sed -i -e 's/swapon -a/#swapon -a/' \
		/etc/init.d/checkroot.sh || warn "Didn't munge /etc/init.d/checkroot.sh"

	save_files busybox-links /etc/init.d/bootmisc.sh
	sed -i -e 's/savelog/#savelog/g' /etc/init.d/bootmisc.sh \
		|| warn "Didn't munge /etc/init.d/bootmisc.sh"

	save_files busybox-links /etc/default/klogd
	sed -i -e 's/-x//' /etc/default/klogd \
		|| warn "Didn't munge /etc/default/klogd"
	
	save_files busybox-links /etc/init.d/klogd
	sed -i -e 's/--pidfile $pidfile//g' /etc/init.d/klogd \
		|| warn "Didn't munge /etc/init.d/klogd"
	
	save_files busybox-links /etc/init.d/sysklogd
	sed -i -e 's/--pidfile $pidfile//g' /etc/init.d/sysklogd \
		|| warn "Didn't munge /etc/init.d/sysklogd"

	# Special case for module-init-tools.
	for f in modprobe depmod rmmod insmod lsmod; do
		if [ -e /sbin/$f ]; then
			mv /sbin/$f /sbin/$f.module-init-tools
			dpkg-divert --remove /sbin/$f
		fi
	done
	
	for u in $(bb_utils); do
		orig=$(which $u) 2>/dev/null || true
		# don't touch busybox itself, and only replace existing
		# utils
		if [ -n "$orig" ] && [ "$u" != busybox ] && [ "$u" != udhcpc ]; then
			if [ -L $orig ] && readlink $orig | grep -q /etc/alternatives; then
				update-alternatives --verbose --install $orig $u /bin/busybox 1000
			else
				if dpkg-divert --add --rename --divert $orig.orig $orig; then
					if [ "$u" != ln ]; then
						ln -sf /bin/busybox $orig
					else
						# replacing ln, so use orig..
						ln.orig -sf /bin/busybox $orig
					fi
				fi
			fi
		elif [ "$u" = modprobe ] || [ "$u" = depmod ] || [ "$u" = rmmod ] || [ "$u" = insmod ] || [ "$u" = lsmod ]; then
			ln -sf /bin/busybox "/sbin/$u"
		fi
	done

	echo "Busybox enabled"
;;
touch)
	for u in $(bb_utils); do
		orig=$(which $u) 2>/dev/null || true
		if [ -n "$orig" ]; then
			touch $orig
		fi
	done
	echo "All busybox links touched"
;;
off|disable)
	restore_files busybox-links 
	# XXX: Special case for module-init-tools needs to be reverted.
	for u in $(bb_utils); do
		orig=$(which $u) 2>/dev/null || true
		if [ -n "$orig" ] && [ "$u" != busybox ]; then
			if [ -L $orig ] && readlink $orig | grep -q /etc/alternatives; then
				update-alternatives --verbose --remove $u /bin/busybox
			else
				if [ -e "$orig.orig" ]; then
					rm -f $orig
					dpkg-divert --remove --rename --divert $orig.orig $orig
				fi
			fi
		fi
	done
	echo "Busybox disabled"
;;
*)
	echo "Usage: busybox-links [enable|disable|touch]" >&2
	exit 1
;;
esac
