This commit is contained in:
crt 2024-07-02 12:13:30 +00:00
commit 40a0530044
1 changed files with 217 additions and 0 deletions

217
kiosk.sh Normal file
View File

@ -0,0 +1,217 @@
#!/bin/bash
# Function to display command output in a dialog box
execute_command() {
output=$(mktemp /tmp/command_output.XXXXXX)
if "$@" >"$output" 2>&1; then
dialog --title "Command Output" --textbox "$output" 20 60
else
dialog --title "Error Occurred" --textbox "$output" 20 60
fi
rm "$output"
}
# Function to install necessary packages for Debian
install_packages_debian() {
echo "Starting Package installation on Debian. Please check the terminal output."
sudo apt-get update && sudo apt-get install -y chromium tightvncserver xorg x11-xserver-utils unclutter openbox xdotool vnstat x11vnc
}
# Function to install necessary packages for Raspberry Pi OS Lite
install_packages_raspberry() {
echo "Starting Package installation on Raspberry Pi OS Lite. Please check the terminal output."
sudo apt-get update && sudo apt-get install -y chromium-browser tightvncserver xorg x11-xserver-utils unclutter openbox xdotool vnstat x11vnc
sudo ln -s /usr/bin/chromium-browser /usr/bin/chromium
}
# Installation selector based on distro
install_packages() {
DIALOG_RESULT=$(dialog --title "Select Distribution" --menu "Choose your Linux distribution:" 15 50 2 \
1 "Debian" \
2 "Raspberry Pi OS Lite" \
3>&1 1>&2 2>&3 3>&-)
case "$DIALOG_RESULT" in
1) install_packages_debian ;;
2) install_packages_raspberry ;;
esac
}
# Function to configure .xinitrc
configure_xinitrc() {
cat > /home/kiosk/.xinitrc << 'EOF'
#!/bin/sh
# Disable power management, screen blanking and make cursor disappear if not moved
xset s off
xset -dpms
xset s noblank
unclutter -idle 0.1 -root &
# Start Openbox session
openbox-session &
x11vnc -display :0 -auth guess -forever -rfbport 5901 &
# Start Kiosk Script
/bin/bash /home/kiosk/start.sh
EOF
sudo chmod a+x /home/kiosk/.xinitrc
}
# Function to configure automatic sign-in
configure_autologin() {
dialog --title "Automatic Login Configuration" --msgbox "Configuring automatic login..." 10 50
sudo mkdir -p /etc/systemd/system/getty@tty1.service.d
sudo bash -c "cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << 'EOF'
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin $USER --noclear %I \$TERM
EOF"
}
# Function to configure start.sh with dynamic scaling factor for interactive or automated mode
configure_start_sh() {
SCALE_FACTOR=$(dialog --title "Display Scaling Factor" --inputbox "Enter the display scaling factor (e.g., 1 for 1080p, 2 for 4K):" 8 50 "1" 3>&1 1>&2 2>&3 3>&-)
if [[ $# -eq 0 ]]; then # If no arguments, it's interactive mode
DIALOG_RESULT=$(dialog --title "start.sh Configuration" --menu "Choose the script example:" 15 50 2 \
1 "Simple website script" \
2 "Two or more tabs alternating every 30 seconds" \
3>&1 1>&2 2>&3 3>&-)
if [ "$DIALOG_RESULT" = "1" ]; then
WEBSITE=$(dialog --title "Enter Website URL" --inputbox "Please enter the URL for the simple website:" 8 50 "https://www.example.com" 3>&1 1>&2 2>&3 3>&-)
set_start_script_single $SCALE_FACTOR $WEBSITE
elif [ "$DIALOG_RESULT" = "2" ]; then
TAB_COUNT=$(dialog --title "Number of Tabs" --inputbox "Enter number of tabs:" 8 50 "3" 3>&1 1>&2 2>&3 3>&-)
local tab_urls=()
for (( i=1; i<=TAB_COUNT; i++ )); do
URL=$(dialog --title "Enter URL for Tab $i" --inputbox "Enter URL:" 8 50 "http://example$i.com" 3>&1 1>&2 2>&3 3>&-)
tab_urls+=("$URL")
done
configure_tabs $SCALE_FACTOR "${tab_urls[@]}"
fi
else # Automated mode with URLs as arguments
if [ $# -eq 1 ]; then # Single website
set_start_script_single $SCALE_FACTOR $1
else # Multiple tabs
configure_tabs $SCALE_FACTOR "$@"
fi
fi
}
# Helper function to configure start.sh for a single website
set_start_script_single() {
cat > /home/kiosk/start.sh <<EOF
#!/bin/bash
/usr/bin/chromium --no-first-run --disable-translate --no-default-browser-check --disable-cache --kiosk $2
EOF
sudo chmod a+x /home/kiosk/start.sh
}
# Helper function to configure start.sh for multiple tabs
configure_tabs() {
local scaling_factor=$1
shift # Remove the first argument (scaling factor) to loop over URLs
local tab_urls=""
for url in "$@"; do
tab_urls+="'$url' " # Ensure URLs are properly quoted
done
# Write the script with properly formatted commands
cat > /home/kiosk/start.sh <<EOF
#!/bin/bash
/usr/bin/chromium --incognito --force-device-scale-factor=$scaling_factor --temp-profile --disable-profiles --no-first-run --disable-translate --no-default-browser-check --disable-cache --kiosk $tab_urls &
sleep 10 # Allow time for Chromium to launch
# Function definitions should be placed before they are called
switch_tabs() {
WINDOW_ID=\$(xdotool search --onlyvisible --class chromium | head -n 1)
xdotool windowactivate --sync \$WINDOW_ID
xdotool key --window \$WINDOW_ID ctrl+Tab
}
is_vnc_active() {
netstat -an | grep ':5901' | grep -q 'ESTABLISHED'
return \$?
}
# Main loop to handle tab switching
while true; do
if is_vnc_active; then
echo "VNC session active, pausing tab switch..."
sleep 5
else
echo "VNC session inactive, switching tabs..."
switch_tabs
sleep 30
fi
done
EOF
chmod a+x /home/kiosk/start.sh
}
# Function to edit .bashrc for automatic start of X session
edit_bashrc() {
echo '[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec startx' >> /home/$USER/.bashrc
}
# Check for help option
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
echo "Usage: $0 [--auto <distro> <scaling_factor> <url1> [<url2> ... <urlN>]]"
echo "Options:"
echo " --auto Run the script in automatic mode with no user interaction."
echo " Requires specifying the distribution ('debian' or 'raspberry'),"
echo " scaling factor (e.g., '1' for 1080p, '2' for 4K), and at least one URL."
echo " Additional URLs are optional and will open in new tabs."
echo " -h, --help Display this help and exit."
echo ""
echo "Example:"
echo " $0 --auto debian 1 \"https://www.example.com\""
echo " $0 --auto raspberry 2 \"https://www.example1.com\" \"https://www.example2.com\""
exit 0
fi
# Automated or interactive mode check
if [[ $1 == "--auto" ]]; then
distro=$2
shift 2 # Remove the first two arguments (script name and distro) for URLs and scaling factor
scaling_factor=$1
shift # Remove the scaling factor to get URLs
[[ $distro == "debian" ]] && install_packages_debian
[[ $distro == "raspberry" ]] && install_packages_raspberry
configure_xinitrc
configure_start_sh "$@"
configure_autologin
edit_bashrc
else
dialog --title "WARNING !!!" --msgbox "Do not run this script under any user other than "kiosk" and make sure the Kiosk user has sudo rights for the duration of the installation. In addition check out the -h command on this script if you wish to do the installation more automated!" 10 50
# Main menu for guided installation
while true; do
CHOICE=$(dialog --title "Rafisa Kiosk Configuration Menu" --menu "Choose an option:" 20 60 10 \
1 "Install Required Packages" \
2 "Install .xinitrc file" \
3 "Configure and Install Kiosk script (start.sh)" \
4 "Enable Automatic Sign-In" \
5 "Append X autostart to .bashrc for console users" \
6 "Exit" \
3>&1 1>&2 2>&3 3>&-)
case $CHOICE in
1) install_packages ;;
2) configure_xinitrc ;;
3) configure_start_sh ;;
4) configure_autologin ;;
5) edit_bashrc ;;
6) break ;;
*) echo "Invalid option. Try another one." >&2
esac
done
dialog --title "Exit" --msgbox "If you completed all steps and no errors were shown to you, reboot now to test if the installation was successful." 10 50
fi
clear