source: mailjam/mailjam/config.py@ 23:adc5b22efd7e

Last change on this file since 23:adc5b22efd7e was 23:adc5b22efd7e, checked in by Borja Lopez <borja@…>, 12 years ago

Added the first version of the CLI client, which implements a shell-like
interface where users can interact with a mailjam server.

This first versions adds no "big" features, but contains the basis to build
a complete shell interface (including history saving support, completion,
help for commands, etc)

Added a custom configuration file (conf/mailjam-cli.conf) for the CLI
client.

Added a new mailjam.config class (CLIClientConfig) that is used by the CLI
client to load its configuration file.

Updated the package information (setup.py, MANIFEST) to include the CLI
client data.

Modified the behaviour of the XMLRPC methods registered in the *XMLRPC classes
within the daemon module. Now instead of raising exceptions directly, they
catch such exceptions, returning only a string representation of the error
to the XMLRPC client. If there is no error, a nice "ok" message is returned.

File size: 3.9 KB
Line 
1# -*- coding: utf-8 -*-
2
3"""
4The mailjam project - config.py
5
6This file is released under the BSD license, see LICENSE for
7more information.
8
9Francisco de Borja Lopez Rio - <borja@codigo23.net>
10Soluciones Informaticas Codigo23 S.L.U. - http://codigo23.net
11"""
12
13import os
14from ConfigParser import SafeConfigParser
15
16class DaemonConfig():
17 def __init__(self, configfile=None):
18 self.configfile = configfile
19 self.default_paths = ['/usr/local/etc/mailjam', '/usr/local/etc',
20 '/etc/mailjam', '/etc',
21 os.path.join(os.path.dirname(__file__),'../conf')]
22 self.config = {}
23
24 @property
25 def default_filename(self):
26 """
27 Method to get the default configuration filename. It is a method instead
28 of an attribute for easier subclassing
29 """
30 return 'mailjam.conf'
31
32 @property
33 def sections(self):
34 """
35 Method to get the list of available sections in the configuration file.
36 It is a method instead of an attribute for easier subclassing.
37
38 FIXME: Perhaps it would be better to dinamically get the list of
39 sections from the configuration file itself.
40 """
41 return ['xmlrpc_server', 'storage', 'archive',
42 'mailing_lists', 'members']
43
44 def validate_configfile(self):
45 if self.configfile:
46 # ensure we have the full path to the provided file
47 self.configfile = os.path.join(os.path.dirname(__file__),
48 self.configfile)
49 if not os.path.exists(self.configfile):
50 # the file does not exist, so we override it with None,
51 # allowing the next few lines to search for a valid
52 # config file on the usual places
53 self.configfile = None
54 else:
55 return self.configfile
56
57 if not self.configfile:
58 for path in self.default_paths:
59 full_path = os.path.join(path, self.default_filename)
60 if os.path.exists(full_path):
61 self.configfile = full_path
62 return full_path
63
64 # if we reach here, self.configfile will be still None, no valid
65 # config files were found, and so we raise an exception
66 raise IOError('ERROR - Can not find ' + self.default_filename + \
67 ' in your environment')
68
69 def load(self):
70 if not self.configfile:
71 self.validate_configfile()
72 parser = SafeConfigParser()
73 parser.read(self.configfile)
74 for section in self.sections:
75 self.config[section] = {}
76 for name, value in parser.items(section):
77 self.config[section][name] = value
78 return self.config
79
80 def get_section_parameters(self, section):
81 if section not in self.sections:
82 raise IndexError('ERROR - ' + section + \
83 ' is not one of the available sections: ' + \
84 ', '.join(self.sections))
85 if section not in self.config.keys():
86 # perhaps the config hasn't been loaded yet
87 self.load()
88
89 return self.config[section]
90
91
92class MTAClientConfig(DaemonConfig):
93 @property
94 def default_filename(self):
95 return 'mailjam-mta.conf'
96
97 @property
98 def sections(self):
99 return ['server', 'archive']
100
101
102class CLIClientConfig(DaemonConfig):
103 @property
104 def default_filename(self):
105 return 'mailjam-cli.conf'
106
107 @property
108 def sections(self):
109 return ['server', 'archive', 'history']
110
111
112def get_config_parameters(section=None, configfile=None):
113 """
114 This function is kept here for backwards compatibility.
115 By default all the daemon code will use this function to get
116 configuration parameters from the default configuration file.
117 """
118 config = DaemonConfig(configfile)
119 return config.get_section_parameters(section)
120
121
Note: See TracBrowser for help on using the repository browser.