Jeroen De Meerleer
f367958d69
A new .htaccess file has been added to handle URL rewriting. The index.php file has been significantly refactored for improved readability and performance. A large portion of the original code was moved to a separate script.php file, which is now executed from within index.php. This change simplifies the main entry point of the application and separates concerns more effectively. Additionally, minor changes were made to cache handling in script.php.
139 lines
5.6 KiB
PHP
139 lines
5.6 KiB
PHP
<?php
|
|
require 'vendor/autoload.php';
|
|
$configFile = getenv('CONFIG_FILE') ?: 'config.php';
|
|
$cacheFile = 'twig_cache/' . hash('murmur3f', $configFile);
|
|
|
|
if (file_exists($configFile)) {
|
|
require ($configFile);
|
|
} else {
|
|
echo ("Configuration file not found: " . $configFile);
|
|
exit(1);
|
|
}
|
|
if(file_exists($cacheFile)) {
|
|
$oldconfig = json_decode(file_get_contents($cacheFile), true);
|
|
} else {
|
|
$oldconfig = [];
|
|
}
|
|
|
|
if(php_sapi_name() == 'cli' || $_SERVER["REQUEST_URI"] == '/metrics') {
|
|
foreach ($config as $key => &$metric) {
|
|
if (!isset($metric['submetrics'])) {
|
|
$metric['submetrics'] = [$metric];
|
|
}
|
|
foreach ($metric['submetrics'] as $subkey => &$submetric) {
|
|
$pid = pcntl_fork();
|
|
if ($pid > 0) {
|
|
$pids[] = $pid;
|
|
} else {
|
|
if (isset($submetric['command'])) {
|
|
$output = null;
|
|
$retval = null;
|
|
try {
|
|
exec($submetric['command'], $output, $retval);
|
|
$output = implode("\n", $output);
|
|
} catch (Exception $e) {
|
|
$output = '';
|
|
}
|
|
} elseif (isset($submetric['http'])) {
|
|
$client = new GuzzleHttp\Client();
|
|
|
|
$options = [];
|
|
$output = NULL;
|
|
if (isset($submetric['http']['proxy'])) {
|
|
$options['proxy'] = $submetric['http']['proxy'];
|
|
}
|
|
if (isset($submetric['http']['data']) && $submetric['http']['data'] == 'responsetime') {
|
|
$options['on_stats'] = function (GuzzleHttp\TransferStats $stats) use (&$output) {
|
|
$output = $stats->getTransferTime();
|
|
};
|
|
}
|
|
|
|
$hasresponse = NULL;
|
|
try {
|
|
$res = $client->request('GET', $submetric['http']['url'], $options);
|
|
$hasresponse = true;
|
|
} catch (GuzzleHttp\Exception\GuzzleException $e) {
|
|
if (method_exists($e, 'getResponse')) {
|
|
$res = $e->getResponse();
|
|
$hasresponse = true;
|
|
} else {
|
|
$hasresponse = false;
|
|
}
|
|
}
|
|
|
|
if (isset($submetric['http']['data']) && $submetric['http']['data'] == 'responsebody') {
|
|
if ($hasresponse) {
|
|
$output = $res->getBody()->getContents();
|
|
} else {
|
|
$output = '';
|
|
}
|
|
} elseif ((isset($submetric['http']['statuscode'])) && (isset($submetric['http']['data']) && $submetric['http']['data'] == 'hasresponse')) {
|
|
if ($hasresponse) {
|
|
$output = $output = (int)in_array($res->getStatusCode(), $submetric['http']['statuscode']);;
|
|
} else {
|
|
$output = 0;
|
|
}
|
|
} elseif (isset($submetric['http']['data']) && $submetric['http']['data'] == 'hasresponse') {
|
|
$output = (int)$hasresponse;
|
|
}
|
|
}
|
|
|
|
if (isset($submetric['jsonelem'])) {
|
|
$submetric['value'] = getArrayValue($submetric['jsonelem'], json_decode($output, true));
|
|
} else {
|
|
$submetric['value'] = $output;
|
|
}
|
|
|
|
if (is_bool($submetric['value'])) $submetric['value'] = $submetric['value'] ? 1 : 0;
|
|
|
|
file_put_contents('/tmp/.metrics.' . $key . '.' . $subkey, $submetric['value']);
|
|
exit();
|
|
}
|
|
}
|
|
}
|
|
foreach ($pids as $pid) {
|
|
pcntl_waitpid($pid, $none);
|
|
}
|
|
|
|
|
|
foreach ($config as $key => &$metric) {
|
|
foreach ($metric['submetrics'] as $subkey => &$submetric) {
|
|
$submetric['value'] = file_get_contents('/tmp/.metrics.' . $key . '.' . $subkey);
|
|
if (!empty($oldconfig) && !isset($submetric['value']) && (isset($submetric['fallback']) && !empty($submetric['fallback']))) {
|
|
if (!isset($submetric['fallback']['maxage']) || time() < ($oldconfig[$key]['submetrics'][$subkey]['time'] + $submetric['fallback']['maxage'])) {
|
|
if ($submetric['fallback']['type'] == 'previous') {
|
|
$submetric['value'] = $oldconfig[$key]['submetrics'][$subkey]['value'];
|
|
} elseif ($submetric['fallback']['type'] == 'static') {
|
|
$submetric['value'] = $submetric['fallback']['value'];
|
|
}
|
|
$submetric['time'] = $oldconfig[$key]['submetrics'][$subkey]['time'];
|
|
} else {
|
|
$submetric['value'] = '';
|
|
$submetric['time'] = 0;
|
|
}
|
|
} else {
|
|
$submetric['time'] = time();
|
|
}
|
|
unlink('/tmp/.metrics.' . $key . '.' . $subkey);
|
|
}
|
|
}
|
|
|
|
file_put_contents($cacheFile, json_encode($config, JSON_PRETTY_PRINT));
|
|
|
|
$loader = new \Twig\Loader\FilesystemLoader('templates');
|
|
$twig = new \Twig\Environment($loader, [
|
|
'cache' => 'twig-cache',
|
|
]);
|
|
echo $twig->render('metrics.twig', ['config' => $config]);
|
|
}
|
|
|
|
function getArrayValue($elem, $array) {
|
|
$elem = explode('.', $elem);
|
|
$new_array = $array;
|
|
foreach ($elem as $i) {
|
|
if(empty($new_array)) break;
|
|
$new_array = $new_array[$i];
|
|
}
|
|
return $new_array;
|
|
}
|