#!/bin/bash # Script to set the hostname in the k3os config.yaml file. # It handles the read-only filesystem constraint of a running k3OS system. # Define the path to the config file and the mount point CONFIG_FILE="/k3os/system/config.yaml" CONFIG_DIR="/k3os/system" # --- Function to get user input --- get_hostname_input() { while true; do read -r -p "Enter the desired new hostname: " NEW_HOSTNAME if [ -n "$NEW_HOSTNAME" ]; then break else echo "Error: Hostname cannot be empty. Please enter a valid name." fi done } # --- Function to modify the config file --- set_hostname() { local NEW_HOSTNAME="$1" # Note the two spaces for YAML indentation under 'k3os:' local HOSTNAME_ENTRY=" hostname: $NEW_HOSTNAME" echo "Attempting to set hostname to: **$NEW_HOSTNAME**" echo "Config file location: **$CONFIG_FILE**" # 1. Remount the filesystem as read/write (rw) echo "Attempting to remount $CONFIG_DIR as read/write..." if ! mount -o remount,rw "$CONFIG_DIR"; then echo "Error: Failed to remount $CONFIG_DIR as read/write. Aborting." exit 1 fi echo "Filesystem successfully remounted as read/write." # 2. Modify the config file (same logic as before) if ! grep -q "^k3os:" "$CONFIG_FILE"; then echo "'k3os:' block not found. Appending the block and hostname." echo -e "\nk3os:\n$HOSTNAME_ENTRY" >> "$CONFIG_FILE" elif grep -q "^k3os:" "$CONFIG_FILE" && grep -q "^\s\+hostname:" "$CONFIG_FILE"; then echo "Existing hostname found. Replacing the entry." sed -i "/^\s*hostname:/c\\$HOSTNAME_ENTRY" "$CONFIG_FILE" else echo "'k3os:' block found, but no hostname entry. Appending the entry." sed -i "/^k3os:/a\\$HOSTNAME_ENTRY" "$CONFIG_FILE" fi local MODIFICATION_STATUS=$? # 3. Remount the filesystem back to read-only (ro) echo "Remounting $CONFIG_DIR back to read-only..." if ! mount -o remount,ro "$CONFIG_DIR"; then echo "Warning: Failed to remount $CONFIG_DIR back to read-only. Proceeding..." fi echo -e "$HOSTNAME_ENTRY" > /var/lib/rancher/k3os/hostname # 4. Report status if [ $MODIFICATION_STATUS -eq 0 ]; then echo "" echo "Successfully updated the hostname in $CONFIG_FILE." echo "The change will take effect after a **reboot**." echo "" echo "--- Verification (Hostname line only) ---" grep -E "^\s*hostname:" "$CONFIG_FILE" else echo "Error: Failed to modify $CONFIG_FILE during step 2." exit 1 fi } # --- Main execution --- get_hostname_input set_hostname "$NEW_HOSTNAME"