mirror of
https://github.com/trycua/computer.git
synced 2025-12-30 18:09:55 -06:00
Fix shared on-logon.sh execution
This commit is contained in:
@@ -118,6 +118,41 @@ docker run -it --rm \
|
||||
|
||||
With this setup, any files you place in the `shared` folder on your Mac will be accessible from within the macOS VM, and vice versa.
|
||||
|
||||
## Automating VM Startup with on-logon.sh
|
||||
|
||||
You can automatically run scripts when the VM starts up by placing an `on-logon.sh` script in the shared folder's lifecycle directory. This is useful for setting up your VM environment each time it starts.
|
||||
|
||||
```bash
|
||||
# Create the lifecycle directory in your shared folder
|
||||
mkdir -p shared/lifecycle
|
||||
|
||||
# Create a sample on-logon.sh script
|
||||
cat > shared/lifecycle/on-logon.sh << 'EOF'
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Create a file on the desktop
|
||||
echo "Hello from Lumier!" > /Users/lume/Desktop/hello_lume.txt
|
||||
|
||||
# You can add more commands to execute at VM startup
|
||||
# For example:
|
||||
# - Configure environment variables
|
||||
# - Start applications
|
||||
# - Mount network drives
|
||||
# - Set up development environments
|
||||
EOF
|
||||
|
||||
# Make the script executable
|
||||
chmod +x shared/lifecycle/on-logon.sh
|
||||
```
|
||||
|
||||
The script will be automatically executed when the VM starts up. It runs in the VM context and has access to:
|
||||
|
||||
- The `/Users/lume` user directory (home directory in the VM)
|
||||
- The shared folder at `/Volumes/My Shared Files` inside the VM
|
||||
- Any resources available to the VM
|
||||
|
||||
This feature enables automation of VM setup without modifying the base VM image.
|
||||
|
||||
## Using Docker Compose
|
||||
|
||||
You can also use Docker Compose to run Lumier with a simple configuration file. Create a `docker-compose.yml` file with the following content:
|
||||
|
||||
@@ -112,7 +112,7 @@ if [ -n "${VNC_PORT:-}" ] && [ -n "${VNC_PASSWORD:-}" ]; then
|
||||
${NOVNC_PATH}/utils/novnc_proxy --vnc host.docker.internal:${VNC_PORT} --listen 8006 --web ${NOVNC_PATH} > /dev/null 2>&1 &
|
||||
NOVNC_PID=$!
|
||||
disown $NOVNC_PID
|
||||
echo "noVNC interface available at: http://localhost:PORT/vnc.html?password=${VNC_PASSWORD}&autoconnect=true (replace PORT with the port you forwarded to 8006)"
|
||||
echo "noVNC interface available at: http://localhost:8006/vnc.html?password=${VNC_PASSWORD}&autoconnect=true (replace PORT with the port you forwarded to 8006)"
|
||||
fi
|
||||
|
||||
echo "Lumier is running. Press Ctrl+C to stop."
|
||||
|
||||
@@ -5,53 +5,56 @@
|
||||
# $2: HOST_SHARED_PATH (Path inside VM where host shared dir is mounted, e.g., /Volumes/My Shared Files)
|
||||
|
||||
VNC_PASSWORD="$1"
|
||||
HOST_SHARED_PATH="$2"
|
||||
|
||||
# Define the path to the user's optional on-logon script within the shared folder
|
||||
USER_ON_LOGON_SCRIPT_PATH="$HOST_SHARED_PATH/lifecycle/on-logon.sh"
|
||||
# IMPORTANT: In the VM, the shared folder is always mounted at this fixed location
|
||||
HOST_SHARED_PATH="/Volumes/My Shared Files"
|
||||
|
||||
# Set default value for VNC_DEBUG if not provided
|
||||
VNC_DEBUG=${VNC_DEBUG:-0}
|
||||
|
||||
# Only show debug logs if VNC_DEBUG is enabled
|
||||
# Define the path to the user's optional on-logon script within the shared folder
|
||||
USER_ON_LOGON_SCRIPT_PATH="$HOST_SHARED_PATH/lifecycle/on-logon.sh"
|
||||
|
||||
# Show basic information when debug is enabled
|
||||
if [ "$VNC_DEBUG" = "1" ]; then
|
||||
echo "[Remote] Lumier entry point script starting..."
|
||||
echo "[Remote] Checking for user script at: $USER_ON_LOGON_SCRIPT_PATH"
|
||||
echo "[VM] Lumier lifecycle script starting"
|
||||
echo "[VM] Looking for user script: $USER_ON_LOGON_SCRIPT_PATH"
|
||||
fi
|
||||
|
||||
# Check if the user-provided script exists
|
||||
if [ -f "$USER_ON_LOGON_SCRIPT_PATH" ]; then
|
||||
# Only show debug logs if VNC_DEBUG is enabled
|
||||
if [ "$VNC_DEBUG" = "1" ]; then
|
||||
echo "[Remote] Found user script. Making executable and running..."
|
||||
echo "[VM] Found user script: $USER_ON_LOGON_SCRIPT_PATH"
|
||||
fi
|
||||
|
||||
# Always show what script we're executing
|
||||
echo "[VM] Executing user lifecycle script"
|
||||
|
||||
# Make script executable
|
||||
chmod +x "$USER_ON_LOGON_SCRIPT_PATH"
|
||||
|
||||
# Execute the user script in a subshell, passing VNC password and shared path as arguments
|
||||
"$USER_ON_LOGON_SCRIPT_PATH" "$VNC_PASSWORD" "$HOST_SHARED_PATH"
|
||||
|
||||
# Capture exit code (optional, but good practice)
|
||||
|
||||
# Execute the user script in a subshell with error output captured
|
||||
"$USER_ON_LOGON_SCRIPT_PATH" "$VNC_PASSWORD" "$HOST_SHARED_PATH" 2>&1
|
||||
|
||||
# Capture exit code
|
||||
USER_SCRIPT_EXIT_CODE=$?
|
||||
|
||||
# Only show debug logs if VNC_DEBUG is enabled
|
||||
if [ "$VNC_DEBUG" = "1" ]; then
|
||||
echo "[Remote] User script finished with exit code: $USER_SCRIPT_EXIT_CODE."
|
||||
# Always report script execution results
|
||||
if [ $USER_SCRIPT_EXIT_CODE -eq 0 ]; then
|
||||
echo "[VM] User lifecycle script completed successfully"
|
||||
else
|
||||
echo "[VM] User lifecycle script failed with exit code: $USER_SCRIPT_EXIT_CODE"
|
||||
fi
|
||||
|
||||
# Check results (only in debug mode)
|
||||
if [ "$VNC_DEBUG" = "1" ]; then
|
||||
# List any files created by the script
|
||||
echo "[VM] Files created by user script:"
|
||||
ls -la /Users/lume/Desktop/hello_*.txt 2>/dev/null || echo "[VM] No script-created files found"
|
||||
fi
|
||||
|
||||
# Propagate the exit code if non-zero (optional)
|
||||
# if [ $USER_SCRIPT_EXIT_CODE -ne 0 ]; then
|
||||
# exit $USER_SCRIPT_EXIT_CODE
|
||||
# fi
|
||||
else
|
||||
# Only show debug logs if VNC_DEBUG is enabled
|
||||
if [ "$VNC_DEBUG" = "1" ]; then
|
||||
echo "[Remote] No user-provided on-logon script found at $USER_ON_LOGON_SCRIPT_PATH. Skipping."
|
||||
echo "[VM] No user lifecycle script found"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Only show debug logs if VNC_DEBUG is enabled
|
||||
if [ "$VNC_DEBUG" = "1" ]; then
|
||||
echo "[Remote] Lumier entry point script finished."
|
||||
fi
|
||||
exit 0 # Ensure the entry point script exits cleanly if no user script or user script succeeded
|
||||
exit 0 # Ensure the entry point script exits cleanly
|
||||
|
||||
@@ -62,9 +62,11 @@ execute_remote_script() {
|
||||
echo "VNC password exported to VM: $vnc_password"
|
||||
fi
|
||||
|
||||
# Set a default mount point for data in the VM if data_folder is provided
|
||||
# Set the shared folder path for the VM
|
||||
if [ -n "$data_folder" ]; then
|
||||
# VM always sees shared folders at this path, regardless of container path
|
||||
shared_folder_path="/Volumes/My Shared Files"
|
||||
|
||||
# Only show path in debug mode
|
||||
if [ "${LUMIER_DEBUG:-0}" == "1" ]; then
|
||||
echo "Data folder path in VM: $shared_folder_path"
|
||||
@@ -104,10 +106,18 @@ execute_remote_script() {
|
||||
fi
|
||||
|
||||
# Use a here-document to send the script content
|
||||
# Add -q for completely silent operation, redirect stderr to /dev/null
|
||||
sshpass -p "$password" ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR "$user@$host" "bash -s -- '$vnc_password' '$data_folder'" 2>/dev/null <<EOF
|
||||
# We'll capture both stdout and stderr when debug is enabled
|
||||
if [[ "${LUMIER_DEBUG:-0}" == "1" ]]; then
|
||||
echo "[DEBUG] Connecting to $user@$host to execute script..."
|
||||
sshpass -p "$password" ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR "$user@$host" "bash -s -- '$vnc_password' '$data_folder'" 2>&1 <<EOF
|
||||
$script_content
|
||||
EOF
|
||||
else
|
||||
# Otherwise run quietly
|
||||
sshpass -p "$password" ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR "$user@$host" "bash -s -- '$vnc_password' '$data_folder'" 2>/dev/null <<EOF
|
||||
$script_content
|
||||
EOF
|
||||
fi
|
||||
|
||||
# Print completion message only in debug mode
|
||||
if [[ "${LUMIER_DEBUG:-0}" == "1" ]]; then
|
||||
|
||||
@@ -104,11 +104,19 @@ start_vm() {
|
||||
|
||||
# Execute on-logon.sh if present
|
||||
on_logon_script="/run/lifecycle/on-logon.sh"
|
||||
# Use HOST_SHARED_PATH which is set earlier in the script
|
||||
if [[ "${LUMIER_DEBUG:-0}" == "1" ]]; then
|
||||
echo "Executing on-logon.sh on VM..."
|
||||
|
||||
# Only show detailed logs in debug mode
|
||||
if [ "${LUMIER_DEBUG:-0}" == "1" ]; then
|
||||
echo "Running on-logon.sh hook script on VM..."
|
||||
fi
|
||||
|
||||
# Check if script exists
|
||||
if [ ! -f "$on_logon_script" ]; then
|
||||
echo "Warning: on-logon.sh hook script not found at $on_logon_script"
|
||||
else
|
||||
# Execute the remote script
|
||||
execute_remote_script "$vm_ip" "$HOST_USER" "$HOST_PASSWORD" "$on_logon_script" "$VNC_PASSWORD" "$HOST_SHARED_PATH"
|
||||
fi
|
||||
execute_remote_script "$vm_ip" "$HOST_USER" "$HOST_PASSWORD" "$on_logon_script" "$VNC_PASSWORD" "$HOST_SHARED_PATH"
|
||||
}
|
||||
|
||||
# Get VM information using curl
|
||||
|
||||
Reference in New Issue
Block a user