linuxOS_AP06/device/rockchip/common/scripts/post-helper
2025-06-03 12:28:32 +08:00

181 lines
3.9 KiB
Bash

#!/bin/bash
[ -z "$DEBUG" ] || set -x
# Make sure that we are sourced and called inside of RK build scripts.
if [ "$BASH_SOURCE" = "$0" -o -z "$RK_SESSION" ];then
echo "$(realpath "$0") is not supposed to be executed directly"
exit 1
fi
err_handler()
{
ret=${1:-$?}
[ "$ret" -eq 0 ] && return
fatal "ERROR: Running $0 - ${2:-${FUNCNAME[1]}} failed!"
fatal "ERROR: exit code $ret from line ${BASH_LINENO[0]}:"
fatal " ${3:-$BASH_COMMAND}"
fatal "ERROR: call stack:"
for i in $(seq 1 $((${#FUNCNAME[@]} - 1))); do
SOURCE="${BASH_SOURCE[$i]}"
LINE=${BASH_LINENO[$(( $i - 1 ))]}
fatal " $(basename "$SOURCE"): ${FUNCNAME[$i]}($LINE)"
done
exit $ret
}
trap 'err_handler' ERR
set -eE
usage()
{
echo "Usage: $0 [OPTIONS]"
usage_oneline "<rootfs dir> [<default os> [<default init>]]" \
"process target dir"
echo " available init: sysv busybox systemd"
usage_oneline "help" "display this information"
exit 1
}
# Export global functions
set -a
install_sysv_service()
{
[ "$POST_INIT_SYSV" ] || return 0
SRC="$1"
shift
SERVICE="$(basename "$SRC" | sed 's~^S[0-9]*\(.*\)~\1~')"
SERVICE_DIR="$TARGET_DIR/etc/init.d"
install -D -m 0755 "$SRC" "$SERVICE_DIR/$SERVICE"
SERVICE_PREFIX="$(echo $(basename "$SRC") | \
grep -o "^S[0-9]*" || echo S99)"
for level in $@; do
case "$level" in
S[0-9][0-9] | K[0-9][0-9]) SERVICE_PREFIX=$level ;;
S | [0-6])
LEVEL_DIR="$TARGET_DIR/etc/rc$level.d"
LEVEL_SERVICE="$SERVICE_PREFIX$SERVICE"
mkdir -p "$LEVEL_DIR"
ln -rsf "$SERVICE_DIR/$SERVICE" \
"$LEVEL_DIR/$LEVEL_SERVICE"
esac
done
}
install_busybox_service()
{
[ "$POST_INIT_BUSYBOX" ] || return 0
SRC="$1"
SERVICE="$(basename "$SRC")"
SERVICE_DIR="$TARGET_DIR/etc/init.d"
install -D -m 0755 "$SRC" "$SERVICE_DIR/$SERVICE"
}
install_systemd_service()
{
[ "$POST_INIT_SYSTEMD" ] || return 0
SRC="$1"
SERVICE="$(basename "$SRC")"
SERVICE_DIR="$TARGET_DIR/lib/systemd/system"
if [ "$2" ]; then
install -D -m 0755 "$2" "$TARGET_DIR/${3:-/usr/bin/}"
fi
install -D -m 0644 "$SRC" "$SERVICE_DIR/$SERVICE"
WANTED_BY="$(grep "^WantedBy=" "$SRC" | cut -d'=' -f2)"
[ "$WANTED_BY" ] || return 0
WANTS_DIR="$TARGET_DIR/etc/systemd/system/$WANTED_BY.wants"
mkdir -p "$WANTS_DIR"
ln -rsf "$SERVICE_DIR/$SERVICE" "$WANTS_DIR/$SERVICE"
}
set +a
case "$1" in
usage | help | h | -h | --help | \?) usage ;;
esac
if [ ! -d "$1" ]; then
error "$1 is not a dir!"
usage
fi
TARGET_DIR=$(realpath "$1")
shift
unset POST_OS
case "$(grep "^ID=" "$TARGET_DIR/etc/os-release" 2>/dev/null || true)" in
ID=buildroot) POST_OS=buildroot ;;
ID=debian) POST_OS=debian ;;
ID=poky) POST_OS=yocto ;;
esac
case "$TARGET_DIR/" in
*/output/*_ramboot/target/*) POST_OS=ramboot ;;
*/output/*_recovery/target/*) POST_OS=recovery ;;
esac
export POST_OS=${POST_OS:-unknown}
# Override OS type
case "$1" in
buildroot|debian|yocto|ramboot|recovery|unknown)
POST_OS="$1"
shift
;;
esac
echo "$POST_OS_DISALLOWED" | grep -wvq $POST_OS || exit 0
unset POST_ROOTFS
case "$POST_OS" in
buildroot | debian | yocto) POST_ROOTFS=1 ;;
*) [ -z "$POST_ROOTFS_ONLY" ] || exit 0 ;;
esac
unset POST_INIT
if [ -e "$TARGET_DIR/etc/init.d/rcS" ]; then
if [ -d "$TARGET_DIR/etc/rcS.d" ]; then
POST_INIT=sysv
fi
if grep -wq BusyBox "$TARGET_DIR/etc/inittab"; then
POST_INIT="${POST_INIT:+$POST_INIT }busybox"
fi
fi
if [ -d "$TARGET_DIR/etc/systemd/system/" ]; then
mkdir -p "$TARGET_DIR/lib/systemd/system/"
POST_INIT="${POST_INIT:+$POST_INIT }systemd"
fi
export POST_INIT="${POST_INIT:-none}"
# Override init type
case "$1" in
sysv|busybox|systemd)
POST_INIT="$1"
shift
;;
esac
unset POST_INIT_BUSYBOX POST_INIT_SYSTEMD POST_INIT_SYSV
for t in $POST_INIT; do
case $t in
sysv) export POST_INIT_SYSV=1 ;;
busybox) export POST_INIT_BUSYBOX=1 ;;
systemd) export POST_INIT_SYSTEMD=1 ;;
esac
done
if basename "$(realpath "$0")" | grep -q "^post-"; then
notice "Running $(basename "$0") for $TARGET_DIR ($POST_OS init=$POST_INIT)..."
cd "$TARGET_DIR"
fi