mirror of
https://gitlab.com/hacklab01/pivilion.git
synced 2026-08-06 16:08:22 +00:00
64 lines
2.4 KiB
Bash
64 lines
2.4 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
|
||
|
|
TMP=$(mktemp -d)
|
||
|
|
trap 'rm -rf "$TMP"' EXIT
|
||
|
|
mkdir "$TMP/bin"
|
||
|
|
export MOCK_NM_LOG="$TMP/nmcli.log"
|
||
|
|
export MOCK_NM_STATE="$TMP/nm-state"
|
||
|
|
export MOCK_NM_READS="$TMP/nm-reads"
|
||
|
|
|
||
|
|
cat > "$TMP/bin/nmcli" <<'EOF'
|
||
|
|
#!/bin/bash
|
||
|
|
printf '%s\n' "$*" >> "$MOCK_NM_LOG"
|
||
|
|
case "$*" in
|
||
|
|
'radio wifi on') printf 'on\n' > "$MOCK_NM_STATE" ;;
|
||
|
|
'device set wlan0 managed yes') ;;
|
||
|
|
'-g GENERAL.STATE device show wlan0')
|
||
|
|
[ "$(cat "$MOCK_NM_STATE")" = on ] || { echo '20 (unavailable)'; exit 0; }
|
||
|
|
reads=$(cat "$MOCK_NM_READS" 2>/dev/null || echo 0)
|
||
|
|
reads=$((reads + 1)); printf '%s\n' "$reads" > "$MOCK_NM_READS"
|
||
|
|
if [ "$reads" -lt "${MOCK_NM_AVAILABLE_AFTER:-3}" ]; then echo '20 (unavailable)'; else echo '30 (disconnected)'; fi ;;
|
||
|
|
'radio') echo 'WIFI-HW WIFI'; echo 'enabled enabled' ;;
|
||
|
|
'device status') echo 'DEVICE TYPE STATE'; echo 'wlan0 wifi unavailable' ;;
|
||
|
|
'-f GENERAL.STATE,GENERAL.REASON device show wlan0') echo 'GENERAL.STATE: 20 (unavailable)'; echo 'GENERAL.REASON: 2 (unknown)' ;;
|
||
|
|
'connection up pivilion-hotspot ifname wlan0') ;;
|
||
|
|
esac
|
||
|
|
EOF
|
||
|
|
cat > "$TMP/bin/rfkill" <<'EOF'
|
||
|
|
#!/bin/sh
|
||
|
|
echo '0: phy0: Wireless LAN'
|
||
|
|
echo 'Soft blocked: no'
|
||
|
|
echo 'Hard blocked: no'
|
||
|
|
EOF
|
||
|
|
cat > "$TMP/bin/sleep" <<'EOF'
|
||
|
|
#!/bin/sh
|
||
|
|
exit 0
|
||
|
|
EOF
|
||
|
|
chmod +x "$TMP/bin/"*
|
||
|
|
PATH="$TMP/bin:$PATH"
|
||
|
|
export PATH
|
||
|
|
|
||
|
|
source "$ROOT/usr/local/lib/pivilion/networkmanager.sh"
|
||
|
|
|
||
|
|
# The mock starts software-disabled and becomes available after a delay.
|
||
|
|
PIVILION_NM_READY_TIMEOUT=5 pivilion_nm_prepare_interface wlan0
|
||
|
|
[ "$(cat "$MOCK_NM_STATE")" = on ]
|
||
|
|
[ "$(cat "$MOCK_NM_READS")" -eq 3 ]
|
||
|
|
sed -n '1p' "$MOCK_NM_LOG" | grep -Fqx 'radio wifi on'
|
||
|
|
sed -n '2p' "$MOCK_NM_LOG" | grep -Fqx 'device set wlan0 managed yes'
|
||
|
|
pivilion_nm_connection_up pivilion-hotspot wlan0
|
||
|
|
grep -Fqx 'connection up pivilion-hotspot ifname wlan0' "$MOCK_NM_LOG"
|
||
|
|
|
||
|
|
# A device that remains unavailable fails within the configured bound and logs
|
||
|
|
# the complete NetworkManager/rfkill snapshot.
|
||
|
|
: > "$MOCK_NM_LOG"
|
||
|
|
: > "$MOCK_NM_READS"
|
||
|
|
if MOCK_NM_AVAILABLE_AFTER=99 PIVILION_NM_READY_TIMEOUT=2 pivilion_nm_prepare_interface wlan0 >"$TMP/timeout.log" 2>&1; then exit 1; fi
|
||
|
|
grep -q 'Timed out after 2s' "$TMP/timeout.log"
|
||
|
|
grep -q '^-- nmcli radio --$' "$TMP/timeout.log"
|
||
|
|
grep -q '^-- nmcli device status --$' "$TMP/timeout.log"
|
||
|
|
grep -q '^-- wlan0 state and reason --$' "$TMP/timeout.log"
|
||
|
|
grep -q '^-- rfkill Wi-Fi state --$' "$TMP/timeout.log"
|