|
@@ -2,6 +2,7 @@
|
|
|
|
|
|
import re
|
|
|
import os
|
|
|
+import sys
|
|
|
import time
|
|
|
import atexit
|
|
|
import signal
|
|
@@ -39,6 +40,7 @@ BLACKLIST= []
|
|
|
bans = {}
|
|
|
|
|
|
quit_now = False
|
|
|
+exit_code = 0
|
|
|
lock = Lock()
|
|
|
|
|
|
def log(priority, message):
|
|
@@ -61,6 +63,7 @@ def logInfo(message):
|
|
|
def refreshF2boptions():
|
|
|
global f2boptions
|
|
|
global quit_now
|
|
|
+ global exit_code
|
|
|
if not r.get('F2B_OPTIONS'):
|
|
|
f2boptions = {}
|
|
|
f2boptions['ban_time'] = int
|
|
@@ -81,10 +84,12 @@ def refreshF2boptions():
|
|
|
except ValueError:
|
|
|
print('Error loading F2B options: F2B_OPTIONS is not json')
|
|
|
quit_now = True
|
|
|
+ exit_code = 2
|
|
|
|
|
|
def refreshF2bregex():
|
|
|
global f2bregex
|
|
|
global quit_now
|
|
|
+ global exit_code
|
|
|
if not r.get('F2B_REGEX'):
|
|
|
f2bregex = {}
|
|
|
f2bregex[1] = 'warning: .*\[([0-9a-f\.:]+)\]: SASL .+ authentication failed'
|
|
@@ -103,6 +108,7 @@ def refreshF2bregex():
|
|
|
except ValueError:
|
|
|
print('Error loading F2B options: F2B_REGEX is not json')
|
|
|
quit_now = True
|
|
|
+ exit_code = 2
|
|
|
|
|
|
if r.exists('F2B_LOG'):
|
|
|
r.rename('F2B_LOG', 'NETFILTER_LOG')
|
|
@@ -110,6 +116,7 @@ if r.exists('F2B_LOG'):
|
|
|
def mailcowChainOrder():
|
|
|
global lock
|
|
|
global quit_now
|
|
|
+ global exit_code
|
|
|
while not quit_now:
|
|
|
time.sleep(10)
|
|
|
with lock:
|
|
@@ -128,9 +135,11 @@ def mailcowChainOrder():
|
|
|
if position > 2:
|
|
|
logCrit('Error in %s chain order: MAILCOW on position %d, restarting container' % (chain.name, position))
|
|
|
quit_now = True
|
|
|
+ exit_code = 2
|
|
|
if not target_found:
|
|
|
logCrit('Error in %s chain: MAILCOW target not found, restarting container' % (chain.name))
|
|
|
quit_now = True
|
|
|
+ exit_code = 2
|
|
|
|
|
|
def ban(address):
|
|
|
global lock
|
|
@@ -559,3 +568,5 @@ if __name__ == '__main__':
|
|
|
|
|
|
while not quit_now:
|
|
|
time.sleep(0.5)
|
|
|
+
|
|
|
+ sys.exit(exit_code)
|