Hi, For the firmware and settings restore via failsafe mode that I have posted before, we have discovered that a slight modification is needed. I was always using IP addresses so I didn't notice until doing recent tests that the DNS wasn't being resolved. The attached patches have the corrected version of the preinit and failsafe provider restore patches.
Regards, Daniel -- And that's my crabbing done for the day. Got it out of the way early, now I have the rest of the afternoon to sniff fragrant tea-roses or strangle cute bunnies or something. -- Michael Devore GnuPG Key Fingerprint 86 F5 81 A5 D4 2E 1F 1C http://gnupg.org The C Shore (Daniel Dickinson's Website) http://cshore.is-a-geek.com
Index: scripts/metadata.pl =================================================================== --- scripts/metadata.pl (revision 17538) +++ scripts/metadata.pl (working copy) @@ -535,20 +535,24 @@ 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_config_category 'Base system'; foreach my $cat (keys %category) { print_package_config_category $cat; Index: package/base-files/files/etc/preinit.d/run.d/failsafe_80_netlogin =================================================================== --- package/base-files/files/etc/preinit.d/run.d/failsafe_80_netlogin (revision 0) +++ package/base-files/files/etc/preinit.d/run.d/failsafe_80_netlogin (revision 0) @@ -0,0 +1,8 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org + +# Allow network logins in failsafe mode + +failsafe_80_netlogin () { + telnetd -l /bin/login.sh <> /dev/null 2>&1 +} \ No newline at end of file Index: package/base-files/files/etc/preinit.d/run.d/preinit_base_30_failsafe_entry =================================================================== --- package/base-files/files/etc/preinit.d/run.d/preinit_base_30_failsafe_entry (revision 0) +++ package/base-files/files/etc/preinit.d/run.d/preinit_base_30_failsafe_entry (revision 0) @@ -0,0 +1,30 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org + +# determine if failsafe mode is desired, and if so, enter it + +preinit_base_30_failsafe_entry () { + FAILSAFE=false + + preinit_ip + preinit_echo "Please reset now to enter Failsafe!" + + fs_wait_for_key "f" "to enter failsafe" $fs_timeout + + if [ "$?" = "1" ]; then + FAILSAFE=true + else + preinit_echo "Continuing with regular boot" + fi + + preinit_ip_deconfig + + export FAILSAFE + + if [ "$FAILSAFE" = "true" ]; then + failsafe + fi + lock -w /tmp/.failsafe + + echo "- regular boot -" +} \ No newline at end of file Index: package/base-files/files/etc/preinit.d/run.d/boot_80_config_restore =================================================================== --- package/base-files/files/etc/preinit.d/run.d/boot_80_config_restore (revision 0) +++ package/base-files/files/etc/preinit.d/run.d/boot_80_config_restore (revision 0) @@ -0,0 +1,15 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org + +# Restore configuration saved during sysupgrade + +boot_80_config_restore () { + [ -f /sysupgrade.tgz ] && { + echo "- config restore -" + cd / + mv sysupgrade.tgz /tmp + tar xzf /tmp/sysupgrade.tgz + rm -f /tmp/sysupgrade.tgz + sync + } +} \ No newline at end of file Index: package/base-files/files/etc/preinit.d/run.d/failsafe_90_session =================================================================== --- package/base-files/files/etc/preinit.d/run.d/failsafe_90_session (revision 0) +++ package/base-files/files/etc/preinit.d/run.d/failsafe_90_session (revision 0) @@ -0,0 +1,8 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org + +# Start failsafe session (default is shell) + +failsafe_90_session () { + ash --login +} Index: package/base-files/files/etc/preinit.d/run.d/boot_20_mount =================================================================== --- package/base-files/files/etc/preinit.d/run.d/boot_20_mount (revision 0) +++ package/base-files/files/etc/preinit.d/run.d/boot_20_mount (revision 0) @@ -0,0 +1,31 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org + +# Mount rootfs filesystem + + +mtd_ready () { + mtdpart="$(find_mtd_part rootfs_data)" + magic=$(hexdump $mtdpart -n 4 -e '4/1 "%02x"') + [ "$magic" != "deadc0de" ] +} + +boot_20_mount () { + echo "- mount -" + grep rootfs_data /proc/mtd >/dev/null 2>/dev/null && { + . /bin/firstboot + mtd unlock rootfs_data + mtd_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 / + } +} + Index: package/base-files/files/etc/preinit.d/run.d/failsafe_20_enter_failsafe_message =================================================================== --- package/base-files/files/etc/preinit.d/run.d/failsafe_20_enter_failsafe_message (revision 0) +++ package/base-files/files/etc/preinit.d/run.d/failsafe_20_enter_failsafe_message (revision 0) @@ -0,0 +1,7 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org + +failsafe_20_enter_failsafe_message () { + failsafe_ip + failsafe_echo "Entering Failsafe!" +} \ No newline at end of file Index: package/base-files/files/etc/preinit.d/run.d/failsafe_10_echo =================================================================== --- package/base-files/files/etc/preinit.d/run.d/failsafe_10_echo (revision 0) +++ package/base-files/files/etc/preinit.d/run.d/failsafe_10_echo (revision 0) @@ -0,0 +1,21 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org + +# commands for emitting messages to network in failsafe mode + +failsafe_ip () { + [ -n "$fs_failsafe_ifname" ] && grep "$fs_failsafe_ifname" /proc/net/dev >/dev/null && { + ifconfig $fs_failsafe_ifname $fs_failsafe_ip netmask $fs_failsafe_netmask broadcast $fs_failsafe_broadcast up + } +} + +failsafe_echo () { + [ -n "$fs_failsafe_ifname" ] && grep "$fs_failsafe_ifname" /proc/net/dev >/dev/null && { + netmsg $fs_failsafe_broadcast "$1" + } +} + +failsafe_10_echo () { + : + # dummy function to satisfy pi_run_scripts +} \ No newline at end of file Index: package/base-files/files/etc/preinit.d/run.d/preinit_base_10_preinit_echo =================================================================== --- package/base-files/files/etc/preinit.d/run.d/preinit_base_10_preinit_echo (revision 0) +++ package/base-files/files/etc/preinit.d/run.d/preinit_base_10_preinit_echo (revision 0) @@ -0,0 +1,27 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org + +# commands for emitting messages to network for preinit + +preinit_ip () { + [ -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 down + } +} + +preinit_echo () { + [ -n "$pi_ifname" ] && grep "$pi_ifname" /proc/net/dev >/dev/null && { + netmsg $pi_broadcast "$1" + } +} + +preinit_base_10_preinit_echo () { + : + # dummy function to satisfy pi_run_scripts +} Index: package/base-files/files/etc/preinit.d/run.d/boot_90_init =================================================================== --- package/base-files/files/etc/preinit.d/run.d/boot_90_init (revision 0) +++ package/base-files/files/etc/preinit.d/run.d/boot_90_init (revision 0) @@ -0,0 +1,13 @@ +#!/bin/sh +# Copyright (C) 2009 OpenWrt.org + +# run init + +boot_90_init () { + echo "- init -" + if [ "$INITSTDERR_SUPPRESS" = "y" ]; then + exec env - PATH=$INITPATH $INITENV $INITCMD 2>&0 + else + exec env - PATH=$INITPATH $INITENV $INITCMD + fi +} \ No newline at end of file Index: package/base-files/files/etc/preinit =================================================================== --- package/base-files/files/etc/preinit (revision 17538) +++ package/base-files/files/etc/preinit (working copy) @@ -3,21 +3,101 @@ 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 +pi_run_scripts() { + # Scripts should contain a function that is the same name as the file + # (which must be a valid function name, e.g. no starting with number) + # The script is source and then this function executed + local pi_script= + local pi_run_funcs= + local pi_run_func= + for pi_script in /etc/preinit.d/run.d/$1*; do + [ -r $pi_script ] && . $pi_script && pi_run_funcs="$pi_run_funcs $(/usr/bin/basename $pi_script)" 2>&1 + done + # We do it this way so that script functions may be overridden + for pi_run_func in $pi_run_funcs; do + $pi_run_func + done } - + 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 + echo "- enter failsafe -" + lock /tmp/.failsafe + pi_run_scripts failsafe_ } + +fs_wait_for_key () { + local TIMEOUT=$3 + local TIMER= + local DOFAILSAFE= + 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 '1' >$KEYPRESS_TRUE; lock -u $KEYPRESS_WAIT ; rm -f $KEYRPESS_WAIT'" INT + trap "echo '1' >$KEYRPESS_TRUE; lock -u $KEYRPESS_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 + DOFAILSAFE="" + { + read -t "$TIMER" DOFAILSAFE + if [ "$DOFAILSAFE" = "$1" ]; then + echo "1" >$KEYPRESS_TRUE + lock -u $KEYPRESS_WAIT + rm -f $KEYPRESS_WAIT + fi + } + done + } + lock -w $KEYPRESS_WAIT + + trap - INT + trap - USR1 + + KEYPRESSED=0 + [ "$(cat $KEYPRESS_TRUE)" = "1" ] && KEYPRESSED=1 + rm -f $KEYPRESS_TRUE + rm -f $KEYPRESS_WAIT + rm -f $KEYPRESS_SEC + + return $KEYPRESSED +} + + mount proc /proc -t proc mount sysfs /sys -t sysfs @@ -28,6 +108,7 @@ mount devfs /dev -t devfs M0=/dev/pty/m0 M1=/dev/pty/m1 + M2=/dev/pty/m1 HOTPLUG=/sbin/hotplug-call elif [ -x /sbin/hotplug2 ]; then @@ -37,6 +118,7 @@ /sbin/hotplug2 --set-worker /lib/hotplug2/worker_fork.so --set-rules-file /etc/hotplug2-init.rules --persistent & M0=/dev/ptmx M1=/dev/ptmx + M2=/dev/ptmx HOTPLUG= elif [ -x /sbin/udevd ]; then @@ -49,6 +131,7 @@ /sbin/udevadm settle M0=/dev/pty/ptmx M1=/dev/pty/ptmx + M2=/dev/pty/ptmx HOTPLUG= fi @@ -62,37 +145,60 @@ 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 + } + +[ -r /etc/preinit.d/pi_base_conf ] && . /etc/preinit.d/pi_base_conf + +if [ "$pi_suppress_stderr" = "y" ]; then + exec <$M0 >$M1 2>&0 +else + exec <$M0 >$M1 2>$M2 +fi -exec <$M0 >$M1 2>&0 +echo "- preinit -" -echo "- preinit -" +fs_failsafe_ifname= +pi_ifname= + 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 -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 -" +pi_ip=192.168.1.1 +pi_broadcast=192.168.1.255 +pi_netmask=255.255.255.0 +fs_failsafe_ip=192.168.1.1 +fs_failsafe_broadcast=192.168.1.255 +fs_failsafe_netmask=255.255.255.0 - exec /sbin/init +if [ -z "$fs_failsafe_ifname" ]; then + fs_failsafe_ifname=$ifname fi + +# We use backslash continuation not braces to avoid scope issues +# for variable assignments +[ -d /etc/preinit.d/conf.d ] && \ + OLDIFS="$IFS" ; \ + IFS=' +' ; \ + for fs_variable in $(cat /etc/preinit.d/conf.d/*); do \ + eval "$fs_variable" ; \ + done + +IFS="$OLDIFS" + +if [ "$IFS" = "" ]; then + unset IFS +fi + +pi_run_scripts preinit_base_ + +if [ -z "$INITRAMFS" ]; then + pi_run_scripts boot_ +fi Index: package/base-files/files/sbin/mount_root =================================================================== --- package/base-files/files/sbin/mount_root (revision 17538) +++ package/base-files/files/sbin/mount_root (working copy) @@ -1,25 +0,0 @@ -#!/bin/sh -# Copyright (C) 2006 OpenWrt.org -. /etc/functions.sh - -jffs2_ready () { - mtdpart="$(find_mtd_part rootfs_data)" - magic=$(hexdump $mtdpart -n 4 -e '4/1 "%02x"') - [ "$magic" != "deadc0de" ] -} - -grep rootfs_data /proc/mtd >/dev/null 2>/dev/null && { - . /bin/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 / -} Index: package/base-files/image-config.in =================================================================== --- package/base-files/image-config.in (revision 0) +++ package/base-files/image-config.in (revision 0) @@ -0,0 +1,115 @@ +# Copyright (C) 2009 OpenWrt.org +# +# 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 + +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 display stderr, but once multiuser is entered, stderr may + be sent to a tty and thus appear (that's the default behaviour). + +config TARGET_PREINIT_TIMEOUT + int + prompt "Failsafe wait timeout" if PREINITOPT + default 5 + help + How long to wait for failsafe mode to be entered before + continuing with a regular boot if failsafe not selected. + +config TARGET_PREINIT_IFNAME + string + prompt "Preinit network message interface" if PREINITOPT + default "" + help + Interface for sending preinit messages to network. 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. + +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 + +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 + +config TARGET_PREINIT_FS_IP + string + prompt "Failsafe IP" if PREINITOPT + default 192.168.1.1 + help + IP address to use for failsafe interface in failsafe mode + +config TARGET_PREINIT_FS_BROADCAST + string + prompt "Failsafe broadcast address" if PREINITOPT + default 192.168.1.255 + help + Broadcast address for log messages in failsafe mode + +config TARGET_PREINIT_FS_NETMASK + string + prompt "Failsafe netmask" if PREINITOPT + default 255.255.255.0 + help + Netmask for failsafe mode + +config TARGET_PREINIT_FS_IFNAME + string + prompt "Failsafe interface" if PREINITOPT + default "" + help + Interface for networking while in failsafe mode. If empty + uses $ifname (if defined in /etc/preinit.arch). + +menuconfig INITOPT + bool "Init configuration options" if IMAGEOPT + default n + + config TARGET_INIT_PATH + string + prompt "PATH for regular boot" if INITOPT + default "/bin:/sbin:/usr/bin:/usr/sbin" + + config TARGET_INIT_ENV + string + prompt "Environment variables to set when starting init (start with none)" if INITOPT + default "" + + config TARGET_INIT_CMD + string + prompt "Init command" if INITOPT + default "/sbin/init" + + 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 (the default). Index: package/base-files/Makefile =================================================================== --- package/base-files/Makefile (revision 17538) +++ package/base-files/Makefile (working copy) @@ -138,6 +138,25 @@ $(call Build/Compile/Default) endef +define ImageConfigOptions + mkdir -p $(1)/etc/preinit.d/conf.d + echo 'pi_suppress_stderr="$(CONFIG_TARGET_PREINIT_SUPPRESS_STDERR)"' >$(1)/etc/preinit.d/pi_base_conf + echo 'fs_timeout=$(if $(CONFIG_TARGET_PREINIT_TIMEOUT),$(CONFIG_TARGET_PREINIT_TIMEOUT),5)' >$(1)/etc/preinit.d/conf.d/00_fs_timeout + echo 'fs_failsafe_ip=$(if $(CONFIG_TARGET_PREINIT_FS_IP),$(CONFIG_TARGET_PREINIT_FS_IP),"192.168.1.1")' >$(1)/etc/preinit.d/conf.d/10_fs_failsafe_net + echo 'fs_failsafe_broadcast=$(if $(CONFIG_TARGET_PREINIT_FS_BROADCAST),$(CONFIG_TARGET_PREINIT_FS_BROADCAST),"192.168.1.255")' >>$(1)/etc/preinit.d/conf.d/10_fs_failsafe_net + echo 'fs_failsafe_netmask=$(if $(CONFIG_TARGET_PREINIT_FS_NETMASK),$(CONFIG_TARGET_PREINIT_FS_NETMASK),"255.255.255.0")' >>$(1)/etc/preinit.d/conf.d/10_fs_failsafe_net + echo 'fs_failsafe_ifname=$(if $(CONFIG_TARGET_PREINIT_FS_IFNAME),$(CONFIG_TARGET_PREINIT_FS_IFNAME),"")' >>$(1)/etc/preinit.d/conf.d/10_fs_failsafe_net + echo 'INITPATH=$(if $(CONFIG_TARGET_INIT_PATH),$(CONFIG_TARGET_INIT_PATH),"/bin:/sbin:/usr/bin:/usr/sbin")' >$(1)/etc/preinit.d/conf.d/90_init_path + echo 'INITENV=$(if $(CONFIG_TARGET_INIT_ENV),$(CONFIG_TARGET_INIT_ENV),"")' >$(1)/etc/preinit.d/conf.d/90_init_env + echo 'INITCMD=$(if $(CONFIG_TARGET_INIT_CMD),$(CONFIG_TARGET_INIT_CMD),"/sbin/init")' >$(1)/etc/preinit.d/conf.d/95_init_cmd + echo 'INITSTDERR_SUPPRESS="$(CONFIG_TARGET_INIT_SUPPRESS_STDERR)"' >>$(1)/etc/preinit.d/conf.d/90_init_env + echo 'pi_ifname=$(if $(CONFIG_TARGET_PREINIT_IFNAME),$(CONFIG_TARGET_PREINIT_IFNAME),"")' >$(1)/etc/preinit.d/conf.d/10_preinit_netmsg + echo 'pi_ip=$(if $(CONFIG_TARGET_PREINIT_IP),$(CONFIG_TARGET_PREINIT_IP),"192.168.1.1")' >>$(1)/etc/preinit.d/conf.d/10_preinit_netmsg + echo 'pi_netmask=$(if $(CONFIG_TARGET_PREINIT_NETMASK),$(CONFIG_TARGET_PREINIT_NETMASK),"255.255.255.0")' >>$(1)/etc/preinit.d/conf.d/10_preinit_netmsg + echo 'pi_broadcast=$(if $(CONFIG_TARGET_PREINIT_BROADCAST),$(CONFIG_TARGET_PREINIT_BROADCAST),"")' >>$(1)/etc/preinit.d/conf.d/10_preinit_netmsg +endef + + define Package/base-files/install $(CP) ./files/* $(1)/ if [ -d $(GENERIC_PLATFORM_DIR)/base-files/. ]; then \ @@ -191,6 +210,7 @@ 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 \
Index: package/base-files/files/lib/upgrade/common.sh =================================================================== --- package/base-files/files/lib/upgrade/common.sh (revision 17550) +++ package/base-files/files/lib/upgrade/common.sh (working copy) @@ -45,7 +45,7 @@ } run_ramfs() { # <command> [...] - install_bin /bin/busybox /bin/ash /bin/sh /bin/mount /bin/umount /sbin/pivot_root /usr/bin/wget /sbin/reboot /bin/sync /bin/dd /bin/grep /bin/cp /bin/mv /bin/tar /usr/bin/md5sum "/usr/bin/[" /bin/vi /bin/ls /bin/cat /usr/bin/awk /usr/bin/hexdump /bin/sleep /bin/zcat /usr/bin/bzcat + install_bin /bin/busybox /bin/ash /bin/sh /bin/mount /bin/umount /sbin/pivot_root /usr/bin/wget /sbin/reboot /bin/sync /bin/dd /bin/grep /bin/cp /bin/mv /bin/tar /usr/bin/md5sum "/usr/bin/[" /bin/vi /bin/ls /bin/cat /usr/bin/awk /usr/bin/hexdump /bin/sleep /bin/zcat /usr/bin/bzcat /bin/lock /bin/netmsg install_bin /sbin/mtd for file in $RAMFS_COPY_BIN; do install_bin $file
Index: utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_10_provider_echo_command =================================================================== --- utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_10_provider_echo_command (revision 0) +++ utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_10_provider_echo_command (revision 0) @@ -0,0 +1,14 @@ +#!/bin/sh + +# command to use for echoing log messages +# Copyright 2009 Daniel Dickinson, Licensed under the GPL Version 2 or later + +pr_failsafe_echo () { + echo "$1" + netmsg $fs_failsafe_broadcast "$1" +} + +failsafe_10_provider_echo_command () { + #dummy command + : +} Index: utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_50_get_dhcp_address =================================================================== --- utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_50_get_dhcp_address (revision 0) +++ utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_50_get_dhcp_address (revision 0) @@ -0,0 +1,33 @@ +#!/bin/sh + +# Get IP address for WAN via DHCP +# Copyright 2009 Daniel Dickinson, Licensed under the GPL Version 2 or later + +pr_failsafe_dhcpc () { + if [ -n "$fsprovider_ifname" ] && grep "$fsprovider_ifname" /proc/net/dev >/dev/null; then + pr_failsafe_echo "Getting WAN ip via DHCP" + /sbin/udhcpc -t10 -i $fsprovider_ifname -n + retval=$? + else + pr_failsafe_echo "ERROR: WAN inteface '$fsprovider_ifname' can't be configured" + do_reboot + fi + return $retval +} + +failsafe_50_get_dhcp_address () { + if [ "$MANUALFAILSAFE" = "true" ]; then + return 0 + fi + while [ "$retval" != "0" ]; do + failsafe_echo "Getting WAN IP address via DHCP" + pr_failsafe_dhcpc + retval=$? + sleep $fsprovider_link_status_sleep + reboot_link_status_changed + done + + ln -s /tmp/resolv.conf.auto /tmp/resolv.conf + + poll_link_status +} Index: utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_10_reboot_command =================================================================== --- utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_10_reboot_command (revision 0) +++ utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_10_reboot_command (revision 0) @@ -0,0 +1,50 @@ +#!/bin/sh + +do_reboot () { + pr_failsafe_echo "Checking reboot status" + # Here we make sure that we're not flashing or some other operation + # where rebooting is liable to result in bricking of the router + lock /tmp/.reboot_semaphore + local reboot_status="$(cat /tmp/.reboot_status 2>/dev/null)" + if [ "$reboot_status" = "0" ]; then + pr_failsafe_echo "Not rebooting; sensitive operation in progress" + return 0 + fi + local reboot_status="$(cat /tmp/root/tmp/.reboot_status 2>/dev/null)" + if [ "$reboot_status" = "0" ]; then + pr_failsafe_echo "Not rebooting; sensitive operation in progress" + return 0 + fi + echo "1" >/tmp/.reboot_status + ( echo "1" >/tmp/root/tmp/.reboot_status ) 2>/dev/null + lock -u /tmp/.reboot_semaphore + pre_failsafe_echo "Failsafe autorestore rebooting system" + reboot + sleep 10 + echo b 2>/dev/null >/proc/sysrq-trigger + # This is just in case reboot doesn't happen for some reason + while true; do + pr_failsafe_echo "Failsafe reboot failed! Please turn the device off and back on again" + halt + sleep 10 + echo h 2>/dev/null >/proc/sysrq-trigger + sleep 300 + done +} + +reboot_after_timeout () { + # reboot after a given amount of time has elapsed (e.g. 28 hours) without + # doing a sysupgrade or restore settings + { + if [ -n "$fsprovider_reboot_timeout" ]; then + if [ "$fsprovider_reboot_timeout" != "0" ]; then + sleep $fsprovider_reboot_timeout + do_reboot + fi + fi + } & +} + +failsafe_10_reboot_command () { + reboot_after_timeout +} \ No newline at end of file Index: utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_30_manual_failsafe =================================================================== --- utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_30_manual_failsafe (revision 0) +++ utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_30_manual_failsafe (revision 0) @@ -0,0 +1,17 @@ +#!/bin/sh + +# Wait to see if we want manual failsafe or autorestore +# Copyright 2009 Daniel Dickinson, Licensed under the GPL Version 2 or later + +failsafe_30_manual_failsafe () { + echo "- autorestore failsafe -" + + MANUALFAILSAFE=false + + fs_wait_for_key m "for manual failsafe mode" $fsprovider_timeout + + if [ "$?" = "1" ]; then + MANUALFAILSAFE=true + export MANUALFAILSAFE + fi +} Index: utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_70_get_settings_firmware =================================================================== --- utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_70_get_settings_firmware (revision 0) +++ utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_70_get_settings_firmware (revision 0) @@ -0,0 +1,140 @@ +#!/bin/sh + +# get settings and firmware from our server +# Copyright 2009 Daniel Dickinson, Licensed under the GPL Version 2 or later + +read_ip () { + ifconfig $fsprovider_ifname | grep 'inet addr:'|grep -v '127.0.0.1'| cut -d: -f2 | awk '{ print $1 }' +} + +parse_mac_line () { + while [ "$1" != "HWaddr" ] && [ -n "$1" ]; do + shift + done + echo $2 +} + +read_mac () { + local mac_line="$(ifconfig $fsprovider_ifname | grep 'HWaddr')" + local mac=$(parse_mac_line $mac_line) + echo "$mac" | sed -e 's/:/-/g' +} + +get_file () { + local retval=1 + ANONYMOUS=false + if [ "$username" = "" ] && [ "$password" = "" ]; then + ANONYMOUS=true + fi + if [ "$ANONYMOUS" != "true" ] && [ "$username" = "" ]; then + pr_failsafe_echo "ERROR: Missing username for file download" + return 1 + fi + if [ "$ANONYMOUS" != "true" ] && [ "$password" = "" ]; then + pr_failsafe_echo "ERROR: Missing password for file download" + return 1 + fi + if [ "$server" = "" ]; then + pr_failsafe_echo "ERROR: Missing URL of server for download" + return 1 + fi + if [ "$serverdir" = "" ]; then + pr_failsafe_echo "ERROR: Missing path to file for server download" + return 1 + fi + + while [ "$retval" != "0" ]; do + local ip2="$(read_ip)" + if [ "$ip2" != "$(cat /tmp/.3rdparty_failsafe_ip)" ]; then + # if the IP we get from the upstream router changes we assumes + # things could break and reboot before trying again + do_reboot + fi + if [ "$ANONYMOUS" = "true" ]; then + curl -o /tmp/$1 $server$serverdir/$1 + else + curl --user "$username:$password" -o /tmp/$1 $server$serverdir/$1 + fi + retval="$?" + done + return 0 +} + +failsafe_70_get_settings_firmware () { + if [ "$MANUALFAILSAFE" = "true" ]; then + return 0 + fi + local WANIP="$(read_ip)" + + if [ -z "$WANIP" ]; then + # If we got an IP via dhcp we should have one here. If not things are + # very bad and hopefully a reboot will fix them. If not a support call + # will be needed, or an RMA + pr_failsafe_echo "IP change in autorestore failsafe" + do_reboot + fi + + echo "$WANIP" >/tmp/.3rdparty_failsafe_ip + pr_failsafe_echo "WAN IP address: $WANIP" + + local md5sum_match=false + + mac="$(read_mac)" + eval "username=$fsprovider_username" + eval "password=$fsprovider_password" + eval "server=$fsprovider_server" + eval "serverdir=$fsprovider_server_dir" + eval "md5sum_file=$fsprovider_md5sum_file" + eval "settings_file=$fsprovider_settings_file" + eval "firmware_file=$fsprovider_firmware_file" + + while [ "$md5sum_match" = "false" ]; do + for file in $settings_file $firmware_file $md5sum_file; do + pr_failsafe_echo "Downloading $file" + if ! get_file $file; then + return 1 + fi + done + pr_failsafe_echo "Verifying file integrity" + cd /tmp + md5sum -s -c $md5sum_file + if [ "$?" = "0" ]; then + md5sum_match=true + else + pr_failsafe_echo "WARNING: md5sum mismatch; retrying download" + fi + cd / + done + + # if [ "$(dd if=/tmp/firmware.bin bs=1 count=19)" != "No firmware upgrade" ]; then + + echo "true" >/tmp/.kill_link_status_loop + lock /tmp/.killed_link_status_loop + lock -w /tmp/.killed_link_status_loop + + pr_failsafe_echo "Checking reboot status" + # Here we make sure that we're not flashing or some other operation + # where rebooting is liable to result in bricking of the router + lock /tmp/.reboot_semaphore + local reboot_status="$(cat /tmp/.reboot_status 2>/dev/null)" + if [ "$reboot_status" = "1" ]; then + pr_failsafe_echo "Not flashing, reboot already in progress" + return 0 + fi + echo "0" >/tmp/.reboot_status + lock -u /tmp/.reboot_semaphore + + pr_failsafe_echo "No reboot in progress so blocking reboot and continuing" + pr_failsafe_echo "Performing system upgrade/settings restore" + sysupgrade -f /tmp/$settings_file /tmp/$firmware_file + + # Just in case sysupgrade fails + sleep 3600 + # Try again + pr_failsafe_echo "Sysupgrade seems to have failed; trying again" + sysupgrade -f /tmp/$fsprovider_settings_file /tmp/$fsprovider_firmware_file + # Give up and hope we're not bricked + sleep 3600 + pr_failsafe_echo "Retry of sysupgrade failed; rebooting" + do_reboot +} Index: utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_40_link_status =================================================================== --- utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_40_link_status (revision 0) +++ utils/failsafe-provider-restore/files/etc/preinit.d/run.d/failsafe_40_link_status (revision 0) @@ -0,0 +1,134 @@ +#!/bin/sh + +# link status functions +# Copyright 2009 Daniel Dickinson, Licensed under the GPL Version 2 or later + +check_link_status () { + local link_status="$(cat $fsprovider_link_status_device_path 2>/dev/null)" + if [ "$link_status" != "0" ] && [ "$link_status" != "1" ]; then + echo "2" + fi + echo $link_status +} + +init_link_status () { + local got_real_status=0 + local link_status= + while [ "$got_real_status" = "0" ]; do + link_status="$(check_link_status)" + if [ "$link_status" = "2" ]; then + sleep $fsprovider_link_status_sleep + continue + fi + got_real_status=1 + done + lock /tmp/.link_status_update + echo $link_status >/tmp/.3rdparty_link_status + lock -u /tmp/.link_status_update +} + +reboot_link_status_changed () { + local link_status= + link_status="$(check_link_status)" + if [ "$link_status" = "2" ]; then + return + fi + lock /tmp/.link_status_update + rm -f /tmp/.3rdparty_link_status.old + mv /tmp/.3rdparty_link_status /tmp/.3rdparty_link_status.old + echo $link_status >/tmp/.3rdparty_link_status + # if we don't have both old and new status now, something has + # gone wrong, so reboot + if [ ! -r "/tmp/.3rdparty_link_status" ] || [ ! -r "/tmp/.3rdparty_link_status.old" ]; then + pr_failsafe_echo "ERROR: missing old or new link status" + do_reboot + fi + # status should be boolean, so if we don't have boolean, reboot + # because we've screwed up somewhere + if [ "$(cat /tmp/.3rdparty_link_status)" != "0" ] && \ + [ "$(cat /tmp/.3rdparty_link_status)" != "1" ] || \ + [ "$(cat /tmp/.3rdparty_link_status.old)" != "0" ] && \ + [ "$(cat /tmp/.3rdparty_link_status.old)" != "1" ]; then + pr_failsafe_echo "ERROR: link status not boolean" + do_reboot + fi + # if the link status has changed, reboot + if [ "$(cat /tmp/.3rdparty_link_status)" != "$(cat /tmp/.3rdparty_link_status.old)" ]; then + pr_failsafe_echo "NOTICE: link status changed" + do_reboot + fi + lock -u /tmp/.link_status_update +} + +poll_link_status () { + touch /tmp/.kill_link_status_loop + { + local link_status= + local end_loop=false + while [ "$end_loop" = "false" ]; do + link_status="$(check_link_status)" + if [ "$link_status" = "2" ]; then + sleep $fsprovider_link_status_sleep + continue + fi + lock /tmp/.link_status_update + rm -f /tmp/.3rdparty_link_status.old + mv /tmp/.3rdparty_link_status /tmp/.3rdparty_link_status.old + echo $link_status >/tmp/.3rdparty_link_status + + # if we don't have both old and new status now, something has + # gone wrong, so reboot + if [ ! -r "/tmp/.3rdparty_link_status" ] || [ ! -r "/tmp/.3rdparty_link_status.old" ]; then + pr_failsafe_echo "ERROR: missing old or new link status" + do_reboot + fi + # status should be boolean, so if we don't have boolean, reboot + # because we've screwed up somewhere + if [ "$(cat /tmp/.3rdparty_link_status)" != "0" ] && \ + [ "$(cat /tmp/.3rdparty_link_status)" != "1" ] || \ + [ "$(cat /tmp/.3rdparty_link_status.old)" != "0" ] && \ + [ "$(cat /tmp/.3rdparty_link_status.old)" != "1" ]; then + pr_failsafe_echo "ERROR: link status not boolean" + do_reboot + fi + # if the link status has changed, reboot + if [ "$(cat /tmp/.3rdparty_link_status)" != "$(cat /tmp/.3rdparty_link_status.old)" ]; then + pr_failsafe_echo "NOTICE: link status changed" + do_reboot + fi + + lock -u /tmp/.link_status_update + + if [ "$(cat /tmp/.kill_link_status_loop)" = "true" ]; then + end_loop=true + fi + done + lock -u /tmp/.killed_link_status_loop + } & +} + +get_link_status () { + local link_status= + lock /tmp/.link_status_update + link_status="$(cat /tmp/.3rdparty_link_status)" + lock -u /tmp/.link_status_update + if [ "$link_status" = "0" ] || [ "$link_status" = "1" ]; then + return $link_status + fi + return 2 +} + +failsafe_40_link_status () { + if [ "$MANUALFAILSAFE" = "true" ]; then + return 0 + fi + pr_failsafe_echo "Initializing WAN link" + if [ -n "$fsprovider_ifname" ] && grep "$fsprovider_ifname" /proc/net/dev >/dev/null; then + ifconfig $fsprovider_ifname up + sleep $fsprovider_link_status_sleep + else + pr_failsafe_echo "ERROR: WAN inteface '$fsprovider_ifname' can't be configured" + do_reboot + fi + init_link_status +} Index: utils/failsafe-provider-restore/image-config.in =================================================================== --- utils/failsafe-provider-restore/image-config.in (revision 0) +++ utils/failsafe-provider-restore/image-config.in (revision 0) @@ -0,0 +1,127 @@ +# Copyright (C) 2009 Daniel Dickinson +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +menuconfig FSPROVIDEROPT + bool "Failsafe provider restore options" if IMAGEOPT + default n + +config TARGET_FSPROVIDER_FS_TIMEOUT + int + prompt "Manual failsafe wait timeout" if FSPROVIDEROPT + default 5 + help + How long to wait for manual failsafe mode to be entered before + proceeding to an autorestore failsafe instead + +config TARGET_FSPROVIDER_REBOOT_TIMEOUT + string + prompt "Reboot if no system upgrade before timeout has elapsed" if FSPROVIDEROPT + default 0 + help + Time to allow for failsafe actions to be performed before + rebooting on the assumption the autorestore isn't going to + happen if it hasn't happened by this point. 0 (the default) + means don't use this timeout, but rather reboot only when + indicated by the failsafe autorestore process. The timeout is + passwd as an argument to 'sleep' command, so you can use + timeouts like 28h for 28 hours. + + +config TARGET_FSPROVIDER_LINK_STATUS_SLEEP + int + prompt "Time to wait for link status to settle after ifup" if FSPROVIDEROPT + default 10 + help + Time in seconds to wait for link to settle when the link changes + state due to the interface being brought up or down + +config TARGET_FSPROVIDER_LINK_STATUS_DEVICE_PATH + string + prompt "Path to carrier indicator for device we're watching" if FSPROVIDEROPT + default "/sys/class/net/eth0/carrier" + +config TARGET_FSPROVIDER_IFNAME + string + prompt "Interface for contacting provider" if FSPROVIDEROPT + default "eth0" + +config TARGET_FSPROVIDER_USERNAME + string + prompt "Username for downloading files" if FSPROVIDEROPT + default "" + help + This value is eval'd in the failsafe script, so if you use + something like $(ESCAPEDVAR)varname it will be replaced by + the runtime (on the router) value of $varname. Also you can + use $(ESCAPEDVAR)(command) to cause this to be the value of + the output of command (via $(command)). + +config TARGET_FSPROVIDER_PASSWORD + string + prompt "Password for downloading files" if FSPROVIDEROPT + default "" + help + This value is eval'd in the failsafe script, so if you use + something like $(ESCAPEDVAR)varname it will be replaced by + the runtime (on the router) value of $varname. Also you can + use $(ESCAPEDVAR)(command) to cause this to be the value of + the output of command (via $(command)). +. +config TARGET_FSPROVIDER_SERVER + string + prompt "Server base URL for downloading files" if FSPROVIDEROPT + default "http://someserver.example.com/" + help + This value is eval'd in the failsafe script, so if you use + something like $(ESCAPEDVAR)varname it will be replaced by + the runtime (on the router) value of $varname. Also you can + use $(ESCAPEDVAR)(command) to cause this to be the value of + the output of command (via $(command)). + +config TARGET_FSPROVIDER_SERVER_FILE_DIR + string + prompt "Path to files to download" if FSPROVIDEROPT + default "" + help + This value is eval'd in the failsafe script, so if you use + something like $(ESCAPEDVAR)varname it will be replaced by + the runtime (on the router) value of $varname. Also you can + use $(ESCAPEDVAR)(command) to cause this to be the value of + the output of command (via $(command)). + +config TARGET_FSPROVIDER_SETTINGS_FILE + string + prompt "Settings to download" if FSPROVIDEROPT + default "$(ESCAPEDVAR)mac-settings.tar.gz" + help + This value is eval'd in the failsafe script, so if you use + something like $(ESCAPEDVAR)varname it will be replaced by + the runtime (on the router) value of $varname. Also you can + use $(ESCAPEDVAR)(command) to cause this to be the value of + the output of command (via $(command)). + +config TARGET_FSPROVIDER_FIRMWARE_FILE + string + prompt "Firmware to download" if FSPROVIDEROPT + default "$(ESCAPEDVAR)mac-firmware.bin" + help + This value is eval'd in the failsafe script, so if you use + something like $(ESCAPEDVAR)varname it will be replaced by + the runtime (on the router) value of $varname. Also you can + use $(ESCAPEDVAR)(command) to cause this to be the value of + the output of command (via $(command)). + +config TARGET_FSPROVIDER_MD5SUM_FILE + string + prompt "MD5SUM files for files to download" if FSPROVIDEROPT + default "$(ESCAPEDVAR)mac-MD5SUMS" + help + This value is eval'd in the failsafe script, so if you use + something like $(ESCAPEDVAR)varname it will be replaced by + the runtime (on the router) value of $varname. Also you can + use $(ESCAPEDVAR)(command) to cause this to be the value of + the output of command (via $(command)). + Index: utils/failsafe-provider-restore/Makefile =================================================================== --- utils/failsafe-provider-restore/Makefile (revision 0) +++ utils/failsafe-provider-restore/Makefile (revision 0) @@ -0,0 +1,59 @@ +# +# Copyright (C) 2009 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=failsafe-provider-restore +PKG_VERSION:=0.0.1 +PKG_RELEASE:=1 + +PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/failsafe-provider-restore + SECTION:=utils + CATEGORY:=Utilities + TITLE:=Failsafe mode autorestore to provider defaults + DEPENDS:=+curl +endef + +define Package/failsafe-provider/description + When failsafe mode is entered (e.g. by pressing reset at the appropriate + time), 'phone home' for provider default settings and/or firmware +endef + +define Build/Prepare +endef + +define Build/Configure +endef + +define Build/Compile +endef + +ESCAPEDVAR=\$$$$ + +define Package/failsafe-provider-restore/install + $(CP) -ar ./files/* $(1)/ + mkdir -p $(1)/etc/preinit.d/conf.d + echo 'fsprovider_timeout=$(if $(CONFIG_TARGET_FSPROVIDER_FS_TIMEOUT),$(CONFIG_TARGET_FSPROVIDER_FS_TIMEOUT),5)' >$(1)/etc/preinit.d/conf.d/50_fsprovider_timeout + echo 'fsprovider_reboot_timeout="$(if $(CONFIG_TARGET_FSPROVIDER_REBOOT_TIMEOUT),$(CONFIG_TARGET_FSPROVIDER_REBOOT_TIMEOUT),0)"' >>$(1)/etc/preinit.d/conf.d/50_fsprovider_timeout + echo 'fsprovider_link_status_sleep=$(if $(CONFIG_TARGET_FSPROVIDER_LINK_STATUS_SLEEP),$(CONFIG_TARGET_FSPROVIDER_LINK_STATUS_SLEEP),10)' >>$(1)/etc/preinit.d/conf.d/50_fsprovider_timeout + echo 'fsprovider_link_status_device_path=$(if $(CONFIG_TARGET_FSPROVIDER_LINK_STATUS_DEVICE_PATH),$(CONFIG_TARGET_FSPROVIDER_LINK_STATUS_DEVICE_PATH),"/sys/class/net/eth0/carrier")' >$(1)/etc/preinit.d/conf.d/50_fsprovider_link_status + echo 'fsprovider_ifname=$(if $(CONFIG_TARGET_FSPROVIDER_IFNAME),$(CONFIG_TARGET_FSPROVIDER_IFNAME),"eth0")' >>$(1)/etc/preinit.d/conf.d/50_fsprovider_link_status + echo 'fsprovider_username=$(if $(CONFIG_TARGET_FSPROVIDER_USERNAME),$(CONFIG_TARGET_FSPROVIDER_USERNAME),"")' >$(1)/etc/preinit.d/conf.d/50_fsprovider_get_file_conf + echo 'fsprovider_password=$(if $(CONFIG_TARGET_FSPROVIDER_PASSWORD),$(CONFIG_TARGET_FSPROVIDER_PASSWORD),"")' >>$(1)/etc/preinit.d/conf.d/50_fsprovider_get_file_conf + echo 'fsprovider_server=$(if $(CONFIG_TARGET_FSPROVIDER_SERVER),$(CONFIG_TARGET_FSPROVIDER_SERVER),"")' >>$(1)/etc/preinit.d/conf.d/50_fsprovider_get_file_conf + echo 'fsprovider_server_dir=$(if $(CONFIG_TARGET_FSPROVIDER_SERVER_FILE_DIR),$(CONFIG_TARGET_FSPROVIDER_SERVER_FILE_DIR),"failsafe")' >>$(1)/etc/preinit.d/conf.d/50_fsprovider_get_file_conf + echo 'fsprovider_settings_file=$(if $(CONFIG_TARGET_FSPROVIDER_SETTINGS_FILE),$(CONFIG_TARGET_FSPROVIDER_SETTINGS_FILE),"$(ESCAPEDVAR)mac-settings.tar.gz")' >>$(1)/etc/preinit.d/conf.d/50_fsprovider_get_file_conf + echo 'fsprovider_firmware_file=$(if $(CONFIG_TARGET_FSPROVIDER_FIRMWARE_FILE),$(CONFIG_TARGET_FSPROVIDER_FIRMWARE_FILE),"$(ESCAPEDVAR)mac-firmware.bin")' >>$(1)/etc/preinit.d/conf.d/50_fsprovider_get_file_conf + echo 'fsprovider_md5sum_file=$(if $(CONFIG_TARGET_FSPROVIDER_MD5SUM_FILE),$(CONFIG_TARGET_FSPROVIDER_MD5SUM_FILE),"$(ESCAPEDVAR)mac-MD5SUMS")' >>$(1)/etc/preinit.d/conf.d/50_fsprovider_get_file_conf + $(CP) -ar ./files/* $(1)/ +endef + +$(eval $(call BuildPackage,failsafe-provider-restore))
signature.asc
Description: PGP signature
_______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel