2009-10-20 10:52:23 +00:00
# -*- coding: utf-8 -*-
2006-12-07 13:41:40 +00:00
##############################################################################
2010-03-11 08:49:41 +00:00
#
2009-01-15 10:12:10 +00:00
# OpenERP, Open Source Management Solution
2009-10-14 12:32:15 +00:00
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
2006-12-07 13:41:40 +00:00
#
2008-11-03 18:27:16 +00:00
# This program is free software: you can redistribute it and/or modify
2009-10-14 12:32:15 +00:00
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
2006-12-07 13:41:40 +00:00
#
2008-11-03 18:27:16 +00:00
# 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
2009-10-14 12:32:15 +00:00
# GNU Affero General Public License for more details.
2006-12-07 13:41:40 +00:00
#
2009-10-14 12:32:15 +00:00
# You should have received a copy of the GNU Affero General Public License
2010-03-11 08:49:41 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2006-12-07 13:41:40 +00:00
#
2008-11-03 18:27:16 +00:00
##############################################################################
2006-12-07 13:41:40 +00:00
2008-12-16 18:10:07 +00:00
import ConfigParser
import optparse
import os
import sys
import netsvc
import logging
2008-09-12 19:45:04 +00:00
import release
2006-12-07 13:41:40 +00:00
2008-12-19 00:00:49 +00:00
def check_ssl ( ) :
try :
from OpenSSL import SSL
import socket
return hasattr ( socket , ' ssl ' )
except :
return False
2006-12-07 13:41:40 +00:00
class configmanager ( object ) :
2008-07-22 14:24:36 +00:00
def __init__ ( self , fname = None ) :
self . options = {
2008-07-29 07:28:04 +00:00
' email_from ' : False ,
2010-05-31 12:26:50 +00:00
' xmlrpc_interface ' : ' ' , # this will bind the server to all interfaces
' xmlrpc_port ' : 8069 ,
' netrpc_interface ' : ' ' ,
' netrpc_port ' : 8070 ,
2010-05-31 14:17:39 +00:00
' xmlrpcs_interface ' : ' ' , # this will bind the server to all interfaces
' xmlrpcs_port ' : 8071 ,
2008-07-22 14:24:36 +00:00
' db_host ' : False ,
' db_port ' : False ,
2008-12-14 16:46:47 +00:00
' db_name ' : False ,
2008-07-22 14:24:36 +00:00
' db_user ' : False ,
' db_password ' : False ,
' db_maxconn ' : 64 ,
' reportgz ' : False ,
' netrpc ' : True ,
' xmlrpc ' : True ,
2010-05-31 14:17:39 +00:00
' xmlrpcs ' : True ,
2008-07-22 14:24:36 +00:00
' translate_in ' : None ,
' translate_out ' : None ,
' language ' : None ,
' pg_path ' : None ,
' admin_passwd ' : ' admin ' ,
2009-01-15 10:12:10 +00:00
' csv_internal_sep ' : ' , ' ,
2008-07-22 14:24:36 +00:00
' addons_path ' : None ,
' root_path ' : None ,
' debug_mode ' : False ,
2008-08-19 12:13:45 +00:00
' import_partial ' : " " ,
2008-07-22 14:24:36 +00:00
' pidfile ' : None ,
' logfile ' : None ,
2010-09-08 13:08:10 +00:00
' logrotate ' : True ,
2008-07-22 14:24:36 +00:00
' smtp_server ' : ' localhost ' ,
' smtp_user ' : False ,
2008-08-20 11:15:20 +00:00
' smtp_port ' : 25 ,
2009-09-17 07:27:12 +00:00
' smtp_ssl ' : False ,
2008-07-22 14:24:36 +00:00
' smtp_password ' : False ,
' stop_after_init ' : False , # this will stop the server after initialization
2008-12-22 23:04:18 +00:00
' syslog ' : False ,
2008-12-10 23:50:53 +00:00
' log_level ' : logging . INFO ,
2010-04-08 17:23:33 +00:00
' assert_exit_level ' : logging . ERROR , # level above which a failed assert will be raised
2009-01-15 10:12:10 +00:00
' cache_timeout ' : 100000 ,
2009-08-03 10:08:43 +00:00
' login_message ' : False ,
2009-10-28 06:22:20 +00:00
' list_db ' : True ,
2010-01-05 15:23:12 +00:00
' timezone ' : False , # to override the default TZ
2010-08-10 13:17:55 +00:00
' test_file ' : False ,
2010-09-12 12:07:43 +00:00
' test_report_directory ' : False ,
2010-08-10 13:17:55 +00:00
' test_disable ' : False ,
' test_commit ' : False ,
2010-08-10 13:12:00 +00:00
' static_http_enable ' : False ,
' static_http_document_root ' : None ,
' static_http_url_prefix ' : None ,
2010-09-08 13:08:10 +00:00
' secure_cert_file ' : ' server.cert ' ,
' secure_pkey_file ' : ' server.pkey ' ,
2008-07-22 14:24:36 +00:00
}
2010-03-11 08:49:41 +00:00
2009-11-24 14:44:05 +00:00
self . misc = { }
2010-04-19 11:00:51 +00:00
self . config_file = fname
self . has_ssl = check_ssl ( )
2008-12-19 00:00:49 +00:00
2009-03-11 14:26:50 +00:00
self . _LOGLEVELS = dict ( [ ( getattr ( netsvc , ' LOG_ %s ' % x ) , getattr ( logging , x ) )
2010-09-18 09:30:52 +00:00
for x in ( ' CRITICAL ' , ' ERROR ' , ' WARNING ' , ' INFO ' , ' TEST ' , ' DEBUG ' , ' DEBUG_RPC ' , ' DEBUG_SQL ' , ' DEBUG_RPC_ANSWER ' , ' NOTSET ' ) ] )
2008-07-22 14:24:36 +00:00
2008-09-12 19:45:04 +00:00
version = " %s %s " % ( release . description , release . version )
2010-04-19 11:00:51 +00:00
self . parser = parser = optparse . OptionParser ( version = version )
2009-01-15 10:12:10 +00:00
2008-07-22 14:24:36 +00:00
parser . add_option ( " -c " , " --config " , dest = " config " , help = " specify alternate config file " )
2009-01-15 10:12:10 +00:00
parser . add_option ( " -s " , " --save " , action = " store_true " , dest = " save " , default = False ,
2008-12-24 00:57:34 +00:00
help = " save configuration to ~/.openerp_serverrc " )
2008-07-22 14:24:36 +00:00
parser . add_option ( " --pidfile " , dest = " pidfile " , help = " file where the server pid will be stored " )
2009-01-15 10:12:10 +00:00
2010-05-31 12:26:50 +00:00
group = optparse . OptionGroup ( parser , " XML-RPC Configuration " )
group . add_option ( " --xmlrpc-interface " , dest = " xmlrpc_interface " , help = " specify the TCP IP address for the XML-RPC protocol " )
group . add_option ( " --xmlrpc-port " , dest = " xmlrpc_port " , help = " specify the TCP port for the XML-RPC protocol " , type = " int " )
group . add_option ( " --no-xmlrpc " , dest = " xmlrpc " , action = " store_false " , help = " disable the XML-RPC protocol " )
parser . add_option_group ( group )
2010-06-07 12:30:25 +00:00
title = " XML-RPC Secure Configuration "
if not self . has_ssl :
title + = " (disabled as ssl is unavailable) "
group = optparse . OptionGroup ( parser , title )
group . add_option ( " --xmlrpcs-interface " , dest = " xmlrpcs_interface " , help = " specify the TCP IP address for the XML-RPC Secure protocol " )
group . add_option ( " --xmlrpcs-port " , dest = " xmlrpcs_port " , help = " specify the TCP port for the XML-RPC Secure protocol " , type = " int " )
group . add_option ( " --no-xmlrpcs " , dest = " xmlrpcs " , action = " store_false " , help = " disable the XML-RPC Secure protocol " )
2010-09-08 13:08:10 +00:00
group . add_option ( " --cert-file " , dest = " secure_cert_file " , help = " specify the certificate file for the SSL connection " )
group . add_option ( " --pkey-file " , dest = " secure_pkey_file " , help = " specify the private key file for the SSL connection " )
2010-06-07 12:30:25 +00:00
parser . add_option_group ( group )
2010-05-31 14:17:39 +00:00
2010-08-10 13:12:00 +00:00
# NET-RPC
2010-05-31 12:26:50 +00:00
group = optparse . OptionGroup ( parser , " NET-RPC Configuration " )
group . add_option ( " --netrpc-interface " , dest = " netrpc_interface " , help = " specify the TCP IP address for the NETRPC protocol " )
group . add_option ( " --netrpc-port " , dest = " netrpc_port " , help = " specify the TCP port for the NETRPC protocol " , type = " int " )
group . add_option ( " --no-netrpc " , dest = " netrpc " , action = " store_false " , help = " disable the NETRPC protocol " )
parser . add_option_group ( group )
2010-09-08 13:08:10 +00:00
2010-08-10 13:12:00 +00:00
# Static HTTP
group = optparse . OptionGroup ( parser , " Static HTTP service " )
group . add_option ( " --static-http-enable " , dest = " static_http_enable " , action = " store_true " , default = False , help = " enable static HTTP service for serving plain HTML files " )
group . add_option ( " --static-http-document-root " , dest = " static_http_document_root " , help = " specify the directory containing your static HTML files (e.g ' /var/www/ ' ) " )
group . add_option ( " --static-http-url-prefix " , dest = " static_http_url_prefix " , help = " specify the URL root prefix where you want web browsers to access your static HTML files (e.g ' / ' ) " )
parser . add_option_group ( group )
2010-09-08 13:08:10 +00:00
2008-07-22 14:24:36 +00:00
parser . add_option ( " -i " , " --init " , dest = " init " , help = " init a module (use \" all \" for all modules) " )
2009-01-15 10:12:10 +00:00
parser . add_option ( " --without-demo " , dest = " without_demo " ,
2008-12-24 00:57:34 +00:00
help = " load demo data for a module (use \" all \" for all modules) " , default = False )
2009-01-15 10:12:10 +00:00
parser . add_option ( " -u " , " --update " , dest = " update " ,
2008-12-24 00:57:34 +00:00
help = " update a module (use \" all \" for all modules) " )
2009-01-15 10:12:10 +00:00
parser . add_option ( " --cache-timeout " , dest = " cache_timeout " ,
2010-09-08 13:08:10 +00:00
help = " set the timeout for the cache system " , type = " int " )
2010-01-05 15:23:12 +00:00
parser . add_option ( " -t " , " --timezone " , dest = " timezone " , help = " specify reference timezone for the server (e.g. Europe/Brussels " )
2009-01-15 10:12:10 +00:00
2008-07-22 14:24:36 +00:00
# stops the server from launching after initialization
2009-01-15 10:12:10 +00:00
parser . add_option ( " --stop-after-init " , action = " store_true " , dest = " stop_after_init " , default = False ,
2008-12-24 00:57:34 +00:00
help = " stop the server after it initializes " )
2008-07-22 14:24:36 +00:00
parser . add_option ( ' --debug ' , dest = ' debug_mode ' , action = ' store_true ' , default = False , help = ' enable debug mode ' )
2009-03-11 14:26:50 +00:00
parser . add_option ( " --assert-exit-level " , dest = ' assert_exit_level ' , type = " choice " , choices = self . _LOGLEVELS . keys ( ) ,
help = " specify the level at which a failed assertion will stop the server. Accepted values: %s " % ( self . _LOGLEVELS . keys ( ) , ) )
2009-12-03 12:59:08 +00:00
2010-04-30 14:22:50 +00:00
# Testing Group
group = optparse . OptionGroup ( parser , " Testing Configuration " )
2010-08-10 13:17:55 +00:00
group . add_option ( " --test-file " , dest = " test_file " , help = " Launch a YML test file. " )
2010-09-12 12:07:43 +00:00
group . add_option ( " --test-report-directory " , dest = " test_report_directory " , help = " If set, will save sample of all reports in this directory. " )
2010-08-10 13:17:55 +00:00
group . add_option ( " --test-disable " , action = " store_true " , dest = " test_disable " ,
2010-04-30 14:22:50 +00:00
default = False , help = " Disable loading test files. " )
2010-08-10 13:17:55 +00:00
group . add_option ( " --test-commit " , action = " store_true " , dest = " test_commit " ,
2010-05-19 15:30:27 +00:00
default = False , help = " Commit database changes performed by tests. " )
2010-04-30 14:22:50 +00:00
parser . add_option_group ( group )
2010-05-13 07:07:00 +00:00
2008-12-22 23:04:18 +00:00
# Logging Group
group = optparse . OptionGroup ( parser , " Logging Configuration " )
group . add_option ( " --logfile " , dest = " logfile " , help = " file where the server log will be stored " )
2009-07-09 18:16:35 +00:00
group . add_option ( " --no-logrotate " , dest = " logrotate " , action = " store_false " ,
2010-09-08 13:08:10 +00:00
help = " do not rotate the logfile " )
2008-12-22 23:04:18 +00:00
group . add_option ( " --syslog " , action = " store_true " , dest = " syslog " ,
default = False , help = " Send the log to the syslog server " )
2009-03-11 14:26:50 +00:00
group . add_option ( ' --log-level ' , dest = ' log_level ' , type = ' choice ' , choices = self . _LOGLEVELS . keys ( ) ,
help = ' specify the level of the logging. Accepted values: ' + str ( self . _LOGLEVELS . keys ( ) ) )
2008-12-22 23:04:18 +00:00
parser . add_option_group ( group )
# SMTP Group
2008-12-19 00:37:50 +00:00
group = optparse . OptionGroup ( parser , " SMTP Configuration " )
2010-09-08 13:08:10 +00:00
group . add_option ( ' --email-from ' , dest = ' email_from ' , help = ' specify the SMTP email address for sending email ' )
group . add_option ( ' --smtp ' , dest = ' smtp_server ' , help = ' specify the SMTP server for sending email ' )
group . add_option ( ' --smtp-port ' , dest = ' smtp_port ' , help = ' specify the SMTP port ' , type = " int " )
group . add_option ( ' --smtp-ssl ' , dest = ' smtp_ssl ' , action = ' store_true ' , help = ' specify the SMTP server support SSL or not ' )
group . add_option ( ' --smtp-user ' , dest = ' smtp_user ' , help = ' specify the SMTP username for sending email ' )
group . add_option ( ' --smtp-password ' , dest = ' smtp_password ' , help = ' specify the SMTP password for sending email ' )
2008-12-19 00:37:50 +00:00
parser . add_option_group ( group )
2009-01-15 10:12:10 +00:00
2008-07-22 14:24:36 +00:00
group = optparse . OptionGroup ( parser , " Database related options " )
group . add_option ( " -d " , " --database " , dest = " db_name " , help = " specify the database name " )
group . add_option ( " -r " , " --db_user " , dest = " db_user " , help = " specify the database user name " )
2009-01-15 10:12:10 +00:00
group . add_option ( " -w " , " --db_password " , dest = " db_password " , help = " specify the database password " )
group . add_option ( " --pg_path " , dest = " pg_path " , help = " specify the pg executable path " )
group . add_option ( " --db_host " , dest = " db_host " , help = " specify the database host " )
group . add_option ( " --db_port " , dest = " db_port " , help = " specify the database port " , type = " int " )
2010-09-08 13:08:10 +00:00
group . add_option ( " --db_maxconn " , dest = " db_maxconn " , type = ' int ' ,
2008-12-24 00:57:34 +00:00
help = " specify the the maximum number of physical connections to posgresql " )
2009-01-15 10:12:10 +00:00
group . add_option ( " -P " , " --import-partial " , dest = " import_partial " ,
2008-12-24 00:57:34 +00:00
help = " Use this for big data importation, if it crashes you will be able to continue at the current state. Provide a filename to store intermediate importation states. " , default = False )
2008-07-22 14:24:36 +00:00
parser . add_option_group ( group )
group = optparse . OptionGroup ( parser , " Internationalisation options " ,
2008-09-10 08:46:40 +00:00
" Use these options to translate OpenERP to another language. "
2008-08-19 13:10:16 +00:00
" See i18n section of the user manual. Option ' -d ' is mandatory. "
" Option ' -l ' is mandatory in case of importation "
)
2008-07-22 14:24:36 +00:00
2009-01-15 10:12:10 +00:00
group . add_option ( ' -l ' , " --language " , dest = " language " ,
2008-12-24 00:57:34 +00:00
help = " specify the language of the translation file. Use it with --i18n-export or --i18n-import " )
2009-01-15 10:12:10 +00:00
group . add_option ( " --i18n-export " , dest = " translate_out " ,
2008-12-24 00:57:34 +00:00
help = " export all sentences to be translated to a CSV file, a PO file or a TGZ archive and exit " )
2009-01-15 10:12:10 +00:00
group . add_option ( " --i18n-import " , dest = " translate_in " ,
2008-12-24 00:57:34 +00:00
help = " import a CSV or a PO file with translations and exit. The ' -l ' option is required. " )
2009-01-15 10:12:10 +00:00
group . add_option ( " --modules " , dest = " translate_modules " ,
2008-12-24 00:57:34 +00:00
help = " specify modules to export. Use in combination with --i18n-export " )
2009-01-15 10:12:10 +00:00
group . add_option ( " --addons-path " , dest = " addons_path " ,
help = " specify an alternative addons path. " ,
2008-12-24 00:57:34 +00:00
action = " callback " , callback = self . _check_addons_path , nargs = 1 , type = " string " )
2008-07-22 14:24:36 +00:00
parser . add_option_group ( group )
2010-05-12 12:56:50 +00:00
security = optparse . OptionGroup ( parser , ' Security-related options ' )
2010-09-08 13:08:10 +00:00
security . add_option ( ' --no-database-list ' , action = " store_false " , dest = ' list_db ' , help = " disable the ability to return the list of databases " )
2010-05-12 12:56:50 +00:00
security . add_option ( ' --enable-code-actions ' , action = ' store_true ' ,
dest = ' server_actions_allow_code ' , default = False ,
help = ' Enables server actions of state " code " . Warning, this is a security risk. ' )
parser . add_option_group ( security )
2010-05-13 07:07:00 +00:00
2010-04-19 11:00:51 +00:00
def parse_config ( self ) :
( opt , args ) = self . parser . parse_args ( )
2008-07-22 14:24:36 +00:00
2009-01-29 16:52:06 +00:00
def die ( cond , msg ) :
if cond :
print msg
sys . exit ( 1 )
die ( bool ( opt . syslog ) and bool ( opt . logfile ) ,
" the syslog and logfile options are exclusive " )
die ( opt . translate_in and ( not opt . language or not opt . db_name ) ,
" the i18n-import option cannot be used without the language (-l) and the database (-d) options " )
die ( opt . translate_out and ( not opt . db_name ) ,
" the i18n-export option cannot be used without the database (-d) option " )
2008-07-22 14:24:36 +00:00
2010-02-02 07:44:15 +00:00
# Check if the config file exists (-c used, but not -s)
2009-12-07 10:56:45 +00:00
die ( not opt . save and opt . config and not os . path . exists ( opt . config ) ,
2010-02-02 07:44:15 +00:00
" The config file ' %s ' selected with -c/--config doesn ' t exist, " \
" use -s/--save if you want to generate it " % ( opt . config ) )
2009-12-07 10:56:45 +00:00
2008-07-22 14:24:36 +00:00
# place/search the config file on Win32 near the server installation
# (../etc from the server)
# if the server is run by an unprivileged user, he has to specify location of a config file where he has the rights to write,
# else he won't be able to save the configurations, or even to start the server...
if os . name == ' nt ' :
2008-09-10 08:46:40 +00:00
rcfilepath = os . path . join ( os . path . abspath ( os . path . dirname ( sys . argv [ 0 ] ) ) , ' openerp-server.conf ' )
2008-07-22 14:24:36 +00:00
else :
2008-09-10 08:46:40 +00:00
rcfilepath = os . path . expanduser ( ' ~/.openerp_serverrc ' )
2008-07-22 14:24:36 +00:00
2009-11-27 11:07:12 +00:00
self . rcfile = os . path . abspath (
2010-04-19 11:00:51 +00:00
self . config_file or opt . config \
or os . environ . get ( ' OPENERP_SERVER ' ) or rcfilepath )
2008-07-22 14:24:36 +00:00
self . load ( )
2009-01-15 10:12:10 +00:00
2008-07-22 14:24:36 +00:00
# Verify that we want to log or not, if not the output will go to stdout
if self . options [ ' logfile ' ] in ( ' None ' , ' False ' ) :
self . options [ ' logfile ' ] = False
# the same for the pidfile
if self . options [ ' pidfile ' ] in ( ' None ' , ' False ' ) :
self . options [ ' pidfile ' ] = False
2008-12-19 00:06:50 +00:00
2010-05-31 12:26:50 +00:00
keys = [ ' xmlrpc_interface ' , ' xmlrpc_port ' , ' db_name ' , ' db_user ' , ' db_password ' , ' db_host ' ,
2010-09-08 13:08:10 +00:00
' db_port ' , ' logfile ' , ' pidfile ' , ' smtp_port ' , ' cache_timeout ' ,
' email_from ' , ' smtp_server ' , ' smtp_user ' , ' smtp_password ' ,
2010-05-31 12:26:50 +00:00
' netrpc_interface ' , ' netrpc_port ' , ' db_maxconn ' , ' import_partial ' , ' addons_path ' ,
2010-06-07 12:56:17 +00:00
' netrpc ' , ' xmlrpc ' , ' syslog ' , ' without_demo ' , ' timezone ' ,
' xmlrpcs_interface ' , ' xmlrpcs_port ' , ' xmlrpcs ' ,
2010-08-10 13:12:00 +00:00
' secure_cert_file ' , ' secure_pkey_file ' ,
' static_http_enable ' , ' static_http_document_root ' , ' static_http_url_prefix '
2010-06-07 12:56:17 +00:00
]
2008-12-19 00:06:50 +00:00
for arg in keys :
2008-07-22 14:24:36 +00:00
if getattr ( opt , arg ) :
self . options [ arg ] = getattr ( opt , arg )
2010-09-12 12:07:43 +00:00
keys = [
' language ' , ' translate_out ' , ' translate_in ' , ' debug_mode ' , ' smtp_ssl ' ,
' stop_after_init ' , ' logrotate ' , ' without_demo ' , ' netrpc ' , ' xmlrpc ' , ' syslog ' ,
' list_db ' , ' server_actions_allow_code ' , ' xmlrpcs ' ,
' test_file ' , ' test_disable ' , ' test_commit ' , ' test_report_directory '
]
2008-12-22 23:35:28 +00:00
for arg in keys :
2009-03-15 16:19:13 +00:00
if getattr ( opt , arg ) is not None :
self . options [ arg ] = getattr ( opt , arg )
2008-12-22 23:35:28 +00:00
2008-07-22 14:24:36 +00:00
if opt . assert_exit_level :
2009-03-11 14:26:50 +00:00
self . options [ ' assert_exit_level ' ] = self . _LOGLEVELS [ opt . assert_exit_level ]
else :
self . options [ ' assert_exit_level ' ] = self . _LOGLEVELS . get ( self . options [ ' assert_exit_level ' ] ) or int ( self . options [ ' assert_exit_level ' ] )
2008-12-22 23:04:18 +00:00
2008-12-10 23:50:53 +00:00
if opt . log_level :
2009-03-11 14:26:50 +00:00
self . options [ ' log_level ' ] = self . _LOGLEVELS [ opt . log_level ]
else :
self . options [ ' log_level ' ] = self . _LOGLEVELS . get ( self . options [ ' log_level ' ] ) or int ( self . options [ ' log_level ' ] )
2009-01-15 10:12:10 +00:00
2008-07-22 14:24:36 +00:00
if not self . options [ ' root_path ' ] or self . options [ ' root_path ' ] == ' None ' :
self . options [ ' root_path ' ] = os . path . abspath ( os . path . dirname ( sys . argv [ 0 ] ) )
if not self . options [ ' addons_path ' ] or self . options [ ' addons_path ' ] == ' None ' :
self . options [ ' addons_path ' ] = os . path . join ( self . options [ ' root_path ' ] , ' addons ' )
2008-12-24 00:57:34 +00:00
self . options [ ' init ' ] = opt . init and dict . fromkeys ( opt . init . split ( ' , ' ) , 1 ) or { }
2008-07-22 14:24:36 +00:00
self . options [ " demo " ] = not opt . without_demo and self . options [ ' init ' ] or { }
2008-12-24 00:57:34 +00:00
self . options [ ' update ' ] = opt . update and dict . fromkeys ( opt . update . split ( ' , ' ) , 1 ) or { }
2008-07-22 14:24:36 +00:00
self . options [ ' translate_modules ' ] = opt . translate_modules and map ( lambda m : m . strip ( ) , opt . translate_modules . split ( ' , ' ) ) or [ ' all ' ]
self . options [ ' translate_modules ' ] . sort ( )
2009-01-15 10:12:10 +00:00
2010-01-05 15:23:12 +00:00
if self . options [ ' timezone ' ] :
2010-03-11 08:49:41 +00:00
# If an explicit TZ was provided in the config, make sure it is known
2010-01-05 15:23:12 +00:00
try :
import pytz
tz = pytz . timezone ( self . options [ ' timezone ' ] )
except pytz . UnknownTimeZoneError :
die ( True , " The specified timezone ( %s ) is invalid " % self . options [ ' timezone ' ] )
except :
# If pytz is missing, don't check the provided TZ, it will be ignored anyway.
pass
2008-07-22 14:24:36 +00:00
if opt . pg_path :
self . options [ ' pg_path ' ] = opt . pg_path
if self . options . get ( ' language ' , False ) :
2009-04-07 21:22:46 +00:00
if len ( self . options [ ' language ' ] ) > 5 :
2009-01-29 14:21:45 +00:00
raise Exception ( ' ERROR: The Lang name must take max 5 chars, Eg: -lfr_BE ' )
2009-01-29 16:52:06 +00:00
if not self . options [ ' db_user ' ] :
try :
import getpass
self . options [ ' db_user ' ] = getpass . getuser ( )
except :
self . options [ ' db_user ' ] = None
die ( not self . options [ ' db_user ' ] , ' ERROR: No user specified for the connection to the database ' )
if self . options [ ' db_password ' ] :
if sys . platform == ' win32 ' and not self . options [ ' db_host ' ] :
self . options [ ' db_host ' ] = ' localhost '
2009-02-06 18:06:14 +00:00
#if self.options['db_host']:
# self._generate_pgpassfile()
2009-01-29 16:52:06 +00:00
2008-07-22 14:24:36 +00:00
if opt . save :
self . save ( )
2009-01-29 16:52:06 +00:00
def _generate_pgpassfile ( self ) :
"""
Generate the pgpass file with the parameters from the command line ( db_host , db_user ,
db_password )
Used because pg_dump and pg_restore can not accept the password on the command line .
"""
is_win32 = sys . platform == ' win32 '
if is_win32 :
filename = os . path . join ( os . environ [ ' APPDATA ' ] , ' pgpass.conf ' )
else :
filename = os . path . join ( os . environ [ ' HOME ' ] , ' .pgpass ' )
text_to_add = " %(db_host)s :*:*: %(db_user)s : %(db_password)s " % self . options
if os . path . exists ( filename ) :
content = [ x . strip ( ) for x in file ( filename , ' r ' ) . readlines ( ) ]
if text_to_add in content :
return
fp = file ( filename , ' a+ ' )
fp . write ( text_to_add + " \n " )
fp . close ( )
if is_win32 :
import _winreg
x = _winreg . ConnectRegistry ( None , _winreg . HKEY_LOCAL_MACHINE )
y = _winreg . OpenKey ( x , r " SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment " , 0 , _winreg . KEY_ALL_ACCESS )
_winreg . SetValueEx ( y , " PGPASSFILE " , 0 , _winreg . REG_EXPAND_SZ , filename )
_winreg . CloseKey ( y )
_winreg . CloseKey ( x )
else :
import stat
os . chmod ( filename , stat . S_IRUSR + stat . S_IWUSR )
2008-10-21 07:08:13 +00:00
def _check_addons_path ( self , option , opt , value , parser ) :
res = os . path . abspath ( os . path . expanduser ( value ) )
if not os . path . exists ( res ) :
raise optparse . OptionValueError ( " option %s : no such directory: %r " % ( opt , value ) )
2010-03-12 06:15:00 +00:00
2010-01-28 05:56:57 +00:00
contains_addons = False
for f in os . listdir ( res ) :
modpath = os . path . join ( res , f )
2010-03-12 06:15:00 +00:00
if os . path . isdir ( modpath ) and \
os . path . exists ( os . path . join ( modpath , ' __init__.py ' ) ) and \
( os . path . exists ( os . path . join ( modpath , ' __openerp__.py ' ) ) or \
os . path . exists ( os . path . join ( modpath , ' __terp__.py ' ) ) ) :
2010-01-28 05:56:57 +00:00
contains_addons = True
break
if not contains_addons :
raise optparse . OptionValueError ( " option %s : The addons-path %r does not seem to a be a valid Addons Directory! " % ( opt , value ) )
2010-03-11 08:49:41 +00:00
2008-10-21 07:08:13 +00:00
setattr ( parser . values , option . dest , res )
2008-07-22 14:24:36 +00:00
def load ( self ) :
p = ConfigParser . ConfigParser ( )
try :
p . read ( [ self . rcfile ] )
for ( name , value ) in p . items ( ' options ' ) :
if value == ' True ' or value == ' true ' :
value = True
if value == ' False ' or value == ' false ' :
value = False
self . options [ name ] = value
2009-11-24 14:44:05 +00:00
#parse the other sections, as well
for sec in p . sections ( ) :
if sec == ' options ' :
continue
if not self . misc . has_key ( sec ) :
self . misc [ sec ] = { }
for ( name , value ) in p . items ( sec ) :
if value == ' True ' or value == ' true ' :
value = True
if value == ' False ' or value == ' false ' :
value = False
self . misc [ sec ] [ name ] = value
2008-07-22 14:24:36 +00:00
except IOError :
pass
except ConfigParser . NoSectionError :
pass
def save ( self ) :
p = ConfigParser . ConfigParser ( )
2009-03-11 14:26:50 +00:00
loglevelnames = dict ( zip ( self . _LOGLEVELS . values ( ) , self . _LOGLEVELS . keys ( ) ) )
2008-07-22 14:24:36 +00:00
p . add_section ( ' options ' )
2009-03-11 14:26:50 +00:00
for opt in self . options . keys ( ) :
if opt in ( ' version ' , ' language ' , ' translate_out ' , ' translate_in ' , ' init ' , ' update ' ) :
continue
if opt in ( ' log_level ' , ' assert_exit_level ' ) :
p . set ( ' options ' , opt , loglevelnames . get ( self . options [ opt ] , self . options [ opt ] ) )
else :
p . set ( ' options ' , opt , self . options [ opt ] )
2010-03-11 08:49:41 +00:00
2009-11-24 14:44:05 +00:00
for sec in self . misc . keys ( ) :
for opt in self . misc [ sec ] . keys ( ) :
p . set ( sec , opt , self . misc [ sec ] [ opt ] )
2008-07-22 14:24:36 +00:00
# try to create the directories and write the file
try :
if not os . path . exists ( os . path . dirname ( self . rcfile ) ) :
os . makedirs ( os . path . dirname ( self . rcfile ) )
try :
p . write ( file ( self . rcfile , ' w ' ) )
2009-02-27 07:17:55 +00:00
os . chmod ( self . rcfile , 0600 )
2008-07-22 14:24:36 +00:00
except IOError :
sys . stderr . write ( " ERROR: couldn ' t write the config file \n " )
except OSError :
# what to do if impossible?
sys . stderr . write ( " ERROR: couldn ' t create the config directory \n " )
def get ( self , key , default = None ) :
return self . options . get ( key , default )
2009-08-14 09:21:06 +00:00
def get_misc ( self , sect , key , default = None ) :
return self . misc . get ( sect , { } ) . get ( key , default )
2008-07-22 14:24:36 +00:00
def __setitem__ ( self , key , value ) :
self . options [ key ] = value
def __getitem__ ( self , key ) :
return self . options [ key ]
2006-12-07 13:41:40 +00:00
config = configmanager ( )
2010-04-19 11:00:51 +00:00
# FIXME:following line should be called explicitly by the server
# when it starts, to allow doing 'import tools.config' from
# other python executables without parsing *their* args.
config . parse_config ( )
2008-07-23 15:01:27 +00:00