xref: /plugin/botmon/admin.php (revision e2bc8f6fea7db332abd29354d4a02c78785f0349)
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');
3712c103d8SSascha Leib
380edf1a56SSascha Leib		$hasOldLogFiles = $this->hasOldLogFiles();
390edf1a56SSascha Leib
40b148c85eSSascha Leib		// spinner animation as SVG image:
41b148c85eSSascha 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>';
42b148c85eSSascha Leib
43ade4db36SSascha Leib		$pluginPath = $conf['basedir'] . 'lib/plugins/' . $this->getPluginName();
44f125bc8dSSascha Leib
45f125bc8dSSascha Leib		/* Plugin Headline */
460c039615SSascha Leib		echo '<div id="botmon__admin">
470c039615SSascha Leib	<h1>Bot Monitoring Plugin</h1>
480c039615SSascha Leib	<nav id="botmon__tabs">
490c039615SSascha Leib		<ul class="tabs" role="tablist">
50*e2bc8f6fSSascha Leib			<li role="presentation"><a role="tab" href="#botmon__latest" aria-controls="botmon__latest" id="botmon__tab1" aria-selected="true">Latest</a></li>
51*e2bc8f6fSSascha Leib			<li role="presentation"><a role="tab" href="#botmon__log" aria-controls="botmon__log" id="botmon__tab3" aria-selected="false">Log</a></li>
520c039615SSascha Leib		</ul>
530edf1a56SSascha Leib	</nav>
540edf1a56SSascha Leib	<article role="tabpanel" id="botmon__latest">
55c31fb4d0SSascha Leib		<h2 class="a11y">Latest data</h2>
560c039615SSascha Leib		<header id="botmon__today__title">Loading&nbsp;&hellip;</header>
570c039615SSascha Leib		<div id="botmon__today__content">
580c039615SSascha Leib			<details id="botmon__today__overview" open>
59e56d7b71SSascha Leib				<summary>Overview</summary>
6012c103d8SSascha Leib				<div class="botmon_bots_grid" data-geoip="' . $geoIPconf  . '">
610c039615SSascha Leib					<dl id="botmon__today__botsvshumans"></dl>
620c039615SSascha Leib					<dl id="botmon__botslist"></dl>
63e56d7b71SSascha Leib					<dl id="botmon__botips"></dl>
6412c103d8SSascha Leib					<dl id="botmon__botcountries"></dl>
650c039615SSascha Leib				</div>
660c039615SSascha Leib			</details>
670c039615SSascha Leib			<details id="botmon__today__webmetrics">
68b8245a63SSascha Leib				<summary>Humans overview</summary>
6912c103d8SSascha Leib				<div class="botmon_webmetrics_grid" data-geoip="' . $geoIPconf  . '">
700c039615SSascha Leib					<dl id="botmon__today__wm_overview"></dl>
71b1aa993aSSascha Leib					<dl id="botmon__today__wm_clients"></dl>
72b1aa993aSSascha Leib					<dl id="botmon__today__wm_platforms"></dl>
7312c103d8SSascha Leib					<dl id="botmon__today__wm_countries"></dl>
74c31fb4d0SSascha Leib				</div>
75c31fb4d0SSascha Leib			</details>
76c31fb4d0SSascha Leib			<details id="botmon__today__traffic">
77c31fb4d0SSascha Leib				<summary>Web traffic (humans only)</summary>
78c31fb4d0SSascha Leib				<div class="botmon_traffic_grid">
79c31fb4d0SSascha Leib					<dl id="botmon__today__wm_pages"></dl>
807d05fe3bSSascha Leib					<dl id="botmon__today__wm_referers"></dl>
810c039615SSascha Leib				</div>
820c039615SSascha Leib			</details>
830c039615SSascha Leib			<details id="botmon__today__visitors">
840c039615SSascha Leib				<summary>Visitor logs</summary>
850c039615SSascha Leib				<div id="botmon__today__visitorlists"></div>
860c039615SSascha Leib			</details>
870c039615SSascha Leib		</div>
880c039615SSascha Leib		<footer aria-live="polite">
89b148c85eSSascha Leib			<span>' . $svg . '</span>
900c039615SSascha Leib			<span id="botmon__today__status">Initialising&nbsp;&hellip;</span>
910c039615SSascha Leib		</footer>
920c039615SSascha Leib	</article>
93*e2bc8f6fSSascha Leib	<article role="tabpanel" id="botmon__log" hidden>
94*e2bc8f6fSSascha Leib		<h2 class="a11y">Process log</h2>
950edf1a56SSascha Leib		<ul id="botmon__loglist">';
960edf1a56SSascha Leib
970edf1a56SSascha Leib		/* proces old logs */
980edf1a56SSascha Leib		if ($hasOldLogFiles) {
990edf1a56SSascha Leib
1000edf1a56SSascha Leib			$helper = $this->loadHelper('botmon', true);
1010edf1a56SSascha Leib
1020edf1a56SSascha Leib			$helper->cleanup();
1030edf1a56SSascha Leib		} else {
1040edf1a56SSascha Leib			echo '<li>No files to process.</li>';
1050edf1a56SSascha Leib		}
1060edf1a56SSascha Leib
1070edf1a56SSascha Leib		echo '</article></div><!-- End of BotMon Admin Tool -->';
108ade4db36SSascha Leib
1090c039615SSascha Leib	}
110f125bc8dSSascha Leib
1110c039615SSascha Leib	/**
1120edf1a56SSascha Leib	 * Check if there are old log files to be handled
1130c039615SSascha Leib	 *
1140c039615SSascha Leib	 * @return bool true if there are old log files, false otherwise
1150c039615SSascha Leib	 */
1160c039615SSascha Leib	private function hasOldLogFiles() {
1170c039615SSascha Leib
1180c039615SSascha Leib		$today = gmdate('Y-m-d');
1190c039615SSascha Leib		$yesterday = gmdate('Y-m-d', time() - 86400);
1200c039615SSascha Leib
1210c039615SSascha Leib		// scan the log directory and delete all files except for today and yesterday:
1220c039615SSascha Leib		$dir = scandir(getcwd() . '/lib/plugins/botmon/logs');
1230c039615SSascha Leib		foreach($dir as $file) {
1240c039615SSascha Leib			$fName = pathinfo($file, PATHINFO_BASENAME);
1250c039615SSascha Leib			$bName = strtok($fName, '.');
1260c039615SSascha Leib
127ef5d3610SSascha Leib			if ($bName == '' || $bName == 'logfiles' || $bName == 'empty' || $fName == '.htaccess') {
1280c039615SSascha Leib				// ignore
1290c039615SSascha Leib			} else if ($bName == $today || $bName == $yesterday) {
1300c039615SSascha Leib				// skip
1310c039615SSascha Leib			} else {
1320c039615SSascha Leib				return true;
1330c039615SSascha Leib			}
1340c039615SSascha Leib		}
1350c039615SSascha Leib		return false;
136f125bc8dSSascha Leib	}
137f125bc8dSSascha Leib}