Skip to content

Commit ff7aed2

Browse files
committed
Send log also via mail
1 parent ceb4880 commit ff7aed2

File tree

2 files changed

+64
-4
lines changed

2 files changed

+64
-4
lines changed

src/redturtle/rsync/adapters/adapter.py

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88
from plone import api
99
from datetime import datetime
1010
from redturtle.rsync.scripts.rsync import logger
11+
from email.message import EmailMessage
12+
from email.utils import formataddr
13+
from plone.registry.interfaces import IRegistry
14+
from Products.CMFPlone.interfaces.controlpanel import IMailSchema
15+
from zope.component import getUtility
1116

1217
import json
1318
import requests
@@ -51,6 +56,7 @@ def __init__(self, context, request):
5156
self.sync_uids = set()
5257
self.start = datetime.now()
5358
self.end = None
59+
self.send_log_template = None
5460

5561
def requests_retry_session(
5662
self,
@@ -113,11 +119,13 @@ def log_info(self, msg, type="info", force_sys_log=False):
113119
"""
114120
style = ""
115121
if type == "error":
116-
style = "padding:5px;background-color:red;color:#fff"
122+
style = "padding:2px;background-color:red;color:#fff"
117123
if type == "warning":
118-
style = "padding:5px;background-color:#ff9d00;color:#fff"
119-
msg = f"[{datetime.now().strftime('%d-%m-%Y %H:%M:%S')}] {msg}"
120-
self.logdata.append(f'<p style="{style}">{self.autolink(msg)}</p>')
124+
style = "padding:2px;background-color:#ff9d00;color:#fff"
125+
# msg = f"[{datetime.now().strftime('%d-%m-%Y %H:%M:%S')}] {msg}"
126+
self.logdata.append(
127+
f'<p><span style="{style}">[{datetime.now().strftime("%d-%m-%Y %H:%M:%S")}]</span>&nbsp;{self.autolink(msg)}</p>'
128+
)
121129

122130
# print the message on standard output
123131
if type == "error":
@@ -166,6 +174,46 @@ def write_log(self):
166174
},
167175
)
168176

177+
def send_log(self):
178+
"""
179+
Send the log by email.
180+
"""
181+
182+
send_to_email = getattr(self.options, "send_to_email", None)
183+
if not send_to_email:
184+
return
185+
if not self.send_log_template:
186+
logger.warning("No email template found, skipping log send by email.")
187+
return
188+
mailhost = api.portal.get_tool(name="MailHost")
189+
if not mailhost:
190+
logger.warning("No MailHost found, skipping log send by email.")
191+
return
192+
193+
body_view = api.content.get_view(
194+
name=self.send_log_template, context=self.context, request=self.request
195+
)
196+
body = body_view(logs=self.logdata)
197+
encoding = api.portal.get_registry_record(
198+
"plone.email_charset", default="utf-8"
199+
)
200+
201+
registry = getUtility(IRegistry)
202+
mail_settings = registry.forInterface(IMailSchema, prefix="plone")
203+
email_from_address = mail_settings.email_from_address
204+
email_from_name = mail_settings.email_from_name
205+
mfrom = formataddr((email_from_name, email_from_address))
206+
207+
msg = EmailMessage()
208+
msg.set_content(body)
209+
msg["Subject"] = self.log_item_title(start=self.start)
210+
msg["From"] = mfrom
211+
msg["Reply-To"] = mfrom
212+
msg["To"] = send_to_email
213+
msg.replace_header("Content-Type", 'text/html; charset="utf-8"')
214+
215+
mailhost.send(msg, charset=encoding)
216+
169217
def set_args(self, parser):
170218
"""
171219
Set some additional arguments for the rsync command.

src/redturtle/rsync/scripts/rsync.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@ def get_args(self, args):
5050
help="Log destination path (relative to Plone site)",
5151
)
5252

53+
# email to send the log to
54+
parser.add_argument(
55+
"--send-to-email",
56+
default=None,
57+
help="Email address to send the log to",
58+
)
59+
5360
# set data source
5461
group = parser.add_mutually_exclusive_group(required=True)
5562
group.add_argument("--source-path", help="Local source path")
@@ -87,6 +94,8 @@ def rsync(self):
8794

8895
# finish, write log
8996
self.adapter.write_log()
97+
# send log by email
98+
self.adapter.send_log()
9099
end = datetime.now()
91100
delta = end - start
92101
total_seconds = int(delta.total_seconds())
@@ -106,6 +115,9 @@ def _main(args):
106115
runner.rsync()
107116
if not getattr(runner.options, "dry_run", False):
108117
print(f"[{datetime.now()}] COMMIT")
118+
transaction.get().note(
119+
runner.adapter.log_item_title(start=runner.adapter.start)
120+
)
109121
transaction.commit()
110122

111123

0 commit comments

Comments
 (0)