def send(error, transports, t0): # do nothing when there are no transports if not transports: return # do nothing on KeyboardInterrupt, or when on_success / on_failure do not match the status success = error is None if isinstance(error, KeyboardInterrupt): return elif success and not opts["on_success"]: return elif not success and not opts["on_failure"]: return # prepare message content duration = human_duration(seconds=round(time.time() - t0, 1)) status_string = "succeeded" if success else "failed" title = "Task {} {}!".format(_task.get_task_family(), status_string) parts = collections.OrderedDict([ ("Host", socket.gethostname()), ("Duration", duration), ("Last message", "-" if not len(_task._message_cache) else _task._message_cache[-1]), ("Task", str(_task)), ]) if not success: parts["Traceback"] = traceback.format_exc() message = "\n".join("{}: {}".format(*tpl) for tpl in parts.items()) # dispatch via all transports for transport in transports: fn = transport["func"] raw = transport.get("raw", False) colored = transport.get("colored", False) # remove color commands if necessary if not colored: _title = uncolored(title) if raw: _content = { k: (uncolored(v) if isinstance(v, six.string_types) else v) for k, v in parts.items() } else: _content = uncolored(message) else: _title = title _content = parts.copy() if raw else message # invoke the function try: fn(success, _title, _content, **opts) except Exception as e: t = traceback.format_exc() logger.warning( "notification via transport '{}' failed: {}\n{}".format( fn, e, t))
def notify_mail(title, message, recipient=None, sender=None, smtp_host=None, smtp_port=None, **kwargs): """ Mail notification method taking a *title* and a string *message*. *recipient*, *sender*, *smtp_host* and *smtp_port* default to the configuration values in the [notifications] section. """ cfg = Config.instance() if not recipient: recipient = cfg.get_expanded("notifications", "mail_recipient") if not sender: sender = cfg.get_expanded("notifications", "mail_sender") if not smtp_host: smtp_host = cfg.get_expanded("notifications", "mail_smtp_host") if not smtp_port: smtp_port = cfg.get_expanded("notifications", "mail_smtp_port") if not recipient or not sender: logger.warning("cannot send mail notification, recipient ({}) or sender ({}) empty".format( recipient, sender)) return False mail_kwargs = {} if smtp_host: mail_kwargs["smtp_host"] = smtp_host if smtp_port: mail_kwargs["smtp_port"] = smtp_port return send_mail(recipient, sender, title, uncolored(message), **mail_kwargs)
def notify_mail(title, message, recipient=None, sender=None, smtp_host=None, smtp_port=None, **kwargs): """ Sends a notification mail with a *title* and a string *message*. *recipient*, *sender*, *smtp_host* and *smtp_port* default to the configuration values in the [notifications] section. When *recipient* or *sender* are not set, a warning is issued and *False* is returned. Otherwise, the result of :py:meth:`util.send_mail` is returned. """ cfg = Config.instance() if not recipient: recipient = cfg.get_expanded("notifications", "mail_recipient") if not sender: sender = cfg.get_expanded("notifications", "mail_sender") if not smtp_host: smtp_host = cfg.get_expanded("notifications", "mail_smtp_host") if not smtp_port: smtp_port = cfg.get_expanded("notifications", "mail_smtp_port") if not recipient or not sender: logger.warning("cannot send mail notification, recipient ({}) or sender ({}) empty".format( recipient, sender)) return False mail_kwargs = {} if smtp_host: mail_kwargs["smtp_host"] = smtp_host if smtp_port: mail_kwargs["smtp_port"] = smtp_port return send_mail(recipient, sender, title, uncolored(message), **mail_kwargs)
def _publish_message(self, *args): msg = " ".join(str(arg) for arg in args) # add to message cache and handle overflow msg = uncolored(msg) self._message_cache.append(msg) if self.message_cache_size >= 0: end = max(len(self._message_cache) - self.message_cache_size, 0) del self._message_cache[:end] # set status message using the current message cache self.set_status_message("\n".join(self._message_cache))
def publish_message(self, *args): msg = " ".join(str(arg) for arg in args) print(msg) sys.stdout.flush() # add to message cache and handle overflow msg = uncolored(msg) self._message_cache.append(msg) if self._message_cache_size >= 0: self._message_cache[:] = self._message_cache[-self._message_cache_size:] # set status message using the current message cache self.set_status_message("\n".join(self._message_cache))
def _publish_message(self, msg): msg = str(msg) # add to message cache and handle overflow msg = uncolored(msg) self._message_cache.append(msg) if self.message_cache_size >= 0: end = max(len(self._message_cache) - self.message_cache_size, 0) del self._message_cache[:end] # set status message using the current message cache if callable(getattr(self, "set_status_message", None)): self.set_status_message("\n".join(self._message_cache)) else: logger.warning("set_status_message not set, cannot send task message to scheduler")
def _publish_message(self, msg, flush_cache=False, silent=False): msg = uncolored(str(msg)) # flush the message cache? if flush_cache: del self._message_cache[:] # add to message cache and handle overflow self._message_cache.append(msg) if self.message_cache_size >= 0: end = max(len(self._message_cache) - self.message_cache_size, 0) del self._message_cache[:end] # set status message based on the full, current message cache if callable(getattr(self, "set_status_message", None)): self.set_status_message("\n".join(self._message_cache)) elif not silent: logger.warning( "set_status_message not set, cannot send task message to scheduler" )