[Dovecot] Add quota_notify script
[Dovecot] Some minor changes to quarantine notification script to catch more errors
This commit is contained in:
parent
aa1e03476d
commit
c7c1422095
@ -119,6 +119,7 @@ COPY docker-entrypoint.sh /
|
|||||||
COPY supervisord.conf /etc/supervisor/supervisord.conf
|
COPY supervisord.conf /etc/supervisor/supervisord.conf
|
||||||
COPY stop-supervisor.sh /usr/local/sbin/stop-supervisor.sh
|
COPY stop-supervisor.sh /usr/local/sbin/stop-supervisor.sh
|
||||||
COPY quarantine_notify.py /usr/local/bin/quarantine_notify.py
|
COPY quarantine_notify.py /usr/local/bin/quarantine_notify.py
|
||||||
|
COPY quota_notify.py /usr/local/bin/quota_notify.py
|
||||||
|
|
||||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||||
CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
|
CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
|
||||||
|
@ -165,7 +165,8 @@ chmod +x /usr/local/lib/dovecot/sieve/rspamd-pipe-ham \
|
|||||||
/usr/local/bin/trim_logs.sh \
|
/usr/local/bin/trim_logs.sh \
|
||||||
/usr/local/bin/sa-rules.sh \
|
/usr/local/bin/sa-rules.sh \
|
||||||
/usr/local/bin/maildir_gc.sh \
|
/usr/local/bin/maildir_gc.sh \
|
||||||
/usr/local/sbin/stop-supervisor.sh
|
/usr/local/sbin/stop-supervisor.sh \
|
||||||
|
/usr/local/bin/quota_notify.py
|
||||||
|
|
||||||
# Setup cronjobs
|
# Setup cronjobs
|
||||||
echo '* * * * * root /usr/local/bin/imapsync_cron.pl 2>&1 | /usr/bin/logger' > /etc/cron.d/imapsync
|
echo '* * * * * root /usr/local/bin/imapsync_cron.pl 2>&1 | /usr/bin/logger' > /etc/cron.d/imapsync
|
||||||
|
@ -94,9 +94,21 @@ def notify_rcpt(rcpt, msg_count):
|
|||||||
records = query_mysql('SELECT count(id) AS counter, rcpt FROM quarantine WHERE notified = 0 GROUP BY rcpt')
|
records = query_mysql('SELECT count(id) AS counter, rcpt FROM quarantine WHERE notified = 0 GROUP BY rcpt')
|
||||||
|
|
||||||
for record in records:
|
for record in records:
|
||||||
last_notification = int(r.hget('Q_LAST_NOTIFIED', record['rcpt']) or 0)
|
attrs = ''
|
||||||
|
attrs_json = ''
|
||||||
|
try:
|
||||||
|
last_notification = int(r.hget('Q_LAST_NOTIFIED', record['rcpt']))
|
||||||
|
if last_notification > time_now:
|
||||||
|
print 'Last notification is > time now, assuming never'
|
||||||
|
last_notification = 0
|
||||||
|
except Exception as ex:
|
||||||
|
print 'Could not determine last notification for %s, assuming never' % (record['rcpt'])
|
||||||
|
last_notification = 0
|
||||||
attrs_json = query_mysql('SELECT attributes FROM mailbox WHERE username = "%s"' % (record['rcpt']))
|
attrs_json = query_mysql('SELECT attributes FROM mailbox WHERE username = "%s"' % (record['rcpt']))
|
||||||
attrs = json.loads(str(attrs_json[0]['attributes']))
|
attrs = json.loads(str(attrs_json[0]['attributes']))
|
||||||
|
if attrs['quarantine_notification'] not in ('hourly', 'daily', 'weekly', 'never'):
|
||||||
|
print 'Abnormal quarantine_notification value'
|
||||||
|
continue
|
||||||
if attrs['quarantine_notification'] == 'hourly':
|
if attrs['quarantine_notification'] == 'hourly':
|
||||||
if last_notification == 0 or (last_notification + 3600) < time_now:
|
if last_notification == 0 or (last_notification + 3600) < time_now:
|
||||||
print "Notifying %s about %d new items in quarantine" % (record['rcpt'], record['counter'])
|
print "Notifying %s about %d new items in quarantine" % (record['rcpt'], record['counter'])
|
||||||
|
70
data/Dockerfiles/dovecot/quota_notify.py
Executable file
70
data/Dockerfiles/dovecot/quota_notify.py
Executable file
@ -0,0 +1,70 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import smtplib
|
||||||
|
import os
|
||||||
|
from email.MIMEMultipart import MIMEMultipart
|
||||||
|
from email.MIMEText import MIMEText
|
||||||
|
from email.Utils import COMMASPACE, formatdate
|
||||||
|
import jinja2
|
||||||
|
from jinja2 import Template
|
||||||
|
import redis
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
from subprocess import Popen, PIPE, STDOUT
|
||||||
|
|
||||||
|
if len(sys.argv) > 2:
|
||||||
|
percent = int(sys.argv[1])
|
||||||
|
username = str(sys.argv[2])
|
||||||
|
else:
|
||||||
|
print "Args missing"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
r = redis.StrictRedis(host='redis', decode_responses=True, port=6379, db=0)
|
||||||
|
r.ping()
|
||||||
|
except Exception as ex:
|
||||||
|
print '%s - trying again...' % (ex)
|
||||||
|
time.sleep(3)
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
if r.get('QW_HTML'):
|
||||||
|
try:
|
||||||
|
template = Template(r.get('QW_HTML'))
|
||||||
|
except:
|
||||||
|
print "Error: Cannot parse quarantine template, falling back to default template."
|
||||||
|
with open('/templates/quota.tpl') as file_:
|
||||||
|
template = Template(file_.read())
|
||||||
|
else:
|
||||||
|
with open('/templates/quota.tpl') as file_:
|
||||||
|
template = Template(file_.read())
|
||||||
|
|
||||||
|
html = template.render(username=username, percent=percent)
|
||||||
|
try:
|
||||||
|
msg = MIMEMultipart('alternative')
|
||||||
|
msg['From'] = r.get('QW_SENDER') or "quota-warning@localhost"
|
||||||
|
msg['Subject'] = r.get('QW_SUBJ') or "Quota warning"
|
||||||
|
msg['Date'] = formatdate(localtime = True)
|
||||||
|
text = "Your mailbox is almost full, currently %d%% are in use. Please consider deleting old messages." % (percent)
|
||||||
|
text_part = MIMEText(text, 'plain', 'utf-8')
|
||||||
|
html_part = MIMEText(html, 'html', 'utf-8')
|
||||||
|
msg.attach(text_part)
|
||||||
|
msg.attach(html_part)
|
||||||
|
msg['To'] = username
|
||||||
|
p = Popen(['/usr/local/libexec/dovecot/dovecot-lda', '-d', username, '-o', '"plugin/quota=maildir:User quota:noenforcing"'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
|
||||||
|
p.communicate(input=msg.as_string())
|
||||||
|
|
||||||
|
except Exception as ex:
|
||||||
|
print 'Failed to send quota notification: %s' % (ex)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
try:
|
||||||
|
sys.stdout.close()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
sys.stderr.close()
|
||||||
|
except:
|
||||||
|
pass
|
Loading…
Reference in New Issue
Block a user