#!/bin/bash set -euo pipefail ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd) TMP=$(mktemp -d) trap 'rm -rf "$TMP"' EXIT export PIVILION_HOSTNAME_FILE="$TMP/hostname" export PIVILION_HOSTS_FILE="$TMP/hosts" export PIVILION_HOSTNAME_COMMAND="$TMP/hostname-command" export MOCK_HOSTNAME_STATE="$TMP/kernel-hostname" export MOCK_HOSTNAME_CALLS="$TMP/hostname-calls" cat > "$PIVILION_HOSTS_FILE" <<'EOF' 127.0.0.1 localhost 127.0.1.1 old-name old-alias 192.0.2.1 example.test 127.0.1.1 stale-duplicate EOF printf 'old-name\n' > "$PIVILION_HOSTNAME_FILE" printf 'old-name\n' > "$MOCK_HOSTNAME_STATE" cat > "$PIVILION_HOSTNAME_COMMAND" <<'EOF' #!/bin/sh if [ "${1:-}" = -s ]; then cat "$MOCK_HOSTNAME_STATE"; exit 0; fi printf '%s\n' "$1" > "$MOCK_HOSTNAME_STATE" printf '%s\n' "$1" >> "$MOCK_HOSTNAME_CALLS" EOF chmod +x "$PIVILION_HOSTNAME_COMMAND" source "$ROOT/usr/local/lib/pivilion/hostname.sh" for mode in hotspot onion; do name="pivilion-$mode" pivilion_apply_hostname "$name" [ "$(cat "$PIVILION_HOSTNAME_FILE")" = "$name" ] [ "$(awk '$1 == "127.0.1.1" { print $2 }' "$PIVILION_HOSTS_FILE")" = "$name" ] [ "$(awk '$1 == "127.0.1.1" { count++ } END { print count+0 }' "$PIVILION_HOSTS_FILE")" -eq 1 ] [ "$("$PIVILION_HOSTNAME_COMMAND" -s)" = "$name" ] before=$(sha256sum "$PIVILION_HOSTNAME_FILE" "$PIVILION_HOSTS_FILE") inodes=$(stat -c '%i' "$PIVILION_HOSTNAME_FILE" "$PIVILION_HOSTS_FILE") calls=$(wc -l < "$MOCK_HOSTNAME_CALLS") pivilion_apply_hostname "$name" [ "$before" = "$(sha256sum "$PIVILION_HOSTNAME_FILE" "$PIVILION_HOSTS_FILE")" ] [ "$inodes" = "$(stat -c '%i' "$PIVILION_HOSTNAME_FILE" "$PIVILION_HOSTS_FILE")" ] [ "$calls" -eq "$(wc -l < "$MOCK_HOSTNAME_CALLS")" ] done grep -Fqx '192.0.2.1 example.test' "$PIVILION_HOSTS_FILE" PIVILION_HOSTNAME_FILE="$TMP/missing/hostname" export PIVILION_HOSTNAME_FILE if pivilion_apply_hostname broken >"$TMP/failure.out" 2>&1; then exit 1; fi grep -q 'Could not create a temporary file' "$TMP/failure.out"