Add build time into --version string

This commit is contained in:
Brian Read 2024-06-18 12:09:47 +01:00
parent 9c6aae8ea7
commit 49095c3830
2 changed files with 118 additions and 74 deletions

View File

@ -6,16 +6,17 @@
# #
# Mailstats # Mailstats
# #
# optional arguments: # Optional arguments:
# -h, --help show this help message and exit # -h, --help show this help message and exit
# -d DATE, --date DATE Specify a valid date (yyyy-mm-dd) for the analysis # -d DATE, --date DATE Specify a valid date (yyyy-mm-dd) for the analysis
# -ef EMAILFILE, --emailfile EMAILFILE # -ef EMAILFILE, --emailfile EMAILFILE
# Save an html file of the email sent (y/N) # Save an html file of the email sent (y/N)
# -tf TEXTFILE, --textfile TEXTFILE # -tf TEXTFILE, --textfile TEXTFILE
# Save a txt file of the html page (y/N) # Save a txt file of the html page (y/N)
# --version show program's version number and exit
# #
# #
# Re-written in python from Mailstats.pl (Perl) to conform to SME11 / Postfix / qpsmtpd log formats # (June 2024 - bjr) Re-written in Python from Mailstats.pl (Perl) to conform to SME11 / Postfix / qpsmtpd log formats
# and html output added # and html output added
# #
# Todo: # Todo:
@ -24,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. use tmp for txt file and copy to html dir if required. # 7. Incorporate the (rpm) build date into the version
# #
# 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
@ -54,6 +55,9 @@ import argparse
import tempfile import tempfile
Mailstats_version = '1.2' Mailstats_version = '1.2'
build_date_time = "__BUILD_DATE_TIME__"
if build_date_time == "__BUILD_DATE_TIME__":
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
@ -453,41 +457,41 @@ def render_sub_table(table_title,table_headers,found_values):
return rendered_html return rendered_html
def get_spamassassin_version(): # def get_spamassassin_version():
""" # """
Get the installed SpamAssassin version. # Get the installed SpamAssassin version.
Returns: # Returns:
str: Version number of SpamAssassin if installed, otherwise an error message. # str: Version number of SpamAssassin if installed, otherwise an error message.
""" # """
try: # try:
result = subprocess.run(['spamassassin', '--version'], capture_output=True, text=True) # result = subprocess.run(['spamassassin', '--version'], capture_output=True, text=True)
if result.returncode == 0: # if result.returncode == 0:
version_line = result.stdout.split('\n')[0] # version_line = result.stdout.split('\n')[0]
version = version_line.split()[1] # version = version_line.split()[1]
return version # return version
else: # else:
return "SpamAssassin is not installed or an error occurred." # return "SpamAssassin is not installed or an error occurred."
except Exception as e: # except Exception as e:
return f"Error: {e}" # return f"Error: {e}"
def get_clamav_version(): # def get_clamav_version():
""" # """
Get the installed ClamAV version. # Get the installed ClamAV version.
Returns: # Returns:
str: Version number of ClamAV if installed, otherwise an error message. # str: Version number of ClamAV if installed, otherwise an error message.
""" # """
try: # try:
result = subprocess.run(['clamscan', '--version'], capture_output=True, text=True) # result = subprocess.run(['clamscan', '--version'], capture_output=True, text=True)
if result.returncode == 0: # if result.returncode == 0:
version_line = result.stdout.split('\n')[0] # version_line = result.stdout.split('\n')[0]
version = version_line.split()[1] # version = version_line.split()[1]
return version # return version
else: # else:
return "ClamAV is not installed or an error occurred." # return "ClamAV is not installed or an error occurred."
except Exception as e: # except Exception as e:
return f"Error: {e}" # return f"Error: {e}"
def read_html_from_file(filepath): def read_html_from_file(filepath):
""" """
@ -646,7 +650,9 @@ if __name__ == "__main__":
parser.add_argument('-d', '--date', help='Specify a valid date (yyyy-mm-dd) for the analysis', default=formatted_yesterday) parser.add_argument('-d', '--date', help='Specify a valid date (yyyy-mm-dd) for the analysis', default=formatted_yesterday)
parser.add_argument('-ef', '--emailfile', help='Save an html file of the email sent (y/N)', default='n') parser.add_argument('-ef', '--emailfile', help='Save an html file of the email sent (y/N)', default='n')
parser.add_argument('-tf', '--textfile', help='Save a txt file of the html page (y/N)', default='n') parser.add_argument('-tf', '--textfile', help='Save a txt file of the html page (y/N)', default='n')
parser.add_argument('--version', action='version', version='%(prog)s '+Mailstats_version+" built on "+build_date_time)
args = parser.parse_args() args = parser.parse_args()
analysis_date = args.date analysis_date = args.date
# and check its format is valid # and check its format is valid
try: try:
@ -660,8 +666,19 @@ if __name__ == "__main__":
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/"
@ -691,8 +708,8 @@ if __name__ == "__main__":
EMailSMTPUser = get_value(ConfigDB,"mailstats","EmailUser") #None = default => no authenticatioon needed EMailSMTPUser = get_value(ConfigDB,"mailstats","EmailUser") #None = default => no authenticatioon needed
EMailSMTPPassword = get_value(ConfigDB,"mailstats","EmailPassword") EMailSMTPPassword = get_value(ConfigDB,"mailstats","EmailPassword")
spamassassin_version = get_spamassassin_version() #spamassassin_version = get_spamassassin_version()
clamav_version = get_clamav_version() #clamav_version = get_clamav_version()
FetchmailIP = '127.0.0.200'; #Apparent Ip address of fetchmail deliveries FetchmailIP = '127.0.0.200'; #Apparent Ip address of fetchmail deliveries
WebmailIP = '127.0.0.1'; #Apparent Ip of Webmail sender WebmailIP = '127.0.0.1'; #Apparent Ip of Webmail sender
@ -701,12 +718,6 @@ if __name__ == "__main__":
MAILMAN = "bounces"; #sender when mailman sending when orig is localhost MAILMAN = "bounces"; #sender when mailman sending when orig is localhost
DMARCDomain="dmarc"; #Pattern to recognised DMARC sent emails (this not very reliable, as the email address could be anything) DMARCDomain="dmarc"; #Pattern to recognised DMARC sent emails (this not very reliable, as the email address could be anything)
DMARCOkPattern="dmarc: pass"; #Pattern to use to detect DMARC approval DMARCOkPattern="dmarc: pass"; #Pattern to use to detect DMARC approval
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)
num_hours = 25 # Represents hours from 0 to 23 - adds extra one for column totals and another for percentages num_hours = 25 # Represents hours from 0 to 23 - adds extra one for column totals and another for percentages
@ -757,9 +768,7 @@ if __name__ == "__main__":
qpcodes_pattern = re.compile(r".*(\(.*\)).*'") qpcodes_pattern = re.compile(r".*(\(.*\)).*'")
i = 0; i = 0;
sorted_len= len(sorted_log_dict) sorted_len= len(sorted_log_dict)
# Initial call to print the progress bar
#unless none to show #unless none to show
if sorted_len > 0:
spamavg = 0; spamavg = 0;
spamqueuedcount = 0 spamqueuedcount = 0
hamcount = 0 hamcount = 0
@ -768,7 +777,9 @@ if __name__ == "__main__":
rejectspamavg = 0 rejectspamavg = 0
DMARCSendCount = 0 DMARCSendCount = 0
totalexamined = 0 totalexamined = 0
if sorted_len > 0:
if isThonny: if isThonny:
# Initial call to print the progress bar
print_progress_bar(0, sorted_len, prefix='Progress:', suffix='Complete', length=50) print_progress_bar(0, sorted_len, prefix='Progress:', suffix='Complete', length=50)
for timestamp, data in sorted_log_dict.items(): for timestamp, data in sorted_log_dict.items():
i += 1 i += 1

