181 lines
3.9 KiB
Bash
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
|