core: configuration file

SàT's main options can now be put in a configuration file which can be in different locations
Bridge: new getConfig option
This commit is contained in:
Goffi 2011-06-18 16:22:50 +02:00
commit 1da78d1301
6 changed files with 84 additions and 5 deletions

View file

@ -81,6 +81,9 @@ class DBusBridgeFrontend(BridgeFrontend):
def disconnect(self, profile_key="@DEFAULT@"):
return self.db_comm_iface.disconnect(profile_key)
def getConfig(self, section, name, profile_key='@DEFAULT@'):
return unicode(self.db_comm_iface.getConfig(section, name, profile_key))
def getContacts(self, profile_key="@DEFAULT@"):
return self.db_comm_iface.getContacts(profile_key)

View file

@ -170,6 +170,12 @@ class DbusObject(dbus.service.Object):
def disconnect(self, profile_key="@DEFAULT@"):
return self.cb["disconnect"](unicode(profile_key))
@dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX,
in_signature='sss', out_signature='s',
async_callbacks=None)
def getConfig(self, section, name, profile_key='@DEFAULT@'):
return self.cb["getConfig"](unicode(section), unicode(name), unicode(profile_key))
@dbus.service.method(const_INT_PREFIX+const_COMM_SUFFIX,
in_signature='s', out_signature='a(sa{ss}as)',
async_callbacks=None)

View file

@ -320,6 +320,17 @@ doc_param_0=sub_type: as for [subscribe]
doc_param_1=entity: as for [subscribe]
doc_param_2=%(doc_profile_key)s
[getConfig]
type=method
category=communication
sig_in=sss
sig_out=s
param_2_default='@DEFAULT@'
doc=get main configuration option
doc_param_0=section: section of the configuration file (empty string for DEFAULT)
doc_param_1=name: name of the option
doc_param_2=%(doc_profile_key)s
[setParam]
type=method
category=communication

View file

@ -0,0 +1,33 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
SAT: a jabber client
Copyright (C) 2009, 2010, 2011 Jérôme Poisson (goffi@goffi.org)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
CONST = {
'client_name' : u'SàT (Salut à toi)',
'client_version' : u'0.2.0D', #Please add 'D' at the end for dev versions
'local_dir' : '~/.sat'
}
### Defaut configuration values ###
default_config = {
'local_dir': '~/.sat',
'media_dir': '/usr/share/sat/media',
}

View file

@ -97,20 +97,22 @@ class SAT(service.Service):
def __init__(self):
#TODO: standardize callback system
local_dir = os.path.expanduser(self.get_const('local_dir'))
if not os.path.exists(local_dir):
os.makedirs(local_dir)
self.__waiting_conf = {} #callback called when a confirmation is received
self.__progress_cb_map = {} #callback called when a progress is requested (key = progress id)
self.__general_cb_map = {} #callback called for general reasons (key = name)
self.__private_data = {} #used for internal callbacks (key = id)
self.trigger = TriggerManager() #trigger are used to change SàT behaviour
self.profiles = {}
self.plugins = {}
self.menus = {} #used to know which new menus are wanted by plugins
self.memory=Memory(self)
local_dir = os.path.expanduser(self.get_const('local_dir'))
if not os.path.exists(local_dir):
os.makedirs(local_dir)
self.trigger = TriggerManager() #trigger are used to change SàT behaviour
self.bridge=DBusBridge()
self.bridge.register("getVersion", lambda: self.get_const('client_version'))
@ -126,6 +128,7 @@ class SAT(service.Service):
self.bridge.register("getPresenceStatus", self.memory.getPresenceStatus)
self.bridge.register("getWaitingSub", self.memory.getWaitingSub)
self.bridge.register("sendMessage", self.sendMessage)
self.bridge.register("getConfig", self.memory.getConfig)
self.bridge.register("setParam", self.setParam)
self.bridge.register("getParamA", self.memory.getParamA)
self.bridge.register("getParamsUI", self.memory.getParamsUI)

View file

@ -24,12 +24,14 @@ from __future__ import with_statement
import os.path
import time
import cPickle as pickle
from ConfigParser import SafeConfigParser, NoOptionError, NoSectionError
from xml.dom import minidom
from logging import debug, info, warning, error
import pdb
from twisted.internet import defer
from twisted.words.protocols.jabber import jid
from sat.tools.xml_tools import paramsXml2xmlUI
from sat.core.default_config import default_config
SAVEFILE_PARAM_XML="/param" #xml parameters template
SAVEFILE_PARAM_DATA="/param" #individual & general parameters; _ind and _gen suffixes will be added
@ -399,10 +401,31 @@ class Memory:
self.private={} #used to store private value
self.server_features={} #used to store discovery's informations
self.server_identities={}
self.config = self.parseMainConf()
host.set_const('savefile_history', SAVEFILE_HISTORY)
host.set_const('savefile_private', SAVEFILE_PRIVATE)
self.load()
def parseMainConf(self):
"""look for main .ini configuration file, and parse it"""
_config = SafeConfigParser(defaults=default_config)
_config.read(['/etc/sat.conf', os.path.expanduser('~/sat.conf'), 'sat.conf'])
return _config
def getConfig(self, section, name, profile):
"""Get the main configuration option
@param section: section of the config file (None or '' for DEFAULT)
@param name: name of the option
@param profile: %(doc_profile_key)s"""
if not section:
section='DEFAULT'
try:
_value = self.config.get(section, name)
except NoOptionError, NoSectionError:
_value = ''
return os.path.expanduser(_value) if name.endswith('_path') or name.endswith('_dir') else _value
def load(self):
"""Load parameters and all memory things from file/db"""
param_file_xml = os.path.expanduser(self.host.get_const('local_dir')+