summaryrefslogtreecommitdiff
path: root/scripts/functions
diff options
context:
space:
mode:
authorAn-Cheng Huang <ancheng@vyatta.com>2010-09-09 17:12:53 -0700
committerAn-Cheng Huang <ancheng@vyatta.com>2010-09-09 17:12:53 -0700
commit573e21e410934f2293d5ac4c738af5f77083b43b (patch)
tree006a2586447b7f2e9353556f74633db605436777 /scripts/functions
parent0de1ad17c333d645774ac3b48d652ccd4ecd6900 (diff)
parent7a6f9e972def00f7f0435d9f2616bcb79dc619b7 (diff)
downloadinitramfs-tools-573e21e410934f2293d5ac4c738af5f77083b43b.tar.gz
initramfs-tools-573e21e410934f2293d5ac4c738af5f77083b43b.zip
Merge branch 'upstream' (0.98.2) into mendocino
Conflicts: debian/changelog debian/compat debian/control debian/rules hook-functions mkinitramfs
Diffstat (limited to 'scripts/functions')
-rw-r--r--scripts/functions205
1 files changed, 160 insertions, 45 deletions
diff --git a/scripts/functions b/scripts/functions
index f715e68..419203a 100644
--- a/scripts/functions
+++ b/scripts/functions
@@ -42,6 +42,11 @@ panic()
if [ -x /sbin/usplash_write ]; then
/sbin/usplash_write "QUIT"
fi
+
+ if command -v chvt >/dev/null 2>&1; then
+ chvt 1
+ fi
+
# Disallow console access
if [ -n "${panic}" ]; then
sleep ${panic}
@@ -49,8 +54,8 @@ panic()
fi
modprobe i8042
modprobe atkbd
- echo $@
- PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1
+ echo "$@"
+ REASON="$@" PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1
}
maybe_break()
@@ -74,7 +79,7 @@ set_initlist()
# only allow variable name chars
case ${si_x#${initdir}/} in
- *[![:alnum:]_]*)
+ *[![:alnum:]\._-]*)
[ "${verbose}" = "y" ] \
&& echo "$si_x ignored: not alphanumeric or '_' file"
continue
@@ -95,7 +100,14 @@ set_initlist()
continue
fi
- initlist="${initlist} ${si_x#${initdir}/}"
+ # skip bad syntax
+ if ! sh -n ${si_x} ; then
+ [ "${verbose}" = "y" ] \
+ && echo "$si_x ignored: bad syntax"
+ continue
+ fi
+
+ initlist="${initlist:-} ${si_x#${initdir}/}"
done
}
@@ -106,18 +118,17 @@ reduce_satisfied()
for rs_y in ${deplist}; do
# only allow variable name chars
case ${rs_y} in
- *[![:alnum:]_]*)
+ *[![:alnum:]\._-]*)
continue
;;
esac
# skip non executable scripts
- if [ ! -x ${initdir}/${rs_y} ]; then
- continue
- fi
+ [ ! -x ${initdir}/${rs_y} ] && continue
# skip directories
- if [ -d ${initdir}/${rs_y} ]; then
- continue
- fi
+ [ -d ${initdir}/${rs_y} ] && continue
+ # skip bad syntax
+ sh -n ${initdir}/${rs_y} || continue
+
tmpdeplist="${tmpdeplist} ${rs_y}"
done
deplist=${tmpdeplist}
@@ -186,28 +197,57 @@ reduce_prereqs()
done
}
+get_prereq_pairs()
+{
+ set_initlist
+ for gp_x in ${initlist:-}; do
+ echo ${gp_x} ${gp_x}
+ prereqs=$(${initdir}/${gp_x} prereqs)
+ for prereq in ${prereqs}; do
+ echo ${prereq} ${gp_x}
+ done
+ done
+}
+
call_scripts()
{
+ set -e
for cs_x in ${runlist}; do
+ [ -f ${initdir}/${cs_x} ] || continue
# mkinitramfs verbose output
if [ "${verbose}" = "y" ]; then
echo "Calling hook ${cs_x}"
fi
- ${initdir}/${cs_x}
- # allow boot scripts to modify exported boot paramaters
+ ${initdir}/${cs_x} && ec=$? || ec=$?
+ # allow hooks to abort build:
+ if [ "$ec" -ne 0 ]; then
+ echo "E: ${initdir}/${cs_x} failed with return $ec."
+ # only errexit on mkinitramfs
+ [ -n "${version}" ] && exit $ec
+ fi
+ # allow boot scripts to modify exported boot parameters
if [ -e /conf/param.conf ]; then
. /conf/param.conf
fi
done
+ set +e
}
run_scripts()
{
initdir=${1}
[ ! -d ${initdir} ] && return
- get_prereqs
- reduce_prereqs
- call_scripts
+
+ if [ -f ${initdir}/ORDER ]; then
+ . ${initdir}/ORDER
+ elif command -v tsort >/dev/null 2>&1; then
+ runlist=$(get_prereq_pairs | tsort)
+ call_scripts ${2:-}
+ else
+ get_prereqs
+ reduce_prereqs
+ call_scripts
+ fi
}
# Load custom modules first
@@ -256,47 +296,122 @@ parse_numeric() {
ROOT=/dev/root
}
+# Parameter: device node to check
+# Echos fstype to stdout
+# Return value: indicates if an fs could be recognized
+get_fstype ()
+{
+ local FS FSTYPE FSSIZE RET
+ FS="${1}"
+
+ # blkid has a more complete list of file systems,
+ # but fstype is more robust
+ eval $(fstype "${FS}" 2> /dev/null)
+ if [ "$FSTYPE" = "unknown" ] && command -v blkid >/dev/null 2>&1 ; then
+ FSTYPE=$(blkid -o value -s TYPE "${FS}")
+ elif [ "$FSTYPE" = "unknown" ] && [ -x /lib/udev/vol_id ]; then
+ FSTYPE=$(/lib/udev/vol_id -t "${FS}" 2> /dev/null)
+ fi
+ RET=$?
+
+ if [ -z "${FSTYPE}" ]; then
+ FSTYPE="unknown"
+ fi
+
+ echo "${FSTYPE}"
+ return ${RET}
+}
+
configure_networking()
{
+ if [ -n "${BOOTIF}" ]; then
+ # pxelinux sets BOOTIF to a value based on the mac address of the
+ # network card used to PXE boot, so use this value for DEVICE rather
+ # than a hard-coded device name from initramfs.conf. this facilitates
+ # network booting when machines may have multiple network cards.
+ # pxelinux sets BOOTIF to 01-$mac_address
+
+ # strip off the leading "01-", which isn't part of the mac
+ # address
+ temp_mac=${BOOTIF#*-}
+
+ # convert to typical mac address format by replacing "-" with ":"
+ bootif_mac=""
+ IFS='-'
+ for x in $temp_mac ; do
+ if [ -z "$bootif_mac" ]; then
+ bootif_mac="$x"
+ else
+ bootif_mac="$bootif_mac:$x"
+ fi
+ done
+ unset IFS
+
+ # look for devices with matching mac address, and set DEVICE to
+ # appropriate value if match is found.
+ for device in /sys/class/net/* ; do
+ if [ -f "$device/address" ]; then
+ current_mac=$(cat "$device/address")
+ if [ "$bootif_mac" = "$current_mac" ]; then
+ DEVICE=${device##*/}
+ break
+ fi
+ fi
+ done
+ fi
+
# networking already configured thus bail out
[ -n "${DEVICE}" ] && [ -e /tmp/net-"${DEVICE}".conf ] && return 0
# support ip options see linux sources
# Documentation/filesystems/nfsroot.txt
- case ${IPOPTS} in
- none|off)
- # Do nothing
- ;;
- ""|on|any)
- # Bring up device
- ipconfig -t 180 ${DEVICE}
- ;;
- dhcp|bootp|rarp|both)
- ipconfig -t 180 -c ${IPOPTS} -d ${DEVICE}
- ;;
- *)
- ipconfig -t 180 -d $IPOPTS
-
- # grab device entry from ip option
- NEW_DEVICE=${IPOPTS#*:*:*:*:*:*}
- if [ "${NEW_DEVICE}" != "${IPOPTS}" ]; then
- NEW_DEVICE=${NEW_DEVICE%:*}
- else
- # wrong parse, possibly only a partial string
- NEW_DEVICE=
- fi
- if [ -n "${NEW_DEVICE}" ]; then
- DEVICE="${NEW_DEVICE}"
- fi
- ;;
- esac
+ # Documentation/frv/booting.txt
+
+ for ROUNDTTT in 2 3 4 6 9 16 25 36 64 100; do
+
+ # The NIC is to be configured if this file does not exist.
+ # Ip-Config tries to create this file and when it succeds
+ # creating the file, ipconfig is not run again.
+ for x in /tmp/net-"${DEVICE}".conf /tmp/net-*.conf ; do
+ [ -e "$x" ] && break 2
+ done
+
+ case ${IP} in
+ none|off)
+ # Do nothing
+ ;;
+ ""|on|any)
+ # Bring up device
+ ipconfig -t ${ROUNDTTT} "${DEVICE}"
+ ;;
+ dhcp|bootp|rarp|both)
+ ipconfig -t ${ROUNDTTT} -c ${IP} -d "${DEVICE}"
+ ;;
+ *)
+ ipconfig -t ${ROUNDTTT} -d $IP
+
+ # grab device entry from ip option
+ NEW_DEVICE=${IP#*:*:*:*:*:*}
+ if [ "${NEW_DEVICE}" != "${IP}" ]; then
+ NEW_DEVICE=${NEW_DEVICE%:*}
+ else
+ # wrong parse, possibly only a partial string
+ NEW_DEVICE=
+ fi
+ if [ -n "${NEW_DEVICE}" ]; then
+ DEVICE="${NEW_DEVICE}"
+ fi
+ ;;
+ esac
+ done
# source ipconfig output
if [ -n "${DEVICE}" ]; then
# source specific bootdevice
. /tmp/net-${DEVICE}.conf
else
- # source any interface as not exaclty specified
+ # source any interface...
+ # ipconfig should have quit after first response
. /tmp/net-*.conf
fi
}
@@ -304,6 +419,6 @@ configure_networking()
# Wait for queued kernel/udev events
wait_for_udev()
{
- [ -x "$(command -v udevadm)" ] || return 0
+ command -v udevadm >/dev/null 2>&1 || return 0
udevadm settle ${1:+--timeout=$1}
}