2006-09-19 09:00:57 +02:00
#!/usr/bin/php -qC
2006-05-28 01:59:41 +02:00
< ? php
/**
2006-05-29 04:56:16 +02:00
* Setup - Command line interface
2006-05-28 01:59:41 +02:00
*
2006-05-29 04:56:16 +02:00
* @ link http :// www . egroupware . org
* @ package setup
2006-05-28 01:59:41 +02:00
* @ author Ralf Becker < RalfBecker - AT - outdoor - training . de >
* @ copyright ( c ) 2006 by Ralf Becker < RalfBecker - AT - outdoor - training . de >
* @ license http :// opensource . org / licenses / gpl - license . php GPL - GNU General Public License
2006-05-29 04:56:16 +02:00
* @ version $Id $
2006-05-28 01:59:41 +02:00
*/
2006-05-29 04:56:16 +02:00
chdir ( dirname ( __FILE__ )); // to enable our relative pathes to work
2006-05-28 01:59:41 +02:00
2006-09-19 09:00:57 +02:00
if ( isset ( $_SERVER [ 'HTTP_HOST' ])) // security precaution: forbit calling setup-cli as web-page
2006-09-18 11:28:51 +02:00
{
die ( '<h1>setup-cli.php must NOT be called as web-page --> exiting !!!</h1>' );
}
elseif ( $_SERVER [ 'argc' ] > 1 )
2006-05-28 01:59:41 +02:00
{
$arguments = $_SERVER [ 'argv' ];
array_shift ( $arguments );
$action = array_shift ( $arguments );
}
else
{
$action = '--version' ;
}
2006-05-29 04:56:16 +02:00
// setting the language from the enviroment
2006-05-31 02:27:15 +02:00
$_POST [ 'ConfigLang' ] = get_lang ( $charset );
2006-05-29 04:56:16 +02:00
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 = '' ;
2006-05-31 02:27:15 +02:00
$GLOBALS [ 'egw_setup' ] -> system_charset = $charset ;
2006-05-29 04:56:16 +02:00
2007-12-10 05:59:01 +01:00
function cli_exception_handler ( Exception $e )
{
fail ( $e -> getCode (), $e -> getMessage ());
}
set_exception_handler ( 'cli_exception_handler' );
2006-05-29 04:56:16 +02:00
if (( float ) PHP_VERSION < $GLOBALS [ 'egw_setup' ] -> required_php_version )
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
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 ));
2006-05-28 01:59:41 +02:00
}
switch ( $action )
{
case '--version' :
case '--check' :
2007-12-10 05:59:01 +01:00
setup_cmd :: check_installed ( $arguments [ 0 ], 0 , true );
2006-05-28 01:59:41 +02:00
break ;
case '--create-header' :
case '--edit-header' :
2006-05-29 04:56:16 +02:00
case '--upgrade-header' :
2006-06-03 16:45:49 +02:00
case '--update-header' :
2006-05-28 01:59:41 +02:00
do_header ( $action == '--create-header' , $arguments );
break ;
2006-05-29 04:56:16 +02:00
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 ;
2006-05-28 01:59:41 +02:00
case '--exit-codes' :
list_exit_codes ();
break ;
case '--help' :
case '--usage' :
2006-06-22 05:40:18 +02:00
do_usage ( $arguments [ 0 ]);
2006-05-28 01:59:41 +02:00
break ;
2006-05-29 04:56:16 +02:00
default :
2006-05-31 19:21:25 +02:00
fail ( 90 , lang ( " Unknown option '%1' !!! " , $action ));
2006-05-28 01:59:41 +02:00
}
exit ( 0 );
/**
2006-05-29 04:56:16 +02:00
* Configure eGroupWare
2006-05-28 01:59:41 +02:00
*
2006-05-29 04:56:16 +02:00
* @ param array $args domain ( default ),[ config user ( admin )], password ,[, name = value , ... ] -- files - dir -- backup - dir -- mailserver
2006-05-28 01:59:41 +02:00
*/
2006-05-29 04:56:16 +02:00
function do_config ( $args )
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
$options = _check_auth_config ( array_shift ( $args ), 15 );
2006-05-28 01:59:41 +02:00
2006-05-29 04:56:16 +02:00
$values = array ();
foreach ( $options as $option )
{
list ( $name , $value ) = explode ( '=' , $option , 2 );
$values [ $name ] = $value ;
}
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' )),
),
2006-06-22 05:40:18 +02:00
'--cyrus' => array (
'imapAdminUsername' ,
'imapAdminPW' ,
array ( 'name' => 'imapType' , 'default' => 3 ),
array ( 'name' => 'imapEnableCyrusAdmin' , 'default' => 'yes' ),
),
'--sieve' => array (
array ( 'name' => 'imapSieveServer' , 'default' => 'localhost' ),
array ( 'name' => 'imapSievePort' , 'default' => 2000 ),
array ( 'name' => 'imapEnableSieve' , 'default' => 'yes' ), // null or yes
),
'--postfix' => array (
array ( 'name' => 'editforwardingaddress' , 'allowed' => array ( 'yes' , null )),
array ( 'name' => 'smtpType' , 'default' => 2 ),
),
2006-05-29 04:56:16 +02:00
'--smtpserver' => array ( //smtp server,[smtp port],[smtp user],[smtp password]
2006-06-22 05:40:18 +02:00
'smtp_server' , 'smtp_port' , 'smtp_auth_user' , 'smtp_auth_passwd' , ''
),
2006-06-08 01:10:06 +02:00
'--account-auth' => array (
array ( 'name' => 'account_repository' , 'allowed' => array ( 'sql' , 'ldap' )),
array ( 'name' => 'auth_type' , 'allowed' => array ( 'sql' , 'ldap' , 'mail' , 'ads' , 'http' , 'sqlssl' , 'nis' , 'pam' )),
array ( 'name' => 'sql_encryption' , 'allowed' => array ( 'md5' , 'blowfish_crypt' , 'md5_crypt' , 'crypt' )),
'check_save_password' , 'allow_cookie_auth' ),
'--ldap-host' => 'ldap_host' ,
'--ldap-root-dn' => 'ldap_root_dn' ,
'--ldap-root-pw' => 'ldap_root_pw' ,
'--ldap-context' => 'ldap_context' ,
'--ldap-group-context' => 'ldap_group_context' ,
2006-05-29 04:56:16 +02:00
);
2006-06-22 05:40:18 +02:00
$do_ea_profile = false ;
2006-05-29 04:56:16 +02:00
while (( $arg = array_shift ( $args )))
{
2006-05-31 19:21:25 +02:00
if ( ! isset ( $config [ $arg ])) fail ( 90 , lang ( " Unknown option '%1' !!! " , $arg ));
2006-05-29 04:56:16 +02:00
2006-06-22 05:40:18 +02:00
$options = array ();
if ( substr ( $args [ 0 ], 0 , 2 ) !== '--' )
{
$options = is_array ( $config [ $arg ]) ? explode ( ',' , array_shift ( $args )) : array ( array_shift ( $args ));
}
$options [] = '' ; $options [] = '' ;
foreach ( $options as $n => $value )
2006-05-29 04:56:16 +02:00
{
2006-06-22 05:40:18 +02:00
if ( $value === '' && is_array ( $config [ $arg ]) && ! isset ( $config [ $arg ][ $n ][ 'default' ])) continue ;
2006-05-29 04:56:16 +02:00
2006-06-01 05:53:07 +02:00
$name = is_array ( $config [ $arg ]) || $n ? $config [ $arg ][ $n ] : $config [ $arg ];
2006-05-29 04:56:16 +02:00
if ( is_array ( $name ))
{
2006-06-22 05:40:18 +02:00
if ( isset ( $name [ 'allowed' ]) && ! in_array ( $value , $name [ 'allowed' ]))
{
fail ( 91 , lang ( " '%1' is not allowed as %2. arguments of option %3 !!! " , $value , 1 + $n , $arg ));
}
if ( ! $value && isset ( $name [ 'default' ])) $value = $name [ 'default' ];
2006-05-29 04:56:16 +02:00
$name = $name [ 'name' ];
}
$values [ $name ] = $value ;
}
2006-06-22 05:40:18 +02:00
if ( in_array ( $arg , array ( '--mailserver' , '--smtpserver' , '--cyrus' , '--postfix' , '--sieve' )))
{
$do_ea_profile = true ;
}
2006-05-29 04:56:16 +02:00
}
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__ );
}
2006-05-31 19:21:25 +02:00
if ( count ( $values ))
{
echo lang ( 'Configuration changed.' ) . " \n " ;
2006-06-22 05:40:18 +02:00
if ( $do_ea_profile ) do_emailadmin ( $values );
2006-05-31 19:21:25 +02:00
}
2006-06-22 05:40:18 +02:00
echo " \n " . lang ( 'Current configuration:' ) . " \n " ;
2006-05-31 19:21:25 +02:00
$GLOBALS [ 'egw_setup' ] -> db -> select ( $GLOBALS [ 'egw_setup' ] -> config_table , 'config_name,config_value' , array (
'config_app' => 'phpgwapi' ,
2006-06-22 05:40:18 +02:00
" (config_name LIKE '% \\ _dir' OR (config_name LIKE 'mail%' AND config_name != 'mail_footer') OR config_name LIKE 'smtp \\ _%' OR config_name LIKE 'ldap%' OR config_name IN ('webserver_url','system_charset','auth_type','account_repository')) " ,
2006-05-31 19:21:25 +02:00
), __LINE__ , __FILE__ );
while (( $row = $GLOBALS [ 'egw_setup' ] -> db -> row ( true )))
{
2006-06-22 05:40:18 +02:00
echo str_pad ( $row [ 'config_name' ] . ':' , 22 ) . $row [ 'config_value' ] . " \n " ;
}
}
/**
* Updates the default EMailAdmin profile
*
* @ param array $values
*/
function do_emailadmin ()
{
$GLOBALS [ 'egw_setup' ] -> db -> select ( $GLOBALS [ 'egw_setup' ] -> config_table , 'config_name,config_value' , array (
'config_app' => 'phpgwapi' ,
" ((config_name LIKE 'mail%' AND config_name != 'mail_footer') OR config_name LIKE 'smtp%' OR config_name LIKE 'imap%' OR config_name='editforwardingaddress') " ,
), __LINE__ , __FILE__ );
while (( $row = $GLOBALS [ 'egw_setup' ] -> db -> row ( true )))
{
$config [ $row [ 'config_name' ]] = $row [ 'config_value' ];
}
$config [ 'smtpAuth' ] = $config [ 'smtp_auth_user' ] ? 'yes' : null ;
$emailadmin =& CreateObject ( 'emailadmin.bo' , - 1 , false ); // false=no session stuff
$emailadmin -> setDefaultProfile ( $config );
echo " \n " . lang ( 'EMailAdmin profile updated:' ) . " \n " ;
foreach ( $config as $name => $value )
{
echo str_pad ( $name . ':' , 22 ) . $value . " \n " ;
2006-05-31 19:21:25 +02:00
}
2006-05-28 01:59:41 +02:00
}
/**
2006-05-29 04:56:16 +02:00
* Create an admin account
*
* @ param string $arg domain ( default ),[ config user ( admin )], password , username , password ,[ first name ],[ last name ],[ email ]
2006-05-28 01:59:41 +02:00
*/
2006-05-29 04:56:16 +02:00
function do_admin ( $arg )
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
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' ;
2006-05-28 01:59:41 +02:00
2006-05-29 04:56:16 +02:00
$_POST [ 'submit' ] = true ;
2006-06-08 01:10:06 +02:00
$error = include ( 'admin_account.php' );
2006-05-29 04:56:16 +02:00
2006-06-08 01:10:06 +02:00
switch ( $error )
2006-05-29 04:56:16 +02:00
{
2006-06-08 01:10:06 +02:00
case 41 :
fail ( 41 , lang ( 'Error in admin-creation !!!' ));
case 42 :
fail ( 42 , lang ( 'Error in group-creation !!!' ));
2006-05-29 04:56:16 +02:00
}
echo lang ( 'Admin account successful created.' ) . " \n " ;
2006-05-28 01:59:41 +02:00
}
/**
2006-05-29 04:56:16 +02:00
* Backup one or all domains
2006-05-28 01:59:41 +02:00
*
2006-05-29 04:56:16 +02:00
* @ 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
2006-05-28 01:59:41 +02:00
*/
2006-05-29 04:56:16 +02:00
function do_backup ( $arg , $quite_check = false )
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
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 )
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
$options [ 0 ] = $domain ;
if ( $quite_check ) ob_start ();
_check_auth_config ( implode ( ',' , $options ), 14 );
if ( $quite_check ) ob_end_clean ();
if ( $backup == 'no' )
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
echo lang ( 'Backup skipped!' ) . " \n " ;
}
else
{
$db_backup =& CreateObject ( 'phpgwapi.db_backup' );
if ( is_resource ( $f = $db_backup -> fopen_backup ( $backup )))
{
2006-06-08 23:05:44 +02:00
echo lang ( 'Backup started, this might take a few minutes ...' ) . " \n " ;
2006-05-29 04:56:16 +02:00
$db_backup -> backup ( $f );
fclose ( $f );
2006-05-31 02:27:15 +02:00
echo lang ( 'Backup finished' ) . " \n " ;
2006-05-29 04:56:16 +02:00
}
else // backup failed ==> dont start the upgrade
{
fail ( 50 , lang ( 'Backup failed' ) . ': ' . $f );
}
2006-05-28 01:59:41 +02:00
}
}
}
/**
2006-05-29 04:56:16 +02:00
* 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 ]
2006-05-28 01:59:41 +02:00
*/
2006-05-29 04:56:16 +02:00
function do_update ( $arg )
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
global $setup_info ;
2006-05-28 01:59:41 +02:00
2006-05-29 04:56:16 +02:00
list ( $domain ,,, $no_backup ) = $options = explode ( ',' , $arg );
2006-05-28 01:59:41 +02:00
2006-05-29 04:56:16 +02:00
$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
2006-05-28 01:59:41 +02:00
{
2006-05-31 02:27:15 +02:00
echo lang ( 'Start updating the database ...' ) . " \n " ;
2006-05-29 04:56:16 +02:00
do_backup ( $arg , true );
ob_start ();
2006-08-30 14:58:37 +02:00
$GLOBALS [ 'egw_setup' ] -> process -> init_process (); // we need a new schema-proc instance for each new domain
2006-05-29 04:56:16 +02:00
$GLOBALS [ 'egw_setup' ] -> process -> pass ( $setup_info , 'upgrade' , false );
$messages = ob_get_contents ();
ob_end_clean ();
2006-08-30 06:47:28 +02:00
if ( $messages ) echo strip_tags ( $messages ) . " \n " ;
2006-05-29 04:56:16 +02:00
echo lang ( 'Update finished.' ) . " \n " ;
2006-05-28 01:59:41 +02:00
}
}
2006-05-29 04:56:16 +02:00
}
/**
* Install / update languages
*
* @ param string $arg domain ( all ),[ config user ( admin )], password ,[ + ][ lang1 ][, lang2 , ... ]
*/
function do_lang ( $arg )
{
global $setup_info ;
2006-05-31 19:21:25 +02:00
list ( $domain ) = $options = explode ( ',' , $arg );
2006-05-29 04:56:16 +02:00
$domains = $GLOBALS [ 'egw_domain' ];
if ( $domain && $domain != 'all' )
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
$domains = array ( $domain => $GLOBALS [ 'egw_domain' ][ $domain ]);
2006-05-28 01:59:41 +02:00
}
2006-05-29 04:56:16 +02:00
foreach ( $domains as $domain => $data )
{
$options [ 0 ] = $domain ;
$arg = implode ( ',' , $options );
2006-05-31 19:21:25 +02:00
$langs = _check_auth_config ( $arg , 15 , false ); // false = leave eGW's charset, dont set ours!!!
2006-05-29 04:56:16 +02:00
$GLOBALS [ 'egw_setup' ] -> translation -> setup_translation_sql ();
2006-05-28 01:59:41 +02:00
2006-05-29 04:56:16 +02:00
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 );
2006-05-31 02:27:15 +02:00
echo lang ( 'Languages updated.' ) . " \n " ;
2006-05-29 04:56:16 +02:00
}
}
/**
* Check if eGW is installed according to $stop and we have the necessary authorization for config
*
2006-05-31 02:27:15 +02:00
* The password can be specified as parameter , via the enviroment variable EGW_CLI_PASSWORD or
* querier from the user . Specifying it as parameter can be security problem !
*
* We allow the config user / pw of the domain OR the header admin user / pw !
2006-05-29 04:56:16 +02:00
*
* @ param string $arg [ domain ( default )],[ user ( admin )], password
2007-12-10 05:59:01 +01:00
* @ param int $stop see setup_cmd :: check_installed
2006-05-31 19:21:25 +02:00
* @ param boolean $set_lang = true set our charset , overwriting the charset of the eGW installation , default true
2006-05-29 04:56:16 +02:00
* @ return array with unprocessed arguments from $arg
*/
2006-05-31 19:21:25 +02:00
function _check_auth_config ( $arg , $stop , $set_lang = true )
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
$options = explode ( ',' , $arg );
if ( ! ( $domain = array_shift ( $options ))) $domain = 'default' ;
2007-12-10 05:59:01 +01:00
$user = array_shift ( $options );
$password = array_shift ( $options );
_fetch_user_password ( $user , $password );
setup_cmd :: check_installed ( $domain , $stop , true );
2006-05-31 19:21:25 +02:00
// reset charset for the output to the charset used by the OS
if ( $set_lang ) $GLOBALS [ 'egw_setup' ] -> system_charset = $GLOBALS [ 'charset' ];
2007-12-10 05:59:01 +01:00
setup_cmd :: check_setup_auth ( $user , $password , $domain );
2006-05-29 04:56:16 +02:00
return $options ;
2006-05-28 01:59:41 +02:00
}
/**
2006-05-29 04:56:16 +02:00
* Install eGroupWare
2006-05-28 01:59:41 +02:00
*
2006-05-31 02:27:15 +02:00
* @ param string $args domain ,[ config user ( admin )], password ,[ backup - file ],[ charset ]
2006-05-28 01:59:41 +02:00
*/
2006-05-29 04:56:16 +02:00
function do_install ( $args )
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
global $setup_info ;
2006-05-28 01:59:41 +02:00
2007-12-10 05:59:01 +01:00
list ( $domain , $user , $password , $backup , $charset ) = explode ( ',' , $args );
_fetch_user_password ( $user , $password );
2006-05-31 02:27:15 +02:00
2007-12-10 05:59:01 +01:00
$cmd = new setup_cmd_install ( $domain , $user , $password , $backup , $charset , true );
echo $cmd -> run () . " \n " ;
2006-05-28 01:59:41 +02:00
}
/**
2007-12-10 05:59:01 +01:00
* Set defaults for user and password or queries the password from the user
*
* @ param string & $user
* @ param string & $password
2006-05-28 01:59:41 +02:00
*/
2007-12-10 05:59:01 +01:00
function _fetch_user_password ( & $user , & $password )
2006-05-28 01:59:41 +02:00
{
2007-12-10 05:59:01 +01:00
// read password from enviroment or query it from user, if not given
if ( ! $user ) $user = 'admin' ;
if ( ! $password && ! ( $password = $_SERVER [ 'EGW_CLI_PASSWORD' ]))
2006-05-29 04:56:16 +02:00
{
2007-12-10 05:59:01 +01:00
echo lang ( 'Admin password to header manager' ) . ' ' ;
$password = trim ( fgets ( $f = fopen ( 'php://stdin' , 'rb' )));
fclose ( $f );
2006-05-29 04:56:16 +02:00
}
2006-05-28 01:59:41 +02:00
}
2006-05-29 04:56:16 +02:00
2006-05-28 01:59:41 +02:00
/**
* Create , edit or update the header . inc . php
*
* @ param boolean $create true = create new header , false = edit ( or update ) existing header
* @ param array $arguments
* @ return int
*/
function do_header ( $create , & $arguments )
{
2007-12-09 09:03:15 +01:00
if ( ! $create )
2006-05-28 01:59:41 +02:00
{
2007-12-09 09:03:15 +01:00
// read password from enviroment or query it from user, if not given
@ list ( $password , $user ) = $options = explode ( ',' , @ $arguments [ 0 ]);
2007-12-10 05:59:01 +01:00
_fetch_user_password ( $options [ 1 ], $options [ 0 ]);
2007-12-09 09:03:15 +01:00
$arguments [ 0 ] = implode ( ',' , $options );
2006-05-28 01:59:41 +02:00
}
array_unshift ( $arguments , $create ? '--create-header' : '--edit-header' );
2007-12-09 09:03:15 +01:00
$cmd = new setup_cmd_header ( $create ? 'create' : 'edit' , $arguments );
try {
$msg = $cmd -> run ();
2006-05-28 01:59:41 +02:00
}
2007-12-09 09:03:15 +01:00
catch ( Exception $e ) {
fail ( $e -> getCode (), $e -> getMessage ());
2006-05-28 01:59:41 +02:00
}
2007-12-09 09:03:15 +01:00
echo " \n $msg\n\n " ;
exit ( 0 );
2006-05-28 01:59:41 +02:00
}
2006-05-29 04:56:16 +02:00
/**
* Reads the users language from the enviroment
*
2006-05-31 02:27:15 +02:00
* @ param string & $charset charset set in LANG enviroment variable or the default utf - 8
2006-05-29 04:56:16 +02:00
* @ return string 2 or 5 digit language code used in eGW
*/
2006-05-31 02:27:15 +02:00
function get_lang ( & $charset )
2006-05-29 04:56:16 +02:00
{
2006-05-31 19:21:25 +02:00
@ list ( $lang , $nation , $charset ) = split ( " [_.] " , strtolower ( $_SERVER [ 'LANG' ]));
2006-05-31 02:27:15 +02:00
2006-05-29 04:56:16 +02:00
foreach ( file ( 'lang/languages' ) as $line )
{
list ( $code , $language ) = explode ( " \t " , $line );
$languages [ $code ] = $language ;
}
if ( isset ( $languages [ $lang . '-' . $nation ])) return $lang . '-' . $nation ;
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 )
{
$_SERVER [ 'DOCUMENT_ROOT' ] = $parts [ 0 ] . $docroottop ;
$_SERVER [ 'PHP_SELF' ] = str_replace ( '\\' , '/' , $parts [ 1 ]);
break ;
}
}
//print_r($_SERVER); exit;
}
/**
* Echos usage message
*/
2006-06-22 05:40:18 +02:00
function do_usage ( $what = '' )
2006-05-29 04:56:16 +02:00
{
2006-05-31 02:27:15 +02:00
echo lang ( 'Usage: %1 command [additional options]' , basename ( $_SERVER [ 'argv' ][ 0 ])) . " \n \n " ;
2006-05-29 04:56:16 +02:00
2006-06-22 05:40:18 +02:00
if ( ! $what )
{
echo '--check ' . lang ( 'checks eGroupWare\'s installed, it\'s versions and necessary upgrads (return values see --exit-codes)' ) . " \n " ;
echo '--install ' . lang ( 'domain(default),[config user(admin)],password,[backup to install],[charset(default depends on language)]' ) . " \n " ;
}
if ( ! $what || $what == 'config' )
{
echo '--config ' . lang ( 'domain(default),[config user(admin)],password,[name=value,...] sets config values beside:' ) . " \n " ;
if ( ! $what ) echo ' --help config ' . lang ( 'gives further options' ) . " \n " ;
}
if ( $what == 'config' )
{
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 ' --postfix ' . lang ( 'Postfix with LDAP: [yes(user edit forwarding)]' ) . " \n " ;
echo ' --cyrus ' . lang ( 'Cyrus IMAP: Admin user,Password' ) . " \n " ;
echo ' --sieve ' . lang ( 'Sieve: Host[,Port(2000)]' ) . " \n " ;
echo ' --account-auth ' . lang ( 'account repository{sql(default) | ldap},[authentication{sql | ldap | mail | ads | http | ...}],[sql encrypttion{md5 | blowfish_crypt | md5_crypt | crypt}],[check save password{ (default)|True}],[allow cookie auth{ (default)|True}]' ) . " \n " ;
echo ' --ldap-host --ldap-root-dn --ldap-root-pw --ldap-context --ldap-group-context' . " \n " ;
}
if ( ! $what )
{
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 lang ( 'You can use the header user and password for every domain too. If the password is not set via the commandline, it is read from the enviroment variable EGW_CLI_PASSWORD or queried from the user.' ) . " \n " ;
}
if ( ! $what || $what == 'header' )
{
echo 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 " ;
if ( ! $what ) echo ' --help header ' . lang ( 'gives further options' ) . " \n " ;
}
if ( $what == 'header' )
{
echo " \n " . lang ( 'Additional options and there defaults (in 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 " ;
}
if ( ! $what )
{
echo '--help list ' . lang ( 'List availible values' ) . " \n " ;
}
if ( $what == 'list' )
{
echo 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 " ;
}
if ( ! $what || ! in_array ( $what , array ( 'config' , 'header' , 'list' )))
{
echo '--help [config|header|list] ' . lang ( 'gives further options' ) . " \n " ;
}
2006-05-29 04:56:16 +02:00
}
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 ()
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
error_reporting ( error_reporting () & ~ E_NOTICE );
$codes = array ( 'Ok' );
foreach ( file ( __FILE__ ) as $n => $line )
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
if ( preg_match ( '/fail\(([0-9]+),(.*)\);/' , $line , $matches ))
2006-05-28 01:59:41 +02:00
{
2006-05-29 04:56:16 +02:00
//echo "Line $n: $matches[1]: $matches[2]\n";
2006-06-22 05:40:18 +02:00
@ eval ( '$codes[' . $matches [ 1 ] . '] = ' . $matches [ 2 ] . ';' );
2006-05-28 01:59:41 +02:00
}
2006-05-29 04:56:16 +02:00
}
ksort ( $codes , SORT_NUMERIC );
foreach ( $codes as $num => $msg )
{
echo $num . " \t " . str_replace ( " \n " , " \n \t " , $msg ) . " \n " ;
2006-05-28 01:59:41 +02:00
}
}