2 /**********************************************************************
3 Copyright (C) FrontAccounting, LLC.
4 Released under the terms of the GNU General Public License, GPL,
5 as published by the Free Software Foundation, either version 3
6 of the License, or (at your option) any later version.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
13 // Type of requirement for positive test result
17 2 => _('Recommended'),
21 // test mysql server version
24 $test['descr'] = _('MySQL version'). ' >=4.1';
26 $test['test'] = db_get_version();
27 if (!($test['result'] = ($test['test']>='4.1'))) {
28 $db_str = explode('-', $test['test']);
29 $test['result'] = ($db_str[1] == 'MariaDB');
31 $test['comments'] = _('Upgrade MySQL server to version at least 4.1');
35 // test php mysql extension
36 function tst_phpmysql()
38 $test['descr'] = _('PHP MySQL extension');
40 $test['result'] = db_extension_exists();
41 $test['test'] = $test['result'] ? _('Yes'): _('No');
43 $test['comments'] = _('Your PHP has to have MySQL extension enabled.');
49 $test['descr'] = _('PHP version').' >=5.0.0';
51 $test['test'] = phpversion();
52 $test['result'] = $test['test']>='5.0.0';
53 $test['comments'] = _('Upgrade PHP to version at least 5.0.0');
60 $test['descr'] = _('Server system');
62 $test['test'] = PHP_OS;
63 $test['result'] = true;
68 function tst_sessionpath()
70 $test['descr'] = _('Session save path');
72 $test['test'] = session_save_path();
73 $test['result'] = true;
78 function tst_install()
82 $test['descr'] = _('Removed install wizard folder');
84 $test['result'] = !is_dir($path_to_root.'/install');
85 $test['test'] = _('Not removed');
86 $test['comments'] = _('Remove or rename install wizard folder for security reasons.');
91 function tst_browser()
93 $test['descr'] = _('Browser type');
95 $test['test'] = $_SERVER['HTTP_USER_AGENT'];
96 $test['result'] = true;
97 $test['comments'] = _('Any browser is supported');
102 function tst_server()
104 $test['descr'] = _('Http server type');
105 $test['test'] = $_SERVER['SERVER_SOFTWARE'];
107 $test['result'] = true;
108 $test['comments'] = _('Any server is supported');
113 function tst_gettext()
115 $test['descr'] = _('Native gettext');
116 $test['test'] = function_exists('gettext') ? _('Yes'): _('No');
118 $test['result'] = true;
119 $test['comments'] = _('In case of no gettext support, php emulation is used');
127 $test['descr'] = _('Debugging mode');
129 $test['test'] = $SysPrefs->go_debug ? _("Yes") : _("No");
130 $test['result'] = $SysPrefs->go_debug != 0;
131 $test['comments'] = _('To switch debugging on set $go_debug>0 in config.php file');
136 function tst_logging()
140 $error_logfile = $SysPrefs->error_logfile;
141 $test['descr'] = _('Error logging');
143 // if error lgging is on, but log file does not exists try write
144 if ($error_logfile && !is_file($error_logfile))
146 @fclose(@fopen($error_logfile, 'w'));
148 $test['result'] = @$error_logfile != '' && is_writable($error_logfile);
149 $test['test'] = @$error_logfile == '' ? _("Disabled") : $error_logfile;
151 if (@$error_logfile == '')
152 $test['comments'] = _('To switch error logging set $error_logging in config.php file');
154 if (!is_writable($error_logfile))
155 $test['comments'] = _('Log file is not writeable');
160 // Installed FA database structure version
162 function tst_dbversion()
165 $test['descr'] = _('Current database version');
167 $test['test'] = get_company_pref('version_id');
168 $test['result'] = $test['test'] == $db_version;
169 $test['comments'] = _('Database structure seems to be not upgraded to current version')
176 function tst_subdirs($install=false)
178 global $db_connections;
180 $comps = $install ? array('0') : array_keys($db_connections);
182 $comp_subdirs = array('images', 'pdf_files', 'backup','js_cache');
184 $test['descr'] = _('Company subdirectories consistency');
186 $test['test'] = array(company_path().'/*');
187 foreach($comp_subdirs as $sub) {
188 $test['test'][] = company_path().'/*/'.$sub;
190 $test['result'] = true;
192 $comp_path = company_path();
193 foreach ($comps as $n) {
194 $path = company_path($n);
195 if (!is_dir($path) || !is_writable($path) ) {
196 $test['result'] = false;
197 $test['comments'][] = sprintf(_("'%s' is not writeable"), $path);
200 foreach($comp_subdirs as $sub) {
201 $spath = $path.'/'.$sub;
202 if (!is_dir($spath) || !is_writable($spath) ) {
203 $test['result'] = false;
204 $test['comments'][] = sprintf(_("'%s' is not writeable"), $spath);
206 $dir = opendir($spath);
207 while (false !== ($fname = readdir($dir))) {
208 // check only *.js files. Manually installed package can contain other
209 // non-writable files which are non-crucial for normal operations
210 if (preg_match('/.*(\.js)/', $fname) && !is_writable("$spath/$fname")) {
211 $test['result'] = false;
212 $test['comments'][] = sprintf(_("'%s' is not writeable"), "$spath/$fname");
221 function tst_tmpdir()
223 global $path_to_root;
225 $test['descr'] = _('Temporary directory');
227 $test['test'] = VARLIB_PATH;
228 $test['result'] = is_dir($test['test']) && is_writable($test['test']);
229 $test['comments'][] = sprintf(_("'%s' is not writeable"), $test['test']);
233 function tst_langs($install)
235 global $installed_languages, $path_to_root, $GetText;
237 $test['descr'] = _('Language configuration consistency');
239 $test['result'] = true;
240 $test['comments'] = array();
242 $fname = $path_to_root.'/lang';
243 $test['test'] = $fname;
244 if (!(is_dir($fname) && is_writable($fname))) {
245 $test['result'] = false;
246 $test['comments'][] = _("Languages folder should be writeable.");
251 $fname = $path_to_root.'/lang/installed_languages.inc';
252 $test['test'] = $fname;
253 if (!(is_file($fname) && is_writable($fname))) {
254 $test['result'] = false;
255 $test['comments'][] = _("Languages configuration file should be writeable.");
262 foreach ($installed_languages as $lang) {
264 if ($lang['code'] == 'C') continue; // no translation (English)
265 $langs[] = $lang['code'];
267 $file = $path_to_root.'/lang/'.$lang['code'].'/LC_MESSAGES/'.$lang['code'];
268 if (@$lang['version'])
269 $file .= '-'.$lang['version'];
270 $file .= function_exists('gettext') ? '.mo' : '.po';
272 if (!is_file($file)) {
273 $test['result'] = false;
274 $test['comments'][] = sprintf( _('Missing %s translation file.'), $file);
276 if (!$GetText->check_support($lang['code'], $lang['encoding']))
278 $test['result'] = false;
279 $test['comments'][] = sprintf(_('Missing system locale: %s'), $lang['code'].".".$lang['encoding']);
283 $test['test'] = $langs;
288 function tst_config($install)
290 global $path_to_root;
292 $test['descr'] = _('Main config file');
293 $test['test'] = $path_to_root.'/config.php';
296 $writable = check_write($test['test']);
297 $test['result'] = $writable==1;
298 $test['comments'][] = $writable == 0 ?
299 sprintf(_("Can't write '%s' file. Check FA directory write permissions."), $test['test'])
300 : sprintf(_("'%s' file exists."), $test['test']);
303 $test['result'] = is_file($test['test']) && !is_writable($test['test']);
304 $test['comments'][] = sprintf(_("'%s' file should be read-only"), $test['test']);
309 function tst_dbconfig($install)
311 global $path_to_root;
313 $test['descr'] = _('Database auth file');
314 $test['test'] = $path_to_root.'/config_db.php';
318 $writable = check_write($test['test']);
319 $test['result'] = $writable==1;
320 $test['comments'][] = $writable == 0 ?
321 sprintf(_("Can't write '%s' file. Check FA directory write permissions."), $test['test'])
322 : sprintf(_("'%s' file exists."), $test['test']);
325 $test['result'] = is_file($test['test']) && !is_writable($test['test']);
326 $test['comments'][] = sprintf(_("'%s' file should be read-only if you do not plan to add or change companies"), $test['test']);
331 function tst_extconfig($install)
333 global $path_to_root, $db_connections;
335 $comps = $install ? array('0') : array_keys($db_connections);
337 $test['descr'] = _('Extensions system');
339 $fname = $path_to_root.'/installed_extensions.php';
340 $test['test'][] = $fname;
341 $test['result'] = ($install || is_file($fname)) && check_write($fname);
342 $test['test'][] = company_path().'/*/installed_extensions.php';
343 if (!$test['result'])
344 $test['comments'][] = sprintf(_("'%s' is not writeable"), $fname);
346 foreach ($comps as $n) {
347 $path = company_path($n);
348 if (!is_dir($path)) continue;
350 $path .= "/installed_extensions.php";
351 if ((!$install && !is_file($path)) || !check_write($path) ) {
352 $test['result'] = false;
353 $test['comments'][] = sprintf(_("'%s' is not writeable"), $path);
357 foreach(array('modules', 'modules/_cache', 'themes', 'sql') as $dir) {
358 $fname = $path_to_root.'/'.$dir;
359 $test['test'][] = $fname;
360 $t = is_dir($fname) && is_writable($fname);
362 $test['comments'][] = sprintf(_("'%s' is not writeable"), $fname);
363 $test['result'] &= $t;
366 foreach(array('Release', 'Themes', 'Languages', 'Extensions', 'Charts') as $file) {
367 $fname = $path_to_root."/modules/_cache/".$file.".gz";
368 $t = !file_exists($fname) || is_writable($fname);
370 $test['comments'][] = sprintf(_("'%s' is not writeable"), $fname);
371 $test['result'] &= $t;
375 $test['comments'][] = _("Extensions configuration files and directories should be writeable");
377 $fname = $path_to_root."/themes";
378 $themedir = opendir($fname);
379 while (false !== ($fname = readdir($themedir)))
381 if ($fname!='.' && $fname!='..' && is_dir($path_to_root.'/themes/'.$fname)
382 && !in_array($fname, array('canvas', 'default', 'dropdown')))
384 $test['test'][] = $fname;
385 $test['result'] = is_writable($path_to_root.'/themes/'.$fname);
386 if (!$test['result']) {
387 $test['comments'][] =
388 sprintf(_("Non-standard theme directory '%s' is not writable"), $fname);
395 $test['test'][] = 'OpenSSL PHP extension';
396 if (!extension_loaded('openssl')) {
397 $test['result'] = false;
398 $test['comments'][] = _("OpenSSL PHP extension have to be enabled to use extension repository system.");
399 } elseif (!function_exists('openssl_verify')) {
400 $test['result'] = false;
401 $test['comments'][] = _("OpenSSL have to be available on your server to use extension repository system.");
406 function display_system_tests($install = false)
411 $system_tests = array('tst_php', 'tst_phpmysql', 'tst_system', 'tst_dbconfig',
413 'tst_subdirs', 'tst_langs', 'tst_tmpdir', 'tst_sessionpath', 'tst_extconfig'
416 $system_tests = array('tst_mysql', 'tst_php', 'tst_server', 'tst_system', 'tst_browser',
417 'tst_gettext', 'tst_debug', 'tst_logging',
418 'tst_dbversion', 'tst_subdirs', 'tst_langs', 'tst_tmpdir', 'tst_sessionpath',
419 'tst_install', 'tst_dbconfig', 'tst_config', 'tst_extconfig'
423 start_table(TABLESTYLE, "width='80%'");
424 $th = array(_("Test"), _('Test type'), _("Value"), _("Comments"));
428 $k = 0; //row colour counter
429 foreach ($system_tests as $test)
431 alt_table_row_color($k);
432 $result = $test($install);
433 if (!$result) continue;
435 label_cell($result['descr']);
436 label_cell($test_level[$result['type']]);
438 $res = is_array(@$result['test']) ? implode('<br>', $result['test'])
442 $comm = is_array(@$result['comments']) ? implode('<br>', $result['comments'])
443 : @$result['comments'];
444 $color = ($result['result'] ? 'green':
445 ($result['type']==3 ? 'red' :
446 ($result['type']==2 ? 'orange' : 'green')));
447 label_cell("<span style='color:$color'>".
448 ($result['result'] ? _('Ok') : '<b>'.$comm.'</b>').'</span>');
450 $ret = $ret && (($result['result']!=0) || ($result['type'] < 3));