diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php index 8c9d7644420490272e36578cc933f8f883073fa2..8f397c819a2bde230d49314a8e861fd385749165 100644 --- a/server/lib/classes/cron.d/150-goaccess.inc.php +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -61,183 +61,186 @@ class cronjob_goaccess extends cronjob { $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); - $goaccess_conf_locs = array('/etc/goaccess.conf', '/etc/goaccess/goaccess.conf'); - $count = 0; - - foreach($goaccess_conf_locs as $goa_loc) { - if(is_file($goa_loc) && (filesize($goa_loc) > 0)) { - $goaccess_conf_main = $goa_loc; - break; - } else { - $count++; - if($count == 2) { - $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in /etc or /etc/goaccess", LOGLEVEL_ERROR); - } - } - } - - - /* Check if goaccess binary is in path */ - system("type goaccess 2>&1>/dev/null", $retval); - if ($retval === 0) { - - foreach($records as $rec) { - $yesterday = date('Ymd', strtotime("-1 day", time())); - - $log_folder = 'log'; - - if($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') { - $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $rec['parent_domain_id']); - $subdomain_host = preg_replace('/^(.*)\.' . preg_quote($tmp['domain'], '/') . '$/', '$1', $rec['domain']); - if($subdomain_host == '') $subdomain_host = 'web'.$rec['domain_id']; - $log_folder .= '/' . $subdomain_host; - unset($tmp); - } + if(is_array($records) && !empty($records)) { - $logfile = $rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log'; + /* Check if goaccess binary is in path/installed */ + if($app->system->is_installed('goaccess')) { - if(!@is_file($logfile)) { - $logfile = $rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log.gz'; - if(!@is_file($logfile)) { - continue; + $goaccess_conf_locs = array('/etc/goaccess.conf', '/etc/goaccess/goaccess.conf'); + $count = 0; + + foreach($goaccess_conf_locs as $goa_loc) { + if(is_file($goa_loc) && (filesize($goa_loc) > 0)) { + $goaccess_conf_main = $goa_loc; + break; + } else { + $count++; + if($count == 2) { + $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in /etc or /etc/goaccess", LOGLEVEL_ERROR); + } + } + } + + + foreach($records as $rec) { + $yesterday = date('Ymd', strtotime("-1 day", time())); + + $log_folder = 'log'; + + if($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') { + $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $rec['parent_domain_id']); + $subdomain_host = preg_replace('/^(.*)\.' . preg_quote($tmp['domain'], '/') . '$/', '$1', $rec['domain']); + if($subdomain_host == '') $subdomain_host = 'web'.$rec['domain_id']; + $log_folder .= '/' . $subdomain_host; + unset($tmp); } - } - $web_folder = (($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') ? $rec['web_folder'] : 'web'); - $domain = $rec['domain']; - $statsdir = $rec['document_root'].'/'.$web_folder.'/stats'; - $goaccess_conf = $rec['document_root'].'/log/goaccess.conf'; + $logfile = $rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log'; + + if(!@is_file($logfile)) { + $logfile = $rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log.gz'; + if(!@is_file($logfile)) { + continue; + } + } - /* - In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. - By default the originally, with GoAccess shipped goaccess.conf from /etc/ or /etc/goaccess will be used along with the log-format value COMBINED. - */ + $web_folder = (($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') ? $rec['web_folder'] : 'web'); + $domain = $rec['domain']; + $statsdir = $rec['document_root'].'/'.$web_folder.'/stats'; + $goaccess_conf = $rec['document_root'].'/log/goaccess.conf'; - if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master") && (!file_exists($goaccess_conf))) { - $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master", $goaccess_conf); - } elseif(!file_exists($goaccess_conf)) { /* - By default the goaccess.conf should get copied by the webserver plugin but in case it wasn't, or it got deleted by accident we gonna copy it again to the destination dir. - Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf as the base conf. + In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. + By default the originally, with GoAccess shipped goaccess.conf from /etc/ or /etc/goaccess will be used along with the log-format value COMBINED. */ - $app->system->copy($goaccess_conf_main, $goaccess_conf); - $content = $app->system->file_get_contents($goaccess_conf, true); - $content = preg_replace('/^(#)?log-format COMBINED/m', "log-format COMBINED", $content); - $app->system->file_put_contents($goaccess_conf, $content, true); - unset($content); - } - - /* Update the primary domain name in the title, it could occasionally change */ - if(is_file($goaccess_conf) && (filesize($goaccess_conf) > 0)) { - $content = $app->system->file_get_contents($goaccess_conf, true); - $content = preg_replace('/^(#)?html-report-title(.*)/m', "html-report-title $domain", $content); - $app->system->file_put_contents($goaccess_conf, $content, true); - unset($content); - } - - $username = $rec['system_user']; - $groupname = $rec['system_group']; - $docroot = $rec['document_root']; + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master") && (!file_exists($goaccess_conf))) { + $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master", $goaccess_conf); + } elseif(!file_exists($goaccess_conf)) { - if(!@is_dir($statsdir)) $app->system->mkdirpath($statsdir, 0755, $username, $groupname); + /* + By default the goaccess.conf should get copied by the webserver plugin but in case it wasn't, or it got deleted by accident we gonna copy it again to the destination dir. + Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf or /etc/goaccess/goaccess.conf as the base conf. + */ - $goa_db_dir = $docroot.'/'.$web_folder.'/stats/.db/'; - $output_html = $docroot.'/'.$web_folder.'/stats/goaindex.html'; - if(!@is_dir($goa_db_dir)) $app->system->mkdirpath($goa_db_dir); - - if(is_link('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log')) $app->system->unlink('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); - symlink($logfile, '/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); + $app->system->copy($goaccess_conf_main, $goaccess_conf); + $content = $app->system->file_get_contents($goaccess_conf, true); + $content = preg_replace('/^(#)?log-format COMBINED/m', "log-format COMBINED", $content); + $app->system->file_put_contents($goaccess_conf, $content, true); + unset($content); + } + /* Update the primary domain name in the title, it could occasionally change */ + if(is_file($goaccess_conf) && (filesize($goaccess_conf) > 0)) { + $content = $app->system->file_get_contents($goaccess_conf, true); + $content = preg_replace('/^(#)?html-report-title(.*)/m', "html-report-title $domain", $content); + $app->system->file_put_contents($goaccess_conf, $content, true); + unset($content); + } - $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); + $username = $rec['system_user']; + $groupname = $rec['system_group']; + $docroot = $rec['document_root']; - $goamonth = date("n"); - $goayear = date("Y"); + if(!@is_dir($statsdir)) $app->system->mkdirpath($statsdir, 0755, $username, $groupname); - if (date("d") == 1) { - $goamonth = date("m")-1; - if (date("m") == 1) { - $goayear = date("Y")-1; - $goamonth = "12"; - } - } + $goa_db_dir = $docroot.'/'.$web_folder.'/stats/.db/'; + $output_html = $docroot.'/'.$web_folder.'/stats/goaindex.html'; + if(!@is_dir($goa_db_dir)) $app->system->mkdirpath($goa_db_dir); + + if(is_link('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log')) $app->system->unlink('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); - if (date("d") == 2) { - $goamonth = date("m")-1; - if (date("m") == 1) { - $goayear = date("Y")-1; - $goamonth = "12"; + symlink($logfile, '/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); + $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); + + $goamonth = date("n"); + $goayear = date("Y"); + + if (date("d") == 1) { + $goamonth = date("m")-1; + if (date("m") == 1) { + $goayear = date("Y")-1; + $goamonth = "12"; + } } - $statsdirold = $statsdir."/".$goayear."-".$goamonth."/"; + if (date("d") == 2) { + $goamonth = date("m")-1; + if (date("m") == 1) { + $goayear = date("Y")-1; + $goamonth = "12"; + } + + $statsdirold = $statsdir."/".$goayear."-".$goamonth."/"; + + if(!is_dir($statsdirold)) { + $app->system->mkdirpath($statsdirold, 0755, $username, $groupname); + } - if(!is_dir($statsdirold)) { - $app->system->mkdirpath($statsdirold, 0755, $username, $groupname); - } + // don't rotate db files per month + //rename($goa_db_dir, $statsdirold.'db'); + //mkdir($goa_db_dir); - // don't rotate db files per month - //rename($goa_db_dir, $statsdirold.'db'); - //mkdir($goa_db_dir); - $files = scandir($statsdir); + $files = scandir($statsdir); - foreach ($files as $file) { - if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") $app->system->copy("$statsdir"."/"."$file", "$statsdirold"."$file"); + foreach ($files as $file) { + if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") $app->system->copy("$statsdir"."/"."$file", "$statsdirold"."$file"); + } } - } - - // Get the GoAccess version - $match = array(); - $goaccess_version = $app->system->system_safe('goaccess --version 2>&1'); + // Get the GoAccess version + $match = array(); + + $goaccess_version = $app->system->system_safe('goaccess --version 2>&1'); - if(preg_match('/[0-9]\.[0-9]{1,2}/', $goaccess_version, $match)) { - $goaccess_version = $match[0]; - } + if(preg_match('/[0-9]\.[0-9]{1,2}/', $goaccess_version, $match)) { + $goaccess_version = $match[0]; + } - /* - * GoAccess removed with 1.4 btree support and supports from this version on only "In-Memory with On-Disk Persitance Storage". - * For versions prior 1.4 you need GoAccess with btree support compiled! - */ + /* + * GoAccess removed with 1.4 btree support and supports from this version on only "In-Memory with On-Disk Persitance Storage". + * For versions prior 1.4 you need GoAccess with btree support compiled! + */ - $cust_lang = $conf['language']."_".strtoupper($conf['language']); - - if(version_compare($goaccess_version,1.4) >= 0) { - $app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --restore --persist --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html); - } else { - $output = $app->system->system_safe('goaccess --help 2>&1'); - preg_match('/keep-db-files/', $output, $match); - if($match[0] == "keep-db-files") { - $app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --load-from-disk --keep-db-files --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html); - } else { - $app->log("Stats not generated. The GoAccess binary was not compiled with btree support. Please recompile/reinstall GoAccess with btree support, or install GoAccess version >= 1.4!", LOGLEVEL_ERROR); - } - unset($output); - } - unset($cust_lang); + $cust_lang = $conf['language']."_".strtoupper($conf['language']); - if(!is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { - if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { - $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + if(version_compare($goaccess_version,1.4) >= 0) { + $app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --restore --persist --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html); } else { - $app->system->copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + $output = $app->system->system_safe('goaccess --help 2>&1'); + preg_match('/keep-db-files/', $output, $match); + if($match[0] == "keep-db-files") { + $app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --load-from-disk --keep-db-files --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html); + } else { + $app->log("Stats not generated. The GoAccess binary was not compiled with btree support. Please recompile/reinstall GoAccess with btree support, or install GoAccess version >= 1.4!", LOGLEVEL_ERROR); + } + unset($output); + } + unset($cust_lang); + + if(!is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { + $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + } else { + $app->system->copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + } } - } - $app->log('Created GoAccess statistics for ' . $domain, LOGLEVEL_DEBUG); - if(is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { - chown($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_user']); - chgrp($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_group']); - } + $app->log('Created GoAccess statistics for ' . $domain, LOGLEVEL_DEBUG); + if(is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { + $app->system->chown($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_user']); + $app->system->chgrp($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_group']); + } - $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); + $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); + } + } else { + $app->log("Stats not generated. The GoAccess binary couldn't be found. Make sure that GoAccess is installed and that it is in \$PATH", LOGLEVEL_ERROR); } - } else { - $app->log("Stats not generated. The GoAccess binary couldn't be found. Make sure that GoAccess is installed and that it is in \$PATH", LOGLEVEL_ERROR); - } + } parent::onRunJob(); }