From 55b9797a59879a5e1f6764ac1616f9c1e5a4d253 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 29 May 2006 02:56:16 +0000 Subject: [PATCH] got setup command line interface fully working: - create, edit & update the header - install & update eGW - config eGW - create admin account - install & update languages - create & restore (install) backups ---> update, languages & backup can work for all domains at once ---> for use in 1.2 you have to update/switch the whole setup app to HEAD/trunk --- setup/admin_account.php | 70 +- setup/inc/class.setup.inc.php | 52 +- setup/inc/class.setup_detection.inc.php | 83 ++- setup/inc/class.setup_header.inc.php | 26 +- setup/inc/class.setup_process.inc.php | 4 +- setup/inc/class.setup_translation.inc.php | 40 +- setup/inc/functions.inc.php | 31 +- setup/index.php | 80 +-- setup/manageheader.php | 50 +- setup/setup-cli.php | 764 ++++++++++++++++------ setup/templates/default/admin_account.tpl | 4 + 11 files changed, 802 insertions(+), 402 deletions(-) diff --git a/setup/admin_account.php b/setup/admin_account.php index e592885cff..7f605b0e9f 100644 --- a/setup/admin_account.php +++ b/setup/admin_account.php @@ -1,36 +1,35 @@ + * @author Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - /* $Id$ */ - - // Little file to setup a demo install - - $GLOBALS['egw_info'] = array( - 'flags' => array( - 'noheader' => True, - 'nonavbar' => True, - 'currentapp' => 'home', - 'noapi' => True - )); - include('./inc/functions.inc.php'); - - // Authorize the user to use setup app and load the database - // Does not return unless user is authorized - if(!$GLOBALS['egw_setup']->auth('Config') || get_var('cancel',Array('POST'))) + if (!strstr($_SERVER['PHP_SELF'],'setup-cli.php')) { - Header('Location: index.php'); - exit; + $GLOBALS['egw_info'] = array( + 'flags' => array( + 'noheader' => True, + 'nonavbar' => True, + 'currentapp' => 'home', + 'noapi' => True + )); + include('./inc/functions.inc.php'); + + // Authorize the user to use setup app and load the database + // Does not return unless user is authorized + if(!$GLOBALS['egw_setup']->auth('Config') || get_var('cancel',Array('POST'))) + { + Header('Location: index.php'); + exit; + } + $GLOBALS['egw_setup']->loaddb(true); } - $GLOBALS['egw_setup']->loaddb(true); - $error = ''; if ($_POST['submit']) { @@ -40,6 +39,7 @@ $username = get_var('username',Array('POST')); $fname = get_var('fname',Array('POST')); $lname = get_var('lname',Array('POST')); + $email = get_var('email',Array('POST')); if($passwd != $passwd2 || !$username) { @@ -81,7 +81,8 @@ $setup_tpl->set_var('adminusername',lang('Admin username')); $setup_tpl->set_var('adminfirstname',lang('Admin first name')); $setup_tpl->set_var('adminlastname',lang('Admin last name')); - $setup_tpl->set_var('adminpassword',lang('Admin password')); + $setup_tpl->set_var('adminemail',lang('Admin email address')); + $setup_tpl->set_var('adminpassword',lang('Admin password')); $setup_tpl->set_var('adminpassword2',lang('Re-enter password')); $setup_tpl->set_var('create_demo_accounts',lang('Create demo accounts')); @@ -183,7 +184,7 @@ } /* Create records for administrator account, with Admins as primary and Default as additional group */ - $accountid = $GLOBALS['egw_setup']->add_account($username,$fname,$lname,$passwd,'Admins',True); + $accountid = $GLOBALS['egw_setup']->add_account($username,$fname,$lname,$passwd,'Admins',True,$email); if (!$accountid) { echo '

'.lang('Error in admin-creation !!!')."

