chore: Enable golangci-lint (#7)

This commit is contained in:
Aveline 2025-03-12 14:55:56 +01:00 committed by GitHub
commit 38d6f57786
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 89 additions and 56 deletions

34
.github/workflows/golangci-lint.yml vendored Normal file
View File

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

12
.golangci.yml Normal file
View File

@ -0,0 +1,12 @@
---
linters:
enable:
# - goimports
# - misspell
# - revive
issues:
exclude-rules:
- path: _test.go
linters:
- errcheck

View File

@ -150,7 +150,7 @@ func runWebsocketClient() error {
if err != nil { if err != nil {
return err return err
} }
defer c.CloseNow() defer c.CloseNow() //nolint:errcheck
cloudLogger.Infof("websocket connected to %s", wsURL) cloudLogger.Infof("websocket connected to %s", wsURL)
runCtx, cancelRun := context.WithCancel(context.Background()) runCtx, cancelRun := context.WithCancel(context.Background())
defer cancelRun() defer cancelRun()

View File

@ -1,7 +1,7 @@
package main package main
import ( import (
"kvm" "github.com/jetkvm/kvm"
) )
func main() { func main() {

View File

@ -3,9 +3,10 @@ package kvm
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"kvm/internal/usbgadget"
"os" "os"
"sync" "sync"
"github.com/jetkvm/kvm/internal/usbgadget"
) )
type WakeOnLanDevice struct { type WakeOnLanDevice struct {

View File

@ -211,7 +211,7 @@ func startBacklightTickers() {
// Don't start the tickers if the display is switched off. // Don't start the tickers if the display is switched off.
// Set the display to off if that's the case. // Set the display to off if that's the case.
if config.DisplayMaxBrightness == 0 { if config.DisplayMaxBrightness == 0 {
setDisplayBrightness(0) _ = setDisplayBrightness(0)
return return
} }
@ -221,7 +221,7 @@ func startBacklightTickers() {
defer dimTicker.Stop() defer dimTicker.Stop()
go func() { go func() {
for { for { //nolint:gosimple
select { select {
case <-dimTicker.C: case <-dimTicker.C:
tick_displayDim() tick_displayDim()
@ -236,7 +236,7 @@ func startBacklightTickers() {
defer offTicker.Stop() defer offTicker.Stop()
go func() { go func() {
for { for { //nolint:gosimple
select { select {
case <-offTicker.C: case <-offTicker.C:
tick_displayOff() tick_displayOff()

3
go.mod
View File

@ -1,4 +1,4 @@
module kvm module github.com/jetkvm/kvm
go 1.21.0 go 1.21.0
@ -15,7 +15,6 @@ require (
github.com/gwatts/rootcerts v0.0.0-20240401182218-3ab9db955caf github.com/gwatts/rootcerts v0.0.0-20240401182218-3ab9db955caf
github.com/hanwen/go-fuse/v2 v2.5.1 github.com/hanwen/go-fuse/v2 v2.5.1
github.com/hashicorp/go-envparse v0.1.0 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/logging v0.2.2
github.com/pion/mdns/v2 v2.0.7 github.com/pion/mdns/v2 v2.0.7
github.com/pion/webrtc/v4 v4.0.0 github.com/pion/webrtc/v4 v4.0.0

2
go.sum
View File

@ -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/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 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 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 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= 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= github.com/pilebones/go-udev v0.9.0 h1:N1uEO/SxUwtIctc0WLU0t69JeBxIYEYnj8lT/Nabl9Q=

4
hw.go
View File

@ -14,7 +14,7 @@ func extractSerialNumber() (string, error) {
return "", err return "", err
} }
r, err := regexp.Compile("Serial\\s*:\\s*(\\S+)") r, err := regexp.Compile(`Serial\s*:\s*(\S+)`)
if err != nil { if err != nil {
return "", fmt.Errorf("failed to compile regex: %w", err) return "", fmt.Errorf("failed to compile regex: %w", err)
} }
@ -27,7 +27,7 @@ func extractSerialNumber() (string, error) {
return matches[1], nil 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") content, err := os.ReadFile("/sys/bus/nvmem/devices/rockchip-otp0/nvmem")
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -6,10 +6,6 @@ import (
var lastUserInput = time.Now() var lastUserInput = time.Now()
func resetUserInputTime() {
lastUserInput = time.Now()
}
var jigglerEnabled = false var jigglerEnabled = false
func rpcSetJigglerState(enabled bool) { func rpcSetJigglerState(enabled bool) {

View File

@ -5,7 +5,6 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"kvm/internal/usbgadget"
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
@ -15,6 +14,8 @@ import (
"github.com/pion/webrtc/v4" "github.com/pion/webrtc/v4"
"go.bug.st/serial" "go.bug.st/serial"
"github.com/jetkvm/kvm/internal/usbgadget"
) )
type JSONRPCRequest struct { type JSONRPCRequest struct {
@ -195,8 +196,7 @@ func rpcSetEDID(edid string) error {
// Save EDID to config, allowing it to be restored on reboot. // Save EDID to config, allowing it to be restored on reboot.
config.EdidString = edid config.EdidString = edid
SaveConfig() _ = SaveConfig()
return nil return nil
} }
@ -596,18 +596,18 @@ func rpcSetActiveExtension(extensionId string) error {
return nil return nil
} }
if config.ActiveExtension == "atx-power" { if config.ActiveExtension == "atx-power" {
unmountATXControl() _ = unmountATXControl()
} else if config.ActiveExtension == "dc-power" { } else if config.ActiveExtension == "dc-power" {
unmountDCControl() _ = unmountDCControl()
} }
config.ActiveExtension = extensionId config.ActiveExtension = extensionId
if err := SaveConfig(); err != nil { if err := SaveConfig(); err != nil {
return fmt.Errorf("failed to save config: %w", err) return fmt.Errorf("failed to save config: %w", err)
} }
if extensionId == "atx-power" { if extensionId == "atx-power" {
mountATXControl() _ = mountATXControl()
} else if extensionId == "dc-power" { } else if extensionId == "dc-power" {
mountDCControl() _ = mountDCControl()
} }
return nil return nil
} }
@ -728,7 +728,7 @@ func rpcSetSerialSettings(settings SerialSettings) error {
Parity: parity, Parity: parity,
} }
port.SetMode(serialPortMode) _ = port.SetMode(serialPortMode)
return nil return nil
} }

1
log.go
View File

@ -5,5 +5,4 @@ import "github.com/pion/logging"
// we use logging framework from pion // we use logging framework from pion
// ref: https://github.com/pion/webrtc/wiki/Debugging-WebRTC // ref: https://github.com/pion/webrtc/wiki/Debugging-WebRTC
var logger = logging.NewDefaultLoggerFactory().NewLogger("jetkvm") var logger = logging.NewDefaultLoggerFactory().NewLogger("jetkvm")
var usbLogger = logging.NewDefaultLoggerFactory().NewLogger("usb")
var cloudLogger = logging.NewDefaultLoggerFactory().NewLogger("cloud") var cloudLogger = logging.NewDefaultLoggerFactory().NewLogger("cloud")

View File

@ -49,7 +49,7 @@ func Main() {
time.Sleep(15 * time.Minute) time.Sleep(15 * time.Minute)
for { for {
logger.Debugf("UPDATING - Auto update enabled: %v", config.AutoUpdateEnabled) logger.Debugf("UPDATING - Auto update enabled: %v", config.AutoUpdateEnabled)
if config.AutoUpdateEnabled == false { if !config.AutoUpdateEnabled {
return return
} }
if currentSession != nil { if currentSession != nil {

View File

@ -5,7 +5,6 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
"kvm/resource"
"net" "net"
"os" "os"
"os/exec" "os/exec"
@ -13,6 +12,8 @@ import (
"syscall" "syscall"
"time" "time"
"github.com/jetkvm/kvm/resource"
"github.com/pion/webrtc/v4/pkg/media" "github.com/pion/webrtc/v4/pkg/media"
) )
@ -90,8 +91,8 @@ func WriteCtrlMessage(message []byte) error {
return err return err
} }
var nativeCtrlSocketListener net.Listener var nativeCtrlSocketListener net.Listener //nolint:unused
var nativeVideoSocketListener net.Listener var nativeVideoSocketListener net.Listener //nolint:unused
var ctrlClientConnected = make(chan struct{}) var ctrlClientConnected = make(chan struct{})

View File

@ -107,7 +107,7 @@ func checkNetworkState() {
if newState != networkState { if newState != networkState {
logger.Info("network state changed") logger.Info("network state changed")
// restart MDNS // restart MDNS
startMDNS() _ = startMDNS()
networkState = newState networkState = newState
requestDisplayUpdate() requestDisplayUpdate()
} }

2
ntp.go
View File

@ -20,7 +20,6 @@ const (
) )
var ( var (
timeSynced = false
timeSyncRetryInterval = 0 * time.Second timeSyncRetryInterval = 0 * time.Second
defaultNTPServers = []string{ defaultNTPServers = []string{
"time.cloudflare.com", "time.cloudflare.com",
@ -58,7 +57,6 @@ func TimeSyncLoop() {
continue continue
} }
logger.Infof("Time sync successful, now is: %v, time taken: %v", time.Now(), time.Since(start)) 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 time.Sleep(timeSyncInterval) // after the first sync is done
} }
} }

View File

@ -49,7 +49,7 @@ func (w *WebRTCDiskReader) Read(ctx context.Context, offset int64, size int64) (
if err != nil { if err != nil {
return nil, err return nil, err
} }
buf := make([]byte, 0) var buf []byte
for { for {
select { select {
case data := <-diskReadChan: case data := <-diskReadChan:

View File

@ -16,14 +16,14 @@ const serialPortPath = "/dev/ttyS3"
var port serial.Port var port serial.Port
func mountATXControl() error { func mountATXControl() error {
port.SetMode(defaultMode) _ = port.SetMode(defaultMode)
go runATXControl() go runATXControl()
return nil return nil
} }
func unmountATXControl() error { func unmountATXControl() error {
reopenSerialPort() _ = reopenSerialPort()
return nil return nil
} }
@ -122,13 +122,13 @@ func pressATXResetButton(duration time.Duration) error {
} }
func mountDCControl() error { func mountDCControl() error {
port.SetMode(defaultMode) _ = port.SetMode(defaultMode)
go runDCControl() go runDCControl()
return nil return nil
} }
func unmountDCControl() error { func unmountDCControl() error {
reopenSerialPort() _ = reopenSerialPort()
return nil return nil
} }
@ -212,11 +212,11 @@ var defaultMode = &serial.Mode{
} }
func initSerialPort() { func initSerialPort() {
reopenSerialPort() _ = reopenSerialPort()
if config.ActiveExtension == "atx-power" { if config.ActiveExtension == "atx-power" {
mountATXControl() _ = mountATXControl()
} else if config.ActiveExtension == "dc-power" { } else if config.ActiveExtension == "dc-power" {
mountDCControl() _ = mountDCControl()
} }
} }

View File

@ -55,12 +55,14 @@ func handleTerminalChannel(d *webrtc.DataChannel) {
var size TerminalSize var size TerminalSize
err := json.Unmarshal([]byte(msg.Data), &size) err := json.Unmarshal([]byte(msg.Data), &size)
if err == nil { if err == nil {
pty.Setsize(ptmx, &pty.Winsize{ err = pty.Setsize(ptmx, &pty.Winsize{
Rows: uint16(size.Rows), Rows: uint16(size.Rows),
Cols: uint16(size.Cols), Cols: uint16(size.Cols),
}) })
if err == nil {
return return
} }
}
logger.Errorf("Failed to parse terminal size: %v", err) logger.Errorf("Failed to parse terminal size: %v", err)
} }
_, err := ptmx.Write(msg.Data) _, err := ptmx.Write(msg.Data)
@ -74,7 +76,7 @@ func handleTerminalChannel(d *webrtc.DataChannel) {
ptmx.Close() ptmx.Close()
} }
if cmd != nil && cmd.Process != nil { if cmd != nil && cmd.Process != nil {
cmd.Process.Kill() _ = cmd.Process.Kill()
} }
}) })
} }

6
usb.go
View File

@ -1,7 +1,7 @@
package kvm package kvm
import ( import (
"kvm/internal/usbgadget" "github.com/jetkvm/kvm/internal/usbgadget"
"time" "time"
) )
@ -37,10 +37,6 @@ func rpcWheelReport(wheelY int8) error {
return gadget.AbsMouseWheelReport(wheelY) return gadget.AbsMouseWheelReport(wheelY)
} }
func rpcRelMouseReport(mx, my int8, buttons uint8) error {
return gadget.RelMouseReport(mx, my, buttons)
}
var usbState = "unknown" var usbState = "unknown"
func rpcGetUSBState() (state string) { func rpcGetUSBState() (state string) {

View File

@ -5,7 +5,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"kvm/resource"
"net/http" "net/http"
"os" "os"
"path" "path"
@ -16,14 +15,12 @@ import (
"time" "time"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/psanford/httpreadat" "github.com/psanford/httpreadat"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/pion/webrtc/v4" "github.com/pion/webrtc/v4"
)
const massStorageName = "mass_storage.usb0" "github.com/jetkvm/kvm/resource"
)
func writeFile(path string, data string) error { func writeFile(path string, data string) error {
return os.WriteFile(path, []byte(data), 0644) return os.WriteFile(path, []byte(data), 0644)
@ -65,11 +62,11 @@ func onDiskMessage(msg webrtc.DataChannelMessage) {
func mountImage(imagePath string) error { func mountImage(imagePath string) error {
err := setMassStorageImage("") err := setMassStorageImage("")
if err != nil { 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) err = setMassStorageImage(imagePath)
if err != nil { if err != nil {
return fmt.Errorf("Set Mass Storage Image Error", err) return fmt.Errorf("Set Mass Storage Image Error: %w", err)
} }
return nil return nil
} }

2
wol.go
View File

@ -43,7 +43,7 @@ func createMagicPacket(mac net.HardwareAddr) []byte {
// Write the target MAC address 16 times // Write the target MAC address 16 times
for i := 0; i < 16; i++ { for i := 0; i < 16; i++ {
binary.Write(&buf, binary.BigEndian, mac) _ = binary.Write(&buf, binary.BigEndian, mac)
} }
return buf.Bytes() return buf.Bytes()