mirror of
https://github.com/andreili/SBC_builder.git
synced 2025-08-23 19:04:06 +02:00
233 lines
6.1 KiB
Plaintext
233 lines
6.1 KiB
Plaintext
is_quiet() {
|
|
return ${QUIET}
|
|
}
|
|
|
|
log_msg() {
|
|
if [ ! -f "${INIT_LOG}" ]
|
|
then
|
|
touch "${INIT_LOG}" 2>/dev/null || return
|
|
fi
|
|
local msg=${1}
|
|
LANG=C echo "] ${msg}" | sed \
|
|
-e "s,[^[:print:]],,g" \
|
|
-e 's,\(\\033\)\?\[[0-9;]\+m,,g' \
|
|
| ts '[ %Y-%m-%d %H:%M:%.S' >> "${INIT_LOG}"
|
|
}
|
|
|
|
is_true() {
|
|
case "${1}" in
|
|
1)
|
|
return 0
|
|
;;
|
|
[Tt][Rr][Uu][Ee])
|
|
return 0
|
|
;;
|
|
[Tt])
|
|
return 0
|
|
;;
|
|
[Yy][Ee][Ss])
|
|
return 0
|
|
;;
|
|
[Yy])
|
|
return 0
|
|
;;
|
|
esac
|
|
return 1
|
|
}
|
|
|
|
good_msg() {
|
|
local msg_string=${1}
|
|
msg_string="${msg_string:-...}"
|
|
log_msg "[OK] ${msg_string}"
|
|
is_true "${2-${QUIET}}" || printf "%b\n" "${GOOD}>>${NORMAL}${BOLD} ${msg_string} ${NORMAL}"
|
|
}
|
|
|
|
good_msg_n() {
|
|
local msg_string=${1}
|
|
msg_string="${msg_string:-...}"
|
|
log_msg "[OK] ${msg_string}"
|
|
is_true "${2-${QUIET}}" || printf "%b" "${GOOD}>>${NORMAL}${BOLD} ${msg_string}"
|
|
}
|
|
|
|
bad_msg() {
|
|
local msg_string=${1}
|
|
msg_string="${msg_string:-...}"
|
|
log_msg "[!!] ${msg_string}"
|
|
printf "%b\n" "${BAD}!!${NORMAL}${BOLD} ${msg_string} ${NORMAL}"
|
|
}
|
|
|
|
warn_msg() {
|
|
local msg_string=${1}
|
|
msg_string="${msg_string:-...}"
|
|
log_msg "[**] ${msg_string}"
|
|
is_true "${2-${QUIET}}" || printf "%b\n" "${WARN}**${NORMAL}${BOLD} ${msg_string} ${NORMAL}"
|
|
}
|
|
|
|
warn_msg_n() {
|
|
local msg_string=${1}
|
|
msg_string="${msg_string:-...}"
|
|
log_msg "[**] ${msg_string}"
|
|
is_true "${2-${QUIET}}" || printf "%b" "${WARN}**${NORMAL}${BOLD} ${msg_string}"
|
|
}
|
|
|
|
str_starts() {
|
|
if [ "${1#"${2}"*}" != "${1}" ]
|
|
then
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
run() {
|
|
local retval
|
|
if "$@"; then
|
|
retval=$?
|
|
log_msg "Executed: '$*'"
|
|
else
|
|
retval=$?
|
|
log_msg "Failed (${retval}): '$*'"
|
|
fi
|
|
return ${retval}
|
|
}
|
|
|
|
devicelist() {
|
|
# Locate the cdrom device with our media on it.
|
|
# USB Keychain/Storage
|
|
DEVICES="${DEVICES} /dev/sd*"
|
|
# IDE devices
|
|
DEVICES="${DEVICES} /dev/hd*"
|
|
# USB using the USB Block Driver
|
|
DEVICES="${DEVICES} /dev/ubd* /dev/ubd/*"
|
|
# iSeries devices
|
|
DEVICES="${DEVICES} /dev/iseries/vcd*"
|
|
# builtin mmc/sd card reader devices
|
|
DEVICES="${DEVICES} /dev/mmcblk* /dev/mmcblk*/*"
|
|
# fallback scanning, this might scan something twice, but it's better than
|
|
# failing to boot.
|
|
[ -e /proc/partitions ] && DEVICES="${DEVICES} $(awk '/([0-9]+[[:space:]]+)/{print "/dev/" $4}' /proc/partitions)"
|
|
echo ${DEVICES}
|
|
}
|
|
|
|
determine_fs() {
|
|
local _dev="${1}"
|
|
local _orig="${2:-auto}"
|
|
local _fs line
|
|
_fs=$(udevadm info --query=env --name="$_dev" 2>/dev/null | \
|
|
while read line || [ -n "${line}" ]
|
|
do
|
|
if str_starts ${line} "ID_FS_TYPE="
|
|
then
|
|
echo ${line#ID_FS_TYPE=}
|
|
break
|
|
fi
|
|
done
|
|
)
|
|
_fs=${_fs:-auto}
|
|
if [ "${_fs}" = "auto" ]
|
|
then
|
|
_fs="${_orig}"
|
|
fi
|
|
echo "${_fs}"
|
|
}
|
|
|
|
findmediamount() {
|
|
# $1 = mount dir name / media name
|
|
# $2 = recognition file
|
|
# $3 = variable to have the device path
|
|
# $4 = actual mount dir path (full path)
|
|
# args remaining are possible devices
|
|
|
|
local media=$1 recon=$2 vrbl=$3 mntdir=$4
|
|
shift 4
|
|
good_msg "Looking for the ${media}"
|
|
if [ "$#" -gt "0" ]
|
|
then
|
|
[ ! -d "${mntdir}" ] && mkdir -p ${mntdir} >/dev/null 2>&1
|
|
mntcddir="${mntdir}"
|
|
for x in $*
|
|
do
|
|
# Check for a block device to mount
|
|
if [ -b "${x}" ]
|
|
then
|
|
good_msg "Attempting to mount media: ${x}"
|
|
CDROOT_TYPE=$(determine_fs "${x}" "${CDROOT_TYPE}")
|
|
run mount -t ${CDROOT_TYPE} -o defaults ${x} ${mntcddir} >/dev/null 2>&1
|
|
if [ $? -eq 0 ]
|
|
then
|
|
# Check for the media
|
|
if [ -f "${mntdir}/${recon}" ]
|
|
then
|
|
#set REAL_ROOT, CRYPT_ROOT_KEYDEV or whatever ${vrbl} is
|
|
eval ${vrbl}'='"${x}"
|
|
good_msg "Run FS check on ${x}..."
|
|
run umount ${mntcddir}
|
|
run e2fsck -p ${x}
|
|
run mount -t ${CDROOT_TYPE} -o defaults ${x} ${mntcddir} >/dev/null 2>&1
|
|
good_msg "Media found on ${x}"
|
|
break
|
|
else
|
|
run umount ${mntcddir}
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
eval local result='$'${vrbl}
|
|
[ -n "${result}" ] || bad_msg "Media not found"
|
|
}
|
|
|
|
run_shell() {
|
|
[ -x /bin/sh ] && SH=/bin/sh || SH=/bin/ash
|
|
|
|
export PS1='rescueshell \w \# '
|
|
|
|
echo
|
|
GOOD=${BLUE} good_msg "${NORMAL}Welcome to ${BOLD}rescue shell${NORMAL}!" 0
|
|
GOOD=${BLUE} good_msg "${NORMAL}...running Linux kernel ${BOLD}${KV}${NORMAL}" 0
|
|
echo
|
|
|
|
# Avoid /dev/{console,tty0} due to "can't access tty; job control turned off" problem;
|
|
# cttyhack will handle this for us...
|
|
if [ -n "${CONSOLE}" ] \
|
|
&& [ "${CONSOLE}" != "/dev/console" ] \
|
|
&& [ "${CONSOLE}" != "/dev/tty0" ] \
|
|
&& [ -c "${CONSOLE}" ]
|
|
then
|
|
log_msg "Opening rescue shell on ${CONSOLE} ..."
|
|
setsid ${SH} -c "exec sh --login 0<>${CONSOLE} 1<>${CONSOLE} 2<>${CONSOLE}"
|
|
elif command -v cttyhack 1>/dev/null 2>&1
|
|
then
|
|
log_msg "Opening rescue shell using cttyhack ..."
|
|
setsid cttyhack ${SH} --login
|
|
elif [ -c '/dev/tty1' ]
|
|
then
|
|
log_msg "Opening rescue shell on /dev/tty1 fallback ..."
|
|
setsid ${SH} -c "exec sh --login 0<>/dev/tty1 1<>/dev/tty1 2<>/dev/tty1"
|
|
else
|
|
log_msg "Opening rescue shell (last resort) ..."
|
|
${SH} --login
|
|
fi
|
|
|
|
# Leave function early when /dev/null does not exist anymore,
|
|
# i.e. after failed switch_root call
|
|
[ ! -e /dev/null ] && return
|
|
|
|
echo
|
|
|
|
# We maybe have called exec and dettached from main script; We
|
|
# must restore control...
|
|
exec 0<>${CONSOLE} 1<>${CONSOLE} 2<>${CONSOLE}
|
|
}
|
|
|
|
run_emergency_shell() {
|
|
run_shell
|
|
}
|
|
|
|
find_mount() {
|
|
# $1 = mount point
|
|
local mnt_p=$1
|
|
local res
|
|
res=$(cat /proc/self/mountinfo | cut -d' ' -f5 | grep "^${mnt_p}/")
|
|
echo ${res}
|
|
}
|