Initial version of backup-manager.
[hcoop/scripts.git] / redeliver-mail
CommitLineData
d96599bf 1#!/bin/bash
2#
3# Redeliver any messages that may have accidentally been sent to
4# /var/mail/$USER, due to temporary AFS glitches.
5#
6# This should be called as root on deleuze.
b6be50bd 7#
8# USAGE: redeliver-mail [USER]
9#
10# If USER is specified, redeliver their mail, regardless of whether
11# mail redelivery is stopped for all users.
12
13BLOCKFILE=/tmp/exim4/inhibit-redelivery
d96599bf 14
b6be50bd 15# Function to deliver mail for $USER. If the message still can't be
16# written to $USER/Maildir, Exim will place it in /var/mail/$USER
17# again.
18function deliver_mail() {
19 local USER=$1
20 local TMPMBOX=$2
21
22 mv /var/mail/$USER $TMPMBOX
23 formail -s /etc/exim4/deliver-once $USER < $TMPMBOX
24 rm -f $TMPMBOX
25}
26
27# Check arguments.
28if [ -n "$2" ]; then
29 echo "Incorrect number of arguments"
30 exit 1
31elif [ -n "$1" ]; then
32 # Do redelivery for just one person
33 USER=$1
34 MBOX=/var/mail/$USER
35 TMPMBOX=/tmp/exim4/$USER.mbox.tmp
36
37 if test -f $TMPMBOX; then
38 echo "The temporary file $TMPMBOX still exists."
39 echo "Please wait an hour for it to go away before running this" \
40 "script again."
41 exit 1
42 fi
43
44 if ! test -s $MBOX || ! test -f $MBOX; then
45 echo "$MBOX is empty"
46 exit 1
47 fi
48
49 deliver_mail $USER $TMPMBOX
50 echo Done delivering mail for $USER
51 exit 0
52fi
53
54# Make sure we didn't get into trouble with an earlier run of this
55# script. A separate daily cron job should run to check for the
56# existence of this file.
57if test -f $BLOCKFILE; then
58 exit 0
59fi
60
61# Run redelivery for everyone
d96599bf 62for MBOX in /var/mail/*; do
63
64 USER=$(basename $MBOX)
65 TMPMBOX=/tmp/exim4/$USER.mbox.tmp
66
67 # Sanity check: file exists and has nonzero size
68 if ! test -s $MBOX; then
69 continue
70 fi
71
b6be50bd 72 # Sanity check: If TMPMBOX exists and is 20 minutes old or less,
73 # there is some serious trouble, and we should (1) email
74 # postmaster about it and (2) block future processing of /var/mail
75 # until someone removes BLOCKFILE.
76 #
77 # If TMPMBOX exists and is older than 20 minutes, it's probably
78 # stale, so blow it away. Note that we will never get to this
79 # point if BLOCKFILE exists, so there is no need to refine the
80 # metric further.
81 if test -f $TMPMBOX; then
82 if test $(stat --format=%Y $TMPMBOX) -le \
83 $(date --date='-20 min' +%s); then
84 # Set block file
85 touch $BLOCKFILE
86 echo -e "/var/mail/$USER contains too much email." \
87 "\nBlocking email redelivery script until this is resolved." \
88 "\n\nTo indicate that this is resolved, do the following" \
89 "\non deleuze." \
90 "\n (1) Wait for $TMPMBOX to go away (should take an hour)" \
91 "\n (2) Run '$0 $USER'" \
92 "\n (3) Remove $BLOCKFILE" | \
93 mail -s "[redeliver-mail] Mail backlog too large on deleuze" \
94 -e -a "From: root@deleuze.hcoop.net" \
95 postmaster@deleuze.hcoop.net
96 exit 0
97 else
98 rm -fr $TMPMBOX
99 fi
100 fi
101
d96599bf 102 # Deliver mail. If the message still can't be written to
103 # $USER/Maildir, Exim will place it in /var/mail/$USER again.
b6be50bd 104 deliver_mail $USER $TMPMBOX
d96599bf 105done