From 68a1b152f74ccc275835aee02d60dfddff08abc7 Mon Sep 17 00:00:00 2001 From: JackTheRooster Date: Mon, 3 Mar 2025 23:03:11 -0600 Subject: [PATCH] added button to set device name dns and device name now appears in json rpc response dns name appears on UI --- config.go | 20 +++++++++----- jsonrpc.go | 36 +++++++++++++----------- network.go | 11 ++++++-- ui/src/components/sidebar/settings.tsx | 38 ++++++++++++++++---------- ui/src/hooks/stores.ts | 11 ++++---- 5 files changed, 70 insertions(+), 46 deletions(-) diff --git a/config.go b/config.go index a4d56b0..b55ba0e 100644 --- a/config.go +++ b/config.go @@ -12,6 +12,11 @@ type WakeOnLanDevice struct { MacAddress string `json:"macAddress"` } +type NameConfig struct { + Name string `json:"name"` + DNS string `json:"dns"` +} + type Config struct { CloudURL string `json:"cloud_url"` CloudToken string `json:"cloud_token"` @@ -25,8 +30,7 @@ type Config struct { WakeOnLanDevices []WakeOnLanDevice `json:"wake_on_lan_devices"` EdidString string `json:"hdmi_edid_string"` ActiveExtension string `json:"active_extension"` - DeviceName string `json:"device_name"` - DNSName string `json:"dns_name"` + NameConfig NameConfig `json:"name_config"` DisplayMaxBrightness int `json:"display_max_brightness"` DisplayDimAfterSec int `json:"display_dim_after_sec"` DisplayOffAfterSec int `json:"display_off_after_sec"` @@ -35,11 +39,13 @@ type Config struct { const configPath = "/userdata/kvm_config.json" var defaultConfig = &Config{ - CloudURL: "https://api.jetkvm.com", - AutoUpdateEnabled: true, // Set a default value - ActiveExtension: "", - DeviceName: "JetKVM", - DNSName: "jetkvm.local", + CloudURL: "https://api.jetkvm.com", + AutoUpdateEnabled: true, // Set a default value + ActiveExtension: "", + NameConfig: NameConfig{ + Name: "JetKVM", + DNS: "jetkvm.local", + }, DisplayMaxBrightness: 64, DisplayDimAfterSec: 120, // 2 minutes DisplayOffAfterSec: 1800, // 30 minutes diff --git a/jsonrpc.go b/jsonrpc.go index 0c4b709..4c34fd6 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -44,6 +44,11 @@ type BacklightSettings struct { OffAfter int `json:"off_after"` } +type NameSettings struct { + Name string `json:"name"` + DNS string `json:"dns"` +} + func writeJSONRPCResponse(response JSONRPCResponse, session *Session) { responseBytes, err := json.Marshal(response) if err != nil { @@ -294,28 +299,28 @@ type SSHKeyState struct { SSHKey string `json:"sshKey"` } -func rpcGetDeviceName() (string, error) { +func rpcGetNameConfig() (NameConfig, error) { LoadConfig() - return config.DeviceName, nil + return config.NameConfig, nil } -func rpcSetDeviceName(deviceName string) error { +func rpcSetNameConfig(deviceName string) (NameConfig, error) { LoadConfig() - config.DeviceName = deviceName - config.DNSName = slug.Make(deviceName) + config.NameConfig = NameConfig{ + Name: deviceName, + DNS: slug.Make(deviceName), + } + + RestartMDNS() err := SaveConfig() if err != nil { - return fmt.Errorf("failed to save device name: %w", err) + return NameConfig{}, fmt.Errorf("failed to save device name: %w", err) } - log.Printf("[jsonrpc.go:rpcSetDeviceName] device name set to %s, dns name set to %s", config.DeviceName, config.DNSName) - return nil -} - -func rpcGetDNSName() (string, error) { - LoadConfig() - return config.DNSName, nil + nameConfig := config.NameConfig + log.Printf("[jsonrpc.go:rpcSetNameConfig] device name set to %s, dns name set to %s", nameConfig.Name, nameConfig.DNS) + return nameConfig, nil } func rpcGetDevModeState() (DevModeState, error) { @@ -780,9 +785,8 @@ var rpcHandlers = map[string]RPCHandler{ "setDevChannelState": {Func: rpcSetDevChannelState, Params: []string{"enabled"}}, "getUpdateStatus": {Func: rpcGetUpdateStatus}, "tryUpdate": {Func: rpcTryUpdate}, - "getDeviceName": {Func: rpcGetDeviceName}, - "setDeviceName": {Func: rpcSetDeviceName, Params: []string{"deviceName"}}, - "getDNSName": {Func: rpcGetDNSName}, + "setNameConfig": {Func: rpcSetNameConfig, Params: []string{"deviceName"}}, + "getNameConfig": {Func: rpcGetNameConfig}, "getDevModeState": {Func: rpcGetDevModeState}, "setDevModeState": {Func: rpcSetDevModeState, Params: []string{"enabled"}}, "getSSHKeyState": {Func: rpcGetSSHKeyState}, diff --git a/network.go b/network.go index a5dbf33..0b2091d 100644 --- a/network.go +++ b/network.go @@ -113,6 +113,13 @@ func checkNetworkState() { } } +func RestartMDNS() { + err := startMDNS() + if err != nil { + return + } +} + func startMDNS() error { // If server was previously running, stop it if mDNSConn != nil { @@ -126,7 +133,7 @@ func startMDNS() error { // Start a new server //fmt.Printf("Starting mDNS server on jetkvm.local\n") LoadConfig() - fmt.Printf("Starting mDNS server on %v\n", config.DNSName) + fmt.Printf("Starting mDNS server on %v\n", config.NameConfig.DNS) addr4, err := net.ResolveUDPAddr("udp4", mdns.DefaultAddressIPv4) if err != nil { return err @@ -148,7 +155,7 @@ func startMDNS() error { } mDNSConn, err = mdns.Server(ipv4.NewPacketConn(l4), ipv6.NewPacketConn(l6), &mdns.Config{ - LocalNames: []string{config.DNSName}, + LocalNames: []string{config.NameConfig.DNS}, //LocalNames: []string{"jetkvm.local"}, //TODO: make it configurable }) if err != nil { diff --git a/ui/src/components/sidebar/settings.tsx b/ui/src/components/sidebar/settings.tsx index a9f060c..0a9074b 100644 --- a/ui/src/components/sidebar/settings.tsx +++ b/ui/src/components/sidebar/settings.tsx @@ -1,6 +1,6 @@ import SidebarHeader from "@components/SidebarHeader"; import { - BacklightSettings, + BacklightSettings, NameConfig, useLocalAuthModalStore, useSettingsStore, useUiStore, @@ -90,6 +90,10 @@ export default function SettingsSidebar() { const [isAdopted, setAdopted] = useState(false); const [deviceId, setDeviceId] = useState(null); + const [nameConfig, setNameConfig] = useState({ + name: '', + dns: '', + }); const [sshKey, setSSHKey] = useState(""); const [localDevice, setLocalDevice] = useState(null); @@ -99,7 +103,6 @@ export default function SettingsSidebar() { const hideCursor = useSettingsStore(state => state.isCursorHidden); const setHideCursor = useSettingsStore(state => state.setCursorVisibility); const setDeveloperMode = useSettingsStore(state => state.setDeveloperMode); - const setDeviceName = useSettingsStore(state => state.setDeviceName); const setBacklightSettings = useSettingsStore(state => state.setBacklightSettings); const [currentVersions, setCurrentVersions] = useState<{ @@ -177,17 +180,23 @@ export default function SettingsSidebar() { }; const handleDeviceNameChange = (deviceName: string) => { - send("setDeviceName", { deviceName }, resp => { + setNameConfig({... nameConfig, name: deviceName}) + }; + + const handleUpdateNameConfig = useCallback(() => { + send("setNameConfig", { deviceName: nameConfig.name }, resp => { if ("error" in resp) { notifications.error( - `Failed to set device name: ${resp.error.data || "Unknown error"}`, + `Failed to set name config: ${resp.error.data || "Unknown error"}`, ); return; } - setDeviceName(deviceName); - document.title = deviceName; + const rNameConfig = resp.result as NameConfig; + setNameConfig(rNameConfig) + document.title = rNameConfig.name; + notifications.success(`Device name set to "${rNameConfig.name}" successfully.\nDNS Name set to "${rNameConfig.dns}"`); }); - }; + }, [send, nameConfig]); const handleDevChannelChange = (enabled: boolean) => { send("setDevChannelState", { enabled }, resp => { @@ -355,15 +364,13 @@ export default function SettingsSidebar() { setBacklightSettings(result); }) - send("getDeviceName", {}, resp => { + send("getNameConfig", {}, resp => { if ("error" in resp) return; - const deviceName = resp.result as string; - setDeviceName(deviceName); - document.title = deviceName; + const results = resp.result as NameConfig; + setNameConfig(results); + document.title = results.name; }); - - send("getDevModeState", {}, resp => { if ("error" in resp) return; const result = resp.result as { enabled: boolean }; @@ -863,7 +870,8 @@ export default function SettingsSidebar() { required label="" placeholder="Enter Device Name" - defaultValue={settings.deviceName} + description={`DNS Name: ${nameConfig.dns}`} + defaultValue={nameConfig.name} onChange={e => handleDeviceNameChange(e.target.value)} /> @@ -872,7 +880,7 @@ export default function SettingsSidebar() { size="SM" theme="primary" text="Update Device Name" - onClick={handleDeviceNameChange} + onClick={handleUpdateNameConfig} />
diff --git a/ui/src/hooks/stores.ts b/ui/src/hooks/stores.ts index 0ede79e..bf94ea9 100644 --- a/ui/src/hooks/stores.ts +++ b/ui/src/hooks/stores.ts @@ -24,6 +24,11 @@ export type AvailableSidebarViews = "system" | "connection-stats"; export type AvailableModalViews = "connection-stats" | "settings"; export type AvailableTerminalTypes = "kvm" | "serial" | "none"; +export interface NameConfig { + name: string; + dns: string; +} + export interface User { sub: string; email?: string; @@ -278,9 +283,6 @@ interface SettingsState { developerMode: boolean; setDeveloperMode: (enabled: boolean) => void; - deviceName: string; - setDeviceName: (deviceName: string) => void; - backlightSettings: BacklightSettings; setBacklightSettings: (settings: BacklightSettings) => void; } @@ -301,9 +303,6 @@ export const useSettingsStore = create( developerMode: false, setDeveloperMode: enabled => set({ developerMode: enabled }), - deviceName: "JetKVM", - setDeviceName: deviceName => set({ deviceName: deviceName }), - backlightSettings: { max_brightness: 100, dim_after: 10000,