\n"; @@ -196,7 +197,8 @@ $GLOBALS['egw_setup']->db->transaction_commit(); - Header('Location: index.php'); - exit; + if (!strstr($_SERVER['PHP_SELF'],'setup-cli.php')) + { + Header('Location: index.php'); + } } -?> diff --git a/setup/inc/class.setup.inc.php b/setup/inc/class.setup.inc.php index b0dc6a7ab5..071d286050 100644 --- a/setup/inc/class.setup.inc.php +++ b/setup/inc/class.setup.inc.php @@ -1,20 +1,17 @@ * - * and Dan Kuykendall * - * and Mark Peters * - * and Miles Lott * - * -------------------------------------------- * - * 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 2 of the License, or (at your * - * option) any later version. * - \**************************************************************************/ - - /* $Id$ */ +/** + * Setup + * + * @link http://www.egroupware.org + * @package setup + * @author Joseph Engo + * @author Dan Kuykendall + * @author Mark Peters + * @author Miles Lott + * @author Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ class egw_dummy { var $db; @@ -49,6 +46,12 @@ var $tbl_apps; var $tbl_config; var $tbl_hooks; + + /** + * @var float $required_php_version php version required by eGroupWare + */ + var $required_php_version = 4.3; + var $recommended_php_version = '5+'; function setup($html=False, $translation=False) { @@ -885,14 +888,16 @@ * * if the $username already exists, only the id is returned, no new user / group gets created * - * @param username string alphanumerical username or groupname (account_lid) - * @param first, last string first / last name + * @param string $username alphanumerical username or groupname (account_lid) + * @param string $first first name + * @param string $last last name * @param $passwd string cleartext pw - * @param $group string/boolean Groupname for users primary group or False for a group, default 'Default' - * @param $changepw boolean user has right to change pw, default False - * @return the numerical user-id + * @param string/boolean $group Groupname for users primary group or False for a group, default 'Default' + * @param boolean $changepw user has right to change pw, default False + * @param string $email + * @return int the numerical user-id */ - function add_account($username,$first,$last,$passwd,$group='default',$changepw=False) + function add_account($username,$first,$last,$passwd,$group='default',$changepw=False,$email='') { $this->setup_account_object(); @@ -908,7 +913,8 @@ 'account_lastname' => $last, 'account_status' => 'A', 'account_primary_group' => $groupid, - 'account_expires' => -1 + 'account_expires' => -1, + 'account_email' => $email, )); } $accountid = (int)$accountid; diff --git a/setup/inc/class.setup_detection.inc.php b/setup/inc/class.setup_detection.inc.php index 3d3338904f..dad4c46a2d 100755 --- a/setup/inc/class.setup_detection.inc.php +++ b/setup/inc/class.setup_detection.inc.php @@ -1,18 +1,14 @@ * - * and Miles Lott * - * -------------------------------------------- * - * 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 2 of the License, or (at your * - * option) any later version. * - \**************************************************************************/ - - /* $Id$ */ +/** + * Setup + * + * @link http://www.egroupware.org + * @package setup + * @author Dan Kuykendall + * @author Miles Lott + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ class setup_detection { @@ -306,6 +302,11 @@ } } + /** + * Check if eGW configuration exists + * + * @return int 1 = Needs config, ..., 10 = Config Ok + */ function check_config() { $GLOBALS['egw_setup']->db->Halt_On_Error = 'no'; @@ -314,18 +315,58 @@ return ''; } - $GLOBALS['egw_setup']->db->select($GLOBALS['egw_setup']->config_table,'config_value',array('config_name'=>'freshinstall'),__LINE__,__FILE__); - $configured = $GLOBALS['egw_setup']->db->next_record() ? $GLOBALS['egw_setup']->db->f('config_value') : False; - if($configed) + $GLOBALS['egw_setup']->db->select($GLOBALS['egw_setup']->config_table,'config_name,config_value',array('config_app' => 'phpgwapi'),__LINE__,__FILE__); + while($GLOBALS['egw_setup']->db->next_record()) + { + $config[$GLOBALS['egw_setup']->db->f(0)] = $GLOBALS['egw_setup']->db->f(1); + } + + $GLOBALS['egw_info']['setup']['header_msg'] = 'Stage 2 (Needs Configuration)'; + if(!count($config)) { - $GLOBALS['egw_info']['setup']['header_msg'] = 'Stage 2 (Needs Configuration)'; return 1; } - else + $config_errors =& $GLOBALS['egw_info']['setup']['config_errors']; + $config_errors = array(); + if (!check_dir($config['temp_dir'],$error_msg)) { - $GLOBALS['egw_info']['setup']['header_msg'] = 'Stage 2 (Configuration OK)'; - return 10; + $config_errors[] = lang("Your temporary directory '%1' %2",$config['temp_dir'],$error_msg); } + + if ((!isset($config['file_repository']) || $config['file_repository'] == 'sql') && + (!isset($config['file_store_contents']) || $config['file_store_contents'] == 'filesystem') && + !check_dir($config['files_dir'],$error_msg,true)) + { + $config_errors[] = lang("Your files directory '%1' %2",$config['files_dir'],$error_msg); + } + // set and create the default backup_dir + if (@is_writeable($config['files_dir']) && !$config['backup_dir'] && $config['file_store_contents'] == 'filesystem') + { + $config['backup_dir'] = $config['files_dir'].'/db_backup'; + if (!is_dir($config['backup_dir']) && mkdir($config['backup_dir'])) + { + $GLOBALS['egw_setup']->db->insert($GLOBALS['egw_setup']->config_table,array( + 'config_value' => $config['backup_dir'], + ),array( + 'config_app' => 'phpgwapi', + 'config_name' => 'backup_dir', + ),__LINE__,__FILE__); + } + } + if (!check_dir($config['backup_dir'],$error_msg,true)) + { + $config_errors[] = lang("Your backup directory '%1' %2",$config['backup_dir'],$error_msg); + } + if (!$config['mail_server'] || !$config['mail_server_type'] || !$config['smtp_server']) + { + $config_errors[] = lang('Missing or uncomplete mailserver configuration'); + } + if ($config_errors) + { + return 2; + } + $GLOBALS['egw_info']['setup']['header_msg'] = 'Stage 2 (Configuration OK)'; + return 10; } function check_lang($check = True) diff --git a/setup/inc/class.setup_header.inc.php b/setup/inc/class.setup_header.inc.php index b075364214..8b17b6fc4d 100644 --- a/setup/inc/class.setup_header.inc.php +++ b/setup/inc/class.setup_header.inc.php @@ -1,19 +1,15 @@ * -* ------------------------------------------------------------------------ * -* 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 2 of the License, or (at your * -* option) any later version. * -\**************************************************************************/ - -/* $Id: class.setup_html.inc.php 20991 2006-04-06 11:19:56Z ralfbecker $ */ +/** + * Setup - Manage the eGW config file header.inc.php + * + * @link http://www.egroupware.org + * @package setup + * @author Ralf Becker + * @author Miles Lott + * @author Tony Puglisi (Angles) + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ /** * Functions to manage the eGW config file header.inc.php diff --git a/setup/inc/class.setup_process.inc.php b/setup/inc/class.setup_process.inc.php index 21010b5e49..3806ab66c2 100755 --- a/setup/inc/class.setup_process.inc.php +++ b/setup/inc/class.setup_process.inc.php @@ -196,9 +196,9 @@ $is_windows = strtoupper(substr(PHP_OS,0,3)) == 'WIN'; $GLOBALS['current_config']['site_title'] = 'eGroupWare'; - $GLOBALS['current_config']['hostname'] = $_SERVER['HTTP_HOST']; + $GLOBALS['current_config']['hostname'] = $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : 'localhost'; - // guessing the phpGW url + // guessing the eGW url $parts = explode('/',$_SERVER['PHP_SELF']); array_pop($parts); // remove config.php array_pop($parts); // remove setup diff --git a/setup/inc/class.setup_translation.inc.php b/setup/inc/class.setup_translation.inc.php index 15a6755356..6eff5f1e6c 100644 --- a/setup/inc/class.setup_translation.inc.php +++ b/setup/inc/class.setup_translation.inc.php @@ -1,27 +1,15 @@ * - * and Dan Kuykendall * - * Handles multi-language support using flat files * - * -------------------------------------------------------------------------* - * This library is part of the eGroupWare API * - * http://www.egroupware.org/api * - * ------------------------------------------------------------------------ * - * This library is free software; you can redistribute it and/or modify it * - * under the terms of the GNU Lesser General Public License as published by * - * the Free Software Foundation; either version 2.1 of the License, * - * or any later version. * - * This library 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 Lesser General Public License for more details. * - * You should have received a copy of the GNU Lesser General Public License * - * along with this library; if not, write to the Free Software Foundation, * - * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - \**************************************************************************/ - - /* $Id$ */ +/** + * Setup + * + * @link http://www.egroupware.org + * @package setup + * @author Dan Kuykendall + * @author Miles Lott + * @author Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ if (!defined('MAX_MESSAGE_ID_LENGTH')) { @@ -31,6 +19,8 @@ class setup_translation { var $langarray = array(); + + var $no_translation_marker = '*'; /** * constructor for the class, loads all phrases into langarray @@ -81,7 +71,7 @@ */ function translate($key, $vars=False) { - $ret = $key.'*'; + $ret = $key . $this->no_translation_marker; $key = strtolower(trim($key)); if (isset($this->langarray[$key])) { @@ -99,7 +89,7 @@ { foreach($vars as $n => $var) { - $ret = preg_replace( '/%'.($n+1).'/', $var, $ret ); + $ret = str_replace( '%'.($n+1), $var, $ret ); } } return $ret; diff --git a/setup/inc/functions.inc.php b/setup/inc/functions.inc.php index c83496f174..896efdfa37 100644 --- a/setup/inc/functions.inc.php +++ b/setup/inc/functions.inc.php @@ -1,20 +1,17 @@ * - * and Dan Kuykendall * - * and Mark Peters * - * and Miles Lott * - * -------------------------------------------- * - * 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 2 of the License, or (at your * - * option) any later version. * - \**************************************************************************/ - - /* $Id$ */ +/** + * Setup + * + * @link http://www.egroupware.org + * @package setup + * @author Joseph Engo + * @author Dan Kuykendall + * @author Mark Peters + * @author Miles Lott + * @author Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ error_reporting(error_reporting() & ~E_NOTICE); @@ -63,7 +60,7 @@ $msg = lang('does not exist'); return false; } - if (!@is_writeable($dir)) + if (!@is_writeable($dir) && $_SERVER['HTTP_HOST']) // only do the check if we run by the webserver { $msg = lang('is not writeable by the webserver'); return false; diff --git a/setup/index.php b/setup/index.php index 7ddb04c76e..8c2bbefebb 100644 --- a/setup/index.php +++ b/setup/index.php @@ -1,14 +1,14 @@ + * @author Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ $GLOBALS['DEBUG'] = False; $GLOBALS['egw_info'] = array( @@ -157,11 +157,12 @@ $setup_tpl->set_var('subaction',@$subaction); // Old PHP - if (!function_exists('version_compare'))//version_compare() is only available in PHP4.1+ + if ((float) PHP_VERSION < $GLOBALS['egw_setup']->required_php_version) { $GLOBALS['egw_setup']->html->show_header($GLOBALS['egw_info']['setup']['header_msg'],True); $GLOBALS['egw_setup']->html->show_alert_msg('Error', - lang('You appear to be running an old version of PHP
It its recommend that you upgrade to a new version.
Older version of PHP might not run eGroupWare correctly, if at all.

