pycecil/cecil/core/config.py

119 lines
2.6 KiB
Python

import os, sys
import inifile
import objproxy
from cecil import preconfig
config = objproxy.Proxy({})
paths = []
filenames = []
def init(appname=None):
global paths, filenames
paths = []
filenames = []
if appname != None:
if os.name == 'posix':
if 'HOME' in os.environ:
paths.append(os.path.join(os.environ['HOME'], appname))
paths.append(os.path.join('/etc', appname))
filenames.extend([x % (appname) for x in ('%s.conf', '%s.ini', '%s.cfg', '%s.cnf')])
elif os.name == 'nt':
if 'APPDATA' in os.environ:
paths.append(os.path.join(os.environ['APPDATA'], appname))
if 'LOCALAPPDATA' in os.environ:
paths.append(os.path.join(os.environ['LOCALAPPDATA'], appname))
filenames.extend([x % (appname) for x in ('%s.ini', '%s.conf', '%s.cfg', '%s.cnf')])
if os.name == 'posix':
if 'HOME' in os.environ:
paths.append(os.environ['HOME'])
paths.append('/etc')
try:
paths.append(os.path.abspath(os.path.dirname(__file__)))
except:
pass
if os.name == 'nt':
if 'USERPROFILE' in os.environ:
paths.append(os.environ['USERPROFILE'])
if 'WINDIR' in os.environ:
paths.append(os.environ['WINDIR'])
if 'SYSTEMDRIVE' in os.environ:
paths.append('%s\\' % (os.environ['SYSTEMDRIVE']),)
try:
paths.append(os.path.abspath(os.path.split(os.path.dirname(__file__))[0]))
paths.append(os.path.abspath(os.path.dirname(sys.argv[0])))
except:
pass
if os.name == 'posix':
filenames.extend(['settings.conf', 'settings.ini', 'settings.cfg', 'settings.cnf'])
else:
filenames.extend(['settings.ini', 'settings.conf', 'settings.cfg', 'settings.cnf'])
load_config()
def locate_config(paths, filenames):
fd = None
for p in paths:
for f in filenames:
fp = os.path.join(p, f)
if os.path.exists(fp):
try:
fd = inifile.inifile(fp)
except None:
fd = None
return fd
def load_config(fname=None):
global paths, filenames
if fname != None:
fp, fn = os.path.split(fname)
else:
fp, fn = None, None
if fp:
pp = [fp]
else:
pp = paths[:]
if fn:
ff = [fn]
else:
ff = filenames[:]
fd = locate_config(pp, ff)
if fd != None:
config._setobj(fd)
def save_config(original_name=True, make_path=True):
if original_name:
fp = config.fname
else:
saved = False
for f in filenames:
for p in paths:
if make_path:
try:
os.makedirs(p)
except OSError:
pass
if os.path.exists(p):
fp = os.path.join(p, f)
config.fname = fp
try:
config.write()
except OSError:
continue
saved = True
break
if not saved:
raise OSError, "No writable path to save configuration"
if preconfig.load_config:
init(preconfig.appname)