Source code for PvMail.ini_config

"""
Handle application configuration settings in a .ini file.

To identify the configuration file (and create if it does not exist already)::

    [joeuser] $ pvMail_mail_config_file
    /home/joeuser/.pvMail/pvMail.ini

"""

# Copyright (c) 2009-2024, UChicago Argonne, LLC.  See LICENSE file.

import datetime
import os
import sys
from configparser import ConfigParser

APPLICATION = "pvMail"
INI_FILE = "pvMail.ini"


[docs] class Unknown_MTA(Exception): pass
[docs] class NoConfigFile(Exception): pass
[docs] class Config(object): def __init__(self): if "PVMAIL_INI_FILE" in os.environ: self.ini_file = os.path.abspath(os.environ["PVMAIL_INI_FILE"]) self.ini_dir = os.path.dirname(self.ini_file) else: op_sys_config_dir_env = dict(posix="HOME", nt="APPDATA")[os.name] dir_prefix = dict(posix=".", nt="")[os.name] base_dir = os.environ.get(op_sys_config_dir_env, None) or "." self.ini_dir = os.path.join(base_dir, dir_prefix + APPLICATION) self.ini_file = os.path.join(self.ini_dir, INI_FILE) self.mail_transfer_agent = "sendmail" if sys.platform not in ("linux2"): # only use sendmail on linux systems self.mail_transfer_agent = "SMTP" u1 = os.environ.get("LOGNAME", None) u2 = os.environ.get("USERNAME", None) u3 = "joeuser" username = u1 or u2 or u3 self.agent_db = dict( sendmail=dict(user=username), SMTP=dict( user=username, password="keep_this_private", server="smtp.server.org", port="465", connection_security="STARTTLS", ), ) try: self.read() except NoConfigFile: self.write() self.read()
[docs] def setAgent(self, agent): """choose the mail transfer agent""" if agent in self.agent_db: self.mail_transfer_agent = agent else: raise Unknown_MTA(str(agent))
[docs] def read(self): """read the configuration file""" if not os.path.exists(self.ini_file): raise NoConfigFile(str(self.ini_file)) config = ConfigParser() config.read(self.ini_file) self.mail_transfer_agent = config.get("mailer", "mail_transfer_agent") for section in config.sections(): if section not in ("header", "mailer"): for option in config.options(section): if section not in self.agent_db: self.agent_db[section] = {} self.agent_db[section][option] = config.get(section, option)
[docs] def write(self): """ (re)write the configuration file """ config = ConfigParser() config.add_section("header") config.set("header", "application", "pvMail") config.set("header", "written", str(datetime.datetime.now())) config.add_section("mailer") config.set("mailer", "mail_transfer_agent", self.mail_transfer_agent) for section in self.agent_db: config.add_section(section) for k, v in self.agent_db[section].items(): config.set(section, k, v) if not os.path.exists(self.ini_dir): os.mkdir(self.ini_dir) config.write(open(self.ini_file, "w"))
[docs] def get(self): """ return the chosen configuration dictionary """ return self.agent_db[self.mail_transfer_agent]
[docs] def main(): con = Config() print(con.ini_file) print(len(con.agent_db), " configuration(s) described")