Compare commits

...

6 Commits

Author SHA1 Message Date
Adrian 58c5875aa7 added regex patterns on inputs 2025-01-25 19:37:31 -06:00
Adrian 682b5911e8 cleaned up logging 2025-01-25 18:25:36 -06:00
Adrian 621c333041 added logging 2025-01-25 18:17:51 -06:00
Adrian 313f78000e input fields now load previous values 2025-01-25 17:58:46 -06:00
Adrian 6a6ab143a8 changed to defaultValue 2025-01-25 17:43:55 -06:00
Adrian bffac9a6b5 cleaned up var names 2025-01-25 16:56:59 -06:00
3 changed files with 45 additions and 44 deletions

View File

@ -12,11 +12,11 @@ type WakeOnLanDevice struct {
} }
type UsbConfig struct { type UsbConfig struct {
UsbVendorId string `json:"usb_vendor_id"` VendorId string `json:"vendor_id"`
UsbProductId string `json:"usb_product_id"` ProductId string `json:"product_id"`
UsbSerialNumber string `json:"usb_serial_number"` SerialNumber string `json:"serial_number"`
UsbManufacturer string `json:"usb_manufacturer"` Manufacturer string `json:"manufacturer"`
UsbProduct string `json:"usb_product"` Product string `json:"product"`
} }
type Config struct { type Config struct {
@ -39,11 +39,11 @@ 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
UsbConfig: UsbConfig{ UsbConfig: UsbConfig{
UsbVendorId: "0x1d6b", //The Linux Foundation VendorId: "0x1d6b", //The Linux Foundation
UsbProductId: "0x0104", //Multifunction Composite Gadget¬ ProductId: "0x0104", //Multifunction Composite Gadget¬
UsbSerialNumber: "", SerialNumber: "",
UsbManufacturer: "JetKVM", Manufacturer: "JetKVM",
UsbProduct: "JetKVM USB Emulation Device", Product: "JetKVM USB Emulation Device",
}, },
} }

View File

