diff --git a/.github/workflows/kiosk-iso.yml b/.github/workflows/kiosk-iso.yml new file mode 100644 index 0000000..82d2f2d --- /dev/null +++ b/.github/workflows/kiosk-iso.yml @@ -0,0 +1,49 @@ +name: Build NixOS Kiosk ISO + +on: + push: + branches: [ profile-install ] + workflow_dispatch: + +jobs: + flake-check: + runs-on: ubuntu-latest + env: + NIX_CONFIG: extra-experimental-features = nix-command flakes + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Nix + run: | + curl -L https://nixos.org/nix/install | sh + . /home/runner/.nix-profile/etc/profile.d/nix.sh + nix --version + - name: Flake check + run: nix flake check -L + + build-iso: + runs-on: ubuntu-latest + needs: [ flake-check ] + env: + NIX_CONFIG: extra-experimental-features = nix-command flakes + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Nix + run: | + curl -L https://nixos.org/nix/install | sh + . /home/runner/.nix-profile/etc/profile.d/nix.sh + nix --version + - name: Build ISO + run: | + nix --version + nix build .#iso -L --system x86_64-linux + ls -la result + mkdir -p artifacts + cp -v result/iso/*.iso artifacts/ + - name: Upload ISO artifact + uses: actions/upload-artifact@v4 + with: + name: kiosk-iso + path: artifacts/*.iso + if-no-files-found: error diff --git a/Firefox.zip b/Firefox.zip deleted file mode 100644 index c4020ce..0000000 Binary files a/Firefox.zip and /dev/null differ diff --git a/desktop/README.md b/desktop/README.md new file mode 100644 index 0000000..384d819 --- /dev/null +++ b/desktop/README.md @@ -0,0 +1,8 @@ +# Kioskmodus +- Firefox autostart +- Sway +- Restart Firefox via short cut: ALT+Enter +- Close Firefox via short cut: ALT+Q +## Systemd Service für restart +- Inaktiv wegen wayland + diff --git a/desktop/config.toml b/desktop/config.toml new file mode 100755 index 0000000..76abbc8 --- /dev/null +++ b/desktop/config.toml @@ -0,0 +1,20 @@ +[terminal] +# The VT to run the greeter on. Can be "next", "current" or a number +# designating the VT. +vt = 1 + +# The default session, also known as the greeter. +[default_session] +# with whatever you want started, such as `sway`. +command = "sway --config /etc/kiosk-setting/sway/config" +# if using wlgreet +#command = "sway --config /etc/greetd/sway-config" +# The user to run the command as. The privileges this user must have depends +# on the greeter. A graphical greeter may for example require the user to be +# in the `video` group. +user = "kiosk" + +[initial_session] +command = "sway'" +user = "kiosk" + diff --git a/desktop/firefox.sh b/desktop/firefox.sh new file mode 100755 index 0000000..3a703e2 --- /dev/null +++ b/desktop/firefox.sh @@ -0,0 +1,2 @@ +#!/bin/bash +killall firefox && firefox --kiosk mahn.ke/kiosk diff --git a/desktop/kiosk-setting/sway/config b/desktop/kiosk-setting/sway/config new file mode 100755 index 0000000..780f59f --- /dev/null +++ b/desktop/kiosk-setting/sway/config @@ -0,0 +1,163 @@ +# Default config for sway +# +# Copy this to ~/.config/sway/config and edit it to your liking. +# +# Read `man 5 sway` for a complete reference. +#exec firefox kiosk mahn.ke/kiosk +### Variables +# +# Logo key. Use Mod1 for Alt. +set $mod Mod1 +# Home row direction keys, like vim +#set $left h +#set $down j +#set $up k +#set $right l +# Your preferred application launcher +set $menu wmenu-run + +include /etc/sway/config-vars.d/* + +bindsym $mod+Return firefox kiosk mahn.ke/kiosk +bindsym $mod+q kill + + # Start your launcher + # bindsym $mod+d exec $menu + + # floating_modifier $mod normal + + # Reload the configuration file + # bindsym $mod+Shift+c reload + + # Exit sway (logs you out of your Wayland session) + bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit' +# + # Move your focus around + #bindsym $mod+$left focus left + #bindsym $mod+$down focus down + #bindsym $mod+$up focus up + #bindsym $mod+$right focus right + # Or use $mod+[up|down|left|right] + #bindsym $mod+Left focus left + #bindsym $mod+Down focus down + #bindsym $mod+Up focus up + #bindsym $mod+Right focus right + + # Move the focused window with the same, but add Shift + #bindsym $mod+Shift+$left move left + #bindsym $mod+Shift+$down move down + #bindsym $mod+Shift+$up move up + #bindsym $mod+Shift+$right move right + # Ditto, with arrow keys + # bindsym $mod+Shift+Left move left + # bindsym $mod+Shift+Down move down + # bindsym $mod+Shift+Up move up + #bindsym $mod+Shift+Right move right +# +# Workspaces: +# + # Switch to workspace + # bindsym $mod+1 workspace number 1 + # bindsym $mod+2 workspace number 2 + # bindsym $mod+3 workspace number 3 + # bindsym $mod+4 workspace number 4 + # bindsym $mod+5 workspace number 5 + #bindsym $mod+6 workspace number 6 + #bindsym $mod+7 workspace number 7 + #bindsym $mod+8 workspace number 8 + #bindsym $mod+9 workspace number 9 + #bindsym $mod+0 workspace number 10 + # Move focused container to workspace + #bindsym $mod+Shift+1 move container to workspace number 1 + #bindsym $mod+Shift+2 move container to workspace number 2 + #bindsym $mod+Shift+3 move container to workspace number 3 + #bindsym $mod+Shift+4 move container to workspace number 4 + #bindsym $mod+Shift+5 move container to workspace number 5 + #bindsym $mod+Shift+6 move container to workspace number 6 + #bindsym $mod+Shift+7 move container to workspace number 7 + #bindsym $mod+Shift+8 move container to workspace number 8 + #bindsym $mod+Shift+9 move container to workspace number 9 + #bindsym $mod+Shift+0 move container to workspace number 10 + # Note: workspaces can have any name you want, not just numbers. + # We just use 1-10 as the default. +# +# Layout stuff: +# + # You can "split" the current object of your focus with + # $mod+b or $mod+v, for horizontal and vertical splits + # respectively. + #bindsym $mod+b splith + #bindsym $mod+v splitv + + # Switch the current container between different layout styles + #bindsym $mod+s layout stacking + #bindsym $mod+w layout tabbed + #bindsym $mod+e layout toggle split + + # Make the current focus fullscreen + #bindsym $mod+f fullscreen + + # Toggle the current focus between tiling and floating mode + #bindsym $mod+Shift+space floating toggle + + # Swap focus between the tiling area and the floating area + #bindsym $mod+space focus mode_toggle + + # Move focus to the parent container + #bindsym $mod+a focus parent +# +# Scratchpad: +# + # Sway has a "scratchpad", which is a bag of holding for windows. + # You can send windows there and get them back later. + + # Move the currently focused window to the scratchpad + #bindsym $mod+Shift+minus move scratchpad + + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + #bindsym $mod+minus scratchpad show +# +# Resizing containers: +# +#mode "resize" { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + # bindsym $left resize shrink width 10px + # bindsym $down resize grow height 10px + # bindsym $up resize shrink height 10px + # bindsym $right resize grow width 10px + + # Ditto, with arrow keys + # bindsym Left resize shrink width 10px + # bindsym Down resize grow height 10px + # bindsym Up resize shrink height 10px + # bindsym Right resize grow width 10px + + # Return to default mode + # bindsym Return mode "default" + # bindsym Escape mode "default" +#} +#bindsym $mod+r mode "resize" +# +# Utilities: +# + # Special keys to adjust volume via PulseAudio + # bindsym --locked XF86AudioMute exec pactl set-sink-mute \@DEFAULT_SINK@ toggle + # bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume \@DEFAULT_SINK@ -5% + # bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume \@DEFAULT_SINK@ +5% + #bindsym --locked XF86AudioMicMute exec pactl set-source-mute \@DEFAULT_SOURCE@ toggle + # Special keys to adjust brightness via brightnessctl + # bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%- + # bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+ + # Special key to take a screenshot with grim + # bindsym Print exec grim + +# +# Status Bar: +# +# Read `man 5 sway-bar` for more information about this section. + +include /etc/sway/config.d/* diff --git a/desktop/kiosk-setting/sway/config.d/50-systemd-user.conf b/desktop/kiosk-setting/sway/config.d/50-systemd-user.conf new file mode 100755 index 0000000..ab04a90 --- /dev/null +++ b/desktop/kiosk-setting/sway/config.d/50-systemd-user.conf @@ -0,0 +1,9 @@ +# import variables into system-user enviroment +# based on the instructions in the sway wiki +# see also https://github.com/swaywm/sway/issues/5732 +# and https://github.com/systemd/systemd/blob/dfc637d0ff756889e8e5b7cb4ec991eb06069aa1/xorg/50-systemd-user.sh + +exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP + +exec hash dbus-update-activation-environment 2>/dev/null && \ + dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP=sway diff --git a/desktop/kiosk-setting/sway/loop.sh b/desktop/kiosk-setting/sway/loop.sh new file mode 100755 index 0000000..419919c --- /dev/null +++ b/desktop/kiosk-setting/sway/loop.sh @@ -0,0 +1,5 @@ +#!/bin/bash +while true; do + ./firefox.sh + sleep 1 +done diff --git a/desktop/setup.sh b/desktop/setup.sh new file mode 100755 index 0000000..7d2250f --- /dev/null +++ b/desktop/setup.sh @@ -0,0 +1,6 @@ +#!/bin/sh +sudo apt install greetd sway && \ +sudo cp -r desktop/kiosk-setting/ /etc/ && \ +sudo cp config.toml /etc/greetd/config.toml && \ +sudo reboot + diff --git a/desktop/sway/.config.swp b/desktop/sway/.config.swp new file mode 100755 index 0000000..8a0e427 Binary files /dev/null and b/desktop/sway/.config.swp differ diff --git a/desktop/sway/config b/desktop/sway/config new file mode 100755 index 0000000..c33050a --- /dev/null +++ b/desktop/sway/config @@ -0,0 +1,104 @@ +set $mod Mod4 +# Home row direction keys, like vim +set $left h +set $down j +set $up k +set $right l +# Your preferred terminal emulator +set $term konsole +# Your preferred application launcher +set $menu wmenu-run + + +default_border none + +include /etc/sway/config-vars.d/* +exec firefox-esr +# Basics: +# + # Start a terminal + bindsym $mod+Space exec firefox-esr + bindsym $mod+Return exec killall firefox-esr && firefox-esr + + # Kill focused window + bindsym $mod+Shift+q kill + + # Start your launcher + + # Drag floating windows by holding down $mod and left mouse button. + # Resize them with right mouse button + $mod. + # Despite the name, also works for non-floating windows. + # Change normal to inverse to use left mouse button for resizing and right + # mouse button for dragging. + floating_modifier $mod normal + + # Reload the configuration file + bindsym $mod+Shift+c reload + + # Exit sway (logs you out of your Wayland session) + bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit' + # Move your focus around + bindsym $mod+$left focus left + bindsym $mod+$down focus down + bindsym $mod+$up focus up + bindsym $mod+$right focus right + # Or use $mod+[up|down|left|right] + bindsym $mod+Left focus left + bindsym $mod+Down focus down + bindsym $mod+Up focus up + bindsym $mod+Right focus right + + # Move the focused window with the same, but add Shift + bindsym $mod+Shift+$left move left + bindsym $mod+Shift+$down move down + bindsym $mod+Shift+$up move up + bindsym $mod+Shift+$right move right + # Ditto, with arrow keys + bindsym $mod+Shift+Left move left + bindsym $mod+Shift+Down move down + bindsym $mod+Shift+Up move up + bindsym $mod+Shift+Right move right + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + bindsym $mod+minus scratchpad show +# +# Resizing containers: +# +mode "resize" { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + bindsym $left resize shrink width 10px + bindsym $down resize grow height 10px + bindsym $up resize shrink height 10px + bindsym $right resize grow width 10px + + # Ditto, with arrow keys + bindsym Left resize shrink width 10px + bindsym Down resize grow height 10px + bindsym Up resize shrink height 10px + bindsym Right resize grow width 10px + + # Return to default mode + bindsym Return mode "default" + bindsym Escape mode "default" +} +# +# Utilities: +# + # Special keys to adjust volume via PulseAudio + bindsym --locked XF86AudioMute exec pactl set-sink-mute \@DEFAULT_SINK@ toggle + bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume \@DEFAULT_SINK@ -5% + bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume \@DEFAULT_SINK@ +5% + bindsym --locked XF86AudioMicMute exec pactl set-source-mute \@DEFAULT_SOURCE@ toggle + # Special keys to adjust brightness via brightnessctl + bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%- + bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+ + # Special key to take a screenshot with grim + bindsym Print exec grim + +# +# Status Bar: +# +include /etc/sway/config.d/* diff --git a/desktop/sway/config.d/50-systemd-user.conf b/desktop/sway/config.d/50-systemd-user.conf new file mode 100755 index 0000000..ab04a90 --- /dev/null +++ b/desktop/sway/config.d/50-systemd-user.conf @@ -0,0 +1,9 @@ +# import variables into system-user enviroment +# based on the instructions in the sway wiki +# see also https://github.com/swaywm/sway/issues/5732 +# and https://github.com/systemd/systemd/blob/dfc637d0ff756889e8e5b7cb4ec991eb06069aa1/xorg/50-systemd-user.sh + +exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP + +exec hash dbus-update-activation-environment 2>/dev/null && \ + dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP=sway diff --git a/desktop/sway/ffrun.sh b/desktop/sway/ffrun.sh new file mode 100755 index 0000000..a46b0fd --- /dev/null +++ b/desktop/sway/ffrun.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +APP_NAME="firefox-esr" +APP_COMMAND="firefox-esr" + +while true; do + if ! pgrep -x "$APP_NAME" > /dev/null; then + swaymsg exec "$APP_COMMAND" + fi + sleep 1 # Wait a second before checking again +done + diff --git a/desktop/sway/preseed b/desktop/sway/preseed new file mode 160000 index 0000000..84281c0 --- /dev/null +++ b/desktop/sway/preseed @@ -0,0 +1 @@ +Subproject commit 84281c058648cd18ee702d772766cf1a170670e8 diff --git a/post_install.sh b/profile/post_install.sh old mode 100644 new mode 100755 similarity index 84% rename from post_install.sh rename to profile/post_install.sh index a847cc0..6b4889a --- a/post_install.sh +++ b/profile/post_install.sh @@ -1,4 +1,6 @@ +#!/usr/bin/env bash printf "[daemon]\nAutomaticLoginEnable=true\nAutomaticLogin=kiosk\n\n[security]\n\n[xdmcp]\n\n[chooser]\n\n[debug]\n" > /etc/gdm3/daemon.conf + mkdir -p /usr/lib/firefox-esr/distribution tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' { @@ -6,7 +8,7 @@ tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' "DisableDeveloperTools": true, "BlockAboutAddons": true, "BlockAboutConfig": true, - "BlockAboutProfiles": true, + "BlockAboutProf#!/usr/bin/env basshiles": true, "BlockAboutSupport": true, "DisableFirefoxAccounts": true, "DisablePrivateBrowsing": true, @@ -57,12 +59,6 @@ chown -R kiosk:kiosk /home/kiosk/.config tee /home/kiosk/.bash_profile > /dev/null <<'EOF' if [ -z "$WAYLAND_DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then - exec cage firefox --kiosk https://c3nav.de + exec cage firefox --kiosk mahn.ke/kiosk fi EOF - -mkdir -p /home/kiosk/.mozilla/firefox -curl -fsSL -o /tmp/Firefox.zip "https://git.hamburg.ccc.de/Firefox.zip" -unzip -o /tmp/Firefox.zip -d /home/kiosk/.mozilla/firefox -chown -R kiosk:kiosk /home/kiosk/.mozilla/firefox -rm -f /tmp/Firefox.zip \ No newline at end of file diff --git a/preseed.cfg b/profile/preseed.cfg similarity index 97% rename from preseed.cfg rename to profile/preseed.cfg index 527a83b..b934651 100644 --- a/preseed.cfg +++ b/profile/preseed.cfg @@ -53,7 +53,6 @@ d-i pkgsel/include string \ sudo \ cage \ firefox-esr \ - unzip \ curl d-i pkgsel/exclude string gnome-software @@ -65,4 +64,4 @@ d-i finish-install/reboot_in_progress note d-i preseed/late_command string \ in-target curl -o /tmp/post_install.sh https://git.hamburg.ccc.de/ViMaSter/preseed/raw/branch/main/post_install.sh; \ in-target chmod +x /tmp/post_install.sh; \ - in-target /tmp/post_install.sh; \ No newline at end of file + in-target /tmp/post_install.sh diff --git a/tampermonkey/backtohome.js b/profile/tampermonkey/backtohome.js similarity index 64% rename from tampermonkey/backtohome.js rename to profile/tampermonkey/backtohome.js index a7a0935..5dbb51e 100644 --- a/tampermonkey/backtohome.js +++ b/profile/tampermonkey/backtohome.js @@ -9,31 +9,22 @@ // @grant GM_addStyle // ==/UserScript== -const target = "https://kiosk.39c3.by.vincent.mahn.ke/"; (function() { 'use strict'; - // if the user is on target already or subdomain, do nothing - if (window.location.href === target || window.location.href.startsWith(target + '/')) { - return; - } - const btn = document.createElement('button'); btn.textContent = 'Home'; btn.style.cssText = ' all: unset; box-sizing: border-box; border: 2px solid #141414; background: #faf5f5; text-align: center; color: #141414; position: fixed; right: 10px; bottom: 10px; width: 60px; height: 60px; z-index: 2147483647; padding-top: 6px; border-radius: 60px;'; btn.innerHTML = ''; btn.addEventListener('click', () => { - window.location.href = target; + window.location.href = 'http://127.0.0.1:8080'; }); (document.body || document.documentElement).appendChild(btn); - const IDLE_LIMIT_MS = 60_000; + const IDLE_LIMIT_MS = 30_000; // 30 seconds let idleTimer = null; let promptVisible = false; - const PROMPT_LIMIT_MS = 30_000; - let promptInterval = null; - let promptTimeout = null; const modal = document.createElement('div'); modal.id = 'idle-modal'; @@ -55,7 +46,6 @@ const target = "https://kiosk.39c3.by.vincent.mahn.ke/";

