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()
{
}
}
|