diff --git a/server_environment/__init__.py b/server_environment/__init__.py new file mode 100644 index 0000000..765b02b --- /dev/null +++ b/server_environment/__init__.py @@ -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 . +# +############################################################################## +from .serv_config import serv_config, setboolean diff --git a/server_environment/__openerp__.py b/server_environment/__openerp__.py new file mode 100644 index 0000000..f4c3b29 --- /dev/null +++ b/server_environment/__openerp__.py @@ -0,0 +1,86 @@ +# -*- 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 . +# +############################################################################## + +{ + "name": "server configuration environment files", + "version": "1.0", + "depends": ["base", "server_environment_files"], + "author": "Camptocamp", + "description": """\ +Environment file pattern for OpenERP +==================================== + +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 the OpenERP configuration +file:: + + [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 keep your settings into a module instead of +using config files that might be mixed with openerprc or altered. It +is an alternative way to the base config file for such configuration +needs . 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 contained in keys named 'passw'. + +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 stored in the `server_environment_files` +module, and user config parser module syntax. Look at the module to +get some examples. The `default` configuration are stored in the +`default/` directory. You can add one directory for each environment +you want to define, named after the environment. All config defined in +non-default environments will override or complement the default +config. If your attibutes contain `passw`, it will only be shown in +the `dev` environment. + +Example usage +------------- + +:: + + 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", + "data": [ + 'serv_config.xml', + ], + "installable": True, + "active": False, +} diff --git a/server_environment/i18n/server_environment.pot b/server_environment/i18n/server_environment.pot new file mode 100644 index 0000000..c83ab22 --- /dev/null +++ b/server_environment/i18n/server_environment.pot @@ -0,0 +1,16 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-14 17:41+0000\n" +"PO-Revision-Date: 2014-03-14 17:41+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + diff --git a/server_environment/serv_config.py b/server_environment/serv_config.py new file mode 100644 index 0000000..ccac4f0 --- /dev/null +++ b/server_environment/serv_config.py @@ -0,0 +1,195 @@ +# -*- 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 . +# +############################################################################## + +import os +import ConfigParser +from lxml import etree + +from openerp.osv import fields, orm +from openerp.tools.config import config as system_base_config + +from .system_info import get_server_environment + +from openerp.addons 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 recommend against using the rc file but instead use an " + "explicit 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 exist, " + "please add a folder %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 as 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(orm.TransientModel): + """Display server configuration.""" + _name = 'server.config' + _columns = {} + _conf_defaults = _Defaults() + + def __init__(self, pool, cr): + 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._arch = None + self._build_osv() + + 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 = '**********' + self._columns[key] = fields.char(k, size=1024) + self._conf_defaults[key] = v + names.append(key) + + return ('' + + ''.join(['' % + _escape(name) for name in names]) + + '') + + def _build_osv(self): + """Build the view for the current configuration.""" + arch = ('' + '
' + '') + + # OpenERP server configuration + rcfile = system_base_config.rcfile + items = sorted(system_base_config.options.items()) + arch += '' + arch += '' % _escape(rcfile) + arch += self._group(items, prefix='openerp') + arch += '' + + arch += '' + for section in sorted(serv_config.sections()): + items = sorted(serv_config.items(section)) + arch += '' % _escape(section) + arch += self._group(items, prefix=section) + arch += '' + + # System information + arch += '' + arch += '' + arch += self._group(get_server_environment(), prefix='system') + arch += '' + + arch += '
' + self._arch = etree.fromstring(arch) + + def fields_view_get(self, cr, uid, view_id=None, view_type='form', + context=None, toolbar=False, submenu=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 + + def default_get(self, cr, uid, fields_list, context=None): + res = {} + for key in self._conf_defaults: + res[key] = self._conf_defaults[key]() + return res diff --git a/server_environment/serv_config.xml b/server_environment/serv_config.xml new file mode 100644 index 0000000..7227b67 --- /dev/null +++ b/server_environment/serv_config.xml @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/server_environment/system_info.py b/server_environment/system_info.py new file mode 100644 index 0000000..e6d522d --- /dev/null +++ b/server_environment/system_info.py @@ -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 . +# +############################################################################## + +import locale +import os +import platform +import subprocess + +from openerp import release +from openerp.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 as 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), + )