mirror of
https://github.com/moodle/moodle.git
synced 2025-01-19 14:27:22 +01:00
564 lines
15 KiB
PHP
564 lines
15 KiB
PHP
<?php //$Id$
|
|
/**
|
|
* CLI support functions
|
|
* @author Dilan
|
|
*/
|
|
|
|
//include PEAR Console libraries
|
|
set_include_path($CFG->libdir . PATH_SEPARATOR . $CFG->libdir . '/pear/');
|
|
require_once('Console/Getopt.php');
|
|
|
|
/**
|
|
* Check the validity of the language
|
|
* return true or false
|
|
*
|
|
* @param string $lang (short code for language)
|
|
* @return true/false
|
|
*/
|
|
function valid_language($lang) {
|
|
global $DEFAULT;
|
|
$langdir = dir($DEFAULT['dirroot'].'/install/lang');
|
|
$i=0;
|
|
$validllangs = array();
|
|
|
|
while (false !== ($file=$langdir->read())) {
|
|
if ($file[0] != '.' ) {
|
|
$validllangs[$i++]=$file;
|
|
}
|
|
}
|
|
if (in_array($lang,$validllangs)) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
//========================================================================================//
|
|
/**
|
|
* Read from array of language strings and return a array of string elements in which
|
|
* both values and keys are set to input array's key
|
|
*
|
|
* @param array $lang string elements
|
|
* @return array of string element
|
|
*/
|
|
function get_short_codes ($lang = array()) {
|
|
$short_codes = array();
|
|
|
|
foreach ($lang as $key => $value) {
|
|
$short_codes[$key] = $key;
|
|
}
|
|
return $short_codes;
|
|
}
|
|
//========================================================================================//
|
|
/**
|
|
* Check value for valid yes/no argument
|
|
* Return true or false
|
|
*
|
|
* @param string $value
|
|
* @return true/false
|
|
*/
|
|
function valid_yes_no($value){
|
|
$valid=array('yes','y','n','no');
|
|
$value=strtolower($value);
|
|
|
|
if (in_array($value,$valid)) {
|
|
if ($value[0]=='y') {
|
|
return true;
|
|
} else if ($value[0]=='n') {
|
|
return true;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
//========================================================================================//
|
|
/**
|
|
* Can value have a valid integer in the given range
|
|
* Return true or false
|
|
* @link valid_param()
|
|
*
|
|
*
|
|
* @param mixedtype $value
|
|
* @param int $start
|
|
* @param int $end
|
|
* @return true/false
|
|
*/
|
|
function valid_int_range($value,$start,$end) {
|
|
if (valid_param($value,PARAM_INT)) {
|
|
if ($value < $end && $value > $start) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Take a value and and check it with the given set of values
|
|
* If value if found in the set return true. False otherwise
|
|
*
|
|
* @param mixed type $value
|
|
* @param array $set of valid elements
|
|
* @return boolean
|
|
*/
|
|
|
|
function valid_element($value,$set) {
|
|
if(!empty($set)) {
|
|
//convert all the elements from set to lower case
|
|
foreach ($set as $key=>$opt) {
|
|
$set[$key]=strtolower($opt);
|
|
}
|
|
$value=strtolower($value);
|
|
if (in_array($value,$set)) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Take a value and Type of the value
|
|
* If value match the type return true, false otherwise
|
|
* uses {@link clean_param()} in moodlelib.php
|
|
* @param mixedtype $value
|
|
* @param int $type
|
|
* @return boolean
|
|
*/
|
|
function valid_param($value,$type){
|
|
$clean_val = clean_param($value,$type);
|
|
if ($clean_val == $value) {
|
|
return true;
|
|
}else {
|
|
return false;
|
|
}
|
|
}
|
|
//========================================================================================//
|
|
/**
|
|
* Creat long arument list for PEAR method invocation using LONGOPTOIN array
|
|
*
|
|
* @param long option array $long_opt
|
|
* @return PEAR method compatible long option array
|
|
*/
|
|
function create_long_options($long_opt) {
|
|
$opt=array();
|
|
$i=0;
|
|
if (is_array($long_opt)) {
|
|
foreach ($long_opt as $key=>$value) {
|
|
if ($value == CLI_VAL_REQ) {
|
|
$opt[$i++]=$key.'=';
|
|
} else if ($value == CLI_VAL_OPT) {
|
|
$opt[$i++]=$key.'==';
|
|
}
|
|
|
|
}
|
|
}
|
|
return $opt;
|
|
}
|
|
//========================================================================================//
|
|
/**
|
|
* This funtion return an array of options with option as key containing the value of
|
|
* respective option
|
|
*
|
|
* @param array of option arguments as defined by PEAR GetOpt calss $opt
|
|
* @return return a options arguments with options as keys and values as respective value for key
|
|
*/
|
|
function get_options($opt=array()) {
|
|
|
|
global $LONG_OPTIONS;
|
|
$ret_arr=array();
|
|
|
|
//get the options from the defined list of arguments
|
|
if (!empty($opt[0]) && is_array($opt[0])) {
|
|
|
|
foreach ($opt[0] as $key=>$value) {
|
|
|
|
if (substr($value[0],0,2)=='--') { //if the argument is a long option
|
|
$input_option=substr($value[0],2);
|
|
} else if (substr($value[0],0,1)=='-'){ //if the argument is a short option
|
|
$input_option=substr($value[0],1);
|
|
}
|
|
|
|
//check with valid set of options
|
|
if (in_array($input_option,$LONG_OPTIONS)) {
|
|
$ret_arr[$input_option]=$value[1];
|
|
}
|
|
}
|
|
|
|
}
|
|
//return array
|
|
return $ret_arr;
|
|
|
|
}
|
|
|
|
//========================================================================================//
|
|
|
|
//=========================================================================//
|
|
/**
|
|
* Validate options values
|
|
*
|
|
* @param array $options
|
|
*/
|
|
function validate_option_values($options){
|
|
$values=array();
|
|
$i=0;
|
|
foreach ($options as $val) {
|
|
$values[$i++]=$val;
|
|
}
|
|
if (isset($values['lang'])) {
|
|
if (!valid_language($values['lang'])) {
|
|
console_write(STDERR,'invalidvalueforlanguage');
|
|
console_write(STDOUT, "\n", '', false);
|
|
}
|
|
}
|
|
if (isset($values['webdir'])) {
|
|
/**
|
|
* @todo check valid directory path
|
|
*/
|
|
}
|
|
if (isset($values['webaddr'])) {
|
|
/**
|
|
* @todo check valid http url
|
|
*/
|
|
}
|
|
if (isset($values['moodledir'])) {
|
|
/**
|
|
* @todo check valid directory path
|
|
*/
|
|
}
|
|
if (isset($values['datadir'])) {
|
|
/**
|
|
* @todo check valid directory path
|
|
*/
|
|
}
|
|
if (isset($values['dbtype'])) {
|
|
$dbtypes=array('mysql','oci8po','postgres7','mssql','mssql_n','odbc_mssql');
|
|
if (!in_array($values['dbtype'],$dbtypes)) {
|
|
console_write(STDERR,'invaliddbtype');
|
|
}
|
|
}
|
|
if (isset($values['dbhost'])) {
|
|
/**
|
|
* @todo check host?
|
|
*/
|
|
}
|
|
if (isset($values['dbname'])) {
|
|
/**
|
|
* @todo check name for valid ones if required
|
|
*/
|
|
}
|
|
if (isset($values['dbuser'])) {
|
|
/**
|
|
* @todo check validity of db user if required
|
|
*/
|
|
}
|
|
if (isset($values['dbpass'])) {
|
|
/**
|
|
* @todo check validity of database password if required
|
|
*/
|
|
}
|
|
if (isset($values['prefix'])) {
|
|
/**
|
|
* @todo check for valid prefix
|
|
*/
|
|
}
|
|
if (isset($values['sitefullname'])) {
|
|
/**
|
|
* @todo check for valid fullname for site
|
|
*/
|
|
}
|
|
if (isset($values['siteshortname'])) {
|
|
/**
|
|
* @todo check for valid short name for site
|
|
*/
|
|
}
|
|
if (isset($values['sitesummary'])) {
|
|
/**
|
|
* @todo check for valid summary
|
|
*/
|
|
}
|
|
if (isset($values['sitenewsitems'])) {
|
|
/**
|
|
* @todo check for valid news items
|
|
*/
|
|
}
|
|
if (isset($values['adminfirstname'])) {
|
|
/**
|
|
* @todo check for valid admin first name
|
|
*/
|
|
}
|
|
if (isset($values['adminlastname'])) {
|
|
/**
|
|
* @todo check for valid last name
|
|
*/
|
|
}
|
|
if (isset($values['adminusername'])) {
|
|
/**
|
|
* @todo check for valid username
|
|
*/
|
|
}
|
|
if (isset($values['adminpassword'])) {
|
|
/**
|
|
* @todo check for valid password
|
|
*/
|
|
}
|
|
if (isset($values['adminemail'])) {
|
|
/**
|
|
* @todo check for valid email
|
|
*/
|
|
}
|
|
if (isset($values['verbose'])) {
|
|
if(!valid_int_range($values['verbose'],CLI_NO,CLI_FULL)){
|
|
console_write(STDERR,'invalidverbosevalue');
|
|
}
|
|
}
|
|
if (isset($values['interactivelevel'])) {
|
|
if(!valid_int_range($values['verbose'],CLI_NO,CLI_FULL)){
|
|
console_write(STDERR,'invalidinteractivevalue');
|
|
}
|
|
}
|
|
|
|
if (isset($values['help'])) {
|
|
/**
|
|
* @todo nothing really
|
|
*/
|
|
}
|
|
}
|
|
//=========================================================================//
|
|
/**
|
|
* Write to standard out and error with exit in error
|
|
*
|
|
* @param standard out/err $stream
|
|
* @param string $identifier
|
|
* @param name of module $module
|
|
*/
|
|
function console_write($stream,$identifier,$module='install',$use_string_lib=true) {
|
|
if ($use_string_lib) {
|
|
fwrite($stream,get_string($identifier,$module));
|
|
} else {
|
|
fwrite($stream,$identifier);
|
|
}
|
|
if ($stream == STDERR) {
|
|
fwrite($stream, "\n\n" . get_string('aborting',$module) . "\n\n");
|
|
die;
|
|
}
|
|
}
|
|
//=========================================================================//
|
|
/**
|
|
* Read a mixed type
|
|
*
|
|
* @param stream $from
|
|
* @param int $size
|
|
* @return mixed type
|
|
*/
|
|
function read($from=STDIN,$size=1024) {
|
|
$input= trim(fread($from,$size));
|
|
return $input;
|
|
}
|
|
/**
|
|
* Read an integer
|
|
*
|
|
* @return integer
|
|
*/
|
|
function read_int() {
|
|
$input=read();
|
|
if (valid_param($input,PARAM_INT)) {
|
|
return $input;
|
|
} else {
|
|
console_write(STDERR,'invalidint');
|
|
console_write(STDOUT, "\n", '', false);
|
|
}
|
|
}
|
|
//=========================================================================//
|
|
/**
|
|
* Read and integer value within range
|
|
*
|
|
* @param int $start
|
|
* @param int $end
|
|
* @return int
|
|
*/
|
|
function read_int_range($start,$end) {
|
|
$input=read_int();
|
|
if (valid_int_range($input,$start,$end)) {
|
|
return $input;
|
|
} else {
|
|
console_write(STDERR,'invalidintrange');
|
|
console_write(STDOUT, "\n", '', false);
|
|
}
|
|
|
|
}
|
|
//=========================================================================//
|
|
/**
|
|
* Read yes/no argument
|
|
*
|
|
* @return string yes/no
|
|
*/
|
|
function read_yes_no() {
|
|
$input=strtolower(read());
|
|
if (valid_yes_no($input)) {
|
|
if ($input[0]=='y') {
|
|
return 'yes';
|
|
} else if($input[0]=='n') {
|
|
return 'no';
|
|
}
|
|
} else {
|
|
console_write(STDERR,'invalidyesno');
|
|
console_write(STDOUT, "\n", '', false);
|
|
}
|
|
}
|
|
|
|
//=========================================================================//
|
|
/**
|
|
* Read a boolean parameter from the input
|
|
*
|
|
* @return boolean
|
|
*/
|
|
function read_boolean(){
|
|
$input=read_yes_no();
|
|
return clean_param($input,PARAM_BOOL);
|
|
|
|
}
|
|
//=========================================================================//
|
|
/**
|
|
* Reading an element from a given set
|
|
*
|
|
* @param mixed type array $set
|
|
* @return mixed type
|
|
*/
|
|
function read_element($set=array()) {
|
|
$input=read();
|
|
if (valid_element($input,$set)) {
|
|
return $input;
|
|
} else {
|
|
console_write(STDERR,'invalidsetelement');
|
|
console_write(STDOUT, "\n", '', false);
|
|
}
|
|
}
|
|
//=========================================================================//
|
|
function read_url() {
|
|
$input = read();
|
|
$localhost = false;
|
|
if ( strpos($input,'localhost') !== false) {
|
|
$input = str_replace('localhost','127.0.0.1',$input);
|
|
$localhost=true;
|
|
}
|
|
if (valid_param($input,PARAM_URL)) {
|
|
if ($localhost) {
|
|
return str_replace('127.0.0.1','localhost',$input);
|
|
} else {
|
|
return $input;
|
|
}
|
|
} else {
|
|
console_write(STDERR,'invalidurl');
|
|
}
|
|
|
|
}
|
|
//=========================================================================//
|
|
/**
|
|
* Enter description here...
|
|
*
|
|
* @return string
|
|
*/
|
|
function read_dir() {
|
|
$input = read();
|
|
return $input;
|
|
}
|
|
//===========================================================================//
|
|
/**
|
|
* Print compatibility message to standard out, and errors to standard error
|
|
*
|
|
* @param boolean $success
|
|
* @param string $testtext
|
|
* @param string $errormessage
|
|
* @param boolean $caution
|
|
* @param boolean $silent
|
|
* @return boolean
|
|
*/
|
|
function check_compatibility($success, $testtext,$errormessage,$caution=false,$silent=false) {
|
|
if ($success) {
|
|
if (!$silent) {
|
|
console_write(STDOUT,get_string('pass', 'install'),'',false);
|
|
}
|
|
} else {
|
|
if ($caution) {
|
|
if (!$silent) {
|
|
console_write(STDOUT,get_string('caution', 'install'),'',false);
|
|
}
|
|
} else {
|
|
console_write(STDOUT,get_string('fail', 'install'),'',false);
|
|
console_write(STDERR,$errormessage,'',false);
|
|
}
|
|
}
|
|
if (!$silent) {
|
|
console_write(STDOUT,"\t\t",'',false);
|
|
console_write(STDOUT,$testtext,'',false);
|
|
console_write(STDOUT,"\n",'',false);
|
|
}
|
|
return $success;
|
|
}
|
|
|
|
//==========================================================================//
|
|
/**
|
|
* Print environment status to standard out
|
|
*
|
|
* @param array $env, of type object
|
|
*/
|
|
function print_environment_status($env = array()) {
|
|
console_write(STDOUT, get_string('name') . "\t\t\t" . get_string('info') . "\t" . get_string('status') . "\n\r", '', false);
|
|
//console_write(STDOUT,"Status\t\tInfo\t\tPart\n\r",'',false);
|
|
foreach ( $env as $object) {
|
|
console_write(STDOUT,$object->part,'',false);
|
|
console_write(STDOUT,"\t\t",'',false);
|
|
if (!empty($object->info)) {
|
|
console_write(STDOUT, $object->info, '', false);
|
|
} else {
|
|
console_write(STDOUT, "\t", '', false);
|
|
}
|
|
console_write(STDOUT, "\t\t", '', false);
|
|
if ($object->status == 1 ) {
|
|
console_write(STDOUT,'ok','',false);
|
|
} else {
|
|
console_write(STDOUT,'fail','',false);
|
|
}
|
|
console_write(STDOUT,"\n\r",'',false);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Print environment status to standard out
|
|
*
|
|
* @param array $env, of type object
|
|
*/
|
|
function print_environment_status_detailed($env = array()) {
|
|
console_write(STDOUT,"Status\t\tLevel\t\tCurrent ver\tRequired ver\t\tPart\t\tInfo\n\r",'',false);
|
|
foreach ( $env as $object) {
|
|
|
|
if ($object->status == 1 ) {
|
|
console_write(STDOUT,'ok ','',false);
|
|
} else if ($object->errorcode != 0) {
|
|
console_write(STDOUT,'fail ','',false);
|
|
} else {
|
|
console_write(STDOUT,'----','',false);
|
|
}
|
|
console_write(STDOUT,"\t\t",'',false);
|
|
console_write(STDOUT,$object->level,'',false);
|
|
console_write(STDOUT,"\t\t",'',false);
|
|
console_write(STDOUT,$object->current_version,'',false);
|
|
console_write(STDOUT,"\t",'',false);
|
|
console_write(STDOUT,$object->needed_version,'',false);
|
|
console_write(STDOUT,"\t\t",'',false);
|
|
console_write(STDOUT,$object->part,'',false);
|
|
console_write(STDOUT,"\t\t",'',false);
|
|
console_write(STDOUT,$object->info,'',false);
|
|
console_write(STDOUT,"\n\r",'',false);
|
|
}
|
|
}
|
|
/**
|
|
* Print a new line in the standard output
|
|
*
|
|
*/
|
|
|
|
function print_newline() {
|
|
console_write(STDOUT, "\n", '', false);
|
|
}
|
|
?>
|