112 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Bash
		
	
	
|  | #!/bin/bash
 | ||
|  | 
 | ||
|  | # Based on: http://www.richud.com/wiki/Ubuntu_Fluxbox_GUI_with_x11vnc_and_Xvfb | ||
|  | 
 | ||
|  | main() { | ||
|  |     log_i "Starting xvfb virtual display..." | ||
|  |     launch_xvfb | ||
|  |     log_i "Starting window manager..." | ||
|  |     launch_window_manager | ||
|  |     log_i "Starting VNC server..." | ||
|  |     run_vnc_server | ||
|  | } | ||
|  | 
 | ||
|  | launch_xvfb() { | ||
|  |     local xvfbLockFilePath="/tmp/.X1-lock" | ||
|  |     if [ -f "${xvfbLockFilePath}" ] | ||
|  |     then | ||
|  |         log_i "Removing xvfb lock file '${xvfbLockFilePath}'..." | ||
|  |         if ! rm -v "${xvfbLockFilePath}" | ||
|  |         then | ||
|  |             log_e "Failed to remove xvfb lock file" | ||
|  |             exit 1 | ||
|  |         fi | ||
|  |     fi | ||
|  | 
 | ||
|  |     # Set defaults if the user did not specify envs. | ||
|  |     export DISPLAY=${XVFB_DISPLAY:-:1} | ||
|  |     local screen=${XVFB_SCREEN:-0} | ||
|  |     local resolution=${XVFB_RESOLUTION:-1280x960x24} | ||
|  |     local timeout=${XVFB_TIMEOUT:-5} | ||
|  | 
 | ||
|  |     # Start and wait for either Xvfb to be fully up or we hit the timeout. | ||
|  |     Xvfb ${DISPLAY} -screen ${screen} ${resolution} & | ||
|  |     local loopCount=0 | ||
|  |     until xdpyinfo -display ${DISPLAY} > /dev/null 2>&1 | ||
|  |     do | ||
|  |         loopCount=$((loopCount+1)) | ||
|  |         sleep 1 | ||
|  |         if [ ${loopCount} -gt ${timeout} ] | ||
|  |         then | ||
|  |             log_e "xvfb failed to start" | ||
|  |             exit 1 | ||
|  |         fi | ||
|  |     done | ||
|  | } | ||
|  | 
 | ||
|  | launch_window_manager() { | ||
|  |     local timeout=${XVFB_TIMEOUT:-5} | ||
|  | 
 | ||
|  |     # Start and wait for either fluxbox to be fully up or we hit the timeout. | ||
|  |     fluxbox & | ||
|  |     local loopCount=0 | ||
|  |     until wmctrl -m > /dev/null 2>&1 | ||
|  |     do | ||
|  |         loopCount=$((loopCount+1)) | ||
|  |         sleep 1 | ||
|  |         if [ ${loopCount} -gt ${timeout} ] | ||
|  |         then | ||
|  |             log_e "fluxbox failed to start" | ||
|  |             exit 1 | ||
|  |         fi | ||
|  |     done | ||
|  | } | ||
|  | 
 | ||
|  | run_vnc_server() { | ||
|  |     local passwordArgument='-nopw' | ||
|  | 
 | ||
|  |     if [ -n "${VNC_SERVER_PASSWORD}" ] | ||
|  |     then | ||
|  |         local passwordFilePath="${HOME}/.x11vnc.pass" | ||
|  |         if ! x11vnc -storepasswd "${VNC_SERVER_PASSWORD}" "${passwordFilePath}" | ||
|  |         then | ||
|  |             log_e "Failed to store x11vnc password" | ||
|  |             exit 1 | ||
|  |         fi | ||
|  |         passwordArgument=-"-rfbauth ${passwordFilePath}" | ||
|  |         log_i "The VNC server will ask for a password" | ||
|  |     else | ||
|  |         log_w "The VNC server will NOT ask for a password" | ||
|  |     fi | ||
|  | 
 | ||
|  |     x11vnc -ncache 10 -ncache_cr -display ${DISPLAY} -forever ${passwordArgument} & | ||
|  |     wait $! | ||
|  | } | ||
|  | 
 | ||
|  | log_i() { | ||
|  |     log "[INFO] ${@}" | ||
|  | } | ||
|  | 
 | ||
|  | log_w() { | ||
|  |     log "[WARN] ${@}" | ||
|  | } | ||
|  | 
 | ||
|  | log_e() { | ||
|  |     log "[ERROR] ${@}" | ||
|  | } | ||
|  | 
 | ||
|  | log() { | ||
|  |     echo "[$(date '+%Y-%m-%d %H:%M:%S')] ${@}" | ||
|  | } | ||
|  | 
 | ||
|  | control_c() { | ||
|  |     echo "" | ||
|  |     exit | ||
|  | } | ||
|  | 
 | ||
|  | trap control_c SIGINT SIGTERM SIGHUP | ||
|  | 
 | ||
|  | main | ||
|  | 
 | ||
|  | exit |