#!/bin/sh # ============================================================================== # Ripcord - Your server's last-ditch emergency disk space release. # # This script runs once on first boot to create a large "ballast" file. # Deleting this file in an emergency frees up critical disk space. # The data is from /dev/urandom to ensure it is not compressible by ZFS/lz4. # ============================================================================== # --- Configuration --- # Percentage of the total root filesystem size to use for the emergency file. PERCENTAGE=5 # The emergency file. The name itself is the instruction. # It contains the project name for easy identification. TARGET_FILE="/RIPCORD_EMERGENCY_DELETE_FOR_DISK_SPACE.dat" # A flag file to ensure this script only ever runs once. FLAG_FILE="/var/log/ripcord-deployed.flag" # --- Script Logic --- # Function to log messages with a timestamp log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" } # 1. Check if Ripcord has already been deployed if [ -f "$FLAG_FILE" ]; then log "Ripcord has already been deployed. Exiting." exit 0 fi log "--- Deploying Ripcord ---" # 2. Create the emergency ballast file if [ -f "$TARGET_FILE" ]; then log "Warning: Ripcord target file '$TARGET_FILE' already exists. Skipping creation." else log "Preparing to create Ripcord ballast file at '$TARGET_FILE'." # Get total size of '/' in Kilobytes using the POSIX standard format. total_kb=$(df -Pk / | tail -1 | awk '{print $2}') if [ -z "$total_kb" ]; then log "Error: Could not determine total disk size for '/'." exit 1 fi log "Total size of root filesystem: ${total_kb} KB." # Calculate the target file size in Kilobytes. target_size_kb=$(( (total_kb * PERCENTAGE) / 100 )) log "Target ballast file size will be ${PERCENTAGE}% of total: ${target_size_kb} KB." # Use dd to create the file from /dev/urandom. # This data is uncompressible, which is critical for filesystems like ZFS. log "Creating file from /dev/urandom... This may take a significant amount of time." dd if=/dev/urandom of="$TARGET_FILE" bs=1024 count="$target_size_kb" status=none 2>/dev/null if [ $? -eq 0 ]; then log "Successfully created '$TARGET_FILE'." else log "Error: dd command failed to create '$TARGET_FILE'." rm -f "$TARGET_FILE" # Clean up partial file on failure exit 1 fi fi # 3. Create the flag file to prevent this script from running again log "Creating deployment flag at '$FLAG_FILE'." touch "$FLAG_FILE" log "--- Ripcord deployment complete ---" exit 0