From 070eea2fdd4590fb74b9aca928df74563f209de5 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 29 May 2018 22:00:17 +0200 Subject: [PATCH] rework token, "fixed" gitmodules, saimods rework, split log & analytics, minor fixes --- .gitmodules | 5 +- log/result/JsonResult.php | 3 + page/State.php | 2 +- sai/modules/autoload.inc | 1 + sai/modules/saimod_sys_analytics/autoload.inc | 5 + .../js/saimod_sys_analytics.js | 84 ++++ .../qq/SYS_SAIMOD_LOG_ANALYTICS.php | 56 +++ .../qq/SYS_SAIMOD_LOG_BASIC_QUERYTIME.php | 60 +++ .../qq/SYS_SAIMOD_LOG_BASIC_SUCCESS.php | 85 ++++ .../qq/SYS_SAIMOD_LOG_BASIC_VISITOR.php | 56 +++ .../qq/SYS_SAIMOD_LOG_CLASS_BASIC.php | 62 +++ .../qq/SYS_SAIMOD_LOG_CLASS_OTHER.php | 58 +++ .../qq/SYS_SAIMOD_LOG_CLASS_SYSTEM.php | 66 +++ .../qq/SYS_SAIMOD_LOG_ERROR.php | 50 +++ .../qq/SYS_SAIMOD_LOG_FILTER.php | 60 +++ .../qq/SYS_SAIMOD_LOG_FILTERS.php | 48 ++ .../qq/SYS_SAIMOD_LOG_FILTER_COUNT.php | 54 +++ .../qq/SYS_SAIMOD_LOG_TRUNCATE.php | 42 ++ .../qq/SYS_SAIMOD_LOG_UNIQUE_BASIC.php | 58 +++ .../qq/SYS_SAIMOD_LOG_UNIQUE_EXCEPTION.php | 58 +++ .../qq/SYS_SAIMOD_LOG_UNIQUE_REFERER.php | 60 +++ .../qq/SYS_SAIMOD_LOG_UNIQUE_REQUEST.php | 60 +++ .../saimod_sys_analytics.php | 422 ++++++++++++++++++ sai/modules/saimod_sys_analytics/tpl/menu.tpl | 7 + .../tpl/saimod_sys_analytics.tpl | 46 ++ .../tpl/saimod_sys_analytics_analytics.tpl} | 0 .../tpl/saimod_sys_analytics_menu.tpl | 1 + .../tpl/saimod_sys_log_stats.tpl | 0 .../saimod_sys_log/js/saimod_sys_log.js | 82 ---- sai/modules/saimod_sys_log/saimod_sys_log.php | 393 +--------------- sai/modules/saimod_sys_log/tpl/menu.tpl | 1 + .../saimod_sys_log/tpl/saimod_sys_log.tpl | 27 +- .../tpl/saimod_sys_log_error_filter.tpl | 2 +- .../tpl/saimod_sys_log_filter.tpl | 59 +-- .../tpl/saimod_sys_log_stats_menu.tpl | 1 - .../saimod_sys_text/js/saimod_sys_text.js | 4 +- sai/modules/saimod_sys_text/tpl/menu.tpl | 1 + .../saimod_sys_text/tpl/saimod_sys_text.tpl | 33 +- .../saimod_sys_todo/js/saimod_sys_todo.js | 4 +- sai/modules/saimod_sys_todo/tpl/menu.tpl | 1 + .../saimod_sys_todo/tpl/saimod_sys_todo.tpl | 27 +- .../saistart_sys_sai/saistart_sys_sai.php | 2 +- security/security.php | 2 +- sql/mysql/data/system_page.sql | 6 +- sql/mysql/data/system_sai_api.sql | 11 +- sql/mysql/schema/system_token.sql | 1 - token/qq/SYS_TOKEN_CONFIRM.php | 2 +- token/qq/SYS_TOKEN_DELETE.php | 33 ++ token/qq/SYS_TOKEN_DUPLICATE.php | 33 ++ token/qq/SYS_TOKEN_EXPIRE_UPDATE.php | 33 ++ token/qq/SYS_TOKEN_INSERT.php | 6 +- token/token.php | 68 +-- token/token_change_email.php | 21 - token/token_confirm_email.php | 18 - token/token_handler.php | 16 - token/token_reset_password.php | 18 - 56 files changed, 1725 insertions(+), 689 deletions(-) create mode 100644 sai/modules/saimod_sys_analytics/autoload.inc create mode 100644 sai/modules/saimod_sys_analytics/js/saimod_sys_analytics.js create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_ANALYTICS.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_BASIC_QUERYTIME.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_BASIC_SUCCESS.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_BASIC_VISITOR.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_CLASS_BASIC.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_CLASS_OTHER.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_CLASS_SYSTEM.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_ERROR.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_FILTER.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_FILTERS.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_FILTER_COUNT.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_TRUNCATE.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_UNIQUE_BASIC.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_UNIQUE_EXCEPTION.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_UNIQUE_REFERER.php create mode 100644 sai/modules/saimod_sys_analytics/qq/SYS_SAIMOD_LOG_UNIQUE_REQUEST.php create mode 100644 sai/modules/saimod_sys_analytics/saimod_sys_analytics.php create mode 100644 sai/modules/saimod_sys_analytics/tpl/menu.tpl create mode 100644 sai/modules/saimod_sys_analytics/tpl/saimod_sys_analytics.tpl rename sai/modules/{saimod_sys_log/tpl/saimod_sys_log_analytics.tpl => saimod_sys_analytics/tpl/saimod_sys_analytics_analytics.tpl} (100%) create mode 100644 sai/modules/saimod_sys_analytics/tpl/saimod_sys_analytics_menu.tpl rename sai/modules/{saimod_sys_log => saimod_sys_analytics}/tpl/saimod_sys_log_stats.tpl (100%) delete mode 100644 sai/modules/saimod_sys_log/tpl/saimod_sys_log_stats_menu.tpl create mode 100644 token/qq/SYS_TOKEN_DELETE.php create mode 100644 token/qq/SYS_TOKEN_DUPLICATE.php create mode 100644 token/qq/SYS_TOKEN_EXPIRE_UPDATE.php diff --git a/.gitmodules b/.gitmodules index 5f5c634..77717bb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -54,7 +54,4 @@ url = ../lib_jstree.git [submodule "lib/font_awesome"] path = lib/font_awesome - url = gogs@webcraft-media.de:webcraft/lib_font_awesome.git -[submodule "lib/popper"] - path = lib/popper - url = D:\\sources\\web\\test\\democracy\\lib\\system\\lib\\popper + url = ../lib_font_awesome.git diff --git a/log/result/JsonResult.php b/log/result/JsonResult.php index b0837d7..8d8c727 100644 --- a/log/result/JsonResult.php +++ b/log/result/JsonResult.php @@ -81,4 +81,7 @@ class JsonResult{ */ public static function fail(){ return self::toString(NULL,false);} + + public static function status($status){ + return $status ? self::ok() : self::fail();} } \ No newline at end of file diff --git a/page/State.php b/page/State.php index 4282d9e..ca2fb10 100644 --- a/page/State.php +++ b/page/State.php @@ -35,7 +35,7 @@ class State { $vars = array(); for($i=1;$inext()){ diff --git a/sai/modules/autoload.inc b/sai/modules/autoload.inc index 8cefa5b..65f0dce 100644 --- a/sai/modules/autoload.inc +++ b/sai/modules/autoload.inc @@ -3,6 +3,7 @@ SYSTEM\autoload::registerFolder(dirname(__FILE__),'SYSTEM\SAI'); //System Start Mod require_once dirname(__FILE__).'/saistart_sys_sai/autoload.inc'; //System Mod +require_once dirname(__FILE__).'/saimod_sys_analytics/autoload.inc'; require_once dirname(__FILE__).'/saimod_sys_log/autoload.inc'; //require_once dirname(__FILE__).'/saimod_sys_security/autoload.inc'; //require_once dirname(__FILE__).'/saimod_sys_mod/autoload.inc'; diff --git a/sai/modules/saimod_sys_analytics/autoload.inc b/sai/modules/saimod_sys_analytics/autoload.inc new file mode 100644 index 0000000..64d7256 --- /dev/null +++ b/sai/modules/saimod_sys_analytics/autoload.inc @@ -0,0 +1,5 @@ +SERVERPATH(), $vars); + } + + /** + * Get Log Analytics Data for class system + * + * @param int $filter Timeiterval in seconds to cluster upon + * @param string $db DB to operate on + * @return json Returns json with data + */ + public static function sai_mod__SYSTEM_SAI_saimod_sys_analytics_action_stats_name_class_system($filter,$db=null){ + $result = array(); + if(!$db){ + $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_CLASS_SYSTEM::QA(array($filter)); + } else { + $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); + $res = $con->prepare('class_system', + 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' + .'count(*) as count,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\COUNTER" then 1 else 0 end) class_SYSTEM_LOG_COUNTER,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\INFO" then 1 else 0 end) class_SYSTEM_LOG_INFO,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\DEPRECATED" then 1 else 0 end) class_SYSTEM_LOG_DEPRECATED,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\WARNING" then 1 else 0 end) class_SYSTEM_LOG_WARNING,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\ERROR" then 1 else 0 end) class_SYSTEM_LOG_ERROR,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\ERROR_EXCEPTION" then 1 else 0 end) class_SYSTEM_LOG_ERROR_EXCEPTION,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\SHUTDOWN_EXCEPTION" then 1 else 0 end) class_SYSTEM_LOG_SHUTDOWN_EXCEPTION' + .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS + .' GROUP BY day' + .' ORDER BY day DESC' + .' LIMIT 30;', + array(':filter' => $filter)); + while($row = $res->next()){ + $result[] = $row;} + } + return \SYSTEM\LOG\JsonResult::toString($result); + } + + /** + * Get Log Analytics Data for class other + * + * @param int $filter Timeiterval in seconds to cluster upon + * @param string $db DB to operate on + * @return json Returns json with data + */ + public static function sai_mod__SYSTEM_SAI_saimod_sys_analytics_action_stats_name_class_other($filter,$db=null){ + $result = array(); + if(!$db){ + $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_CLASS_OTHER::QA(array($filter)); + } else { + $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); + $res = $con->prepare('class_other', + 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' + .'count(*) as count,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'Exception\' then 1 else 0 end) class_Exception,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'RuntimeException\' then 1 else 0 end) class_RuntimeException,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'ErrorException\' then 1 else 0 end) class_ErrorException' + .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS + .' GROUP BY day' + .' ORDER BY day DESC' + .' LIMIT 30;', + array(':filter' => $filter)); + while($row = $res->next()){ + $result[] = $row;} + } + return \SYSTEM\LOG\JsonResult::toString($result); + } + + /** + * Get Log Analytics Data for class basic + * + * @param int $filter Timeiterval in seconds to cluster upon + * @param string $db DB to operate on + * @return json Returns json with data + */ + public static function sai_mod__SYSTEM_SAI_saimod_sys_analytics_action_stats_name_class_basic($filter,$db=null){ + $result = array(); + if(!$db){ + $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_CLASS_BASIC::QA(array($filter)); + } else { + $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); + $res = $con->prepare('class_basic', + 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' + .'count(*) as count,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'ERROR\' then 1 else 0 end) class_ERROR,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'WARNING\' then 1 else 0 end) class_WARNING,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'INFO\' then 1 else 0 end) class_INFO,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'DEPRECATED\' then 1 else 0 end) class_DEPRECATED,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'AppError\' then 1 else 0 end) class_AppError' + .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS + .' GROUP BY day' + .' ORDER BY day DESC' + .' LIMIT 30;', + array(':filter' => $filter)); + while($row = $res->next()){ + $result[] = $row;} + } + return \SYSTEM\LOG\JsonResult::toString($result); + } + + /** + * Get Log Analytics Data for unique basic + * + * @param int $filter Timeiterval in seconds to cluster upon + * @param string $db DB to operate on + * @return json Returns json with data + */ + public static function sai_mod__SYSTEM_SAI_saimod_sys_analytics_action_stats_name_unique_basic($filter,$db=null){ + $result = array(); + if(!$db){ + $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_UNIQUE_BASIC::QA(array($filter)); + } else { + $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); + $res = $con->prepare('unique_basic', + 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' + .'count(*) as count,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_USER.') as user_unique,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_IP.') as ip_unique,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_SERVER_NAME.') as server_name_unique' + .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS + .' GROUP BY day' + .' ORDER BY day DESC' + .' LIMIT 30;', + array(':filter' => $filter)); + while($row = $res->next()){ + $result[] = $row;} + } + return \SYSTEM\LOG\JsonResult::toString($result); + } + + /** + * Get Log Analytics Data for unique request + * + * @param int $filter Timeiterval in seconds to cluster upon + * @param string $db DB to operate on + * @return json Returns json with data + */ + public static function sai_mod__SYSTEM_SAI_saimod_sys_analytics_action_stats_name_unique_request($filter,$db=null){ + $result = array(); + if(!$db){ + $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_UNIQUE_REQUEST::QA(array($filter)); + } else { + $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); + $res = $con->prepare('unique_request', + 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' + .'count(*) as count,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_SERVER_NAME.') as server_name_unique,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_SERVER_PORT.') as server_port_unique,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_REQUEST_URI.') as request_uri_unique,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_POST.') as post_unique' + .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS + .' GROUP BY day' + .' ORDER BY day DESC' + .' LIMIT 30;', + array(':filter' => $filter)); + while($row = $res->next()){ + $result[] = $row;} + } + return \SYSTEM\LOG\JsonResult::toString($result); + } + + /** + * Get Log Analytics Data for unqiue exception + * + * @param int $filter Timeiterval in seconds to cluster upon + * @param string $db DB to operate on + * @return json Returns json with data + */ + public static function sai_mod__SYSTEM_SAI_saimod_sys_analytics_action_stats_name_unique_exception($filter,$db=null){ + $result = array(); + if(!$db){ + $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_UNIQUE_EXCEPTION::QA(array($filter)); + } else { + $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); + $res = $con->prepare('unique_exception', + 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' + .'count(*) as count,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_FILE.') as file_unique,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_LINE.') as line_unique,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_CLASS.') as class_unique' + .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS + .' GROUP BY day' + .' ORDER BY day DESC' + .' LIMIT 30;', + array(':filter' => $filter)); + while($row = $res->next()){ + $result[] = $row;} + } + return \SYSTEM\LOG\JsonResult::toString($result); + } + + /** + * Get Log Analytics Data for unique referer + * + * @param int $filter Timeiterval in seconds to cluster upon + * @param string $db DB to operate on + * @return json Returns json with data + */ + public static function sai_mod__SYSTEM_SAI_saimod_sys_analytics_action_stats_name_unique_referer($filter,$db=null){ + $result = array(); + if(!$db){ + $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_UNIQUE_REFERER::QA(array($filter)); + } else { + $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); + $res = $con->prepare('unique_referer', + 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' + .'count(*) as count,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_USER.') as user_unique,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_IP.') as ip_unique,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_HTTP_REFERER.') as http_referer_unique,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_HTTP_USER_AGENT.') as http_user_agent_unique' + .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS + .' GROUP BY day' + .' ORDER BY day DESC' + .' LIMIT 30;', + array(':filter' => $filter)); + while($row = $res->next()){ + $result[] = $row;} + } + return \SYSTEM\LOG\JsonResult::toString($result); + } + + /** + * Get Log Analytics Data for basic visitor + * + * @param int $filter Timeiterval in seconds to cluster upon + * @param string $db DB to operate on + * @return json Returns json with data + */ + public static function sai_mod__SYSTEM_SAI_saimod_sys_analytics_action_stats_name_basic_visitor($filter,$db=null){ + $result = array(); + if(!$db){ + $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_BASIC_VISITOR::QA(array($filter)); + } else { + $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); + $res = $con->prepare('basic_visitor', + 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' + .'count(*) as count,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_USER.') as user_unique,' + .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_IP.') as ip_unique' + .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS + .' GROUP BY day' + .' ORDER BY day DESC' + .' LIMIT 30;', + array(':filter' => $filter)); + while($row = $res->next()){ + $result[] = $row;} + } + return \SYSTEM\LOG\JsonResult::toString($result); + } + + /** + * Get Log Analytics Data for basic success + * + * @param int $filter Timeiterval in seconds to cluster upon + * @param string $db DB to operate on + * @return json Returns json with data + */ + public static function sai_mod__SYSTEM_SAI_saimod_sys_analytics_action_stats_name_basic_sucess($filter,$db=null){ + $result = array(); + if(!$db){ + $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_BASIC_SUCCESS::QA(array($filter)); + } else { + $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); + $res = $con->prepare('basic_sucess', + 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' + .'count(*) as count,' + .'sum(case when not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\COUNTER" and' + .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\INFO" and' + .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "INFO" and' + .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\DEPRECATED" and' + .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "DEPRECATED" and ' + .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\WARNING" and ' + .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "PreprocessingLog" ' + .'then 1 else 0 end) class_fail,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\COUNTER" or ' + .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\INFO" or ' + .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "INFO" or ' + .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\DEPRECATE" or ' + .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "DEPRECATED" or ' + .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\WARNING" or ' + .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "PreprocessingLog" ' + .'then 1 else 0 end) class_log,' + .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\COUNTER" then 1 else 0 end) class_sucess' + .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS + .' GROUP BY day' + .' ORDER BY day DESC' + .' LIMIT 30;', + array(':filter' => $filter)); + while($row = $res->next()){ + $result[] = $row;} + } + return \SYSTEM\LOG\JsonResult::toString($result);} + + /** + * Get Log Analytics Data for basic querytime + * + * @param int $filter Timeiterval in seconds to cluster upon + * @param string $db DB to operate on + * @return json Returns json with data + */ + public static function sai_mod__SYSTEM_SAI_saimod_sys_analytics_action_stats_name_basic_querytime($filter,$db=null){ + $result = array(); + if(!$db){ + $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_BASIC_QUERYTIME::QA(array($filter)); + } else { + $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); + $res = $con->prepare('basic_querytime', + 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' + .'count(*) as count,' + .'avg('.\SYSTEM\SQL\system_log::FIELD_QUERYTIME.') as querytime_avg,' + .'max('.\SYSTEM\SQL\system_log::FIELD_QUERYTIME.') as querytime_max,' + .'min('.\SYSTEM\SQL\system_log::FIELD_QUERYTIME.') as querytime_min' + .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS + .' GROUP BY day' + .' ORDER BY day DESC' + .' LIMIT 30;', + array(':filter' => $filter)); + while($row = $res->next()){ + $result[] = $row;} + } + return \SYSTEM\LOG\JsonResult::toString($result);} + + /** + * Generate the HTML for the Saimods startpage + * + * @return string Returns HTML for the Saimods startpage + */ + public static function sai_mod__SYSTEM_SAI_saimod_sys_analytics(){ + $vars = \SYSTEM\PAGE\text::tag(\SYSTEM\SQL\system_text::TAG_SAI_LOG); + $vars['dbfile_entries'] = ''; + if( \SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH) && + file_exists(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH))){ + $scanned_directory = array_diff(scandir(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH)), array('..', '.', 'undefined', '.gitignore')); + foreach($scanned_directory as $file){ + $vars['dbfile_entries'] .= \SYSTEM\PAGE\replace::replaceFile((new \SYSTEM\PSAI('modules/saimod_sys_analytics/tpl/saimod_sys_analytics_menu.tpl'))->SERVERPATH(), array('file' => $file));} + } + //positioning problem + //$vars['analytics'] = self::analytics(); + return \SYSTEM\PAGE\replace::replaceFile((new \SYSTEM\PSAI('modules/saimod_sys_analytics/tpl/saimod_sys_analytics.tpl'))->SERVERPATH(), $vars); + } + + /** + * Generate
  • Menu for the Saimod + * + * @return string Returns
  • Menu for the Saimod + */ + public static function menu(){ + return new sai_module_menu( 1, + sai_module_menu::POISITION_LEFT, + sai_module_menu::DIVIDER_NONE, + \SYSTEM\PAGE\replace::replaceFile((new \SYSTEM\PSAI('modules/saimod_sys_analytics/tpl/menu.tpl'))->SERVERPATH()));} + + /** + * Returns if the Saimod is public(access for everyone) + * + * @return boolean Returns if the Saimod is public(true) or not(false) + */ + public static function right_public(){return false;} + + /** + * Returns if the requesting user has the required rights to access the Saimod + * + * @return boolean Returns true if the user can access + */ + public static function right_right(){return \SYSTEM\SECURITY\security::check(\SYSTEM\SECURITY\RIGHTS::SYS_SAI);} + + /** + * Get all js System Paths required for this Saimod + * + * @return array Returns array of Pathobjects pointing to the saimods js + */ + public static function js(){ + return array(new \SYSTEM\PSAI('modules/saimod_sys_analytics/js/saimod_sys_analytics.js'));} +} \ No newline at end of file diff --git a/sai/modules/saimod_sys_analytics/tpl/menu.tpl b/sai/modules/saimod_sys_analytics/tpl/menu.tpl new file mode 100644 index 0000000..d32ed40 --- /dev/null +++ b/sai/modules/saimod_sys_analytics/tpl/menu.tpl @@ -0,0 +1,7 @@ +
  • \ No newline at end of file diff --git a/sai/modules/saimod_sys_analytics/tpl/saimod_sys_analytics.tpl b/sai/modules/saimod_sys_analytics/tpl/saimod_sys_analytics.tpl new file mode 100644 index 0000000..d7407e9 --- /dev/null +++ b/sai/modules/saimod_sys_analytics/tpl/saimod_sys_analytics.tpl @@ -0,0 +1,46 @@ +
    +
    +

       System Analytics

    +
    +
    + +
    +
    + + +
    +
    +
    \ No newline at end of file diff --git a/sai/modules/saimod_sys_log/tpl/saimod_sys_log_analytics.tpl b/sai/modules/saimod_sys_analytics/tpl/saimod_sys_analytics_analytics.tpl similarity index 100% rename from sai/modules/saimod_sys_log/tpl/saimod_sys_log_analytics.tpl rename to sai/modules/saimod_sys_analytics/tpl/saimod_sys_analytics_analytics.tpl diff --git a/sai/modules/saimod_sys_analytics/tpl/saimod_sys_analytics_menu.tpl b/sai/modules/saimod_sys_analytics/tpl/saimod_sys_analytics_menu.tpl new file mode 100644 index 0000000..49e6f14 --- /dev/null +++ b/sai/modules/saimod_sys_analytics/tpl/saimod_sys_analytics_menu.tpl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sai/modules/saimod_sys_log/tpl/saimod_sys_log_stats.tpl b/sai/modules/saimod_sys_analytics/tpl/saimod_sys_log_stats.tpl similarity index 100% rename from sai/modules/saimod_sys_log/tpl/saimod_sys_log_stats.tpl rename to sai/modules/saimod_sys_analytics/tpl/saimod_sys_log_stats.tpl diff --git a/sai/modules/saimod_sys_log/js/saimod_sys_log.js b/sai/modules/saimod_sys_log/js/saimod_sys_log.js index 8416ee0..07feade 100644 --- a/sai/modules/saimod_sys_log/js/saimod_sys_log.js +++ b/sai/modules/saimod_sys_log/js/saimod_sys_log.js @@ -1,4 +1,3 @@ -google.load("visualization", "1", {packages:["corechart"]}); function init_saimod_sys_log() { $("#sai_mod_log_table").tablesorter(); $('#tabs_log a').click(function (e) { @@ -20,85 +19,4 @@ function init_saimod_sys_log_log() { $(this).removeClass('active');}); $('#menu_loglist').parent().addClass('active'); register_search(); -} - -function init_saimod_sys_log_stats() { - $("#sai_mod_log_table").tablesorter(); - load_visualisation(); - $('#vis_filter_time').change(function(){ - load_visualisation();}) - $('#vis_filter_type').change(function(){ - load_visualisation();}) - $('#stats_tabs a').click(function (e) { - e.preventDefault(); - $(this).tab('show'); - load_visualisation(); - }); - $('#tabs_log li').each(function(){ - $(this).removeClass('active');}); - $('#menu_stats').parent().addClass('active'); -} -function load_visualisation(){ - $('img#loader').show(); - var name = $('#vis_filter_type').val();; - var filter = $('#vis_filter_time').val(); - var db = $('#stats_tabs li.active').attr('db'); - /*$.getJSON('./sai.php?sai_mod=.SYSTEM.SAI.saimod_sys_log&action=stats&name='+name+'&filter='+filter+'&db='+db,function(json){ - - });*/ - $.ajax({ - async: true, - url: this.endpoint, - type: 'GET', - dataType: 'JSON', - data: { - sai_mod: '.SYSTEM.SAI.saimod_sys_log', - action: 'stats', - name: name, - filter: filter, - db: db - }, - success: function(data){ - if(data.status){ - var json = data.result; - var gdata = new google.visualization.DataTable(); - first = true; - $.each(json[0], function(key, value){ - if(first){ - gdata.addColumn('datetime',key); - first = false; - } else { - gdata.addColumn('number',key); - } - }); - $.each(json, function(key, value){ - first = true; - gdata.addRow($.map(value, function(v) { - if(first){ - first=false; - return [new Date(v)]; - } else { - return [(v == null || parseFloat(v) <= 0) ? parseFloat(0) : parseFloat(v)]; - } - })); - }); - - var options = { title: name, - aggregationTarget: 'category', - selectionMode: 'multiple', - curveType: 'function', - /*focusTarget: 'category',*/ - chartArea: {left:100,top:40}, - vAxis: {logScale: true}, - interpolateNulls: false, - width: "1200", - height: "500"}; - new google.visualization.LineChart(document.getElementById('vis')).draw(gdata, options); - } - $('img#loader').hide(); - }, - error: function(){ - alert('Something happend - try again!'); - } - }); } \ No newline at end of file diff --git a/sai/modules/saimod_sys_log/saimod_sys_log.php b/sai/modules/saimod_sys_log/saimod_sys_log.php index a380f57..6c03589 100644 --- a/sai/modules/saimod_sys_log/saimod_sys_log.php +++ b/sai/modules/saimod_sys_log/saimod_sys_log.php @@ -24,368 +24,6 @@ class saimod_sys_log extends \SYSTEM\SAI\sai_module { \SYSTEM\SQL\SYS_SAIMOD_LOG_TRUNCATE::QQ(); return \SYSTEM\LOG\JsonResult::ok();} - /** - * Generates HTML for one Log Analytics Entry - * - * @return string Returns HTML - */ - public static function analytics(){ - $vars = array(); - $data = \SYSTEM\SQL\SYS_SAIMOD_LOG_ANALYTICS::Q1(array(86400)); - $vars['log_today'] = $data['count']; - $vars['ip_today'] = $data['ip_unique']; - $vars['user_today'] = $data['user_unique']; - $data = \SYSTEM\SQL\SYS_SAIMOD_LOG_ANALYTICS::Q1(array(604800)); - $vars['log_week'] = $data['count']; - $vars['ip_week'] = $data['ip_unique']; - $vars['user_week'] = $data['user_unique']; - $data = \SYSTEM\SQL\SYS_SAIMOD_LOG_ANALYTICS::Q1(array(2692000)); - $vars['log_month'] = $data['count']; - $vars['ip_month'] = $data['ip_unique']; - $vars['user_month'] = $data['user_unique']; - $vars['page_value'] = \round( $vars['log_today']+$vars['ip_today']*10+$vars['user_today']*100+ - ($vars['log_week']+$vars['ip_week']*10+$vars['user_week']*100)/7+ - ($vars['log_month']+$vars['ip_month']*10+$vars['user_week']*100)/31,0); - return \SYSTEM\PAGE\replace::replaceFile((new \SYSTEM\PSAI('modules/saimod_sys_log/tpl/saimod_sys_log_analytics.tpl'))->SERVERPATH(), $vars); - } - - /** - * Generates HTML for the Log Analytics - * - * @return string Returns HTML - */ - public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_stats(){ - $vars = \SYSTEM\PAGE\text::tag(\SYSTEM\SQL\system_text::TAG_SAI_LOG); - $vars['dbfile_entries'] = ''; - if( \SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH) && - file_exists(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH))){ - $scanned_directory = array_diff(scandir(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH)), array('..', '.')); - foreach($scanned_directory as $file){ - $vars['dbfile_entries'] .= \SYSTEM\PAGE\replace::replaceFile((new \SYSTEM\PSAI('modules/saimod_sys_log/tpl/saimod_sys_log_stats_menu.tpl'))->SERVERPATH(), array('file' => $file));} - } - //positioning problem - //$vars['analytics'] = self::analytics(); - return \SYSTEM\PAGE\replace::replaceFile((new \SYSTEM\PSAI('modules/saimod_sys_log/tpl/saimod_sys_log_stats.tpl'))->SERVERPATH(), $vars);} - - /** - * Get Log Analytics Data for class system - * - * @param int $filter Timeiterval in seconds to cluster upon - * @param string $db DB to operate on - * @return json Returns json with data - */ - public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_stats_name_class_system($filter,$db=null){ - $result = array(); - if(!$db){ - $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_CLASS_SYSTEM::QA(array($filter)); - } else { - $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); - $res = $con->prepare('class_system', - 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' - .'count(*) as count,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\COUNTER" then 1 else 0 end) class_SYSTEM_LOG_COUNTER,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\INFO" then 1 else 0 end) class_SYSTEM_LOG_INFO,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\DEPRECATED" then 1 else 0 end) class_SYSTEM_LOG_DEPRECATED,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\WARNING" then 1 else 0 end) class_SYSTEM_LOG_WARNING,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\ERROR" then 1 else 0 end) class_SYSTEM_LOG_ERROR,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\ERROR_EXCEPTION" then 1 else 0 end) class_SYSTEM_LOG_ERROR_EXCEPTION,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\SHUTDOWN_EXCEPTION" then 1 else 0 end) class_SYSTEM_LOG_SHUTDOWN_EXCEPTION' - .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS - .' GROUP BY day' - .' ORDER BY day DESC' - .' LIMIT 30;', - array(':filter' => $filter)); - while($row = $res->next()){ - $result[] = $row;} - } - return \SYSTEM\LOG\JsonResult::toString($result); - } - - /** - * Get Log Analytics Data for class other - * - * @param int $filter Timeiterval in seconds to cluster upon - * @param string $db DB to operate on - * @return json Returns json with data - */ - public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_stats_name_class_other($filter,$db=null){ - $result = array(); - if(!$db){ - $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_CLASS_OTHER::QA(array($filter)); - } else { - $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); - $res = $con->prepare('class_other', - 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' - .'count(*) as count,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'Exception\' then 1 else 0 end) class_Exception,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'RuntimeException\' then 1 else 0 end) class_RuntimeException,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'ErrorException\' then 1 else 0 end) class_ErrorException' - .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS - .' GROUP BY day' - .' ORDER BY day DESC' - .' LIMIT 30;', - array(':filter' => $filter)); - while($row = $res->next()){ - $result[] = $row;} - } - return \SYSTEM\LOG\JsonResult::toString($result); - } - - /** - * Get Log Analytics Data for class basic - * - * @param int $filter Timeiterval in seconds to cluster upon - * @param string $db DB to operate on - * @return json Returns json with data - */ - public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_stats_name_class_basic($filter,$db=null){ - $result = array(); - if(!$db){ - $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_CLASS_BASIC::QA(array($filter)); - } else { - $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); - $res = $con->prepare('class_basic', - 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' - .'count(*) as count,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'ERROR\' then 1 else 0 end) class_ERROR,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'WARNING\' then 1 else 0 end) class_WARNING,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'INFO\' then 1 else 0 end) class_INFO,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'DEPRECATED\' then 1 else 0 end) class_DEPRECATED,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = \'AppError\' then 1 else 0 end) class_AppError' - .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS - .' GROUP BY day' - .' ORDER BY day DESC' - .' LIMIT 30;', - array(':filter' => $filter)); - while($row = $res->next()){ - $result[] = $row;} - } - return \SYSTEM\LOG\JsonResult::toString($result); - } - - /** - * Get Log Analytics Data for unique basic - * - * @param int $filter Timeiterval in seconds to cluster upon - * @param string $db DB to operate on - * @return json Returns json with data - */ - public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_stats_name_unique_basic($filter,$db=null){ - $result = array(); - if(!$db){ - $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_UNIQUE_BASIC::QA(array($filter)); - } else { - $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); - $res = $con->prepare('unique_basic', - 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' - .'count(*) as count,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_USER.') as user_unique,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_IP.') as ip_unique,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_SERVER_NAME.') as server_name_unique' - .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS - .' GROUP BY day' - .' ORDER BY day DESC' - .' LIMIT 30;', - array(':filter' => $filter)); - while($row = $res->next()){ - $result[] = $row;} - } - return \SYSTEM\LOG\JsonResult::toString($result); - } - - /** - * Get Log Analytics Data for unique request - * - * @param int $filter Timeiterval in seconds to cluster upon - * @param string $db DB to operate on - * @return json Returns json with data - */ - public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_stats_name_unique_request($filter,$db=null){ - $result = array(); - if(!$db){ - $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_UNIQUE_REQUEST::QA(array($filter)); - } else { - $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); - $res = $con->prepare('unique_request', - 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' - .'count(*) as count,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_SERVER_NAME.') as server_name_unique,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_SERVER_PORT.') as server_port_unique,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_REQUEST_URI.') as request_uri_unique,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_POST.') as post_unique' - .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS - .' GROUP BY day' - .' ORDER BY day DESC' - .' LIMIT 30;', - array(':filter' => $filter)); - while($row = $res->next()){ - $result[] = $row;} - } - return \SYSTEM\LOG\JsonResult::toString($result); - } - - /** - * Get Log Analytics Data for unqiue exception - * - * @param int $filter Timeiterval in seconds to cluster upon - * @param string $db DB to operate on - * @return json Returns json with data - */ - public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_stats_name_unique_exception($filter,$db=null){ - $result = array(); - if(!$db){ - $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_UNIQUE_EXCEPTION::QA(array($filter)); - } else { - $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); - $res = $con->prepare('unique_exception', - 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' - .'count(*) as count,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_FILE.') as file_unique,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_LINE.') as line_unique,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_CLASS.') as class_unique' - .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS - .' GROUP BY day' - .' ORDER BY day DESC' - .' LIMIT 30;', - array(':filter' => $filter)); - while($row = $res->next()){ - $result[] = $row;} - } - return \SYSTEM\LOG\JsonResult::toString($result); - } - - /** - * Get Log Analytics Data for unique referer - * - * @param int $filter Timeiterval in seconds to cluster upon - * @param string $db DB to operate on - * @return json Returns json with data - */ - public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_stats_name_unique_referer($filter,$db=null){ - $result = array(); - if(!$db){ - $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_UNIQUE_REFERER::QA(array($filter)); - } else { - $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); - $res = $con->prepare('unique_referer', - 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' - .'count(*) as count,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_USER.') as user_unique,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_IP.') as ip_unique,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_HTTP_REFERER.') as http_referer_unique,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_HTTP_USER_AGENT.') as http_user_agent_unique' - .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS - .' GROUP BY day' - .' ORDER BY day DESC' - .' LIMIT 30;', - array(':filter' => $filter)); - while($row = $res->next()){ - $result[] = $row;} - } - return \SYSTEM\LOG\JsonResult::toString($result); - } - - /** - * Get Log Analytics Data for basic visitor - * - * @param int $filter Timeiterval in seconds to cluster upon - * @param string $db DB to operate on - * @return json Returns json with data - */ - public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_stats_name_basic_visitor($filter,$db=null){ - $result = array(); - if(!$db){ - $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_BASIC_VISITOR::QA(array($filter)); - } else { - $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); - $res = $con->prepare('basic_visitor', - 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' - .'count(*) as count,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_USER.') as user_unique,' - .'count(distinct '.\SYSTEM\SQL\system_log::FIELD_IP.') as ip_unique' - .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS - .' GROUP BY day' - .' ORDER BY day DESC' - .' LIMIT 30;', - array(':filter' => $filter)); - while($row = $res->next()){ - $result[] = $row;} - } - return \SYSTEM\LOG\JsonResult::toString($result); - } - - /** - * Get Log Analytics Data for basic success - * - * @param int $filter Timeiterval in seconds to cluster upon - * @param string $db DB to operate on - * @return json Returns json with data - */ - public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_stats_name_basic_sucess($filter,$db=null){ - $result = array(); - if(!$db){ - $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_BASIC_SUCCESS::QA(array($filter)); - } else { - $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); - $res = $con->prepare('basic_sucess', - 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' - .'count(*) as count,' - .'sum(case when not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\COUNTER" and' - .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\INFO" and' - .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "INFO" and' - .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\DEPRECATED" and' - .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "DEPRECATED" and ' - .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\WARNING" and ' - .' not '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "PreprocessingLog" ' - .'then 1 else 0 end) class_fail,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\COUNTER" or ' - .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\INFO" or ' - .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "INFO" or ' - .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\DEPRECATE" or ' - .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "DEPRECATED" or ' - .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\WARNING" or ' - .\SYSTEM\SQL\system_log::FIELD_CLASS.' = "PreprocessingLog" ' - .'then 1 else 0 end) class_log,' - .'sum(case when '.\SYSTEM\SQL\system_log::FIELD_CLASS.' = "SYSTEM\\LOG\\COUNTER" then 1 else 0 end) class_sucess' - .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS - .' GROUP BY day' - .' ORDER BY day DESC' - .' LIMIT 30;', - array(':filter' => $filter)); - while($row = $res->next()){ - $result[] = $row;} - } - return \SYSTEM\LOG\JsonResult::toString($result);} - - /** - * Get Log Analytics Data for basic querytime - * - * @param int $filter Timeiterval in seconds to cluster upon - * @param string $db DB to operate on - * @return json Returns json with data - */ - public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_stats_name_basic_querytime($filter,$db=null){ - $result = array(); - if(!$db){ - $result = \SYSTEM\SQL\SYS_SAIMOD_LOG_BASIC_QUERYTIME::QA(array($filter)); - } else { - $con = new \SYSTEM\DB\Connection(new \SYSTEM\DB\DBInfoSQLite(\SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CRON_LOG2SQLITE_PATH).$db)); - $res = $con->prepare('basic_querytime', - 'SELECT datetime(strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.') - strftime("%s",'.\SYSTEM\SQL\system_log::FIELD_TIME.')%:filter,"unixepoch", "localtime") as day,' - .'count(*) as count,' - .'avg('.\SYSTEM\SQL\system_log::FIELD_QUERYTIME.') as querytime_avg,' - .'max('.\SYSTEM\SQL\system_log::FIELD_QUERYTIME.') as querytime_max,' - .'min('.\SYSTEM\SQL\system_log::FIELD_QUERYTIME.') as querytime_min' - .' FROM '.\SYSTEM\SQL\system_log::NAME_MYS - .' GROUP BY day' - .' ORDER BY day DESC' - .' LIMIT 30;', - array(':filter' => $filter)); - while($row = $res->next()){ - $result[] = $row;} - } - return \SYSTEM\LOG\JsonResult::toString($result);} - /** * Generates HTML for a Log Entry * @@ -403,7 +41,7 @@ class saimod_sys_log extends \SYSTEM\SAI\sai_module { * * @param string $filter Classfilter * @param string $search SearchFilter - * @param int $page Page of the List(100 are displayed) + * @param int $page Page of the List(50 are displayed) * @return string Returns HTML */ public static function sai_mod__SYSTEM_SAI_saimod_sys_log_action_filter($filter = "%",$search="%",$page=0){ @@ -416,8 +54,8 @@ class saimod_sys_log extends \SYSTEM\SAI\sai_module { $res = \SYSTEM\SQL\SYS_SAIMOD_LOG_FILTER::QQ(array(str_replace('\\', '\\\\', $filter),$search,$search,$search,$search)); $vars['table'] = ''; $count_filtered = 0; - $res->seek(100*$page); - while(($r = $res->next()) && ($count_filtered < 100)){ + $res->seek(50*$page); + while(($r = $res->next()) && ($count_filtered < 50)){ $r['class_row'] = self::tablerow_class($r['class']); $r['time'] = \SYSTEM\time::time_ago_string(strtotime($r['time'])); $r['message'] = htmlspecialchars(substr($r['message'],0,255)); @@ -426,9 +64,9 @@ class saimod_sys_log extends \SYSTEM\SAI\sai_module { $count_filtered++; } $vars['pagination'] = ''; - $vars['page_last'] = floor($count/100); + $vars['page_last'] = floor($count/50); $dots = false; - for($i=0;$i < ceil($count/100);$i++){ + for($i=0;$i < ceil($count/50);$i++){ if(abs($page-$i) < 7){ $data = array('page' => $i,'search' => $vars['search_encoded'], 'filter' => $filter, 'active' => ($i == $page) ? 'active' : ''); $vars['pagination'] .= \SYSTEM\PAGE\replace::replaceFile((new \SYSTEM\PSAI('modules/saimod_sys_log/tpl/saimod_sys_log_pagination.tpl'))->SERVERPATH(), $data); @@ -441,11 +79,6 @@ class saimod_sys_log extends \SYSTEM\SAI\sai_module { } } $vars['count'] = $count_filtered.'/'.$count; - $vars['error_filter'] = ''; - $res = \SYSTEM\SQL\SYS_SAIMOD_LOG_FILTERS::QQ(); - while($row = $res->next()){ - $data = array('active' => ($filter == $row['class'] ? 'active' : ''), 'filter' => $row['class'], 'search_encoded' => $vars['search_encoded']); - $vars['error_filter'] .= \SYSTEM\PAGE\replace::replaceFile((new \SYSTEM\PSAI('modules/saimod_sys_log/tpl/saimod_sys_log_error_filter.tpl'))->SERVERPATH(),$data);} $vars['active'] = ($filter == '%' ? 'active' : ''); $vars = array_merge($vars, \SYSTEM\PAGE\text::tag(\SYSTEM\SQL\system_text::TAG_SAI_LOG)); return \SYSTEM\PAGE\replace::replaceFile((new \SYSTEM\PSAI('modules/saimod_sys_log/tpl/saimod_sys_log_filter.tpl'))->SERVERPATH(),$vars); @@ -458,6 +91,11 @@ class saimod_sys_log extends \SYSTEM\SAI\sai_module { */ public static function sai_mod__SYSTEM_SAI_saimod_sys_log(){ $vars = \SYSTEM\PAGE\text::tag(\SYSTEM\SQL\system_text::TAG_SAI_LOG); + $vars['error_filter'] = ''; + $res = \SYSTEM\SQL\SYS_SAIMOD_LOG_FILTERS::QQ(); + while($row = $res->next()){ + $data = array('filter' => $row['class']); + $vars['error_filter'] .= \SYSTEM\PAGE\replace::replaceFile((new \SYSTEM\PSAI('modules/saimod_sys_log/tpl/saimod_sys_log_error_filter.tpl'))->SERVERPATH(),$data);} return \SYSTEM\PAGE\replace::replaceFile((new \SYSTEM\PSAI('modules/saimod_sys_log/tpl/saimod_sys_log.tpl'))->SERVERPATH(), $vars); } @@ -470,16 +108,13 @@ class saimod_sys_log extends \SYSTEM\SAI\sai_module { public static function tablerow_class($class){ switch($class){ case 'SYSTEM\LOG\INFO': case 'INFO': case 'SYSTEM\LOG\COUNTER': - return 'success'; + return 'table-success'; case 'SYSTEM\LOG\DEPRECATED': case 'DEPRECATED': - return 'info'; - //case 'SYSTEM\LOG\ERROR': case 'ERROR': case 'Exception': case 'SYSTEM\LOG\ERROR_EXCEPTION': - //case 'ErrorException': case 'SYSTEM\LOG\SHUTDOWN_EXCEPTION': - // return 'danger'; + return 'table-info'; case 'SYSTEM\LOG\WARNING': case 'WARNING': case 'SYSTEM\LOG\TODO': case 'TODO': - return 'warning'; + return 'table-warning'; default: - return 'danger'; + return 'table-danger'; } } diff --git a/sai/modules/saimod_sys_log/tpl/menu.tpl b/sai/modules/saimod_sys_log/tpl/menu.tpl index 2ac9a9f..a1050c1 100644 --- a/sai/modules/saimod_sys_log/tpl/menu.tpl +++ b/sai/modules/saimod_sys_log/tpl/menu.tpl @@ -1,5 +1,6 @@ \ No newline at end of file + \ No newline at end of file diff --git a/sai/modules/saimod_sys_log/tpl/saimod_sys_log_filter.tpl b/sai/modules/saimod_sys_log/tpl/saimod_sys_log_filter.tpl index 95e5f9c..5ecfd42 100644 --- a/sai/modules/saimod_sys_log/tpl/saimod_sys_log_filter.tpl +++ b/sai/modules/saimod_sys_log/tpl/saimod_sys_log_filter.tpl @@ -1,28 +1,33 @@ - -
    -
    ${basic_rows}: ${count} ${basic_page}: ${page}
    - - - - - - - - - - - - - ${table} +
    +
    ${time_ago}${table_class}${table_message}${table_file}${table_line}${table_ip}${table_url}${table_user}${table_querytime}
    + + + + + + + + + + + + + + + + + + ${table} +
    ${time_ago}${table_class}${table_message}${table_file}${table_line}${table_ip}${table_url}${table_user}${table_querytime}
    + ${basic_rows}: ${count} ${basic_page}: ${page} + + + +
    -
      -
    • «
    • - ${pagination} -
    • »
    • -
    -
    \ No newline at end of file + + \ No newline at end of file diff --git a/sai/modules/saimod_sys_log/tpl/saimod_sys_log_stats_menu.tpl b/sai/modules/saimod_sys_log/tpl/saimod_sys_log_stats_menu.tpl deleted file mode 100644 index 94db1f4..0000000 --- a/sai/modules/saimod_sys_log/tpl/saimod_sys_log_stats_menu.tpl +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/sai/modules/saimod_sys_text/js/saimod_sys_text.js b/sai/modules/saimod_sys_text/js/saimod_sys_text.js index 7891ac1..5c9632e 100644 --- a/sai/modules/saimod_sys_text/js/saimod_sys_text.js +++ b/sai/modules/saimod_sys_text/js/saimod_sys_text.js @@ -1,9 +1,9 @@ function init_saimod_sys_text() { $("#sai_mod_text_table").tablesorter(); $('#tabs_text a').click(function (e) { - $('#tabs_text li').each(function(){ + $('#tabs_text a').each(function(){ $(this).removeClass('active');}); - $(this).parent().addClass('active'); + $(this).addClass('active'); }); text_menu(); diff --git a/sai/modules/saimod_sys_text/tpl/menu.tpl b/sai/modules/saimod_sys_text/tpl/menu.tpl index 9447700..c7f9b20 100644 --- a/sai/modules/saimod_sys_text/tpl/menu.tpl +++ b/sai/modules/saimod_sys_text/tpl/menu.tpl @@ -1,5 +1,6 @@