added button to set device name

dns and device name now appears in json rpc response
dns name appears on UI
This commit is contained in:
JackTheRooster 2025-03-03 23:03:11 -06:00
parent 10af116404
commit 68a1b152f7
5 changed files with 70 additions and 46 deletions

View File

@ -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

View File

@ -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},

View File

@ -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 {

View File

@ -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<string | null>(null);
const [nameConfig, setNameConfig] = useState<NameConfig>({
name: '',
dns: '',
});
const [sshKey, setSSHKey] = useState<string>("");
const [localDevice, setLocalDevice] = useState<LocalDevice | null>(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)}
/>
</SettingsItem>
@ -872,7 +880,7 @@ export default function SettingsSidebar() {
size="SM"
theme="primary"
text="Update Device Name"
onClick={handleDeviceNameChange}
onClick={handleUpdateNameConfig}
/>
</div>
<div className="h-[1px] w-full bg-slate-800/10 dark:bg-slate-300/20"/>

View File

@ -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,