1f125bc8dSSascha Leib<?php 2f125bc8dSSascha Leib 3f125bc8dSSascha Leibuse dokuwiki\Extension\AdminPlugin; 4f125bc8dSSascha Leib 5f125bc8dSSascha Leib/** 67bd08c30SSascha Leib * Bot Monitoring Plugin 7f125bc8dSSascha Leib* 8f125bc8dSSascha Leib* @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 9f125bc8dSSascha Leib* @author Sascha Leib <ad@hominem.info> 10f125bc8dSSascha Leib*/ 11f125bc8dSSascha Leib 12f125bc8dSSascha Leib/** 13f125bc8dSSascha Leib * All DokuWiki plugins to extend the admin function 14f125bc8dSSascha Leib * need to inherit from this class 15f125bc8dSSascha Leib**/ 167bd08c30SSascha Leibclass admin_plugin_botmon extends AdminPlugin { 17f125bc8dSSascha Leib 18f125bc8dSSascha Leib /** 19f125bc8dSSascha Leib * Return the path to the icon being displayed in the main admin menu. 20f125bc8dSSascha Leib * 21f125bc8dSSascha Leib * @return string full path to the icon file 22f125bc8dSSascha Leib **/ 23f125bc8dSSascha Leib public function getMenuIcon() { 24f125bc8dSSascha Leib $plugin = $this->getPluginName(); 25f125bc8dSSascha Leib return DOKU_PLUGIN . $plugin . '/img/admin.svg'; 26f125bc8dSSascha Leib } 27f125bc8dSSascha Leib 28f125bc8dSSascha Leib /** 29f125bc8dSSascha Leib * output appropriate html 30f125bc8dSSascha Leib */ 31f125bc8dSSascha Leib public function html() { 32f125bc8dSSascha Leib 33ade4db36SSascha Leib global $conf; 34ade4db36SSascha Leib 3512c103d8SSascha Leib // display GeoIP data? 3612c103d8SSascha Leib $geoIPconf = $this->getConf('geoiplib'); 37eba0eb77SSascha Leib $useCaptchaConf = ($this->getConf('useCaptcha') !== 'disabled'); 3812c103d8SSascha Leib 390edf1a56SSascha Leib $hasOldLogFiles = $this->hasOldLogFiles(); 400edf1a56SSascha Leib 41b148c85eSSascha Leib // spinner animation as SVG image: 42b148c85eSSascha Leib $svg = '<svg width="12" height="12" viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg" id="botmon__today__busy"><defs><linearGradient id="gradient" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#666"></stop><stop offset="100%" stop-color="#666"></stop></linearGradient></defs><circle cx="25" cy="25" r="20" fill="none" stroke="url(#gradient)" stroke-width="8" stroke-dasharray="31.4 31.4"><animateTransform attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur="1s" repeatCount="indefinite"></animateTransform></circle></svg>'; 43b148c85eSSascha Leib 44ade4db36SSascha Leib $pluginPath = $conf['basedir'] . 'lib/plugins/' . $this->getPluginName(); 45f125bc8dSSascha Leib 46f125bc8dSSascha Leib /* Plugin Headline */ 476b6cd387SSascha Leib echo NL . '<div id="botmon__admin"> 480c039615SSascha Leib <h1>Bot Monitoring Plugin</h1> 490c039615SSascha Leib <nav id="botmon__tabs"> 500c039615SSascha Leib <ul class="tabs" role="tablist"> 51e2bc8f6fSSascha Leib <li role="presentation"><a role="tab" href="#botmon__latest" aria-controls="botmon__latest" id="botmon__tab1" aria-selected="true">Latest</a></li> 52e2bc8f6fSSascha Leib <li role="presentation"><a role="tab" href="#botmon__log" aria-controls="botmon__log" id="botmon__tab3" aria-selected="false">Log</a></li> 530c039615SSascha Leib </ul> 540edf1a56SSascha Leib </nav> 550edf1a56SSascha Leib <article role="tabpanel" id="botmon__latest"> 56*fb281ca1SSascha Leib <script> 57*fb281ca1SSascha Leib const BMSettings = { 58*fb281ca1SSascha Leib showday: ' . json_encode($this->getConf('showday')) . ', 59*fb281ca1SSascha Leib combineNets: ' . json_encode($this->getConf('combineNets')) . ', 60*fb281ca1SSascha Leib useCaptcha: ' . json_encode($this->getConf('useCaptcha') !== 'disabled') . ' 61*fb281ca1SSascha Leib }; 62*fb281ca1SSascha Leib </script> 63c31fb4d0SSascha Leib <h2 class="a11y">Latest data</h2> 640c039615SSascha Leib <header id="botmon__today__title">Loading …</header> 650c039615SSascha Leib <div id="botmon__today__content"> 660c039615SSascha Leib <details id="botmon__today__overview" open> 67eba0eb77SSascha Leib <summary>Bots overview</summary> 6812c103d8SSascha Leib <div class="botmon_bots_grid" data-geoip="' . $geoIPconf . '"> 690c039615SSascha Leib <dl id="botmon__today__botsvshumans"></dl> 700c039615SSascha Leib <dl id="botmon__botslist"></dl> 71e56d7b71SSascha Leib <dl id="botmon__botips"></dl> 7212c103d8SSascha Leib <dl id="botmon__botcountries"></dl> 730c039615SSascha Leib </div> 740c039615SSascha Leib </details> 750c039615SSascha Leib <details id="botmon__today__webmetrics"> 76b8245a63SSascha Leib <summary>Humans overview</summary> 7712c103d8SSascha Leib <div class="botmon_webmetrics_grid" data-geoip="' . $geoIPconf . '"> 780c039615SSascha Leib <dl id="botmon__today__wm_overview"></dl> 79b1aa993aSSascha Leib <dl id="botmon__today__wm_clients"></dl> 80b1aa993aSSascha Leib <dl id="botmon__today__wm_platforms"></dl> 8112c103d8SSascha Leib <dl id="botmon__today__wm_countries"></dl> 82c31fb4d0SSascha Leib </div> 83c31fb4d0SSascha Leib </details> 84c31fb4d0SSascha Leib <details id="botmon__today__traffic"> 85c31fb4d0SSascha Leib <summary>Web traffic (humans only)</summary> 86c31fb4d0SSascha Leib <div class="botmon_traffic_grid"> 87c31fb4d0SSascha Leib <dl id="botmon__today__wm_pages"></dl> 887d05fe3bSSascha Leib <dl id="botmon__today__wm_referers"></dl> 890c039615SSascha Leib </div> 90eba0eb77SSascha Leib </details>' . NL; 91eba0eb77SSascha Leib if ($useCaptchaConf) { 92eba0eb77SSascha Leib echo ' <details id="botmon__today__captcha"> 93eba0eb77SSascha Leib <summary>Captcha statistics</summary> 94eba0eb77SSascha Leib <div class="botmon_captcha_grid"> 95eba0eb77SSascha Leib <dl id="botmon__today__cp_humans"></dl> 96eba0eb77SSascha Leib <dl id="botmon__today__cp_sus"></dl> 97eba0eb77SSascha Leib <dl id="botmon__today__cp_bots"></dl> 98eba0eb77SSascha Leib </div> 99eba0eb77SSascha Leib </details>' . NL; 100eba0eb77SSascha Leib } 101eba0eb77SSascha Leib echo ' <details id="botmon__today__visitors"> 1020c039615SSascha Leib <summary>Visitor logs</summary> 1030c039615SSascha Leib <div id="botmon__today__visitorlists"></div> 1040c039615SSascha Leib </details> 1050c039615SSascha Leib </div> 1060c039615SSascha Leib <footer aria-live="polite"> 107b148c85eSSascha Leib <span>' . $svg . '</span> 1080c039615SSascha Leib <span id="botmon__today__status">Initialising …</span> 1090c039615SSascha Leib </footer> 1100c039615SSascha Leib </article> 111e2bc8f6fSSascha Leib <article role="tabpanel" id="botmon__log" hidden> 112e2bc8f6fSSascha Leib <h2 class="a11y">Process log</h2> 1136b6cd387SSascha Leib <ul id="botmon__loglist">' . NL; 1140edf1a56SSascha Leib 1150edf1a56SSascha Leib /* proces old logs */ 1160edf1a56SSascha Leib if ($hasOldLogFiles) { 1170edf1a56SSascha Leib 1180edf1a56SSascha Leib $helper = $this->loadHelper('botmon', true); 1190edf1a56SSascha Leib 1200edf1a56SSascha Leib $helper->cleanup(); 1210edf1a56SSascha Leib } else { 1226b6cd387SSascha Leib echo DOKU_TAB . DOKU_TAB . DOKU_TAB . '<li>No files to process.</li>' . NL; 1230edf1a56SSascha Leib } 1240edf1a56SSascha Leib 1256b6cd387SSascha Leib echo DOKU_TAB . DOKU_TAB . '</ul>' . NL . DOKU_TAB . '</article>' . NL; 126620d9253SSascha Leib echo '</div><!-- End of BotMon Admin Tool -->'; 127ade4db36SSascha Leib 1280c039615SSascha Leib } 129f125bc8dSSascha Leib 1300c039615SSascha Leib /** 1310edf1a56SSascha Leib * Check if there are old log files to be handled 1320c039615SSascha Leib * 1330c039615SSascha Leib * @return bool true if there are old log files, false otherwise 1340c039615SSascha Leib */ 1350c039615SSascha Leib private function hasOldLogFiles() { 1360c039615SSascha Leib 1370c039615SSascha Leib $today = gmdate('Y-m-d'); 1380c039615SSascha Leib $yesterday = gmdate('Y-m-d', time() - 86400); 1390c039615SSascha Leib 1400c039615SSascha Leib // scan the log directory and delete all files except for today and yesterday: 1410c039615SSascha Leib $dir = scandir(getcwd() . '/lib/plugins/botmon/logs'); 1420c039615SSascha Leib foreach($dir as $file) { 1430c039615SSascha Leib $fName = pathinfo($file, PATHINFO_BASENAME); 1440c039615SSascha Leib $bName = strtok($fName, '.'); 1450c039615SSascha Leib 146ef5d3610SSascha Leib if ($bName == '' || $bName == 'logfiles' || $bName == 'empty' || $fName == '.htaccess') { 1470c039615SSascha Leib // ignore 1480c039615SSascha Leib } else if ($bName == $today || $bName == $yesterday) { 1490c039615SSascha Leib // skip 1500c039615SSascha Leib } else { 1510c039615SSascha Leib return true; 1520c039615SSascha Leib } 1530c039615SSascha Leib } 1540c039615SSascha Leib return false; 155f125bc8dSSascha Leib } 156f125bc8dSSascha Leib}