Do you want to stay on this page or go back to the home page?

-

Auto return in 30s

`; document.body.appendChild(modal); @@ -86,57 +76,21 @@ const target = "https://kiosk.39c3.by.vincent.mahn.ke/"; promptVisible = true; modal.hidden = false; backdrop.hidden = false; - - // Clear any previous prompt timers - if (promptInterval) { clearInterval(promptInterval); promptInterval = null; } - if (promptTimeout) { clearTimeout(promptTimeout); promptTimeout = null; } - - // Wire button actions (once to avoid duplicates) - const stayBtn = document.querySelector("#idle-stay"); - const goBtn = document.querySelector("#idle-go"); - - if (stayBtn) { - stayBtn.addEventListener("click", () => { + debugger; + // Move focus to the primary action for accessibility + document.querySelector("#idle-stay").addEventListener("click", () => { hidePrompt(); resetIdleTimer(); - }, { once: true }); - } - - if (goBtn) { - goBtn.addEventListener("click", () => { - window.location.href = target; - }, { once: true }); - } - - // 30s countdown visible to the user - let remaining = PROMPT_LIMIT_MS / 1000; // seconds - const countdownEl = document.querySelector("#idle-countdown"); - if (countdownEl) countdownEl.textContent = String(remaining); - - promptInterval = setInterval(() => { - remaining -= 1; - if (remaining >= 0 && countdownEl) { - countdownEl.textContent = String(remaining); - } - }, 1000); - - // Auto-go when expired - promptTimeout = setTimeout(() => { - const go = document.querySelector("#idle-go"); - if (go) { - go.click(); - } else { - window.location.href = target; - } - }, PROMPT_LIMIT_MS); + }); + document.querySelector("#idle-go").addEventListener("click", () => { + window.location.href = 'https://www.google.com'; + }); } function hidePrompt() { promptVisible = false; modal.hidden = true; backdrop.hidden = true; - if (promptInterval) { clearInterval(promptInterval); promptInterval = null; } - if (promptTimeout) { clearTimeout(promptTimeout); promptTimeout = null; } } function onIdle() { diff --git a/tampermonkey/hvv.js b/profile/tampermonkey/hvv.js similarity index 100% rename from tampermonkey/hvv.js rename to profile/tampermonkey/hvv.js diff --git a/tampermonkey/mastodon.js b/profile/tampermonkey/mastodon.js similarity index 100% rename from tampermonkey/mastodon.js rename to profile/tampermonkey/mastodon.js diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..50213a9 --- /dev/null +++ b/setup.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +apt install gdm3 greetd sway && \ +cp -r desktop/kiosk-setting/ /etc/ && \ +cp config.toml /etc/greetd/config.toml && \ +systemctl enable gdm3 && \ # greetd if gdm3 is buggy +./profile/post_install.sh