#!/bin/sh

set -eu

# pick up a random day that is always the same in every host in an organisation
get_organisation_weekday() {
  hexdump -b /etc/puavo/domain \
    | awk '
        { for (i = 2; i <= NF; i++) { sum += $i } }
        END { print ((sum % 5) + 1) }
      '
}

# Disable most cronjobs (those mostly cause unnecessary load), but logrotate
# is actually useful when /state is used.

if ! munin_enabled=$(puavo-conf puavo.service.munin-node.enabled \
	               2>/dev/null); then
  munin_enabled=false
fi

for cronjobfile in /etc/cron.d/*       \
                   /etc/cron.hourly/*  \
                   /etc/cron.daily/*   \
                   /etc/cron.monthly/* \
                   /etc/cron.weekly/*; do
  test -e "$cronjobfile" || continue

  case "$cronjobfile" in
    /etc/cron.daily/0anacron       \
      | /etc/cron.daily/logrotate  \
      | /etc/cron.d/anacron        \
      | /etc/cron.monthly/0anacron \
      | /etc/cron.weekly/0anacron)
        # Save these files, anacron/cron need the *cron files for proper
        # functioning and we want to run logrotate to prevent /state from
        # filling up.
        continue
        ;;
    /etc/cron.d/munin \
      | /etc/cron.d/munin-node)
        [ "$munin_enabled" != 'true' ] && rm -f "$cronjobfile"
        ;;
    *)
      rm -f "$cronjobfile"
      ;;
  esac
done

puavo_cronjobs=$(puavo-conf puavo.service.cron.cronjobs)

[ -n "$puavo_cronjobs" ] || exit 0

cron_d_cond_enable() {
  if echo "$puavo_cronjobs" | grep -qw "$1"; then
    cat > "/etc/cron.d/${1}.tmp"
    mv "/etc/cron.d/${1}.tmp" "/etc/cron.d/${1}"
  fi
}

cron_daily_cond_enable() {
  if echo "$puavo_cronjobs" | grep -qw "$1"; then
    cat > "/etc/cron.daily/${1}.tmp"
    chmod 755 "/etc/cron.daily/${1}.tmp"
    mv "/etc/cron.daily/${1}.tmp" "/etc/cron.daily/${1}"
  fi
}

get_hour() {
  puavo-conf "$1" \
    | awk '/^[[:digit:]]+$/ && 0 <= $0 && $0 <= 24 { print ($0 % 24); exit(0) }'
}

cron_infotv_display_control() {
  start_hour=$(get_hour puavo.autopoweroff.daytime_start_hour)
  end_hour=$(  get_hour puavo.autopoweroff.daytime_end_hour)

  if [ -n "$start_hour" ]; then
    display_on_line="0 $start_hour * * 1-7 root puavo-tv-display on >/dev/null 2>&1"
  else
    display_on_line=''
  fi

  if [ -n "$end_hour" ]; then
    display_off_line="0 $end_hour * * 1-7 root puavo-tv-display off >/dev/null 2>&1"
  else
    display_off_line=''
  fi

  cat <<EOF
# Turn infotv displays on and off
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

${display_on_line}
${display_off_line}
EOF
}

#
# Setup cronjobs that we need.
#

cron_d_cond_enable fix-homedir-permissions <<'EOF'
# Fix home directory permissions every morning at 06:13
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
13 06 * * * root /usr/local/sbin/puavo-fix-homedir-permissions >/dev/null 2>&1
EOF

cron_d_cond_enable gather-printing-statistics <<'EOF'
# Collect daily (at 23.58 before logrotate kicks in) and monthly print statistics
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
58 23 * * * root /usr/local/sbin/puavo-gather-printing-statistics -d >/dev/null 2>&1
01 00 1 * * root /usr/local/sbin/puavo-gather-printing-statistics -m >/dev/null 2>&1
EOF

cron_infotv_display_control | cron_d_cond_enable infotv-display-control

cron_d_cond_enable puavo-autopoweron <<'EOF'
# Run wakeonlan for hosts that should be woken up.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
30 07 * * * root /usr/local/lib/puavo-autopoweron >/dev/null 2>&1
EOF

cron_d_cond_enable puavo-autoreboot <<'EOF'
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
00 03 * * * root /usr/lib/puavo-ltsp-client/puavo-autoreboot >/dev/null 2>&1
EOF

# XXX keep this for Bookworm, some hosts have a manual puavo-conf
# XXX setting using this (perhaps remove for post-Bookworm?)
cron_d_cond_enable puavo-autoreboot-at-night <<'EOF'
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
00 03 * * * root /sbin/reboot >/dev/null 2>&1
EOF

cron_d_cond_enable puavo-bootserver-sync-images <<'EOF'
# Sync images (for other hosts mostly).
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
21 21 * * * root /usr/sbin/puavo-bootserver-sync-images >/dev/null 2>&1
EOF

cron_d_cond_enable puavo-nightly-updates <<'EOF'
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * root /bin/systemd-inhibit --what=handle-lid-switch /usr/local/lib/puavo-nightly-updates >/dev/null 2>&1
EOF

cron_d_cond_enable puavo-setup-bootserver-printer-restrictions <<'EOF'
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
*/5 * * * * root /etc/puavo-conf/scripts/setup_bootserver_printer_restrictions >/dev/null 2>&1
EOF

cron_d_cond_enable puavo-update-ldap-slave <<EOF
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
17 3 * * $(get_organisation_weekday) root /usr/sbin/puavo-update-ldap-slave >/dev/null 2>&1
EOF

cron_d_cond_enable remove-cups-jobs <<'EOF'
# Remove all CUPS jobs every night at 03:00
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
00 03 * * * root /usr/bin/cancel -a >/dev/null 2>&1
EOF

cron_daily_cond_enable puavo-cleanup-old-users <<'EOF'
#!/bin/sh

test -x /usr/local/sbin/puavo-cleanup-old-users || exit 0
/usr/local/sbin/puavo-cleanup-old-users
EOF
