78 lines
3.4 KiB
Bash
78 lines
3.4 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# ── Styling ────────────────────────────────────────────────────────────────
|
|
GREEN="$(printf '\033[1;32m')"; YELLOW="$(printf '\033[1;33m')"
|
|
RED="$(printf '\033[1;31m')"; CYAN="$(printf '\033[1;36m')"
|
|
GREY="$(printf '\033[0;90m')"; NC="$(printf '\033[0m')"
|
|
BAR="──────────────────────────────────────────────────────────────────────────────"
|
|
|
|
header(){ echo -e "${CYAN}${BAR}${NC}
|
|
${CYAN} 888b d888 d8b 888 888 888 888 888 ${NC}
|
|
${CYAN} 8888b d8888 Y8P 888 888 o 888 888 888 ${NC}
|
|
${CYAN} 88888b.d88888 888 888 d8b 888 888 888 ${NC}
|
|
${CYAN} 888Y88888P888 8888b. 888 888 888 d888b 888 .d88b. 888 888888 ${NC}
|
|
${CYAN} 888 Y888P 888 '88b 888 888 888d88888b888 d88''88b 888 888 ${NC}
|
|
${CYAN} 888 Y8P 888 .d888888 888 888 88888P Y88888 888 888 888 888 ${NC}
|
|
${CYAN} 888 ' 888 888 888 888 888 8888P Y8888 Y88..88P 888 Y88b. ${NC}
|
|
${CYAN} 888 888 'Y888888 888 888 888P Y888 'Y88P' 888 'Y888 ${NC}
|
|
${CYAN}${BAR}${NC}\n"; }
|
|
|
|
log(){ echo -e "${GREEN}[+]${NC} $*"; }
|
|
warn(){ echo -e "${YELLOW}[!]${NC} $*"; }
|
|
err(){ echo -e "${RED}[x]${NC} $*"; }
|
|
die(){ err "$*"; exit 1; }
|
|
require_root(){ [[ "$(id -u)" -eq 0 ]] || die "Bitte als root ausführen."; }
|
|
|
|
detect_ip(){
|
|
local ip
|
|
ip="$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{for(i=1;i<=NF;i++) if($i=="src"){print $(i+1); exit}}')" || true
|
|
[[ -n "${ip:-}" ]] || ip="$(hostname -I 2>/dev/null | awk '{print $1}')"
|
|
[[ -n "${ip:-}" ]] || die "Konnte Server-IP nicht ermitteln."
|
|
echo "$ip"
|
|
}
|
|
|
|
detect_ipv6(){
|
|
local ip6
|
|
ip6="$(ip -6 addr show scope global 2>/dev/null | awk '/inet6/{print $2}' | cut -d/ -f1 | head -n1)" || true
|
|
[[ -n "${ip6:-}" ]] || ip6="$(hostname -I 2>/dev/null | awk '{for(i=1;i<=NF;i++) if($i ~ /:/){print $i; exit}}')" || true
|
|
echo "${ip6:-}"
|
|
}
|
|
|
|
detect_timezone(){
|
|
if command -v timedatectl >/dev/null 2>&1; then
|
|
tz="$(timedatectl show -p Timezone --value 2>/dev/null | tr -d '[:space:]')" || true
|
|
[[ -n "${tz:-}" && "$tz" == */* ]] && { echo "$tz"; return; }
|
|
fi
|
|
if [[ -r /etc/timezone ]]; then
|
|
tz="$(sed -n '1p' /etc/timezone | tr -d '[:space:]')" || true
|
|
[[ -n "${tz:-}" && "$tz" == */* ]] && { echo "$tz"; return; }
|
|
fi
|
|
if [[ -L /etc/localtime ]]; then
|
|
target="$(readlink -f /etc/localtime 2>/dev/null || true)"
|
|
target="${target#/usr/share/zoneinfo/}"
|
|
[[ "$target" == */* ]] && { echo "$target"; return; }
|
|
fi
|
|
if command -v curl >/dev/null 2>&1; then
|
|
tz="$(curl -fsSL --max-time 3 https://ipapi.co/timezone 2>/dev/null || true)"
|
|
[[ -n "${tz:-}" && "$tz" == */* ]] && { echo "$tz"; return; }
|
|
fi
|
|
echo "UTC"
|
|
}
|
|
|
|
guess_locale_from_tz(){
|
|
local tz="${1:-UTC}"
|
|
case "$tz" in
|
|
Europe/Berlin|Europe/Vienna|Europe/Zurich|Europe/Luxembourg|Europe/Brussels|Europe/Amsterdam) echo "de";;
|
|
*) echo "en";;
|
|
esac
|
|
}
|
|
|
|
resolve_ok(){
|
|
local host="$1" ip="${SERVER_PUBLIC_IPV4:-}"
|
|
[[ -n "$ip" ]] || return 1
|
|
getent ahosts "$host" | awk '{print $1}' | sort -u | grep -q -F "$ip"
|
|
}
|
|
|
|
ensure_dir(){ install -d -m "${3:-0755}" -o "${1:-root}" -g "${2:-root}" "${4}"; }
|