mirror of https://github.com/jetkvm/kvm.git
chore: fix linter issues
This commit is contained in:
parent
db2ce258ae
commit
e504276447
|
@ -33,16 +33,17 @@ func (r remoteImageBackend) ReadAt(p []byte, off int64) (n int, err error) {
|
||||||
readLen = mountedImageSize - off
|
readLen = mountedImageSize - off
|
||||||
}
|
}
|
||||||
var data []byte
|
var data []byte
|
||||||
if source == WebRTC {
|
switch source {
|
||||||
|
case WebRTC:
|
||||||
data, err = webRTCDiskReader.Read(ctx, off, readLen)
|
data, err = webRTCDiskReader.Read(ctx, off, readLen)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
n = copy(p, data)
|
n = copy(p, data)
|
||||||
return n, nil
|
return n, nil
|
||||||
} else if source == HTTP {
|
case HTTP:
|
||||||
return httpRangeReader.ReadAt(p, off)
|
return httpRangeReader.ReadAt(p, off)
|
||||||
} else {
|
default:
|
||||||
return 0, errors.New("unknown image source")
|
return 0, errors.New("unknown image source")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -341,7 +341,7 @@ func startBacklightTickers() {
|
||||||
defer dimTicker.Stop()
|
defer dimTicker.Stop()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for { //nolint:gosimple
|
for { //nolint:staticcheck
|
||||||
select {
|
select {
|
||||||
case <-dimTicker.C:
|
case <-dimTicker.C:
|
||||||
tick_displayDim()
|
tick_displayDim()
|
||||||
|
@ -356,7 +356,7 @@ func startBacklightTickers() {
|
||||||
defer offTicker.Stop()
|
defer offTicker.Stop()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for { //nolint:gosimple
|
for { //nolint:staticcheck
|
||||||
select {
|
select {
|
||||||
case <-offTicker.C:
|
case <-offTicker.C:
|
||||||
tick_displayOff()
|
tick_displayOff()
|
||||||
|
|
|
@ -2,7 +2,6 @@ package confparser
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"net"
|
"net"
|
||||||
"reflect"
|
"reflect"
|
||||||
"slices"
|
"slices"
|
||||||
|
@ -247,7 +246,6 @@ func (f *FieldConfig) checkIfFieldNeedsUpdate() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
f.shouldUpdateValue = true
|
f.shouldUpdateValue = true
|
||||||
log.Printf("field `%s` updated to default value: %v", f.Name, f.CurrentValue)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"github.com/guregu/null/v6"
|
"github.com/guregu/null/v6"
|
||||||
)
|
)
|
||||||
|
|
||||||
type testIPv6Address struct {
|
type testIPv6Address struct { //nolint:unused
|
||||||
Address net.IP `json:"address"`
|
Address net.IP `json:"address"`
|
||||||
Prefix net.IPNet `json:"prefix"`
|
Prefix net.IPNet `json:"prefix"`
|
||||||
ValidLifetime *time.Time `json:"valid_lifetime"`
|
ValidLifetime *time.Time `json:"valid_lifetime"`
|
||||||
|
|
|
@ -17,11 +17,11 @@ func splitString(s string) []string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func toString(v interface{}) (string, error) {
|
func toString(v interface{}) (string, error) {
|
||||||
switch v.(type) {
|
switch v := v.(type) {
|
||||||
case string:
|
case string:
|
||||||
return v.(string), nil
|
return v, nil
|
||||||
case null.String:
|
case null.String:
|
||||||
return v.(null.String).String, nil
|
return v.String, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", fmt.Errorf("unsupported type: %s", reflect.TypeOf(v))
|
return "", fmt.Errorf("unsupported type: %s", reflect.TypeOf(v))
|
||||||
|
|
|
@ -116,7 +116,6 @@ func sseHeadersMiddleware() gin.HandlerFunc {
|
||||||
}
|
}
|
||||||
|
|
||||||
func AttachSSEHandler(router *gin.RouterGroup) {
|
func AttachSSEHandler(router *gin.RouterGroup) {
|
||||||
|
|
||||||
router.StaticFS("/log-stream", http.FS(sseHTML))
|
router.StaticFS("/log-stream", http.FS(sseHTML))
|
||||||
router.GET("/log-stream", sseHeadersMiddleware(), sseServer.serveHTTP(), func(c *gin.Context) {
|
router.GET("/log-stream", sseHeadersMiddleware(), sseServer.serveHTTP(), func(c *gin.Context) {
|
||||||
v, ok := c.Get("clientChan")
|
v, ok := c.Get("clientChan")
|
||||||
|
|
|
@ -171,7 +171,7 @@ func (m *MDNS) SetLocalNames(localNames []string, always bool) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
m.localNames = localNames
|
m.localNames = localNames
|
||||||
m.Restart()
|
_ = m.Restart()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -184,7 +184,7 @@ func (m *MDNS) SetListenOptions(listenOptions *MDNSListenOptions) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
m.listenOptions = listenOptions
|
m.listenOptions = listenOptions
|
||||||
m.Restart()
|
_ = m.Restart()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,11 +57,12 @@ func (c *NetworkConfig) GetMDNSMode() *mdns.MDNSListenOptions {
|
||||||
IPv6: true,
|
IPv6: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
if mode == "ipv4_only" {
|
switch mode {
|
||||||
|
case "ipv4_only":
|
||||||
listenOptions.IPv6 = false
|
listenOptions.IPv6 = false
|
||||||
} else if mode == "ipv6_only" {
|
case "ipv6_only":
|
||||||
listenOptions.IPv4 = false
|
listenOptions.IPv4 = false
|
||||||
} else if mode == "disabled" {
|
case "disabled":
|
||||||
listenOptions.IPv4 = false
|
listenOptions.IPv4 = false
|
||||||
listenOptions.IPv6 = false
|
listenOptions.IPv6 = false
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,10 @@ func updateEtcHosts(hostname string, fqdn string) error {
|
||||||
defer hostsFile.Close()
|
defer hostsFile.Close()
|
||||||
|
|
||||||
// read all lines
|
// 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)
|
lines, err := io.ReadAll(hostsFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to read %s: %w", hostsPath, err)
|
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)
|
newLines = append(newLines, hostLine)
|
||||||
}
|
}
|
||||||
|
|
||||||
hostsFile.Truncate(0)
|
if err := hostsFile.Truncate(0); err != nil {
|
||||||
hostsFile.Seek(0, io.SeekStart)
|
return fmt.Errorf("failed to truncate %s: %w", hostsPath, err)
|
||||||
hostsFile.Write([]byte(strings.Join(newLines, "\n")))
|
}
|
||||||
|
|
||||||
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -82,7 +93,9 @@ func SetHostname(hostname string, fqdn string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// update /etc/hostname
|
// 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
|
// update /etc/hosts
|
||||||
if err := updateEtcHosts(hostname, fqdn); err != nil {
|
if err := updateEtcHosts(hostname, fqdn); err != nil {
|
||||||
|
|
|
@ -90,7 +90,7 @@ func NewNetworkInterfaceState(opts *NetworkInterfaceOptions) (*NetworkInterfaceS
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
s.setHostnameIfNotSame()
|
_ = s.setHostnameIfNotSame()
|
||||||
|
|
||||||
opts.OnDhcpLeaseChange(lease)
|
opts.OnDhcpLeaseChange(lease)
|
||||||
},
|
},
|
||||||
|
@ -195,8 +195,8 @@ func (s *NetworkInterfaceState) update() (DhcpTargetState, error) {
|
||||||
ipv4Addresses = make([]net.IP, 0)
|
ipv4Addresses = make([]net.IP, 0)
|
||||||
ipv4AddressesString = make([]string, 0)
|
ipv4AddressesString = make([]string, 0)
|
||||||
ipv6Addresses = make([]IPv6Address, 0)
|
ipv6Addresses = make([]IPv6Address, 0)
|
||||||
ipv6AddressesString = make([]string, 0)
|
// ipv6AddressesString = make([]string, 0)
|
||||||
ipv6LinkLocal *net.IP
|
ipv6LinkLocal *net.IP
|
||||||
)
|
)
|
||||||
|
|
||||||
for _, addr := range addrs {
|
for _, addr := range addrs {
|
||||||
|
@ -243,7 +243,7 @@ func (s *NetworkInterfaceState) update() (DhcpTargetState, error) {
|
||||||
PreferredLifetime: lifetimeToTime(addr.PreferedLft),
|
PreferredLifetime: lifetimeToTime(addr.PreferedLft),
|
||||||
Scope: addr.Scope,
|
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) {
|
func (s *NetworkInterfaceState) onConfigChange(config *NetworkConfig) {
|
||||||
s.setHostnameIfNotSame()
|
_ = s.setHostnameIfNotSame()
|
||||||
s.cbConfigChange(config)
|
s.cbConfigChange(config)
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,5 +19,8 @@ func IsSame(a, b interface{}) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
bJSON, err := json.Marshal(b)
|
bJSON, err := json.Marshal(b)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
return string(aJSON) == string(bJSON)
|
return string(aJSON) == string(bJSON)
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ func (t *TimeSync) queryMultipleHttp(urls []string, timeout time.Duration) (now
|
||||||
metricHttpTotalRequestCount.Inc()
|
metricHttpTotalRequestCount.Inc()
|
||||||
|
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
now, err, response := queryHttpTime(
|
now, response, err := queryHttpTime(
|
||||||
ctx,
|
ctx,
|
||||||
url,
|
url,
|
||||||
timeout,
|
timeout,
|
||||||
|
@ -111,22 +111,22 @@ func queryHttpTime(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
url string,
|
url string,
|
||||||
timeout time.Duration,
|
timeout time.Duration,
|
||||||
) (now *time.Time, err error, response *http.Response) {
|
) (now *time.Time, response *http.Response, err error) {
|
||||||
client := http.Client{
|
client := http.Client{
|
||||||
Timeout: timeout,
|
Timeout: timeout,
|
||||||
}
|
}
|
||||||
req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
|
req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err, nil
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err, nil
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
dateStr := resp.Header.Get("Date")
|
dateStr := resp.Header.Get("Date")
|
||||||
parsedTime, err := time.Parse(time.RFC1123, dateStr)
|
parsedTime, err := time.Parse(time.RFC1123, dateStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err, resp
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
return &parsedTime, nil, resp
|
return &parsedTime, resp, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ var (
|
||||||
Help: "The number of times the timesync has been successful",
|
Help: "The number of times the timesync has been successful",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
metricRTCUpdateCount = promauto.NewCounter(
|
metricRTCUpdateCount = promauto.NewCounter( //nolint:unused
|
||||||
prometheus.CounterOpts{
|
prometheus.CounterOpts{
|
||||||
Name: "jetkvm_timesync_rtc_update_count",
|
Name: "jetkvm_timesync_rtc_update_count",
|
||||||
Help: "The number of times the RTC has been updated",
|
Help: "The number of times the RTC has been updated",
|
||||||
|
|
|
@ -56,7 +56,7 @@ func (t *TimeSync) queryMultipleNTP(servers []string, timeout time.Duration) (no
|
||||||
metricNtpRequestCount.WithLabelValues(server).Inc()
|
metricNtpRequestCount.WithLabelValues(server).Inc()
|
||||||
|
|
||||||
// query the server
|
// query the server
|
||||||
now, err, response := queryNtpServer(server, timeout)
|
now, response, err := queryNtpServer(server, timeout)
|
||||||
|
|
||||||
// set the last RTT
|
// set the last RTT
|
||||||
metricNtpServerLastRTT.WithLabelValues(
|
metricNtpServerLastRTT.WithLabelValues(
|
||||||
|
@ -104,10 +104,10 @@ func (t *TimeSync) queryMultipleNTP(servers []string, timeout time.Duration) (no
|
||||||
return result.now, result.offset
|
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})
|
resp, err := ntp.QueryWithOptions(server, ntp.QueryOptions{Timeout: timeout})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err, nil
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
return &resp.Time, nil, resp
|
return &resp.Time, resp, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ type TimeSync struct {
|
||||||
networkConfig *network.NetworkConfig
|
networkConfig *network.NetworkConfig
|
||||||
|
|
||||||
rtcDevicePath string
|
rtcDevicePath string
|
||||||
rtcDevice *os.File
|
rtcDevice *os.File //nolint:unused
|
||||||
rtcLock *sync.Mutex
|
rtcLock *sync.Mutex
|
||||||
|
|
||||||
syncSuccess bool
|
syncSuccess bool
|
||||||
|
|
|
@ -83,7 +83,10 @@ func (c *DHCPClient) Run() error {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case event, ok := <-watcher.Events:
|
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
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +168,7 @@ func (c *DHCPClient) loadLeaseFile() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Error().Err(err).Msg("failed to get dhcp lease expiry")
|
c.logger.Error().Err(err).Msg("failed to get dhcp lease expiry")
|
||||||
} else {
|
} else {
|
||||||
expiresIn := leaseExpiry.Sub(time.Now())
|
expiresIn := time.Until(leaseExpiry)
|
||||||
c.logger.Info().
|
c.logger.Info().
|
||||||
Interface("expiry", leaseExpiry).
|
Interface("expiry", leaseExpiry).
|
||||||
Str("expiresIn", expiresIn.String()).
|
Str("expiresIn", expiresIn.String()).
|
||||||
|
|
|
@ -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")
|
s.log.Trace().Str("path", s.storePath).Msg("TLS store directory does not exist, creating directory")
|
||||||
err = os.MkdirAll(s.storePath, 0755)
|
err = os.MkdirAll(s.storePath, 0755)
|
||||||
if err != nil {
|
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 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() {
|
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) {
|
func (s *CertStore) ValidateAndSaveCertificate(hostname string, cert string, key string, ignoreWarning bool) (error, error) {
|
||||||
tlsCert, err := tls.X509KeyPair([]byte(cert), []byte(key))
|
tlsCert, err := tls.X509KeyPair([]byte(cert), []byte(key))
|
||||||
if err != nil {
|
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
|
// 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 err = tlsCert.Leaf.VerifyHostname(hostname); err != nil {
|
||||||
if !ignoreWarning {
|
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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ func keyToFile(cert *tls.Certificate, filename string) error {
|
||||||
case *ecdsa.PrivateKey:
|
case *ecdsa.PrivateKey:
|
||||||
b, e := x509.MarshalECPrivateKey(k)
|
b, e := x509.MarshalECPrivateKey(k)
|
||||||
if e != nil {
|
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{
|
keyBlock = pem.Block{
|
||||||
|
@ -43,7 +43,7 @@ func keyToFile(cert *tls.Certificate, filename string) error {
|
||||||
Bytes: b,
|
Bytes: b,
|
||||||
}
|
}
|
||||||
default:
|
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 {
|
err := withSecretFile(filename, func(file *os.File) error {
|
||||||
|
@ -51,7 +51,7 @@ func keyToFile(cert *tls.Certificate, filename string) error {
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
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
|
return nil
|
||||||
|
@ -67,7 +67,7 @@ func certToFile(cert *tls.Certificate, filename string) error {
|
||||||
|
|
||||||
err := pem.Encode(file, &block)
|
err := pem.Encode(file, &block)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Failed to save certificate: %w", err)
|
return fmt.Errorf("failed to save certificate: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
jsonrpc.go
10
jsonrpc.go
|
@ -659,18 +659,20 @@ func rpcSetActiveExtension(extensionId string) error {
|
||||||
if config.ActiveExtension == extensionId {
|
if config.ActiveExtension == extensionId {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if config.ActiveExtension == "atx-power" {
|
switch extensionId {
|
||||||
|
case "atx-power":
|
||||||
_ = unmountATXControl()
|
_ = unmountATXControl()
|
||||||
} else if config.ActiveExtension == "dc-power" {
|
case "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" {
|
switch extensionId {
|
||||||
|
case "atx-power":
|
||||||
_ = mountATXControl()
|
_ = mountATXControl()
|
||||||
} else if extensionId == "dc-power" {
|
case "dc-power":
|
||||||
_ = mountDCControl()
|
_ = mountDCControl()
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
5
log.go
5
log.go
|
@ -5,16 +5,11 @@ import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
defaultLogLevel = zerolog.ErrorLevel
|
|
||||||
)
|
|
||||||
|
|
||||||
func ErrorfL(l *zerolog.Logger, format string, err error, args ...interface{}) error {
|
func ErrorfL(l *zerolog.Logger, format string, err error, args ...interface{}) error {
|
||||||
return logging.ErrorfL(l, format, err, args...)
|
return logging.ErrorfL(l, format, err, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
rootLogger = logging.GetRootLogger()
|
|
||||||
logger = logging.GetSubsystemLogger("jetkvm")
|
logger = logging.GetSubsystemLogger("jetkvm")
|
||||||
networkLogger = logging.GetSubsystemLogger("network")
|
networkLogger = logging.GetSubsystemLogger("network")
|
||||||
cloudLogger = logging.GetSubsystemLogger("cloud")
|
cloudLogger = logging.GetSubsystemLogger("cloud")
|
||||||
|
|
14
native.go
14
native.go
|
@ -12,7 +12,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/jetkvm/kvm/resource"
|
"github.com/jetkvm/kvm/resource"
|
||||||
"github.com/rs/zerolog"
|
|
||||||
|
|
||||||
"github.com/pion/webrtc/v4/pkg/media"
|
"github.com/pion/webrtc/v4/pkg/media"
|
||||||
)
|
)
|
||||||
|
@ -34,19 +33,6 @@ type CtrlResponse struct {
|
||||||
Data json.RawMessage `json:"data,omitempty"`
|
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)
|
type EventHandler func(event CtrlResponse)
|
||||||
|
|
||||||
var seq int32 = 1
|
var seq int32 = 1
|
||||||
|
|
|
@ -7,8 +7,23 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"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) {
|
func startNativeBinary(binaryPath string) (*exec.Cmd, error) {
|
||||||
// Run the binary in the background
|
// Run the binary in the background
|
||||||
cmd := exec.Command(binaryPath)
|
cmd := exec.Command(binaryPath)
|
||||||
|
|
|
@ -21,7 +21,7 @@ func networkStateChanged() {
|
||||||
|
|
||||||
// always restart mDNS when the network state changes
|
// always restart mDNS when the network state changes
|
||||||
if mDNS != nil {
|
if mDNS != nil {
|
||||||
mDNS.SetLocalNames([]string{
|
_ = mDNS.SetLocalNames([]string{
|
||||||
networkState.GetHostname(),
|
networkState.GetHostname(),
|
||||||
networkState.GetFQDN(),
|
networkState.GetFQDN(),
|
||||||
}, true)
|
}, true)
|
||||||
|
@ -56,8 +56,8 @@ func initNetwork() error {
|
||||||
networkStateChanged()
|
networkStateChanged()
|
||||||
|
|
||||||
if mDNS != nil {
|
if mDNS != nil {
|
||||||
mDNS.SetListenOptions(networkConfig.GetMDNSMode())
|
_ = mDNS.SetListenOptions(networkConfig.GetMDNSMode())
|
||||||
mDNS.SetLocalNames([]string{
|
_ = mDNS.SetLocalNames([]string{
|
||||||
networkState.GetHostname(),
|
networkState.GetHostname(),
|
||||||
networkState.GetFQDN(),
|
networkState.GetFQDN(),
|
||||||
}, true)
|
}, true)
|
||||||
|
|
|
@ -219,9 +219,10 @@ var defaultMode = &serial.Mode{
|
||||||
|
|
||||||
func initSerialPort() {
|
func initSerialPort() {
|
||||||
_ = reopenSerialPort()
|
_ = reopenSerialPort()
|
||||||
if config.ActiveExtension == "atx-power" {
|
switch config.ActiveExtension {
|
||||||
|
case "atx-power":
|
||||||
_ = mountATXControl()
|
_ = mountATXControl()
|
||||||
} else if config.ActiveExtension == "dc-power" {
|
case "dc-power":
|
||||||
_ = mountDCControl()
|
_ = mountDCControl()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,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: %w", 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: %w", err)
|
return fmt.Errorf("set mass storage image error: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -476,7 +476,7 @@ func handleUploadChannel(d *webrtc.DataChannel) {
|
||||||
}
|
}
|
||||||
totalBytesWritten += int64(bytesWritten)
|
totalBytesWritten += int64(bytesWritten)
|
||||||
|
|
||||||
sendProgress := false
|
sendProgress := false //nolint:staticcheck
|
||||||
if time.Since(lastProgressTime) >= 200*time.Millisecond {
|
if time.Since(lastProgressTime) >= 200*time.Millisecond {
|
||||||
sendProgress = true
|
sendProgress = true
|
||||||
}
|
}
|
||||||
|
|
17
web_tls.go
17
web_tls.go
|
@ -52,12 +52,13 @@ func initCertStore() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCertificate(info *tls.ClientHelloInfo) (*tls.Certificate, error) {
|
func getCertificate(info *tls.ClientHelloInfo) (*tls.Certificate, error) {
|
||||||
if config.TLSMode == "self-signed" {
|
switch config.TLSMode {
|
||||||
|
case "self-signed":
|
||||||
if isTimeSyncNeeded() || !timeSync.IsSyncSuccess() {
|
if isTimeSyncNeeded() || !timeSync.IsSyncSuccess() {
|
||||||
return nil, fmt.Errorf("time is not synced")
|
return nil, fmt.Errorf("time is not synced")
|
||||||
}
|
}
|
||||||
return certSigner.GetCertificate(info)
|
return certSigner.GetCertificate(info)
|
||||||
} else if config.TLSMode == "custom" {
|
case "custom":
|
||||||
return certStore.GetCertificate(webSecureCustomCertificateName), nil
|
return certStore.GetCertificate(webSecureCustomCertificateName), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +111,7 @@ func setTLSState(s TLSState) error {
|
||||||
err, _ := certStore.ValidateAndSaveCertificate(webSecureCustomCertificateName, s.Certificate, s.PrivateKey, true)
|
err, _ := certStore.ValidateAndSaveCertificate(webSecureCustomCertificateName, s.Certificate, s.PrivateKey, true)
|
||||||
// warn doesn't matter as ... we don't know the hostname yet
|
// warn doesn't matter as ... we don't know the hostname yet
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Failed to save certificate: %w", err)
|
return fmt.Errorf("failed to save certificate: %w", err)
|
||||||
}
|
}
|
||||||
config.TLSMode = "custom"
|
config.TLSMode = "custom"
|
||||||
case "self-signed":
|
case "self-signed":
|
||||||
|
@ -169,11 +170,11 @@ func runWebSecureServer() {
|
||||||
websecureLogger.Info().Str("listen", webSecureListen).Msg("Starting websecure server")
|
websecureLogger.Info().Str("listen", webSecureListen).Msg("Starting websecure server")
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for _ = range stopTLS {
|
for range stopTLS {
|
||||||
websecureLogger.Info().Msg("Shutting down websecure server")
|
websecureLogger.Info().Msg("shutting down websecure server")
|
||||||
err := server.Shutdown(context.Background())
|
err := server.Shutdown(context.Background())
|
||||||
if err != nil {
|
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() {
|
func RunWebSecureServer() {
|
||||||
for _ = range startTLS {
|
for range startTLS {
|
||||||
websecureLogger.Info().Msg("Starting websecure server, as we have received a start signal")
|
websecureLogger.Info().Msg("starting websecure server, as we have received a start signal")
|
||||||
if certStore == nil {
|
if certStore == nil {
|
||||||
initCertStore()
|
initCertStore()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue