+ "value": "#!/bin/sh\nset -e\n\n# --- Configurable Settings ---\n\n# --- OPERATING MODE ---\n# Sets how the script should operate.\n# 'FULL_START': Checks dependencies, cleans up, and starts everything from scratch.\n# 'REFRESH' : Only terminates the current app and starts a new one.\n# 'CLEAN' : Terminates all processes and stops (shutdown).\nOPERATION_MODE=\"REFRESH\"\n\n# --- DEPENDENCY MANAGEMENT ---\n# If 'true', the script will try to install missing dependencies.\n# On Alpine, this requires root privileges (run as the root user).\nAUTO_INSTALL_DEPS=\"true\"\n\n# --- CONNECTION SETTINGS ---\nVNC_PASSWORD=\"p\"\nVNC_PORT=\"2999\"\nWEBSOCKET_PORT=\"6080\"\n\n# --- GRAPHICAL ENVIRONMENT SETTINGS ---\nRESOLUTION=\"1920x1080x24\"\nPID_FILE=\"/tmp/vnc_app.pid\" # File to store the running application's process ID\n\n# --- APPLICATION SETTINGS (CUSTOMIZE) ---\nPROGRAM_TO_RUN=\"chromium-browser --no-sandbox\"\nWINDOW_CLASS=\"Geany\"\nCENTER_WINDOW=\"true\"\n\n\n# --- SCRIPT LOGIC (DO NOT MODIFY BELOW THIS LINE) ---\n\n# Function for a full environment cleanup (uses pkill for Alpine)\ncleanup_all() {\n echo \"--- Full Cleanup: Terminating all VNC environment processes... ---\"\n # pkill -f searches the full command line, which is more reliable.\n pkill -f \"x11vnc -display :0\" || true\n pkill -f \"Xvfb :0\" || true\n pkill -f \"websockify.*localhost:${VNC_PORT}\" || true\n\n if [ -f \"$PID_FILE\" ]; then\n kill $(cat \"$PID_FILE\") || true\n rm -f \"$PID_FILE\"\n fi\n echo \"--- Cleanup complete. ---\"\n}\n\n# Function to install dependencies on Alpine Linux\ninstall_dependencies() {\n if [ \"$AUTO_INSTALL_DEPS\" != \"true\" ]; then\n echo \"--- Dependency check skipped (disabled by configuration). ---\"\n return\n fi\n\n if ! command -v apk >/dev/null; then\n echo \"WARNING: This script is configured for Alpine Linux (apk) but 'apk' was not found.\"\n return\n fi\n\n if [ \"$(id -u)\" -ne 0 ]; then\n echo \"ERROR: To install dependencies on Alpine, please run this script as the 'root' user.\"\n exit 1\n fi\n \n # APK dependencies: procps contains pkill, websockify\n APK_DEPS=\"xvfb x11vnc xdotool procps websockify\"\n PACKAGES_TO_INSTALL=\"\"\n echo \"--- Checking for required APK dependencies... ---\"\n for pkg in $APK_DEPS; do\n if ! apk info -e \"$pkg\" >/dev/null 2>&1; then\n echo \"Missing APK dependency: $pkg\"\n PACKAGES_TO_INSTALL=\"$PACKAGES_TO_INSTALL $pkg\"\n fi\n done\n\n if [ -n \"$PACKAGES_TO_INSTALL\" ]; then\n echo \"Missing APK dependencies found. Updating and installing with 'apk add'...\"\n apk update\n apk add --no-cache $PACKAGES_TO_INSTALL\n else\n echo \"All required APK dependencies are already installed.\"\n fi\n}\n\n# Function to start the application\nstart_and_center_app() {\n echo \"--- Starting application: ${PROGRAM_TO_RUN} ---\"\n nohup env DISPLAY=:0 ${PROGRAM_TO_RUN} &\n echo $! > \"$PID_FILE\"\n if [ \"$CENTER_WINDOW\" = \"true\" ]; then\n echo \"--- Attempting to center the window (Class: ${WINDOW_CLASS}) ---\"\n sleep 3\n WINDOW_ID=$(xdotool search --onlyvisible --class \"${WINDOW_CLASS}\" | head -n 1)\n if [ -n \"$WINDOW_ID\" ]; then\n eval $(xdotool getwindowgeometry --shell $WINDOW_ID)\n SCREEN_WIDTH=$(echo $RESOLUTION | cut -d'x' -f1)\n SCREEN_HEIGHT=$(echo $RESOLUTION | cut -d'x' -f2)\n POS_X=$(( (SCREEN_WIDTH - WIDTH) / 2 ))\n POS_Y=$(( (SCREEN_HEIGHT - HEIGHT) / 2 ))\n xdotool windowmove $WINDOW_ID $POS_X $POS_Y\n echo \"Window (ID: $WINDOW_ID) centered.\"\n else\n echo \"WARNING: Could not find window with class '${WINDOW_CLASS}'.\"\n fi\n fi\n}\n\n# --- HANDLING OPERATING MODES ---\n# The main logic remains the same, but now relies on Alpine-compatible functions.\nif [ \"$OPERATION_MODE\" = \"CLEAN\" ]; then\n echo \"--- OPERATING MODE: CLEAN ---\"\n cleanup_all\n exit 0\n\nelif [ \"$OPERATION_MODE\" = \"REFRESH\" ]; then\n echo \"--- OPERATING MODE: REFRESH ---\"\n if [ -f \"$PID_FILE\" ]; then\n kill $(cat \"$PID_FILE\") || true\n rm -f \"$PID_FILE\"\n fi\n start_and_center_app\n echo \"--- Application updated. ---\"\n exit 0\n\nelif [ \"$OPERATION_MODE\" = \"FULL_START\" ]; then\n echo \"--- OPERATING MODE: FULL_START ---\"\n install_dependencies\n cleanup_all\n trap 'echo; cleanup_all; exit 0' INT TERM\n echo \"--- Starting base services... ---\"\n nohup Xvfb :0 -screen 0 ${RESOLUTION} &\n sleep 1\n nohup x11vnc -display :0 -forever -rfbport ${VNC_PORT} -passwd \"$VNC_PASSWORD\" &\n sleep 1\n nohup websockify --web /usr/share/novnc/ ${WEBSOCKET_PORT} localhost:${VNC_PORT} &\n sleep 1\n echo \"Servers started.\"\n start_and_center_app\n echo\n echo \">>> VNC environment started. <<<\"\nelse\n echo \"ERROR: Invalid OPERATION_MODE. Choose 'FULL_START', 'REFRESH', or 'CLEAN'.\"\n exit 1\nfi"
0 commit comments