mirror of
				https://github.com/mail-in-a-box/mailinabox.git
				synced 2025-11-03 19:30:54 +00:00 
			
		
		
		
	experimentally scanning the mail log to see if we can infer a good time to take a backup
This commit is contained in:
		
							parent
							
								
									53dc53bf8f
								
							
						
					
					
						commit
						4c4babd9e7
					
				@ -1,5 +1,6 @@
 | 
				
			|||||||
#!/usr/bin/python3
 | 
					#!/usr/bin/python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from collections import defaultdict
 | 
				
			||||||
import re, os.path
 | 
					import re, os.path
 | 
				
			||||||
import dateutil.parser
 | 
					import dateutil.parser
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -12,6 +13,7 @@ def scan_mail_log(logger, env):
 | 
				
			|||||||
		"imap-logins": { },
 | 
							"imap-logins": { },
 | 
				
			||||||
		"postgrey": { },
 | 
							"postgrey": { },
 | 
				
			||||||
		"rejected-mail": { },
 | 
							"rejected-mail": { },
 | 
				
			||||||
 | 
							"activity-by-hour": { "imap-logins": defaultdict(int), "smtp-sends": defaultdict(int) },
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	collector["real_mail_addresses"] = set(mailconfig.get_mail_users(env)) | set(alias[0] for alias in mailconfig.get_mail_aliases(env))
 | 
						collector["real_mail_addresses"] = set(mailconfig.get_mail_users(env)) | set(alias[0] for alias in mailconfig.get_mail_aliases(env))
 | 
				
			||||||
@ -45,6 +47,10 @@ def scan_mail_log(logger, env):
 | 
				
			|||||||
			for date, sender, message in collector["rejected-mail"][k]:
 | 
								for date, sender, message in collector["rejected-mail"][k]:
 | 
				
			||||||
				logger.print_line(k + "\t" + str(date) + "\t" + sender + "\t" + message)
 | 
									logger.print_line(k + "\t" + str(date) + "\t" + sender + "\t" + message)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						logger.add_heading("Activity by Hour")
 | 
				
			||||||
 | 
						for h in range(24):
 | 
				
			||||||
 | 
							logger.print_line("%d\t%d\t%d" % (h, collector["activity-by-hour"]["imap-logins"][h], collector["activity-by-hour"]["smtp-sends"][h] ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(collector["other-services"]) > 0:
 | 
						if len(collector["other-services"]) > 0:
 | 
				
			||||||
		logger.add_heading("Other")
 | 
							logger.add_heading("Other")
 | 
				
			||||||
		logger.print_block("Unrecognized services in the log: " + ", ".join(collector["other-services"]))
 | 
							logger.print_block("Unrecognized services in the log: " + ", ".join(collector["other-services"]))
 | 
				
			||||||
@ -65,6 +71,9 @@ def scan_mail_log_line(line, collector):
 | 
				
			|||||||
	elif service == "postfix/smtpd":
 | 
						elif service == "postfix/smtpd":
 | 
				
			||||||
		scan_postfix_smtpd_line(date, log, collector)
 | 
							scan_postfix_smtpd_line(date, log, collector)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						elif service == "postfix/submission/smtpd":
 | 
				
			||||||
 | 
							scan_postfix_submission_line(date, log, collector)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	elif service in ("postfix/qmgr", "postfix/pickup", "postfix/cleanup",
 | 
						elif service in ("postfix/qmgr", "postfix/pickup", "postfix/cleanup",
 | 
				
			||||||
			"postfix/scache", "spampd", "postfix/anvil", "postfix/master",
 | 
								"postfix/scache", "spampd", "postfix/anvil", "postfix/master",
 | 
				
			||||||
			"opendkim", "postfix/lmtp", "postfix/tlsmgr"):
 | 
								"opendkim", "postfix/lmtp", "postfix/tlsmgr"):
 | 
				
			||||||
@ -80,6 +89,7 @@ def scan_dovecot_line(date, log, collector):
 | 
				
			|||||||
		login, ip = m.group(1), m.group(2)
 | 
							login, ip = m.group(1), m.group(2)
 | 
				
			||||||
		if ip != "127.0.0.1": # local login from webmail/zpush
 | 
							if ip != "127.0.0.1": # local login from webmail/zpush
 | 
				
			||||||
			collector["imap-logins"].setdefault(login, {})[ip] = date
 | 
								collector["imap-logins"].setdefault(login, {})[ip] = date
 | 
				
			||||||
 | 
							collector["activity-by-hour"]["imap-logins"][date.hour] += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def scan_postgrey_line(date, log, collector):
 | 
					def scan_postgrey_line(date, log, collector):
 | 
				
			||||||
	m = re.match("action=(greylist|pass), reason=(.*?), (?:delay=\d+, )?client_name=(.*), client_address=(.*), sender=(.*), recipient=(.*)", log)
 | 
						m = re.match("action=(greylist|pass), reason=(.*?), (?:delay=\d+, )?client_name=(.*), client_address=(.*), sender=(.*), recipient=(.*)", log)
 | 
				
			||||||
@ -114,6 +124,11 @@ def scan_postfix_smtpd_line(date, log, collector):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			collector["rejected-mail"].setdefault(recipient, []).append( (date, sender, message) )
 | 
								collector["rejected-mail"].setdefault(recipient, []).append( (date, sender, message) )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def scan_postfix_submission_line(date, log, collector):
 | 
				
			||||||
 | 
						m = re.match("([A-Z0-9]+): client=(\S+), sasl_method=PLAIN, sasl_username=(\S+)", log)
 | 
				
			||||||
 | 
						if m:
 | 
				
			||||||
 | 
							procid, client, user = m.groups()
 | 
				
			||||||
 | 
							collector["activity-by-hour"]["smtp-sends"][date.hour] += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == "__main__":
 | 
					if __name__ == "__main__":
 | 
				
			||||||
	from status_checks import ConsoleOutput
 | 
						from status_checks import ConsoleOutput
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user