[Dovecot] notify scripts migrated to python3

master
zekeriya 2019-09-13 21:14:30 +03:00
parent 48081ff5b7
commit b9e7d12a5e
3 changed files with 30 additions and 30 deletions

View File

@ -71,10 +71,11 @@ RUN groupadd -g 5000 vmail \
libwww-perl \
mysql-client \
procps \
python-html2text \
python-jinja2 \
python-mysql.connector \
python-redis \
python3 \
python3-html2text \
python3-jinja2 \
python3-mysql.connector \
python3-redis \
redis-server \
supervisor \
syslog-ng \

View File

@ -1,11 +1,10 @@
#!/usr/bin/python
import smtplib
import os
import mysql.connector
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
import cgi
import jinja2
from jinja2 import Template
@ -20,7 +19,7 @@ while True:
r = redis.StrictRedis(host='redis', decode_responses=True, port=6379, db=0)
r.ping()
except Exception as ex:
print '%s - trying again...' % (ex)
print('%s - trying again...' % (ex))
time.sleep(3)
else:
break
@ -30,9 +29,9 @@ time_now = int(time.time())
def query_mysql(query, headers = True, update = False):
while True:
try:
cnx = mysql.connector.connect(unix_socket = '/var/run/mysqld/mysqld.sock', user='__DBUSER__', passwd='__DBPASS__', database='__DBNAME__', charset="utf8")
cnx = mysql.connector.connect(unix_socket = '/var/run/mysqld/mysqld.sock', user='mailcow', passwd='sdvZ39iWd86UnVI772spU48VO1T8', database='mailcow', charset="utf8")
except Exception as ex:
print '%s - trying again...' % (ex)
print('%s - trying again...' % (ex))
time.sleep(3)
else:
break
@ -40,10 +39,10 @@ def query_mysql(query, headers = True, update = False):
cur.execute(query)
if not update:
result = []
columns = tuple( [d[0].decode('utf8') for d in cur.description] )
columns = tuple( [d[0] for d in cur.description] )
for row in cur:
if headers:
result.append(dict(zip(columns, row)))
result.append(dict(list(zip(columns, row))))
else:
result.append(row)
cur.close()
@ -60,7 +59,7 @@ def notify_rcpt(rcpt, msg_count, quarantine_acl):
try:
template = Template(r.get('Q_HTML'))
except:
print "Error: Cannot parse quarantine template, falling back to default template."
print("Error: Cannot parse quarantine template, falling back to default template.")
with open('/templates/quarantine.tpl') as file_:
template = Template(file_.read())
else:
@ -91,7 +90,7 @@ def notify_rcpt(rcpt, msg_count, quarantine_acl):
break
except Exception as ex:
server.quit()
print '%s' % (ex)
print('%s' % (ex))
time.sleep(3)
records = query_mysql('SELECT IFNULL(user_acl.quarantine, 0) AS quarantine_acl, count(id) AS counter, rcpt FROM quarantine LEFT OUTER JOIN user_acl ON user_acl.username = rcpt WHERE notified = 0 AND rcpt in (SELECT username FROM mailbox) GROUP BY rcpt')
@ -102,25 +101,25 @@ for record in records:
try:
last_notification = int(r.hget('Q_LAST_NOTIFIED', record['rcpt']))
if last_notification > time_now:
print 'Last notification is > time now, assuming never'
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'])
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.loads(str(attrs_json[0]['attributes']))
if attrs['quarantine_notification'] not in ('hourly', 'daily', 'weekly', 'never'):
print 'Abnormal quarantine_notification value'
print('Abnormal quarantine_notification value')
continue
if attrs['quarantine_notification'] == 'hourly':
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']))
notify_rcpt(record['rcpt'], record['counter'], record['quarantine_acl'])
elif attrs['quarantine_notification'] == 'daily':
if last_notification == 0 or (last_notification + 86400) < 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']))
notify_rcpt(record['rcpt'], record['counter'], record['quarantine_acl'])
elif attrs['quarantine_notification'] == 'weekly':
if last_notification == 0 or (last_notification + 604800) < 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']))
notify_rcpt(record['rcpt'], record['counter'], record['quarantine_acl'])

View File

@ -1,10 +1,10 @@
#!/usr/bin/python
#!/usr/bin/python3
import smtplib
import os
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
import jinja2
from jinja2 import Template
import redis
@ -17,7 +17,7 @@ if len(sys.argv) > 2:
percent = int(sys.argv[1])
username = str(sys.argv[2])
else:
print "Args missing"
print("Args missing")
sys.exit(1)
while True:
@ -25,7 +25,7 @@ while True:
r = redis.StrictRedis(host='redis', decode_responses=True, port=6379, db=0)
r.ping()
except Exception as ex:
print '%s - trying again...' % (ex)
print('%s - trying again...' % (ex))
time.sleep(3)
else:
break
@ -34,7 +34,7 @@ if r.get('QW_HTML'):
try:
template = Template(r.get('QW_HTML'))
except:
print "Error: Cannot parse quarantine template, falling back to default template."
print("Error: Cannot parse quarantine template, falling back to default template.")
with open('/templates/quota.tpl') as file_:
template = Template(file_.read())
else:
@ -55,10 +55,10 @@ try:
msg.attach(html_part)
msg['To'] = username
p = Popen(['/usr/lib/dovecot/dovecot-lda', '-d', username, '-o', '"plugin/quota=maildir:User quota:noenforcing"'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
p.communicate(input=msg.as_string())
p.communicate(input=bytes(msg.as_string(), 'utf-8'))
except Exception as ex:
print 'Failed to send quota notification: %s' % (ex)
print('Failed to send quota notification: %s' % (ex))
sys.exit(1)
try: