Files
jitty-scripts/sdtimeout.sh
T
molluskandClaude Opus 5.5 a08db0af96 New Script: sdtimeout.sh
Interactively set DefaultTimeoutStopSec in systemd's system.conf and
user.conf, then verify the change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 14:22:37 -04:00

154 lines
4.1 KiB
Bash
Executable File

#!/bin/bash
# sdtimeout.sh - Interactively set systemd stop job timeout
SYSTEM_CONF="/etc/systemd/system.conf"
USER_CONF="/etc/systemd/user.conf"
SETTING="DefaultTimeoutStopSec"
# Colors
LRED="\033[1;31m"
LGREEN="\033[1;32m"
YELLOW="\033[1;33m"
LCYAN="\033[1;36m"
BWHITE="\e[1m"
NC='\033[0m'
prompt_seconds() {
local label="$1"
local result_var="$2"
local val
while true; do
echo -e -n "\n${YELLOW}${label}${NC}"
read val
if [ -z "${val}" ]; then
echo -e "${LRED}Please enter a value.${NC}"
continue
fi
if [[ ! "${val}" =~ ^[0-9]+$ ]]; then
echo -e "${LRED}'${val}' is not a valid number of seconds.${NC}"
continue
fi
if [ "${val}" -lt 1 ]; then
echo -e "${LRED}Value must be at least 1 second.${NC}"
continue
fi
eval "${result_var}=${val}"
break
done
}
set_timeout_in_file() {
local file="$1"
local seconds="$2"
local new_line="${SETTING}=${seconds}s"
if grep -qE "^#?[[:space:]]*${SETTING}=" "${file}" 2>/dev/null; then
sudo sed -i "s|^#\?[[:space:]]*${SETTING}=.*|${new_line}|" "${file}"
else
echo -e "\n[Manager]" | sudo tee -a "${file}" > /dev/null
echo "${new_line}" | sudo tee -a "${file}" > /dev/null
fi
}
verify_file() {
local file="$1"
local seconds="$2"
local match
match=$(grep -E "^${SETTING}=${seconds}s" "${file}" 2>/dev/null)
if [ -z "${match}" ]; then
echo -e "${LRED}Verification failed: '${SETTING}=${seconds}s' not found in ${file}${NC}"
return 1
fi
return 0
}
show_snippet() {
local file="$1"
local seconds="$2"
echo -e "\n${LCYAN}--- ${file} (context around change) ---${NC}"
grep -n -E "${SETTING}" "${file}"
}
# --- Main ---
echo -e "\n${BWHITE}systemd Stop Job Timeout Configurator${NC}"
echo -e "${LCYAN}--------------------------------------${NC}"
echo -e "This script sets ${BWHITE}${SETTING}${NC} in:"
echo -e " ${SYSTEM_CONF}"
echo -e " ${USER_CONF}\n"
prompt_seconds "System-wide stop job timeout in seconds (e.g. 90): " system_secs
prompt_seconds "User-scope stop job timeout in seconds (e.g. 90): " user_secs
echo -e "\n${YELLOW}System timeout will be set to: ${LGREEN}${system_secs}s${NC}"
echo -e "${YELLOW}User timeout will be set to: ${LGREEN}${user_secs}s${NC}"
echo -e "\n${YELLOW}Your password is required to edit systemd config files.${NC}"
echo -e "${YELLOW}Press Enter to continue or Ctrl+C to cancel.${NC}"
read
# Verify sudo works before proceeding
sudo -v
if [ $? -ne 0 ]; then
echo -e "\n${LRED}Authentication failed. Exiting.${NC}\n"
exit 1
fi
echo -e "\n${LCYAN}Applying changes...${NC}"
set_timeout_in_file "${SYSTEM_CONF}" "${system_secs}"
set_timeout_in_file "${USER_CONF}" "${user_secs}"
echo -e "\n${LCYAN}Verifying changes...${NC}"
errors=0
verify_file "${SYSTEM_CONF}" "${system_secs}"
[ $? -ne 0 ] && errors=$((errors + 1))
verify_file "${USER_CONF}" "${user_secs}"
[ $? -ne 0 ] && errors=$((errors + 1))
echo -e "\n${LCYAN}Checking systemd can parse the config...${NC}"
systemd-analyze cat-config systemd/system.conf > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo -e "${LRED}systemd-analyze reported an issue reading system.conf — please inspect manually.${NC}"
errors=$((errors + 1))
else
echo -e "${LGREEN}system.conf parsed OK by systemd.${NC}"
fi
systemd-analyze cat-config systemd/user.conf > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo -e "${LRED}systemd-analyze reported an issue reading user.conf — please inspect manually.${NC}"
errors=$((errors + 1))
else
echo -e "${LGREEN}user.conf parsed OK by systemd.${NC}"
fi
if [ "${errors}" -gt 0 ]; then
echo -e "\n${LRED}One or more changes could not be verified. Please check the files manually.${NC}\n"
exit 1
fi
echo -e "\n${LGREEN}All changes applied and verified successfully!${NC}"
show_snippet "${SYSTEM_CONF}" "${system_secs}"
show_snippet "${USER_CONF}" "${user_secs}"
echo -e "\n${LCYAN}Changes will take effect after the next reboot or:${NC}"
echo -e " ${BWHITE}sudo systemctl daemon-reexec${NC}\n"