167 lines
5.2 KiB
TypeScript
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();
|
|
}
|
|
);
|