mirror of https://github.com/jetkvm/kvm.git
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:
parent
10af116404
commit
68a1b152f7
20
config.go
20
config.go
|
@ -12,6 +12,11 @@ type WakeOnLanDevice struct {
|
||||||
MacAddress string `json:"macAddress"`
|
MacAddress string `json:"macAddress"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type NameConfig struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
DNS string `json:"dns"`
|
||||||
|
}
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
CloudURL string `json:"cloud_url"`
|
CloudURL string `json:"cloud_url"`
|
||||||
CloudToken string `json:"cloud_token"`
|
CloudToken string `json:"cloud_token"`
|
||||||
|
@ -25,8 +30,7 @@ type Config struct {
|
||||||
WakeOnLanDevices []WakeOnLanDevice `json:"wake_on_lan_devices"`
|
WakeOnLanDevices []WakeOnLanDevice `json:"wake_on_lan_devices"`
|
||||||
EdidString string `json:"hdmi_edid_string"`
|
EdidString string `json:"hdmi_edid_string"`
|
||||||
ActiveExtension string `json:"active_extension"`
|
ActiveExtension string `json:"active_extension"`
|
||||||
DeviceName string `json:"device_name"`
|
NameConfig NameConfig `json:"name_config"`
|
||||||
DNSName string `json:"dns_name"`
|
|
||||||
DisplayMaxBrightness int `json:"display_max_brightness"`
|
DisplayMaxBrightness int `json:"display_max_brightness"`
|
||||||
DisplayDimAfterSec int `json:"display_dim_after_sec"`
|
DisplayDimAfterSec int `json:"display_dim_after_sec"`
|
||||||
DisplayOffAfterSec int `json:"display_off_after_sec"`
|
DisplayOffAfterSec int `json:"display_off_after_sec"`
|
||||||
|
@ -35,11 +39,13 @@ type Config struct {
|
||||||
const configPath = "/userdata/kvm_config.json"
|
const configPath = "/userdata/kvm_config.json"
|
||||||
|
|
||||||
var defaultConfig = &Config{
|
var defaultConfig = &Config{
|
||||||
CloudURL: "https://api.jetkvm.com",
|
CloudURL: "https://api.jetkvm.com",
|
||||||
AutoUpdateEnabled: true, // Set a default value
|
AutoUpdateEnabled: true, // Set a default value
|
||||||
ActiveExtension: "",
|
ActiveExtension: "",
|
||||||
DeviceName: "JetKVM",
|
NameConfig: NameConfig{
|
||||||
DNSName: "jetkvm.local",
|
Name: "JetKVM",
|
||||||
|
DNS: "jetkvm.local",
|
||||||
|
},
|
||||||
DisplayMaxBrightness: 64,
|
DisplayMaxBrightness: 64,
|
||||||
DisplayDimAfterSec: 120, // 2 minutes
|
DisplayDimAfterSec: 120, // 2 minutes
|
||||||
DisplayOffAfterSec: 1800, // 30 minutes
|
DisplayOffAfterSec: 1800, // 30 minutes
|
||||||
|
|
36
jsonrpc.go
36
jsonrpc.go
|
@ -44,6 +44,11 @@ type BacklightSettings struct {
|
||||||
OffAfter int `json:"off_after"`
|
OffAfter int `json:"off_after"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type NameSettings struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
DNS string `json:"dns"`
|
||||||
|
}
|
||||||
|
|
||||||
func writeJSONRPCResponse(response JSONRPCResponse, session *Session) {
|
func writeJSONRPCResponse(response JSONRPCResponse, session *Session) {
|
||||||
responseBytes, err := json.Marshal(response)
|
responseBytes, err := json.Marshal(response)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -294,28 +299,28 @@ type SSHKeyState struct {
|
||||||
SSHKey string `json:"sshKey"`
|
SSHKey string `json:"sshKey"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func rpcGetDeviceName() (string, error) {
|
func rpcGetNameConfig() (NameConfig, error) {
|
||||||
LoadConfig()
|
LoadConfig()
|
||||||
return config.DeviceName, nil
|
return config.NameConfig, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func rpcSetDeviceName(deviceName string) error {
|
func rpcSetNameConfig(deviceName string) (NameConfig, error) {
|
||||||
LoadConfig()
|
LoadConfig()
|
||||||
config.DeviceName = deviceName
|
config.NameConfig = NameConfig{
|
||||||
config.DNSName = slug.Make(deviceName)
|
Name: deviceName,
|
||||||
|
DNS: slug.Make(deviceName),
|
||||||
|
}
|
||||||
|
|
||||||
|
RestartMDNS()
|
||||||
|
|
||||||
err := SaveConfig()
|
err := SaveConfig()
|
||||||
if err != nil {
|
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)
|
nameConfig := config.NameConfig
|
||||||
return nil
|
log.Printf("[jsonrpc.go:rpcSetNameConfig] device name set to %s, dns name set to %s", nameConfig.Name, nameConfig.DNS)
|
||||||
}
|
return nameConfig, nil
|
||||||
|
|
||||||
func rpcGetDNSName() (string, error) {
|
|
||||||
LoadConfig()
|
|
||||||
return config.DNSName, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func rpcGetDevModeState() (DevModeState, error) {
|
func rpcGetDevModeState() (DevModeState, error) {
|
||||||
|
@ -780,9 +785,8 @@ var rpcHandlers = map[string]RPCHandler{
|
||||||
"setDevChannelState": {Func: rpcSetDevChannelState, Params: []string{"enabled"}},
|
"setDevChannelState": {Func: rpcSetDevChannelState, Params: []string{"enabled"}},
|
||||||
"getUpdateStatus": {Func: rpcGetUpdateStatus},
|
"getUpdateStatus": {Func: rpcGetUpdateStatus},
|
||||||
"tryUpdate": {Func: rpcTryUpdate},
|
"tryUpdate": {Func: rpcTryUpdate},
|
||||||
"getDeviceName": {Func: rpcGetDeviceName},
|
"setNameConfig": {Func: rpcSetNameConfig, Params: []string{"deviceName"}},
|
||||||
"setDeviceName": {Func: rpcSetDeviceName, Params: []string{"deviceName"}},
|
"getNameConfig": {Func: rpcGetNameConfig},
|
||||||
"getDNSName": {Func: rpcGetDNSName},
|
|
||||||
"getDevModeState": {Func: rpcGetDevModeState},
|
"getDevModeState": {Func: rpcGetDevModeState},
|
||||||
"setDevModeState": {Func: rpcSetDevModeState, Params: []string{"enabled"}},
|
"setDevModeState": {Func: rpcSetDevModeState, Params: []string{"enabled"}},
|
||||||
"getSSHKeyState": {Func: rpcGetSSHKeyState},
|
"getSSHKeyState": {Func: rpcGetSSHKeyState},
|
||||||
|
|
11
network.go
11
network.go
|
@ -113,6 +113,13 @@ func checkNetworkState() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RestartMDNS() {
|
||||||
|
err := startMDNS()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func startMDNS() error {
|
func startMDNS() error {
|
||||||
// If server was previously running, stop it
|
// If server was previously running, stop it
|
||||||
if mDNSConn != nil {
|
if mDNSConn != nil {
|
||||||
|
@ -126,7 +133,7 @@ func startMDNS() error {
|
||||||
// Start a new server
|
// Start a new server
|
||||||
//fmt.Printf("Starting mDNS server on jetkvm.local\n")
|
//fmt.Printf("Starting mDNS server on jetkvm.local\n")
|
||||||
LoadConfig()
|
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)
|
addr4, err := net.ResolveUDPAddr("udp4", mdns.DefaultAddressIPv4)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -148,7 +155,7 @@ func startMDNS() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
mDNSConn, err = mdns.Server(ipv4.NewPacketConn(l4), ipv6.NewPacketConn(l6), &mdns.Config{
|
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
|
//LocalNames: []string{"jetkvm.local"}, //TODO: make it configurable
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import SidebarHeader from "@components/SidebarHeader";
|
import SidebarHeader from "@components/SidebarHeader";
|
||||||
import {
|
import {
|
||||||
BacklightSettings,
|
BacklightSettings, NameConfig,
|
||||||
useLocalAuthModalStore,
|
useLocalAuthModalStore,
|
||||||
useSettingsStore,
|
useSettingsStore,
|
||||||
useUiStore,
|
useUiStore,
|
||||||
|
@ -90,6 +90,10 @@ export default function SettingsSidebar() {
|
||||||
|
|
||||||
const [isAdopted, setAdopted] = useState(false);
|
const [isAdopted, setAdopted] = useState(false);
|
||||||
const [deviceId, setDeviceId] = useState<string | null>(null);
|
const [deviceId, setDeviceId] = useState<string | null>(null);
|
||||||
|
const [nameConfig, setNameConfig] = useState<NameConfig>({
|
||||||
|
name: '',
|
||||||
|
dns: '',
|
||||||
|
});
|
||||||
|
|
||||||
const [sshKey, setSSHKey] = useState<string>("");
|
const [sshKey, setSSHKey] = useState<string>("");
|
||||||
const [localDevice, setLocalDevice] = useState<LocalDevice | null>(null);
|
const [localDevice, setLocalDevice] = useState<LocalDevice | null>(null);
|
||||||
|
@ -99,7 +103,6 @@ export default function SettingsSidebar() {
|
||||||
const hideCursor = useSettingsStore(state => state.isCursorHidden);
|
const hideCursor = useSettingsStore(state => state.isCursorHidden);
|
||||||
const setHideCursor = useSettingsStore(state => state.setCursorVisibility);
|
const setHideCursor = useSettingsStore(state => state.setCursorVisibility);
|
||||||
const setDeveloperMode = useSettingsStore(state => state.setDeveloperMode);
|
const setDeveloperMode = useSettingsStore(state => state.setDeveloperMode);
|
||||||
const setDeviceName = useSettingsStore(state => state.setDeviceName);
|
|
||||||
const setBacklightSettings = useSettingsStore(state => state.setBacklightSettings);
|
const setBacklightSettings = useSettingsStore(state => state.setBacklightSettings);
|
||||||
|
|
||||||
const [currentVersions, setCurrentVersions] = useState<{
|
const [currentVersions, setCurrentVersions] = useState<{
|
||||||
|
@ -177,17 +180,23 @@ export default function SettingsSidebar() {
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleDeviceNameChange = (deviceName: string) => {
|
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) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(
|
||||||
`Failed to set device name: ${resp.error.data || "Unknown error"}`,
|
`Failed to set name config: ${resp.error.data || "Unknown error"}`,
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setDeviceName(deviceName);
|
const rNameConfig = resp.result as NameConfig;
|
||||||
document.title = deviceName;
|
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) => {
|
const handleDevChannelChange = (enabled: boolean) => {
|
||||||
send("setDevChannelState", { enabled }, resp => {
|
send("setDevChannelState", { enabled }, resp => {
|
||||||
|
@ -355,15 +364,13 @@ export default function SettingsSidebar() {
|
||||||
setBacklightSettings(result);
|
setBacklightSettings(result);
|
||||||
})
|
})
|
||||||
|
|
||||||
send("getDeviceName", {}, resp => {
|
send("getNameConfig", {}, resp => {
|
||||||
if ("error" in resp) return;
|
if ("error" in resp) return;
|
||||||
const deviceName = resp.result as string;
|
const results = resp.result as NameConfig;
|
||||||
setDeviceName(deviceName);
|
setNameConfig(results);
|
||||||
document.title = deviceName;
|
document.title = results.name;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
send("getDevModeState", {}, resp => {
|
send("getDevModeState", {}, resp => {
|
||||||
if ("error" in resp) return;
|
if ("error" in resp) return;
|
||||||
const result = resp.result as { enabled: boolean };
|
const result = resp.result as { enabled: boolean };
|
||||||
|
@ -863,7 +870,8 @@ export default function SettingsSidebar() {
|
||||||
required
|
required
|
||||||
label=""
|
label=""
|
||||||
placeholder="Enter Device Name"
|
placeholder="Enter Device Name"
|
||||||
defaultValue={settings.deviceName}
|
description={`DNS Name: ${nameConfig.dns}`}
|
||||||
|
defaultValue={nameConfig.name}
|
||||||
onChange={e => handleDeviceNameChange(e.target.value)}
|
onChange={e => handleDeviceNameChange(e.target.value)}
|
||||||
/>
|
/>
|
||||||
</SettingsItem>
|
</SettingsItem>
|
||||||
|
@ -872,7 +880,7 @@ export default function SettingsSidebar() {
|
||||||
size="SM"
|
size="SM"
|
||||||
theme="primary"
|
theme="primary"
|
||||||
text="Update Device Name"
|
text="Update Device Name"
|
||||||
onClick={handleDeviceNameChange}
|
onClick={handleUpdateNameConfig}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="h-[1px] w-full bg-slate-800/10 dark:bg-slate-300/20"/>
|
<div className="h-[1px] w-full bg-slate-800/10 dark:bg-slate-300/20"/>
|
||||||
|
|
|
@ -24,6 +24,11 @@ export type AvailableSidebarViews = "system" | "connection-stats";
|
||||||
export type AvailableModalViews = "connection-stats" | "settings";
|
export type AvailableModalViews = "connection-stats" | "settings";
|
||||||
export type AvailableTerminalTypes = "kvm" | "serial" | "none";
|
export type AvailableTerminalTypes = "kvm" | "serial" | "none";
|
||||||
|
|
||||||
|
export interface NameConfig {
|
||||||
|
name: string;
|
||||||
|
dns: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface User {
|
export interface User {
|
||||||
sub: string;
|
sub: string;
|
||||||
email?: string;
|
email?: string;
|
||||||
|
@ -278,9 +283,6 @@ interface SettingsState {
|
||||||
developerMode: boolean;
|
developerMode: boolean;
|
||||||
setDeveloperMode: (enabled: boolean) => void;
|
setDeveloperMode: (enabled: boolean) => void;
|
||||||
|
|
||||||
deviceName: string;
|
|
||||||
setDeviceName: (deviceName: string) => void;
|
|
||||||
|
|
||||||
backlightSettings: BacklightSettings;
|
backlightSettings: BacklightSettings;
|
||||||
setBacklightSettings: (settings: BacklightSettings) => void;
|
setBacklightSettings: (settings: BacklightSettings) => void;
|
||||||
}
|
}
|
||||||
|
@ -301,9 +303,6 @@ export const useSettingsStore = create(
|
||||||
developerMode: false,
|
developerMode: false,
|
||||||
setDeveloperMode: enabled => set({ developerMode: enabled }),
|
setDeveloperMode: enabled => set({ developerMode: enabled }),
|
||||||
|
|
||||||
deviceName: "JetKVM",
|
|
||||||
setDeviceName: deviceName => set({ deviceName: deviceName }),
|
|
||||||
|
|
||||||
backlightSettings: {
|
backlightSettings: {
|
||||||
max_brightness: 100,
|
max_brightness: 100,
|
||||||
dim_after: 10000,
|
dim_after: 10000,
|
||||||
|
|
Loading…
Reference in New Issue