Sort out some of the stats and fix space between header and table
This commit is contained in:
parent
49095c3830
commit
1adf1b83db
@ -45,6 +45,7 @@
|
|||||||
<h2>${title}</h2>
|
<h2>${title}</h2>
|
||||||
<br />
|
<br />
|
||||||
<!---Add in header information here -->
|
<!---Add in header information here -->
|
||||||
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<table style="border-collapse:collapse;">
|
<table style="border-collapse:collapse;">
|
||||||
<thead>
|
<thead>
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
# 4. Percent char causes sort to fail - look at adding it in the template
|
# 4. Percent char causes sort to fail - look at adding it in the template
|
||||||
# 5. Chase disparity in counts betweeen old mailstats and this
|
# 5. Chase disparity in counts betweeen old mailstats and this
|
||||||
# 6. Count emails delivered over ports 25/587/465 (SMTPS?)
|
# 6. Count emails delivered over ports 25/587/465 (SMTPS?)
|
||||||
# 7. Incorporate the (rpm) build date into the version
|
# 7. Arrange that the spec file overwrites the date even if it has been overwritten before
|
||||||
#
|
#
|
||||||
# Future:
|
# Future:
|
||||||
# 1. Write summary line for each transaction to DB and link to it through cell in main table
|
# 1. Write summary line for each transaction to DB and link to it through cell in main table
|
||||||
@ -55,9 +55,11 @@ import argparse
|
|||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
Mailstats_version = '1.2'
|
Mailstats_version = '1.2'
|
||||||
build_date_time = "__BUILD_DATE_TIME__"
|
build_date_time = "2024-06-18 12:03:40OURCE"
|
||||||
if build_date_time == "__BUILD_DATE_TIME__":
|
build_date_time = build_date_time[:19] #Take out crap that sneaks in.
|
||||||
build_date_time = "Unknown"
|
|
||||||
|
#if build_date_time == "2024-06-18 12:03:40OURCE":
|
||||||
|
# build_date_time = "Unknown"
|
||||||
|
|
||||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
data_file_path = script_dir+'/../..' #back to the top
|
data_file_path = script_dir+'/../..' #back to the top
|
||||||
@ -661,34 +663,29 @@ if __name__ == "__main__":
|
|||||||
print("Specify a valid date (yyyy-mm-dd) for the analysis")
|
print("Specify a valid date (yyyy-mm-dd) for the analysis")
|
||||||
quit()
|
quit()
|
||||||
|
|
||||||
#print(analysis_date)
|
|
||||||
#quit()
|
|
||||||
anaysis_date_obj = datetime.strptime(analysis_date, '%Y-%m-%d')
|
anaysis_date_obj = datetime.strptime(analysis_date, '%Y-%m-%d')
|
||||||
noemailfile = args.emailfile.lower() == 'n'
|
noemailfile = args.emailfile.lower() == 'n'
|
||||||
notextfile = args.textfile.lower() == 'n'
|
notextfile = args.textfile.lower() == 'n'
|
||||||
isThonny = is_running_under_thonny()
|
isThonny = is_running_under_thonny()
|
||||||
|
|
||||||
hello_string = "Mailstats:"+Mailstats_version+' for '+DomainName+" at "+formatted_datetime+" for "+analysis_date
|
|
||||||
print(hello_string)
|
|
||||||
version_string = "Chameleon:"+chameleon_version+" Python:"+python_version
|
|
||||||
if isThonny:
|
|
||||||
version_string = version_string + "...under Thonny"
|
|
||||||
if args.version:
|
|
||||||
print(f"{Mailstats_version} {version_string}")
|
|
||||||
quit()
|
|
||||||
|
|
||||||
print(version_string)
|
|
||||||
|
|
||||||
#E-Smith Config DBs
|
#E-Smith Config DBs
|
||||||
if isThonny:
|
if isThonny:
|
||||||
db_dir = "/home/brianr/SME11Build/GITFiles/smecontribs/smeserver-mailstats/"
|
db_dir = "/home/brianr/SME11Build/GITFiles/smecontribs/smeserver-mailstats/"
|
||||||
else:
|
else:
|
||||||
db_dir = "/home/e-smith/db/"
|
db_dir = "/home/e-smith/db/"
|
||||||
|
|
||||||
#From SMEServer DB
|
#From SMEServer DB
|
||||||
ConfigDB = read_config_file(db_dir+"configuration")
|
ConfigDB = read_config_file(db_dir+"configuration")
|
||||||
|
|
||||||
DomainName = get_value(ConfigDB, "DomainName", "type") #'bjsystems.co.uk' # $cdb->get('DomainName')->value;
|
DomainName = get_value(ConfigDB, "DomainName", "type") #'bjsystems.co.uk' # $cdb->get('DomainName')->value;
|
||||||
|
|
||||||
|
hello_string = "Mailstats:"+Mailstats_version+' for '+DomainName+" at "+formatted_datetime+" for "+analysis_date
|
||||||
|
print(hello_string)
|
||||||
|
version_string = "Chameleon:"+chameleon_version+" Python:"+python_version
|
||||||
|
if isThonny:
|
||||||
|
version_string = version_string + "...under Thonny"
|
||||||
|
print(version_string)
|
||||||
|
|
||||||
RHSenabled = get_value(ConfigDB, "qpsmtpd", "RHSBL","disabled") == "enabled" #True #( $cdb->get('qpsmtpd')->prop('RHSBL') eq 'enabled' );
|
RHSenabled = get_value(ConfigDB, "qpsmtpd", "RHSBL","disabled") == "enabled" #True #( $cdb->get('qpsmtpd')->prop('RHSBL') eq 'enabled' );
|
||||||
DNSenabled = get_value(ConfigDB, "qpsmtpd", "DNSBL","disabled") == "enabled" #True #( $cdb->get('qpsmtpd')->prop('DNSBL') eq 'enabled' );
|
DNSenabled = get_value(ConfigDB, "qpsmtpd", "DNSBL","disabled") == "enabled" #True #( $cdb->get('qpsmtpd')->prop('DNSBL') eq 'enabled' );
|
||||||
|
|
||||||
@ -814,36 +811,36 @@ if __name__ == "__main__":
|
|||||||
if parsed_data['spam-status'].lower().startswith('no'):
|
if parsed_data['spam-status'].lower().startswith('no'):
|
||||||
#Extract other parameters from this string
|
#Extract other parameters from this string
|
||||||
# example: No, score=-3.9
|
# example: No, score=-3.9
|
||||||
spam_pattern = r'score=(-?\d+\.\d+) required=(-?\d+\.\d+)'
|
spam_pattern = re.compile(r'score=(-?\d+\.\d+) required=(-?\d+\.\d+)')
|
||||||
match = re.search(spam_pattern, parsed_data['spam-status'])
|
match = re.search(spam_pattern, parsed_data['spam-status'])
|
||||||
if match:
|
if match:
|
||||||
score = float(match.group(1))
|
score = float(match.group(1))
|
||||||
if score < SATagLevel:
|
#print(score,SATagLevel)
|
||||||
|
if score < float(SATagLevel):
|
||||||
# Accumulate allowed score (inc negatives?)
|
# Accumulate allowed score (inc negatives?)
|
||||||
hamavg += score
|
hamavg += score
|
||||||
hamcount += 1
|
hamcount += 1
|
||||||
else:
|
|
||||||
spamavg += score
|
|
||||||
spamqueuedcount += 1
|
|
||||||
#spamassasin rejects
|
#spamassasin rejects
|
||||||
if parsed_data.get('spam-status') is not None and isinstance(parsed_data['spam-status'], str):
|
if parsed_data.get('spam-status') is not None and isinstance(parsed_data['spam-status'], str):
|
||||||
if parsed_data['spam-status'].lower().startswith('yes'):
|
if parsed_data['spam-status'].lower().startswith('yes'):
|
||||||
#Extract other parameters from this string
|
#Extract other parameters from this string
|
||||||
# example: Yes, score=10.3 required=4.0 autolearn=disable
|
# example: Yes, score=10.3 required=4.0 autolearn=disable
|
||||||
spam_pattern = r'score=(-?\d+\.\d+) required=(-?\d+\.\d+)'
|
spam_pattern = re.compile(r'score=(-?\d+\.\d+) required=(-?\d+\.\d+)')
|
||||||
match = re.search(spam_pattern, parsed_data['spam-status'])
|
match = re.search(spam_pattern, parsed_data['spam-status'])
|
||||||
if match:
|
if match:
|
||||||
score = float(match.group(1))
|
score = float(match.group(1))
|
||||||
required = float(match.group(2))
|
required = float(match.group(2))
|
||||||
#print(f"{parsed_data['spam-status']} / {score} {required}")
|
#print(f"{parsed_data['spam-status']} / {score} {required}")
|
||||||
rejectspamavg += score
|
|
||||||
rejectspamcount += 1
|
|
||||||
if score >= SARejectLevel:
|
if score >= SARejectLevel:
|
||||||
columnCounts_2d[hour][DelSpam] += 1
|
columnCounts_2d[hour][DelSpam] += 1
|
||||||
columnCounts_2d[ColTotals][DelSpam] += 1
|
columnCounts_2d[ColTotals][DelSpam] += 1
|
||||||
|
rejectspamavg += score
|
||||||
|
rejectspamcount += 1
|
||||||
elif score >= required:
|
elif score >= required:
|
||||||
columnCounts_2d[hour][QuedSpam] += 1
|
columnCounts_2d[hour][QuedSpam] += 1
|
||||||
columnCounts_2d[ColTotals][QuedSpam] += 1
|
columnCounts_2d[ColTotals][QuedSpam] += 1
|
||||||
|
spamavg += score
|
||||||
|
spamqueuedcount += 1
|
||||||
|
|
||||||
#Local send
|
#Local send
|
||||||
elif DomainName in parsed_data['sendurl']:
|
elif DomainName in parsed_data['sendurl']:
|
||||||
@ -956,7 +953,7 @@ if __name__ == "__main__":
|
|||||||
found_countries = defaultdict(int)
|
found_countries = defaultdict(int)
|
||||||
geoip_pattern = re.compile(r".*check_badcountries: GeoIP Country: (.*)")
|
geoip_pattern = re.compile(r".*check_badcountries: GeoIP Country: (.*)")
|
||||||
dmarc_pattern = re.compile(r".*dmarc: pass")
|
dmarc_pattern = re.compile(r".*dmarc: pass")
|
||||||
helo_pattern = re.compile(r"Accepted connection.*?from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) \/ ([\w.-]+)")
|
helo_pattern = re.compile(r".*Accepted connection.*?from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) \/ ([\w.-]+)")
|
||||||
total_countries = 0
|
total_countries = 0
|
||||||
DMARCOkCount = 0
|
DMARCOkCount = 0
|
||||||
totalinternalsmtpsessions = 0
|
totalinternalsmtpsessions = 0
|
||||||
@ -985,10 +982,9 @@ if __name__ == "__main__":
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
#Pull out Geoip countries for analysis table
|
#Pull out Geoip countries for analysis table
|
||||||
if "check_badcountries: GeoIP Country" in data:
|
|
||||||
j += 1
|
|
||||||
match = geoip_pattern.match(data[1])
|
match = geoip_pattern.match(data[1])
|
||||||
if match:
|
if match:
|
||||||
|
j += 1
|
||||||
country = match.group(1)
|
country = match.group(1)
|
||||||
found_countries[country] += 1
|
found_countries[country] += 1
|
||||||
total_countries += 1
|
total_countries += 1
|
||||||
|
Loading…
Reference in New Issue
Block a user