normalized network list with subnet/gateway/usage * create POST {"name": "...", "driver": "bridge", "subnet": "...", "gateway": "..."} * remove POST {"name": "...", "force": false} */ declare(strict_types=1); require __DIR__ . '/../include/bootstrap.php'; $action = $_GET['action'] ?? ''; switch ($action) { case 'list': podman_json_response(networks_list($client)); break; case 'create': $body = podman_read_json_body(); $name = (string) ($body['name'] ?? ''); if ($name === '') { podman_json_error('Missing name in request body', 400); } podman_json_response($client->createNetwork( $name, (string) ($body['driver'] ?? 'bridge'), isset($body['subnet']) ? (string) $body['subnet'] : null, isset($body['gateway']) ? (string) $body['gateway'] : null )); break; case 'remove': $body = podman_read_json_body(); $name = (string) ($body['name'] ?? ''); if ($name === '') { podman_json_error('Missing name in request body', 400); } // podman0, the default bridge, refuses removal API-side — no // special-casing needed here, PodmanApiException surfaces podman's // own rejection message as-is. $client->removeNetwork($name, (bool) ($body['force'] ?? false)); podman_json_response(['status' => 'removed']); break; default: podman_json_error("Unknown action '{$action}'", 400); } /** @return array> */ function networks_list(PodmanClient $client): array { $raw = $client->listNetworks(); $usageCounts = []; foreach ($client->listContainers(true) as $c) { $nets = $c['Networks'] ?? []; if (is_array($nets)) { foreach ($nets as $netName) { if (is_string($netName)) { $usageCounts[$netName] = ($usageCounts[$netName] ?? 0) + 1; } } } } $out = []; foreach ($raw as $n) { $name = (string) ($n['name'] ?? ''); $subnets = $n['subnets'] ?? []; $subnet = is_array($subnets) && count($subnets) > 0 ? (string) ($subnets[0]['subnet'] ?? '') : ''; $gateway = is_array($subnets) && count($subnets) > 0 ? (string) ($subnets[0]['gateway'] ?? '') : ''; $out[] = [ 'name' => $name, 'driver' => (string) ($n['driver'] ?? 'bridge'), 'subnet' => $subnet, 'gateway' => $gateway, 'isDefault' => $name === 'podman', 'containers' => $usageCounts[$name] ?? 0, ]; } usort($out, static fn($a, $b) => strcmp($a['name'], $b['name'])); return $out; }