Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 29 additions & 1 deletion config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package kvm
import (
"encoding/json"
"fmt"
"io"
"os"
"strconv"
"strings"
Expand Down Expand Up @@ -176,6 +177,7 @@ var (
RelativeMouse: true,
Keyboard: true,
MassStorage: true,
Audio: true,
}
)

Expand Down Expand Up @@ -260,8 +262,15 @@ func LoadConfig() {
defer file.Close()

// load and merge the default config with the user config
rawConfig, err := io.ReadAll(file)
if err != nil {
logger.Warn().Err(err).Msg("config file reading failed")
configSuccess.Set(0.0)
return
}

loadedConfig := defaultConfig
if err := json.NewDecoder(file).Decode(&loadedConfig); err != nil {
if err := json.Unmarshal(rawConfig, &loadedConfig); err != nil {
logger.Warn().Err(err).Msg("config file JSON parsing failed")
configSuccess.Set(0.0)
return
Expand All @@ -274,6 +283,12 @@ func LoadConfig() {

if loadedConfig.UsbDevices == nil {
loadedConfig.UsbDevices = getDefaultConfig().UsbDevices
} else if !usbDevicesConfigHasAudio(rawConfig) {
loadedConfig.UsbDevices.Audio = defaultUsbDevices.Audio
}

if !loadedConfig.UsbDevices.Audio {
loadedConfig.AudioEnabled = false
}

if loadedConfig.NetworkConfig == nil {
Expand Down Expand Up @@ -322,6 +337,19 @@ func LoadConfig() {
logger.Info().Str("path", configPath).Msg("config loaded")
}

func usbDevicesConfigHasAudio(rawConfig []byte) bool {
var payload struct {
UsbDevices map[string]json.RawMessage `json:"usb_devices"`
}

if err := json.Unmarshal(rawConfig, &payload); err != nil || payload.UsbDevices == nil {
return true
}

_, ok := payload.UsbDevices["audio"]
return ok
}

func SaveConfig() error {
return saveConfig(configPath)
}
Expand Down
2 changes: 2 additions & 0 deletions internal/usbgadget/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ func (u *UsbGadget) isGadgetConfigItemEnabled(itemKey string) bool {
return u.enabledDevices.MassStorage
case "serial_console":
return u.enabledDevices.SerialConsole
case "audio":
return u.enabledDevices.Audio
default:
return true
}
Expand Down
24 changes: 24 additions & 0 deletions internal/usbgadget/config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package usbgadget

import "testing"

func TestAudioGadgetConfigFollowsEnabledDevice(t *testing.T) {
u := &UsbGadget{enabledDevices: Devices{Audio: false}}
if u.isGadgetConfigItemEnabled("audio") {
t.Fatal("audio gadget should be disabled when audio device is disabled")
}

u.enabledDevices.Audio = true
if !u.isGadgetConfigItemEnabled("audio") {
t.Fatal("audio gadget should be enabled when audio device is enabled")
}
}

func TestBaseGadgetConfigItemsAlwaysEnabled(t *testing.T) {
u := &UsbGadget{}
for _, item := range []string{"base", "base_info", "wake_hid"} {
if !u.isGadgetConfigItemEnabled(item) {
t.Fatalf("%s should always be enabled", item)
}
}
}
2 changes: 2 additions & 0 deletions internal/usbgadget/usbgadget.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ type Devices struct {
Keyboard bool `json:"keyboard"`
MassStorage bool `json:"mass_storage"`
SerialConsole bool `json:"serial_console"`
Audio bool `json:"audio"`
}

// Config is a struct that represents the customizations for a USB gadget.
Expand All @@ -41,6 +42,7 @@ var defaultUsbGadgetDevices = Devices{
RelativeMouse: true,
Keyboard: true,
MassStorage: true,
Audio: false,
}

type KeysDownState struct {
Expand Down
33 changes: 29 additions & 4 deletions jsonrpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -380,10 +380,21 @@ func rpcGetAudioConfig() (*AudioConfig, error) {
}

func rpcSetAudioConfig(params AudioConfig) error {
if config.AudioEnabled == params.Enabled {
enabled := params.Enabled
if enabled && (config.UsbDevices == nil || !config.UsbDevices.Audio) {
enabled = false
}
if config.AudioEnabled == enabled {
return nil
}
config.AudioEnabled = params.Enabled
config.AudioEnabled = enabled
if !effectiveAudioEnabled() {
stopAudio()
}
if gadget != nil {
gadget.SetGadgetDevices(effectiveUsbDevices())
return updateUsbRelatedConfig()
}
Comment thread
cursor[bot] marked this conversation as resolved.
if err := SaveConfig(); err != nil {
return fmt.Errorf("failed to save config: %w", err)
}
Expand Down Expand Up @@ -982,8 +993,14 @@ func updateUsbRelatedConfig() error {
}

func rpcSetUsbDevices(usbDevices usbgadget.Devices) error {
if !usbDevices.Audio {
config.AudioEnabled = false
}
config.UsbDevices = &usbDevices
gadget.SetGadgetDevices(config.UsbDevices)
if !effectiveAudioEnabled() {
stopAudio()
}
gadget.SetGadgetDevices(effectiveUsbDevices())
return updateUsbRelatedConfig()
}

Expand All @@ -999,10 +1016,18 @@ func rpcSetUsbDeviceState(device string, enabled bool) error {
config.UsbDevices.MassStorage = enabled
case "serialConsole":
config.UsbDevices.SerialConsole = enabled
case "audio":
config.UsbDevices.Audio = enabled
if !enabled {
config.AudioEnabled = false
}
default:
return fmt.Errorf("invalid device: %s", device)
}
gadget.SetGadgetDevices(config.UsbDevices)
if !effectiveAudioEnabled() {
stopAudio()
}
gadget.SetGadgetDevices(effectiveUsbDevices())
return updateUsbRelatedConfig()
}

Expand Down
3 changes: 3 additions & 0 deletions ui/e2e/remote-agent/ra-all.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1741,6 +1741,9 @@ test.describe("Remote Host Agent", () => {
await freshPage.goto("/", { waitUntil: "networkidle" });
await waitForWebRTCReady(freshPage);

const readyEvents = await waitForKeyboardReady(agent!, freshPage, 15000);
expect(readyEvents.length, "keyboard should work before disconnect test").toBeGreaterThan(0);

await agent!.clearKeyboardEvents();

await sendKeypress(freshPage, 0xe1, true);
Expand Down
6 changes: 5 additions & 1 deletion ui/localization/messages/cy.json
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,8 @@
"audio_enable_title": "Galluogi sain",
"audio_page_description": "Ffrydio sain o'r gwesteiwr i'ch porwr",
"audio_title": "Sain",
"audio_usb_device_disabled_hint": "Mae USB Audio wedi'i ddiffodd yn Nyfeisiau USB.",
"audio_usb_device_disabled_link": "Galluogwch ef yn y gosodiadau caledwedd.",
"auth_authentication_mode": "Dewiswch fodd dilysu",
"auth_authentication_mode_error": "Digwyddodd gwall wrth osod y modd dilysu",
"auth_authentication_mode_invalid": "Modd dilysu annilys",
Expand Down Expand Up @@ -973,6 +975,8 @@
"usb_device_description": "Dyfeisiau USB i'w hefelychu ar y cyfrifiadur targed",
"usb_device_enable_absolute_mouse_description": "Galluogi Llygoden Absoliwt (Pwyntydd)",
"usb_device_enable_absolute_mouse_title": "Galluogi Llygoden Absoliwt (Pwyntydd)",
"usb_device_enable_audio_description": "Caniatáu i JetKVM gyflwyno dyfais sain pan fydd Audio wedi'i alluogi.",
"usb_device_enable_audio_title": "Galluogi USB Audio",
"usb_device_enable_keyboard_description": "Galluogi Bysellfwrdd",
"usb_device_enable_keyboard_title": "Galluogi Bysellfwrdd",
"usb_device_enable_mass_storage_description": "Weithiau efallai y bydd angen ei analluogi i osgoi problemau gyda rhai dyfeisiau",
Expand All @@ -983,7 +987,7 @@
"usb_device_enable_serial_console_title": "Galluogi Consol Cyfresol USB",
"usb_device_failed_load": "Methwyd â llwytho dyfeisiau USB: {error}",
"usb_device_failed_set": "Methwyd â gosod dyfeisiau USB: {error}",
"usb_device_keyboard_mouse_and_mass_storage": "Bysellfwrdd, Llygoden a Storfa Dorfol",
"usb_device_keyboard_mouse_mass_storage_and_audio": "Bysellfwrdd, llygoden, storfa dorfol a sain",
"usb_device_keyboard_only": "Bysellfwrdd yn Unig",
"usb_device_restore_default": "Adfer i'r Rhagosodiad",
"usb_device_title": "Dyfais USB",
Expand Down
6 changes: 5 additions & 1 deletion ui/localization/messages/da.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@
"audio_enable_title": "Aktivér lyd",
"audio_page_description": "Stream lyd fra værten til din browser",
"audio_title": "Lyd",
"audio_usb_device_disabled_hint": "USB-lyd er slået fra i USB-enheder.",
"audio_usb_device_disabled_link": "Aktivér det i hardwareindstillingerne.",
"auth_authentication_mode": "Vælg venligst en godkendelsestilstand",
"auth_authentication_mode_error": "Der opstod en fejl under indstilling af godkendelsestilstanden",
"auth_authentication_mode_invalid": "Ugyldig godkendelsestilstand",
Expand Down Expand Up @@ -986,6 +988,8 @@
"usb_device_description": "USB-enheder, der skal emuleres på målcomputeren",
"usb_device_enable_absolute_mouse_description": "Aktivér absolut mus (markør)",
"usb_device_enable_absolute_mouse_title": "Aktivér absolut mus (markør)",
"usb_device_enable_audio_description": "Tillad JetKVM at vise en lydenhed, når lyd er aktiveret.",
"usb_device_enable_audio_title": "Aktivér USB-lyd",
"usb_device_enable_keyboard_description": "Aktivér tastatur",
"usb_device_enable_keyboard_title": "Aktivér tastatur",
"usb_device_enable_mass_storage_description": "Nogle gange skal det muligvis deaktiveres for at forhindre problemer med bestemte enheder.",
Expand All @@ -996,7 +1000,7 @@
"usb_device_enable_serial_console_title": "Aktivér USB-seriel konsol",
"usb_device_failed_load": "Kunne ikke indlæse USB-enheder: {error}",
"usb_device_failed_set": "Kunne ikke indstille USB-enheder: {error}",
"usb_device_keyboard_mouse_and_mass_storage": "Tastatur, mus og masselagring",
"usb_device_keyboard_mouse_mass_storage_and_audio": "Tastatur, mus, masselagring og lyd",
"usb_device_keyboard_only": "Kun tastatur",
"usb_device_restore_default": "Gendan til standard",
"usb_device_title": "USB-enhed",
Expand Down
6 changes: 5 additions & 1 deletion ui/localization/messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@
"audio_enable_title": "Audio aktivieren",
"audio_page_description": "Audio vom Host an Ihren Browser streamen",
"audio_title": "Audio",
"audio_usb_device_disabled_hint": "USB-Audio ist unter USB-Geräte deaktiviert.",
"audio_usb_device_disabled_link": "Aktivieren Sie es in den Hardware-Einstellungen.",
"auth_authentication_mode": "Bitte wählen Sie einen Authentifizierungsmodus",
"auth_authentication_mode_error": "Beim Einstellen des Authentifizierungsmodus ist ein Fehler aufgetreten",
"auth_authentication_mode_invalid": "Ungültiger Authentifizierungsmodus",
Expand Down Expand Up @@ -986,6 +988,8 @@
"usb_device_description": "USB-Geräte zum Emulieren auf dem Zielcomputer",
"usb_device_enable_absolute_mouse_description": "Absolute Maus (Zeiger) aktivieren",
"usb_device_enable_absolute_mouse_title": "Absolute Maus (Zeiger) aktivieren",
"usb_device_enable_audio_description": "JetKVM darf dem Host ein Audiogerät bereitstellen, wenn Audio aktiviert ist.",
"usb_device_enable_audio_title": "USB-Audio aktivieren",
"usb_device_enable_keyboard_description": "Tastatur aktivieren",
"usb_device_enable_keyboard_title": "Tastatur aktivieren",
"usb_device_enable_mass_storage_description": "Manchmal muss es möglicherweise deaktiviert werden, um Probleme mit bestimmten Geräten zu vermeiden",
Expand All @@ -996,7 +1000,7 @@
"usb_device_enable_serial_console_title": "USB-Serienkonsole aktivieren",
"usb_device_failed_load": "USB-Geräte konnten nicht geladen werden: {error}",
"usb_device_failed_set": "Fehler beim Festlegen der USB-Geräte: {error}",
"usb_device_keyboard_mouse_and_mass_storage": "Tastatur, Maus und Massenspeicher",
"usb_device_keyboard_mouse_mass_storage_and_audio": "Tastatur, Maus, Massenspeicher und Audio",
"usb_device_keyboard_only": "Nur Tastatur",
"usb_device_restore_default": "Auf Standard zurücksetzen",
"usb_device_title": "USB-Gerät",
Expand Down
6 changes: 5 additions & 1 deletion ui/localization/messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@
"audio_enable_title": "Enable Audio",
"audio_page_description": "Stream audio from the host to your browser",
"audio_title": "Audio",
"audio_usb_device_disabled_hint": "USB Audio is off in USB Devices.",
"audio_usb_device_disabled_link": "Enable it in Hardware settings.",
"auth_authentication_mode": "Please select an authentication mode",
"auth_authentication_mode_error": "An error occurred while setting the authentication mode",
"auth_authentication_mode_invalid": "Invalid authentication mode",
Expand Down Expand Up @@ -986,6 +988,8 @@
"usb_device_description": "USB devices to emulate on the target computer",
"usb_device_enable_absolute_mouse_description": "Enable Absolute Mouse (Pointer)",
"usb_device_enable_absolute_mouse_title": "Enable Absolute Mouse (Pointer)",
"usb_device_enable_audio_description": "Allow JetKVM to present an audio device when Audio is enabled.",
"usb_device_enable_audio_title": "Enable USB Audio",
"usb_device_enable_keyboard_description": "Enable Keyboard",
"usb_device_enable_keyboard_title": "Enable Keyboard",
"usb_device_enable_mass_storage_description": "Sometimes it might need to be disabled to prevent issues with certain devices",
Expand All @@ -996,7 +1000,7 @@
"usb_device_enable_serial_console_title": "Enable USB Serial Console",
"usb_device_failed_load": "Failed to load USB devices: {error}",
"usb_device_failed_set": "Failed to set USB devices: {error}",
"usb_device_keyboard_mouse_and_mass_storage": "Keyboard, Mouse and Mass Storage",
"usb_device_keyboard_mouse_mass_storage_and_audio": "Keyboard, Mouse, Mass Storage and Audio",
"usb_device_keyboard_only": "Keyboard Only",
"usb_device_restore_default": "Restore to Default",
"usb_device_title": "USB Device",
Expand Down
6 changes: 5 additions & 1 deletion ui/localization/messages/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@
"audio_enable_title": "Activar audio",
"audio_page_description": "Transmita el audio del host a su navegador",
"audio_title": "Audio",
"audio_usb_device_disabled_hint": "El audio USB está desactivado en Dispositivos USB.",
"audio_usb_device_disabled_link": "Actívelo en la configuración de hardware.",
"auth_authentication_mode": "Por favor seleccione un modo de autenticación",
"auth_authentication_mode_error": "Se produjo un error al configurar el modo de autenticación",
"auth_authentication_mode_invalid": "Modo de autenticación no válido",
Expand Down Expand Up @@ -986,6 +988,8 @@
"usb_device_description": "Dispositivos USB para emular en la computadora de destino",
"usb_device_enable_absolute_mouse_description": "Habilitar el puntero absoluto del ratón",
"usb_device_enable_absolute_mouse_title": "Habilitar el puntero absoluto del ratón",
"usb_device_enable_audio_description": "Permita que JetKVM presente un dispositivo de audio cuando Audio esté activado.",
"usb_device_enable_audio_title": "Activar audio USB",
"usb_device_enable_keyboard_description": "Habilitar el teclado",
"usb_device_enable_keyboard_title": "Habilitar el teclado",
"usb_device_enable_mass_storage_description": "A veces puede ser necesario desactivarlo para evitar problemas con ciertos dispositivos.",
Expand All @@ -996,7 +1000,7 @@
"usb_device_enable_serial_console_title": "Habilitar consola serie USB",
"usb_device_failed_load": "No se pudieron cargar los dispositivos USB: {error}",
"usb_device_failed_set": "No se pudieron configurar los dispositivos USB: {error}",
"usb_device_keyboard_mouse_and_mass_storage": "Teclado, ratón y almacenamiento masivo",
"usb_device_keyboard_mouse_mass_storage_and_audio": "Teclado, mouse, almacenamiento masivo y audio",
"usb_device_keyboard_only": "Sólo teclado",
"usb_device_restore_default": "Restaurar a valores predeterminados",
"usb_device_title": "Dispositivo USB",
Expand Down
6 changes: 5 additions & 1 deletion ui/localization/messages/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@
"audio_enable_title": "Activer l'audio",
"audio_page_description": "Diffuser l'audio de l'hôte vers votre navigateur",
"audio_title": "Audio",
"audio_usb_device_disabled_hint": "L'audio USB est désactivé dans les appareils USB.",
"audio_usb_device_disabled_link": "Activez-le dans les paramètres matériels.",
"auth_authentication_mode": "Veuillez sélectionner un mode d'authentification",
"auth_authentication_mode_error": "Une erreur s'est produite lors de la définition du mode d'authentification",
"auth_authentication_mode_invalid": "Mode d'authentification non valide",
Expand Down Expand Up @@ -986,6 +988,8 @@
"usb_device_description": "Périphériques USB à émuler sur l'ordinateur cible",
"usb_device_enable_absolute_mouse_description": "Activer la souris absolue (pointeur)",
"usb_device_enable_absolute_mouse_title": "Activer la souris absolue (pointeur)",
"usb_device_enable_audio_description": "Autoriser JetKVM à exposer un appareil audio à l'hôte lorsque l'audio est activé.",
"usb_device_enable_audio_title": "Activer l'audio USB",
"usb_device_enable_keyboard_description": "Activer le clavier",
"usb_device_enable_keyboard_title": "Activer le clavier",
"usb_device_enable_mass_storage_description": "Parfois, il peut être nécessaire de le désactiver pour éviter des problèmes avec certains appareils",
Expand All @@ -996,7 +1000,7 @@
"usb_device_enable_serial_console_title": "Activer la console série USB",
"usb_device_failed_load": "Échec du chargement des périphériques USB : {error}",
"usb_device_failed_set": "Échec de la configuration des périphériques USB : {error}",
"usb_device_keyboard_mouse_and_mass_storage": "Clavier, souris et stockage de masse",
"usb_device_keyboard_mouse_mass_storage_and_audio": "Clavier, souris, stockage de masse et audio",
"usb_device_keyboard_only": "Clavier uniquement",
"usb_device_restore_default": "Restaurer les paramètres par défaut",
"usb_device_title": "périphérique USB",
Expand Down
6 changes: 5 additions & 1 deletion ui/localization/messages/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@
"audio_enable_title": "Abilita audio",
"audio_page_description": "Trasmetti l'audio dell'host al browser",
"audio_title": "Audio",
"audio_usb_device_disabled_hint": "L'audio USB è disabilitato in Dispositivi USB.",
"audio_usb_device_disabled_link": "Abilitalo nelle impostazioni hardware.",
"auth_authentication_mode": "Seleziona una modalità di autenticazione",
"auth_authentication_mode_error": "Si è verificato un errore durante l'impostazione della modalità di autenticazione",
"auth_authentication_mode_invalid": "Modalità di autenticazione non valida",
Expand Down Expand Up @@ -986,6 +988,8 @@
"usb_device_description": "Dispositivi USB da emulare sul computer di destinazione",
"usb_device_enable_absolute_mouse_description": "Abilita mouse assoluto (puntatore)",
"usb_device_enable_absolute_mouse_title": "Abilita mouse assoluto (puntatore)",
"usb_device_enable_audio_description": "Consenti a JetKVM di presentare un dispositivo audio quando l'audio è abilitato.",
"usb_device_enable_audio_title": "Abilita audio USB",
"usb_device_enable_keyboard_description": "Abilita tastiera",
"usb_device_enable_keyboard_title": "Abilita tastiera",
"usb_device_enable_mass_storage_description": "A volte potrebbe essere necessario disattivarlo per evitare problemi con determinati dispositivi",
Expand All @@ -996,7 +1000,7 @@
"usb_device_enable_serial_console_title": "Abilita console seriale USB",
"usb_device_failed_load": "Impossibile caricare i dispositivi USB: {error}",
"usb_device_failed_set": "Impossibile impostare i dispositivi USB: {error}",
"usb_device_keyboard_mouse_and_mass_storage": "Tastiera, mouse e memoria di massa",
"usb_device_keyboard_mouse_mass_storage_and_audio": "Tastiera, mouse, archiviazione di massa e audio",
"usb_device_keyboard_only": "Solo tastiera",
"usb_device_restore_default": "Ripristina impostazioni predefinite",
"usb_device_title": "Dispositivo USB",
Expand Down
Loading
Loading