223 lines
9.8 KiB
Bash
223 lines
9.8 KiB
Bash
#!/bin/bash
|
|
|
|
# Original: https://github.com/jareware/chilipie-kiosk/blob/master/docs/image-setup.sh
|
|
# Anpassung: Max Krieger, 10/2023
|
|
|
|
# exit on error; treat unset variables as errors; exit on errors in piped commands
|
|
set -euo pipefail
|
|
|
|
# Ensure we operate from consistent pwd for the rest of the script
|
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" # Figure out the ABSOLUTE PATH of this script without relying on the realpath command, which may not always be available
|
|
cd "$DIR"
|
|
|
|
SSH_CONNECT_TIMEOUT=30
|
|
|
|
# Funktionen fuer das Skript
|
|
function echo-bold {
|
|
echo -e "$(tput -Txterm-256color bold)$1$(tput -Txterm-256color sgr 0)" # https://unix.stackexchange.com/a/269085; the -T arg accounts for $ENV not being set
|
|
}
|
|
function working {
|
|
echo-bold "\n[WORKING] $1"
|
|
}
|
|
function question {
|
|
echo-bold "\n[QUESTION] $1"
|
|
}
|
|
function ssh {
|
|
/usr/bin/ssh -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout="$SSH_CONNECT_TIMEOUT" "pi@$IP" "$1"
|
|
}
|
|
function scp {
|
|
/usr/bin/scp -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$@" "pi@$IP:/home/pi"
|
|
}
|
|
|
|
question "Skript zum erstellen eines aktuellen Raspberry-Images fuer einen Wachalarm-Monitor"
|
|
echo "Benoetigt:"
|
|
echo "* einen Raspberry Pi oder Linux-Debian-System auf dem dieses Skript ausgefuehrt wird"
|
|
echo "* einen weiteren Raspberry Pi mit SD-Karte und Internet-Zugriff (selbes Netzwerk)"
|
|
echo ""
|
|
|
|
question "Vorbereiten der SD-Karte"
|
|
echo "* Nutzen Sie die Software \"Raspberry Pi Imager\" z.B. unter Windows"
|
|
echo "* waehlen Sie das aktuelle Betriebssystem \"Raspberry Pi OS Lite\" fuer die SD-Karte"
|
|
echo "* setzen Sie vor dem Beschreiben der SD-Karte folgende Einstellungen:"
|
|
echo "*** hostname (z.B. \"wachalarm.local\""
|
|
echo "*** SSH aktivieren, Passwort zur Authentifizierung verwendung"
|
|
echo "*** Benutzer und Kennwort festlegen (z.B. \"pi\" / \"wachalarm\")"
|
|
echo "*** Zeitzone auf Berlin festlegen"
|
|
echo "* SD-Karte schreiben"
|
|
echo "* nach Fertigstellung die SD-Karte unter diesem Linux-System einbinden und mounten:"
|
|
echo "*** z.B. mit: sudo mount /dev/sda1 /media/sdkarte"
|
|
echo "* Pfad der eingbunden SD-Karte merken (z.B. \"/media/sdkarte\")"
|
|
echo "(Bereit? dann weiter mit ENTER)"
|
|
read
|
|
|
|
question "Mount-Verzeichnis der SD-Karte"
|
|
echo "geben Sie den Pfad zur SD-Karte an (z.B. \"/media/sdkarte\")"
|
|
read mount_path
|
|
|
|
# Variablen
|
|
MOUNTED_BOOT_VOLUME="$mount_path"
|
|
BOOT_CMDLINE_TXT="$MOUNTED_BOOT_VOLUME/cmdline.txt"
|
|
BOOT_CONFIG_TXT="$MOUNTED_BOOT_VOLUME/config.txt"
|
|
|
|
#LOCALE="en_US.UTF-8 UTF-8" # or e.g. "fi_FI.UTF-8 UTF-8" for Finland
|
|
LOCALE="de_DE.UTF-8 UTF-8"
|
|
#LANGUAGE="en_US.UTF-8" # should match above
|
|
LANGUAGE="de_DE.UTF-8"
|
|
#KEYBOARD="us" # or e.g. "fi" for Finnish
|
|
KEYBOARD="de"
|
|
#TIMEZONE="Etc/UTC" # or e.g. "Europe/Helsinki"; see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
|
TIMEZONE="Europe/Berlin"
|
|
|
|
working "Backup der Original Boot-Dateien erstellen"
|
|
cp -v "$BOOT_CMDLINE_TXT" "$BOOT_CMDLINE_TXT.backup"
|
|
cp -v "$BOOT_CONFIG_TXT" "$BOOT_CONFIG_TXT.backup"
|
|
|
|
working "Wachalarm-Einstellungsdatei hinterlegen"
|
|
cp -v "homefolder_content/wachalarm_einstellungen.txt" "$MOUNTED_BOOT_VOLUME/wachalarm_einstellungen.txt"
|
|
|
|
working "Automatische Expansion der root-Partition deaktivieren"
|
|
echo "Updating: $BOOT_CMDLINE_TXT"
|
|
cat "$BOOT_CMDLINE_TXT" | sed "s#init=/usr/lib/raspi-config/init_resize.sh##" > temp
|
|
mv temp "$BOOT_CMDLINE_TXT"
|
|
|
|
working "SSH aktivieren"
|
|
# https://www.raspberrypi.org/documentation/remote-access/ssh/
|
|
touch "$MOUNTED_BOOT_VOLUME/ssh"
|
|
|
|
working "Making boot quieter (part 1)" # https://scribles.net/customizing-boot-up-screen-on-raspberry-pi/
|
|
echo "Updating: $BOOT_CONFIG_TXT"
|
|
perl -i -p0e "s/#disable_overscan=1/disable_overscan=1/g" "$BOOT_CONFIG_TXT" # "perl" is more cross-platform than "sed -i"
|
|
echo -e "\ndisable_splash=1" >> "$BOOT_CONFIG_TXT"
|
|
|
|
working "Sound auf HDMI aktiveren (klappt nicht immer)"
|
|
perl -i -p0e "s/dtparam=audio=on/#dtparam=audio=on/g" "$BOOT_CONFIG_TXT"
|
|
|
|
#working "Making boot quieter (part 2)" # https://scribles.net/customizing-boot-up-screen-on-raspberry-pi/
|
|
#echo "You may want to revert these changes if you ever need to debug the startup process"
|
|
#echo "Updating: $BOOT_CMDLINE_TXT"
|
|
#cat "$BOOT_CMDLINE_TXT" \
|
|
# | sed 's/console=tty1/console=tty3/' \
|
|
# | sed 's/$/ splash plymouth.ignore-serial-consoles logo.nologo vt.global_cursor_default=0/' \
|
|
# > temp
|
|
#mv temp "$BOOT_CMDLINE_TXT"
|
|
|
|
working "SD-Karte wird ausgeworfen"
|
|
sudo umount "$mount_path"
|
|
|
|
|
|
question "Raspberry Pi starten:"
|
|
echo "* SD-Karte auswerfen & in Pi einsetzen (ggf. zuvor \"umount /media/sdkarte\""
|
|
echo "* Raspberry Pi mit Netzwerk verbinden"
|
|
echo "* Pi booten / starten"
|
|
echo "* es folgen viele Password-Abfragen fuer den SSH-Zugriff auf den Raspberry"
|
|
echo "IP-Adresse eingeben:"
|
|
read IP
|
|
|
|
#working "Setting locale"
|
|
# We want to do this as early as possible, so perl et al won't complain about misconfigured locales for the rest of the image prep
|
|
ssh "echo $LOCALE | sudo tee /etc/locale.gen"
|
|
ssh "sudo locale-gen"
|
|
ssh "echo -e \"LANGUAGE=$LANGUAGE\nLC_ALL=$LANGUAGE\" | sudo tee /etc/environment"
|
|
|
|
#working "hostname festlegen"
|
|
# We want to do this right before reboot, so we don't get a lot of unnecessary complaints about "sudo: unable to resolve host chilipie-kiosk" (https://askubuntu.com/a/59517)
|
|
ssh "sudo hostnamectl set-hostname wachalarm"
|
|
ssh "sudo perl -i -p0e 's/raspberrypi/wachalarm/g' /etc/hosts" # "perl" is more cross-platform than "sed -i"
|
|
|
|
# From now on, some ssh commands will exit non-0, which should be fine
|
|
set +e
|
|
|
|
# From raspi-config: https://github.com/RPi-Distro/raspi-config/blob/d98686647ced7c0c0490dc123432834735d1c13d/raspi-config#L1313-L1321
|
|
# See also: https://github.com/futurice/chilipie-kiosk/issues/61#issuecomment-524622522
|
|
working "auto-login aktiverento CLI"
|
|
ssh "sudo systemctl set-default multi-user.target"
|
|
ssh "sudo ln -fs /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty1.service"
|
|
ssh "sudo mkdir -p /etc/systemd/system/getty@tty1.service.d"
|
|
ssh "echo -e '[Service]\nExecStart=\nExecStart=-/sbin/agetty --autologin pi --noclear %I \$TERM\n' | sudo tee /etc/systemd/system/getty@tty1.service.d/autologin.conf"
|
|
|
|
#working "Setting timezone"
|
|
ssh "(echo '$TIMEZONE' | sudo tee /etc/timezone) && sudo dpkg-reconfigure --frontend noninteractive tzdata"
|
|
|
|
#working "Setting keyboard layout"
|
|
#ssh "(echo -e 'XKBMODEL="pc105"\nXKBLAYOUT="$KEYBOARD"\nXKBVARIANT=""\nXKBOPTIONS=""\nBACKSPACE="guess"\n' | sudo tee /etc/default/keyboard) && sudo dpkg-reconfigure --frontend noninteractive keyboard-configuration"
|
|
|
|
working "Silencing console logins" # this is to avoid a brief flash of the console login before X comes up
|
|
ssh "sudo rm /etc/profile.d/sshpwd.sh /etc/profile.d/wifi-check.sh" # remove warnings about default password and WiFi country (https://raspberrypi.stackexchange.com/a/105234)
|
|
ssh "touch .hushlogin" # https://scribles.net/silent-boot-on-raspbian-stretch-in-console-mode/
|
|
ssh "sudo perl -i -p0e 's#--autologin pi#--skip-login --noissue --login-options \"-f pi\"#g' /etc/systemd/system/getty@tty1.service.d/autologin.conf" # "perl" is more cross-platform than "sed -i"
|
|
|
|
working "Installing packages"
|
|
ssh "sudo apt-get update && sudo apt-get -y upgrade && DEBIAN_FRONTEND=noninteractive sudo apt-get install -y vim matchbox-window-manager unclutter mailutils nitrogen jq chromium-browser xserver-xorg xinit rpd-plym-splash xdotool rng-tools xinput-calibrator cec-utils realvnc-vnc-server unattended-upgrades npm nodejs lshw"
|
|
# We install mailutils just so that you can check "mail" for cronjob output
|
|
|
|
working "Setting home directory default content"
|
|
ssh "rm -rfv /home/pi/*"
|
|
scp $(find home -type f)
|
|
|
|
working "Skripts ausfuehrbar machen"
|
|
ssh "chmod +x display-off.sh && chmod +x display-on.sh && chmod +x cec-off.sh && chmod +x cec-on.sh && chmod +x .xsession && chmod +x start_waip_standby.sh && chmod +x start_mouse_click.sh && chmod +x report_status.sh"
|
|
|
|
working "Setting splash screen background"
|
|
ssh "sudo rm /usr/share/plymouth/themes/pix/splash.png && sudo ln -s /home/pi/background.png /usr/share/plymouth/themes/pix/splash.png"
|
|
|
|
working "Installing default crontab"
|
|
ssh "crontab /home/pi/crontab.example"
|
|
|
|
working "VNC-Service einrichten (Kennwort \"wachalarm\")"
|
|
ssh "sudo cp /home/pi/vncserver-x11 /root/.vnc/config.d/vncserver-x11"
|
|
ssh "sudo systemctl enable vncserver-x11-serviced.service && sudo systemctl start vncserver-x11-serviced.service"
|
|
|
|
working "Zeiteinstellungen fuer NTP setzen"
|
|
ssh "sudo timedatectl set-ntp 1 && sudo timedatectl set-local-rtc 0"
|
|
#ssh "sudo systemctl restart systemd-timesyncd.service"
|
|
|
|
working "Automatische Sicherheitsupdates einrichten"
|
|
ssh "sudo dpkg-reconfigure -pmedium unattended-upgrades"
|
|
ssh "sudo cp /home/pi/50unattended-upgrades /etc/apt/apt.conf.d/50unattended-upgrades"
|
|
|
|
working "VNC- und SSH-Zugang einschraenken"
|
|
ssh "sudo cp /home/pi/hosts.deny /etc/hosts.deny && sudo cp /home/pi/hosts.allow /etc/hosts.allow"
|
|
#ssh "sudo service sshd restart"
|
|
|
|
working "Waip-Standby-Skript installieren"
|
|
ssh "(cd /home/pi && npm install)"
|
|
|
|
working "Rebooting the Pi"
|
|
ssh "sudo reboot"
|
|
|
|
echo "Waiting for host to come back up..."
|
|
until SSH_CONNECT_TIMEOUT=5 ssh "echo OK"
|
|
do
|
|
sleep 1
|
|
done
|
|
|
|
question "Sobald der Pi mit Chromium neugestartet hat:"
|
|
echo "* Tell Chromium we don't want to sign in"
|
|
echo "* Configure Chromium to start \"where you left off\""
|
|
echo " * F11 to exit full screen"
|
|
echo " * Alt + F, then S to go to Settings"
|
|
echo " * Type \"continue\" to filter the options"
|
|
echo " * Tab to select \"Continue where you left off\""
|
|
echo "(press enter when ready)"
|
|
read
|
|
|
|
|
|
|
|
# weitere Einstellungen
|
|
|
|
# sudo raspi-config -> System -> Audio auf HDMI ändern
|
|
# vnc-fenster schließen
|
|
# image shrink
|
|
|
|
# TV
|
|
# Einrichutng -> "Mute" 1 1 9 "Enter"
|
|
# Menu OSD -> Menu Display -> off
|
|
|
|
# Raspberry an TV HDMI 1
|
|
# Raspberry HDMI 0 (Neben USB-C-Stromanschluss)
|
|
# lautsprecher tv auf 25
|
|
|
|
# Konfiguration direkt auf SD-Karte
|
|
# ip per einstellungen txt setzen
|
|
# wlan per wpa_supplicant
|