diff --git a/include/text.php b/include/text.php index 2ec017caff..796acffcef 100644 --- a/include/text.php +++ b/include/text.php @@ -637,7 +637,7 @@ function logger($msg, $level = 0) { // turn off logger in install mode if ( - $a->module == 'install' + $a->install_mode || !dba::$connected ) { return; @@ -709,7 +709,7 @@ function dlogger($msg, $level = 0) { // turn off logger in install mode if ( - $a->module == 'install' + $a->install_mode || !dba::$connected ) { return; diff --git a/mod/install.php b/mod/install.php index eb740c7b64..3b09da6e4a 100644 --- a/mod/install.php +++ b/mod/install.php @@ -5,11 +5,9 @@ use Friendica\App; use Friendica\Core\L10n; +use Friendica\Core\Install; use Friendica\Core\System; use Friendica\Database\DBM; -use Friendica\Database\DBStructure; -use Friendica\Object\Image; -use Friendica\Util\Network; use Friendica\Util\Temporal; $install_wizard_pass = 1; @@ -27,6 +25,8 @@ function install_init(App $a) { $a->config['system']['theme'] = "../install"; $a->theme['stylesheet'] = System::baseUrl()."/view/install/style.css"; + Install::setInstallMode(); + global $install_wizard_pass; if (x($_POST, 'pass')) { $install_wizard_pass = intval($_POST['pass']); @@ -72,34 +72,7 @@ function install_post(App $a) { // connect to db dba::connect($dbhost, $dbuser, $dbpass, $dbdata, true); - $tpl = get_markup_template('htconfig.tpl'); - $txt = replace_macros($tpl,[ - '$dbhost' => $dbhost, - '$dbuser' => $dbuser, - '$dbpass' => $dbpass, - '$dbdata' => $dbdata, - '$timezone' => $timezone, - '$language' => $language, - '$urlpath' => $urlpath, - '$phpath' => $phpath, - '$adminmail' => $adminmail, - '$rino' => $rino - ]); - - - $result = file_put_contents('.htconfig.php', $txt); - if (! $result) { - $a->data['txt'] = $txt; - } - - $errors = load_database(); - - - if ($errors) { - $a->data['db_failed'] = $errors; - } else { - $a->data['db_installed'] = true; - } + Install::install($urlpath, $dbhost, $dbuser, $dbpass, $dbdata, $phpath, $timezone, $language, $adminmail, $rino); return; break; @@ -167,37 +140,11 @@ function install_content(App $a) { switch ($install_wizard_pass) { case 1: { // System check - - $checks = []; - - check_funcs($checks); - - check_imagik($checks); - - check_htconfig($checks); - - check_smarty3($checks); - - check_keys($checks); - if (x($_POST, 'phpath')) { $phpath = notags(trim($_POST['phpath'])); } - check_php($phpath, $checks); - - check_htaccess($checks); - - /// @TODO Maybe move this out? - function check_passed($v, $c) { - if ($c['required']) { - $v = $v && $c['status']; - } - return $v; - } - $checkspassed = array_reduce($checks, "check_passed", true); - - + list($checks, $checkspassed) = Install::check($phpath); $tpl = get_markup_template('install_checks.tpl'); $o .= replace_macros($tpl, [ @@ -296,238 +243,6 @@ function install_content(App $a) { } } -/** - * checks : array passed to template - * title : string - * status : boolean - * required : boolean - * help : string optional - */ -function check_add(&$checks, $title, $status, $required, $help) { - $checks[] = [ - 'title' => $title, - 'status' => $status, - 'required' => $required, - 'help' => $help, - ]; -} - -function check_php(&$phpath, &$checks) { - $passed = $passed2 = $passed3 = false; - if (strlen($phpath)) { - $passed = file_exists($phpath); - } else { - $phpath = trim(shell_exec('which php')); - $passed = strlen($phpath); - } - $help = ""; - if (!$passed) { - $help .= L10n::t('Could not find a command line version of PHP in the web server PATH.'). EOL; - $help .= L10n::t("If you don't have a command line version of PHP installed on your server, you will not be able to run the background processing. See 'Setup the worker'") . EOL; - $help .= EOL . EOL; - $tpl = get_markup_template('field_input.tpl'); - $help .= replace_macros($tpl, [ - '$field' => ['phpath', L10n::t('PHP executable path'), $phpath, L10n::t('Enter full path to php executable. You can leave this blank to continue the installation.')], - ]); - $phpath = ""; - } - - check_add($checks, L10n::t('Command line PHP').($passed?" ($phpath)":""), $passed, false, $help); - - if ($passed) { - $cmd = "$phpath -v"; - $result = trim(shell_exec($cmd)); - $passed2 = ( strpos($result, "(cli)") !== false); - list($result) = explode("\n", $result); - $help = ""; - if (!$passed2) { - $help .= L10n::t("PHP executable is not the php cli binary \x28could be cgi-fgci version\x29"). EOL; - $help .= L10n::t('Found PHP version: ')."$result"; - } - check_add($checks, L10n::t('PHP cli binary'), $passed2, true, $help); - } - - - if ($passed2) { - $str = autoname(8); - $cmd = "$phpath testargs.php $str"; - $result = trim(shell_exec($cmd)); - $passed3 = $result == $str; - $help = ""; - if (!$passed3) { - $help .= L10n::t('The command line version of PHP on your system does not have "register_argc_argv" enabled.'). EOL; - $help .= L10n::t('This is required for message delivery to work.'); - } - check_add($checks, L10n::t('PHP register_argc_argv'), $passed3, true, $help); - } - - -} - -function check_keys(&$checks) { - - $help = ''; - - $res = false; - - if (function_exists('openssl_pkey_new')) { - $res = openssl_pkey_new([ - 'digest_alg' => 'sha1', - 'private_key_bits' => 4096, - 'encrypt_key' => false - ]); - } - - // Get private key - - if (! $res) { - $help .= L10n::t('Error: the "openssl_pkey_new" function on this system is not able to generate encryption keys'). EOL; - $help .= L10n::t('If running under Windows, please see "http://www.php.net/manual/en/openssl.installation.php".'); - } - check_add($checks, L10n::t('Generate encryption keys'), $res, true, $help); - -} - - -function check_funcs(&$checks) { - $ck_funcs = []; - check_add($ck_funcs, L10n::t('libCurl PHP module'), true, true, ""); - check_add($ck_funcs, L10n::t('GD graphics PHP module'), true, true, ""); - check_add($ck_funcs, L10n::t('OpenSSL PHP module'), true, true, ""); - check_add($ck_funcs, L10n::t('PDO or MySQLi PHP module'), true, true, ""); - check_add($ck_funcs, L10n::t('mb_string PHP module'), true, true, ""); - check_add($ck_funcs, L10n::t('XML PHP module'), true, true, ""); - check_add($ck_funcs, L10n::t('iconv PHP module'), true, true, ""); - check_add($ck_funcs, L10n::t('POSIX PHP module'), true, true, ""); - - if (function_exists('apache_get_modules')) { - if (! in_array('mod_rewrite',apache_get_modules())) { - check_add($ck_funcs, L10n::t('Apache mod_rewrite module'), false, true, L10n::t('Error: Apache webserver mod-rewrite module is required but not installed.')); - } else { - check_add($ck_funcs, L10n::t('Apache mod_rewrite module'), true, true, ""); - } - } - - if (! function_exists('curl_init')) { - $ck_funcs[0]['status'] = false; - $ck_funcs[0]['help'] = L10n::t('Error: libCURL PHP module required but not installed.'); - } - if (! function_exists('imagecreatefromjpeg')) { - $ck_funcs[1]['status'] = false; - $ck_funcs[1]['help'] = L10n::t('Error: GD graphics PHP module with JPEG support required but not installed.'); - } - if (! function_exists('openssl_public_encrypt')) { - $ck_funcs[2]['status'] = false; - $ck_funcs[2]['help'] = L10n::t('Error: openssl PHP module required but not installed.'); - } - if (! function_exists('mysqli_connect') && !class_exists('pdo')) { - $ck_funcs[3]['status'] = false; - $ck_funcs[3]['help'] = L10n::t('Error: PDO or MySQLi PHP module required but not installed.'); - } - if (!function_exists('mysqli_connect') && class_exists('pdo') && !in_array('mysql', PDO::getAvailableDrivers())) { - $ck_funcs[3]['status'] = false; - $ck_funcs[3]['help'] = L10n::t('Error: The MySQL driver for PDO is not installed.'); - } - if (! function_exists('mb_strlen')) { - $ck_funcs[4]['status'] = false; - $ck_funcs[4]['help'] = L10n::t('Error: mb_string PHP module required but not installed.'); - } - if (! function_exists('iconv_strlen')) { - $ck_funcs[6]['status'] = false; - $ck_funcs[6]['help'] = L10n::t('Error: iconv PHP module required but not installed.'); - } - if (! function_exists('posix_kill')) { - $ck_funcs[7]['status'] = false; - $ck_funcs[7]['help'] = L10n::t('Error: POSIX PHP module required but not installed.'); - } - - $checks = array_merge($checks, $ck_funcs); - - // check for XML DOM Documents being able to be generated - try { - $xml = new DOMDocument(); - } catch (Exception $e) { - $ck_funcs[5]['status'] = false; - $ck_funcs[5]['help'] = L10n::t('Error, XML PHP module required but not installed.'); - } -} - - -function check_htconfig(&$checks) { - $status = true; - $help = ""; - if ((file_exists('.htconfig.php') && !is_writable('.htconfig.php')) || - (!file_exists('.htconfig.php') && !is_writable('.'))) { - - $status = false; - $help = L10n::t('The web installer needs to be able to create a file called ".htconfig.php" in the top folder of your web server and it is unable to do so.') .EOL; - $help .= L10n::t('This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can.').EOL; - $help .= L10n::t('At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica top folder.').EOL; - $help .= L10n::t('You can alternatively skip this procedure and perform a manual installation. Please see the file "INSTALL.txt" for instructions.').EOL; - } - - check_add($checks, L10n::t('.htconfig.php is writable'), $status, false, $help); - -} - -function check_smarty3(&$checks) { - $status = true; - $help = ""; - if (!is_writable('view/smarty3')) { - - $status = false; - $help = L10n::t('Friendica uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.') .EOL; - $help .= L10n::t('In order to store these compiled templates, the web server needs to have write access to the directory view/smarty3/ under the Friendica top level folder.').EOL; - $help .= L10n::t("Please ensure that the user that your web server runs as \x28e.g. www-data\x29 has write access to this folder.").EOL; - $help .= L10n::t("Note: as a security measure, you should give the web server write access to view/smarty3/ only--not the template files \x28.tpl\x29 that it contains.").EOL; - } - - check_add($checks, L10n::t('view/smarty3 is writable'), $status, true, $help); - -} - -function check_htaccess(&$checks) { - $status = true; - $help = ""; - if (function_exists('curl_init')) { - $test = Network::fetchUrl(System::baseUrl()."/install/testrewrite"); - - if ($test != "ok") { - $test = Network::fetchUrl(normalise_link(System::baseUrl()."/install/testrewrite")); - } - - if ($test != "ok") { - $status = false; - $help = L10n::t('Url rewrite in .htaccess is not working. Check your server configuration.'); - } - check_add($checks, L10n::t('Url rewrite is working'), $status, true, $help); - } else { - // cannot check modrewrite if libcurl is not installed - /// @TODO Maybe issue warning here? - } -} - -function check_imagik(&$checks) { - $imagick = false; - $gif = false; - - if (class_exists('Imagick')) { - $imagick = true; - $supported = Image::supportedTypes(); - if (array_key_exists('image/gif', $supported)) { - $gif = true; - } - } - if ($imagick == false) { - check_add($checks, L10n::t('ImageMagick PHP extension is not installed'), $imagick, false, ""); - } else { - check_add($checks, L10n::t('ImageMagick PHP extension is installed'), $imagick, false, ""); - if ($imagick) { - check_add($checks, L10n::t('ImageMagick supports GIF'), $gif, false, ""); - } - } -} - function manual_config(App $a) { $data = htmlentities($a->data['txt'],ENT_COMPAT, 'UTF-8'); $o = L10n::t('The database configuration file ".htconfig.php" could not be written. Please use the enclosed text to create a configuration file in your web server root.'); @@ -544,12 +259,6 @@ function load_database_rem($v, $i) { } } -function load_database() { - $errors = DBStructure::update(false, true, true); - - return $errors; -} - function what_next() { $baseurl = System::baseUrl(); return diff --git a/src/App.php b/src/App.php index d76351b97a..5ff7eab04d 100644 --- a/src/App.php +++ b/src/App.php @@ -52,6 +52,7 @@ class App public $argv; public $argc; public $module; + public $install_mode = false; public $pager; public $strings; public $basepath; diff --git a/src/Core/Console/AutomaticInstallation.php b/src/Core/Console/AutomaticInstallation.php index 6318b19a88..ff27782302 100644 --- a/src/Core/Console/AutomaticInstallation.php +++ b/src/Core/Console/AutomaticInstallation.php @@ -5,9 +5,9 @@ namespace Friendica\Core\Console; use Asika\SimpleConsole\Console; use dba; use Friendica\App; +use Friendica\Core\Install; require_once 'mod/install.php'; -require_once 'include/dba.php'; class AutomaticInstallation extends Console { @@ -43,6 +43,8 @@ HELP; $db_data = ''; require_once 'htconfig.php'; + Install::setInstallMode(); + $this->out(" Complete!\n\n"); // Check basic setup @@ -74,7 +76,7 @@ HELP; // Install database $this->out("Inserting data into database...\n"); - $checkResults['data'] = load_database(); + $checkResults['data'] = Install::loadDatabase(); if ($checkResults['data'] !== '') { throw new \RuntimeException("ERROR: DB Database creation error. Is the DB empty?\n"); @@ -101,14 +103,14 @@ HELP; { $checks = []; - check_funcs($checks); - check_imagik($checks); - check_htconfig($checks); - check_smarty3($checks); - check_keys($checks); + Install::checkFunctions($checks); + Install::checkImagik($checks); + Install::checkHtConfig($checks); + Install::checkSmarty3($checks); + Install::checkKeys($checks); if (!empty($app->config['php_path'])) { - check_php($app->config['php_path'], $checks); + Install::checkPHP($app->config['php_path'], $checks); } else { throw new \RuntimeException(" ERROR: The php_path is not set in the config. Please check the file .htconfig.php.\n"); } diff --git a/src/Core/Install.php b/src/Core/Install.php new file mode 100644 index 0000000000..25ecb02b4f --- /dev/null +++ b/src/Core/Install.php @@ -0,0 +1,331 @@ +install_mode = $mode; + } + + public static function check($phpath = 'php') + { + $checks = []; + + self::checkFunctions($checks); + + self::checkImagik($checks); + + self::checkHtConfig($checks); + + self::checkSmarty3($checks); + + self::checkKeys($checks); + + self::checkPHP($phpath, $checks); + + self::checkHtAccess($checks); + + $checkspassed = array_reduce($checks, + function ($v, $c) { + if ($c['require']) { + $v = $v && $c['status']; + } + return $v; + }, + true); + + return array($checks, $checkspassed); + } + + public static function install($urlpath, $dbhost, $dbuser, $dbpass, $dbdata, $phpath, $timezone, $language, $adminmail, $rino = 1) + { + $tpl = get_markup_template('htconfig.tpl'); + $txt = replace_macros($tpl,[ + '$dbhost' => $dbhost, + '$dbuser' => $dbuser, + '$dbpass' => $dbpass, + '$dbdata' => $dbdata, + '$timezone' => $timezone, + '$language' => $language, + '$urlpath' => $urlpath, + '$phpath' => $phpath, + '$adminmail' => $adminmail, + '$rino' => $rino + ]); + + + $result = file_put_contents('config/.htconfig.php', $txt); + if (! $result) { + self::getApp()->data['txt'] = $txt; + } + + $errors = self::loadDatabase(); + + if ($errors) { + self::getApp()->data['db_failed'] = $errors; + } else { + self::getApp()->data['db_installed'] = true; + } + } + + /** + * checks : array passed to template + * title : string + * status : boolean + * required : boolean + * help : string optional + */ + private static function addCheck(&$checks, $title, $status, $required, $help) + { + $checks[] = [ + 'title' => $title, + 'status' => $status, + 'required' => $required, + 'help' => $help, + ]; + } + + public static function checkPHP(&$phpath, &$checks) + { + $passed = $passed2 = $passed3 = false; + if (strlen($phpath)) { + $passed = file_exists($phpath); + } else { + $phpath = trim(shell_exec('which php')); + $passed = strlen($phpath); + } + $help = ""; + if (!$passed) { + $help .= L10n::t('Could not find a command line version of PHP in the web server PATH.'). EOL; + $help .= L10n::t("If you don't have a command line version of PHP installed on your server, you will not be able to run the background processing. See 'Setup the worker'") . EOL; + $help .= EOL . EOL; + $tpl = get_markup_template('field_input.tpl'); + $help .= replace_macros($tpl, [ + '$field' => ['phpath', L10n::t('PHP executable path'), $phpath, L10n::t('Enter full path to php executable. You can leave this blank to continue the installation.')], + ]); + $phpath = ""; + } + + self::addCheck($checks, L10n::t('Command line PHP').($passed?" ($phpath)":""), $passed, false, $help); + + if ($passed) { + $cmd = "$phpath -v"; + $result = trim(shell_exec($cmd)); + $passed2 = ( strpos($result, "(cli)") !== false); + list($result) = explode("\n", $result); + $help = ""; + if (!$passed2) { + $help .= L10n::t("PHP executable is not the php cli binary \x28could be cgi-fgci version\x29"). EOL; + $help .= L10n::t('Found PHP version: ')."$result"; + } + self::addCheck($checks, L10n::t('PHP cli binary'), $passed2, true, $help); + } + + + if ($passed2) { + $str = autoname(8); + $cmd = "$phpath testargs.php $str"; + $result = trim(shell_exec($cmd)); + $passed3 = $result == $str; + $help = ""; + if (!$passed3) { + $help .= L10n::t('The command line version of PHP on your system does not have "register_argc_argv" enabled.'). EOL; + $help .= L10n::t('This is required for message delivery to work.'); + } + self::addCheck($checks, L10n::t('PHP register_argc_argv'), $passed3, true, $help); + } + + + } + + public static function checkKeys(&$checks) + { + + $help = ''; + + $res = false; + + if (function_exists('openssl_pkey_new')) { + $res = openssl_pkey_new([ + 'digest_alg' => 'sha1', + 'private_key_bits' => 4096, + 'encrypt_key' => false + ]); + } + + // Get private key + + if (! $res) { + $help .= L10n::t('Error: the "openssl_pkey_new" function on this system is not able to generate encryption keys'). EOL; + $help .= L10n::t('If running under Windows, please see "http://www.php.net/manual/en/openssl.installation.php".'); + } + self::addCheck($checks, L10n::t('Generate encryption keys'), $res, true, $help); + + } + + + public static function checkFunctions(&$checks) + { + $ck_funcs = []; + self::addCheck($ck_funcs, L10n::t('libCurl PHP module'), true, true, ""); + self::addCheck($ck_funcs, L10n::t('GD graphics PHP module'), true, true, ""); + self::addCheck($ck_funcs, L10n::t('OpenSSL PHP module'), true, true, ""); + self::addCheck($ck_funcs, L10n::t('PDO or MySQLi PHP module'), true, true, ""); + self::addCheck($ck_funcs, L10n::t('mb_string PHP module'), true, true, ""); + self::addCheck($ck_funcs, L10n::t('XML PHP module'), true, true, ""); + self::addCheck($ck_funcs, L10n::t('iconv PHP module'), true, true, ""); + self::addCheck($ck_funcs, L10n::t('POSIX PHP module'), true, true, ""); + + if (function_exists('apache_get_modules')) { + if (! in_array('mod_rewrite',apache_get_modules())) { + self::addCheck($ck_funcs, L10n::t('Apache mod_rewrite module'), false, true, L10n::t('Error: Apache webserver mod-rewrite module is required but not installed.')); + } else { + self::addCheck($ck_funcs, L10n::t('Apache mod_rewrite module'), true, true, ""); + } + } + + if (! function_exists('curl_init')) { + $ck_funcs[0]['status'] = false; + $ck_funcs[0]['help'] = L10n::t('Error: libCURL PHP module required but not installed.'); + } + if (! function_exists('imagecreatefromjpeg')) { + $ck_funcs[1]['status'] = false; + $ck_funcs[1]['help'] = L10n::t('Error: GD graphics PHP module with JPEG support required but not installed.'); + } + if (! function_exists('openssl_public_encrypt')) { + $ck_funcs[2]['status'] = false; + $ck_funcs[2]['help'] = L10n::t('Error: openssl PHP module required but not installed.'); + } + if (! function_exists('mysqli_connect') && !class_exists('pdo')) { + $ck_funcs[3]['status'] = false; + $ck_funcs[3]['help'] = L10n::t('Error: PDO or MySQLi PHP module required but not installed.'); + } + if (!function_exists('mysqli_connect') && class_exists('pdo') && !in_array('mysql', PDO::getAvailableDrivers())) { + $ck_funcs[3]['status'] = false; + $ck_funcs[3]['help'] = L10n::t('Error: The MySQL driver for PDO is not installed.'); + } + if (! function_exists('mb_strlen')) { + $ck_funcs[4]['status'] = false; + $ck_funcs[4]['help'] = L10n::t('Error: mb_string PHP module required but not installed.'); + } + if (! function_exists('iconv_strlen')) { + $ck_funcs[6]['status'] = false; + $ck_funcs[6]['help'] = L10n::t('Error: iconv PHP module required but not installed.'); + } + if (! function_exists('posix_kill')) { + $ck_funcs[7]['status'] = false; + $ck_funcs[7]['help'] = L10n::t('Error: POSIX PHP module required but not installed.'); + } + + $checks = array_merge($checks, $ck_funcs); + + // check for XML DOM Documents being able to be generated + try { + $xml = new DOMDocument(); + } catch (Exception $e) { + $ck_funcs[5]['status'] = false; + $ck_funcs[5]['help'] = L10n::t('Error, XML PHP module required but not installed.'); + } + } + + + public static function checkHtConfig(&$checks) + { + $status = true; + $help = ""; + if ((file_exists('config/.htconfig.php') && !is_writable('.htconfig.php')) || + (!file_exists('config/.htconfig.php') && !is_writable('.'))) { + + $status = false; + $help = L10n::t('The web installer needs to be able to create a file called ".htconfig.php" in the "config/" folder of your web server and it is unable to do so.') .EOL; + $help .= L10n::t('This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can.').EOL; + $help .= L10n::t('At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica "config/" folder.').EOL; + $help .= L10n::t('You can alternatively skip this procedure and perform a manual installation. Please see the file "INSTALL.txt" for instructions.').EOL; + } + + self::addCheck($checks, L10n::t('config/.htconfig.php is writable'), $status, false, $help); + + } + + public static function checkSmarty3(&$checks) + { + $status = true; + $help = ""; + if (!is_writable('view/smarty3')) { + + $status = false; + $help = L10n::t('Friendica uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.') .EOL; + $help .= L10n::t('In order to store these compiled templates, the web server needs to have write access to the directory view/smarty3/ under the Friendica top level folder.').EOL; + $help .= L10n::t("Please ensure that the user that your web server runs as \x28e.g. www-data\x29 has write access to this folder.").EOL; + $help .= L10n::t("Note: as a security measure, you should give the web server write access to view/smarty3/ only--not the template files \x28.tpl\x29 that it contains.").EOL; + } + + self::addCheck($checks, L10n::t('view/smarty3 is writable'), $status, true, $help); + + } + + public static function checkHtAccess(&$checks) + { + $status = true; + $help = ""; + if (function_exists('curl_init')) { + $test = Network::fetchUrl(System::baseUrl()."/install/testrewrite"); + + if ($test != "ok") { + $test = Network::fetchUrl(normalise_link(System::baseUrl()."/install/testrewrite")); + } + + if ($test != "ok") { + $status = false; + $help = L10n::t('Url rewrite in .htaccess is not working. Check your server configuration.'); + } + self::addCheck($checks, L10n::t('Url rewrite is working'), $status, true, $help); + } else { + // cannot check modrewrite if libcurl is not installed + /// @TODO Maybe issue warning here? + } + } + + public static function checkImagik(&$checks) + { + $imagick = false; + $gif = false; + + if (class_exists('Imagick')) { + $imagick = true; + $supported = Image::supportedTypes(); + if (array_key_exists('image/gif', $supported)) { + $gif = true; + } + } + if ($imagick == false) { + self::addCheck($checks, L10n::t('ImageMagick PHP extension is not installed'), $imagick, false, ""); + } else { + self::addCheck($checks, L10n::t('ImageMagick PHP extension is installed'), $imagick, false, ""); + if ($imagick) { + self::addCheck($checks, L10n::t('ImageMagick supports GIF'), $gif, false, ""); + } + } + } + + public static function loadDatabase() + { + $errors = DBStructure::update(false, true, true); + + return $errors; + } +} \ No newline at end of file