blob: f7f2df611335bb2de48cb12547175a466087706d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
<?php
namespace Icinga\Module\Graphite\Util;
use Icinga\Authentication\Auth;
use Icinga\Security\SecurityException;
/**
* A record about what happened during a specific action
*/
class InternalProcessTracker
{
/**
* Whether to record anything
*
* @var bool
*/
private static $enabled = false;
/**
* How many '+'es to prepend to each new record
*
* @var int
*/
private static $indentation = 1;
/**
* The recorded happenings
*
* @var string[]
*/
private static $records = [];
/**
* Get whether recording is enabled
*
* @return bool
*/
public static function enabled()
{
return self::$enabled;
}
/**
* Enable recording
*
* @throws SecurityException
*/
public static function enable()
{
if (! Auth::getInstance()->hasPermission('graphite/debug')) {
throw new SecurityException('No permission for graphite/debug');
}
self::$enabled = true;
}
/**
* Introduce a "sub-process"
*/
public static function indent()
{
if (self::$enabled) {
++self::$indentation;
}
}
/**
* Record a happening
*
* Behaves like {@link sprintf()} if additional arguments given, but {@link var_export()}s the arguments first
* (so always use %s instead of e.g. %d).
*
* @param string $format
*/
public static function recordf($format)
{
if (self::$enabled) {
if (func_num_args() > 1) {
$args = [];
foreach (array_slice(func_get_args(), 1) as $arg) {
$args[] = var_export($arg, true);
}
$format = vsprintf($format, $args);
}
self::$records[] = str_repeat('+', self::$indentation) . " $format";
}
}
/**
* Terminate a "sub-process"
*/
public static function unindent()
{
if (self::$enabled) {
--self::$indentation;
}
}
/**
* Dump everything recorded as plain text
*
* @return string
*/
public static function dump()
{
return implode("\n", self::$records);
}
/**
* Reset records
*/
public static function clear()
{
if (self::$enabled) {
self::$indentation = 1;
self::$records = [];
}
}
final private function __construct()
{
}
}
|