Docker-Swarm-Connectivity-T.../public-reporter/index.php
2024-05-17 11:19:40 +02:00

52 lines
1.6 KiB
PHP

<?php
use GuzzleHttp\Promise\Utils;
require_once("../vendor/autoload.php");
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . "/../");
$dotenv->safeLoad();
$targets = explode(",", $_ENV['TARGETS']);
# trim whitespace from each target
$targets = array_map('trim', $targets);
# For each $target, resolve the target to IP addresses
foreach($targets as $target) {
$targetIps[$target] = gethostbynamel($target) ?: [];
$targetIps[$target] = array_values($targetIps[$target]);
}
# For each $target, Create a guzzle request to get the status of each target
$guzzle = new GuzzleHttp\Client();
$promises = [];
foreach ($targets as $target) {
$url = "http://$target:80/";
$promises[$target] = $guzzle->getAsync($url);
}
# Wait for all the requests to complete
$responses = Utils::settle($promises)->wait();
$rollup = true;
$json = [];
foreach($responses as $target => $response) {
if(!isset($response['value']) || $response['value']->getStatusCode() != 200) {
$rollup = false;
if ($response['reason'] instanceof \Exception) {
$json[$target] = ['Status' => 'ERROR', 'Reason' => $response['reason']->getMessage()];
} else {
$json[$target] = ['Status' => "ERROR", 'Reason' => 'Unknown'];
}
} else {
$json[$target] = json_decode($response['value']->getBody()->getContents(), true);
}
$json[$target]['IP'] = $targetIps[$target];
}
if(!$rollup) {
header("HTTP/1.0 500 Internal Server Error");
}
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'Status' => $rollup ? "OK" : "ERROR",
'Hostname' => gethostname(),
'Targets' => $json,
]);