1
0
Fork 0
gnu-plus-dotfiles/run_once_05-install-hosts.sh.tmpl
rain b40d724f6c Make run_once scripts sudo-prompt-free when packages already present
Several run_once scripts unconditionally called sudo pacman/apt to
install packages — even on boxes where every package was already
present. That triggered a sudo password prompt on every fresh
chezmoi apply for nothing.

Two changes:

1. .chezmoi.yaml.tmpl: fall back to ~/.local/bin/age if /usr/bin/age
   isn't installed (matters during initial bootstrap before age is
   installed system-wide).

2. run_once_*.sh.tmpl: detect missing packages first; only call sudo
   if there's actually something to install. For the LAN hosts script,
   detect the existing block and skip if it's already correct.

These changes are transparent on boxes that already had everything
installed (the existing 5): no behavior change. They reduce sudo
prompts on bit (the new box, where most packages are pre-installed)
from ~5 prompts to 1 (just for /etc/hosts).
2026-06-22 15:10:49 -04:00

84 lines
No EOL
2.9 KiB
Bash

#!/usr/bin/env bash
# =============================================================================
# run_once_05-install-hosts.sh.tmpl
# Merge LAN host entries into /etc/hosts so omp / config / curl can
# resolve miche.local, kaiser.local, etc. by name.
#
# Idempotent: re-running this script is safe; it just rewrites the same
# block of LAN entries. Won't touch non-LAN entries.
#
# Skipped on boxes where /etc/hosts is cloud-init managed (e.g. cloud
# VMs) — they need a different strategy (cloud-init module).
# =============================================================================
set -euo pipefail
log() { printf '\033[1;34m[hosts]\033[0m %s\n' "$*"; }
HOSTS_FILE="/etc/hosts"
LAN_BLOCK_BEGIN="# >>> lan-hosts-managed-by-chezmoi >>>"
LAN_BLOCK_END="# <<< lan-hosts-managed-by-chezmoi <<<"
# Skip on cloud-init managed hosts
if [[ -f /etc/cloud/cloud.cfg ]] && grep -q "manage_etc_hosts" /etc/cloud/cloud.cfg; then
log "WARNING: /etc/hosts is cloud-init managed on this box"
log " add LAN host entries to your cloud-init config instead"
exit 0
fi
# LAN host entries to merge. Keep in sync with /etc/hosts on existing
# boxes (miche, kaiser, byte) so all boxes agree.
LAN_ENTRIES=$(cat <<'LAN_HOSTS'
192.168.1.208 tadbit.local
192.168.1.91 byte.local
192.168.1.194 bit.local
192.168.1.103 dayold.local
192.168.1.212 rorclar.local
192.168.1.153 ggbuttz.local
192.168.1.219 bazzite.local
192.168.1.107 crouton.local
192.168.1.215 rye.local
192.168.1.172 miche.local
192.168.1.65 kaiser.local
192.168.1.118 riska.local
LAN_HOSTS
)
# Build the new block
NEW_BLOCK="$LAN_BLOCK_BEGIN
$LAN_ENTRIES
$LAN_BLOCK_END"
# Read current hosts file
if [[ ! -f "$HOSTS_FILE" ]]; then
log "ERROR: $HOSTS_FILE missing — cannot merge LAN entries"
exit 1
fi
# If our block already exists with all entries, skip. Otherwise rewrite.
# This avoids a no-op sudo prompt on boxes that already have the block.
if grep -q "$LAN_BLOCK_BEGIN" "$HOSTS_FILE" 2>/dev/null \
&& grep -q "miche.local" "$HOSTS_FILE" 2>/dev/null \
&& grep -q "bit.local" "$HOSTS_FILE" 2>/dev/null; then
log "LAN block already present in $HOSTS_FILE; skipping"
exit 0
fi
# If our block exists but is stale (missing some entries), remove it first
if grep -q "$LAN_BLOCK_BEGIN" "$HOSTS_FILE"; then
log "stale LAN block detected; removing before re-adding"
sudo cp "$HOSTS_FILE" "${HOSTS_FILE}.bak.$(date +%s)"
sudo sed -i "/$LAN_BLOCK_BEGIN/,/$LAN_BLOCK_END/d" "$HOSTS_FILE"
fi
# Append the new block
log "appending LAN block to $HOSTS_FILE"
echo "" | sudo tee -a "$HOSTS_FILE" >/dev/null
echo "$NEW_BLOCK" | sudo tee -a "$HOSTS_FILE" >/dev/null
echo "" | sudo tee -a "$HOSTS_FILE" >/dev/null
# Verify by checking one of the entries
if grep -q "miche.local" "$HOSTS_FILE"; then
log "verified miche.local is now resolvable"
else
log "WARNING: miche.local not in $HOSTS_FILE after merge"
fi