124 lines
3.6 KiB
Nix
124 lines
3.6 KiB
Nix
# This module configures Firefox for kiosk mode.
|
|
# It wraps Firefox with specific policies to disable UI elements and lock down the browser.
|
|
# It also includes a startup script that determines the kiosk URL based on the machine's MAC address.
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
let
|
|
kioskPolicies = {
|
|
DisableAppUpdate = true;
|
|
DisableFirefoxStudies = true;
|
|
DisableTelemetry = true;
|
|
DisablePocket = true;
|
|
DisableSetDesktopBackground = true;
|
|
DisableFeedbackCommands = true;
|
|
DontCheckDefaultBrowser = true;
|
|
OverrideFirstRunPage = "";
|
|
OverridePostUpdatePage = "";
|
|
NoDefaultBookmarks = true;
|
|
DisableProfileImport = true;
|
|
|
|
Permissions = {
|
|
Camera = { Allow = ["homeassistant.lan"]; };
|
|
Microphone = { Allow = ["homeassistant.lan"]; };
|
|
Location = { Allow = ["homeassistant.lan"]; };
|
|
Notifications = { Allow = ["homeassistant.lan"]; };
|
|
Clipboard = { Allow = ["homeassistant.lan"]; };
|
|
Fullscreen = { Allow = ["homeassistant.lan"]; };
|
|
};
|
|
};
|
|
|
|
extraPrefs = pkgs.writeText "kiosk-prefs.js" ''
|
|
pref("browser.shell.checkDefaultBrowser", false);
|
|
pref("browser.startup.homepage_override.mstone", "ignore");
|
|
pref("startup.homepage_welcome_url", "");
|
|
pref("startup.homepage_welcome_url.additional", "");
|
|
pref("browser.sessionstore.resume_from_crash", false);
|
|
pref("browser.sessionstore.max_resumed_crashes", 0);
|
|
pref("network.captive-portal-service.enabled", false);
|
|
pref("network.connectivity-service.enabled", false);
|
|
pref("browser.messaging-system.whatsNewPanel.enabled", false);
|
|
pref("browser.aboutwelcome.enabled", false);
|
|
pref("privacy.popups.showBrowserMessage", false);
|
|
'';
|
|
|
|
firefoxWrapped = pkgs.wrapFirefox pkgs.firefox-unwrapped {
|
|
extraPolicies = kioskPolicies;
|
|
extraPrefsFiles = [ extraPrefs ];
|
|
};
|
|
|
|
firefoxKiosk = pkgs.writeShellScriptBin "firefoxkiosk" ''
|
|
#!/usr/bin/env bash
|
|
set -eu
|
|
|
|
BASE="http://homeassistant.lan:8123"
|
|
|
|
# Helper to find the primary MAC address
|
|
get_primary_mac() {
|
|
for dev in /sys/class/net/*; do
|
|
iface="$(basename "$dev")"
|
|
[ "$iface" = "lo" ] && continue
|
|
if [ -f "$dev/type" ] && [ "$(cat "$dev/type")" = "1" ]; then
|
|
cat "$dev/address"
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
MAC="$(get_primary_mac 2>/dev/null || echo "")"
|
|
MAC="$(echo "$MAC" | tr '[:upper:]' '[:lower:]')"
|
|
|
|
# Map MAC addresses to specific station IDs
|
|
case "$MAC" in
|
|
"00:e0:4c:46:0b:32") STATION="1" ;;
|
|
"00:e0:4c:46:07:26") STATION="2" ;;
|
|
"00:e0:4c:46:05:94") STATION="3" ;;
|
|
"00:e0:4c:46:07:11") STATION="4" ;;
|
|
"00:e0:4c:46:08:02") STATION="5" ;;
|
|
"00:e0:4c:46:08:5c") STATION="6" ;;
|
|
*) ;;
|
|
esac
|
|
|
|
DEFAULT_PATH="lovelace/0"
|
|
PATH_PART="$DEFAULT_PATH"
|
|
BROWSER_ID="" # browser_mod identifier
|
|
|
|
if [ -n "$STATION" ]; then
|
|
PATH_PART="assembly-line/$STATION"
|
|
BROWSER_ID="Station%20$STATION"
|
|
fi
|
|
|
|
URL="$BASE/$PATH_PART"
|
|
|
|
# Add BrowserID query param if we have one
|
|
if [ -n "$BROWSER_ID" ]; then
|
|
if [[ "$URL" == *"?"* ]]; then
|
|
URL="$URL&BrowserID=$BROWSER_ID"
|
|
else
|
|
URL="$URL?BrowserID=$BROWSER_ID"
|
|
fi
|
|
fi
|
|
|
|
sleep 2
|
|
|
|
exec ${firefoxWrapped}/bin/firefox --kiosk "$URL"
|
|
'';
|
|
in
|
|
{
|
|
environment.systemPackages = [ firefoxKiosk ];
|
|
|
|
services.xserver.enable = false;
|
|
services.seatd.enable = true;
|
|
|
|
services.cage = {
|
|
enable = true;
|
|
user = "engr-ugaif";
|
|
program = "${firefoxKiosk}/bin/firefoxkiosk";
|
|
};
|
|
|
|
systemd.services.cage = {
|
|
after = [ "network-online.target" ];
|
|
wants = [ "network-online.target" ];
|
|
};
|
|
}
|