$host + ['system_ids' => SystemRepository::idsForHostname($host['hostname'])], $this->hosts->all() ); return Response::json(['hosts' => $hosts]); } public function create(Request $request): Response { try { $host = $this->hosts->create($request->body); } catch (InvalidArgumentException $e) { return Response::error($e->getMessage(), 422); } return Response::json(['host' => $host], 201); } /** @param array $params */ public function update(Request $request, array $params): Response { $previous = $this->hosts->find((int) $params['id']); try { $host = $this->hosts->update((int) $params['id'], $request->body); } catch (InvalidArgumentException $e) { return Response::error($e->getMessage(), 422); } // Ein umbenannter Host meldet sich unter neuer System-Id; die alte Kachel haette // sonst niemanden mehr, der sie aktualisiert, und bliebe fuer immer stehen. if ($previous !== null && $previous['hostname'] !== $host['hostname']) { $this->systems->delete(SystemRepository::idsForHostname($previous['hostname'])); } return Response::json(['host' => $host]); } /** * Entfernt den Host aus der Ueberwachung und raeumt seine Kachel im System-Monitor * gleich mit ab - analog zu Issue #43, wo ein entferntes Projekt auch seine Tickets * mitnimmt. Ohne das bliebe die (womoeglich rote) Kachel stehen, obwohl niemand den * Host mehr prueft. * * @param array $params */ public function delete(Request $request, array $params): Response { $host = $this->hosts->delete((int) $params['id']); $this->systems->delete(SystemRepository::idsForHostname($host['hostname'])); return Response::json(['deleted' => true]); } /** * Die hosts.conf dieses Ping-Rechners als Klartext - check_fds.sh schreibt den Body * direkt in seine lokale Datei. * * 204 statt 200 heisst "fuer dich ist hier noch nichts konfiguriert": dann soll der * Ping-Rechner seine bestehende Datei abgeben (import()), statt sie zu ueberschreiben. * Ohne diese Unterscheidung waere eine leere Antwort zweideutig - eine im Frontend * geleerte Liste saehe aus wie eine unbenutzte, und der Check pingte munter nach seiner * alten lokalen Datei weiter. * * @param array $params * @param array $agent - der ueber X-Api-Key authentifizierte Agent. */ public function conf(Request $request, array $params, array $agent): Response { if (($agent['role'] ?? '') !== 'ops') { return Response::error('Nur Agenten der Rolle "ops" haben eine hosts.conf.', 403); } $agentId = (int) $agent['id']; if (!$this->hosts->hasImported($agentId) && $this->hosts->allForAgent($agentId) === []) { return Response::text('', 204); } return Response::text($this->hosts->renderHostsConf($agentId)); } /** * Erstbefuellung: check_fds.sh schickt seine bestehende hosts.conf als Klartext, solange * fuer diesen Agenten serverseitig noch nichts konfiguriert ist. Ist bereits etwas * hinterlegt, passiert nichts (imported = 0) - die im Frontend gepflegte Liste hat * Vorrang vor der lokalen Datei. * * @param array $params * @param array $agent */ public function import(Request $request, array $params, array $agent): Response { if (($agent['role'] ?? '') !== 'ops') { return Response::error('Nur Agenten der Rolle "ops" haben eine hosts.conf.', 403); } $rows = HostConfigRepository::parseHostsConf($request->rawBody); $imported = $this->hosts->importForAgent((int) $agent['id'], $rows); return Response::json(['imported' => $imported]); } }