Joël Grand-Guillaume
13 years ago
commit
c59f16ff09
14 changed files with 488 additions and 0 deletions
-
21server_environment/__init__.py
-
74server_environment/__openerp__.py
-
184server_environment/serv_config.py
-
19server_environment/serv_config.xml
-
62server_environment/system_info.py
-
20server_environment_files/__init__.py
-
37server_environment_files/__openerp__.py
-
10server_environment_files/default/base.conf
-
15server_environment_files/default/mytopic.conf
-
8server_environment_files/dev/base.conf
-
9server_environment_files/dev/mytopic.conf
-
7server_environment_files/preprod/mytopic.conf
-
8server_environment_files/prod/base.conf
-
14server_environment_files/prod/mytopic.conf
@ -0,0 +1,21 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Adapted by Nicolas Bessi. Copyright Camptocamp SA |
||||
|
# Based on Florent Xicluna original code. Copyright Wingo SA |
||||
|
# |
||||
|
# 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/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
from .serv_config import serv_config, setboolean |
@ -0,0 +1,74 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Adapted by Nicolas Bessi. Copyright Camptocamp SA |
||||
|
# Based on Florent Xicluna original code. Copyright Wingo SA |
||||
|
# |
||||
|
# 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/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
{ |
||||
|
"name": "server configuration environment files", |
||||
|
"version": "1.0", |
||||
|
"depends": ["base", "server_environment_files"], |
||||
|
"author": "Camptocamp", |
||||
|
"description": """This module provides a classical configuration by environnement file pattern into OpenERP. |
||||
|
Based on code written by WinGo and Camptocamp. |
||||
|
|
||||
|
This module allows you to use the classical environment file pattern by reading |
||||
|
a directive call running_env in config file or openerpc. |
||||
|
|
||||
|
[options] |
||||
|
running_env=dev / prod / etc. |
||||
|
|
||||
|
We intended to add a server command line but there is no correct way to do it. |
||||
|
|
||||
|
This method allows you to have your settings into a module instead of using config file that might be mixed with openerprc or altered. |
||||
|
It is an alternative way to config the base config file. |
||||
|
All your configurations will be read_only and accessible under the admin menu. |
||||
|
If you are not in the 'dev' environment you will not be able to see the values containing 'passw' in key. |
||||
|
|
||||
|
At the current time, the module does not allow to set low level attributes such as database server, etc. . |
||||
|
|
||||
|
The first goal of the module is to ensure that OpenERP will never mess up the external system. |
||||
|
Once installed, profile is mandatory. We do not want to launch an instance in the dev environment on a production server. |
||||
|
|
||||
|
|
||||
|
|
||||
|
The configuration files are to put in the module server_environment_files ; they are using the config parser module syntax. |
||||
|
Look at the module to get some sexamples. |
||||
|
The default configuration are to put in the default folder. All config defined in other environment will be overwritten or added to default one. |
||||
|
Then, you can add a folder by used environment with the name of the environment |
||||
|
If your attibutes contain passw it will only be shown in dev environment. |
||||
|
|
||||
|
Usage samples: |
||||
|
|
||||
|
from server_environment import serv_config |
||||
|
for key, value in serv_config.items('external_service.ftp'): |
||||
|
print (key, value) |
||||
|
|
||||
|
|
||||
|
serv_config.get('external_service.ftp', 'tls') |
||||
|
""", |
||||
|
"website": "http://www.camptocamp.com", |
||||
|
"category": "Tools", |
||||
|
"init_xml": [], |
||||
|
"demo_xml": [], |
||||
|
"update_xml": [ |
||||
|
'serv_config.xml', |
||||
|
], |
||||
|
"installable": True, |
||||
|
"active": False, |
||||
|
} |
@ -0,0 +1,184 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Adapted by Nicolas Bessi. Copyright Camptocamp SA |
||||
|
# Based on Florent Xicluna original code. Copyright Wingo SA |
||||
|
# |
||||
|
# 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/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
import os |
||||
|
import ConfigParser |
||||
|
|
||||
|
from lxml import etree |
||||
|
|
||||
|
from osv import osv, fields |
||||
|
from tools.config import config as system_base_config |
||||
|
|
||||
|
from .system_info import get_server_environment |
||||
|
|
||||
|
import server_environment_files |
||||
|
_dir = os.path.dirname(server_environment_files.__file__) |
||||
|
|
||||
|
# Same dict as RawConfigParser._boolean_states |
||||
|
_boolean_states = {'1': True, 'yes': True, 'true': True, 'on': True, |
||||
|
'0': False, 'no': False, 'false': False, 'off': False} |
||||
|
|
||||
|
if not system_base_config.get('running_env', False): |
||||
|
raise Exception( |
||||
|
("The parameter 'running_env' has not be set neither in base config file option -c or in openerprc.\n" |
||||
|
"We strongly recommand you not to use the rc file but instead use an explicite config file with this content : \n" |
||||
|
"[options] \nrunning_env = dev") |
||||
|
) |
||||
|
|
||||
|
ck_path = os.path.join(_dir, system_base_config['running_env']) |
||||
|
|
||||
|
if not os.path.exists(ck_path) : |
||||
|
raise Exception( |
||||
|
"Provided server environment does not exists please add a folder %s"%s(ck_path) |
||||
|
) |
||||
|
|
||||
|
def setboolean(obj, attr, _bool=_boolean_states): |
||||
|
"""Replace the attribute with a boolean.""" |
||||
|
res = _bool[getattr(obj, attr).lower()] |
||||
|
setattr(obj, attr, res) |
||||
|
return res |
||||
|
|
||||
|
|
||||
|
# Borrowed from MarkupSafe |
||||
|
def _escape(s): |
||||
|
"""Convert the characters &<>'" in string s to HTML-safe sequences.""" |
||||
|
return (str(s).replace('&', '&') |
||||
|
.replace('>', '>') |
||||
|
.replace('<', '<') |
||||
|
.replace("'", ''') |
||||
|
.replace('"', '"')) |
||||
|
|
||||
|
|
||||
|
def _listconf(env_path): |
||||
|
"""List configuration files in a folder.""" |
||||
|
files = [os.path.join(env_path, name) |
||||
|
for name in sorted(os.listdir(env_path)) |
||||
|
if name.endswith('.conf')] |
||||
|
return files |
||||
|
|
||||
|
|
||||
|
def _load_config(): |
||||
|
"""Load the configuration and return a ConfigParser instance.""" |
||||
|
default = os.path.join(_dir, 'default') |
||||
|
running_env = os.path.join(_dir, system_base_config['running_env']) |
||||
|
if os.path.isdir(default): |
||||
|
conf_files = _listconf(default) + _listconf(running_env) |
||||
|
else: |
||||
|
conf_files = _listconf(running_env) |
||||
|
|
||||
|
config_p = ConfigParser.SafeConfigParser() |
||||
|
# options are case-sensitive |
||||
|
config_p.optionxform = str |
||||
|
try: |
||||
|
config_p.read(conf_files) |
||||
|
except Exception, e: |
||||
|
raise Exception('Cannot read config files "%s": %s' % (conf_files, e)) |
||||
|
|
||||
|
return config_p |
||||
|
|
||||
|
serv_config = _load_config() |
||||
|
|
||||
|
|
||||
|
class _Defaults(dict): |
||||
|
__slots__ = () |
||||
|
|
||||
|
def __setitem__(self, key, value): |
||||
|
func = lambda *a: str(value) |
||||
|
return dict.__setitem__(self, key, func) |
||||
|
|
||||
|
|
||||
|
class ServerConfiguration(osv.osv_memory): |
||||
|
"""Display server configuration.""" |
||||
|
_name = 'server.config' |
||||
|
_columns = {} |
||||
|
_defaults = _Defaults() |
||||
|
|
||||
|
def __init__(self, pool, cr): |
||||
|
res = super(ServerConfiguration, self).__init__(pool, cr) |
||||
|
self.running_env = system_base_config['running_env'] |
||||
|
# Only show passwords in development |
||||
|
self.show_passwords = self.running_env in ('dev',) |
||||
|
self._build_osv() |
||||
|
return res |
||||
|
|
||||
|
def _group(self, items, prefix): |
||||
|
"""Return an XML chunk which represents a group of fields.""" |
||||
|
names = [] |
||||
|
for k, v in items: |
||||
|
key = '%s\\%s' % (prefix, k) |
||||
|
# Mask passwords |
||||
|
if 'passw' in k and not self.show_passwords: |
||||
|
v = '**********' |
||||
|
# for the GTK display, we need to replace '_' with '__'. |
||||
|
# XXX: remove this hack when we switch to the web client. |
||||
|
k = k.replace('_', '__') |
||||
|
self._columns[key] = fields.char(k, size=1024) |
||||
|
self._defaults[key] = v |
||||
|
names.append(key) |
||||
|
|
||||
|
return ('<group col="2" colspan="4">' + |
||||
|
''.join(['<field name="%s" readonly="1"/>' % |
||||
|
_escape(name) for name in names]) + |
||||
|
'</group>') |
||||
|
|
||||
|
def _build_osv(self): |
||||
|
"""Build the view for the current configuration.""" |
||||
|
arch = ('<?xml version="1.0" encoding="utf-8"?>' |
||||
|
'<form string="Configuration Form">' |
||||
|
'<notebook colspan="4">') |
||||
|
|
||||
|
# OpenERP server configuration |
||||
|
rcfile = system_base_config.rcfile |
||||
|
items = sorted(system_base_config.options.items()) |
||||
|
arch += '<page string="OpenERP">' |
||||
|
arch += '<separator string="%s" colspan="4"/>' % _escape(rcfile) |
||||
|
arch += self._group(items, prefix='openerp') |
||||
|
arch += '<separator colspan="4"/></page>' |
||||
|
|
||||
|
arch += '<page string="Environment based configurations">' |
||||
|
for section in sorted(serv_config.sections()): |
||||
|
items = sorted(serv_config.items(section)) |
||||
|
arch += '<separator string="[%s]" colspan="4"/>' % _escape(section) |
||||
|
arch += self._group(items, prefix=section) |
||||
|
arch += '<separator colspan="4"/></page>' |
||||
|
|
||||
|
# System information |
||||
|
arch += '<page string="System">' |
||||
|
arch += '<separator string="Server Environment" colspan="4"/>' |
||||
|
arch += self._group(get_server_environment(), prefix='system') |
||||
|
arch += '<separator colspan="4"/></page>' |
||||
|
|
||||
|
arch += '</notebook></form>' |
||||
|
self._arch = etree.fromstring(arch) |
||||
|
|
||||
|
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False): |
||||
|
"""Overwrite the default method to render the custom view.""" |
||||
|
res = super(ServerConfiguration, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar) |
||||
|
if view_type == 'form': |
||||
|
arch_node = self._arch |
||||
|
xarch, xfields = self._view_look_dom_arch(cr, uid, arch_node, view_id, context=context) |
||||
|
res['arch'] = xarch |
||||
|
res['fields'] = xfields |
||||
|
return res |
||||
|
|
||||
|
# TODO: button action_reload |
||||
|
|
||||
|
ServerConfiguration() |
@ -0,0 +1,19 @@ |
|||||
|
<?xml version="1.0"?> |
||||
|
<openerp> |
||||
|
<data> |
||||
|
|
||||
|
<act_window id="act_show_config_window" |
||||
|
name="Server Environment" |
||||
|
res_model="server.config" |
||||
|
view_type="form" |
||||
|
view_mode="form"/> |
||||
|
|
||||
|
<menuitem |
||||
|
parent="base.menu_config" |
||||
|
icon="STOCK_PROPERTIES" |
||||
|
sequence="90" |
||||
|
action="act_show_config_window" |
||||
|
id="menu_server_show_config"/> |
||||
|
|
||||
|
</data> |
||||
|
</openerp> |
@ -0,0 +1,62 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Adapted by Nicolas Bessi. Copyright Camptocamp SA |
||||
|
# Based on Florent Xicluna original code. Copyright Wingo SA |
||||
|
# |
||||
|
# 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/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
import locale |
||||
|
import os |
||||
|
import platform |
||||
|
import subprocess |
||||
|
|
||||
|
import release |
||||
|
from tools.config import config |
||||
|
|
||||
|
|
||||
|
def _get_output(cmd): |
||||
|
bindir = config['root_path'] |
||||
|
p = subprocess.Popen(cmd, shell=True, cwd=bindir, stdout=subprocess.PIPE) |
||||
|
return p.communicate()[0].rstrip() |
||||
|
|
||||
|
|
||||
|
def get_server_environment(): |
||||
|
# inspired by server/bin/service/web_services.py |
||||
|
try: |
||||
|
rev_id = _get_output('bzr revision-info') |
||||
|
except Exception, e: |
||||
|
rev_id = 'Exception: %s' % (e,) |
||||
|
|
||||
|
os_lang = '.'.join([x for x in locale.getdefaultlocale() if x]) |
||||
|
if not os_lang: |
||||
|
os_lang = 'NOT SET' |
||||
|
if os.name == 'posix' and platform.system() == 'Linux': |
||||
|
lsbinfo = _get_output('lsb_release -a') |
||||
|
else: |
||||
|
lsbinfo = 'not lsb compliant' |
||||
|
return ( |
||||
|
('platform', platform.platform()), |
||||
|
('os.name', os.name), |
||||
|
('lsb_release', lsbinfo), |
||||
|
('release', platform.release()), |
||||
|
('version', platform.version()), |
||||
|
('architecture', platform.architecture()[0]), |
||||
|
('locale', os_lang), |
||||
|
('python', platform.python_version()), |
||||
|
('openerp', release.version), |
||||
|
('revision', rev_id), |
||||
|
) |
@ -0,0 +1,20 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Author Nicolas Bessi. Copyright Camptocamp SA |
||||
|
# Author Florent Xicluna. Copyright Wingo SA |
||||
|
# |
||||
|
# 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/>. |
||||
|
# |
||||
|
############################################################################## |
@ -0,0 +1,37 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Adapted by Nicolas Bessi. Copyright Camptocamp SA |
||||
|
# Based on Florent Xicluna original code. Copyright Wingo SA |
||||
|
# |
||||
|
# 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/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
{ |
||||
|
"name": "server configuration environment files repository module", |
||||
|
"version": "1.0", |
||||
|
"depends": ["base"], |
||||
|
"author": "Camptocamp", |
||||
|
"description": """This module provides a file store for classical configuration by environnement file pattern into OpenERP provided by server_environment. |
||||
|
It is ment to be used by server_environment module. Please look at this module for more info and doc. |
||||
|
""", |
||||
|
"website": "http://www.camptocamp.com", |
||||
|
"category": "Tools", |
||||
|
"init_xml": [], |
||||
|
"demo_xml": [], |
||||
|
"update_xml": [], |
||||
|
"installable": True, |
||||
|
"active": False, |
||||
|
} |
@ -0,0 +1,10 @@ |
|||||
|
[misc] |
||||
|
completed_state = 13 |
||||
|
smtp_server = xxx.xxx.ch |
||||
|
|
||||
|
[custom_ged] |
||||
|
ged_folder = /my_mounting_point/ged/ |
||||
|
|
||||
|
[wkhtml2pdf] |
||||
|
lib_path = /xxx/xxx/lib/wkhtmltopdf-linux-i386-0-9-9 |
||||
|
|
@ -0,0 +1,15 @@ |
|||||
|
[external_service] |
||||
|
CONSTA = D01 |
||||
|
CONSTB = 1 |
||||
|
CONSTC = -23 |
||||
|
|
||||
|
|
||||
|
[external_service.ftp] |
||||
|
server = 127.0.0.1 |
||||
|
in_path = /in/ |
||||
|
out_path= /out/ |
||||
|
user = toto |
||||
|
password = my_dev_password |
||||
|
tls = 0 |
||||
|
port = 8074 |
||||
|
|
@ -0,0 +1,8 @@ |
|||||
|
[misc] |
||||
|
smtp_server = dev.xxx.xxx.ch |
||||
|
|
||||
|
[custom_ged] |
||||
|
ged_folder = /tmp/ged/ |
||||
|
|
||||
|
[wkhtml2pdf] |
||||
|
lib_path = /myHome/lib/wkhtmltopdf-linux-i386-0-9-9 |
@ -0,0 +1,9 @@ |
|||||
|
[external_service] |
||||
|
CONSTC = -25 |
||||
|
|
||||
|
|
||||
|
[external_service.ftp] |
||||
|
user = toto |
||||
|
password = toto |
||||
|
|
||||
|
|
@ -0,0 +1,7 @@ |
|||||
|
[external_service] |
||||
|
CONSTC = -25 |
||||
|
|
||||
|
|
||||
|
[external_service.ftp] |
||||
|
user = toto |
||||
|
password = preprod_toto |
@ -0,0 +1,8 @@ |
|||||
|
[misc] |
||||
|
smtp_server = prod.xxx.xxx.ch |
||||
|
|
||||
|
[custom_ged] |
||||
|
ged_folder = /my_mounting_point/ged/ |
||||
|
|
||||
|
[wkhtml2pdf] |
||||
|
lib_path = /xxx/xxx/lib/wkhtmltopdf-linux-i386-0-9-9 |
@ -0,0 +1,14 @@ |
|||||
|
[external_service] |
||||
|
CONSTA = D01 |
||||
|
CONSTB = 1 |
||||
|
CONSTC = -23 |
||||
|
|
||||
|
|
||||
|
[external_service.ftp] |
||||
|
server = my_prod_server |
||||
|
in_path = /in/ |
||||
|
out_path= /out/ |
||||
|
user = prod_user |
||||
|
password = my_prod_password |
||||
|
tls = 0 |
||||
|
port = 21 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue