Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Matches Arch Linux's stock D-Bus-activated wpa_supplicant service.
# On other distributions preserve the existing ExecStart flags and add -m.
[Service]
ExecStart=
ExecStart=/usr/bin/wpa_supplicant -u -s -O /run/wpa_supplicant -m /etc/wpa_supplicant/wifi-direct-pc.conf
3 changes: 3 additions & 0 deletions default/wpa_supplicant/wifi-direct-pc.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Identify this Wi-Fi Direct source as a computer (WPS category 1, PC subtype 1).
# LG webOS uses this identity to open Screen Share full-screen automatically.
device_type=1-0050F204-1
1 change: 1 addition & 0 deletions install/hardware/all.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ run_logged "$OMARCHY_INSTALL/hardware/dell-xps-touchpad-haptics.sh"
run_logged "$OMARCHY_INSTALL/hardware/surface.sh"

run_logged "$OMARCHY_INSTALL/hardware/network.sh"
run_logged "$OMARCHY_INSTALL/hardware/wifi-direct.sh"
run_logged "$OMARCHY_INSTALL/hardware/set-wireless-regdom.sh"
run_logged "$OMARCHY_INSTALL/hardware/fix-fkeys.sh"
run_logged "$OMARCHY_INSTALL/hardware/fix-synaptic-touchpad.sh"
Expand Down
54 changes: 54 additions & 0 deletions install/hardware/wifi-direct.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Only augment Arch's stock service. Replacing a customized ExecStart would
# discard administrator flags or an existing -m configuration.
configure_wifi_direct() {
local config=/etc/wpa_supplicant/wifi-direct-pc.conf
local dropin=/etc/systemd/system/wpa_supplicant.service.d/50-wifi-direct-pc.conf
local defaults="$OMARCHY_PATH/default"
local stock='ExecStart=/usr/bin/wpa_supplicant -u -s -O /run/wpa_supplicant'
local file

if cmp -s "$config" "$defaults/wpa_supplicant/wifi-direct-pc.conf" &&
cmp -s "$dropin" "$defaults/systemd/wpa_supplicant.service.d/50-wifi-direct-pc.conf"; then
return 0
fi

for file in "$config" "$dropin"; do
if [[ -e $file || -L $file ]]; then
if [[ $file == "$config" && ! -L $file ]] && cmp -s "$file" "$defaults/wpa_supplicant/wifi-direct-pc.conf"; then
continue
fi
if [[ $file == "$dropin" && ! -L $file ]] && cmp -s "$file" "$defaults/systemd/wpa_supplicant.service.d/50-wifi-direct-pc.conf"; then
continue
fi
echo "Preserving existing Wi-Fi Direct configuration: $file"
echo "For LG full-screen sharing, set device_type=1-0050F204-1 in the configuration loaded by wpa_supplicant -m."
return 0
fi
done

if [[ ! -f /usr/lib/systemd/system/wpa_supplicant.service ]] ||
[[ $(grep '^ExecStart=' /usr/lib/systemd/system/wpa_supplicant.service) != "$stock" ]]; then
echo "Preserving non-stock wpa_supplicant service; add the Wi-Fi Direct -m configuration manually."
return 0
fi

# Include runtime overrides and type-wide service drop-ins as well as the
# usual administrator directory. Never replace a custom or masked unit.
for file in /etc/systemd/system/wpa_supplicant.service /run/systemd/system/wpa_supplicant.service \
/{etc,run,usr/lib}/systemd/system/{wpa_supplicant.service,service}.d/*.conf; do
[[ $file == "$dropin" ]] && continue
if [[ -e $file || -L $file ]]; then
if [[ $file == */wpa_supplicant.service ]] || grep -Eq '^[[:space:]]*ExecStart[[:space:]]*=' "$file"; then
echo "Preserving custom wpa_supplicant service flags in $file; add -m manually."
return 0
fi
fi
done

install -Dm644 "$defaults/wpa_supplicant/wifi-direct-pc.conf" "$config"
install -Dm644 "$defaults/systemd/wpa_supplicant.service.d/50-wifi-direct-pc.conf" "$dropin"
echo "Wi-Fi Direct PC identity installed; reboot to activate it."
echo "To activate now, run sudo systemctl daemon-reload and sudo systemctl restart wpa_supplicant. Restarting temporarily disconnects Wi-Fi."
}

