configs/sh-utils

173 lines
3.0 KiB
Bash

#! /bin/bash
source "$DGL_CONF_HOME/dgl-manage.conf"
DGL_CONF_LOCK_DIR="$DGL_CONF_HOME/locks"
declare -a DGL_LOCKS
DGL_LOCKS=()
PROMPTS_ENABLED=
GIVE_HELP=
help() {
if [[ -n "$GIVE_HELP" ]]; then
cat
echo
exit 0
fi
}
dgl-run() {
"$0" "$@"
}
say() {
echo ";;;; $@"
}
say-do() {
echo "[EXEC] $@"
"$@"
}
running-as-root() {
[[ "$UID" == "0" ]]
}
assert-running-as-root() {
if ! running-as-root; then
abort-saying "$SCRIPT_NAME needs to be run as root"
fi
}
not-running-as-root() {
[[ "$UID" != "0" ]]
}
each-do() {
local cmd="$1"
shift
for arg in "$@"; do
$cmd "$arg"
done
}
announce() {
echo
echo "---------------------------------------------------------------------"
echo "$@"
echo "$@" >>$ANNOUNCEMENTS_FILE
}
abort-saying() {
echo -e "$@, aborting."
exit 1
}
# Call with any argument to disable prompts
enable-prompts() {
local opt
while getopts p opt; do
PROMPTS_ENABLED=1
done
shift $((OPTIND - 1))
# Would be nice to be able to modify the caller's arguments...
}
prompts-enabled() {
[[ -n "$PROMPTS_ENABLED" && -t 0 ]]
}
prompt() {
if prompts-enabled; then
echo "-- Press RETURN to $@ --"
read
else
say "$@"
fi
}
unlock-dgl-locks() {
if (( "${#DGL_LOCKS[@]}" > 0 )); then
rm -f ${DGL_LOCKS[@]}
fi
}
unlock-on-error() {
unlock-dgl-locks
exit 1
}
trap-lock-hook-cleanup() {
if [[ -z "$DGL_TRAP_LOCK_CLEANUP_HOOKED" ]]; then
trap unlock-on-error INT TERM
trap unlock-dgl-locks EXIT
DGL_TRAP_LOCK_CLEANUP_HOOKED=1
fi
}
lock-or-die() {
local lock_name=$1
mkdir -p "$DGL_CONF_LOCK_DIR"
local lock_file="$DGL_CONF_LOCK_DIR/${lock_name}.lock"
shift || true
if ( set -o noclobber; echo "$$" > "$lock_file" ) 2>/dev/null; then
DGL_LOCKS=(${DGL_LOCKS[@]} "$lock_file")
trap-lock-hook-cleanup
else
echo "Could not lock $lock_file: $@"
exit 1
fi
}
dgl-today() {
date +%y%m%d-%H%M
}
cat-error() {
cat >&2
}
assert-chroot-exists() {
if [[ ! -d "$DGL_CHROOT" ]]; then
cat-error <<ERROR
DGL chroot $DGL_CHROOT doesn't exist.
Please create it, or edit $DGL_CONF_HOME/dgl-manage.conf to
point at the real chroot.
ERROR
exit 1
fi
}
assert-login-db-exists() {
if [[ ! -f "$LOGIN_DB" ]]; then
cat-error <<EOF
DGL login db $LOGIN_DB is missing; please check that the chroot
is correctly setup, and that $DGL_CONF_HOME/dgl-manage.conf points
at the correct chroot path.
EOF
exit 1
fi
}
login-query() {
sqlite3 "$LOGIN_DB"
}
dgl-user-exists() {
local user="$1"
local found="$(echo "SELECT username FROM dglusers WHERE username='$user';" |
login-query)"
[[ -n "$found" ]]
}
dgl-user-is-admin() {
local user="$1"
local found="$(echo "SELECT username FROM dglusers
WHERE username='$user' AND (flags & 1) = 1;" |
login-query)"
[[ -n "$found" ]]
}