Files
q-tools/shell/cron-user-run
2024-11-26 20:09:34 +02:00

121 lines
2.6 KiB
Bash
Executable File

#!/bin/bash
_helpexit() {
echo "# Example cron:"
_get_cron_template
echo "
# Cron run, arg is one of:
reboot hourly daily weekly monthly all list help
all runs all targets but not reboot
"
exit 1
}
_get_cron_template() {
min=$(( $RANDOM % 20 ))
echo "
### CRON user run ###
@reboot $0 reboot
$min * * * * $0 hourly
$(( $min + 10 )) 4 * * * $0 daily
$(( $min + 20 )) 4 * * 1 $0 weekly
$(( $min + 30 )) 4 1 * * $0 monthly
### CRON user run END ###"
}
_install() {
crontab -l 2>/dev/null | grep -q cron-user-run && {
echo "Already installed"
return
}
echo "Installing"
crontab -l 2>/dev/null
tmpfile=$( mktemp )
crontab -l > "$tmpfile" 2>/dev/null
set -e
_get_cron_template >> "$tmpfile"
crontab "$tmpfile"
rm "$tmpfile"
crontab -l
return
}
if [ -z "$1" ];then
_helpexit
fi
# SETUP
cd $HOME
LOG="$HOME/.log/cron.log"
TSF="%Y-%m-%d %H:%M:%S [$1]"
CRONBASE="$HOME/.local/etc/cron"
mkdir -p "$HOME/.log"
for task in hourly daily weekly monthly reboot; do
if [[ ! -e "$CRONBASE"/"$task" ]]; then
mkdir -p "$CRONBASE"/"$task"
fi
done
if [[ ! -e ~/.log/logrotate.conf ]]; then
cat <<EOF > ~/.log/logrotate.conf
$HOME/.log/*.log {
monthly
missingok
rotate 12
compress
delaycompress
notifempty
}
EOF
fi
if [[ ! -e "$CRONBASE"/daily/000-logrotate ]]; then
cat <<EOF > "$CRONBASE"/daily/000-logrotate
#!/bin/bash
/usr/sbin/logrotate -s ~/.log/logrotate.state ~/.log/logrotate.conf
EOF
chmod +x "$CRONBASE"/daily/000-logrotate
fi
case "$1" in
help|-h|--help)
_helpexit
;;
all)
for task in hourly daily weekly monthly; do
"$0" $task
done
exit $?
;;
list)
if [[ -e "$LOG" ]]; then
echo "===================="
echo "Log: $LOG"
tail -n 10 "$LOG"
echo "===================="
fi
for task in hourly daily weekly monthly reboot; do
if [[ -e "$CRONBASE"."$task" ]]; then
echo "$CRONBASE"."$task"
ls -1 "$CRONBASE"."$task" | sed 's/^/ /'
fi
if [[ -e "$CRONBASE"/"$task" ]]; then
echo "$CRONBASE"/"$task"
ls -1 "$CRONBASE"/"$task" | sed 's/^/ /'
fi
done
exit $?
;;
install)
_install
;;
hourly|daily|weekly|monthly|reboot)
echo "Running user cron $1" | ts -m "$TSF" >> "$LOG"
if [[ -e "$CRONBASE"."$task" ]]; then
run-parts --report -v "$CRONBASE"."$1" 2>&1 | ts -m "$TSF" >> "$LOG"
fi
if [[ -e "$CRONBASE"/"$task" ]]; then
run-parts --report -v "$CRONBASE"/"$1" 2>&1 | ts -m "$TSF" >> "$LOG"
fi
;;
esac