&$metric) { if (!isset($metric['submetrics'])) { $metric['submetrics'] = [$metric]; } foreach ($metric['submetrics'] as $subkey => &$submetric) { 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; if(!empty($oldconfig) && empty($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(); } } } file_put_contents('metrics_cache.json', 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; }