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 127 128 129 130 131 132 133 134 135 136 137
|
<?php
namespace SimpleSAML\Module\statistics;
use SimpleSAML\Configuration;
/**
* @author Andreas Åkre Solberg <andreas.solberg@uninett.no>
* @package SimpleSAMLphp
*/
class Ruleset
{
/** \SimpleSAML\Configuration */
private $statconfig;
/** @var array */
private $availrulenames;
/** @var array */
private $availrules;
/** @var array */
private $available;
/**
* Constructor
*
* @param \SimpleSAML\Configuration $statconfig
*/
public function __construct(Configuration $statconfig)
{
$this->statconfig = $statconfig;
$this->init();
}
/**
* @return void
*/
private function init()
{
$statdir = $this->statconfig->getValue('statdir');
$statrules = $this->statconfig->getValue('statrules');
$timeres = $this->statconfig->getValue('timeres');
/*
* Walk through file lists, and get available [rule][fileslot]...
*/
if (!is_dir($statdir)) {
throw new \Exception('Statisics output directory [' . $statdir . '] does not exist.');
}
$filelist = scandir($statdir);
$this->available = [];
foreach ($filelist as $file) {
if (preg_match('/([a-z0-9_]+)-([a-z0-9_]+)-([0-9]+)\.stat/', $file, $matches)) {
if (array_key_exists($matches[1], $statrules)) {
if (array_key_exists($matches[2], $timeres)) {
$this->available[$matches[1]][$matches[2]][] = $matches[3];
}
}
}
}
if (empty($this->available)) {
throw new \Exception('No aggregated statistics files found in [' . $statdir . ']');
}
/**
* Create array with information about available rules..
*/
$this->availrules = array_keys($statrules);
$available_rules = [];
foreach ($this->availrules as $key) {
$available_rules[$key] = ['name' => $statrules[$key]['name'], 'descr' => $statrules[$key]['descr']];
}
$this->availrulenames = $available_rules;
}
/**
* @return array
*/
public function availableRules()
{
return $this->availrules;
}
/**
* @return array
*/
public function availableRulesNames()
{
return $this->availrulenames;
}
/**
* Resolve which rule is selected. Taking user preference and checks if it exists.
*
* @param string|null $preferRule
* @return string|null
*/
private function resolveSelectedRule($preferRule = null)
{
$rule = $this->statconfig->getString('default', $this->availrules[0]);
if (!empty($preferRule)) {
if (in_array($preferRule, $this->availrules, true)) {
$rule = $preferRule;
}
}
return $rule;
}
/**
* @param string|null $preferRule
* @return \SimpleSAML\Module\statistics\Statistics\Rulesets\BaseRule
*/
public function getRule($preferRule = null)
{
$rule = $this->resolveSelectedRule($preferRule);
$statrulesConfig = $this->statconfig->getConfigItem('statrules');
$statruleConfig = $statrulesConfig->getConfigItem($rule);
$presenterClass = \SimpleSAML\Module::resolveClass(
$statruleConfig->getValue('presenter', 'statistics:BaseRule'),
'Statistics\Rulesets'
);
/** @psalm-suppress InvalidStringClass */
$statrule = new $presenterClass($this->statconfig, $statruleConfig, $rule, $this->available);
/** @var \SimpleSAML\Module\statistics\Statistics\Rulesets\BaseRule $statrule */
return $statrule;
}
}
|