@ -13,7 +13,7 @@ export interface UsbConfigState {
product_id: string; product_id: string;
serial_number: string; serial_number: string;
manufacturer: string; manufacturer: string;
product_name: string; product: string;
} }
export default function USBConfigDialog({ export default function USBConfigDialog({
@ -79,11 +79,11 @@ function UpdateUsbConfigModal({
error: string | null; error: string | null;
}) { }) {
const [usbConfig, setUsbConfig] = useState({ const [usbConfig, setUsbConfig] = useState({
usb_vendor_id: '', vendor_id: '',
usb_product_id: '', product_id: '',
usb_serial_number: '', serial_number: '',
usb_manufacturer: '', manufacturer: '',
usb_product: '', product: '',
}) })
const [usbConfigState, setUsbConfigState] = useState<UsbConfigState>(); const [usbConfigState, setUsbConfigState] = useState<UsbConfigState>();
@ -91,11 +91,10 @@ function UpdateUsbConfigModal({
const syncUsbConfig = useCallback(() => { const syncUsbConfig = useCallback(() => {
send("getUsbConfig", {}, resp => { send("getUsbConfig", {}, resp => {
if ("result" in resp) { if ("error" in resp) {
console.info("Successfully synced USB Config: ", resp.result);
setUsbConfigState(resp.result as UsbConfigState);
} else {
console.error("Failed to load USB Config:", resp.error); console.error("Failed to load USB Config:", resp.error);
} else {
setUsbConfigState(resp.result as UsbConfigState);
} }
}); });
}, [send, setUsbConfigState]); }, [send, setUsbConfigState]);
@ -105,24 +104,24 @@ function UpdateUsbConfigModal({
syncUsbConfig(); syncUsbConfig();
}, [syncUsbConfig]); }, [syncUsbConfig]);
const handleUsbVendorIdChange = (vendorId: string) => { const handleUsbVendorIdChange = (value: string) => {
setUsbConfig({... usbConfig, usb_vendor_id: vendorId}) setUsbConfig({... usbConfig, vendor_id: value})
}; };
const handleUsbProductIdChange = (productId: string) => { const handleUsbProductIdChange = (value: string) => {
setUsbConfig({... usbConfig, usb_product_id: productId}) setUsbConfig({... usbConfig, product_id: value})
}; };
const handleUsbSerialChange = (serialNumber: string) => { const handleUsbSerialChange = (value: string) => {
setUsbConfig({... usbConfig, usb_serial_number: serialNumber}) setUsbConfig({... usbConfig, serial_number: value})
}; };
const handleUsbManufacturer = (manufacturer: string) => { const handleUsbManufacturer = (value: string) => {
setUsbConfig({... usbConfig, usb_manufacturer: manufacturer}) setUsbConfig({... usbConfig, manufacturer: value})
}; };
const handleUsbProduct = (name: string) => { const handleUsbProduct = (value: string) => {
setUsbConfig({... usbConfig, usb_product: name}) setUsbConfig({... usbConfig, product: value})
}; };
return ( return (
@ -143,35 +142,37 @@ function UpdateUsbConfigModal({
required required
label="Vendor ID" label="Vendor ID"
placeholder="Enter Vendor ID" placeholder="Enter Vendor ID"
value={usbConfigState?.vendor_id} pattern="^0[xX][\da-fA-F]{4}$"
defaultValue={usbConfigState?.vendor_id}
onChange={e => handleUsbVendorIdChange(e.target.value)} onChange={e => handleUsbVendorIdChange(e.target.value)}
/> />
<InputFieldWithLabel <InputFieldWithLabel
required required
label="Product ID" label="Product ID"
placeholder="Enter Product ID" placeholder="Enter Product ID"
value={usbConfigState?.product_id} pattern="^0[xX][\da-fA-F]{4}$"
defaultValue={usbConfigState?.product_id}
onChange={e => handleUsbProductIdChange(e.target.value)} onChange={e => handleUsbProductIdChange(e.target.value)}
/> />
<InputFieldWithLabel <InputFieldWithLabel
required required
label="Serial Number" label="Serial Number"
placeholder="Enter Serial Number" placeholder="Enter Serial Number"
value={usbConfigState?.serial_number} defaultValue={usbConfigState?.serial_number}
onChange={e => handleUsbSerialChange(e.target.value)} onChange={e => handleUsbSerialChange(e.target.value)}
/> />
<InputFieldWithLabel <InputFieldWithLabel
required required
label="Manufacturer" label="Manufacturer"
placeholder="Enter Manufacturer" placeholder="Enter Manufacturer"
value={usbConfigState?.manufacturer} defaultValue={usbConfigState?.manufacturer}
onChange={e => handleUsbManufacturer(e.target.value)} onChange={e => handleUsbManufacturer(e.target.value)}
/> />
<InputFieldWithLabel <InputFieldWithLabel
required required
label="Product Name" label="Product Name"
placeholder="Enter Product Name" placeholder="Enter Product Name"
value={usbConfigState?.product_name} defaultValue={usbConfigState?.product}
onChange={e => handleUsbProduct(e.target.value)} onChange={e => handleUsbProduct(e.target.value)}
/> />
<div className="flex gap-x-2"> <div className="flex gap-x-2">

18
usb.go
View File

@ -61,8 +61,8 @@ func init() {
func UpdateGadgetConfig() error { func UpdateGadgetConfig() error {
LoadConfig() LoadConfig()
gadgetAttrs := [][]string{ gadgetAttrs := [][]string{
{"idVendor", config.UsbConfig.UsbVendorId}, {"idVendor", config.UsbConfig.VendorId},
{"idProduct", config.UsbConfig.UsbProductId}, {"idProduct", config.UsbConfig.ProductId},
} }
err := writeGadgetAttrs(kvmGadgetPath, gadgetAttrs) err := writeGadgetAttrs(kvmGadgetPath, gadgetAttrs)
if err != nil { if err != nil {
@ -72,9 +72,9 @@ func UpdateGadgetConfig() error {
log.Printf("Successfully updated usb gadget attributes: %v", gadgetAttrs) log.Printf("Successfully updated usb gadget attributes: %v", gadgetAttrs)
strAttrs := [][]string{ strAttrs := [][]string{
{"serialnumber", config.UsbConfig.UsbSerialNumber}, {"serialnumber", config.UsbConfig.SerialNumber},
{"manufacturer", config.UsbConfig.UsbManufacturer}, {"manufacturer", config.UsbConfig.Manufacturer},
{"product", config.UsbConfig.UsbProduct}, {"product", config.UsbConfig.Product},
} }
gadgetStringsPath := filepath.Join(kvmGadgetPath, "strings", "0x409") gadgetStringsPath := filepath.Join(kvmGadgetPath, "strings", "0x409")
err = os.MkdirAll(gadgetStringsPath, 0755) err = os.MkdirAll(gadgetStringsPath, 0755)
@ -120,8 +120,8 @@ func writeGadgetConfig() error {
LoadConfig() LoadConfig()
err = writeGadgetAttrs(kvmGadgetPath, [][]string{ err = writeGadgetAttrs(kvmGadgetPath, [][]string{
{"bcdUSB", "0x0200"}, //USB 2.0 {"bcdUSB", "0x0200"}, //USB 2.0
{"idVendor", config.UsbConfig.UsbVendorId}, {"idVendor", config.UsbConfig.VendorId},
{"idProduct", config.UsbConfig.UsbProductId}, {"idProduct", config.UsbConfig.ProductId},
{"bcdDevice", "0100"}, {"bcdDevice", "0100"},
}) })
if err != nil { if err != nil {
@ -136,8 +136,8 @@ func writeGadgetConfig() error {
err = writeGadgetAttrs(gadgetStringsPath, [][]string{ err = writeGadgetAttrs(gadgetStringsPath, [][]string{
{"serialnumber", GetDeviceID()}, {"serialnumber", GetDeviceID()},
{"manufacturer", config.UsbConfig.UsbManufacturer}, {"manufacturer", config.UsbConfig.Manufacturer},
{"product", config.UsbConfig.UsbProduct}, {"product", config.UsbConfig.Product},
}) })
if err != nil { if err != nil {
return err return err