mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-11-13 08:30:49 +01:00
linux_configuration/periodic_background/hosts/ is now github.com/kuhyx/hosts-blocker, cloned at ~/hosts-blocker. Clears 5 of the 46 directory-depth violations; the remaining 41 are all digital_wellbeing, so --warn stays on the depth hook until that unit moves too. History was filtered across ALL FOUR paths the unit has lived at (hosts/, linux_configuration/hosts/, linux_configuration/scripts/periodic_background/ hosts/, and the current one). Filtering on the current path alone would have preserved 1 commit out of 51 -- the flatten moved it recently, so a naive single --path silently truncates the history to the flatten commit and still looks fine in `git log | head`. No source line changed: all 15 files are byte-identical to the copies removed here. install.sh already resolved its lib/ via BASH_SOURCE. The six callers now resolve the checkout through a new shared helper, linux_configuration/lib/extracted_repos.sh, which reads the invoking user's home from SUDO_USER's passwd entry rather than $HOME -- several of these scripts re-exec under sudo, where $HOME is /root. A missing checkout fails loudly with a clone instruction; it is never a silent skip, which is the failure mode that left screen-locker's self-repair dead for five months after the 2026-05-15 reorg. The live blocker is untouched: /etc/hosts keeps its chattr +i, and the guards load their plugins from /usr/local/share/guard-lib-plugins/ (byte-identical by md5), not from a repo path. Verified: 25 tests pass from ~/hosts-blocker; shellcheck clean on the helper and all six callers; sudo resolution prints /home/kuhy/hosts-blocker; test_setup_dns_blocker.sh passes; report_live_state.sh --check is byte-identical before and after, so no new stale references. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PJrqKERAo5QUeEHWS5Asgp
159 lines
6.1 KiB
Bash
Executable File
159 lines
6.1 KiB
Bash
Executable File
#!/bin/bash
|
||
# Unified installer for all personal Linux system modules.
|
||
#
|
||
# CORE modules (always installed):
|
||
# 1. Workout screen locker – python_pkg/screen_locker/
|
||
# 2. Hosts blocking setup – github.com/kuhyx/hosts-blocker (~/hosts-blocker)
|
||
# 3. Midnight shutdown timer – setup_midnight_shutdown.sh
|
||
#
|
||
# SECONDARY modules (prompted unless --all / --none given):
|
||
# 4. Steam backlog enforcer – python_pkg/steam_backlog_enforcer/
|
||
# 5. Pacman wrapper – periodic_background/digital_wellbeing/pacman/
|
||
# 6. i3 configuration – i3/
|
||
# 7. Compulsive opening block – block_compulsive_opening.sh
|
||
#
|
||
# Usage:
|
||
# ./install_core_system.sh [--all | --none]
|
||
#
|
||
# Flags:
|
||
# --all Install all secondary modules without prompting
|
||
# --none Skip all secondary modules
|
||
# -h Show this help
|
||
|
||
set -euo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
LINUX_CONFIG="$SCRIPT_DIR"
|
||
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
# Locates repos extracted out of this monorepo (hosts-blocker, ...).
|
||
# shellcheck source=lib/extracted_repos.sh
|
||
source "$LINUX_CONFIG/lib/extracted_repos.sh"
|
||
|
||
# ── Colour helpers ───────────────────────────────────────────────────────────
|
||
bold() { printf '\e[1m%s\e[0m' "$*"; }
|
||
green() { printf '\e[1;32m%s\e[0m' "$*"; }
|
||
yellow() { printf '\e[1;33m%s\e[0m' "$*"; }
|
||
red() { printf '\e[1;31m%s\e[0m' "$*"; }
|
||
|
||
header() { printf '\n%s\n%s\n' "$(bold "=== $1 ===")" "$(printf '=%.0s' {1..50})"; }
|
||
ok() { printf '%s %s\n' "$(green "✓")" "$*"; }
|
||
skip() { printf '%s %s\n' "$(yellow "–")" "$*"; }
|
||
fail() { printf '%s %s\n' "$(red "✗")" "$*"; }
|
||
|
||
# ── Argument parsing ─────────────────────────────────────────────────────────
|
||
SECONDARY_MODE="ask" # ask | all | none
|
||
|
||
for arg in "$@"; do
|
||
case "$arg" in
|
||
--all) SECONDARY_MODE="all" ;;
|
||
--none) SECONDARY_MODE="none" ;;
|
||
-h | --help)
|
||
sed -n '2,/^$/p' "$0"
|
||
exit 0
|
||
;;
|
||
*)
|
||
printf 'Unknown option: %s\n' "$arg" >&2
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
# ── Result tracking ──────────────────────────────────────────────────────────
|
||
declare -a INSTALLED=()
|
||
declare -a SKIPPED=()
|
||
declare -a FAILED=()
|
||
|
||
run_installer() {
|
||
local name="$1"
|
||
shift
|
||
header "$name"
|
||
if "$@"; then
|
||
ok "$name installed"
|
||
INSTALLED+=("$name")
|
||
else
|
||
fail "$name failed (exit $?)"
|
||
FAILED+=("$name")
|
||
fi
|
||
}
|
||
|
||
ask_install() {
|
||
# ask_install <name> <command...>
|
||
# Prompts user; respects SECONDARY_MODE override.
|
||
local name="$1"
|
||
shift
|
||
|
||
if [[ $SECONDARY_MODE == "none" ]]; then
|
||
skip "$name (--none)"
|
||
SKIPPED+=("$name")
|
||
return
|
||
fi
|
||
|
||
if [[ $SECONDARY_MODE == "all" ]]; then
|
||
run_installer "$name" "$@"
|
||
return
|
||
fi
|
||
|
||
# interactive
|
||
local answer
|
||
printf '\nInstall %s? [y/N] ' "$(bold "$name")"
|
||
read -r answer
|
||
if [[ "${answer,,}" == "y" ]]; then
|
||
run_installer "$name" "$@"
|
||
else
|
||
skip "$name"
|
||
SKIPPED+=("$name")
|
||
fi
|
||
}
|
||
|
||
# ── Summary ──────────────────────────────────────────────────────────────────
|
||
print_summary() {
|
||
printf '\n%s\n' "$(bold "========== INSTALL SUMMARY ==========")"
|
||
if [[ ${#INSTALLED[@]} -gt 0 ]]; then
|
||
printf '%s\n' "$(green "Installed (${#INSTALLED[@]}):")"
|
||
for m in "${INSTALLED[@]}"; do printf ' %s %s\n' "$(green "✓")" "$m"; done
|
||
fi
|
||
if [[ ${#SKIPPED[@]} -gt 0 ]]; then
|
||
printf '%s\n' "$(yellow "Skipped (${#SKIPPED[@]}):")"
|
||
for m in "${SKIPPED[@]}"; do printf ' %s %s\n' "$(yellow "–")" "$m"; done
|
||
fi
|
||
if [[ ${#FAILED[@]} -gt 0 ]]; then
|
||
printf '%s\n' "$(red "Failed (${#FAILED[@]}):")"
|
||
for m in "${FAILED[@]}"; do printf ' %s %s\n' "$(red "✗")" "$m"; done
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# CORE MODULES (always installed)
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
printf '\n%s\n' "$(bold "Installing CORE modules…")"
|
||
|
||
run_installer "Workout screen locker" \
|
||
bash "$REPO_ROOT/python_pkg/screen_locker/install_systemd.sh"
|
||
|
||
run_installer "Hosts blocking" \
|
||
bash "$(extracted_repo_dir hosts-blocker)/install.sh"
|
||
|
||
run_installer "Midnight shutdown timer" \
|
||
bash "$LINUX_CONFIG/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh"
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# SECONDARY MODULES (prompted unless --all / --none)
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
printf '\n%s\n' "$(bold "Secondary modules (${SECONDARY_MODE})…")"
|
||
|
||
ask_install "Steam backlog enforcer" \
|
||
sudo bash "$REPO_ROOT/python_pkg/steam_backlog_enforcer/install.sh"
|
||
|
||
ask_install "Pacman wrapper" \
|
||
bash "$LINUX_CONFIG/periodic_background/digital_wellbeing/pacman/install_pacman_wrapper.sh"
|
||
|
||
ask_install "i3 configuration" \
|
||
bash "$LINUX_CONFIG/i3/install.sh"
|
||
|
||
ask_install "Compulsive opening blockade" \
|
||
sudo bash "$LINUX_CONFIG/periodic_background/digital_wellbeing/block_compulsive_opening.sh" install
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
print_summary
|