configure_wifi_direct
3 changes: 3 additions & 0 deletions migrations/1789371062.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
echo "Configure persistent Wi-Fi Direct PC identity for LG Screen Share"

sudo env OMARCHY_PATH="$OMARCHY_PATH" bash -euo pipefail "$OMARCHY_PATH/install/hardware/wifi-direct.sh"
68 changes: 68 additions & 0 deletions test/shell.d/wifi-direct-test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#!/bin/bash

set -euo pipefail
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"

scratch=$(mktemp -d)
trap 'rm -rf "$scratch"' EXIT
export OMARCHY_PATH="$ROOT"

# Redirect absolute system paths in a copy; run the real setup without root or
# access to the host network. No service commands should be needed at install.
sed -e "s|/etc/|$scratch/etc/|g" \
-e "s|/run/|$scratch/run/|g" \
-e "s|/usr/lib/|$scratch/usr/lib/|g" \
-e "s|/{etc,run,usr/lib}/|$scratch/{etc,run,usr/lib}/|g" \
"$ROOT/install/hardware/wifi-direct.sh" > "$scratch/setup.sh"
mkdir -p "$scratch/usr/lib/systemd/system" "$scratch/etc/systemd/system"
printf 'ExecStart=/usr/bin/wpa_supplicant -u -s -O %s/run/wpa_supplicant\n' "$scratch" > "$scratch/usr/lib/systemd/system/wpa_supplicant.service"
config="$scratch/etc/wpa_supplicant/wifi-direct-pc.conf"
dropin="$scratch/etc/systemd/system/wpa_supplicant.service.d/50-wifi-direct-pc.conf"

run_setup() { bash -euo pipefail "$scratch/setup.sh"; }
run_setup
cmp -s "$config" "$ROOT/default/wpa_supplicant/wifi-direct-pc.conf" || fail "PC identity installed"
cmp -s "$dropin" "$ROOT/default/systemd/wpa_supplicant.service.d/50-wifi-direct-pc.conf" || fail "tested service flags installed"
pass "fresh install uses tested files"
run_setup
pass "repeated setup succeeds"
rm "$dropin"
run_setup
[[ -f $dropin ]] || fail "partial installation repaired"
pass "partial installation repaired"

rm "$dropin"
printf 'device_type=custom\n' > "$config"
run_setup
[[ $(cat "$config") == 'device_type=custom' && ! -e $dropin ]] || fail "custom identity preserved"
pass "custom identity preserved"
rm "$config"
printf '[Service]\nExecStart=custom -m /custom.conf\n' > "$scratch/etc/systemd/system/custom.conf"
mkdir -p "$(dirname "$dropin")"
mv "$scratch/etc/systemd/system/custom.conf" "$(dirname "$dropin")/custom.conf"
run_setup
[[ ! -e $config && ! -e $dropin ]] || fail "custom service preserved"
pass "custom service flags and existing -m preserved"
rm "$(dirname "$dropin")/custom.conf"
ln -s /dev/null "$scratch/etc/systemd/system/wpa_supplicant.service"
run_setup
[[ ! -e $dropin ]] || fail "masked unit preserved"
pass "masked unit preserved"

rm "$scratch/etc/systemd/system/wpa_supplicant.service"
printf '[Service]\nEnvironment=CUSTOM=1\n' > "$dropin"
run_setup
[[ ! -e $config && $(cat "$dropin") == $'[Service]\nEnvironment=CUSTOM=1' ]] || fail "custom destination drop-in preserved"
pass "custom destination drop-in preserved"
rm "$dropin"

# Exercise the migration entry point using a fake sudo and redirected leaf.
mkdir -p "$scratch/bin" "$scratch/tree/install/hardware"
cp "$scratch/setup.sh" "$scratch/tree/install/hardware/wifi-direct.sh"
ln -s "$ROOT/default" "$scratch/tree/default"
printf '#!/bin/bash\nexec "$@"\n' > "$scratch/bin/sudo"
chmod +x "$scratch/bin/sudo"
PATH="$scratch/bin:$PATH" OMARCHY_PATH="$scratch/tree" bash -euo pipefail "$ROOT/migrations/1789371062.sh"
[[ -f $config && -f $dropin ]] || fail "migration installs identity and service configuration"
PATH="$scratch/bin:$PATH" OMARCHY_PATH="$scratch/tree" bash -euo pipefail "$ROOT/migrations/1789371062.sh"
pass "migration runs shared setup"