Please upgrade to at least version %1','4.1')); + lang('You are using PHP version %1. eGroupWare now requires %2 or later, recommended is PHP %3.', + PHP_VERSION,$GLOBALS['egw_setup']->required_php_version,$GLOBALS['egw_setup']->recommended_php_version)); $GLOBALS['egw_setup']->html->show_footer(); exit; } @@ -178,8 +179,8 @@ $setup_tpl->set_var('db_step_text',lang('Step %1 - Simple Application Management',1)); $setup_tpl->set_var('lang_system_charset',lang('charset to use (use utf-8 if you plan to use languages with different charsets):')); - $setup_tpl->set_var('system_charset',str_replace('&','&',$GLOBALS['egw_setup']->translation->get_charsets('system_charset', - $GLOBALS['egw_setup']->system_charset))); + $setup_tpl->set_var('system_charset',str_replace('&','&', + $GLOBALS['egw_setup']->translation->get_charsets('system_charset',$GLOBALS['egw_setup']->system_charset))); switch($GLOBALS['egw_info']['setup']['stage']['db']) { @@ -307,7 +308,7 @@ // use uploaded backup, instead installing from scratch if ($_POST['upload']) { - $db_backup = CreateObject('phpgwapi.db_backup'); + $db_backup =& CreateObject('phpgwapi.db_backup'); if (is_array($_FILES['uploaded']) && !$_FILES['uploaded']['error'] && is_uploaded_file($_FILES['uploaded']['tmp_name'])) { @@ -410,7 +411,7 @@ $setup_tpl->set_var('config_status_alt',lang('not completed')); switch($GLOBALS['egw_info']['setup']['stage']['config']) { - case 1: + case 1: // AFAIK this dont happen any more, as we have setup_process::save_minimal_config() now -- RalfBecker $btn_config_now = $GLOBALS['egw_setup']->html->make_frm_btn_simple( lang('Please configure eGroupWare for your environment'), 'post','config.php', @@ -420,48 +421,13 @@ $setup_tpl->set_var('ldap_table_data',' '); break; case 10: - $GLOBALS['egw_setup']->db->select($GLOBALS['egw_setup']->config_table,'config_name,config_value',array('config_app' => 'phpgwapi'),__LINE__,__FILE__); - while($GLOBALS['egw_setup']->db->next_record()) + $setup_tpl->set_var('config_status_img',$completed); + $setup_tpl->set_var('config_status_alt',lang('completed')); + $config_msg = lang('Configuration completed'); + case 2: + if ($GLOBALS['egw_info']['setup']['config_errors']) { - $config[$GLOBALS['egw_setup']->db->f(0)] = $GLOBALS['egw_setup']->db->f(1); - } - $config_msg = ''; - if (!check_dir($config['temp_dir'],$error_msg)) - { - $config_msg = lang("Your temporary directory '%1' %2",$config['temp_dir'],$error_msg); - } - if ($config['file_repository'] == 'sql' && $config['file_store_contents'] == 'filesystem' && !check_dir($config['files_dir'],$error_msg,true)) - { - $config_msg .= ($config_msg?"
\n":'').lang("Your files directory '%1' %2",$config['files_dir'],$error_msg); - } - // set and create the default backup_dir - if (@is_writeable($config['files_dir']) && !$config['backup_dir'] && $config['file_store_contents'] == 'filesystem') - { - $config['backup_dir'] = $config['files_dir'].'/db_backup'; - if (!is_dir($config['backup_dir']) && mkdir($config['backup_dir'])) - { - $GLOBALS['egw_setup']->db->insert($GLOBALS['egw_setup']->config_table,array( - 'config_value' => $config['backup_dir'], - ),array( - 'config_app' => 'phpgwapi', - 'config_name' => 'backup_dir', - ),__LINE__,__FILE__); - } - } - if (!check_dir($config['backup_dir'],$error_msg,true)) - { - $no_backup_dir = lang("Your backup directory '%1' %2",$config['backup_dir'],$error_msg); - $config_msg .= ($config_msg?"
\n":'').$no_backup_dir; - } - if (!$config['mail_server'] || !$config['mail_server_type'] || !$config['smtp_server']) - { - $config_msg .= ($config_msg?"
\n":'').lang('Missing or uncomplete mailserver configuration'); - } - if (!$config_msg) - { - $setup_tpl->set_var('config_status_img',$completed); - $setup_tpl->set_var('config_status_alt',lang('completed')); - $config_msg = lang('Configuration completed'); + $config_msg = implode('
',$GLOBALS['egw_info']['setup']['config_errors']); } $btn_edit_config = $GLOBALS['egw_setup']->html->make_frm_btn_simple( $config_msg, diff --git a/setup/manageheader.php b/setup/manageheader.php index 3a2d89295e..b37f173e22 100644 --- a/setup/manageheader.php +++ b/setup/manageheader.php @@ -1,18 +1,14 @@ + * @author Miles Lott + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ $GLOBALS['egw_info'] = array( 'flags' => array( @@ -27,12 +23,6 @@ include('./inc/functions.inc.php'); require_once('./inc/class.setup_header.inc.php'); $GLOBALS['egw_setup']->header =& new setup_header(); -/* necessary ? -$GLOBALS['egw_info']['server']['versions']['current_header'] = $setup_info['phpgwapi']['versions']['current_header']; -$GLOBALS['egw_info']['server']['versions']['phpgwapi'] = $setup_info['phpgwapi']['version']; -unset($setup_info); -*/ - $setup_tpl = CreateObject('setup.Template','./templates/default'); $setup_tpl->set_file(array( 'T_head' => 'head.tpl', @@ -233,12 +223,22 @@ function show_header_form($validation_errors) $setup_tpl->set_var('pagemsg',$GLOBALS['egw_info']['setup']['PageMSG']); - // checking required PHP version 4.3+ - if((float) PHP_VERSION < '4.3') + // checking required PHP version + if ((float) PHP_VERSION < $GLOBALS['egw_setup']->required_php_version) { - echo '

' - . lang('You are using PHP version %1. eGroupWare now requires %2 or later, recommended is PHP %3.',PHP_VERSION,'4.3','5'). "\n" - . '

