From f367958d69140ec3e789f31e4366912ed2640336 Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Thu, 13 Jun 2024 13:41:31 +0200 Subject: [PATCH] Introduced .htaccess file and refactored index.php 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. --- .htaccess | 4 ++ index.php | 143 ++--------------------------------------------------- script.php | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 138 deletions(-) create mode 100644 .htaccess create mode 100644 script.php diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..d1df4e0 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ +RewriteEngine on +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^.*$ /index.php [L,QSA] diff --git a/index.php b/index.php index 4ade040..ae90bba 100644 --- a/index.php +++ b/index.php @@ -1,139 +1,6 @@ &$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; -} +header('Content-Type: text/plain; version=0.0.4'); +$config = getenv('CONFIG_FILE'); +$phpbin = getenv('PHP_BINARY'); +$output = shell_exec('CONFIG_FILE="' . $config . '" ' . $phpbin . ' script.php'); +echo $output; diff --git a/script.php b/script.php new file mode 100644 index 0000000..71e76ce --- /dev/null +++ b/script.php @@ -0,0 +1,138 @@ + &$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; +}