xref: /dokuwiki/lib/plugins/logviewer/admin.php (revision 70cc2cbf41ee65a6048aab5aab40e124b337e295)
1<?php
2
3use dokuwiki\Logger;
4
5/**
6 * DokuWiki Plugin logviewer (Admin Component)
7 *
8 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
9 * @author  Andreas Gohr <andi@splitbrain.org>
10 */
11class admin_plugin_logviewer extends DokuWiki_Admin_Plugin
12{
13
14    protected $facilities;
15    protected $facility;
16    protected $date;
17
18    /** @inheritDoc */
19    public function forAdminOnly()
20    {
21        return true;
22    }
23
24    /** @inheritDoc */
25    public function handle()
26    {
27        global $INPUT;
28
29        $this->facilities = $this->getFacilities();
30        $this->facility = $INPUT->str('facility');
31        if (!in_array($this->facility, $this->facilities)) {
32            $this->facility = $this->facilities[0];
33        }
34
35        $this->date = $INPUT->str('date');
36        if (!preg_match('/^\d\d\d\d-\d\d-\d\d$/', $this->date)) {
37            $this->date = gmdate('Y-m-d');
38        }
39    }
40
41    /** @inheritDoc */
42    public function html()
43    {
44        echo '<div id="plugin__logviewer">';
45        echo $this->locale_xhtml('intro');
46        $this->displayTabs();
47        $this->displayLog();
48        echo '</div>';
49    }
50
51    /**
52     * Show the navigational tabs and date picker
53     */
54    protected function displayTabs()
55    {
56        global $ID;
57
58        $form = new dokuwiki\Form\Form(['method'=>'GET']);
59        $form->setHiddenField('do', 'admin');
60        $form->setHiddenField('page', 'logviewer');
61        $form->setHiddenField('facility', $this->facility);
62        $form->addTextInput('date','Date*')->attr('type','date')->val($this->date)->addClass('quickselect');
63        $form->addButton('submit','>')->attr('type','submit');
64        echo $form->toHTML();
65
66        echo '<ul class="tabs">';
67        foreach ($this->facilities as $facility) {
68            echo '<li>';
69            if ($facility == $this->facility) {
70                echo '<strong>' . hsc($facility) . '</strong>';
71            } else {
72                $link = wl($ID,
73                    ['do' => 'admin', 'page' => 'logviewer', 'date' => $this->date, 'facility' => $facility]);
74                echo '<a href="' . $link . '">' . hsc($facility) . '</a>';
75            }
76            echo '</li>';
77        }
78        echo '</ul>';
79
80    }
81
82    /**
83     * Output the logfile contents
84     */
85    protected function displayLog()
86    {
87        $logfile = Logger::getInstance($this->facility)->getLogfile($this->date);
88        if (!file_exists($logfile)) {
89            echo $this->locale_xhtml('nolog');
90            return;
91        }
92
93        // loop through the file an print it
94        echo '<dl>';
95        $lines = file($logfile);
96        $cnt = count($lines);
97        for ($i = 0; $i < $cnt; $i++) {
98            $line = $lines[$i];
99
100            if ($line[0] === ' ' && $line[1] === ' ') {
101                // lines indented by two spaces are details, aggregate them
102                echo '<dd>';
103                while ($line[0] === ' ' && $line[1] === ' ') {
104                    echo hsc(substr($line, 2)) . '<br />';
105                    $line = $lines[$i++];
106                }
107                echo '</dd>';
108                $i -= 2; // rewind the counter
109            } else {
110                // other lines are actual log lines in three parts
111                list($dt, $file, $msg) = explode("\t", $line, 3);
112                echo '<dt>';
113                echo '<span class="datetime">' . hsc($dt) . '</span>';
114                echo '<span class="log">';
115                echo '<span class="msg">' . hsc($msg) . '</span>';
116                echo '<span class="file">' . hsc($file) . '</span>';
117                echo '</span>';
118                echo '</dt>';
119            }
120        }
121        echo '</dl>';
122    }
123
124    /**
125     * Get the available logging facilities
126     *
127     * @return array
128     */
129    protected function getFacilities()
130    {
131        global $conf;
132        $conf['logdir'];
133
134        // default facilities first
135        $facilities = [
136            Logger::LOG_ERROR,
137            Logger::LOG_DEPRECATED,
138            Logger::LOG_DEBUG,
139        ];
140
141        // add all other dirs
142        $dirs = glob($conf['logdir'] . '/*', GLOB_ONLYDIR);
143        foreach ($dirs as $dir) {
144            $facilities[] = basename($dir);
145        }
146        $facilities = array_unique($facilities);
147
148        return $facilities;
149    }
150
151}
152
153