dotfiles/bin/actions/startup.sh
Menno van Leeuwen 6ef26ed9bd
chore: add logging to startup scripts
chore: changed hotkey startup to x-terminal directly
2024-08-27 21:52:57 +02:00

112 lines
3.7 KiB
Bash
Executable File

#!/usr/bin/env zsh
source $HOME/dotfiles/bin/helpers/functions.sh
countdown() {
for i in $(seq $1 -1 1); do
printfe "%s" "green" " - Waiting for $i seconds... "
echo -en "\r"
sleep 1
done
}
run_startup_scripts() {
logo continue
echo ""
local time_of_day
# Time of day (morning, afternoon, evening, night)
case $(date +%H) in
0[0-9]|1[0-1])
time_of_day="morning"
emoji="🌅"
;;
1[2-7])
time_of_day="afternoon"
emoji="🌞"
;;
1[8-9]|2[0-3])
time_of_day="evening"
emoji="🌆"
;;
esac
printfe "%s" "cyan" "Hi $(whoami), good $time_of_day! $emoji"
echo ""
# Initialize array to hold commands
local startup_commands=()
# Read each command key and add it to the array
while IFS= read -r command; do
startup_commands+=("$command")
done < <(cat $HOME/dotfiles/config/config.yaml | shyaml keys config.startup.commands)
# Read delay and delay_between_ms values from YAML
local delay=$(cat $HOME/dotfiles/config/config.yaml | shyaml get-value config.startup.delay)
local delay_between_ms=$(cat $HOME/dotfiles/config/config.yaml | shyaml get-value config.startup.delay_between_ms)
printfe "%s\n" "cyan" "Running startup commands... (delay: $delay s, delay_between: $delay_between_ms ms)"
# Wait for the initial delay
countdown $delay
# Ensure the log folder exists
mkdir -p $HOME/dotfiles/logs/startup
# Execute each command in a new screen window
for command_key in "${startup_commands[@]}"; do
local command=$(cat $HOME/dotfiles/config/config.yaml | shyaml get-value config.startup.commands.$command_key)
printfe "%s" "green" " - Running '"
printfe "%s" "blue" "$command_key"
printfe "%s" "green" "'... ("
printfe "%s" "blue" "$command"
printfe "%s\n" "green" ")"
# Check if a screen with the same name already exists, if so log it and don't run the command
if screen -list | grep -q $command_key; then
printfe "%s" "red" " - Screen session already exists: "
printfe "%s" "blue" "$command_key"
printfe "%s\n" "red" ""
continue
fi
# Ensure the log file exists, if it exists, clear it
touch $HOME/dotfiles/logs/startup/$command_key.log
# Run the command in a new screen session named after the command_key
screen -dmS $command_key zsh -c "eval $command > $HOME/dotfiles/logs/startup/$command_key.log 2>&1"
sleep $(echo "scale=2; $delay_between_ms / 1000" | bc)
if ! screen -list | grep -q $command_key; then
printfe "%s" "red" " - Screen session died immediately: "
printfe "%s" "blue" "$command_key"
printfe "%s\n" "red" " (Within $delay_between_ms ms, check the logs for more information in $HOME/dotfiles/logs/startup/$command_key.log)"
continue
fi
# Check if command is ok, if not log that it failed
if [ $? -ne 0 ]; then
printfe "%s" "red" " - Command failed: "
printfe "%s" "blue" "$command"
printfe "%s\n" "red" ""
fi
done
}
# Check if we're in a graphical session
if [[ -z "$DISPLAY" && "$XDG_SESSION_TYPE" != "x11" && "$XDG_SESSION_TYPE" != "wayland" ]]; then
echo "Not in a graphical session. Exiting."
exit 0
fi
run_startup_scripts
echo ""
printfe "%s" "green" "Something went wrong? Check the logs in $HOME/dotfiles/logs/startup/ for more information."
echo ""
# Show message to press any key to close the terminal window
printfe "%s\n" "green" "Press any key to close this window..."
read -s -n 1
exit 0