installer.sh 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. #!/bin/bash
  2. # Function to display command output in a dialog box
  3. execute_command() {
  4. output=$(mktemp /tmp/command_output.XXXXXX)
  5. if "$@" >"$output" 2>&1; then
  6. dialog --title "Command Output" --textbox "$output" 20 60
  7. else
  8. dialog --title "Error Occurred" --textbox "$output" 20 60
  9. fi
  10. rm "$output"
  11. }
  12. # Function to install necessary packages for Debian
  13. install_packages_debian() {
  14. echo "Starting Package installation on Debian. Please check the terminal output."
  15. sudo apt-get update && sudo apt-get install -y net-tools psmisc chromium tightvncserver xorg x11-xserver-utils unclutter openbox xdotool vnstat x11vnc
  16. }
  17. # Function to install necessary packages for Raspberry Pi OS Lite
  18. install_packages_raspberry() {
  19. echo "Starting Package installation on Raspberry Pi OS Lite. Please check the terminal output."
  20. sudo apt-get update && sudo apt-get install -y net-tools psmisc chromium-browser tightvncserver xorg x11-xserver-utils unclutter openbox xdotool vnstat x11vnc
  21. sudo ln -s /usr/bin/chromium-browser /usr/bin/chromium
  22. }
  23. # Installation selector based on distro
  24. install_packages() {
  25. DIALOG_RESULT=$(dialog --title "Select Distribution" --menu "Choose your Linux distribution:" 15 50 2 \
  26. 1 "Debian" \
  27. 2 "Raspberry Pi OS Lite" \
  28. 3>&1 1>&2 2>&3 3>&-)
  29. case "$DIALOG_RESULT" in
  30. 1) install_packages_debian ;;
  31. 2) install_packages_raspberry ;;
  32. esac
  33. }
  34. # Function to configure .xinitrc
  35. configure_xinitrc() {
  36. cat > /home/kiosk/.xinitrc << 'EOF'
  37. #!/bin/sh
  38. # Disable power management, screen blanking and make cursor disappear if not moved
  39. xset s off
  40. xset -dpms
  41. xset s noblank
  42. unclutter -idle 0.1 -root &
  43. # Start Openbox session
  44. openbox-session &
  45. x11vnc -display :0 -rfbauth ~/.vnc/passwd -forever -rfbport 5901 &
  46. # Start Kiosk Script
  47. /bin/bash /home/kiosk/start.sh
  48. EOF
  49. sudo chmod a+x /home/kiosk/.xinitrc
  50. }
  51. # Function to configure automatic sign-in
  52. configure_autologin() {
  53. if [[ $1 != "--auto" ]]; then
  54. dialog --title "Automatic Login Configuration" --msgbox "Configuring automatic login..." 10 50
  55. fi
  56. sudo mkdir -p /etc/systemd/system/getty@tty1.service.d
  57. sudo bash -c "cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << 'EOF'
  58. [Service]
  59. ExecStart=
  60. ExecStart=-/sbin/agetty --autologin $USER --noclear %I \$TERM
  61. EOF"
  62. }
  63. # Function to configure start.sh with dynamic scaling factor for interactive or automated mode
  64. configure_start_sh() {
  65. if [[ $# -eq 0 ]]; then # If no arguments, it's interactive mode
  66. 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>&-)
  67. DIALOG_RESULT=$(dialog --title "start.sh Configuration" --menu "Choose the script example:" 15 50 2 \
  68. 1 "Simple website script" \
  69. 2 "Two or more tabs alternating every 30 seconds" \
  70. 3>&1 1>&2 2>&3 3>&-)
  71. if [ "$DIALOG_RESULT" = "1" ]; then
  72. 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>&-)
  73. VNC_PASSWORD=$(dialog --title "VNC Password" --inputbox "Please enter the VNC password:" 8 50 "" 3>&1 1>&2 2>&3 3>&-)
  74. set_start_script_single $SCALE_FACTOR $WEBSITE $VNC_PASSWORD
  75. elif [ "$DIALOG_RESULT" = "2" ]; then
  76. TAB_COUNT=$(dialog --title "Number of Tabs" --inputbox "Enter number of tabs:" 8 50 "3" 3>&1 1>&2 2>&3 3>&-)
  77. local tab_urls=()
  78. for (( i=1; i<=TAB_COUNT; i++ )); do
  79. URL=$(dialog --title "Enter URL for Tab $i" --inputbox "Enter URL:" 8 50 "http://example$i.com" 3>&1 1>&2 2>&3 3>&-)
  80. tab_urls+=("$URL")
  81. done
  82. VNC_PASSWORD=$(dialog --title "VNC Password" --inputbox "Please enter the VNC password:" 8 50 "" 3>&1 1>&2 2>&3 3>&-)
  83. configure_tabs $SCALE_FACTOR $VNC_PASSWORD "${tab_urls[@]}"
  84. fi
  85. else # Automated mode with URLs as arguments
  86. local scaling_factor=$1
  87. local vnc_password=$2
  88. shift 2 # Remove the first two arguments (scaling factor and VNC password) for URLs
  89. if [ $# -eq 1 ]; then # Single website
  90. set_start_script_single $scaling_factor $1 $vnc_password
  91. else # Multiple tabs
  92. configure_tabs $scaling_factor $vnc_password "$@"
  93. fi
  94. fi
  95. }
  96. # Helper function to configure start.sh for a single website
  97. set_start_script_single() {
  98. local scaling_factor=$1
  99. local website=$2
  100. local vnc_password=$3
  101. mkdir -p /home/kiosk/.vnc
  102. rm -f /home/kiosk/.vnc/passwd # Remove existing password file if it exists
  103. echo "$vnc_password" | vncpasswd -f > /home/kiosk/.vnc/passwd
  104. chmod 600 /home/kiosk/.vnc/passwd
  105. # Write the script with properly formatted commands
  106. cat > /home/kiosk/start.sh <<EOF
  107. #!/bin/bash
  108. /usr/bin/chromium --no-first-run --disable-translate --no-default-browser-check --disable-cache --kiosk $website
  109. EOF
  110. chmod a+x /home/kiosk/start.sh
  111. }
  112. # Helper function to configure start.sh for multiple tabs
  113. configure_tabs() {
  114. local scaling_factor=$1
  115. local vnc_password=$2
  116. shift 2 # Remove the first two arguments (scaling factor and VNC password) to get URLs
  117. local tab_urls=""
  118. for url in "$@"; do
  119. tab_urls+="'$url' " # Ensure URLs are properly quoted
  120. done
  121. mkdir -p /home/kiosk/.vnc
  122. rm -f /home/kiosk/.vnc/passwd # Remove existing password file if it exists
  123. echo "$vnc_password" | vncpasswd -f > /home/kiosk/.vnc/passwd
  124. chmod 600 /home/kiosk/.vnc/passwd
  125. # Write the script with properly formatted commands
  126. cat > /home/kiosk/start.sh <<EOF
  127. #!/bin/bash
  128. /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 &
  129. sleep 10 # Allow time for Chromium to launch
  130. # Function definitions should be placed before they are called
  131. switch_tabs() {
  132. WINDOW_ID=\$(xdotool search --onlyvisible --class chromium | head -n 1)
  133. xdotool windowactivate --sync \$WINDOW_ID
  134. xdotool key --window \$WINDOW_ID ctrl+Tab
  135. }
  136. is_vnc_active() {
  137. netstat -an | grep ':5901' | grep -q 'ESTABLISHED'
  138. return \$?
  139. }
  140. # Main loop to handle tab switching
  141. while true; do
  142. if is_vnc_active; then
  143. echo "VNC session active, pausing tab switch..."
  144. sleep 5
  145. else
  146. echo "VNC session inactive, switching tabs..."
  147. switch_tabs
  148. sleep 30
  149. fi
  150. done
  151. EOF
  152. chmod a+x /home/kiosk/start.sh
  153. }
  154. # Function to edit .bashrc for automatic start of X session
  155. edit_bashrc() {
  156. echo '[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec startx' >> /home/$USER/.bashrc
  157. }
  158. # Check for help option
  159. if [[ "$1" == "-h" || "$1" == "--help" ]]; then
  160. echo "Usage: $0 [--auto <distro> <scaling_factor> <vnc_password> <url1> [<url2> ... <urlN>]]"
  161. echo "Options:"
  162. echo " --auto Run the script in automatic mode with no user interaction."
  163. echo " Requires specifying the distribution ('debian' or 'raspberry'),"
  164. echo " scaling factor (e.g., '1' for 1080p, '2' for 4K), VNC password,"
  165. echo " and at least one URL. Additional URLs are optional and will open in new tabs."
  166. echo " -h, --help Display this help and exit."
  167. echo ""
  168. echo "Example:"
  169. echo " $0 --auto debian 1 myvncpassword \"https://www.example.com\""
  170. echo " $0 --auto raspberry 2 myvncpassword \"https://www.example1.com\" \"https://www.example2.com\""
  171. exit 0
  172. fi
  173. # Automated or interactive mode check
  174. if [[ $1 == "--auto" ]]; then
  175. distro=$2
  176. shift 2 # Remove the first two arguments (script name and distro) for URLs, scaling factor, and VNC password
  177. scaling_factor=$1
  178. vnc_password=$2
  179. shift 2 # Remove the scaling factor and VNC password to get URLs
  180. [[ $distro == "debian" ]] && install_packages_debian
  181. [[ $distro == "raspberry" ]] && install_packages_raspberry
  182. configure_xinitrc
  183. configure_start_sh $scaling_factor $vnc_password "$@"
  184. configure_autologin --auto
  185. edit_bashrc
  186. else
  187. 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
  188. # Main menu for guided installation
  189. current_step=1
  190. while true; do
  191. case $current_step in
  192. 1)
  193. install_packages
  194. ;;
  195. 2)
  196. configure_xinitrc
  197. ;;
  198. 3)
  199. configure_start_sh
  200. ;;
  201. 4)
  202. configure_autologin
  203. ;;
  204. 5)
  205. edit_bashrc
  206. ;;
  207. 6)
  208. break
  209. ;;
  210. *)
  211. echo "Invalid option. Try another one." >&2
  212. ;;
  213. esac
  214. # Automatically proceed to the next step if the previous step was successful
  215. if [ $? -eq 0 ]; then
  216. current_step=$((current_step + 1))
  217. if [ $current_step -gt 5 ]; then
  218. current_step=6
  219. fi
  220. else
  221. dialog --title "Error" --msgbox "An error occurred. Please check the output and try again." 10 50
  222. fi
  223. # Exit the loop if the last step is completed
  224. if [ $current_step -eq 6 ]; then
  225. break
  226. fi
  227. done
  228. 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
  229. fi
  230. clear