From: Felix Fietkau Date: Mon, 25 Jan 2010 17:11:17 +0000 (+0000) Subject: add preinit modularization work by Daniel Dickinson (cshore) X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fstaging%2Fmkresin.git;a=commitdiff_plain;h=56bc02a305ae8d8a7e927622d924cdab56d4f012;hp=35170c48928e99dda69d46274c2749bc9bff972d add preinit modularization work by Daniel Dickinson (cshore) SVN-Revision: 19331 --- diff --git a/package/base-files/Makefile b/package/base-files/Makefile index fb30b94ab9..6912cc5b4a 100644 --- a/package/base-files/Makefile +++ b/package/base-files/Makefile @@ -1,5 +1,6 @@ # # Copyright (C) 2007-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -298,6 +299,22 @@ define Package/ldconfig/config endef +define ImageConfigOptions + mkdir -p $(1)/lib/preinit + echo 'pi_suppress_stderr="$(CONFIG_TARGET_PREINIT_SUPPRESS_STDERR)"' >$(1)/lib/preinit/00_preinit.conf + echo 'fs_failsafe_wait_timeout=$(if $(CONFIG_TARGET_PREINIT_TIMEOUT),$(CONFIG_TARGET_PREINIT_TIMEOUT),2)' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_path=$(if $(CONFIG_TARGET_INIT_PATH),$(CONFIG_TARGET_INIT_PATH),"/bin:/sbin:/usr/bin:/usr/sbin")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_env=$(if $(CONFIG_TARGET_INIT_ENV),$(CONFIG_TARGET_INIT_ENV),"")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_cmd=$(if $(CONFIG_TARGET_INIT_CMD),$(CONFIG_TARGET_INIT_CMD),"/sbin/init")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_suppress_stderr="$(CONFIG_TARGET_INIT_SUPPRESS_STDERR)"' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_ifname=$(if $(CONFIG_TARGET_PREINIT_IFNAME),$(CONFIG_TARGET_PREINIT_IFNAME),"")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_ip=$(if $(CONFIG_TARGET_PREINIT_IP),$(CONFIG_TARGET_PREINIT_IP),"192.168.1.1")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_netmask=$(if $(CONFIG_TARGET_PREINIT_NETMASK),$(CONFIG_TARGET_PREINIT_NETMASK),"255.255.255.0")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_broadcast=$(if $(CONFIG_TARGET_PREINIT_BROADCAST),$(CONFIG_TARGET_PREINIT_BROADCAST),"")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_preinit_net_messages="$(CONFIG_TARGET_PREINIT_SHOW_NETMSG)"' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_preinit_no_failsafe_netmsg="$(CONFIG_TARGET_SUPPRESS_FAILSAFE_NETMSG)"' >>$(1)/lib/preinit/00_preinit.conf +endef + define Build/Prepare mkdir -p $(PKG_BUILD_DIR) endef @@ -362,6 +379,7 @@ define Package/base-files/install ln -sf /tmp $(1)/var mkdir -p $(1)/etc ln -sf /tmp/resolv.conf /tmp/fstab /tmp/TZ $(1)/etc/ + $(call ImageConfigOptions,$(1)) $(call Package/base-files/install-target,$(1)) for conffile in $(1)/etc/config/*; do \ if [ -f "$$$$conffile" ]; then \ diff --git a/package/base-files/files/etc/preinit b/package/base-files/files/etc/preinit index 688fca075e..eff382af3d 100755 --- a/package/base-files/files/etc/preinit +++ b/package/base-files/files/etc/preinit @@ -1,98 +1,45 @@ #!/bin/sh # Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + export PATH=/bin:/sbin:/usr/bin:/usr/sbin . /etc/diag.sh -failsafe_ip() { - ifconfig $ifname 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 up -} - -failsafe() { - set_state failsafe - [ -n "$ifname" ] && grep "$ifname" /proc/net/dev >/dev/null && { - failsafe_ip - netmsg 192.168.1.255 "Entering Failsafe!" - telnetd -l /bin/login.sh <> /dev/null 2>&1 - } - lock /tmp/.failsafe - ash --login -} - -mount proc /proc -t proc -mount sysfs /sys -t sysfs +preinit_essential_hook= +preinit_main_hook= +failsafe_hook= +initramfs_hook= +preinit_mount_root= -size=$(awk '/MemTotal:/ {l=5242880;mt=($2*1024);print((s=mt/2)l)?mt-l:s}' /proc/meminfo) -mount tmpfs /tmp -t tmpfs -o size=$size,nosuid,nodev,mode=1777 +pi_ifname= +pi_ip=192.168.1.1 +pi_broadcast=192.168.1.255 +pi_netmask=255.255.255.0 -if grep devfs /proc/filesystems > /dev/null; then - mount devfs /dev -t devfs - M0=/dev/pty/m0 - M1=/dev/pty/m1 - HOTPLUG=/sbin/hotplug-call +fs_failsafe_ifname= +fs_failsafe_ip=192.168.1.1 +fs_failsafe_broadcast=192.168.1.255 +fs_failsafe_netmask=255.255.255.0 -elif [ -x /sbin/hotplug2 ]; then - mount -t tmpfs tmpfs /dev -o size=512K - mknod /dev/console c 5 1 - /sbin/hotplug2 --set-worker /lib/hotplug2/worker_fork.so --set-rules-file /etc/hotplug2-init.rules --no-persistent --set-coldplug-cmd /sbin/udevtrigger - /sbin/hotplug2 --set-worker /lib/hotplug2/worker_fork.so --set-rules-file /etc/hotplug2-init.rules --persistent & - M0=/dev/ptmx - M1=/dev/ptmx - HOTPLUG= +fs_failsafe_wait_timeout=2 -elif [ -x /sbin/udevd ]; then - mount -n -t tmpfs -o mode=0755 udev /dev - [ -d /lib/udev/devices ] && cp -af /lib/udev/devices/* /dev/ - [ -c /dev/console ] || mknod -m 0600 /dev/console c 5 1 - [ -c /dev/null ] || mknod -m 0666 /dev/null c 1 3 - /sbin/udevd --daemon --resolve-names=never - /sbin/udevadm trigger - /sbin/udevadm settle - M0=/dev/pty/ptmx - M1=/dev/pty/ptmx - HOTPLUG= -fi +pi_suppress_stderr="y" +pi_init_suppress_stderr="y" +pi_init_path="/bin:/sbin:/usr/bin:/usr/sbin" +pi_init_cmd="/sbin/init" -[ -d /dev/pts ] || mkdir -p /dev/pts -[ -d /dev/shm ] || mkdir -p /dev/shm -mount devpts /dev/pts -t devpts +. /lib/functions/boot.sh -# the shell really doesn't like having stdin/out closed -# that's why we use /dev/pty/m0 and m1 as replacement -# for /dev/console if there's no serial console available -dd if=/dev/console of=/dev/null bs=1 count=0 >/dev/null 2>/dev/null && { - M0=/dev/console - M1=/dev/console -} -exec <$M0 >$M1 2>&0 +for pi_source_file in /lib/preinit/*; do + . $pi_source_file +done -echo "- preinit -" -set_state preinit -echo "Press CTRL-C for failsafe" -trap 'FAILSAFE=true' INT -trap 'FAILSAFE=true' USR1 -if [ -e /etc/preinit.arch ]; then - . /etc/preinit.arch -else - sleep 2 -fi -echo "$HOTPLUG" > /proc/sys/kernel/hotplug -export FAILSAFE -eval ${FAILSAFE:+failsafe} -lock -w /tmp/.failsafe +boot_run_hook preinit_essential -if [ -z "$INITRAMFS" ]; then - mount_root - [ -f /sysupgrade.tgz ] && { - echo "- config restore -" - cd / - mv sysupgrade.tgz /tmp - tar xzf /tmp/sysupgrade.tgz - rm -f /tmp/sysupgrade.tgz - sync - } +pi_mount_skip_next=false +pi_jffs2_mount_success=false +pi_failsafe_net_message=false - echo "- init -" +boot_run_hook preinit_main - exec /sbin/init -fi diff --git a/package/base-files/files/lib/firstboot/05_firstboot_skip b/package/base-files/files/lib/firstboot/05_firstboot_skip new file mode 100644 index 0000000000..283f8af8d3 --- /dev/null +++ b/package/base-files/files/lib/firstboot/05_firstboot_skip @@ -0,0 +1,10 @@ +#!/bin/sh + +check_skip() { + if [ "$firsboot_skip_next" = "true" ]; then + return 0 + else + return 1 + fi +} + diff --git a/package/base-files/files/lib/firstboot/10_determine_parts b/package/base-files/files/lib/firstboot/10_determine_parts new file mode 100644 index 0000000000..3f56e32a89 --- /dev/null +++ b/package/base-files/files/lib/firstboot/10_determine_parts @@ -0,0 +1,46 @@ +#!/bin/sh + +set_mtd_part() { + partname="rootfs_data" + mtdpart="$(find_mtd_part $partname)" +} + +set_rom_part() { + rom=$(awk '/squashfs/ {print $2}' /proc/mounts) +} + +set_jffs_part() { + jffs=$(awk '/jffs2/ {print $2}' /proc/mounts) +} + +determine_mtd_part() { + set_mtd_part + if [ -z "$mtdpart" ]; then + echo "MTD partition not found." + exit 1 + fi +} + +determine_rom_part() { + check_skip || { + set_rom_part + if [ -z "$rom" ]; then + echo "You do not have a squashfs partition; aborting" + echo "(firstboot cannot be run on jffs2 based firmwares)" + exit 1 + fi + } +} + +determine_jffs2_part() { + check_skip || { + set_jffs_part + } +} + +boot_hook_add switch2jffs determine_mtd_part +boot_hook_add jffs2reset determine_mtd_part +boot_hook_add switch2jffs determine_rom_part +boot_hook_add jffs2reset determine_rom_part +boot_hook_add switch2jffs determine_jffs2_part +boot_hook_add jffs2reset determine_jffs2_part diff --git a/package/base-files/files/lib/firstboot/10_no_fo_clear_overlay b/package/base-files/files/lib/firstboot/10_no_fo_clear_overlay new file mode 100644 index 0000000000..8a7d9b066f --- /dev/null +++ b/package/base-files/files/lib/firstboot/10_no_fo_clear_overlay @@ -0,0 +1,17 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +no_fo_clear_overlay() { + # switch back to squashfs temporarily + pivot /rom /mnt + + # get rid of the old overlay + umount -l /mnt + + # another umount to get rid of the bind from /tmp/root + umount -l /mnt +} + +boot_hook_add no_fo no_fo_clear_overlay diff --git a/package/base-files/files/lib/firstboot/10_reset_has_mini_fo b/package/base-files/files/lib/firstboot/10_reset_has_mini_fo new file mode 100644 index 0000000000..125af0faea --- /dev/null +++ b/package/base-files/files/lib/firstboot/10_reset_has_mini_fo @@ -0,0 +1,12 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +reset_check_for_mini_fo() { + if grep -q mini_fo /proc/filesystems; then + reset_has_fo=true + fi +} + +boot_hook_add jffs2reset reset_check_for_mini_fo diff --git a/package/base-files/files/lib/firstboot/20_has_mini_fo b/package/base-files/files/lib/firstboot/20_has_mini_fo new file mode 100644 index 0000000000..257b2b54c4 --- /dev/null +++ b/package/base-files/files/lib/firstboot/20_has_mini_fo @@ -0,0 +1,13 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +check_for_mini_fo() { + if ! grep -q mini_fo /proc/filesystems; then + boot_run_hook no_fo + exit 1 + fi +} + +boot_hook_add switch2jffs check_for_mini_fo diff --git a/package/base-files/files/lib/firstboot/20_no_fo_mount_jffs b/package/base-files/files/lib/firstboot/20_no_fo_mount_jffs new file mode 100644 index 0000000000..da914b143f --- /dev/null +++ b/package/base-files/files/lib/firstboot/20_no_fo_mount_jffs @@ -0,0 +1,15 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +no_fo_mount_jffs() { + # initialize jffs2 + mount "$mtdpart" /jffs -t jffs2 || exit + + # workaround to ensure that union can attach properly + sync + ls /jffs >/dev/null +} + +boot_hook_add no_fo no_fo_mount_jffs diff --git a/package/base-files/files/lib/firstboot/20_reset_clear_jffs b/package/base-files/files/lib/firstboot/20_reset_clear_jffs new file mode 100644 index 0000000000..a3cd24fe9a --- /dev/null +++ b/package/base-files/files/lib/firstboot/20_reset_clear_jffs @@ -0,0 +1,14 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +reset_clear_jffs() { + [ "$reset_has_fo" = "true" ] && { + rm -rf $jffs/* 2>&- + mount -o remount $jffs / 2>&- + exit 0 + } || reset_has_fo=false +} + +boot_hook_add jffs2reset reset_clear_jffs diff --git a/package/base-files/files/lib/firstboot/30_is_rootfs_mounted b/package/base-files/files/lib/firstboot/30_is_rootfs_mounted new file mode 100644 index 0000000000..7c3fe6c4c8 --- /dev/null +++ b/package/base-files/files/lib/firstboot/30_is_rootfs_mounted @@ -0,0 +1,10 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +skip_if_rootfs_mounted() { + mount "$mtdpart" /rom/jffs -t jffs2 || exit +} + +boot_hook_add switch2jffs skip_if_rootfs_mounted diff --git a/package/base-files/files/lib/firstboot/30_no_fo_pivot b/package/base-files/files/lib/firstboot/30_no_fo_pivot new file mode 100644 index 0000000000..cb82cde5dd --- /dev/null +++ b/package/base-files/files/lib/firstboot/30_no_fo_pivot @@ -0,0 +1,11 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +no_fo_pivot() { + # switch to the new (empty) jffs2 + fopivot /jffs /rom 1 +} + +boot_hook_add no_fo no_fo_pivot diff --git a/package/base-files/files/lib/firstboot/30_reset_copy_rom b/package/base-files/files/lib/firstboot/30_reset_copy_rom new file mode 100644 index 0000000000..d91c68947b --- /dev/null +++ b/package/base-files/files/lib/firstboot/30_reset_copy_rom @@ -0,0 +1,13 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +reset_copy_rom() { + [ "$reset_has_fo" != "true" ] && { + dupe $jffs $rom + exit 0 + } +} + +boot_hook_add jffs2reset reset_copy_rom diff --git a/package/base-files/files/lib/firstboot/40_copy_ramoverlay b/package/base-files/files/lib/firstboot/40_copy_ramoverlay new file mode 100644 index 0000000000..4b6a8828f0 --- /dev/null +++ b/package/base-files/files/lib/firstboot/40_copy_ramoverlay @@ -0,0 +1,15 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +copy_ramoverlay() { + # try to avoid fs changing while copying + mount -o remount,ro none / 2>&- + # copy ramoverlay to jffs2 + echo -n "copying files ... " + cp -a /tmp/root/* /rom/jffs 2>&- + echo "done" +} + +boot_hook_add switch2jffs copy_ramoverlay diff --git a/package/base-files/files/lib/firstboot/40_no_fo_copy_ramoverlay b/package/base-files/files/lib/firstboot/40_no_fo_copy_ramoverlay new file mode 100644 index 0000000000..ced7c1b668 --- /dev/null +++ b/package/base-files/files/lib/firstboot/40_no_fo_copy_ramoverlay @@ -0,0 +1,14 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +no_fo_copy_ramoverlay() { + # copy ramoverlay to jffs2, must be done after switching + # to the new rootfs to avoid creating opaque directories + echo -n "copying files ... " + cp -a /tmp/root/* / >/dev/null 2>&1 + sync +} + +boot_hook_add no_fo no_fo_ramoverlay diff --git a/package/base-files/files/lib/firstboot/50_pivot b/package/base-files/files/lib/firstboot/50_pivot new file mode 100644 index 0000000000..fa1c7b5400 --- /dev/null +++ b/package/base-files/files/lib/firstboot/50_pivot @@ -0,0 +1,17 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +with_fo_pivot() { + # switch back to squashfs (temporarily) + # and park the ramdisk ontop of /tmp/root + pivot /rom /mnt + mount -o move /mnt /tmp/root + + # /jffs is the overlay + # /rom is the readonly + fopivot /jffs /rom +} + +boot_hook_add switch2jffs with_fo_pivot diff --git a/package/base-files/files/lib/firstboot/99_10_no_fo_cleanup b/package/base-files/files/lib/firstboot/99_10_no_fo_cleanup new file mode 100644 index 0000000000..5eddfb14f8 --- /dev/null +++ b/package/base-files/files/lib/firstboot/99_10_no_fo_cleanup @@ -0,0 +1,13 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +no_fo_cleanup() { + echo "done" + umount -l /jffs + umount -l /tmp/root + exit 0 +} + +boot_hook_add no_fo no_fo_cleanup diff --git a/package/base-files/files/lib/firstboot/99_10_with_fo_cleanup b/package/base-files/files/lib/firstboot/99_10_with_fo_cleanup new file mode 100644 index 0000000000..8b00159722 --- /dev/null +++ b/package/base-files/files/lib/firstboot/99_10_with_fo_cleanup @@ -0,0 +1,13 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +with_fo_cleanup() { + # try to get rid of /tmp/root + # this will almost always fail + mount /tmp/root 2>&- + exit 0 +} + +boot_hook_add switch2jffs with_fo_cleanup diff --git a/package/base-files/files/lib/functions/boot.sh b/package/base-files/files/lib/functions/boot.sh new file mode 100644 index 0000000000..46b4613300 --- /dev/null +++ b/package/base-files/files/lib/functions/boot.sh @@ -0,0 +1,95 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +boot_hook_add() { + local hook="${1}_hook" + local value="$2" + local sep=" " + + eval "$hook=\"\${$hook:+\${$hook}\${value:+\$sep}}\$value\"" +} + +boot_run_hook() { + local boot_func + for boot_func in $(eval "echo \"\$${1}_hook\""); do + $boot_func "$1" "$2" + done +} + +find_mtd_part() { + local PART="$(grep "\"$1\"" /proc/mtd | awk -F: '{print $1}')" + local PREFIX=/dev/mtdblock + + PART="${PART##mtd}" + [ -d /dev/mtdblock ] && PREFIX=/dev/mtdblock/ + echo "${PART:+$PREFIX$PART}" +} + +jffs2_ready () { + mtdpart="$(find_mtd_part rootfs_data)" + magic=$(hexdump $mtdpart -n 4 -e '4/1 "%02x"') + [ "$magic" != "deadc0de" ] +} + +dupe() { # + cd $1 + echo -n "creating directories... " + { + cd $2 + find . -xdev -type d + echo "./dev ./jffs ./mnt ./proc ./tmp" + # xdev skips mounted directories + cd $1 + } | xargs mkdir -p + echo "done" + + echo -n "setting up symlinks... " + for file in $(cd $2; find . -xdev -type f;); do + case "$file" in + ./rom/note) ;; #nothing + ./etc/config*|\ + ./usr/lib/opkg/info/*) cp -af $2/$file $file;; + *) ln -sf /rom/${file#./*} $file;; + esac + done + for file in $(cd $2; find . -xdev -type l;); do + cp -af $2/${file#./*} $file + done + echo "done" +} + +pivot() { # + mount -o move /proc $1/proc && \ + pivot_root $1 $1$2 && { + mount -o move $2/dev /dev + mount -o move $2/tmp /tmp + mount -o move $2/sys /sys 2>&- + mount -o move $2/jffs /jffs 2>&- + return 0 + } +} + +fopivot() { # + root=$1 + { + if grep -q mini_fo /proc/filesystems; then + mount -t mini_fo -o base=/,sto=$1 "mini_fo:$1" /mnt 2>&- && root=/mnt + else + mount --bind / /mnt + mount --bind -o union "$1" /mnt && root=/mnt + fi + } || { + [ "$3" = "1" ] && { + mount | grep "on $1 type" 2>&- 1>&- || mount -o bind $1 $1 + dupe $1 $rom + } + } + pivot $root $2 +} + +ramoverlay() { + mkdir -p /tmp/root + mount -t tmpfs root /tmp/root + fopivot /tmp/root /rom 1 +} diff --git a/package/base-files/files/lib/preinit/05_mount_skip b/package/base-files/files/lib/preinit/05_mount_skip new file mode 100644 index 0000000000..c2b7ee79d6 --- /dev/null +++ b/package/base-files/files/lib/preinit/05_mount_skip @@ -0,0 +1,13 @@ +#!/bin/sh + +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +check_skip() { + if [ "$pi_mount_skip_next" = "true" ]; then + return 0 + else + return 1 + fi +} + diff --git a/package/base-files/files/lib/preinit/10_check_for_mtd b/package/base-files/files/lib/preinit/10_check_for_mtd new file mode 100644 index 0000000000..e1f3c07a2a --- /dev/null +++ b/package/base-files/files/lib/preinit/10_check_for_mtd @@ -0,0 +1,20 @@ +#!/bin/sh + +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +mount_no_mtd() { + mtd unlock rootfs + mount -o remount,rw /dev/root / +} + +check_for_mtd() { + check_skip || { + grep rootfs_data /proc/mtd >/dev/null 2>/dev/null || { + mount_no_mtd && pi_mount_skip_next=true + } + } +} + +boot_hook_add preinit_mount_root check_for_mtd + diff --git a/package/base-files/files/lib/preinit/10_essential_fs b/package/base-files/files/lib/preinit/10_essential_fs new file mode 100644 index 0000000000..ab317dc20a --- /dev/null +++ b/package/base-files/files/lib/preinit/10_essential_fs @@ -0,0 +1,25 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +do_mount_procfs() { + mount proc /proc -t proc +} + +do_mount_sysfs() { + mount sysfs /sys -t sysfs +} + +calc_tmpfs_size() { + pi_size=$(awk '/MemTotal:/ {l=5242880;mt=($2*1024);print((s=mt/2)l)?mt-l:s}' /proc/meminfo) +} + +do_mount_tmpfs() { + calc_tmpfs_size + mount tmpfs /tmp -t tmpfs -o size=$pi_size,nosuid,nodev,mode=1777 +} + +boot_hook_add preinit_essential do_mount_procfs +boot_hook_add preinit_essential do_mount_sysfs +boot_hook_add preinit_essential do_mount_tmpfs + diff --git a/package/base-files/files/lib/preinit/10_indicate_failsafe b/package/base-files/files/lib/preinit/10_indicate_failsafe new file mode 100644 index 0000000000..7761fd3be6 --- /dev/null +++ b/package/base-files/files/lib/preinit/10_indicate_failsafe @@ -0,0 +1,18 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +# commands for emitting messages to network in failsafe mode + +indicate_failsafe_led () { + set_state failsafe +} + +indicate_failsafe() { + echo "- failsafe -" + preinit_net_echo "Entering Failsafe!\n" + indicate_failsafe_led +} + +boot_hook_add failsafe indicate_failsafe + diff --git a/package/base-files/files/lib/preinit/10_indicate_preinit b/package/base-files/files/lib/preinit/10_indicate_preinit new file mode 100644 index 0000000000..cd3ca5571a --- /dev/null +++ b/package/base-files/files/lib/preinit/10_indicate_preinit @@ -0,0 +1,52 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +preinit_ip() { + # if the preinit interface isn't specified and ifname is set in + # preinit.arch use that interface + if [ -z "$pi_ifname" ]; then + pi_ifname=$ifname + fi + + [ -n "$pi_ifname" ] && grep "$pi_ifname" /proc/net/dev >/dev/null && { + ifconfig $pi_ifname $pi_ip netmask $pi_netmask broadcast $pi_broadcast up + } +} + +preinit_ip_deconfig() { + [ -n "$pi_ifname" ] && grep "$pi_ifname" /proc/net/dev >/dev/null && { + ifconfig $pi_ifname 0.0.0.0 down + } +} + +preinit_net_echo() { + [ -n "$pi_ifname" ] && grep "$pi_ifname" /proc/net/dev >/dev/null && { + { + [ "$pi_preinit_net_messages" = "y" ] || { + [ "$pi_failsafe_net_message" = "true" ] && + [ "$pi_preinit_no_failsafe_netmsg" != "y" ] + } + + } && netmsg $pi_broadcast "$1" + } +} + +preinit_echo() { + preinit_net_echo $1 + echo $1 +} + +pi_indicate_led() { + set_state preinit +} + +pi_indicate_preinit() { + echo "- preinit -" + preinit_net_echo "Doing OpenWRT Preinit\n" + pi_indicate_led +} + +boot_hook_add preinit_main preinit_ip +boot_hook_add preinit_main pi_indicate_preinit + diff --git a/package/base-files/files/lib/preinit/20_check_jffs2_ready b/package/base-files/files/lib/preinit/20_check_jffs2_ready new file mode 100644 index 0000000000..3c5cf67e8d --- /dev/null +++ b/package/base-files/files/lib/preinit/20_check_jffs2_ready @@ -0,0 +1,19 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +mount_no_jffs2() { + echo "jffs2 not ready yet; using ramdisk" + ramoverlay +} + +check_for_jffs2() { + check_skip || { + jffs2_ready || { + mount_no_jffs2 && pi_mount_skip_next=true + } + } +} + +boot_hook_add preinit_mount_root check_for_jffs2 + diff --git a/package/base-files/files/lib/preinit/20_device_fs_mount b/package/base-files/files/lib/preinit/20_device_fs_mount new file mode 100644 index 0000000000..6b2a6e8f3b --- /dev/null +++ b/package/base-files/files/lib/preinit/20_device_fs_mount @@ -0,0 +1,28 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +do_mount_devfs() { + mount devfs /dev -t devfs +} + +do_mount_hotplug() { + mount -t tmpfs tmpfs /dev -o size=512K +} + +do_mount_udev() { + mount -n -t tmpfs -o mode=0755 udev /dev +} + +choose_device_fs() { + if grep devfs /proc/filesystems > /dev/null; then + do_mount_devfs + elif [ -x /sbin/hotplug2 ]; then + do_mount_hotplug + elif [ -x /sbin/udevd ]; then + do_mount_udev + fi +} + +boot_hook_add preinit_essential choose_device_fs + diff --git a/package/base-files/files/lib/preinit/30_device_fs_daemons b/package/base-files/files/lib/preinit/30_device_fs_daemons new file mode 100644 index 0000000000..5a3aaf3d64 --- /dev/null +++ b/package/base-files/files/lib/preinit/30_device_fs_daemons @@ -0,0 +1,36 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +init_devfs() { + HOTPLUG=/sbin/hotplug-call +} + +init_hotplug2() { + [ -c /dev/console ] || mknod /dev/console c 5 1 + /sbin/hotplug2 --set-worker /lib/hotplug2/worker_fork.so --set-rules-file /etc/hotplug2-init.rules --no-persistent --set-coldplug-cmd /sbin/udevtrigger + /sbin/hotplug2 --set-worker /lib/hotplug2/worker_fork.so --set-rules-file /etc/hotplug2-init.rules --persistent & +} + +init_udev() { + [ -d /lib/udev/devices ] && cp -af /lib/udev/devices/* /dev/ + [ -c /dev/console ] || mknod -m 0600 /dev/console c 5 1 + [ -c /dev/null ] || mknod -m 0666 /dev/null c 1 3 + /sbin/udevd --daemon --resolve-names=never + /sbin/udevadm trigger + /sbin/udevadm settle +} + +init_device_fs() { + HOTPLUG= + if grep devfs /proc/filesystems > /dev/null; then + init_devfs + elif [ -x /sbin/hotplug2 ]; then + init_hotplug2 + elif [ -x /sbin/udevd ]; then + init_udev + fi +} + +boot_hook_add preinit_essential init_device_fs + diff --git a/package/base-files/files/lib/preinit/30_failsafe_wait b/package/base-files/files/lib/preinit/30_failsafe_wait new file mode 100644 index 0000000000..084f9945e8 --- /dev/null +++ b/package/base-files/files/lib/preinit/30_failsafe_wait @@ -0,0 +1,86 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +fs_wait_for_key () { + local timeout=$3 + local timer + local do_failsafe + local keypress_true="$(mktemp)" + local keypress_wait="$(mktemp)" + local keypress_sec="$(mktemp)" + if [ -z "$keypress_wait" ]; then + keypress_wait=/tmp/.keypress_wait + touch $keypress_wait + fi + if [ -z "$keypress_true" ]; then + keypress_true=/tmp/.keypress_true + touch $keypress_true + fi + if [ -z "$keypress_sec" ]; then + keypress_sec=/tmp/.keypress_sec + touch $keypress_sec + fi + + trap "echo 'true' >$keypress_true; lock -u $keypress_wait ; rm -f $keypress_wait" INT + trap "echo 'true' >$keypress_true; lock -u $keypress_wait ; rm -f $keypress_wait" USR1 + + [ -n "$timeout" ] || timeout=1 + [ $timeout -ge 1 ] || timeout=1 + timer=$timeout + lock $keypress_wait + { + while [ $timer -gt 0 ]; do + echo "$timer" >$keypress_sec + timer=$(($timer - 1)) + sleep 1 + done + lock -u $keypress_wait + rm -f $keypress_wait + } & + + echo "Press $1 $2" + # if we're on the console we wait for input + { + while [ -r $keypress_wait ]; do + timer="$(cat $keypress_sec)" + + [ -n "$timer" ] || timer=1 + timer="${timer%%\ *}" + [ $timer -ge 1 ] || timer=1 + do_failsafe="" + { + read -t "$timer" do_failsafe + if [ "$do_failsafe" = "$1" ]; then + echo "true" >$keypress_true + lock -u $keypress_wait + rm -f $keypress_wait + fi + } + done + } + lock -w $keypress_wait + + trap - INT + trap - USR1 + + keypressed=1 + [ "$(cat $keypress_true)" = "true" ] && keypressed=0 + rm -f $keypress_true + rm -f $keypress_wait + rm -f $keypress_sec + + return $keypressed +} + +failsafe_wait() { + FAILSAFE= + pi_failsafe_net_message=true + preinit_net_echo "Please press button now to enter failsafe" + pi_failsafe_net_message=false + echo -n "Press CTRL-C or " + fs_wait_for_key f 'to enter failsafe mode' $fs_failsafe_wait_timeout && FAILSAFE=true && export FAILSAFE +} + +boot_hook_add preinit_main failsafe_wait + diff --git a/package/base-files/files/lib/preinit/40_init_shm b/package/base-files/files/lib/preinit/40_init_shm new file mode 100644 index 0000000000..8971116a49 --- /dev/null +++ b/package/base-files/files/lib/preinit/40_init_shm @@ -0,0 +1,10 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +init_shm() { + [ -d /dev/shm ] || mkdir -p /dev/shm +} + +boot_hook_add preinit_essential init_shm + diff --git a/package/base-files/files/lib/preinit/40_mount_devpts b/package/base-files/files/lib/preinit/40_mount_devpts new file mode 100644 index 0000000000..2d5010b912 --- /dev/null +++ b/package/base-files/files/lib/preinit/40_mount_devpts @@ -0,0 +1,15 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +init_devpts() { + [ -d /dev/pts ] || mkdir -p /dev/pts +} + +do_mount_devpts() { + mount devpts /dev/pts -t devpts +} + +boot_hook_add preinit_essential init_devpts +boot_hook_add preinit_essential do_mount_devpts + diff --git a/package/base-files/files/lib/preinit/40_mount_jffs2 b/package/base-files/files/lib/preinit/40_mount_jffs2 new file mode 100644 index 0000000000..99fe262c68 --- /dev/null +++ b/package/base-files/files/lib/preinit/40_mount_jffs2 @@ -0,0 +1,24 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +find_mount_jffs2() { + mount "$(find_mtd_part rootfs_data)" /jffs -t jffs2 +} + +jffs2_not_mounted() { + if [ "$pi_jffs2_mount_success" != "true" ]; then + return 0 + else + return 1 + fi +} + +do_mount_jffs2() { + check_skip || { + find_mount_jffs2 && pi_jffs2_mount_success=true + } +} + +boot_hook_add preinit_mount_root do_mount_jffs2 + diff --git a/package/base-files/files/lib/preinit/40_run_failsafe_hook b/package/base-files/files/lib/preinit/40_run_failsafe_hook new file mode 100644 index 0000000000..faa043c171 --- /dev/null +++ b/package/base-files/files/lib/preinit/40_run_failsafe_hook @@ -0,0 +1,13 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +run_failsafe_hook() { + if [ "$FAILSAFE" = "true" ]; then + boot_run_hook failsafe + lock -w /tmp/.failsafe + fi +} + +boot_hook_add preinit_main run_failsafe_hook + diff --git a/package/base-files/files/lib/preinit/50_choose_console b/package/base-files/files/lib/preinit/50_choose_console new file mode 100644 index 0000000000..346479640e --- /dev/null +++ b/package/base-files/files/lib/preinit/50_choose_console @@ -0,0 +1,31 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +choose_console() { + # the shell really doesn't like having stdin/out closed + # that's why we use /dev/pty/m0 and m1 (or equivalent) as replacement + # for /dev/console if there's no serial console available + + if grep devfs /proc/filesystems > /dev/null; then + M0=/dev/pty/m0 + M1=/dev/pty/m1 + M2=/dev/pty/m1 + elif [ -x /sbin/hotplug2 ]; then + M0=/dev/ptmx + M1=/dev/ptmx + M2=/dev/ptmx + elif [ -x /sbin/udevd ]; then + M0=/dev/pty/ptmx + M1=/dev/pty/ptmx + M2=/dev/pty/ptmx + fi + dd if=/dev/console of=/dev/null bs=1 count=0 >/dev/null 2>/dev/null && { + M0=/dev/console + M1=/dev/console + M2=/dev/console + } +} + +boot_hook_add preinit_essential choose_console + diff --git a/package/base-files/files/lib/preinit/50_indicate_regular_preinit b/package/base-files/files/lib/preinit/50_indicate_regular_preinit new file mode 100644 index 0000000000..9cc01f2199 --- /dev/null +++ b/package/base-files/files/lib/preinit/50_indicate_regular_preinit @@ -0,0 +1,12 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +indicate_regular_preinit() { + echo "- regular preinit -" + preinit_net_echo "Continuing with Regular Preinit\n" + pi_indicate_led +} + +boot_hook_add preinit_main indicate_regular_preinit + diff --git a/package/base-files/files/lib/preinit/60_init_hotplug b/package/base-files/files/lib/preinit/60_init_hotplug new file mode 100644 index 0000000000..dc05e0ed05 --- /dev/null +++ b/package/base-files/files/lib/preinit/60_init_hotplug @@ -0,0 +1,10 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +init_hotplug() { + echo "$HOTPLUG" > /proc/sys/kernel/hotplug +} + +boot_hook_add preinit_main init_hotplug + diff --git a/package/base-files/files/lib/preinit/70_initramfs_test b/package/base-files/files/lib/preinit/70_initramfs_test new file mode 100644 index 0000000000..e07c68d210 --- /dev/null +++ b/package/base-files/files/lib/preinit/70_initramfs_test @@ -0,0 +1,13 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +initramfs_test() { + if [ -n "$INITRAMFS" ]; then + boot_run_hook initramfs + break + fi +} + +boot_hook_add preinit_main initramfs_test + diff --git a/package/base-files/files/lib/preinit/70_pivot_jffs2_root b/package/base-files/files/lib/preinit/70_pivot_jffs2_root new file mode 100644 index 0000000000..f0a2a5569a --- /dev/null +++ b/package/base-files/files/lib/preinit/70_pivot_jffs2_root @@ -0,0 +1,13 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +rootfs_pivot() { + check_skip || jffs2_not_mounted || { + echo "switching to jffs2" + fopivot /jffs /rom && pi_mount_skip_next=true + } +} + +boot_hook_add preinit_mount_root rootfs_pivot + diff --git a/package/base-files/files/lib/preinit/80_mount_root b/package/base-files/files/lib/preinit/80_mount_root new file mode 100644 index 0000000000..cc8781687e --- /dev/null +++ b/package/base-files/files/lib/preinit/80_mount_root @@ -0,0 +1,10 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +do_mount_root() { + boot_run_hook preinit_mount_root +} + +boot_hook_add preinit_main do_mount_root + diff --git a/package/base-files/files/lib/preinit/90_init_console b/package/base-files/files/lib/preinit/90_init_console new file mode 100644 index 0000000000..ca05755fd3 --- /dev/null +++ b/package/base-files/files/lib/preinit/90_init_console @@ -0,0 +1,14 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +init_console() { + if [ "$pi_suppress_stderr" = "y" ]; then + exec <$M0 >$M1 2>&0 + else + exec <$M0 >$M1 2>$M2 + fi +} + +boot_hook_add preinit_essential init_console + diff --git a/package/base-files/files/lib/preinit/90_mount_no_jffs2 b/package/base-files/files/lib/preinit/90_mount_no_jffs2 new file mode 100644 index 0000000000..d8ad4ae119 --- /dev/null +++ b/package/base-files/files/lib/preinit/90_mount_no_jffs2 @@ -0,0 +1,12 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +do_mount_no_jffs2() { + check_skip || { + mount_no_jffs2 && pi_mount_skip_next=true + } +} + +boot_hook_add preinit_mount_root do_mount_no_jffs2 + diff --git a/package/base-files/files/lib/preinit/90_restore_config b/package/base-files/files/lib/preinit/90_restore_config new file mode 100644 index 0000000000..210bf61847 --- /dev/null +++ b/package/base-files/files/lib/preinit/90_restore_config @@ -0,0 +1,17 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +restore_config() { + [ -f /sysupgrade.tgz ] && { + echo "- config restore -" + cd / + mv sysupgrade.tgz /tmp + tar xzf /tmp/sysupgrade.tgz + rm -f /tmp/sysupgrade.tgz + sync + } +} + +boot_hook_add preinit_main restore_config + diff --git a/package/base-files/files/lib/preinit/99_10_failsafe_login b/package/base-files/files/lib/preinit/99_10_failsafe_login new file mode 100644 index 0000000000..05d6b7787b --- /dev/null +++ b/package/base-files/files/lib/preinit/99_10_failsafe_login @@ -0,0 +1,18 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +failsafe_netlogin () { + telnetd -l /bin/login.sh <> /dev/null 2>&1 +} + +failsafe_shell() { + lock /tmp/.failsafe + ash --login + echo "Please reboot system when done with failsafe network logins" +} + + +boot_hook_add failsafe failsafe_netlogin +boot_hook_add failsafe failsafe_shell + diff --git a/package/base-files/files/lib/preinit/99_10_mount_no_mtd b/package/base-files/files/lib/preinit/99_10_mount_no_mtd new file mode 100644 index 0000000000..c4f38e415b --- /dev/null +++ b/package/base-files/files/lib/preinit/99_10_mount_no_mtd @@ -0,0 +1,12 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +do_mount_no_mtd() { + check_skip || { + mount_no_mtd + } +} + +boot_hook_add preinit_mount_root do_mount_no_mtd + diff --git a/package/base-files/files/lib/preinit/99_10_run_init b/package/base-files/files/lib/preinit/99_10_run_init new file mode 100644 index 0000000000..dab2fda0dc --- /dev/null +++ b/package/base-files/files/lib/preinit/99_10_run_init @@ -0,0 +1,16 @@ +#!/bin/sh +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +run_init() { + preinit_echo "- init -" + preinit_ip_deconfig + if [ "$pi_init_stderr_suppress" = "y" ]; then + exec env - PATH=$pi_init_path $pi_init_env $pi_init_cmd 2>&0 + else + exec env - PATH=$pi_init_path $pi_init_env $pi_init_cmd + fi +} + +boot_hook_add preinit_main run_init + diff --git a/package/base-files/files/sbin/firstboot b/package/base-files/files/sbin/firstboot index d5a0981f43..5de4fa8a4b 100755 --- a/package/base-files/files/sbin/firstboot +++ b/package/base-files/files/sbin/firstboot @@ -1,162 +1,34 @@ #!/bin/sh -. /etc/functions.sh -partname="rootfs_data" -mtdpart="$(find_mtd_part $partname)" +switch2jffs_hook= +jffs2reset_hook= +no_fo_hook= -rom=$(awk '/squashfs/ {print $2}' /proc/mounts) -jffs=$(awk '/jffs2/ {print $2}' /proc/mounts) +. /lib/functions/boot.sh -dupe() { # - cd $1 - echo -n "creating directories... " - { - cd $2 - find . -xdev -type d - echo "./dev ./jffs ./mnt ./proc ./tmp" - # xdev skips mounted directories - cd $1 - } | xargs mkdir -p - echo "done" +firstboot_skip_next=false - echo -n "setting up symlinks... " - for file in $(cd $2; find . -xdev -type f;); do - case "$file" in - ./rom/note) ;; #nothing - ./etc/config*|\ - ./usr/lib/opkg/info/*) cp -af $2/$file $file;; - *) ln -sf /rom/${file#./*} $file;; - esac - done - for file in $(cd $2; find . -xdev -type l;); do - cp -af $2/${file#./*} $file - done - echo "done" -} - -pivot() { # - mount -o move /proc $1/proc && \ - pivot_root $1 $1$2 && { - mount -o move $2/dev /dev - mount -o move $2/tmp /tmp - mount -o move $2/sys /sys 2>&- - mount -o move $2/jffs /jffs 2>&- - return 0 - } -} - -fopivot() { # - root=$1 - { - if grep -q mini_fo /proc/filesystems; then - mount -t mini_fo -o base=/,sto=$1 "mini_fo:$1" /mnt 2>&- && root=/mnt - else - mount --bind / /mnt - mount --bind -o union "$1" /mnt && root=/mnt - fi - } || { - [ "$3" = "1" ] && { - mount | grep "on $1 type" 2>&- 1>&- || mount -o bind $1 $1 - dupe $1 $rom - } - } - pivot $root $2 -} - -ramoverlay() { - mkdir -p /tmp/root - mount -t tmpfs root /tmp/root - fopivot /tmp/root /rom 1 -} +for fb_source_file in /lib/firstboot/*; do + . $fb_source_file +done # invoked as an executable -[ "${0##*/}" = "firstboot" ] && { - - [ -z "$mtdpart" ] && { - echo "MTD partition not found." - exit 1 - } - - [ -z "$rom" ] && { - echo "You do not have a squashfs partition; aborting" - echo "(firstboot cannot be run on jffs2 based firmwares)" - exit 1 - } - - [ "$1" = "switch2jffs" ] && { - if grep -q mini_fo /proc/filesystems; then - mount "$mtdpart" /rom/jffs -t jffs2 || exit - - # try to avoid fs changing while copying - mount -o remount,ro none / 2>&- - - # copy ramoverlay to jffs2 - echo -n "copying files ... " - cp -a /tmp/root/* /rom/jffs 2>&- - echo "done" - - # switch back to squashfs (temporarily) - # and park the ramdisk ontop of /tmp/root - pivot /rom /mnt - mount -o move /mnt /tmp/root - - # /jffs is the overlay - # /rom is the readonly - fopivot /jffs /rom - - # try to get rid of /tmp/root - # this will almost always fail - umount /tmp/root 2>&- - else - # switch back to squashfs temporarily - pivot /rom /mnt - - # get rid of the old overlay - umount -l /mnt - - # another umount to get rid of the bind from /tmp/root - umount -l /mnt - - # initialize jffs2 - mount "$mtdpart" /jffs -t jffs2 || exit - - # workaround to ensure that union can attach properly - sync - ls /jffs >/dev/null - - # switch to the new (empty) jffs2 - fopivot /jffs /rom 1 - - # copy ramoverlay to jffs2, must be done after switching - # to the new rootfs to avoid creating opaque directories - echo -n "copying files ... " - cp -a /tmp/root/* / >/dev/null 2>&1 - sync - echo "done" - - umount -l /jffs - umount -l /tmp/root - fi - - exit 0 - } - - # script run manually - [ \! -z "$jffs" ] && { - echo "firstboot has already been run" - echo "jffs2 partition is mounted, only resetting files" - grep mini_fo /proc/filesystems >&- - [ $? != 0 ] && { - dupe $jffs $rom - exit 0 - } || { - rm -rf $jffs/* 2>&- - mount -o remount $jffs / 2>&- - exit 0 - } - } - +if [ "${0##*/}" = "firstboot" ]; then + if [ "$1" = "switch2jffs" ]; then + boot_run_hook switch2jffs + elif [ -z "$jffs" ]; then + reset_has_fo=true + echo "firstboot has already been run" + echo "jffs2 partition is mounted, only resetting files" + boot_run_hook jffs2reset + else mtd erase "$partname" mount "$mtdpart" /jffs -t jffs2 fopivot /jffs /rom 1 -} + fi +else + set_mtd_part + set_rom_part + set_jffs_part +fi + diff --git a/package/base-files/files/sbin/mount_root b/package/base-files/files/sbin/mount_root index 86d4ef95fb..033dfda29f 100755 --- a/package/base-files/files/sbin/mount_root +++ b/package/base-files/files/sbin/mount_root @@ -1,25 +1,26 @@ #!/bin/sh -# Copyright (C) 2006 OpenWrt.org -. /etc/functions.sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications -jffs2_ready () { - mtdpart="$(find_mtd_part rootfs_data)" - magic=$(hexdump $mtdpart -n 4 -e '4/1 "%02x"') - [ "$magic" != "deadc0de" ] -} +# Initialize hook variables et by pulling in from preinit + +preinit_essential_hook= +preinit_main_hook= +failsafe_hook= +initramfs_hook= +preinit_mount_root= + +. /lib/functions/boot.sh -grep rootfs_data /proc/mtd >/dev/null 2>/dev/null && { - . /sbin/firstboot - mtd unlock rootfs_data - jffs2_ready && { - echo "switching to jffs2" - mount "$(find_mtd_part rootfs_data)" /jffs -t jffs2 && \ - fopivot /jffs /rom - } || { - echo "jffs2 not ready yet; using ramdisk" - ramoverlay - } -} || { - mtd unlock rootfs - mount -o remount,rw /dev/root / +for pi_source_file in /lib/preinit/*; do + . $pi_source_file +done + +# Override function that doesn't apply to use of mount_root as a command rather +# than as part of preinit + +preinit_echo() { + echo "$@" } + +boot_run_hook mount_root diff --git a/package/base-files/image-config.in b/package/base-files/image-config.in new file mode 100644 index 0000000000..074d67c759 --- /dev/null +++ b/package/base-files/image-config.in @@ -0,0 +1,132 @@ +# Copyright (C) 2006 OpenWrt.org +# Copyright (C) 2010 Vertical Communications +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +menuconfig PREINITOPT + bool "Preinit configuration options" if IMAGEOPT + default n + help + These options are used to control the environment used to initialize + the system before running init (which typically mean /sbin/init which + switches to multiuser mode). + +config TARGET_PREINIT_SUPPRESS_STDERR + bool "Suppress stderr messages during preinit" if PREINITOPT + default y + help + Sends stderr to null during preinit. This is the default behaviour + in previous versions of OpenWRT. This also prevents init process + itself from displaying stderr, however processes launched by init + in multiuser through inittab will use the current terminal (e.g. + the ash shell launched by inittab will display stderr). That's + the same behaviour as seen in previous version of OpenWRT. + +config TARGET_PREINIT_TIMEOUT + int + prompt "Failsafe wait timeout" if PREINITOPT + default 2 + help + How long to wait for failsafe mode to be entered before + continuing with a regular boot if failsafe not selected. + +config TARGET_PREINIT_SHOW_NETMSG + bool + prompt "Show all preinit network messages" if PREINITOPT + default n + help + Show preinit all network messages (via netmsg broadcast), not only + the message indicating to press reset to enter failsafe. Note that + if the architecture doesn't define an interface, and there is no + 'Preinit network interface' defined, then no messages will be + emitted, even if this is set. + +config TARGET_PREINIT_SUPPRESS_FAILSAFE_NETMSG + bool + prompt "Suppress network message indicating failsafe" if PREINITOPT + default n + help + If "Show all preinit network messages" above is not set, then + setting this option suppresses the only message that would be + emitted otherwise, name the network message to enter failsafe + (via netmsg). + +config TARGET_PREINIT_IFNAME + string + prompt "Preinit network interface" if PREINITOPT + default "" + help + Interface for sending preinit messages to network, and any other + default networking in failsafe or preinit. If empty + uses $ifname (if defined in /etc/preinit.arch). + +config TARGET_PREINIT_IP + string + prompt "IP address for preinit network messages" if PREINITOPT + default "192.168.1.1" + help + IP address used to configure interface for preinit network + messages, including failsafe messages + +config TARGET_PREINIT_NETMASK + string + prompt "Netmask for preinit network messages" if PREINITOPT + default "255.255.255.0" + help + Netmask used to configure interface for preinit network + messages, including failsafes messages + +config TARGET_PREINIT_BROADCAST + string + prompt "Broadcast address for preinit network messages" if PREINITOPT + default "192.168.1.255 + help + Broadcast address to which to send preinit network messages, as + as failsafe messages + + +menuconfig INITOPT + bool "Init configuration options" if IMAGEOPT + default n + help + These option choose the command that will run as the 'init' command + (that is which is responsible for controlling the system once preinit + transfers control to it) as well as some options controlling its + behaviour. Normally init is /sbin/init. + + config TARGET_INIT_PATH + string + prompt "PATH for regular boot" if INITOPT + default "/bin:/sbin:/usr/bin:/usr/sbin" + help + Default PATH used during normal operation + + config TARGET_INIT_ENV + string + prompt "Environment variables to set when starting init (start with none)" if INITOPT + default "" + help + Should be a space seperated list of variable assignments. These + variables will be present in the environment. Spaces may not be + present (including through expansion) even in a quoted string + (env doesn't understanding quoting). + + config TARGET_INIT_CMD + string + prompt "Init command" if INITOPT + default "/sbin/init" + help + The executable to run as the init process. Is 'exec'd by + preinit (which is the init that the kernel launches on boot). + + config TARGET_INIT_SUPPRESS_STDERR + bool + prompt "Suppress stderr messages of init" if INITOPT + default y + help + Prevents showing stderr messages for init command if not already + suppressed during preinit. This is the default behaviour in + previous versions of OpenWRT. Removing this does nothing if + stderr is suppressed during preinit (which is the default). diff --git a/scripts/metadata.pl b/scripts/metadata.pl index aa66e53094..37b7d77925 100755 --- a/scripts/metadata.pl +++ b/scripts/metadata.pl @@ -562,20 +562,24 @@ EOF sub gen_package_config() { parse_package_metadata($ARGV[0]) or exit 1; - print "menuconfig UCI_PRECONFIG\n\tbool \"Image configuration\"\n" if %preconfig; + print "menuconfig IMAGEOPT\n\tbool \"Image configuration\"\n\tdefault n\n"; foreach my $preconfig (keys %preconfig) { foreach my $cfg (keys %{$preconfig{$preconfig}}) { my $conf = $preconfig{$preconfig}->{$cfg}->{id}; $conf =~ tr/\.-/__/; print <{$cfg}->{label}" if UCI_PRECONFIG + string "$preconfig{$preconfig}->{$cfg}->{label}" if IMAGEOPT depends PACKAGE_$preconfig default "$preconfig{$preconfig}->{$cfg}->{default}" EOF } } + print "source \"package/*/image-config.in\"\n"; + if (scalar glob "package/feeds/*/*/image-config.in") { + print "source \"package/feeds/*/*/image-config.in\"\n"; + } print_package_features(); print_package_config_category 'Base system'; foreach my $cat (keys %category) { diff --git a/target/linux/adm5120/base-files/etc/preinit.arch b/target/linux/adm5120/base-files/etc/preinit.arch deleted file mode 100755 index a4087db0ec..0000000000 --- a/target/linux/adm5120/base-files/etc/preinit.arch +++ /dev/null @@ -1,16 +0,0 @@ -. /etc/functions.sh - -insmod input-core -insmod input-polldev -insmod gpio_buttons -insmod button-hotplug - -ifname=eth0 - -failsafe_ip - -netmsg 192.168.1.255 "Press reset now, to enter Failsafe!" - -ifconfig "$ifname" 0.0.0.0 down - -sleep 2 diff --git a/target/linux/adm5120/base-files/lib/preinit/05_enable_leds_adm5120 b/target/linux/adm5120/base-files/lib/preinit/05_enable_leds_adm5120 new file mode 100644 index 0000000000..01b2f7ea12 --- /dev/null +++ b/target/linux/adm5120/base-files/lib/preinit/05_enable_leds_adm5120 @@ -0,0 +1,12 @@ +#!/bin/sh + +enable_leds() { + insmod input-core + insmod input-polldev + insmod gpio_buttons + insmod button-hotplug +} + +boot_hook_add preinit_main enable_leds + + diff --git a/target/linux/adm5120/base-files/lib/preinit/05_set_preinit_face_adm5120 b/target/linux/adm5120/base-files/lib/preinit/05_set_preinit_face_adm5120 new file mode 100644 index 0000000000..ac2a7cbb66 --- /dev/null +++ b/target/linux/adm5120/base-files/lib/preinit/05_set_preinit_face_adm5120 @@ -0,0 +1,9 @@ +#!/bin/sh + +set_preinit_ifname() { + ifname=eth0 +} + +boot_hook_add preinit_main set_preinit_ifname + + diff --git a/target/linux/ar71xx/base-files/etc/preinit.arch b/target/linux/ar71xx/base-files/etc/preinit.arch deleted file mode 100644 index f770ca3714..0000000000 --- a/target/linux/ar71xx/base-files/etc/preinit.arch +++ /dev/null @@ -1,56 +0,0 @@ -# -# Copyright (C) 2009 OpenWrt.org -# - -. /lib/ar71xx.sh - -fetch_mac_from_mtd() { - local mtd_part=$1 - local lan_env=$2 - local wan_env=$3 - local mtd mac - - mtd=$(grep $mtd_part /proc/mtd | cut -d: -f1) - [ -z $mtd ] && return - - mac=$(grep $lan_env /dev/$mtd | cut -d= -f2) - [ ! -z $mac ] && ifconfig eth0 hw ether $mac 2>/dev/null - - mac=$(grep $wan_env /dev/$mtd | cut -d= -f2) - [ ! -z $mac ] && ifconfig eth1 hw ether $mac 2>/dev/null -} - -preinit_load_modules() { - insmod input-core - insmod input-polldev - insmod gpio_buttons - insmod button-hotplug -} - -preinit_set_mac_address() { - case $(ar71xx_board_name) in - tew-632brp) - fetch_mac_from_mtd config lan_mac wan_mac - ;; - dir-615-c1) - fetch_mac_from_mtd config lan_mac wan_mac - echo 1 > /sys/class/leds/dir-615-c1:green:wancpu/brightness - ;; - wrt160nl) - fetch_mac_from_mtd nvram lan_hwaddr wan_hwaddr - ;; - esac -} - -preinit_set_mac_address -preinit_load_modules - -ifname=eth0 - -failsafe_ip - -netmsg 192.168.1.255 "Press any button now, to enter Failsafe!" - -ifconfig "$ifname" 0.0.0.0 down - -sleep 2 diff --git a/target/linux/ar71xx/base-files/lib/preinit/05_enable_leds_ar71xx b/target/linux/ar71xx/base-files/lib/preinit/05_enable_leds_ar71xx new file mode 100644 index 0000000000..0b130fbf2c --- /dev/null +++ b/target/linux/ar71xx/base-files/lib/preinit/05_enable_leds_ar71xx @@ -0,0 +1,16 @@ +# +# Copyright (C) 2009 OpenWrt.org +# + +. /lib/ar71xx.sh + + +preinit_enable_leds() { + insmod input-core + insmod input-polldev + insmod gpio_buttons + insmod button-hotplug +} + +boot_hook_add preinit_main preinit_enable_leds + diff --git a/target/linux/ar71xx/base-files/lib/preinit/05_set_iface_mac_ar71xx b/target/linux/ar71xx/base-files/lib/preinit/05_set_iface_mac_ar71xx new file mode 100644 index 0000000000..f8bb7b76c6 --- /dev/null +++ b/target/linux/ar71xx/base-files/lib/preinit/05_set_iface_mac_ar71xx @@ -0,0 +1,39 @@ +# +# Copyright (C) 2009 OpenWrt.org +# + +. /lib/ar71xx.sh + +fetch_mac_from_mtd() { + local mtd_part=$1 + local lan_env=$2 + local wan_env=$3 + local mtd mac + + mtd=$(grep $mtd_part /proc/mtd | cut -d: -f1) + [ -z $mtd ] && return + + mac=$(grep $lan_env /dev/$mtd | cut -d= -f2) + [ ! -z $mac ] && ifconfig eth0 hw ether $mac 2>/dev/null + + mac=$(grep $wan_env /dev/$mtd | cut -d= -f2) + [ ! -z $mac ] && ifconfig eth1 hw ether $mac 2>/dev/null +} + +preinit_set_mac_address() { + case $(ar71xx_board_name) in + tew-632brp) + fetch_mac_from_mtd config lan_mac wan_mac + ;; + dir-615-c1) + fetch_mac_from_mtd config lan_mac wan_mac + echo 1 > /sys/class/leds/dir-615-c1:green:wancpu/brightness + ;; + wrt160nl) + fetch_mac_from_mtd nvram lan_hwaddr wan_hwaddr + ;; + esac +} + +boot_hook_add preinit_main preinit_set_mac_address + diff --git a/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx b/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx new file mode 100644 index 0000000000..8611dce816 --- /dev/null +++ b/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx @@ -0,0 +1,16 @@ +#!/bin/sh + +# +# Copyright (C) 2009 OpenWrt.org +# + +. /lib/ar71xx.sh + +set_preinit_iface() { + ifname=eth0 +} + +boot_hook_add preinit_main set_preinit_iface + + + diff --git a/target/linux/atheros/base-files/etc/preinit.arch b/target/linux/atheros/base-files/etc/preinit.arch deleted file mode 100755 index bdfe67ba56..0000000000 --- a/target/linux/atheros/base-files/etc/preinit.arch +++ /dev/null @@ -1,21 +0,0 @@ -# reset button only supported on ar5315+ at the moment -grep 'Atheros AR231[567]' /proc/cpuinfo > /dev/null && { - if [ -e "/sys/bus/mdio_bus/drivers/Infineon ADM6996/0:00" -o \ - -e "/sys/bus/mdio_bus/drivers/Marvell 88E6060/0:10" ]; then - vconfig set_name_type DEV_PLUS_VID_NO_PAD - ifconfig eth0 up - vconfig add eth0 1 - ifname=eth0.1 - else - ifname=eth0 - fi - failsafe_ip - netmsg 192.168.1.255 "Press reset now, to enter Failsafe!" - sleep 2 - if [ -z "$FAILSAFE" -a \ - \( -e "/sys/bus/mdio_bus/drivers/Infineon ADM6996/0:00" -o \ - -e "/sys/bus/mdio_bus/drivers/Marvell 88E6060/0:10" \) ]; then - vconfig rem eth0.1 - ifconfig eth0 down - fi -} diff --git a/target/linux/atheros/base-files/lib/preinit/15_preinit_iface_atheros b/target/linux/atheros/base-files/lib/preinit/15_preinit_iface_atheros new file mode 100644 index 0000000000..c15b4de1ee --- /dev/null +++ b/target/linux/atheros/base-files/lib/preinit/15_preinit_iface_atheros @@ -0,0 +1,32 @@ +#!/bin/sh + +# reset button only supported on ar5315+ at the moment +preinit_ip() { + if [ -z "$pi_ifname" ]; then + grep 'Atheros AR231[567]' /proc/cpuinfo > /dev/null && { + if [ -e "/sys/bus/mdio_bus/drivers/Infineon ADM6996/0:00" -o \ + -e "/sys/bus/mdio_bus/drivers/Marvell 88E6060/0:10" ]; then + vconfig set_name_type DEV_PLUS_VID_NO_PAD + ifconfig eth0 up + vconfig add eth0 1 + ifname=eth0.1 + else + ifname=eth0 + fi + pi_ifname=$ifname + } + [ -n "$pi_ifname" ] && grep "$pi_ifname" /proc/net/dev >/dev/null && { + ifconfig $pi_ifname $pi_ip netmask $pi_netmask broadcast $pi_broadcast up + } +} + + +# reset button only supported on ar5315+ at the moment + +preinit_ip_deconfig() { + if [ -e "/sys/bus/mdio_bus/drivers/Infineon ADM6996/0:00" -o \ + -e "/sys/bus/mdio_bus/drivers/Marvell 88E6060/0:10" ]; then + vconfig rem eth0.1 2>/dev/null + ifconfig $pi_ifname down + fi +} diff --git a/target/linux/brcm-2.4/base-files/etc/preinit.arch b/target/linux/brcm-2.4/base-files/etc/preinit.arch deleted file mode 100755 index e62360e44c..0000000000 --- a/target/linux/brcm-2.4/base-files/etc/preinit.arch +++ /dev/null @@ -1,71 +0,0 @@ -. /etc/functions.sh - -failsafe() { - lock /tmp/.failsafe - failsafe_ip - - echo "0 1 2 3 4 ${cpu_port:-5u*}" > /proc/switch/eth0/vlan/0/ports - - set_state failsafe - [ -x "/usr/sbin/nvram" ] && { - [ "$(nvram get boot_wait)" != "on" ] && { - nvram set boot_wait=on - nvram commit - } - } - - netmsg 192.168.1.255 "Entering Failsafe!" - telnetd -l /bin/login.sh <> /dev/null 2>&1 - - ash --login -} - -mount none /proc -t proc - -insmod diag -set_state preinit -echo '/sbin/hotplug.failsafe' > /proc/sys/kernel/hotplug - -ifname=eth0 - -# hardware specific overrides -case "$(cat /proc/diag/model)" in - "Linksys WAP54G V1") ifname=eth1;; - "ASUS WL-HDD") ifname=eth1;; - "ASUS WL-300g") ifname=eth1;; - "ASUS (unknown, BCM4702)") ifname=eth1;; - "Sitecom WL-105b") ifname=eth1;; -esac - -check_module () { - module="$1"; shift; params="$*" - - insmod "$module" "$params" - sleep 1 - grep "^$module" /proc/modules - return $? -} - -check_module tg3 -failsafe_ip - -insmod switch-core -check_module switch-robo || check_module switch-adm || { - check_module bcm57xx activate_gpio=0x4 && cpu_port="8u*" -} || rmmod switch-core - -[ -d /proc/switch/eth0 ] && { - echo 1 > /proc/switch/eth0/reset - - # this would be easier if we blasted the message across all ports - # but we don't want packets leaking across interfaces - for port in $(seq 0 4); do { - echo "$port ${cpu_port:-5u*}" > /proc/switch/eth0/vlan/0/ports - netmsg 192.168.1.255 "Press reset now, to enter Failsafe!" - }; done -} || netmsg 192.168.1.255 "Press reset now, to enter Failsafe!" - -ifconfig $ifname 0.0.0.0 down - -sleep 2 - diff --git a/target/linux/brcm-2.4/base-files/lib/preinit/03_init_hotplug_failsafe_brcm-2.4 b/target/linux/brcm-2.4/base-files/lib/preinit/03_init_hotplug_failsafe_brcm-2.4 new file mode 100644 index 0000000000..b0f4a4efa9 --- /dev/null +++ b/target/linux/brcm-2.4/base-files/lib/preinit/03_init_hotplug_failsafe_brcm-2.4 @@ -0,0 +1,9 @@ +#!/bin/sh + +init_hotplug_failsafe() { + echo '/sbin/hotplug.failsafe' > /proc/sys/kernel/hotplug +} + +boot_hook_add preinit_main init_hotplug_failsafe + + diff --git a/target/linux/brcm-2.4/base-files/lib/preinit/05_init_interfaces_brcm-2.4 b/target/linux/brcm-2.4/base-files/lib/preinit/05_init_interfaces_brcm-2.4 new file mode 100644 index 0000000000..81cf1f1380 --- /dev/null +++ b/target/linux/brcm-2.4/base-files/lib/preinit/05_init_interfaces_brcm-2.4 @@ -0,0 +1,38 @@ +#!/bin/sh + +set_preinit_iface() { + ifname=eth0 + + insmod diag + + # hardware specific overrides + case "$(cat /proc/diag/model)" in + "Linksys WAP54G V1") ifname=eth1;; + "ASUS WL-HDD") ifname=eth1;; + "ASUS WL-300g") ifname=eth1;; + "ASUS (unknown, BCM4702)") ifname=eth1;; + "Sitecom WL-105b") ifname=eth1;; + esac +} + +check_module () { + module="$1"; shift; params="$*" + + insmod "$module" "$params" + sleep 1 + grep "^$module" /proc/modules + return $? +} + +init_iface() { + check_module tg3 + insmod switch-core + check_module switch-robo || check_module switch-adm || { + check_module bcm57xx activate_gpio=0x4 && cpu_port="8u*" + } || rmmod switch-core +} + +boot_hook_add preinit_main init_iface +boot_hook_add preinit_main set_preinit_iface + + diff --git a/target/linux/brcm-2.4/base-files/lib/preinit/05_set_failsafe_switch_brcm-2.4 b/target/linux/brcm-2.4/base-files/lib/preinit/05_set_failsafe_switch_brcm-2.4 new file mode 100644 index 0000000000..28e62e5b57 --- /dev/null +++ b/target/linux/brcm-2.4/base-files/lib/preinit/05_set_failsafe_switch_brcm-2.4 @@ -0,0 +1,15 @@ +#!/bin/sh + +failsafe_ip() { + [ -d /proc/switch/eth0 ] && [ "$ifname" = "eth0" ] && { + ifconfig eth0 0.0.0.0 down + echo "0 1 2 3 4 ${cpu_port:-5u*}" > /proc/switch/eth0/vlan/0/ports + } + + [ -n "$pi_ifname" ] && grep "$pi_ifname" /proc/net/dev >/dev/null && { + ifconfig $pi_ifname $pi_ip netmask $pi_netmask broadcast $pi_broadcast up + } +} + +boot_hook_add failsafe failsafe_ip + diff --git a/target/linux/brcm-2.4/base-files/lib/preinit/15_mount_proc_brcm-2.4 b/target/linux/brcm-2.4/base-files/lib/preinit/15_mount_proc_brcm-2.4 new file mode 100644 index 0000000000..fd5add16a5 --- /dev/null +++ b/target/linux/brcm-2.4/base-files/lib/preinit/15_mount_proc_brcm-2.4 @@ -0,0 +1,6 @@ +#!/bin/sh + +do_mount_procfs() { + mount none /proc -t proc +} + diff --git a/target/linux/brcm-2.4/base-files/lib/preinit/15_set_preinit_interface_brcm-2.4 b/target/linux/brcm-2.4/base-files/lib/preinit/15_set_preinit_interface_brcm-2.4 new file mode 100644 index 0000000000..5e8dc9f11f --- /dev/null +++ b/target/linux/brcm-2.4/base-files/lib/preinit/15_set_preinit_interface_brcm-2.4 @@ -0,0 +1,38 @@ +. /etc/functions.sh + +port_net_echo() { + [ -n "$pi_ifname" ] && grep "$pi_ifname" /proc/net/dev >/dev/null ] { + if [ "$pi_preinit_net_messages" = "y" ] || [ "$pi_failsafe_net_message" = "true"] && [ "$pi_preinit_no_failsafe_netmsg" != "y" ]; then + netmsg $pi_broadcast "$1" + } + } +} + +preinit_ip_deconfig() { + if [ -z "$pi_ifname" ]; then + ifconfig $ifname 0.0.0.0 down + else + grep "$pi_ifname" /proc/net/dev >/dev/null && { + ifconfig $pi_ifname 0.0.0.0 down + } + fi +} + +preinit_net_echo() { + preinit_ip + + [ -d /proc/switch/eth0 ] && [ "$pi_ifname" = "eth0" ] && { + echo 1 > /proc/switch/eth0/reset + + # this would be easier if we blasted the message across all ports + # but we don't want packets leaking across interfaces + for port in $(seq 0 4); do { + echo "$port ${cpu_port:-5u*}" > /proc/switch/eth0/vlan/0/ports + port_net_echo $1 + }; done + } || port_net_echo $1 + + preinit_ip_deconfig +} + + diff --git a/target/linux/brcm-2.4/base-files/lib/preinit/20_failsafe_set_boot_wait_brcm-2.4 b/target/linux/brcm-2.4/base-files/lib/preinit/20_failsafe_set_boot_wait_brcm-2.4 new file mode 100644 index 0000000000..da721b8484 --- /dev/null +++ b/target/linux/brcm-2.4/base-files/lib/preinit/20_failsafe_set_boot_wait_brcm-2.4 @@ -0,0 +1,14 @@ +#!/bin/sh + +. /etc/functions.sh + +set_boot_wait() { + [ -x "/usr/sbin/nvram" ] && { + [ "$(nvram get boot_wait)" != "on" ] && { + nvram set boot_wait=on + nvram commit + } + } +} + +boot_hook_add failsafe set_boot_wait diff --git a/target/linux/gemini/base-files/etc/preinit.arch b/target/linux/gemini/base-files/etc/preinit.arch deleted file mode 100755 index ecdb41039c..0000000000 --- a/target/linux/gemini/base-files/etc/preinit.arch +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_PARTITION="$(grep "VCTL" /proc/mtd | cut -d: -f1)" -MAC1="$(strings /dev/$CONFIG_PARTITION |grep MAC|cut -d: -f2|cut -c3-14|sed -e 's,\(..\),:\1,g' -e 's,^:,,')" -MAC2="$(strings /dev/$CONFIG_PARTITION |grep MAC|cut -d: -f8|cut -c3-14|sed -e 's,\(..\),:\1,g' -e 's,^:,,')" - -ifconfig eth0 hw ether $MAC1 2>/dev/null -ifconfig eth1 hw ether $MAC2 2>/dev/null diff --git a/target/linux/gemini/base-files/lib/preinit/05_set_ether_mac_gemini b/target/linux/gemini/base-files/lib/preinit/05_set_ether_mac_gemini new file mode 100644 index 0000000000..499608120e --- /dev/null +++ b/target/linux/gemini/base-files/lib/preinit/05_set_ether_mac_gemini @@ -0,0 +1,13 @@ +#!/bin/sh + +set_ether_mac() { + CONFIG_PARTITION="$(grep "VCTL" /proc/mtd | cut -d: -f1)" + MAC1="$(strings /dev/$CONFIG_PARTITION |grep MAC|cut -d: -f2|cut -c3-14|sed -e 's,\(..\),:\1,g' -e 's,^:,,')" + MAC2="$(strings /dev/$CONFIG_PARTITION |grep MAC|cut -d: -f8|cut -c3-14|sed -e 's,\(..\),:\1,g' -e 's,^:,,')" + + ifconfig eth0 hw ether $MAC1 2>/dev/null + ifconfig eth1 hw ether $MAC2 2>/dev/null +} + +boot_hook_add preinit_main set_ether_mac + diff --git a/target/linux/ifxmips/nfs/base-files/etc/preinit.arch b/target/linux/ifxmips/nfs/base-files/etc/preinit.arch deleted file mode 100755 index 7ee8e3e346..0000000000 --- a/target/linux/ifxmips/nfs/base-files/etc/preinit.arch +++ /dev/null @@ -1,5 +0,0 @@ - -grep "/dev/root" /proc/mounts |grep -q nfs && { - echo "- init nfs -" - exec /sbin/init -} diff --git a/target/linux/ifxmips/nfs/base-files/lib/preinit/01_init_nfs_ifxmips b/target/linux/ifxmips/nfs/base-files/lib/preinit/01_init_nfs_ifxmips new file mode 100644 index 0000000000..e2cf52dc4e --- /dev/null +++ b/target/linux/ifxmips/nfs/base-files/lib/preinit/01_init_nfs_ifxmips @@ -0,0 +1,12 @@ +#!/bin/sh + + +init_nfs() { + grep "/dev/root" /proc/mounts |grep -q nfs && { + echo "- init nfs -" + exec /sbin/init + } +} + +boot_hook_add preinit_main init_nfs + diff --git a/target/linux/ixp4xx/base-files/etc/preinit.arch b/target/linux/ixp4xx/base-files/etc/preinit.arch deleted file mode 100755 index f52133d841..0000000000 --- a/target/linux/ixp4xx/base-files/etc/preinit.arch +++ /dev/null @@ -1,15 +0,0 @@ -RB_CONFIG="$(grep "RedBoot config" /proc/mtd | cut -d: -f1)" - -for npe in eth0 eth1 eth2 -do - if [ "$(ifconfig $npe 2>/dev/null | grep -c 00:00:00:00:00:00)" == "1" ]; then - ifconfig $npe hw ether $(fconfig -s -r -d /dev/$RB_CONFIG -n npe_"$npe"_esa) - fi -done - -# Some developers should be shot on sight at Zcom/Netgear -# -- Fixup for the WG302v1, need someone with a WAG302v1 to fix that, too - -if [ "$(ifconfig eth0 2>/dev/null | grep -c 00:00:00:00:00:00)" == "1" ]; then - ifconfig eth0 hw ether $(fconfig -s -r -d /dev/$RB_CONFIG -n zcom_npe_esa) -fi diff --git a/target/linux/ixp4xx/base-files/lib/preinit/05_set_ether_mac_ixp4xx b/target/linux/ixp4xx/base-files/lib/preinit/05_set_ether_mac_ixp4xx new file mode 100644 index 0000000000..e19e0ec250 --- /dev/null +++ b/target/linux/ixp4xx/base-files/lib/preinit/05_set_ether_mac_ixp4xx @@ -0,0 +1,23 @@ +#!/bin/sh + +set_ether_mac() { + + RB_CONFIG="$(grep "RedBoot config" /proc/mtd | cut -d: -f1)" + + for npe in eth0 eth1 eth2 + do + if [ "$(ifconfig $npe 2>/dev/null | grep -c 00:00:00:00:00:00)" == "1" ]; then + ifconfig $npe hw ether $(fconfig -s -r -d /dev/$RB_CONFIG -n npe_"$npe"_esa) + fi + done + + # Some developers should be shot on sight at Zcom/Netgear + # -- Fixup for the WG302v1, need someone with a WAG302v1 to fix that, too + + if [ "$(ifconfig eth0 2>/dev/null | grep -c 00:00:00:00:00:00)" == "1" ]; then + ifconfig eth0 hw ether $(fconfig -s -r -d /dev/$RB_CONFIG -n zcom_npe_esa) + fi +} + +boot_hook_add preinit_main set_ether_mac + diff --git a/target/linux/pxcab/base-files/etc/preinit.arch b/target/linux/pxcab/base-files/etc/preinit.arch deleted file mode 100644 index 00db8b4aca..0000000000 --- a/target/linux/pxcab/base-files/etc/preinit.arch +++ /dev/null @@ -1,2 +0,0 @@ -mount -t proc none /proc -grep 'failsafe=' /proc/cmdline > /dev/null && export FAILSAFE=true diff --git a/target/linux/pxcab/base-files/lib/preinit/15_essential_fs_pxcab b/target/linux/pxcab/base-files/lib/preinit/15_essential_fs_pxcab new file mode 100644 index 0000000000..2c607e2608 --- /dev/null +++ b/target/linux/pxcab/base-files/lib/preinit/15_essential_fs_pxcab @@ -0,0 +1,8 @@ +#!/bin/sh + +#!/bin/sh + +do_mount_procfs() { + mount -t proc none /proc +} + diff --git a/target/linux/pxcab/base-files/lib/preinit/45_failsafe_pxcab b/target/linux/pxcab/base-files/lib/preinit/45_failsafe_pxcab new file mode 100644 index 0000000000..6e5636a8cb --- /dev/null +++ b/target/linux/pxcab/base-files/lib/preinit/45_failsafe_pxcab @@ -0,0 +1,14 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +failsafe_wait() { + FAILSAFE= + grep 'failsafe=' /proc/cmdline > /dev/null && FAILSAFE=true && export FAILSAFE + if [ "$FAILSAFE" != "true" ]; then + preinit_net_echo "Please press button now to enter failsafe" + echo -n "Press CTRL-C or " + fs_wait_for_key f 'to enter failsafe mode' $fs_failsafe_wait_timeout && FAILSAFE=true && export FAILSAFE + fi +} + diff --git a/target/linux/rdc/base-files/etc/preinit.arch b/target/linux/rdc/base-files/etc/preinit.arch deleted file mode 100644 index fd456f8b23..0000000000 --- a/target/linux/rdc/base-files/etc/preinit.arch +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) 2009 OpenWrt.org - -. /etc/functions.sh - -insmod r6040 - -kernel=$(grep magic /proc/mtd | awk -F: '{print $1}') -[ -n $kernel ] && hdr=$(dd if=/dev/$kernel count=4 bs=1 2> /dev/null) -[ "$hdr" = "CSYS" ] && config=$(find_mtd_part config) -if [ -n "$config" ]; then - mac0=$(hexdump -n 6 -e '6/1 ":%X"' -s 24583 $config | cut -c2-) - [ "$mac0" = "FF:FF:FF:FF:FF:FF" -o "$mac0" = "0:0:0:0:0:0" ] && unset mac0 - mac1=$(hexdump -n 6 -e '6/1 ":%X"' -s 24589 $config | cut -c2-) - [ "$mac1" = "FF:FF:FF:FF:FF:FF" -o "$mac0" = "0:0:0:0:0:0" ] && unset mac1 -fi -if [ -n $mac0 ]; then - logger -t kernel -p user.info "r6040: Setting MAC for eth0 to $mac0" - ifconfig eth0 hw ether $mac0 -fi -if [ -n $mac1 ]; then - logger -t kernel -p user.info "r6040: Setting MAC for eth1 to $mac1" - ifconfig eth1 hw ether $mac1 -fi diff --git a/target/linux/rdc/base-files/lib/preinit/05_set_ether_mac_rdc b/target/linux/rdc/base-files/lib/preinit/05_set_ether_mac_rdc new file mode 100644 index 0000000000..43823c48ea --- /dev/null +++ b/target/linux/rdc/base-files/lib/preinit/05_set_ether_mac_rdc @@ -0,0 +1,32 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org + +. /etc/boot.sh + +r6040_module() { + insmod r6040 +} + +set_ether_mac() { + kernel=$(grep magic /proc/mtd | awk -F: '{print $1}') + [ -n $kernel ] && hdr=$(dd if=/dev/$kernel count=4 bs=1 2> /dev/null) + [ "$hdr" = "CSYS" ] && config=$(find_mtd_part config) + if [ -n "$config" ]; then + mac0=$(hexdump -n 6 -e '6/1 ":%X"' -s 24583 $config | cut -c2-) + [ "$mac0" = "FF:FF:FF:FF:FF:FF" -o "$mac0" = "0:0:0:0:0:0" ] && unset mac0 + mac1=$(hexdump -n 6 -e '6/1 ":%X"' -s 24589 $config | cut -c2-) + [ "$mac1" = "FF:FF:FF:FF:FF:FF" -o "$mac0" = "0:0:0:0:0:0" ] && unset mac1 + fi + if [ -n $mac0 ]; then + logger -t kernel -p user.info "r6040: Setting MAC for eth0 to $mac0" + ifconfig eth0 hw ether $mac0 + fi + if [ -n $mac1 ]; then + logger -t kernel -p user.info "r6040: Setting MAC for eth1 to $mac1" + ifconfig eth1 hw ether $mac1 + fi +} + +boot_hook_add preinit_main r6040_module +boot_hook_add preinit_main set_ether_mac + diff --git a/target/linux/x86/base-files/etc/preinit.arch b/target/linux/x86/base-files/etc/preinit.arch deleted file mode 100644 index 00db8b4aca..0000000000 --- a/target/linux/x86/base-files/etc/preinit.arch +++ /dev/null @@ -1,2 +0,0 @@ -mount -t proc none /proc -grep 'failsafe=' /proc/cmdline > /dev/null && export FAILSAFE=true diff --git a/target/linux/x86/base-files/lib/preinit/15_essential_fs_x86 b/target/linux/x86/base-files/lib/preinit/15_essential_fs_x86 new file mode 100644 index 0000000000..ba22849d1e --- /dev/null +++ b/target/linux/x86/base-files/lib/preinit/15_essential_fs_x86 @@ -0,0 +1,8 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +do_mount_procfs() { + mount -t proc none /proc +} + diff --git a/target/linux/x86/base-files/lib/preinit/45_failsafe_x86 b/target/linux/x86/base-files/lib/preinit/45_failsafe_x86 new file mode 100644 index 0000000000..6e5636a8cb --- /dev/null +++ b/target/linux/x86/base-files/lib/preinit/45_failsafe_x86 @@ -0,0 +1,14 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +failsafe_wait() { + FAILSAFE= + grep 'failsafe=' /proc/cmdline > /dev/null && FAILSAFE=true && export FAILSAFE + if [ "$FAILSAFE" != "true" ]; then + preinit_net_echo "Please press button now to enter failsafe" + echo -n "Press CTRL-C or " + fs_wait_for_key f 'to enter failsafe mode' $fs_failsafe_wait_timeout && FAILSAFE=true && export FAILSAFE + fi +} + diff --git a/target/linux/x86/olpc/base-files/etc/preinit.arch b/target/linux/x86/olpc/base-files/etc/preinit.arch deleted file mode 100644 index f29f0d448b..0000000000 --- a/target/linux/x86/olpc/base-files/etc/preinit.arch +++ /dev/null @@ -1,2 +0,0 @@ -mount -t proc none /proc -grep 'failsafe=' /proc/cmdline && export FAILSAFE=true diff --git a/target/linux/x86/olpc/base-files/lib/preinit/15_essential_fs_x86 b/target/linux/x86/olpc/base-files/lib/preinit/15_essential_fs_x86 new file mode 100644 index 0000000000..be342433d2 --- /dev/null +++ b/target/linux/x86/olpc/base-files/lib/preinit/15_essential_fs_x86 @@ -0,0 +1,9 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +do_mount_procfs() { + mount -t proc none /proc +} + + diff --git a/target/linux/x86/olpc/base-files/lib/preinit/45_failsafe_x86 b/target/linux/x86/olpc/base-files/lib/preinit/45_failsafe_x86 new file mode 100644 index 0000000000..6e5636a8cb --- /dev/null +++ b/target/linux/x86/olpc/base-files/lib/preinit/45_failsafe_x86 @@ -0,0 +1,14 @@ +#!/bin/sh +# Copyright (C) 2006-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +failsafe_wait() { + FAILSAFE= + grep 'failsafe=' /proc/cmdline > /dev/null && FAILSAFE=true && export FAILSAFE + if [ "$FAILSAFE" != "true" ]; then + preinit_net_echo "Please press button now to enter failsafe" + echo -n "Press CTRL-C or " + fs_wait_for_key f 'to enter failsafe mode' $fs_failsafe_wait_timeout && FAILSAFE=true && export FAILSAFE + fi +} +