From e5042764473c446bd42c0f74859d20edf80966ed Mon Sep 17 00:00:00 2001 From: Siyuan Miao Date: Tue, 15 Apr 2025 17:08:40 +0200 Subject: [PATCH] chore: fix linter issues --- block_device.go | 7 ++++--- display.go | 4 ++-- internal/confparser/confparser.go | 2 -- internal/confparser/confparser_test.go | 2 +- internal/confparser/utils.go | 6 +++--- internal/logging/sse.go | 1 - internal/mdns/mdns.go | 4 ++-- internal/network/config.go | 7 ++++--- internal/network/hostname.go | 23 ++++++++++++++++++----- internal/network/netif.go | 10 +++++----- internal/network/utils.go | 3 +++ internal/timesync/http.go | 12 ++++++------ internal/timesync/metrics.go | 2 +- internal/timesync/ntp.go | 8 ++++---- internal/timesync/timesync.go | 2 +- internal/udhcpc/udhcpc.go | 7 +++++-- internal/websecure/store.go | 10 +++++----- internal/websecure/utils.go | 8 ++++---- jsonrpc.go | 10 ++++++---- log.go | 5 ----- native.go | 14 -------------- native_linux.go | 15 +++++++++++++++ network.go | 6 +++--- serial.go | 5 +++-- usb_mass_storage.go | 6 +++--- web_tls.go | 17 +++++++++-------- 26 files changed, 107 insertions(+), 89 deletions(-) diff --git a/block_device.go b/block_device.go index aa1fce8..2274098 100644 --- a/block_device.go +++ b/block_device.go @@ -33,16 +33,17 @@ func (r remoteImageBackend) ReadAt(p []byte, off int64) (n int, err error) { readLen = mountedImageSize - off } var data []byte - if source == WebRTC { + switch source { + case WebRTC: data, err = webRTCDiskReader.Read(ctx, off, readLen) if err != nil { return 0, err } n = copy(p, data) return n, nil - } else if source == HTTP { + case HTTP: return httpRangeReader.ReadAt(p, off) - } else { + default: return 0, errors.New("unknown image source") } } diff --git a/display.go b/display.go index b983efc..e2e82e1 100644 --- a/display.go +++ b/display.go @@ -341,7 +341,7 @@ func startBacklightTickers() { defer dimTicker.Stop() go func() { - for { //nolint:gosimple + for { //nolint:staticcheck select { case <-dimTicker.C: tick_displayDim() @@ -356,7 +356,7 @@ func startBacklightTickers() { defer offTicker.Stop() go func() { - for { //nolint:gosimple + for { //nolint:staticcheck select { case <-offTicker.C: tick_displayOff() diff --git a/internal/confparser/confparser.go b/internal/confparser/confparser.go index aa8a991..76102a3 100644 --- a/internal/confparser/confparser.go +++ b/internal/confparser/confparser.go @@ -2,7 +2,6 @@ package confparser import ( "fmt" - "log" "net" "reflect" "slices" @@ -247,7 +246,6 @@ func (f *FieldConfig) checkIfFieldNeedsUpdate() error { } f.shouldUpdateValue = true - log.Printf("field `%s` updated to default value: %v", f.Name, f.CurrentValue) } return nil diff --git a/internal/confparser/confparser_test.go b/internal/confparser/confparser_test.go index fec90b1..dd5e00a 100644 --- a/internal/confparser/confparser_test.go +++ b/internal/confparser/confparser_test.go @@ -8,7 +8,7 @@ import ( "github.com/guregu/null/v6" ) -type testIPv6Address struct { +type testIPv6Address struct { //nolint:unused Address net.IP `json:"address"` Prefix net.IPNet `json:"prefix"` ValidLifetime *time.Time `json:"valid_lifetime"` diff --git a/internal/confparser/utils.go b/internal/confparser/utils.go index 287cfb9..a46871e 100644 --- a/internal/confparser/utils.go +++ b/internal/confparser/utils.go @@ -17,11 +17,11 @@ func splitString(s string) []string { } func toString(v interface{}) (string, error) { - switch v.(type) { + switch v := v.(type) { case string: - return v.(string), nil + return v, nil case null.String: - return v.(null.String).String, nil + return v.String, nil } return "", fmt.Errorf("unsupported type: %s", reflect.TypeOf(v)) diff --git a/internal/logging/sse.go b/internal/logging/sse.go index a466432..05e6e9e 100644 --- a/internal/logging/sse.go +++ b/internal/logging/sse.go @@ -116,7 +116,6 @@ func sseHeadersMiddleware() gin.HandlerFunc { } func AttachSSEHandler(router *gin.RouterGroup) { - router.StaticFS("/log-stream", http.FS(sseHTML)) router.GET("/log-stream", sseHeadersMiddleware(), sseServer.serveHTTP(), func(c *gin.Context) { v, ok := c.Get("clientChan") diff --git a/internal/mdns/mdns.go b/internal/mdns/mdns.go index bb6bacf..b882b93 100644 --- a/internal/mdns/mdns.go +++ b/internal/mdns/mdns.go @@ -171,7 +171,7 @@ func (m *MDNS) SetLocalNames(localNames []string, always bool) error { } m.localNames = localNames - m.Restart() + _ = m.Restart() return nil } @@ -184,7 +184,7 @@ func (m *MDNS) SetListenOptions(listenOptions *MDNSListenOptions) error { } m.listenOptions = listenOptions - m.Restart() + _ = m.Restart() return nil } diff --git a/internal/network/config.go b/internal/network/config.go index 4f6a903..74ddf19 100644 --- a/internal/network/config.go +++ b/internal/network/config.go @@ -57,11 +57,12 @@ func (c *NetworkConfig) GetMDNSMode() *mdns.MDNSListenOptions { IPv6: true, } - if mode == "ipv4_only" { + switch mode { + case "ipv4_only": listenOptions.IPv6 = false - } else if mode == "ipv6_only" { + case "ipv6_only": listenOptions.IPv4 = false - } else if mode == "disabled" { + case "disabled": listenOptions.IPv4 = false listenOptions.IPv6 = false } diff --git a/internal/network/hostname.go b/internal/network/hostname.go index 8d9286f..d75255c 100644 --- a/internal/network/hostname.go +++ b/internal/network/hostname.go @@ -29,7 +29,10 @@ func updateEtcHosts(hostname string, fqdn string) error { defer hostsFile.Close() // read all lines - hostsFile.Seek(0, io.SeekStart) + if _, err := hostsFile.Seek(0, io.SeekStart); err != nil { + return fmt.Errorf("failed to seek %s: %w", hostsPath, err) + } + lines, err := io.ReadAll(hostsFile) if err != nil { return fmt.Errorf("failed to read %s: %w", hostsPath, err) @@ -51,9 +54,17 @@ func updateEtcHosts(hostname string, fqdn string) error { newLines = append(newLines, hostLine) } - hostsFile.Truncate(0) - hostsFile.Seek(0, io.SeekStart) - hostsFile.Write([]byte(strings.Join(newLines, "\n"))) + if err := hostsFile.Truncate(0); err != nil { + return fmt.Errorf("failed to truncate %s: %w", hostsPath, err) + } + + if _, err := hostsFile.Seek(0, io.SeekStart); err != nil { + return fmt.Errorf("failed to seek %s: %w", hostsPath, err) + } + + if _, err := hostsFile.Write([]byte(strings.Join(newLines, "\n"))); err != nil { + return fmt.Errorf("failed to write %s: %w", hostsPath, err) + } return nil } @@ -82,7 +93,9 @@ func SetHostname(hostname string, fqdn string) error { } // update /etc/hostname - os.WriteFile(hostnamePath, []byte(hostname), 0644) + if err := os.WriteFile(hostnamePath, []byte(hostname), 0644); err != nil { + return fmt.Errorf("failed to write %s: %w", hostnamePath, err) + } // update /etc/hosts if err := updateEtcHosts(hostname, fqdn); err != nil { diff --git a/internal/network/netif.go b/internal/network/netif.go index a8f75d6..c5db806 100644 --- a/internal/network/netif.go +++ b/internal/network/netif.go @@ -90,7 +90,7 @@ func NewNetworkInterfaceState(opts *NetworkInterfaceOptions) (*NetworkInterfaceS return } - s.setHostnameIfNotSame() + _ = s.setHostnameIfNotSame() opts.OnDhcpLeaseChange(lease) }, @@ -195,8 +195,8 @@ func (s *NetworkInterfaceState) update() (DhcpTargetState, error) { ipv4Addresses = make([]net.IP, 0) ipv4AddressesString = make([]string, 0) ipv6Addresses = make([]IPv6Address, 0) - ipv6AddressesString = make([]string, 0) - ipv6LinkLocal *net.IP + // ipv6AddressesString = make([]string, 0) + ipv6LinkLocal *net.IP ) for _, addr := range addrs { @@ -243,7 +243,7 @@ func (s *NetworkInterfaceState) update() (DhcpTargetState, error) { PreferredLifetime: lifetimeToTime(addr.PreferedLft), Scope: addr.Scope, }) - ipv6AddressesString = append(ipv6AddressesString, addr.IPNet.String()) + // ipv6AddressesString = append(ipv6AddressesString, addr.IPNet.String()) } } @@ -341,6 +341,6 @@ func (s *NetworkInterfaceState) CheckAndUpdateDhcp() error { } func (s *NetworkInterfaceState) onConfigChange(config *NetworkConfig) { - s.setHostnameIfNotSame() + _ = s.setHostnameIfNotSame() s.cbConfigChange(config) } diff --git a/internal/network/utils.go b/internal/network/utils.go index e32dad6..6d64332 100644 --- a/internal/network/utils.go +++ b/internal/network/utils.go @@ -19,5 +19,8 @@ func IsSame(a, b interface{}) bool { return false } bJSON, err := json.Marshal(b) + if err != nil { + return false + } return string(aJSON) == string(bJSON) } diff --git a/internal/timesync/http.go b/internal/timesync/http.go index 908fd18..3a51463 100644 --- a/internal/timesync/http.go +++ b/internal/timesync/http.go @@ -53,7 +53,7 @@ func (t *TimeSync) queryMultipleHttp(urls []string, timeout time.Duration) (now metricHttpTotalRequestCount.Inc() startTime := time.Now() - now, err, response := queryHttpTime( + now, response, err := queryHttpTime( ctx, url, timeout, @@ -111,22 +111,22 @@ func queryHttpTime( ctx context.Context, url string, timeout time.Duration, -) (now *time.Time, err error, response *http.Response) { +) (now *time.Time, response *http.Response, err error) { client := http.Client{ Timeout: timeout, } req, err := http.NewRequestWithContext(ctx, "GET", url, nil) if err != nil { - return nil, err, nil + return nil, nil, err } resp, err := client.Do(req) if err != nil { - return nil, err, nil + return nil, nil, err } dateStr := resp.Header.Get("Date") parsedTime, err := time.Parse(time.RFC1123, dateStr) if err != nil { - return nil, err, resp + return nil, nil, err } - return &parsedTime, nil, resp + return &parsedTime, resp, nil } diff --git a/internal/timesync/metrics.go b/internal/timesync/metrics.go index 0401f3a..0e28acb 100644 --- a/internal/timesync/metrics.go +++ b/internal/timesync/metrics.go @@ -24,7 +24,7 @@ var ( Help: "The number of times the timesync has been successful", }, ) - metricRTCUpdateCount = promauto.NewCounter( + metricRTCUpdateCount = promauto.NewCounter( //nolint:unused prometheus.CounterOpts{ Name: "jetkvm_timesync_rtc_update_count", Help: "The number of times the RTC has been updated", diff --git a/internal/timesync/ntp.go b/internal/timesync/ntp.go index 34e87c9..41656b7 100644 --- a/internal/timesync/ntp.go +++ b/internal/timesync/ntp.go @@ -56,7 +56,7 @@ func (t *TimeSync) queryMultipleNTP(servers []string, timeout time.Duration) (no metricNtpRequestCount.WithLabelValues(server).Inc() // query the server - now, err, response := queryNtpServer(server, timeout) + now, response, err := queryNtpServer(server, timeout) // set the last RTT metricNtpServerLastRTT.WithLabelValues( @@ -104,10 +104,10 @@ func (t *TimeSync) queryMultipleNTP(servers []string, timeout time.Duration) (no return result.now, result.offset } -func queryNtpServer(server string, timeout time.Duration) (now *time.Time, err error, response *ntp.Response) { +func queryNtpServer(server string, timeout time.Duration) (now *time.Time, response *ntp.Response, err error) { resp, err := ntp.QueryWithOptions(server, ntp.QueryOptions{Timeout: timeout}) if err != nil { - return nil, err, nil + return nil, nil, err } - return &resp.Time, nil, resp + return &resp.Time, resp, nil } diff --git a/internal/timesync/timesync.go b/internal/timesync/timesync.go index e9ad069..e956cf9 100644 --- a/internal/timesync/timesync.go +++ b/internal/timesync/timesync.go @@ -33,7 +33,7 @@ type TimeSync struct { networkConfig *network.NetworkConfig rtcDevicePath string - rtcDevice *os.File + rtcDevice *os.File //nolint:unused rtcLock *sync.Mutex syncSuccess bool diff --git a/internal/udhcpc/udhcpc.go b/internal/udhcpc/udhcpc.go index 844c47b..70ac1b8 100644 --- a/internal/udhcpc/udhcpc.go +++ b/internal/udhcpc/udhcpc.go @@ -83,7 +83,10 @@ func (c *DHCPClient) Run() error { for { select { case event, ok := <-watcher.Events: - if !ok || !(event.Has(fsnotify.Write) || event.Has(fsnotify.Create)) { + if !ok { + continue + } + if !event.Has(fsnotify.Write) && !event.Has(fsnotify.Create) { continue } @@ -165,7 +168,7 @@ func (c *DHCPClient) loadLeaseFile() error { if err != nil { c.logger.Error().Err(err).Msg("failed to get dhcp lease expiry") } else { - expiresIn := leaseExpiry.Sub(time.Now()) + expiresIn := time.Until(leaseExpiry) c.logger.Info(). Interface("expiry", leaseExpiry). Str("expiresIn", expiresIn.String()). diff --git a/internal/websecure/store.go b/internal/websecure/store.go index b1d5aac..ea7911c 100644 --- a/internal/websecure/store.go +++ b/internal/websecure/store.go @@ -49,12 +49,12 @@ func (s *CertStore) ensureStorePath() error { s.log.Trace().Str("path", s.storePath).Msg("TLS store directory does not exist, creating directory") err = os.MkdirAll(s.storePath, 0755) if err != nil { - return fmt.Errorf("Failed to create TLS store path: %w", err) + return fmt.Errorf("failed to create TLS store path: %w", err) } return nil } - return fmt.Errorf("Failed to check TLS store path: %w", err) + return fmt.Errorf("failed to check TLS store path: %w", err) } func (s *CertStore) LoadCertificates() { @@ -119,7 +119,7 @@ func (s *CertStore) GetCertificate(hostname string) *tls.Certificate { func (s *CertStore) ValidateAndSaveCertificate(hostname string, cert string, key string, ignoreWarning bool) (error, error) { tlsCert, err := tls.X509KeyPair([]byte(cert), []byte(key)) if err != nil { - return fmt.Errorf("Failed to parse certificate: %w", err), nil + return fmt.Errorf("failed to parse certificate: %w", err), nil } // this can be skipped as current implementation supports one custom certificate only @@ -133,9 +133,9 @@ func (s *CertStore) ValidateAndSaveCertificate(hostname string, cert string, key if err = tlsCert.Leaf.VerifyHostname(hostname); err != nil { if !ignoreWarning { - return nil, fmt.Errorf("Certificate does not match hostname: %w", err) + return nil, fmt.Errorf("certificate does not match hostname: %w", err) } - s.log.Warn().Err(err).Msg("Certificate does not match hostname") + s.log.Warn().Err(err).Msg("certificate does not match hostname") } } diff --git a/internal/websecure/utils.go b/internal/websecure/utils.go index de29c73..b0038c0 100644 --- a/internal/websecure/utils.go +++ b/internal/websecure/utils.go @@ -35,7 +35,7 @@ func keyToFile(cert *tls.Certificate, filename string) error { case *ecdsa.PrivateKey: b, e := x509.MarshalECPrivateKey(k) if e != nil { - return fmt.Errorf("Failed to marshal EC private key: %v", e) + return fmt.Errorf("failed to marshal EC private key: %v", e) } keyBlock = pem.Block{ @@ -43,7 +43,7 @@ func keyToFile(cert *tls.Certificate, filename string) error { Bytes: b, } default: - return fmt.Errorf("Unknown private key type: %T", k) + return fmt.Errorf("unknown private key type: %T", k) } err := withSecretFile(filename, func(file *os.File) error { @@ -51,7 +51,7 @@ func keyToFile(cert *tls.Certificate, filename string) error { }) if err != nil { - return fmt.Errorf("Failed to save private key: %w", err) + return fmt.Errorf("failed to save private key: %w", err) } return nil @@ -67,7 +67,7 @@ func certToFile(cert *tls.Certificate, filename string) error { err := pem.Encode(file, &block) if err != nil { - return fmt.Errorf("Failed to save certificate: %w", err) + return fmt.Errorf("failed to save certificate: %w", err) } } diff --git a/jsonrpc.go b/jsonrpc.go index 00df3cd..f6fad45 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -659,18 +659,20 @@ func rpcSetActiveExtension(extensionId string) error { if config.ActiveExtension == extensionId { return nil } - if config.ActiveExtension == "atx-power" { + switch extensionId { + case "atx-power": _ = unmountATXControl() - } else if config.ActiveExtension == "dc-power" { + case "dc-power": _ = unmountDCControl() } config.ActiveExtension = extensionId if err := SaveConfig(); err != nil { return fmt.Errorf("failed to save config: %w", err) } - if extensionId == "atx-power" { + switch extensionId { + case "atx-power": _ = mountATXControl() - } else if extensionId == "dc-power" { + case "dc-power": _ = mountDCControl() } return nil diff --git a/log.go b/log.go index af880af..b353a2c 100644 --- a/log.go +++ b/log.go @@ -5,16 +5,11 @@ import ( "github.com/rs/zerolog" ) -const ( - defaultLogLevel = zerolog.ErrorLevel -) - func ErrorfL(l *zerolog.Logger, format string, err error, args ...interface{}) error { return logging.ErrorfL(l, format, err, args...) } var ( - rootLogger = logging.GetRootLogger() logger = logging.GetSubsystemLogger("jetkvm") networkLogger = logging.GetSubsystemLogger("network") cloudLogger = logging.GetSubsystemLogger("cloud") diff --git a/native.go b/native.go index 1eb29ac..496f580 100644 --- a/native.go +++ b/native.go @@ -12,7 +12,6 @@ import ( "time" "github.com/jetkvm/kvm/resource" - "github.com/rs/zerolog" "github.com/pion/webrtc/v4/pkg/media" ) @@ -34,19 +33,6 @@ type CtrlResponse struct { Data json.RawMessage `json:"data,omitempty"` } -type nativeOutput struct { - mu *sync.Mutex - logger *zerolog.Event -} - -func (w *nativeOutput) Write(p []byte) (n int, err error) { - w.mu.Lock() - defer w.mu.Unlock() - - w.logger.Msg(string(p)) - return len(p), nil -} - type EventHandler func(event CtrlResponse) var seq int32 = 1 diff --git a/native_linux.go b/native_linux.go index 10a2207..54d2150 100644 --- a/native_linux.go +++ b/native_linux.go @@ -7,8 +7,23 @@ import ( "os/exec" "sync" "syscall" + + "github.com/rs/zerolog" ) +type nativeOutput struct { + mu *sync.Mutex + logger *zerolog.Event +} + +func (w *nativeOutput) Write(p []byte) (n int, err error) { + w.mu.Lock() + defer w.mu.Unlock() + + w.logger.Msg(string(p)) + return len(p), nil +} + func startNativeBinary(binaryPath string) (*exec.Cmd, error) { // Run the binary in the background cmd := exec.Command(binaryPath) diff --git a/network.go b/network.go index 2e8595b..8d9261b 100644 --- a/network.go +++ b/network.go @@ -21,7 +21,7 @@ func networkStateChanged() { // always restart mDNS when the network state changes if mDNS != nil { - mDNS.SetLocalNames([]string{ + _ = mDNS.SetLocalNames([]string{ networkState.GetHostname(), networkState.GetFQDN(), }, true) @@ -56,8 +56,8 @@ func initNetwork() error { networkStateChanged() if mDNS != nil { - mDNS.SetListenOptions(networkConfig.GetMDNSMode()) - mDNS.SetLocalNames([]string{ + _ = mDNS.SetListenOptions(networkConfig.GetMDNSMode()) + _ = mDNS.SetLocalNames([]string{ networkState.GetHostname(), networkState.GetFQDN(), }, true) diff --git a/serial.go b/serial.go index 214a465..f4dd5b5 100644 --- a/serial.go +++ b/serial.go @@ -219,9 +219,10 @@ var defaultMode = &serial.Mode{ func initSerialPort() { _ = reopenSerialPort() - if config.ActiveExtension == "atx-power" { + switch config.ActiveExtension { + case "atx-power": _ = mountATXControl() - } else if config.ActiveExtension == "dc-power" { + case "dc-power": _ = mountDCControl() } } diff --git a/usb_mass_storage.go b/usb_mass_storage.go index e70a353..f868769 100644 --- a/usb_mass_storage.go +++ b/usb_mass_storage.go @@ -62,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: %w", 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: %w", err) + return fmt.Errorf("set mass storage image error: %w", err) } return nil } @@ -476,7 +476,7 @@ func handleUploadChannel(d *webrtc.DataChannel) { } totalBytesWritten += int64(bytesWritten) - sendProgress := false + sendProgress := false //nolint:staticcheck if time.Since(lastProgressTime) >= 200*time.Millisecond { sendProgress = true } diff --git a/web_tls.go b/web_tls.go index 46ba60f..2514702 100644 --- a/web_tls.go +++ b/web_tls.go @@ -52,12 +52,13 @@ func initCertStore() { } func getCertificate(info *tls.ClientHelloInfo) (*tls.Certificate, error) { - if config.TLSMode == "self-signed" { + switch config.TLSMode { + case "self-signed": if isTimeSyncNeeded() || !timeSync.IsSyncSuccess() { return nil, fmt.Errorf("time is not synced") } return certSigner.GetCertificate(info) - } else if config.TLSMode == "custom" { + case "custom": return certStore.GetCertificate(webSecureCustomCertificateName), nil } @@ -110,7 +111,7 @@ func setTLSState(s TLSState) error { err, _ := certStore.ValidateAndSaveCertificate(webSecureCustomCertificateName, s.Certificate, s.PrivateKey, true) // warn doesn't matter as ... we don't know the hostname yet if err != nil { - return fmt.Errorf("Failed to save certificate: %w", err) + return fmt.Errorf("failed to save certificate: %w", err) } config.TLSMode = "custom" case "self-signed": @@ -169,11 +170,11 @@ func runWebSecureServer() { websecureLogger.Info().Str("listen", webSecureListen).Msg("Starting websecure server") go func() { - for _ = range stopTLS { - websecureLogger.Info().Msg("Shutting down websecure server") + for range stopTLS { + websecureLogger.Info().Msg("shutting down websecure server") err := server.Shutdown(context.Background()) if err != nil { - websecureLogger.Error().Err(err).Msg("Failed to shutdown websecure server") + websecureLogger.Error().Err(err).Msg("failed to shutdown websecure server") } } }() @@ -201,8 +202,8 @@ func startWebSecureServer() { } func RunWebSecureServer() { - for _ = range startTLS { - websecureLogger.Info().Msg("Starting websecure server, as we have received a start signal") + for range startTLS { + websecureLogger.Info().Msg("starting websecure server, as we have received a start signal") if certStore == nil { initCertStore() }