diff --git a/AUTHORS b/AUTHORS index 699a92c484..2e16c8aec7 100644 --- a/AUTHORS +++ b/AUTHORS @@ -68,6 +68,7 @@ DNF CONTRIBUTORS Christopher Meng Daniel Mach Dave Johansen + Derick Diaz Dylan Pindur Eduard Cuba Evan Goode diff --git a/dnf/automatic/emitter.py b/dnf/automatic/emitter.py index 648f1a1d41..673da082bf 100644 --- a/dnf/automatic/emitter.py +++ b/dnf/automatic/emitter.py @@ -33,6 +33,7 @@ APPLIED_TIMESTAMP = _("Updates completed at %s") AVAILABLE = _("The following updates are available on '%s':") DOWNLOADED = _("The following updates were downloaded on '%s':") +ERROR = _("An error has occured on: '%s'") logger = logging.getLogger('dnf') @@ -44,10 +45,15 @@ def __init__(self, system_name): self._downloaded = False self._system_name = system_name self._trans_msg = None + self._error = False + self._error_msg = None def _prepare_msg(self): msg = [] - if self._applied: + if self._error: + msg.append(ERROR % self._system_name) + msg.append(self._error_msg) + elif self._applied: msg.append(APPLIED % self._system_name) msg.append(self._available_msg) msg.append(APPLIED_TIMESTAMP % time.strftime("%c")) @@ -72,6 +78,10 @@ def notify_downloaded(self): assert self._available_msg self._downloaded = True + def notify_error(self, msg): + self._error = True + self._error_msg = msg + class EmailEmitter(Emitter): def __init__(self, system_name, conf): @@ -79,7 +89,9 @@ def __init__(self, system_name, conf): self._conf = conf def _prepare_msg(self): - if self._applied: + if self._error: + subj = _("An error has occured on '%s'.") % self._system_name + elif self._applied: subj = _("Updates applied on '%s'.") % self._system_name elif self._downloaded: subj = _("Updates downloaded on '%s'.") % self._system_name @@ -95,6 +107,8 @@ def commit(self): message.set_charset('utf-8') email_from = self._conf.email_from email_to = self._conf.email_to + email_host = self._conf.email_host + email_port = self._conf.email_port message['Date'] = email.utils.formatdate() message['From'] = email_from message['Subject'] = subj @@ -103,12 +117,12 @@ def commit(self): # Send the email try: - smtp = smtplib.SMTP(self._conf.email_host, timeout=300) + smtp = smtplib.SMTP(email_host, email_port, timeout=300) smtp.sendmail(email_from, email_to, message.as_string()) smtp.close() except OSError as exc: msg = _("Failed to send an email via '%s': %s") % ( - self._conf.email_host, exc) + email_host, exc) logger.error(msg) diff --git a/dnf/automatic/main.py b/dnf/automatic/main.py index bb0bd49327..0a9d50414d 100644 --- a/dnf/automatic/main.py +++ b/dnf/automatic/main.py @@ -239,6 +239,7 @@ def __init__(self): libdnf.conf.VectorString(['email', 'stdio']))) self.add_option('output_width', libdnf.conf.OptionNumberInt32(80)) self.add_option('system_name', libdnf.conf.OptionString(socket.gethostname())) + self.add_option('send_error_messages', libdnf.conf.OptionBool(False)) def gpgsigcheck(base, pkgs): @@ -314,6 +315,7 @@ def main(args): try: conf = AutomaticConfig(opts.conf_path, opts.downloadupdates, opts.installupdates) + emitters = None with dnf.Base() as base: cli = dnf.cli.Cli(base) cli._read_conf_file() @@ -375,10 +377,12 @@ def main(args): (conf.commands.reboot == 'when-needed' and base.reboot_needed())): exit_code = os.waitstatus_to_exitcode(os.system(conf.commands.reboot_command)) if exit_code != 0: - logger.error('Error: reboot command returned nonzero exit code: %d', exit_code) - return 1 + raise dnf.exceptions.Error('reboot command returned nonzero exit code: %d', exit_code) except dnf.exceptions.Error as exc: logger.error(_('Error: %s'), ucd(exc)) + if conf.emitters.send_error_messages and emitters != None: + emitters.notify_error(_('Error: %s') % str(exc)) + emitters.commit() return 1 return 0 diff --git a/doc/automatic.rst b/doc/automatic.rst index 329c2f4692..4f8eec6888 100644 --- a/doc/automatic.rst +++ b/doc/automatic.rst @@ -120,6 +120,11 @@ Choosing how the results should be reported. How the system is called in the reports. +``send_error_messages`` + boolean, default: False + + Invokes emitters when an error occurs. + --------------------- ``[command]`` section ---------------------