diff --git a/lib/componentlib.class.php b/lib/componentlib.class.php index e44115f1edf1c..beb2bf942dbcf 100644 --- a/lib/componentlib.class.php +++ b/lib/componentlib.class.php @@ -1,127 +1,135 @@ -libdir.'/componentlib.class.php'); -// if ($cd = new component_installer('http://download.moodle.org', 'lang16', -// 'es_utf8.zip', 'languages.md5', 'lang')) { -// $status = $cd->install(); //returns COMPONENT_(ERROR | UPTODATE | INSTALLED) -// switch ($status) { -// case COMPONENT_ERROR: -// if ($cd->get_error() == 'remotedownloaderror') { -// $a = new stdClass(); -// $a->url = 'http://download.moodle.org/lang16/es_utf8.zip'; -// $a->dest= $CFG->dataroot.'/lang'; -// print_error($cd->get_error(), 'error', '', $a); -// } else { -// print_error($cd->get_error(), 'error'); -// } -// break; -// case COMPONENT_UPTODATE: -// //Print error string or whatever you want to do -// break; -// case COMPONENT_INSTALLED: -// //Print/do whatever you want -// break; -// default: -// //We shouldn't reach this point -// } -// } else { -// //We shouldn't reach this point -// } -// -// To switch of component (maintaining the rest of settings): -// -// $status = $cd->change_zip_file('en_utf8.zip'); //returns boolean false on error -// -// To retrieve all the components in one remote md5 file -// -// $components = $cd->get_all_components_md5(); //returns boolean false on error, array instead -// -// To check if current component needs to be updated -// -// $status = $cd->need_upgrade(); //returns COMPONENT_(ERROR | UPTODATE | NEEDUPDATE) -// -// To get the 3rd field of the md5 file (optional) -// -// $field = $cd->get_extra_md5_field(); //returns string (empty if not exists) -// -// For all the error situations the $cd->get_error() method should return always the key of the -// error to be retrieved by one standard get_string() call against the error.php lang file. -// -// That's all! +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see . + +/** + * This library includes all the necessary stuff to use the one-click + * download and install feature of Moodle, used to keep updated some + * items like languages, pear, enviroment... i.e, components. + * + * It has been developed harcoding some important limits that are + * explained below: + * - It only can check, download and install items under moodledata. + * - Every downloadeable item must be one zip file. + * - The zip file root content must be 1 directory, i.e, everything + * is stored under 1 directory. + * - Zip file name and root directory must have the same name (but + * the .zip extension, of course). + * - Every .zip file must be defined in one .md5 file that will be + * stored in the same remote directory than the .zip file. + * - The name of such .md5 file is free, although it's recommended + * to use the same name than the .zip (that's the default + * assumption if no specified). + * - Every remote .md5 file will be a comma separated (CVS) file where each + * line will follow this format: + * - Field 1: name of the zip file (without extension). Mandatory. + * - Field 2: md5 of the zip file. Mandatory. + * - Field 3: whatever you want (or need). Optional. + * -Every local .md5 file will: + * - Have the zip file name (without the extension) plus -md5 + * - Will reside inside the expanded zip file dir + * - Will contain the md5 od the latest installed component + * With all these details present, the process will perform this tasks: + * - Perform security checks. Only admins are allowed to use this for now. + * - Read the .md5 file from source (1). + * - Extract the correct line for the .zip being requested. + * - Compare it with the local .md5 file (2). + * - If different: + * - Download the newer .zip file from source. + * - Calculate its md5 (3). + * - Compare (1) and (3). + * - If equal: + * - Delete old directory. + * - Uunzip the newer .zip file. + * - Create the new local .md5 file. + * - Delete the .zip file. + * - If different: + * - ERROR. Old package won't be modified. We shouldn't + * reach here ever. + * - If component download is not possible, a message text about how to do + * the process manually (remotedownloaderror) must be displayed to explain it. + * + * General Usage: + * + * To install one component: + * + * require_once($CFG->libdir.'/componentlib.class.php'); + * if ($cd = new component_installer('http://download.moodle.org', 'lang16', + * 'es_utf8.zip', 'languages.md5', 'lang')) { + * $status = $cd->install(); //returns COMPONENT_(ERROR | UPTODATE | INSTALLED) + * switch ($status) { + * case COMPONENT_ERROR: + * if ($cd->get_error() == 'remotedownloaderror') { + * $a = new stdClass(); + * $a->url = 'http://download.moodle.org/lang16/es_utf8.zip'; + * $a->dest= $CFG->dataroot.'/lang'; + * print_error($cd->get_error(), 'error', '', $a); + * } else { + * print_error($cd->get_error(), 'error'); + * } + * break; + * case COMPONENT_UPTODATE: + * //Print error string or whatever you want to do + * break; + * case COMPONENT_INSTALLED: + * //Print/do whatever you want + * break; + * default: + * //We shouldn't reach this point + * } + * } else { + * //We shouldn't reach this point + * } + * + * + * To switch of component (maintaining the rest of settings): + * + * $status = $cd->change_zip_file('en_utf8.zip'); //returns boolean false on error + * + * + * To retrieve all the components in one remote md5 file + * + * $components = $cd->get_all_components_md5(); //returns boolean false on error, array instead + * + * + * To check if current component needs to be updated + * + * $status = $cd->need_upgrade(); //returns COMPONENT_(ERROR | UPTODATE | NEEDUPDATE) + * + * + * To get the 3rd field of the md5 file (optional) + * + * $field = $cd->get_extra_md5_field(); //returns string (empty if not exists) + * + * + * For all the error situations the $cd->get_error() method should return always the key of the + * error to be retrieved by one standard get_string() call against the error.php lang file. + * + * That's all! + * + * @package moodlecore + * @copyright 1999 onwards Martin Dougiamas http://dougiamas.com + * 2001 onwards Eloy Lafuente (stronk7) http://contiento.com + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + + /** + * @global object $CFG + * @name $CFG + */ global $CFG; require_once($CFG->libdir.'/filelib.php'); @@ -133,14 +141,20 @@ /** * This class is used to check, download and install items from - * download.moodle.org to the moodledata directory. It always - * return true/false in all their public methods to say if + * download.moodle.org to the moodledata directory. + * + * It always return true/false in all their public methods to say if * execution has ended succesfuly or not. If there is any problem * its getError() method can be called, returning one error string * to be used with the standard get/print_string() functions. + * + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @package moodlecore */ class component_installer { - + /** + * @var string + */ var $sourcebase; /// Full http URL, base for downloadable items var $zippath; /// Relative path (from sourcebase) where the /// downloadeable item resides. @@ -155,7 +169,9 @@ class component_installer { var $errorstring; /// Latest error produced. It will contain one lang string key. var $extramd5info; /// Contents of the optional third field in the .md5 file. var $requisitesok; /// Flag to see if requisites check has been passed ok. - + /** + * @var array + */ var $cachedmd5components; /// Array of cached components to avoid to /// download the same md5 file more than once per request. @@ -163,13 +179,13 @@ class component_installer { * Standard constructor of the class. It will initialize all attributes. * without performing any check at all. * - * @param string Full http URL, base for downloadeable items - * @param string Relative path (from sourcebase) where the + * @param string $sourcebase Full http URL, base for downloadeable items + * @param string $zippath Relative path (from sourcebase) where the * downloadeable item resides - * @param string Name of the .zip file to be downloaded - * @param string Name of the .md5 file to be read (default '' = same + * @param string $zipfilename Name of the .zip file to be downloaded + * @param string $md5filename Name of the .md5 file to be read (default '' = same * than zipfilename) - * @param string Relative path (from moodledata) where the .zip file will + * @param string $destpath Relative path (from moodledata) where the .zip file will * be expanded (default='' = moodledataitself) * @return object */ @@ -194,6 +210,7 @@ function component_installer ($sourcebase, $zippath, $zipfilename, $md5filename= * one installation. Also, it will check for required settings * and will fill everything as needed. * + * @global object * @return boolean true/false (plus detailed error in errorstring) */ function check_requisites() { @@ -240,6 +257,11 @@ function check_requisites() { * compare md5 values, download, unzip, install and regenerate * local md5 file * + * @global object + * @uses COMPONENT_ERROR + * @uses COMPONENT_UPTODATE + * @uses COMPONENT_ERROR + * @uses COMPONENT_INSTALLED * @return int COMPONENT_(ERROR | UPTODATE | INSTALLED) */ function install() { @@ -329,6 +351,9 @@ function install() { * This function will detect if remote component needs to be installed * because it's different from the local one * + * @uses COMPONENT_ERROR + * @uses COMPONENT_UPTODATE + * @uses COMPONENT_NEEDUPDATE * @return int COMPONENT_(ERROR | UPTODATE | NEEDUPDATE) */ function need_upgrade() { @@ -356,7 +381,7 @@ function need_upgrade() { * to allow the class to process different components of the * same md5 file without intantiating more objects. * - * @param string New zip filename to process + * @param string $newzipfilename New zip filename to process * @return boolean true/false */ function change_zip_file($newzipfilename) { @@ -369,7 +394,8 @@ function change_zip_file($newzipfilename) { * This function will get the local md5 value of the installed * component. * - * @return string md5 of the local component (false on error) + * @global object + * @return bool|string md5 of the local component (false on error) */ function get_local_md5() { global $CFG; @@ -434,7 +460,7 @@ function get_component_md5() { * This function allows you to retrieve the complete array of components found in * the md5filename * - * @return array array of components in md5 file or false if error + * @return bool|array array of components in md5 file or false if error */ function get_all_components_md5() {