summaryrefslogblamecommitdiffstats
path: root/core/modules/kiosk-chromium/data/opt/openslx/scripts/kiosk-launch.d/00-chromium
blob: 4f5ba84e1b85a210aa65cb13e6782c617af0b418 (plain) (tree)
1
2
3
4
5
6
7
8
                      

                                            


                                        
 
                                  



                                                 
 


                                                    





                                                             

                                                              
                  
                   
                      
                              

                                                
                                                                                                                            
                                                                                
                     

                                          

 




















                                                                         
                 



                    

                            
                                                                                                                                             
 





                                                                              
 




                                                      

  




                                   
                                                                               

  
                                                                                  
         

                                                
            













                                                                                                 
                     

                                                                                  
                      



                                                                                        
                                                                                                  


                                                                                             
                                                                 
                                                            
                                      


                                                             
                                                    
                                                                           

                                                                        
                                        




                                                   
                                                                      
                                    
                  
                                    
                                                                           

                                      

            
  
 

                                                                                         

  


                                          

                                     
                          
                                   
                                           
#!/bin/bash -- sourced
# prepares and run chromium as kiosk browser

command -v chromium \
	|| command -v chromium-browser \
	|| return 0

# clear state of previous sessions
if [ "$(whoami)" = "demo" ]; then
	rm -rf -- "$HOME/.config/chromium"
	mkdir -p "$HOME/.config/chromium/Default"
fi

cert_to_nssdb /etc/ssl/certs/ "${HOME}/.pki/nssdb" &
nss_pid=$!

# Helper to decode URL-encoded strings
# e.g. urldecode http%3A%2F%2Ffoobar.com -> http://foobar.com
urldecode() {
	: "${*//+/ }"; echo -e "${_//%/\\x}"
}

# Helper to json'ize bookmarks given as arguments in the form:
#    <name>,<url>  ->  e.g. Google,https://www.google.com
json_bookmarks() {
	local cur=0
	local name url
	while [ $# -ne 0 ]; do
		name="$( urldecode "${1%%,*}" )"
		url="$( urldecode "${1#*,}" )"
		jq --null-input --join-output --compact-output --arg id "$(( cur++ ))" --arg name "$name" --arg url "$url" \
			'{"id": $id, "type": "url", "name": $name, "url": $url}'
		shift
		[ $# -ne 0 ] && printf ","
	done
}

# Pass SLX_BROWSER_BOOKMARKS without quotes for splitting into arguments
cat > "$HOME/.config/chromium/Default/Bookmarks" <<EOF
{
	"roots": {
		"bookmark_bar": {
		"children": [ $(json_bookmarks $SLX_BROWSER_BOOKMARKS) ],
			"id": "1",
			"name": "Lesezeichenleiste",
			"type": "folder"
		},
		"other": {
			"children": [  ],
			"id": "2",
			"name": "Weitere Lesezeichen",
			"type": "folder"
		},
		"synced": {
			"children": [  ],
			"id": "3",
			"name": "Mobile Lesezeichen",
			"type": "folder"
		}
	},
	"version": 1
}
EOF

# default chromium arguments
chromium_args=("--noerrdialogs" "--disable-translate" "--disable-new-avatar-menu" "--disable-infobars" "--test-type" "--fast" "--fast-start")

# simulate a future build date to remove those update notification
# TODO properly disable auto update feature when chromium supports it
chromium_args+=("--simulate-outdated-no-au=\"Tue, 31 Dec 2099 23:59:59 GMT\"")

# default to maximized on startup
chromium_args+=("--start-maximized")

if [ -z "$SLX_BROWSER_INTERACTIVE" ]; then
	if [ -n "${SLX_AUTOLOGIN%OFF}" ]; then
		# Autologin active, go full fullscreen
		chromium_args+=("--kiosk")
	fi
fi

if [ -n "$SLX_BROWSER_ZOOM" ]; then
	v="${SLX_BROWSER_ZOOM}"
	while [ "${#v}" -lt 3 ]; do
		v="0$v"
	done
	chromium_args+=( "--force-device-scale-factor=${v:0:-2}.${v:${#v}-2}" )
fi

if [ -n "$SLX_BROWSER_RELOAD_SECS" ] && [ "$SLX_BROWSER_RELOAD_SECS" -gt 0 ]; then
	(
	# Wake up to force refresh
	idle-daemon --send 'get :0' &> /dev/null
	wid=
	while [ -z "$wid" ]; do
		sleep 1
		[ -z "$wid" ] && wid="$( xdotool search --onlyvisible --class chromium-browser )"
		[ -z "$wid" ] && wid="$( xdotool search --onlyvisible --class chromium )"
		[ -z "$wid" ] && wid="$( xdotool search --onlyvisible --class browser )"
	done
	readonly wid
	wpid="$( xprop -id "$wid" | awk '$1 == "_NET_WM_PID(CARDINAL)" {print $3}' )"
	if [ -z "$wpid" ]; then
		# logs to ~/.xsession-errors
		echo "Failed to get the pid of chromium-browser via xprop..."
		exit 1
	fi
	readonly wpid
	activity=init
	last="$(idle-daemon --send 'get :0' | grep -oP '(?<=idleSeconds=)[0-9]+')"
	sleep 1
	while true; do
		if [ ! -d "/proc/$wpid" ]; then
			echo "Process with PID $wpid stopped, exiting auto-reload loop."
			exit 0
		fi
		current_idle="$(idle-daemon --send 'get :0' | grep -oP '(?<=idleSeconds=)[0-9]+')"
		if (( current_idle >= SLX_BROWSER_RELOAD_SECS )); then
			if [ "$activity" = "yes" ] && [ -n "$SLX_BROWSER_INTERACTIVE" ]; then
				# activity was seen, interactive browser (UI) -> kill session
				killall chromium-browser chromium
				loginctl terminate-user demo
				exit 0
			else
				xdotool windowactivate "$wid"
				xdotool key Alt+Home
				last="$current_idle"
				sleep "$(( SLX_BROWSER_RELOAD_SECS - 10 ))"
				# Wake up to force refresh
				idle-daemon --send 'get :0' &> /dev/null
				sleep 10
				activity=init
				continue
			fi
		elif [ "$activity" = "init" ]; then
			activity=no
		elif [ -n "$last" ] && (( last > current_idle )); then
			activity=yes
		fi
		last="$current_idle"
		num="$(( SLX_BROWSER_RELOAD_SECS - ( current_idle + 5 ) ))"
		(( num < 1 )) && num=1
		sleep "$num"
	done
	) &
fi

if [ -n "$SLX_BROWSER_INSECURE" ]; then
	chromium_args+=("--allow-running-insecure-content" "--ignore-certificate-errors")
fi

# Wait until cert store is fully populated
wait $nss_pid

chromium_args+=( "$SLX_BROWSER_URL" )

# finally exec to chromium
exec chromium "${chromium_args[@]}"
exec chromium-browser "${chromium_args[@]}"