1
0
mirror of https://gitlab.alpinelinux.org/alpine/cloud/tiny-cloud.git synced 2025-12-15 11:22:43 +03:00
tiny-cloud/sbin/tiny-cloud

143 lines
3.2 KiB
Bash
Executable File

#!/bin/sh
# vim:set filetype=sh:
# Tiny Cloud
set -e
: "${LIBDIR:=$PREFIX/lib}"
. "$LIBDIR/tiny-cloud/common"
usage() {
cat <<-EOF
Usage: ${0##*/} [-h | --help] { boot | early | main | final | --bootstrap {complete|incomplete|status} | --enable | --disable }
EOF
}
bootstrap_complete() {
touch "$TINY_CLOUD_VAR/.bootstrap-complete"
}
bootstrap_incomplete() {
rm -f "$TINY_CLOUD_VAR/.bootstrap-complete"
}
is_bootstrap_complete() {
[ -f "$TINY_CLOUD_VAR/.bootstrap-complete" ]
}
args=$(getopt -o hEDb: --long help,enable,disable,bootstrap: -n ${0##*/} -- "$@") || { usage >&2; exit 1; }
if [ $# -eq 0 ]; then
usage >&2
exit 1
fi
eval set -- "$args"
while true; do
case "$1" in
-h|--help) usage; exit 0;;
-b|--bootstrap) shift
case "$1" in
complete) # indicate bootstrap is done
bootstrap_complete
log -i notice 'bootstrap marked complete';;
incomplete) # indicate bootstrap isn't done
bootstrap_incomplete
log -i warn 'bootstrap marked incomplete';;
status) is_bootstrap_complete && echo 'complete' || echo 'incomplete' ;;
*) usage >&2; exit 1;;
esac
exit 0;;
-[ED]|--enable|--disable) # just openrc for now
: "${ROOT:=}" # for mounted volumes
# always start with a clean slate
rm -f "$ROOT"/etc/runlevels/*/tiny-cloud*
log -i info "- tiny-cloud* services removed from all runlevels"
if [ "$1" = '-D' ] || [ "$1" = '--disable' ]; then
exit 0
fi
ln -s /etc/init.d/tiny-cloud-boot "$ROOT"/etc/runlevels/boot
log -i info "+ tiny-cloud-boot service added to boot runlevel"
for p in early main final; do
ln -s "/etc/init.d/tiny-cloud-$p" "$ROOT"/etc/runlevels/default
log -i info "+ tiny-cloud-$p service added to default runlevel"
done
exit 0;;
--) shift; break;;
*) usage >&2; exit 1;;
esac
shift
done
phase="$1"
shift
case "$phase" in
boot|early|main|final) ;;
*) usage >&2; exit 1;;
esac
if [ -e "$ROOT"/etc/tiny-cloud.disabled ]; then
log -i -t "$phase" info "tiny-cloud disabled"
exit 0
fi
# is initial bootstrap already done?
if is_bootstrap_complete; then
log -i -t "$phase" info "already bootstrapped"
exit 0;
fi
# load init functions
. "$LIBDIR/tiny-cloud/init"
### non-overrideable stuff
# should we skip this action?
skip_action() {
local action="$1"
for i in $SKIP_INIT_ACTIONS; do
[ "$i" = "$action" ] && return 0
done
return 1
}
# mandatory final action...
init__bootstrap_complete() {
bootstrap_complete
}
INIT_ACTIONS_FINAL="${INIT_ACTIONS_FINAL} bootstrap_complete"
### let's do stuff!
case "$phase" in
boot) INIT_ACTIONS="$INIT_ACTIONS_BOOT";;
early) INIT_ACTIONS="$INIT_ACTIONS_EARLY";;
main) INIT_ACTIONS="$INIT_ACTIONS_MAIN";;
final) INIT_ACTIONS="$INIT_ACTIONS_FINAL";;
*) usage >&2; exit 1;;
esac
printf '\n' >&2
for ACTION in $INIT_ACTIONS; do
if skip_action "$ACTION"; then
printf ' -- ' >&2
log -i -t "$phase" notice "$ACTION: skipped"
continue
fi
printf ' ++ ' >&2
log -i -t "$phase" info "$ACTION: starting"
RESULT="unknown"
LEVEL="err"
if type "init__$ACTION" | grep -q -w "function"; then
if "init__$ACTION" "$@"; then
RESULT="done"
LEVEL="info"
else
RESULT="failed"
fi
fi
printf ' ++ ' >&2
log -i -t "$phase" "$LEVEL" "$ACTION: $RESULT"
if [ "$RESULT" = "failed" ]; then
exit 1
fi
done