'; + $GLOBALS['egw_setup']->html->show_header($GLOBALS['egw_info']['setup']['header_msg'],True); + $GLOBALS['egw_setup']->html->show_alert_msg('Error', + lang('You are using PHP version %1. eGroupWare now requires %2 or later, recommended is PHP %3.', + PHP_VERSION,$GLOBALS['egw_setup']->required_php_version,$GLOBALS['egw_setup']->recommended_php_version)); + $GLOBALS['egw_setup']->html->show_footer(); + exit; + } + if((float) PHP_VERSION < $GLOBALS['egw_setup']->required_php_version) + { + echo '

' . + lang('You are using PHP version %1. eGroupWare now requires %2 or later, recommended is PHP %3.', + PHP_VERSION,$GLOBALS['egw_setup']->required_php_version,$GLOBALS['egw_setup']->recommended_php_version) . + "

\n"; $GLOBALS['egw_setup']->html->show_footer(); exit; } diff --git a/setup/setup-cli.php b/setup/setup-cli.php index 4f487ebf38..3fc438a2f8 100755 --- a/setup/setup-cli.php +++ b/setup/setup-cli.php @@ -1,28 +1,17 @@ #!/usr/bin/php * -* ------------------------------------------------------------------------ * -* 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 2 of the License, or (at your * -* option) any later version. * -\**************************************************************************/ - -/* $Id: class.socontacts_sql.inc.php 21634 2006-05-24 02:28:57Z ralfbecker $ */ - /** - * Command line interface for setup + * Setup - Command line interface * - * @package addressbook + * @link http://www.egroupware.org + * @package setup * @author Ralf Becker * @copyright (c) 2006 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ */ -chdir(dirname(__FILE__)); // to enable our relative pathes to work, if we are called with a path +chdir(dirname(__FILE__)); // to enable our relative pathes to work if ($_SERVER['argc'] > 1) { @@ -35,178 +24,491 @@ else $action = '--version'; } -if ((float) PHP_VERSION < '4.3') +// setting the language from the enviroment +$_POST['ConfigLang'] = get_lang(); +create_http_enviroment(); // guessing the docroot etc. + +// setting up the $GLOBALS['egw_setup'] object AND including the header.inc.php if it exists +$GLOBALS['egw_info'] = array( + 'flags' => array( + 'currentapp' => 'home', + 'noapi' => true, +)); +include('inc/functions.inc.php'); +$GLOBALS['egw_setup']->translation->no_translation_marker = ''; + +if ((float) PHP_VERSION < $GLOBALS['egw_setup']->required_php_version) { - fail(98,lang2('You are using PHP version %1. eGroupWare now requires %2 or later, recommended is PHP %3.',PHP_VERSION,'4.3','5+')); + fail(98,lang('You are using PHP version %1. eGroupWare now requires %2 or later, recommended is PHP %3.',PHP_VERSION,$GLOBALS['egw_setup']->required_php_version,$GLOBALS['egw_setup']->recommended_php_version)); } switch($action) { - case '--show-languages': - case '--show-lang': - echo html_entity_decode(file_get_contents('lang/languages'),ENT_COMPAT,'utf-8'); - break; - case '--version': case '--check': - do_check(); + do_check($arguments[0]); break; case '--create-header': case '--edit-header': - case '--update-header': + case '--upgrade-header': do_header($action == '--create-header',$arguments); break; + case '--install': + do_install($arguments[0]); + break; + + case '--config': + do_config($arguments); + break; + + case '--admin': + do_admin($arguments[0]); + break; + + case '--language': + do_lang($arguments[0]); + break; + + case '--update': + do_update($arguments[0]); + break; + + case '--backup': + do_backup($arguments[0]); + break; + + case '--languages': + echo html_entity_decode(file_get_contents('lang/languages'),ENT_COMPAT,'utf-8'); + break; + + case '--charsets': + echo html_entity_decode(implode("\n",$GLOBALS['egw_setup']->translation->get_charsets(false)),ENT_COMPAT,'utf-8')."\n"; + break; + case '--exit-codes': list_exit_codes(); break; - default: - fail(20,lang2("Unknows option '%1' !!!",$action)); - case '--help': case '--usage': do_usage(); break; + + default: + fail(90,lang("Unknows option '%1' !!!",$action)); } exit(0); /** - * Dummy translation function, if we ever want to translate the command line interface + * Configure eGroupWare * - * @param string $message the message with %# replacements - * @param string $arg variable number of arguments - * @return string + * @param array $args domain(default),[config user(admin)],password,[,name=value,...] --files-dir --backup-dir --mailserver */ -function lang2($message,$arg=null) +function do_config($args) { - $args = func_get_args(); - array_shift($args); + $options = _check_auth_config(array_shift($args),15); - return str_replace(array('%1','%2','%3','%4','%5'),$args,$message); -} - -/** - * Echos usage message - */ -function do_usage() -{ - echo lang2('Usage: %1 {--version|--create-header|--edit-header|--install|--update} [additional options]',basename($_SERVER['argv'][0]))."\n\n"; - - echo '--install '.lang2('[comma-separated languages(en)],[charset(default depending on languages default)],[backup to install]')."\n"; - echo '--show-languages '.lang2('get a list of availible languages')."\n"; - echo '--update '.lang2('run a database schema update (if necessary)')."\n"; - echo '--check '.lang2('checks eGroupWare\'s installed, it\'s versions and necessary upgrads (exits 0: eGW is up to date, 1: no header.inc.php exists, 2: header update necessary, 3: database schema update necessary)')."\n"; - echo '--exit-codes '.lang2('list all exist codes of the command line interface, 0 means Ok')."\n"; - - echo "\n".lang2('Create or edit the eGroupWare configuration file: header.inc.php:')."\n"; - echo '--create-header '.lang2('header-password[,header-user(admin)]')."\n"; - echo '--edit-header '.lang2('[header-password],[header-user],[new-password],[new-user]')."\n"; - - echo "\n".lang2('Additional options and there defaults (int brackets)')."\n"; - echo '--server-root '.lang2('path of eGroupWare install directory (default auto-detected)')."\n"; - echo '--session-type '.lang2('{db|php(default)|php-restore}')."\n"; - echo '--limit-access '.lang2('comma separated ip-addresses or host-names, default access to setup from everywhere')."\n"; - echo '--mcrypt '.lang2('use mcrypt to crypt session-data: {off(default)|on},[mcrypt-init-vector(default randomly generated)],[mcrypt-version(default empty = recent)]')."\n"; - echo '--db-persistent '.lang2('use persistent db connections: {on(default)|off}')."\n"; - echo '--domain-selectbox '.lang2('{off(default)|on}')."\n"; - - echo "\n".lang2('Adding, editing or deleting an eGroupWare domain / database instance:')."\n"; - echo '--domain '.lang2('add or edit a domain: [domain-name(default)],[db-name(egroupware)],[db-user(egroupware)],db-password,[db-type(mysql)],[db-host(localhost)],[db-port(db specific)],[config-user(as header)],[config-passwd(as header)]')."\n"; - echo '--delete-domain '.lang2('domain-name')."\n"; -} - -/** - * detect eGW versions - * - * @return array array with versions (keys phpgwapi, current_header and header) - */ -function detect_versions() -{ - $versions = null; - $GLOBALS['egw_info']['flags']['noapi'] = true; - if (!@include('../header.inc.php')) + $values = array(); + foreach($options as $option) { - if (!@include('../phpgwapi/setup/setup.inc.php')) - { - fail(99,lang2("eGroupWare sources in '%1' are not complete, file '%2' missing !!!",realpath('..'),'phpgwapi/setup/setup.inc.php')); // should not happen ;-) - } - return array( - 'phpgwapi' => $setup_info['phpgwapi']['version'], - 'current_header' => $setup_info['phpgwapi']['versions']['current_header'], - ); + list($name,$value) = explode('=',$option,2); + $values[$name] = $value; } - return $GLOBALS['egw_info']['server']['versions']; + static $config = array( + '--files-dir' => 'files_dir', + '--backup-dir' => 'backup_dir', + '--temp-dir' => 'temp_dir', + '--webserver-url' => 'webserver_url', + '--mailserver' => array( //server,{IMAP|IMAPS|POP|POPS},[domain],[{standard(default)|vmailmgr = add domain for mailserver login}] + 'mail_server', + array('name' => 'mail_server_type','allowed' => array('imap','imaps','pop3','pop3s')), + 'mail_suffix', + array('name' => 'mail_login_type','allowed' => array('standard','vmailmgr')), + ), + '--smtpserver' => array( //smtp server,[smtp port],[smtp user],[smtp password] + 'smtp_server','smtp_port','smtp_auth_user','smtp_auth_passwd'), + ); + while (($arg = array_shift($args))) + { + if (!isset($config[$arg])) fail(90,lang("Unknow option '%1' !!!",$arg)); + + foreach(explode(',',array_shift($args)) as $n => $value) + { + if ($value === '') continue; + + $name = $config[$arg][$n]; + if (is_array($name)) + { + if (!in_array($value,$name['allowed'])) fail(91,"'%1' is not allowed as %2. arguments of option %3 !!!",$value,1+$n,$arg); + $name = $name['name']; + } + $values[$name] = $value; + } + } + foreach($values as $name => $value) + { + $GLOBALS['egw_setup']->db->insert($GLOBALS['egw_setup']->config_table,array( + 'config_value' => $value, + ),array( + 'config_app' => 'phpgwapi', + 'config_name' => $name, + ),__LINE__,__FILE__); + } +} + +/** + * Create an admin account + * + * @param string $arg domain(default),[config user(admin)],password,username,password,[first name],[last name],[email] + */ +function do_admin($arg) +{ + list($_POST['username'],$_POST['passwd'],$_POST['fname'],$_POST['lname'],$_POST['email']) = _check_auth_config($arg,15); + $_POST['passwd2'] = $_POST['passwd']; + + if (!$_POST['fname']) $_POST['fname'] = 'Admin'; + if (!$_POST['lname']) $_POST['lname'] = 'User'; + + $_POST['submit'] = true; + ob_start(); + include('admin_account.php'); + $error = ob_get_contents(); + ob_end_clean(); + + if ($error) + { + fail(41,lang('Error in admin-creation !!!')); + } + echo lang('Admin account successful created.')."\n"; +} + +/** + * Backup one or all domains + * + * @param string $arg domain(all),[config user(admin)],password,[backup-file, 'no' for no backup or empty for default name] + * @param boolean $quite_check quiten the call to _check_auth_config + */ +function do_backup($arg,$quite_check=false) +{ + list($domain,,,$backup) = $options = explode(',',$arg); + + $domains = $GLOBALS['egw_domain']; + if ($domain && $domain != 'all') + { + $domains = array($domain => $GLOBALS['egw_domain'][$domain]); + } + foreach($domains as $domain => $data) + { + $options[0] = $domain; + + if ($quite_check) ob_start(); + _check_auth_config(implode(',',$options),14); + if ($quite_check) ob_end_clean(); + + if ($backup == 'no') + { + echo lang('Backup skipped!')."\n"; + } + else + { + $db_backup =& CreateObject('phpgwapi.db_backup'); + if (is_resource($f = $db_backup->fopen_backup($backup))) + { + echo lang('backup started, this might take a view minutes ...')."\n"; + $db_backup->backup($f); + fclose($f); + echo lang('backup finished')."\n"; + } + else // backup failed ==> dont start the upgrade + { + fail(50,lang('Backup failed').': '.$f); + } + } + } +} + +/** + * Update one or all domains + * + * @param string $arg domain(all),[config user(admin)],password,[backup-file, 'no' for no backup or empty for default name] + */ +function do_update($arg) +{ + global $setup_info; + + list($domain,,,$no_backup) = $options = explode(',',$arg); + + $domains = $GLOBALS['egw_domain']; + if ($domain && $domain != 'all') + { + $domains = array($domain => $GLOBALS['egw_domain'][$domain]); + } + foreach($domains as $domain => $data) + { + $options[0] = $domain; + $arg = implode(',',$options); + + _check_auth_config($arg,14); + + if ($GLOBALS['egw_info']['setup']['stage']['db'] != 4) + { + echo lang('No update necessary, domain %1(%2) is up to date.',$domain,$data['db_type'])."\n"; + } + else + { + echo lang('Starting update ...')."\n"; + + do_backup($arg,true); + + ob_start(); + $GLOBALS['egw_setup']->process->pass($setup_info,'upgrade',false); + $messages = ob_get_contents(); + ob_end_clean(); + if ($messages) strip_tags($messages)."\n"; + + echo lang('Update finished.')."\n"; + } + } +} + +/** + * Install / update languages + * + * @param string $arg domain(all),[config user(admin)],password,[+][lang1][,lang2,...] + */ +function do_lang($arg) +{ + global $setup_info; + + list($domain,,,$no_backup) = $options = explode(',',$arg); + + $domains = $GLOBALS['egw_domain']; + if ($domain && $domain != 'all') + { + $domains = array($domain => $GLOBALS['egw_domain'][$domain]); + } + foreach($domains as $domain => $data) + { + $options[0] = $domain; + $arg = implode(',',$options); + + $langs = _check_auth_config($arg,15); + + $GLOBALS['egw_setup']->translation->setup_translation_sql(); + + if ($langs[0]{0} === '+' || !count($langs)) // update / add to existing languages + { + if ($langs[0]{0} === '+') + { + if ($langs[0] === '+') + { + array_shift($langs); + } + else + { + $langs[0] = substr($langs[0],1); + } + } + $installed_langs = $GLOBALS['egw_setup']->translation->sql->get_installed_langs(true); + if (is_array($installed_langs)) + { + $langs = array_merge($langs,array_keys($installed_langs)); + } + } + $langs = array_unique($langs); + echo lang('Start updating languages %1 ...',implode(',',$langs))."\n"; + $GLOBALS['egw_setup']->translation->sql->install_langs($langs); + echo lang('languages updated.')."\n"; + } +} + +/** + * Check if eGW is installed according to $stop and we have the necessary authorization for config + * + * We allow the config user/pw of the domain or the header admin user/pw! + * + * @param string $arg [domain(default)],[user(admin)],password + * @param int $stop see do_check() + * @return array with unprocessed arguments from $arg + */ +function _check_auth_config($arg,$stop=15) +{ + $options = explode(',',$arg); + if (!($domain = array_shift($options))) $domain = 'default'; + if (!($user = array_shift($options))) $user = 'admin'; + $password = array_shift($options); + + do_check($domain,$stop); // check if eGW is installed + + //echo "check_auth('$user','$password','{$GLOBALS['egw_domain'][$domain]['config_user']}','{$GLOBALS['egw_domain'][$domain]['config_passwd']}')\n"; + if (!$GLOBALS['egw_setup']->check_auth($user,$password,$GLOBALS['egw_domain'][$domain]['config_user'], + $GLOBALS['egw_domain'][$domain]['config_passwd'])) + { + fail(40,lang("Access denied: wrong username or password to configure the domain '%1(%2)' !!!",$domain,$GLOBALS['egw_domain'][$domain]['db_type'])); + } + return $options; +} + +/** + * Install eGroupWare + * + * @param string $args domain,[backup-file],[charset] + */ +function do_install($args) +{ + global $setup_info; + + list($domain,$backup,$charset) = explode(',',$args); + if (!$domain) $domain = 'default'; + + if (!do_check($domain,13)) // check and fail if we have no working db + { + fail(30,lang('eGroupWare is already installed!')); + } + // use uploaded backup, instead installing from scratch + if ($backup) + { + $db_backup =& CreateObject('phpgwapi.db_backup'); + + if (!is_resource($f = $db_backup->fopen_backup($backup,true))) + { + fail(31,lang('Restore failed')); + } + echo lang('Restore started, this might take a view minutes ...')."\n"; + $db_backup->restore($f,$charset); + fclose($f); + echo lang('Restore finished')."\n"; + } + else + { + if (!$charset) $charset = $GLOBALS['egw_setup']->translation->langarray['charset']; + + $setup_info = $GLOBALS['egw_setup']->detection->upgrade_exclude($setup_info); + + // Set the DB's client charset if a system-charset is set + $GLOBALS['egw_setup']->system_charset = strtolower($charset); + $GLOBALS['egw_setup']->db->Link_ID->SetCharSet($charset); + + echo lang('Installation started, this might take a view minutes ...')."\n"; + $setup_info = $GLOBALS['egw_setup']->process->pass($setup_info,'new',false,True); + echo lang('Installation finished')."\n"; + } } /** * Check if eGW is installed, which versions and if an update is needed + * + * @param string $domain='' domain to check, default '' = all + * @param int $stop=0 stop checks before given exit-code, defaul 0 = all checks */ -function do_check() +function do_check($domain='',$stop=0) { - $versions = detect_versions(); - echo lang2('eGroupWare API version %1 found.',$versions['phpgwapi'])."\n"; + global $setup_info; + static $header_checks=true; // output the header checks only once - if (isset($versions['header'])) // header.inc.php exists + $versions =& $GLOBALS['egw_info']['server']['versions']; + + if (!$versions['phpgwapi']) { - echo lang2("eGroupWare configuration file (header.inc.php) version %1 exists%2",$versions['header'], - ($versions['header'] == $versions['current_header'] ? ' '.lang2('and is up to date') : '')).".\n"; - - if ($versions['header'] != $versions['current_header']) + if (!include('../phpgwapi/setup/setup.inc.php')) { - // exit-code 2: header.inc.php needs upgrading - fail(2,lang2('You need to upgrade your header to the new version %1 (using --edit-header)!',$versions['current_header'])); + fail(99,lang("eGroupWare sources in '%1' are not complete, file '%2' missing !!!",realpath('..'),'phpgwapi/setup/setup.inc.php')); // should not happen ;-) + } + $versions['phpgwapi'] = $setup_info['phpgwapi']['version']; + unset($setup_info); + } + if ($header_checks) + { + echo lang('eGroupWare API version %1 found.',$versions['phpgwapi'])."\n"; + } + $header_stage = $GLOBALS['egw_setup']->detection->check_header(); + if ($stop && $header_stage == $stop) return true; + + switch ($header_stage) + { + case 1: fail(1,lang('eGroupWare configuration file (header.inc.php) does NOT exist.')."\n".lang('Use --create-header to create the configuration file (--usage gives more options).')); + + case 2: fail(2,lang('eGroupWare configuration file (header.inc.php) version %1 exists%2',$versions['header'],'.')."\n".lang('No header admin password set! Use --edit-header [,] to set one (--usage gives more options).')); + + case 3: fail(3,lang('eGroupWare configuration file (header.inc.php) version %1 exists%2',$versions['header'],'.')."\n".lang('No eGroupWare domains / database instances exist! Use --edit-header --domain to add one (--usage gives more options).')); + + case 4: fail(4,lang('eGroupWare configuration file (header.inc.php) version %1 exists%2',$versions['header'],'.')."\n".lang('It needs upgrading to version %1! Use --update-header [,] to do so (--usage gives more options).',$versions['current_header'])); + } + if ($header_checks) + { + echo lang('eGroupWare configuration file (header.inc.php) version %1 exists%2', + $versions['header'],' '.lang('and is up to date')).".\n"; + } + $header_checks = false; // no further output of the header checks + + $domains = $GLOBALS['egw_domain']; + if ($domain) // domain to check given + { + if (!isset($GLOBALS['egw_domain'][$domain])) fail(92,lang("Domain '%1' does NOT exist !!!",$domain)); + + $domains = array($domain => $GLOBALS['egw_domain'][$domain]); + } + foreach($domains as $domain => $data) + { + $GLOBALS['egw_setup']->ConfigDomain = $domain; // set the domain the setup class operates on + if (count($GLOBALS['egw_domain']) > 1) echo "\n".lang('eGroupWare domain/instance %1(%2):',$domain,$data['db_type'])."\n"; + + $setup_info = $GLOBALS['egw_setup']->detection->get_versions(); + // check if there's already a db-connection and close if, otherwise the db-connection of the previous domain will be used + if (is_object($GLOBALS['egw_setup']->db)) + { + $GLOBALS['egw_setup']->db->disconnect(); + } + $GLOBALS['egw_setup']->loaddb(); + + $db = $data['db_type'].'://'.$data['db_user'].'@'.$data['db_host'].'/'.$data['db_name']; + + $db_stage =& $GLOBALS['egw_info']['setup']['stage']['db']; + if (($db_stage = $GLOBALS['egw_setup']->detection->check_db($setup_info)) != 1) + { + $setup_info = $GLOBALS['egw_setup']->detection->get_db_versions($setup_info); + $db_stage = $GLOBALS['egw_setup']->detection->check_db($setup_info); + } + if ($stop && 10+$db_stage == $stop) return true; + + switch($db_stage) + { + case 1: fail(11,lang('Your Database is not working!')." $db: ".$GLOBALS['egw_setup']->db->Error); + + case 3: fail(13,lang('Your database is working, ibut you dont have any applications installed')." ($db). ".lang("Use --install to install eGroupWare.")); + + case 4: fail(14,lang('eGroupWare API needs a database (schema) update from version %1 to %2!',$setup_info['phpgwapi']['currentver'],$versions['phpgwapi']).' '.lang('Use --update to do so.')); + + case 10: // also check apps of updates + $apps_to_upgrade = array(); + foreach($setup_info as $app => $data) + { + if ($data['currentver'] && $data['version'] && $data['version'] != $data['currentver']) + { + $apps_to_upgrade[] = $app; + } + } + if ($apps_to_upgrade) + { + $db_stage = 4; + if ($stop && 10+$db_stage == $stop) return true; + fail(14,lang('The following applications need to be upgraded:').' '.implode(', ',$apps_to_upgrade).'! '.lang('Use --update to do so.')); + } + break; + } + echo lang("database is version %1 and up to date.",$setup_info['phpgwapi']['currentver'])."\n"; + + $GLOBALS['egw_setup']->detection->check_config(); + if ($GLOBALS['egw_info']['setup']['config_errors'] && $stop != 15) + { + fail(15,lang('You need to configure eGroupWare:')."\n- ".@implode("\n- ",$GLOBALS['egw_info']['setup']['config_errors'])); } } - else - { - // exit-code 1: no header.inc.php - $this->check_fail_header_exists(); - } - // ToDo: check if eGW needs a schema upgrade and exit(3) if so + return false; } -function fail($exit_code,$message) -{ - echo $message."\n"; - exit($exit_code); -} - -/** - * List all exit codes used by the command line interface - * - */ -function list_exit_codes() -{ - error_reporting(error_reporting() & ~E_NOTICE); - - $codes = array(); - foreach(file(__FILE__) as $line) - { - if (preg_match('/fail\(([0-9]+),(.*)\);/',$line,$matches)) - { - eval('$codes['.$matches[1].'] = '.$matches[2].';'); - } - } - ksort($codes,SORT_NUMERIC); - foreach($codes as $num => $msg) - { - echo $num."\t".str_replace("\n","\n\t",$msg)."\n"; - } -} - -/** - * Check if we have a header.inc.php and fail with exit(10) if not - * - */ -function check_fail_header_exists() -{ - if (!file_exists('../header.inc.php')) - { - fail(1,lang2('eGroupWare configuration file (header.inc.php) does NOT exist.')."\n".lang2('Use --create-header to create the configuration file (--usage gives more options).')); - } -} /** * Create, edit or update the header.inc.php * @@ -216,38 +518,32 @@ function check_fail_header_exists() */ function do_header($create,&$arguments) { - // setting up the $GLOBALS['egw_setup'] object AND including the header.inc.php if it exists - $GLOBALS['egw_info'] = array( - 'flags' => array( - 'currentapp' => 'home', - 'noapi' => true, - )); - include('inc/functions.inc.php'); - require_once('inc/class.setup_header.inc.php'); $GLOBALS['egw_setup']->header =& new setup_header(); if (!file_exists('../header.inc.php')) { - if (!$create) $this->check_fail_header_exists(); + if (!$create) fail(1,lang('eGroupWare configuration file (header.inc.php) does NOT exist.')."\n".lang('Use --create-header to create the configuration file (--usage gives more options).')); $GLOBALS['egw_setup']->header->defaults(false); } else { - if ($create) fail(11,lang2('eGroupWare configuration file header.inc.php already exists, you need to use --edit-header or delete it first!')); + if ($create) fail(20,lang('eGroupWare configuration file header.inc.php already exists, you need to use --edit-header or delete it first!')); // header.inc.php is already include by include('inc/functions.inc.php')! unset($GLOBALS['egw_info']['flags']); - // check header-admin-user and -password - @list($password,$user) = explode(',',@$arguments[0]); - if (!$user) $user = 'admin'; - require_once('inc/class.setup.inc.php'); - if (!setup::check_auth($user,$password,$GLOBALS['egw_info']['server']['header_admin_user'], - $GLOBALS['egw_info']['server']['header_admin_password'])) + // check header-admin-user and -password (only if a password is set!) + if ($GLOBALS['egw_info']['server']['header_admin_password']) { - fail(12,lang2('Access denied: wrong username or password for manage-header !!!')); + @list($password,$user) = explode(',',@$arguments[0]); + if (!$user) $user = 'admin'; + if (!$GLOBALS['egw_setup']->check_auth($user,$password,$GLOBALS['egw_info']['server']['header_admin_user'], + $GLOBALS['egw_info']['server']['header_admin_password'])) + { + fail(21,lang('Access denied: wrong username or password for manage-header !!!')); + } } $GLOBALS['egw_info']['server']['server_root'] = EGW_SERVER_ROOT; $GLOBALS['egw_info']['server']['include_root'] = EGW_INCLUDE_ROOT; @@ -314,12 +610,12 @@ function do_header($create,&$arguments) if ($arg == '--delete-domain') { - if (!isset($GLOBALS['egw_domain'][$values])) fail(22,lang2("Domain '%1' does NOT exist !!!",$values)); + if (!isset($GLOBALS['egw_domain'][$values])) fail(92,lang("Domain '%1' does NOT exist !!!",$values)); unset($GLOBALS['egw_domain'][$values]); continue; } - if (!isset($options[$arg])) fail(20,lang2("Unknow option '%1' !!!",$arg)); + if (!isset($options[$arg])) fail(90,lang("Unknow option '%1' !!!",$arg)); $option = $options[$arg]; $values = !is_array($option) ? array($values) : explode(',',$values); @@ -337,7 +633,7 @@ function do_header($create,&$arguments) { if (!isset($data['allowed'][$value])) { - fail(21,lang2("'%1' is not allowed as %2. arguments of option %3 !!!",$value,1+$n,$arg)); + fail(91,lang("'%1' is not allowed as %2. arguments of option %3 !!!",$value,1+$n,$arg)); } $value = $data['allowed'][$value]; } @@ -351,10 +647,10 @@ function do_header($create,&$arguments) } elseif ($value !== '') { - set_value($GLOBALS,str_replace('@',$remember,$type),$name,$value); + _set_value($GLOBALS,str_replace('@',$remember,$type),$name,$value); if ($name == 'egw_info/server/server_root') { - set_value($GLOBALS,'egw_info/server/include_root',$name,$value); + _set_value($GLOBALS,'egw_info/server/include_root',$name,$value); } } ++$n; @@ -364,8 +660,8 @@ function do_header($create,&$arguments) { echo '$GLOBALS[egw_info] = '; print_r($GLOBALS['egw_info']); echo '$GLOBALS[egw_domain] = '; print_r($GLOBALS['egw_domain']); - echo "\n".lang2('Configuration errors:')."\n- ".implode("\n- ",$errors)."\n"; - fail(23,lang2("You need to fix the above errors, before the configuration file header.inc.php can be written!")); + echo "\n".lang('Configuration errors:')."\n- ".implode("\n- ",$errors)."\n"; + fail(23,lang("You need to fix the above errors, before the configuration file header.inc.php can be written!")); } $header = $GLOBALS['egw_setup']->header->generate($GLOBALS['egw_info'],$GLOBALS['egw_domain'], $GLOBALS['egw_info']['server']['server_root'],$GLOBALS['egw_info']['server']['include_root']); @@ -378,14 +674,22 @@ function do_header($create,&$arguments) if (($f = fopen('../header.inc.php','wb')) && fwrite($f,$header)) { fclose($f); - echo "\n".lang2('header.inc.php successful written.')."\n\n"; + echo "\n".lang('header.inc.php successful written.')."\n\n"; exit(0); } } - fail(24,lang2("Failed writing configuration file header.inc.php, check the permissions !!!")); + fail(24,lang("Failed writing configuration file header.inc.php, check the permissions !!!")); } -function set_value($arr,$index,$name,$value) +/** + * Set a value in the given array $arr with (multidimensional) key $index[/$name] + * + * @param array &$arr + * @param string $index multidimensional index written with / as separator, eg. egw_info/server/ + * @param string $name additional index to use if $index end with a slash + * @param mixed $value value to set + */ +function _set_value(&$arr,$index,$name,$value) { if (substr($index,-1) == '/') $index .= $name; @@ -397,23 +701,117 @@ function set_value($arr,$index,$name,$value) $var = strstr($name,'passw') ? md5($value) : $value; } -if (!function_exists('generate_mcyrpt_iv')) +/** + * Reads the users language from the enviroment + * + * @return string 2 or 5 digit language code used in eGW + */ +function get_lang() { - function generate_mcyrpt_iv() + list($lang,$nation,$charset) = split("[_.]",$_SERVER['LANG']); + $nation = strtolower($nation); + + foreach(file('lang/languages') as $line) { - srand((double)microtime()*1000000); - $random_char = array( - '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f', - 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', - 'w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L', - 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' - ); + list($code,$language) = explode("\t",$line); + $languages[$code] = $language; + } + if (isset($languages[$lang.'-'.$nation])) return $lang.'-'.$nation; - $iv = ''; - for($i=0; $i<30; $i++) + if (isset($languages[$lang])) return $lang; + + return 'en'; +} + +/** + * Try guessing the document root of the webserver, should work for RH, SuSE, debian and plesk + */ +function create_http_enviroment() +{ + $_SERVER['SCRIPT_FILENAME'] = __FILE__; + + foreach(array('httpsdocs','httpdocs','htdocs','html','www') as $docroottop) + { + $parts = explode($docroottop,__FILE__); + if (count($parts) == 2) { - $iv .= $random_char[rand(1,count($random_char))]; + $_SERVER['DOCUMENT_ROOT'] = $parts[0].$docroottop; + $_SERVER['PHP_SELF'] = str_replace('\\','/',$parts[1]); + break; } - return $iv; + } + //print_r($_SERVER); exit; +} + +/** + * Echos usage message + */ +function do_usage() +{ + echo lang('Usage: %1 {--check|--create-header|--edit-header|--install|--config|--admin|--language|--backup|--update} [additional options]',basename($_SERVER['argv'][0]))."\n\n"; + + echo '--check '.lang('checks eGroupWare\'s installed, it\'s versions and necessary upgrads (return values see --exit-codes)')."\n"; + echo '--install '.lang('domain(default),[backup to install],[charset(default depends on language)]')."\n"; + echo '--config '.lang('domain(default),[config user(admin)],password,[,name=value,...] sets config values beside:')."\n"; + echo ' --files-dir, --backup-dir, --temp-dir '.lang('path to various directories: have to exist and be writeable by the webserver')."\n"; + echo ' --webserver-url '.lang('eg. /egroupware or http://domain.com/egroupware, default: %1',str_replace('/setup/setup-cli.php','',$_SERVER['PHP_SELF']))."\n"; + echo ' --mailserver '.lang('host,{imap|pop3|imaps|pop3s},[domain],[{standard(default)|vmailmgr = add domain for mailserver login}]')."\n"; + echo ' --smtpserver '.lang('host,[smtp port],[smtp user],[smtp password]')."\n"; + echo '--admin '.lang('creates an admin user: domain(default),[config user(admin)],password,username,password,[first name],[last name],[email]')."\n"; + echo '--language '.lang('install or update translations: domain(all),[config user(admin)],password,[[+]lang1[,lang2,...]] + adds, no langs update existing ones')."\n"; + echo '--backup '.lang('domain(all),[config user(admin)],password,[file-name(default: backup-dir/db_backup-YYYYMMDDHHii)]')."\n"; + echo '--update '.lang('run a database schema update (if necessary): domain(all),[config user(admin)],password')."\n"; + + echo "\n".lang('Create or edit the eGroupWare configuration file: header.inc.php:')."\n"; + echo '--create-header '.lang('header-password[,header-user(admin)]')."\n"; + echo '--edit-header '.lang('[header-password],[header-user],[new-password],[new-user]')."\n"; + + echo "\n".lang('Additional options and there defaults (int brackets)')."\n"; + echo '--server-root '.lang('path of eGroupWare install directory (default auto-detected)')."\n"; + echo '--session-type '.lang('{db|php(default)|php-restore}')."\n"; + echo '--limit-access '.lang('comma separated ip-addresses or host-names, default access to setup from everywhere')."\n"; + echo '--mcrypt '.lang('use mcrypt to crypt session-data: {off(default)|on},[mcrypt-init-vector(default randomly generated)],[mcrypt-version]')."\n"; + echo '--db-persistent '.lang('use persistent db connections: {on(default)|off}')."\n"; + echo '--domain-selectbox '.lang('{off(default)|on}')."\n"; + + echo "\n".lang('Adding, editing or deleting an eGroupWare domain / database instance:')."\n"; + echo '--domain '.lang('add or edit a domain: [domain-name(default)],[db-name(egroupware)],[db-user(egroupware)],db-password,[db-type(mysql)],[db-host(localhost)],[db-port(db specific)],[config-user(as header)],[config-passwd(as header)]')."\n"; + echo '--delete-domain '.lang('domain-name')."\n"; + + echo "\n".lang('List availible values:')."\n"; + echo '--languages '.lang('list of availible translations')."\n"; + echo '--charsets '.lang('charsets used by the different languages')."\n"; + echo '--exit-codes '.lang('all exit codes of the command line interface')."\n"; +} + +function fail($exit_code,$message) +{ + echo $message."\n"; + exit($exit_code); +} + +/** + * List all exit codes used by the command line interface + * + * The list is generated by "greping" this file for calls to the fail() function. + * Calls to fail() have to be in one line, to be recogniced! + */ +function list_exit_codes() +{ + error_reporting(error_reporting() & ~E_NOTICE); + + $codes = array('Ok'); + foreach(file(__FILE__) as $n => $line) + { + if (preg_match('/fail\(([0-9]+),(.*)\);/',$line,$matches)) + { + //echo "Line $n: $matches[1]: $matches[2]\n"; + eval('$codes['.$matches[1].'] = '.$matches[2].';'); + } + } + ksort($codes,SORT_NUMERIC); + foreach($codes as $num => $msg) + { + echo $num."\t".str_replace("\n","\n\t",$msg)."\n"; } } diff --git a/setup/templates/default/admin_account.tpl b/setup/templates/default/admin_account.tpl index ab27b79009..4fff9ce55e 100644 --- a/setup/templates/default/admin_account.tpl +++ b/setup/templates/default/admin_account.tpl @@ -28,6 +28,10 @@ {adminlastname} + + {adminemail} + + {adminpassword}