diff --git a/src/api.ts b/src/api.ts index 8317608..139bde3 100644 --- a/src/api.ts +++ b/src/api.ts @@ -57,7 +57,9 @@ export interface VmStatus { export interface VmIpAssignment { id: number; ip: string; - range: string; + gateway: string; + forward_dns?: string; + reverse_dns?: string; } export interface VmInstance { @@ -96,6 +98,7 @@ export interface VmPayment { export interface PatchVm { ssh_key_id?: number; + reverse_dns?: string; } export class LNVpsApi { diff --git a/src/pages/vm.tsx b/src/pages/vm.tsx index 2bf7fa7..14da024 100644 --- a/src/pages/vm.tsx +++ b/src/pages/vm.tsx @@ -1,7 +1,7 @@ import "@xterm/xterm/css/xterm.css"; import { useLocation, useNavigate, useParams } from "react-router-dom"; -import { VmInstance, VmPayment } from "../api"; +import { VmInstance, VmIpAssignment, VmPayment } from "../api"; import VpsInstanceRow from "../components/vps-instance"; import useLogin from "../hooks/login"; import { useCallback, useEffect, useRef, useState } from "react"; @@ -26,6 +26,8 @@ export default function VmPage() { const [term] = useState(); const termRef = useRef(null); const [editKey, setEditKey] = useState(false); + const [editReverse, setEditReverse] = useState(); + const [error, setError] = useState(); const [key, setKey] = useState(state?.ssh_key.id ?? -1); const renew = useCallback( @@ -73,29 +75,49 @@ export default function VmPage() { if (!state) { return

No VM selected

; } + + function ipRow(a: VmIpAssignment, reverse: boolean) { + return
+
+ IP: + {a.ip.split("/")[0]} + {a.forward_dns && ({a.forward_dns})} +
+ {reverse &&
+
PTR: {a.reverse_dns}
+ setEditReverse(a)} /> +
} +
+ } + + function networkInfo() { + if (!state) return; + if ((state.ip_assignments?.length ?? 0) === 0) { + return
No IP's assigned
+ } + return <> + {state.ip_assignments?.map(i => ipRow(i, true))} + {ipRow({ + id: -1, + ip: toEui64("2a13:2c0::", state.mac_address), + gateway: "" + }, false)} + + } + return (
{action === undefined && ( <> -
-
Network:
- {(state.ip_assignments?.length ?? 0) === 0 && ( -
No IP's assigned
- )} - {state.ip_assignments?.map((a) => ( -
- {a.ip.split("/")[0]} -
- ))} -
- {toEui64("2a13:2c0::", state.mac_address)} -
+
Network:
+
+ {networkInfo()}
-
+
SSH Key:
{state.ssh_key?.name} @@ -143,18 +165,65 @@ export default function VmPage() {
After selecting a new key, please restart the VM. + {error && {error}} { + setError(undefined); if (!login?.api) return; - await login.api.patchVm(state.id, { - ssh_key_id: key, - }); - const ns = await login.api.getVm(state?.id); - navigate(".", { - state: ns, - replace: true, - }); - setEditKey(false); + try { + await login.api.patchVm(state.id, { + ssh_key_id: key, + }); + const ns = await login.api.getVm(state?.id); + navigate(".", { + state: ns, + replace: true, + }); + setEditKey(false); + } catch (e) { + if (e instanceof Error) { + setError(e.message); + } + } + }} + > + Save + +
+ + )} + {editReverse && ( + setEditReverse(undefined)}> + +
+
Reverse DNS:
+ setEditReverse({ + ...editReverse, + reverse_dns: e.target.value + })} /> + DNS updates can take up to 48hrs to propagate. + {error && {error}} + { + setError(undefined); + if (!login?.api) return; + + try { + await login.api.patchVm(state.id, { + reverse_dns: editReverse.reverse_dns, + }); + + const ns = await login.api.getVm(state?.id); + navigate(".", { + state: ns, + replace: true, + }); + setEditReverse(undefined); + } catch (e) { + if (e instanceof Error) { + setError(e.message); + } + } }} > Save