refactor: replace Grafana API with heartbeat receiver provisioning

Remove all Grafana API code (630 lines), obfuscated tokens, SA tokens,
ensureGrafanaPlugin, provisionGrafanaDatasource, buildDashboardModel.

Replace with simple HTTP POST to heartbeat receiver on bench server.
Receiver writes Grafana provisioning YAML and restarts Grafana container.
No API tokens or RBAC permissions needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jonathan Miller
2026-05-22 04:40:37 -05:00
parent 42d530bfbf
commit b22842f302
2 changed files with 81 additions and 741 deletions
+30 -112
View File
@@ -792,142 +792,60 @@ class plgSystemMokoWaaSInstallerScript implements InstallerScriptInterface
$db->execute();
}
// Grafana provisioning — obfuscated credentials
$gXor = 'MokoWaaS-Grafana-Provision';
$deobfuscate = function ($encoded) use ($gXor) {
$data = base64_decode($encoded);
$out = '';
for ($i = 0, $len = strlen($data); $i < $len; $i++) {
$out .= chr(ord($data[$i]) ^ ord($gXor[$i % strlen($gXor)]));
}
return $out;
};
$grafanaUrl = $deobfuscate('JRsfHyRbTnxPIhwCDk8DDkY/EQAYGgYFGwcjCEUbMgIJ');
$grafanaKey = $deobfuscate('KgMYDggTBwJbcRMsD1MDMFw8OQUvLDA5Xho6ACUpYwBREkYxPT5RBAxXTGRBVg==');
// Heartbeat receiver
$heartbeatUrl = 'https://bench.mokoconsulting.tech/api/waas-heartbeat/register';
$heartbeatKey = 'moko-waas-hb-2026-x9k4m';
$siteUrl = rtrim(\Joomla\CMS\Uri\Uri::root(), '/');
$siteName = Factory::getConfig()->get('sitename', 'Joomla');
$dsUid = 'mokowaas-' . md5($siteUrl);
$token = $params->get('health_api_token', '');
$siteUrl = rtrim(\Joomla\CMS\Uri\Uri::root(), '/');
$siteName = Factory::getConfig()->get('sitename', 'Joomla');
$token = $params->get('health_api_token', '');
// Provision datasource via Grafana REST API (cURL)
$dsPayload = json_encode([
'uid' => $dsUid,
'name' => 'MokoWaaS — ' . $siteName,
'type' => 'yesoreyeram-infinity-datasource',
'access' => 'proxy',
'url' => $siteUrl,
'jsonData' => [
'auth_method' => 'bearerToken',
'global_queries' => [],
],
'secureJsonData' => [
'bearerToken' => $token,
],
$payload = json_encode([
'site_url' => $siteUrl,
'site_name' => $siteName,
'health_token' => $token,
'action' => 'register',
], JSON_UNESCAPED_SLASHES);
$headers = [
'Authorization: Bearer ' . $grafanaKey,
$ch = curl_init($heartbeatUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Accept: application/json',
];
// Try PUT (update), fall back to POST (create)
$ch = curl_init($grafanaUrl . '/api/datasources/uid/' . $dsUid);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dsPayload);
'X-MokoWaaS-Key: ' . $heartbeatKey,
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
$app = Factory::getApplication();
$app = Factory::getApplication();
$body = json_decode($response, true);
if ($error)
{
$msg = 'Grafana heartbeat failed: ' . $error;
Log::add($msg, Log::WARNING, 'mokowaas');
$app->enqueueMessage($msg, 'warning');
return;
$app->enqueueMessage('Grafana heartbeat failed: ' . $error, 'warning');
Log::add('Heartbeat failed: ' . $error, Log::WARNING, 'mokowaas');
}
Log::add(
sprintf('Grafana heartbeat PUT: HTTP %d, url=%s, dsUid=%s',
$code, $grafanaUrl, $dsUid),
Log::INFO,
'mokowaas'
);
if ($code === 200)
elseif ($code === 200 && ($body['status'] ?? '') === 'registered')
{
$app->enqueueMessage(
'Grafana heartbeat: datasource updated.',
'Grafana heartbeat: site registered (' . ($body['ds_uid'] ?? '') . ')',
'message'
);
return;
}
if ($code === 404)
else
{
// Datasource doesn't exist — create it
$ch = curl_init($grafanaUrl . '/api/datasources');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dsPayload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response2 = curl_exec($ch);
$code2 = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error2 = curl_error($ch);
curl_close($ch);
if ($error2)
{
$msg = 'Grafana heartbeat create failed: ' . $error2;
Log::add($msg, Log::WARNING, 'mokowaas');
$app->enqueueMessage($msg, 'warning');
return;
}
if ($code2 === 200 || $code2 === 409)
{
$app->enqueueMessage(
'Grafana heartbeat: datasource registered.',
'message'
);
}
else
{
$body2 = json_decode($response2, true);
$msg = sprintf(
'Grafana heartbeat failed: HTTP %d — %s',
$code2, $body2['message'] ?? 'Unknown error'
);
Log::add($msg, Log::WARNING, 'mokowaas');
$app->enqueueMessage($msg, 'warning');
}
return;
$msg = sprintf('Grafana heartbeat failed: HTTP %d — %s',
$code, $body['error'] ?? 'Unknown');
$app->enqueueMessage($msg, 'warning');
Log::add($msg, Log::WARNING, 'mokowaas');
}
// Any other HTTP code (403, 500, etc.)
$body = json_decode($response, true);
$msg = sprintf(
'Grafana heartbeat failed: HTTP %d — %s',
$code, $body['message'] ?? 'Unknown error'
);
Log::add($msg, Log::WARNING, 'mokowaas');
$app->enqueueMessage($msg, 'warning');
}
private function registerActionLogExtension()