Add ripcord/ripcord.sh
This commit is contained in:
parent
c67812cfdf
commit
4f314e0180
1 changed files with 79 additions and 0 deletions
79
ripcord/ripcord.sh
Normal file
79
ripcord/ripcord.sh
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
#!/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
|
Loading…
Add table
Add a link
Reference in a new issue