From d3641bb4b94bef2c04576c47b195ce65b5a3dc23 Mon Sep 17 00:00:00 2001 From: SuperQ Date: Tue, 31 Dec 2024 15:23:33 +0100 Subject: [PATCH 1/3] Chore: Fix up various linting issues In prep to add golangci-lint, fix various linting issues. * Make the `kvm` package a fully-qualified public package. Signed-off-by: SuperQ --- cloud.go | 2 +- cmd/main.go | 2 +- go.mod | 2 +- hw.go | 4 ++-- main.go | 2 +- native.go | 6 ++++-- remote_mount.go | 2 +- terminal.go | 8 +++++--- wol.go | 2 +- 9 files changed, 17 insertions(+), 13 deletions(-) diff --git a/cloud.go b/cloud.go index 1049769..a30a14c 100644 --- a/cloud.go +++ b/cloud.go @@ -150,7 +150,7 @@ func runWebsocketClient() error { if err != nil { return err } - defer c.CloseNow() + defer c.CloseNow() //nolint:errcheck cloudLogger.Infof("websocket connected to %s", wsURL) runCtx, cancelRun := context.WithCancel(context.Background()) defer cancelRun() diff --git a/cmd/main.go b/cmd/main.go index 6080aff..ab44ac9 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -1,7 +1,7 @@ package main import ( - "kvm" + "github.com/jetkvm/kvm" ) func main() { diff --git a/go.mod b/go.mod index 5748e64..6e57f47 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module kvm +module github.com/jetkvm/kvm go 1.21.0 diff --git a/hw.go b/hw.go index efe8f5c..03e9d4b 100644 --- a/hw.go +++ b/hw.go @@ -14,7 +14,7 @@ func extractSerialNumber() (string, error) { return "", err } - r, err := regexp.Compile("Serial\\s*:\\s*(\\S+)") + r, err := regexp.Compile(`Serial\s*:\s*(\S+)`) if err != nil { return "", fmt.Errorf("failed to compile regex: %w", err) } @@ -27,7 +27,7 @@ func extractSerialNumber() (string, error) { return matches[1], nil } -func readOtpEntropy() ([]byte, error) { +func readOtpEntropy() ([]byte, error) { //nolint:unused content, err := os.ReadFile("/sys/bus/nvmem/devices/rockchip-otp0/nvmem") if err != nil { return nil, err diff --git a/main.go b/main.go index 8d933e2..0673389 100644 --- a/main.go +++ b/main.go @@ -49,7 +49,7 @@ func Main() { time.Sleep(15 * time.Minute) for { logger.Debugf("UPDATING - Auto update enabled: %v", config.AutoUpdateEnabled) - if config.AutoUpdateEnabled == false { + if !config.AutoUpdateEnabled { return } if currentSession != nil { diff --git a/native.go b/native.go index 0342290..5ad4b77 100644 --- a/native.go +++ b/native.go @@ -13,6 +13,8 @@ import ( "syscall" "time" + "github.com/jetkvm/kvm/resource" + "github.com/pion/webrtc/v4/pkg/media" ) @@ -90,8 +92,8 @@ func WriteCtrlMessage(message []byte) error { return err } -var nativeCtrlSocketListener net.Listener -var nativeVideoSocketListener net.Listener +var nativeCtrlSocketListener net.Listener //nolint:unused +var nativeVideoSocketListener net.Listener //nolint:unused var ctrlClientConnected = make(chan struct{}) diff --git a/remote_mount.go b/remote_mount.go index e6e7322..5b10695 100644 --- a/remote_mount.go +++ b/remote_mount.go @@ -49,7 +49,7 @@ func (w *WebRTCDiskReader) Read(ctx context.Context, offset int64, size int64) ( if err != nil { return nil, err } - buf := make([]byte, 0) + var buf []byte for { select { case data := <-diskReadChan: diff --git a/terminal.go b/terminal.go index 1a1ac1c..3e64020 100644 --- a/terminal.go +++ b/terminal.go @@ -55,11 +55,13 @@ func handleTerminalChannel(d *webrtc.DataChannel) { var size TerminalSize err := json.Unmarshal([]byte(msg.Data), &size) if err == nil { - pty.Setsize(ptmx, &pty.Winsize{ + err = pty.Setsize(ptmx, &pty.Winsize{ Rows: uint16(size.Rows), Cols: uint16(size.Cols), }) - return + if err == nil { + return + } } logger.Errorf("Failed to parse terminal size: %v", err) } @@ -74,7 +76,7 @@ func handleTerminalChannel(d *webrtc.DataChannel) { ptmx.Close() } if cmd != nil && cmd.Process != nil { - cmd.Process.Kill() + _ = cmd.Process.Kill() } }) } diff --git a/wol.go b/wol.go index 43c9e53..f0e68bb 100644 --- a/wol.go +++ b/wol.go @@ -43,7 +43,7 @@ func createMagicPacket(mac net.HardwareAddr) []byte { // Write the target MAC address 16 times for i := 0; i < 16; i++ { - binary.Write(&buf, binary.BigEndian, mac) + _ = binary.Write(&buf, binary.BigEndian, mac) } return buf.Bytes() From 75296b4b7eb566a5d6251aae2dacc2ba02cb7ffd Mon Sep 17 00:00:00 2001 From: SuperQ Date: Sun, 5 Jan 2025 18:36:25 +0100 Subject: [PATCH 2/3] Chore: Enable golangci-lint Add a GitHub actions workflow to run golangci-lint. Signed-off-by: SuperQ --- .github/workflows/golangci-lint.yml | 34 +++++++++++++++++++++++++++++ .golangci.yml | 12 ++++++++++ display.go | 6 ++--- go.mod | 1 - go.sum | 2 -- jsonrpc.go | 13 +++++------ network.go | 2 +- ntp.go | 2 -- serial.go | 14 ++++++------ 9 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 .github/workflows/golangci-lint.yml create mode 100644 .golangci.yml diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml new file mode 100644 index 0000000..8c828cf --- /dev/null +++ b/.github/workflows/golangci-lint.yml @@ -0,0 +1,34 @@ +--- +name: golangci-lint +on: + push: + paths: + - "go.sum" + - "go.mod" + - "**.go" + - ".github/workflows/golangci-lint.yml" + - ".golangci.yml" + pull_request: + +permissions: # added using https://github.com/step-security/secure-repo + contents: read + +jobs: + golangci: + permissions: + contents: read # for actions/checkout to fetch code + pull-requests: read # for golangci/golangci-lint-action to fetch pull requests + name: lint + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Install Go + uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 + with: + go-version: 1.23.x + - name: Lint + uses: golangci/golangci-lint-action@971e284b6050e8a5849b72094c50ab08da042db8 # v6.1.1 + with: + args: --verbose + version: v1.62.0 diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..ddf4443 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,12 @@ +--- +linters: + enable: + # - goimports + # - misspell + # - revive + +issues: + exclude-rules: + - path: _test.go + linters: + - errcheck diff --git a/display.go b/display.go index 8e4ad72..f4e8cf7 100644 --- a/display.go +++ b/display.go @@ -211,7 +211,7 @@ func startBacklightTickers() { // Don't start the tickers if the display is switched off. // Set the display to off if that's the case. if config.DisplayMaxBrightness == 0 { - setDisplayBrightness(0) + _ = setDisplayBrightness(0) return } @@ -221,7 +221,7 @@ func startBacklightTickers() { defer dimTicker.Stop() go func() { - for { + for { //nolint:gosimple select { case <-dimTicker.C: tick_displayDim() @@ -236,7 +236,7 @@ func startBacklightTickers() { defer offTicker.Stop() go func() { - for { + for { //nolint:gosimple select { case <-offTicker.C: tick_displayOff() diff --git a/go.mod b/go.mod index 6e57f47..93fedab 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,6 @@ require ( github.com/gwatts/rootcerts v0.0.0-20240401182218-3ab9db955caf github.com/hanwen/go-fuse/v2 v2.5.1 github.com/hashicorp/go-envparse v0.1.0 - github.com/openstadia/go-usb-gadget v0.0.0-20231115171102-aebd56bbb965 github.com/pion/logging v0.2.2 github.com/pion/mdns/v2 v2.0.7 github.com/pion/webrtc/v4 v4.0.0 diff --git a/go.sum b/go.sum index a5ce4cd..b5769d8 100644 --- a/go.sum +++ b/go.sum @@ -87,8 +87,6 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/openstadia/go-usb-gadget v0.0.0-20231115171102-aebd56bbb965 h1:bZGtUfkOl0dqvem8ltx9KCYied0gSlRuDhaZDxgppN4= -github.com/openstadia/go-usb-gadget v0.0.0-20231115171102-aebd56bbb965/go.mod h1:6cAIK2c4O3/yETSrRjmNwsBL3yE4Vcu9M9p/Qwx5+gM= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pilebones/go-udev v0.9.0 h1:N1uEO/SxUwtIctc0WLU0t69JeBxIYEYnj8lT/Nabl9Q= diff --git a/jsonrpc.go b/jsonrpc.go index 7c06388..48ea0d4 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -195,8 +195,7 @@ func rpcSetEDID(edid string) error { // Save EDID to config, allowing it to be restored on reboot. config.EdidString = edid - SaveConfig() - + _ = SaveConfig() return nil } @@ -596,18 +595,18 @@ func rpcSetActiveExtension(extensionId string) error { return nil } if config.ActiveExtension == "atx-power" { - unmountATXControl() + _ = unmountATXControl() } else if config.ActiveExtension == "dc-power" { - unmountDCControl() + _ = unmountDCControl() } config.ActiveExtension = extensionId if err := SaveConfig(); err != nil { return fmt.Errorf("failed to save config: %w", err) } if extensionId == "atx-power" { - mountATXControl() + _ = mountATXControl() } else if extensionId == "dc-power" { - mountDCControl() + _ = mountDCControl() } return nil } @@ -728,7 +727,7 @@ func rpcSetSerialSettings(settings SerialSettings) error { Parity: parity, } - port.SetMode(serialPortMode) + _ = port.SetMode(serialPortMode) return nil } diff --git a/network.go b/network.go index 339f71c..66b8616 100644 --- a/network.go +++ b/network.go @@ -107,7 +107,7 @@ func checkNetworkState() { if newState != networkState { logger.Info("network state changed") // restart MDNS - startMDNS() + _ = startMDNS() networkState = newState requestDisplayUpdate() } diff --git a/ntp.go b/ntp.go index 06cb201..39ea7af 100644 --- a/ntp.go +++ b/ntp.go @@ -20,7 +20,6 @@ const ( ) var ( - timeSynced = false timeSyncRetryInterval = 0 * time.Second defaultNTPServers = []string{ "time.cloudflare.com", @@ -58,7 +57,6 @@ func TimeSyncLoop() { continue } logger.Infof("Time sync successful, now is: %v, time taken: %v", time.Now(), time.Since(start)) - timeSynced = true time.Sleep(timeSyncInterval) // after the first sync is done } } diff --git a/serial.go b/serial.go index 3ad56d3..a4ab7d5 100644 --- a/serial.go +++ b/serial.go @@ -16,14 +16,14 @@ const serialPortPath = "/dev/ttyS3" var port serial.Port func mountATXControl() error { - port.SetMode(defaultMode) + _ = port.SetMode(defaultMode) go runATXControl() return nil } func unmountATXControl() error { - reopenSerialPort() + _ = reopenSerialPort() return nil } @@ -122,13 +122,13 @@ func pressATXResetButton(duration time.Duration) error { } func mountDCControl() error { - port.SetMode(defaultMode) + _ = port.SetMode(defaultMode) go runDCControl() return nil } func unmountDCControl() error { - reopenSerialPort() + _ = reopenSerialPort() return nil } @@ -212,11 +212,11 @@ var defaultMode = &serial.Mode{ } func initSerialPort() { - reopenSerialPort() + _ = reopenSerialPort() if config.ActiveExtension == "atx-power" { - mountATXControl() + _ = mountATXControl() } else if config.ActiveExtension == "dc-power" { - mountDCControl() + _ = mountDCControl() } } From 97ce7850565935a21daa4528c8fadb9e9880aea1 Mon Sep 17 00:00:00 2001 From: SuperQ Date: Tue, 11 Mar 2025 18:28:32 +0100 Subject: [PATCH 3/3] Fix more linter issues. Signed-off-by: SuperQ --- config.go | 3 ++- jiggler.go | 4 ---- jsonrpc.go | 3 ++- log.go | 1 - native.go | 1 - usb.go | 6 +----- usb_mass_storage.go | 11 ++++------- 7 files changed, 9 insertions(+), 20 deletions(-) diff --git a/config.go b/config.go index cfd7f5f..642f113 100644 --- a/config.go +++ b/config.go @@ -3,9 +3,10 @@ package kvm import ( "encoding/json" "fmt" - "kvm/internal/usbgadget" "os" "sync" + + "github.com/jetkvm/kvm/internal/usbgadget" ) type WakeOnLanDevice struct { diff --git a/jiggler.go b/jiggler.go index 11ce313..daec192 100644 --- a/jiggler.go +++ b/jiggler.go @@ -6,10 +6,6 @@ import ( var lastUserInput = time.Now() -func resetUserInputTime() { - lastUserInput = time.Now() -} - var jigglerEnabled = false func rpcSetJigglerState(enabled bool) { diff --git a/jsonrpc.go b/jsonrpc.go index 48ea0d4..298a810 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -5,7 +5,6 @@ import ( "encoding/json" "errors" "fmt" - "kvm/internal/usbgadget" "os" "os/exec" "path/filepath" @@ -15,6 +14,8 @@ import ( "github.com/pion/webrtc/v4" "go.bug.st/serial" + + "github.com/jetkvm/kvm/internal/usbgadget" ) type JSONRPCRequest struct { diff --git a/log.go b/log.go index dbc5f03..7718a28 100644 --- a/log.go +++ b/log.go @@ -5,5 +5,4 @@ import "github.com/pion/logging" // we use logging framework from pion // ref: https://github.com/pion/webrtc/wiki/Debugging-WebRTC var logger = logging.NewDefaultLoggerFactory().NewLogger("jetkvm") -var usbLogger = logging.NewDefaultLoggerFactory().NewLogger("usb") var cloudLogger = logging.NewDefaultLoggerFactory().NewLogger("cloud") diff --git a/native.go b/native.go index 5ad4b77..8960304 100644 --- a/native.go +++ b/native.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "io" - "kvm/resource" "net" "os" "os/exec" diff --git a/usb.go b/usb.go index 6a3c2c3..8da6737 100644 --- a/usb.go +++ b/usb.go @@ -1,7 +1,7 @@ package kvm import ( - "kvm/internal/usbgadget" + "github.com/jetkvm/kvm/internal/usbgadget" "time" ) @@ -37,10 +37,6 @@ func rpcWheelReport(wheelY int8) error { return gadget.AbsMouseWheelReport(wheelY) } -func rpcRelMouseReport(mx, my int8, buttons uint8) error { - return gadget.RelMouseReport(mx, my, buttons) -} - var usbState = "unknown" func rpcGetUSBState() (state string) { diff --git a/usb_mass_storage.go b/usb_mass_storage.go index 39e6dd9..a09a670 100644 --- a/usb_mass_storage.go +++ b/usb_mass_storage.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "io" - "kvm/resource" "net/http" "os" "path" @@ -16,14 +15,12 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/psanford/httpreadat" - "github.com/google/uuid" "github.com/pion/webrtc/v4" -) -const massStorageName = "mass_storage.usb0" + "github.com/jetkvm/kvm/resource" +) func writeFile(path string, data string) error { return os.WriteFile(path, []byte(data), 0644) @@ -65,11 +62,11 @@ func onDiskMessage(msg webrtc.DataChannelMessage) { func mountImage(imagePath string) error { err := setMassStorageImage("") if err != nil { - return fmt.Errorf("Remove Mass Storage Image Error", err) + return fmt.Errorf("Remove Mass Storage Image Error: %w", err) } err = setMassStorageImage(imagePath) if err != nil { - return fmt.Errorf("Set Mass Storage Image Error", err) + return fmt.Errorf("Set Mass Storage Image Error: %w", err) } return nil }