1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-07-02 19:40:46 +03:00

add preinit modularization work by Daniel Dickinson (cshore)

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19331 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
nbd 2010-01-25 17:11:17 +00:00
parent 99c311e86c
commit a9929695c6
79 changed files with 1449 additions and 438 deletions

View File

@ -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 \

View File

@ -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
}
preinit_essential_hook=
preinit_main_hook=
failsafe_hook=
initramfs_hook=
preinit_mount_root=
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
}
pi_ifname=
pi_ip=192.168.1.1
pi_broadcast=192.168.1.255
pi_netmask=255.255.255.0
mount proc /proc -t proc
mount sysfs /sys -t sysfs
fs_failsafe_ifname=
fs_failsafe_ip=192.168.1.1
fs_failsafe_broadcast=192.168.1.255
fs_failsafe_netmask=255.255.255.0
size=$(awk '/MemTotal:/ {l=5242880;mt=($2*1024);print((s=mt/2)<l)&&(mt>l)?mt-l:s}' /proc/meminfo)
mount tmpfs /tmp -t tmpfs -o size=$size,nosuid,nodev,mode=1777
fs_failsafe_wait_timeout=2
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
pi_suppress_stderr="y"
pi_init_suppress_stderr="y"
pi_init_path="/bin:/sbin:/usr/bin:/usr/sbin"
pi_init_cmd="/sbin/init"
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=
. /lib/functions/boot.sh
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
[ -d /dev/pts ] || mkdir -p /dev/pts
[ -d /dev/shm ] || mkdir -p /dev/shm
mount devpts /dev/pts -t devpts
for pi_source_file in /lib/preinit/*; do
. $pi_source_file
done
# 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
}
boot_run_hook preinit_essential
exec <$M0 >$M1 2>&0
pi_mount_skip_next=false
pi_jffs2_mount_success=false
pi_failsafe_net_message=false
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_main
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
}
echo "- init -"
exec /sbin/init
fi

View File

@ -0,0 +1,10 @@
#!/bin/sh
check_skip() {
if [ "$firsboot_skip_next" = "true" ]; then
return 0
else
return 1
fi
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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() { # <new_root> <old_root>
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() { # <new_root> <old_root>
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() { # <rw_root> <ro_root> <dupe?>
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
}

View File

@ -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
}

View File

@ -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

View File

@ -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)?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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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<ENTER> $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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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() { # <new_root> <old_root>
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() { # <new_root> <old_root>
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() { # <rw_root> <ro_root> <dupe?>
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

View File

@ -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
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 "$@"
}
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 /
}
boot_run_hook mount_root

View File

@ -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).

View File

@ -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 <<EOF
config UCI_PRECONFIG_$conf
string "$preconfig{$preconfig}->{$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) {

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,9 @@
#!/bin/sh
set_preinit_ifname() {
ifname=eth0
}
boot_hook_add preinit_main set_preinit_ifname

View File

@ -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

View File

@ -20,13 +20,6 @@ fetch_mac_from_mtd() {
[ ! -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)
@ -42,15 +35,5 @@ preinit_set_mac_address() {
esac
}
preinit_set_mac_address
preinit_load_modules
boot_hook_add preinit_main preinit_set_mac_address
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

View File

@ -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

View File

@ -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
}

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,6 @@
#!/bin/sh
do_mount_procfs() {
mount none /proc -t proc
}

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,5 +0,0 @@
grep "/dev/root" /proc/mounts |grep -q nfs && {
echo "- init nfs -"
exec /sbin/init
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,2 +0,0 @@
mount -t proc none /proc
grep 'failsafe=' /proc/cmdline > /dev/null && export FAILSAFE=true

View File

@ -0,0 +1,8 @@
#!/bin/sh
#!/bin/sh
do_mount_procfs() {
mount -t proc none /proc
}

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -1,2 +0,0 @@
mount -t proc none /proc
grep 'failsafe=' /proc/cmdline > /dev/null && export FAILSAFE=true

View File

@ -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
}

View File

@ -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
}

View File

@ -1,2 +0,0 @@
mount -t proc none /proc
grep 'failsafe=' /proc/cmdline && export FAILSAFE=true

View File

@ -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
}

View File

@ -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
}