示例#1
0
  def get_logger(self):
    if self.logger:
      return self.logger
    else:
      log_level = self.get("general","log_level")

      self.logger = logging.getLogger("STARTTLS-Everywhere")

      try:
        self.logger.setLevel(log_level)
      except:
        raise ValueError("Invalid value for log_level: %s" % log_level)

      fmt = logging.Formatter("%(asctime)s %(levelname)s %(message)s")

      stderr_needed = True

      # file logging
      log_file = self.get("general","log_file","")
      log_file_level = self.get("general","log_file_level")

      if log_file != "":
        try:
          hdlr = RotatingFileHandler(log_file,
                                                      maxBytes=1000000,
                                                      backupCount=3)
        except IOError as e:
          if e.errno == 13:
            raise InsufficientPermissionError("Insufficient permissions to "
                                              "write STARTTLS-Everywhere log "
                                              "file (log_file): %s" % log_file)
          else:
            raise

        try:
          hdlr.setLevel(log_file_level)
        except:
          raise ValueError("Invalid value for log_file_level: "
                          "%s" % log_file_level)

        hdlr.setFormatter(fmt)
        self.logger.addHandler(hdlr)
        stderr_needed = False

      # SMTP logging
      log_smtp_server = self.get("general","log_smtp_server","")
      log_smtp_from = self.get("general","log_smtp_from","")
      log_smtp_to = self.get("general","log_smtp_to","")
      log_smtp_subj = self.get("general","log_smtp_subject","")
      log_smtp_user = self.get("general","log_smtp_user","")
      log_smtp_pass = self.get("general","log_smtp_pass","")
      log_smtp_tls = self.get("general","log_smtp_tls","")
      log_smtp_tls_key = self.get("general","log_smtp_tls_key","")
      log_smtp_tls_cert = self.get("general","log_smtp_tls_cert","")
      log_smtp_level = self.get("general","log_smtp_level")

      if log_smtp_server != "":
        if len(log_smtp_server.split(":")) > 2:
          raise ValueError("SMTP logging config: invalid log_smtp_server "
                           "format, should be hostname[:port]")
        if log_smtp_from == "":
          raise ValueError("SMTP logging config: missing log_smtp_from")
        if log_smtp_to == "":
          raise ValueError("SMTP logging config: missing log_smtp_to")
        if log_smtp_subj == "":
          raise ValueError("SMTP logging config: missing log_smtp_subject")

        log_smtp_host = log_smtp_server.split(":")[0]
        if len(log_smtp_server.split(":")) > 1:
          log_smtp_port = log_smtp_server.split(":")[1]
          if not log_smtp_port.isdigit():
            raise ValueError("SMTP logging config: invalid log_smtp_server "
                             "port, should be numeric: %s" %
                             log_smtp_port.isdigit)
        else:
          log_smtp_port = 25
        log_smtp_server_tuple = (log_smtp_host,log_smtp_port)

        log_smtp_to_list = log_smtp_to.split(";")

        log_smtp_usrpwd_tuple = None
        log_smtp_tls_tuple = None

        # TLS only if user/pass are given
        if log_smtp_user != "" and log_smtp_pass != "":
          log_smtp_usrpwd_tuple = (log_smtp_user,log_smtp_pass)

          if log_smtp_tls.lower() in [ "yes", "true", "1" ]:
            log_smtp_tls_tuple = ()
            if log_smtp_tls_key != "":
              if log_smtp_tls_cert != "":
                log_smtp_tls_tuple = (log_smtp_tls_key,log_smtp_tls_cert)
              else:
                log_smtp_tls_tuple = (log_smtp_tls_key)

        smtp_hdlr = SMTPHandler(mailhost=log_smtp_server_tuple,
                                fromaddr=log_smtp_from,
                                toaddrs=log_smtp_to_list,
                                subject=log_smtp_subj,
                                credentials=log_smtp_usrpwd_tuple,
                                secure=log_smtp_tls_tuple)
        smtp_hdlr.setFormatter(fmt)

        hdlr = MemoryHandler(capacity=1000000,flushLevel="CRITICAL")
        hdlr.setTarget(smtp_hdlr)

        try:
          hdlr.setLevel(log_smtp_level)
        except:
          raise ValueError("Invalid value for log_smtp_level: "
                          "%s" % log_smtp_level)

        hdlr.setFormatter(fmt)
        self.logger.addHandler(hdlr)
        stderr_needed = False

      if stderr_needed:
        hdlr = logging.StreamHandler()
        hdlr.setFormatter(fmt)
        self.logger.addHandler(hdlr)

      return self.logger