Files
nadir-webui/src/lib/remotes/networking.remote.ts
T

167 lines
5.2 KiB
TypeScript

import { command, query } from '$app/server';
import { v } from '$lib';
import { nadirForMachine, throwNadirError } from './utils';
export const listInterfaces = query(v.string(), async (machineId) => {
const nadir = await nadirForMachine(machineId);
const { data, error: err } = await nadir.GET('/api/networking/interfaces');
if (!data) throwNadirError(err);
return data.interfaces ?? [];
});
export const listHosts = query(v.string(), async (machineId) => {
const nadir = await nadirForMachine(machineId);
const { data, error: err } = await nadir.GET('/api/networking/hosts');
if (!data) throwNadirError(err);
return data.entries ?? [];
});
export const listRoutes = query(v.string(), async (machineId) => {
const nadir = await nadirForMachine(machineId);
const { data, error: err } = await nadir.GET('/api/networking/routes');
if (!data) throwNadirError(err);
return data.routes ?? [];
});
export const getDns = query(v.string(), async (machineId) => {
const nadir = await nadirForMachine(machineId);
const { data, error: err } = await nadir.GET('/api/networking/dns');
if (!data) throwNadirError(err);
return data.servers ?? [];
});
// 404 when nothing is pending — treat as null instead of throwing.
export const getPending = query(v.string(), async (machineId) => {
const nadir = await nadirForMachine(machineId);
const { data, error: err } = await nadir.GET('/api/networking/pending');
if (err) {
if (err.status === 404) return null;
throwNadirError(err);
}
return data;
});
export const getInterfaceConfig = query(
v.object({ machineId: v.string(), name: v.string() }),
async ({ machineId, name }) => {
const nadir = await nadirForMachine(machineId);
const { data, error: err } = await nadir.GET('/api/networking/interfaces/{name}', {
params: { path: { name } }
});
if (!data) throwNadirError(err);
return data;
}
);
export const applyInterfaceConfig = command(
v.object({
address: v.optional(v.string()),
dns: v.optional(v.array(v.string())),
gateway: v.optional(v.string()),
ipv6: v.optional(
v.object({
address: v.optional(v.string()),
gateway: v.optional(v.string()),
method: v.union([v.literal('auto'), v.literal('static'), v.literal('ignore')]),
prefix: v.optional(v.number())
})
),
machineId: v.string(),
method: v.union([v.literal('static'), v.literal('dhcp')]),
name: v.string(),
prefix: v.optional(v.number()),
rollback_seconds: v.optional(v.number()),
routes: v.optional(v.array(v.object({ destination: v.string(), gateway: v.string() })))
}),
async ({ machineId, name, ...body }) => {
const nadir = await nadirForMachine(machineId);
const { error: err } = await nadir.PUT('/api/networking/interfaces/{name}', {
body,
params: { path: { name } }
});
if (err) throwNadirError(err);
await getPending(machineId).refresh();
await listInterfaces(machineId).refresh();
}
);
export const linkUp = command(
v.object({ machineId: v.string(), name: v.string() }),
async ({ machineId, name }) => {
const nadir = await nadirForMachine(machineId);
const { error: err } = await nadir.POST('/api/networking/interfaces/{name}/up', {
params: { path: { name } }
});
if (err) throwNadirError(err);
await listInterfaces(machineId).refresh();
}
);
export const linkDown = command(
v.object({ machineId: v.string(), name: v.string() }),
async ({ machineId, name }) => {
const nadir = await nadirForMachine(machineId);
const { error: err } = await nadir.POST('/api/networking/interfaces/{name}/down', {
params: { path: { name } }
});
if (err) throwNadirError(err);
await listInterfaces(machineId).refresh();
}
);
export const confirmChange = command(
v.object({ machineId: v.string(), name: v.string() }),
async ({ machineId, name }) => {
const nadir = await nadirForMachine(machineId);
const { error: err } = await nadir.POST('/api/networking/interfaces/{name}/confirm', {
params: { path: { name } }
});
if (err) throwNadirError(err);
await getPending(machineId).refresh();
await listInterfaces(machineId).refresh();
}
);
export const rollbackChange = command(
v.object({ machineId: v.string(), name: v.string() }),
async ({ machineId, name }) => {
const nadir = await nadirForMachine(machineId);
const { error: err } = await nadir.POST('/api/networking/interfaces/{name}/rollback', {
params: { path: { name } }
});
if (err) throwNadirError(err);
await getPending(machineId).refresh();
await listInterfaces(machineId).refresh();
}
);
export const upsertHost = command(
v.object({
hostnames: v.array(v.string()),
ip: v.string(),
machineId: v.string()
}),
async ({ hostnames, ip, machineId }) => {
const nadir = await nadirForMachine(machineId);
const { error: err } = await nadir.PUT('/api/networking/hosts/{ip}', {
body: { hostnames },
params: { path: { ip } }
});
if (err) throwNadirError(err);
await listHosts(machineId).refresh();
}
);
export const deleteHost = command(
v.object({ ip: v.string(), machineId: v.string() }),
async ({ ip, machineId }) => {
const nadir = await nadirForMachine(machineId);
const { error: err } = await nadir.DELETE('/api/networking/hosts/{ip}', {
params: { path: { ip } }
});
if (err) throwNadirError(err);
await listHosts(machineId).refresh();
}
);