View File

@ -1,17 +1,31 @@
# $Id: smeserver-mailstats.spec,v 1.8 2023/02/15 09:40:09 brianr Exp $ # $Id: smeserver-mailstats.spec,v 1.7 2021/04/02 11:11:44 brianr Exp $
# Authority: brianread # Authority: brianread
# Name: Brian Read # Name: Brian Read
Summary: Daily mail statistics for SME Server Summary: Daily mail statistics for SME Server
%define name smeserver-mailstats %define name smeserver-mailstats
Name: %{name} Name: %{name}
%define version 1.2 %define version 1.1
%define release 1 %define release 18
Version: %{version} Version: %{version}
Release: %{release}%{?dist} Release: %{release}%{?dist}
License: GPL License: GPL
Group: SME/addon Group: SME/addon
Source: %{name}-%{version}.tar.xz Source: %{name}-%{version}.tgz
Patch0: smeserver-mailstats-1.1-random-cron_and_spamfilter-stats-7-update.patch
Patch1: smeserver-mailstats-1.1.bz8957.Create_the_mailstats_user.patch
Patch2: smeserver-mailstats-1.1.bz8656.Spamassassin_scores_and_tags.patch
Patch3: smeserver-mailstats-1.0-628.patch
Patch4: smeserver-mailstats-1.1.bz9588.qpsmtpd0_96compatible.patch
Patch5: smeserver-mailstats-1.1.bz9717-9716email_specific_stats.patch
Patch6: smeserver-mailstats-1.1.bz9888.geoip.patch
Patch7: smeserver-mailstats-1.1.bz10858_10327.cleanup_and_email_truncate.patch
Patch8: smeserver-mailstats-1.1-uninitialised-variable-on-no-data
Patch9: smeserver-mailstats-1.1-Clear-up-uninitialsed-use-of-lc.patch
Patch10:smeserver-mailstats-1.1-Add-Update-event-to-createlinks.patch
Patch11:smeserver-mailstats-1.1-Take-out-dot-in-cron-file-and-also-re-direct-errors-to-syslog.patch
Patch12:smeserver-mailstats-1.1-bz12327-Add-in-imap-authorisation-log-string.patch
Patch13:smeserver-mailstats-1.1-Pull-in-python-rewrite-from-sme11-dev.patch
BuildRoot: /var/tmp/%{name}-%{version}-%{release}-buildroot BuildRoot: /var/tmp/%{name}-%{version}-%{release}-buildroot
BuildArchitectures: noarch BuildArchitectures: noarch
@ -19,22 +33,19 @@ Requires: smeserver-release => 9.0
Requires: qpsmtpd >= 0.96 Requires: qpsmtpd >= 0.96
BuildRequires: e-smith-devtools >= 1.13.1-03 BuildRequires: e-smith-devtools >= 1.13.1-03
Requires: perl-Switch Requires: perl-Switch
BuildRequires: python36
Requires: python36
Requires: html2text
Requires: python3-chameleon
AutoReqProv: no
%description %description
A script that via cron.d e-mails mail statistics to admin on a daily basis. A script that via cron.d e-mails mail statistics to admin on a daily basis.
See http://www.contribs.org/bugzilla/show_bug.cgi?id=819 See http://www.contribs.org/bugzilla/show_bug.cgi?id=819
%changelog %changelog
* Tue May 28 2024 Brian Read <brianr@koozali.org> 1.2-1.sme * Fri Jun 07 2024 Brian Read <brianr@koozali.org> 1.1-18.sme
- Rewrite in python and conform to new postfix SME11 log format [SME: ] - Pull in python re-write from SME11 dev [SME: ]
* Sun Jul 09 2023 cvs2git.sh aka Brian Read <brianr@koozali.org> 1.1-18.sme
- Roll up patches and move to git repo [SME: 12338]
* Sun Jul 09 2023 BogusDateBot
- Eliminated rpmbuild "bogus date" warnings due to inconsistent weekday,
by assuming the date is correct and changing the weekday.
* Wed Feb 15 2023 Brian Read <brianr@bjsystems.co.uk> 1.1-17.sme * Wed Feb 15 2023 Brian Read <brianr@bjsystems.co.uk> 1.1-17.sme
- Add-in-imap-authorisation-log-string [SME: 12327] - Add-in-imap-authorisation-log-string [SME: 12327]
@ -105,6 +116,20 @@ See http://www.contribs.org/bugzilla/show_bug.cgi?id=819
%prep %prep
%setup %setup
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%build %build
perl createlinks perl createlinks
@ -113,11 +138,19 @@ perl createlinks
/bin/rm -rf $RPM_BUILD_ROOT /bin/rm -rf $RPM_BUILD_ROOT
(cd root ; /usr/bin/find . -depth -print | /bin/cpio -dump $RPM_BUILD_ROOT) (cd root ; /usr/bin/find . -depth -print | /bin/cpio -dump $RPM_BUILD_ROOT)
chmod +x $RPM_BUILD_ROOT/usr/bin/runmailstats.sh chmod +x $RPM_BUILD_ROOT/usr/bin/runmailstats.sh
# Define the placeholder and generate the current date and time
now=$(date +"%Y-%m-%d %H:%M:%S")
# Replace the placeholder in the Python program located at %{BUILDROOT}/usr/bin
sed -i "s|__BUILD_DATE_TIME__|$now|" $RPM_BUILD_ROOT/usr/bin/mailstats.py
/bin/rm -f %{name}-%{version}-filelist /bin/rm -f %{name}-%{version}-filelist
/sbin/e-smith/genfilelist $RPM_BUILD_ROOT > %{name}-%{version}-filelist /sbin/e-smith/genfilelist $RPM_BUILD_ROOT | grep -v "\.pyc" | grep -v "\.pyo" > %{name}-%{version}-filelist
%clean %clean
/bin/rm -rf $RPM_BUILD_ROOT /bin/rm -rf $RPM_BUILD_ROOT
%files -f %{name}-%{version}-filelist %files -f %{name}-%{version}-filelist
%defattr(-,root,root) %defattr(-,root,root)