mirror of https://github.com/jetkvm/kvm.git
chore: update logging
This commit is contained in:
parent
924b55059f
commit
0ba7902f82
|
@ -93,6 +93,7 @@ type Config struct {
|
||||||
TLSMode string `json:"tls_mode"` // options: "self-signed", "user-defined", ""
|
TLSMode string `json:"tls_mode"` // options: "self-signed", "user-defined", ""
|
||||||
UsbConfig *usbgadget.Config `json:"usb_config"`
|
UsbConfig *usbgadget.Config `json:"usb_config"`
|
||||||
UsbDevices *usbgadget.Devices `json:"usb_devices"`
|
UsbDevices *usbgadget.Devices `json:"usb_devices"`
|
||||||
|
DefaultLogLevel string `json:"default_log_level"`
|
||||||
}
|
}
|
||||||
|
|
||||||
const configPath = "/userdata/kvm_config.json"
|
const configPath = "/userdata/kvm_config.json"
|
||||||
|
@ -120,6 +121,7 @@ var defaultConfig = &Config{
|
||||||
Keyboard: true,
|
Keyboard: true,
|
||||||
MassStorage: true,
|
MassStorage: true,
|
||||||
},
|
},
|
||||||
|
DefaultLogLevel: "INFO",
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -163,6 +165,8 @@ func LoadConfig() {
|
||||||
}
|
}
|
||||||
|
|
||||||
config = &loadedConfig
|
config = &loadedConfig
|
||||||
|
|
||||||
|
rootLogger.UpdateLogLevel()
|
||||||
}
|
}
|
||||||
|
|
||||||
func SaveConfig() error {
|
func SaveConfig() error {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -70,9 +71,15 @@ func updateDisplay() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var displayInited = false
|
var (
|
||||||
|
displayInited = false
|
||||||
|
displayUpdateLock = sync.Mutex{}
|
||||||
|
)
|
||||||
|
|
||||||
func requestDisplayUpdate() {
|
func requestDisplayUpdate() {
|
||||||
|
displayUpdateLock.Lock()
|
||||||
|
defer displayUpdateLock.Unlock()
|
||||||
|
|
||||||
if !displayInited {
|
if !displayInited {
|
||||||
displayLogger.Info().Msg("display not inited, skipping updates")
|
displayLogger.Info().Msg("display not inited, skipping updates")
|
||||||
return
|
return
|
||||||
|
|
|
@ -74,11 +74,15 @@ func writeJSONRPCEvent(event string, params interface{}, session *Session) {
|
||||||
}
|
}
|
||||||
|
|
||||||
requestString := string(requestBytes)
|
requestString := string(requestBytes)
|
||||||
jsonRpcLogger.Info().Str("data", requestString).Msg("Sending JSONRPC event")
|
scopedLogger := jsonRpcLogger.With().
|
||||||
|
Str("data", requestString).
|
||||||
|
Logger()
|
||||||
|
|
||||||
|
scopedLogger.Info().Msg("sending JSONRPC event")
|
||||||
|
|
||||||
err = session.RPCChannel.SendText(requestString)
|
err = session.RPCChannel.SendText(requestString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
jsonRpcLogger.Warn().Err(err).Str("data", requestString).Msg("Error sending JSONRPC event")
|
scopedLogger.Warn().Err(err).Msg("error sending JSONRPC event")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
225
log.go
225
log.go
|
@ -12,8 +12,36 @@ import (
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Logger struct {
|
||||||
|
l *zerolog.Logger
|
||||||
|
scopeLoggers map[string]*zerolog.Logger
|
||||||
|
scopeLevels map[string]zerolog.Level
|
||||||
|
scopeLevelMutex sync.Mutex
|
||||||
|
|
||||||
|
defaultLogLevelFromEnv zerolog.Level
|
||||||
|
defaultLogLevelFromConfig zerolog.Level
|
||||||
|
defaultLogLevel zerolog.Level
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
defaultLogLevel = zerolog.ErrorLevel
|
||||||
|
)
|
||||||
|
|
||||||
|
type logOutput struct {
|
||||||
|
mu *sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *logOutput) Write(p []byte) (n int, err error) {
|
||||||
|
w.mu.Lock()
|
||||||
|
defer w.mu.Unlock()
|
||||||
|
|
||||||
|
// TODO: write to file or syslog
|
||||||
|
|
||||||
|
return len(p), nil
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
defaultLogOutput io.Writer = zerolog.ConsoleWriter{
|
consoleLogOutput io.Writer = zerolog.ConsoleWriter{
|
||||||
Out: os.Stdout,
|
Out: os.Stdout,
|
||||||
TimeFormat: time.RFC3339,
|
TimeFormat: time.RFC3339,
|
||||||
PartsOrder: []string{"time", "level", "scope", "component", "message"},
|
PartsOrder: []string{"time", "level", "scope", "component", "message"},
|
||||||
|
@ -28,57 +56,10 @@ var (
|
||||||
return val
|
return val
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
defaultLogLevel = zerolog.ErrorLevel
|
fileLogOutput io.Writer = &logOutput{mu: &sync.Mutex{}}
|
||||||
rootLogger = zerolog.New(defaultLogOutput).With().
|
defaultLogOutput = zerolog.MultiLevelWriter(consoleLogOutput, fileLogOutput)
|
||||||
Str("scope", "jetkvm").
|
|
||||||
Timestamp().
|
|
||||||
Stack().
|
|
||||||
Logger()
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
zerologLevels = map[string]zerolog.Level{
|
||||||
scopeLevels map[string]zerolog.Level
|
|
||||||
scopeLevelMutex = sync.Mutex{}
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
logger = getLogger("jetkvm")
|
|
||||||
cloudLogger = getLogger("cloud")
|
|
||||||
websocketLogger = getLogger("websocket")
|
|
||||||
webrtcLogger = getLogger("webrtc")
|
|
||||||
nativeLogger = getLogger("native")
|
|
||||||
ntpLogger = getLogger("ntp")
|
|
||||||
jsonRpcLogger = getLogger("jsonrpc")
|
|
||||||
watchdogLogger = getLogger("watchdog")
|
|
||||||
websecureLogger = getLogger("websecure")
|
|
||||||
otaLogger = getLogger("ota")
|
|
||||||
serialLogger = getLogger("serial")
|
|
||||||
terminalLogger = getLogger("terminal")
|
|
||||||
displayLogger = getLogger("display")
|
|
||||||
wolLogger = getLogger("wol")
|
|
||||||
usbLogger = getLogger("usb")
|
|
||||||
// external components
|
|
||||||
ginLogger = getLogger("gin")
|
|
||||||
)
|
|
||||||
|
|
||||||
func ErrorfL(l *zerolog.Logger, format string, err error, args ...interface{}) error {
|
|
||||||
if l == nil {
|
|
||||||
l = &logger
|
|
||||||
}
|
|
||||||
|
|
||||||
l.Error().Err(err).Msgf(format, args...)
|
|
||||||
|
|
||||||
err_msg := err.Error() + ": %v"
|
|
||||||
err_args := append(args, err)
|
|
||||||
|
|
||||||
return fmt.Errorf(err_msg, err_args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateLogLevel() {
|
|
||||||
scopeLevelMutex.Lock()
|
|
||||||
defer scopeLevelMutex.Unlock()
|
|
||||||
|
|
||||||
logLevels := map[string]zerolog.Level{
|
|
||||||
"DISABLE": zerolog.Disabled,
|
"DISABLE": zerolog.Disabled,
|
||||||
"NOLEVEL": zerolog.NoLevel,
|
"NOLEVEL": zerolog.NoLevel,
|
||||||
"PANIC": zerolog.PanicLevel,
|
"PANIC": zerolog.PanicLevel,
|
||||||
|
@ -90,9 +71,35 @@ func updateLogLevel() {
|
||||||
"TRACE": zerolog.TraceLevel,
|
"TRACE": zerolog.TraceLevel,
|
||||||
}
|
}
|
||||||
|
|
||||||
scopeLevels = make(map[string]zerolog.Level)
|
rootZerologLogger = zerolog.New(defaultLogOutput).With().
|
||||||
|
Str("scope", "jetkvm").
|
||||||
|
Timestamp().
|
||||||
|
Stack().
|
||||||
|
Logger()
|
||||||
|
rootLogger = NewLogger(rootZerologLogger)
|
||||||
|
)
|
||||||
|
|
||||||
for name, level := range logLevels {
|
func NewLogger(zerologLogger zerolog.Logger) *Logger {
|
||||||
|
return &Logger{
|
||||||
|
l: &zerologLogger,
|
||||||
|
scopeLoggers: make(map[string]*zerolog.Logger),
|
||||||
|
scopeLevels: make(map[string]zerolog.Level),
|
||||||
|
scopeLevelMutex: sync.Mutex{},
|
||||||
|
defaultLogLevelFromEnv: -2,
|
||||||
|
defaultLogLevelFromConfig: -2,
|
||||||
|
defaultLogLevel: defaultLogLevel,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Logger) updateLogLevel() {
|
||||||
|
l.scopeLevelMutex.Lock()
|
||||||
|
defer l.scopeLevelMutex.Unlock()
|
||||||
|
|
||||||
|
l.scopeLevels = make(map[string]zerolog.Level)
|
||||||
|
|
||||||
|
finalDefaultLogLevel := l.defaultLogLevel
|
||||||
|
|
||||||
|
for name, level := range zerologLevels {
|
||||||
env := os.Getenv(fmt.Sprintf("JETKVM_LOG_%s", name))
|
env := os.Getenv(fmt.Sprintf("JETKVM_LOG_%s", name))
|
||||||
|
|
||||||
if env == "" {
|
if env == "" {
|
||||||
|
@ -108,8 +115,10 @@ func updateLogLevel() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.ToLower(env) == "all" {
|
if strings.ToLower(env) == "all" {
|
||||||
if defaultLogLevel > level {
|
l.defaultLogLevelFromEnv = level
|
||||||
defaultLogLevel = level
|
|
||||||
|
if finalDefaultLogLevel > level {
|
||||||
|
finalDefaultLogLevel = level
|
||||||
}
|
}
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
@ -117,26 +126,112 @@ func updateLogLevel() {
|
||||||
|
|
||||||
scopes := strings.Split(strings.ToLower(env), ",")
|
scopes := strings.Split(strings.ToLower(env), ",")
|
||||||
for _, scope := range scopes {
|
for _, scope := range scopes {
|
||||||
scopeLevels[scope] = level
|
l.scopeLevels[scope] = level
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLogger(scope string) zerolog.Logger {
|
l.defaultLogLevel = finalDefaultLogLevel
|
||||||
if scopeLevels == nil {
|
|
||||||
updateLogLevel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
l := rootLogger.With().Str("component", scope).Logger()
|
func (l *Logger) getScopeLoggerLevel(scope string) zerolog.Level {
|
||||||
|
if l.scopeLevels == nil {
|
||||||
|
l.updateLogLevel()
|
||||||
|
}
|
||||||
|
|
||||||
|
var scopeLevel zerolog.Level
|
||||||
|
if l.defaultLogLevelFromConfig != -2 {
|
||||||
|
scopeLevel = l.defaultLogLevelFromConfig
|
||||||
|
}
|
||||||
|
if l.defaultLogLevelFromEnv != -2 {
|
||||||
|
scopeLevel = l.defaultLogLevelFromEnv
|
||||||
|
}
|
||||||
|
|
||||||
// if the scope is not in the map, use the default level from the root logger
|
// if the scope is not in the map, use the default level from the root logger
|
||||||
if level, ok := scopeLevels[scope]; ok {
|
if level, ok := l.scopeLevels[scope]; ok {
|
||||||
return l.Level(level)
|
scopeLevel = level
|
||||||
}
|
}
|
||||||
|
|
||||||
return l.Level(defaultLogLevel)
|
return scopeLevel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *Logger) newScopeLogger(scope string) zerolog.Logger {
|
||||||
|
scopeLevel := l.getScopeLoggerLevel(scope)
|
||||||
|
logger := l.l.Level(scopeLevel).With().Str("component", scope).Logger()
|
||||||
|
|
||||||
|
return logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Logger) getLogger(scope string) *zerolog.Logger {
|
||||||
|
logger, ok := l.scopeLoggers[scope]
|
||||||
|
if !ok || logger == nil {
|
||||||
|
scopeLogger := l.newScopeLogger(scope)
|
||||||
|
l.scopeLoggers[scope] = &scopeLogger
|
||||||
|
}
|
||||||
|
|
||||||
|
return l.scopeLoggers[scope]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Logger) UpdateLogLevel() {
|
||||||
|
needUpdate := false
|
||||||
|
|
||||||
|
if config != nil && config.DefaultLogLevel != "" {
|
||||||
|
if logLevel, ok := zerologLevels[config.DefaultLogLevel]; ok {
|
||||||
|
l.defaultLogLevelFromConfig = logLevel
|
||||||
|
} else {
|
||||||
|
l.l.Warn().Str("logLevel", config.DefaultLogLevel).Msg("invalid defaultLogLevel from config, using ERROR")
|
||||||
|
}
|
||||||
|
|
||||||
|
if l.defaultLogLevelFromConfig != l.defaultLogLevel {
|
||||||
|
needUpdate = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
l.updateLogLevel()
|
||||||
|
|
||||||
|
if needUpdate {
|
||||||
|
for scope, logger := range l.scopeLoggers {
|
||||||
|
currentLevel := logger.GetLevel()
|
||||||
|
targetLevel := l.getScopeLoggerLevel(scope)
|
||||||
|
if currentLevel != targetLevel {
|
||||||
|
*logger = l.newScopeLogger(scope)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ErrorfL(l *zerolog.Logger, format string, err error, args ...interface{}) error {
|
||||||
|
if l == nil {
|
||||||
|
l = rootLogger.getLogger("jetkvm")
|
||||||
|
}
|
||||||
|
|
||||||
|
l.Error().Err(err).Msgf(format, args...)
|
||||||
|
|
||||||
|
err_msg := err.Error() + ": %v"
|
||||||
|
err_args := append(args, err)
|
||||||
|
|
||||||
|
return fmt.Errorf(err_msg, err_args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
logger = rootLogger.getLogger("jetkvm")
|
||||||
|
cloudLogger = rootLogger.getLogger("cloud")
|
||||||
|
websocketLogger = rootLogger.getLogger("websocket")
|
||||||
|
webrtcLogger = rootLogger.getLogger("webrtc")
|
||||||
|
nativeLogger = rootLogger.getLogger("native")
|
||||||
|
ntpLogger = rootLogger.getLogger("ntp")
|
||||||
|
jsonRpcLogger = rootLogger.getLogger("jsonrpc")
|
||||||
|
watchdogLogger = rootLogger.getLogger("watchdog")
|
||||||
|
websecureLogger = rootLogger.getLogger("websecure")
|
||||||
|
otaLogger = rootLogger.getLogger("ota")
|
||||||
|
serialLogger = rootLogger.getLogger("serial")
|
||||||
|
terminalLogger = rootLogger.getLogger("terminal")
|
||||||
|
displayLogger = rootLogger.getLogger("display")
|
||||||
|
wolLogger = rootLogger.getLogger("wol")
|
||||||
|
usbLogger = rootLogger.getLogger("usb")
|
||||||
|
// external components
|
||||||
|
ginLogger = rootLogger.getLogger("gin")
|
||||||
|
)
|
||||||
|
|
||||||
type pionLogger struct {
|
type pionLogger struct {
|
||||||
logger *zerolog.Logger
|
logger *zerolog.Logger
|
||||||
}
|
}
|
||||||
|
@ -180,7 +275,7 @@ func (c pionLogger) Errorf(format string, args ...interface{}) {
|
||||||
type pionLoggerFactory struct{}
|
type pionLoggerFactory struct{}
|
||||||
|
|
||||||
func (c pionLoggerFactory) NewLogger(subsystem string) logging.LeveledLogger {
|
func (c pionLoggerFactory) NewLogger(subsystem string) logging.LeveledLogger {
|
||||||
logger := getLogger(subsystem).With().
|
logger := rootLogger.getLogger(subsystem).With().
|
||||||
Str("scope", "pion").
|
Str("scope", "pion").
|
||||||
Str("component", subsystem).
|
Str("component", subsystem).
|
||||||
Logger()
|
Logger()
|
||||||
|
|
10
main.go
10
main.go
|
@ -14,22 +14,26 @@ import (
|
||||||
var appCtx context.Context
|
var appCtx context.Context
|
||||||
|
|
||||||
func Main() {
|
func Main() {
|
||||||
|
LoadConfig()
|
||||||
|
logger.Debug().Msg("config loaded")
|
||||||
|
|
||||||
var cancel context.CancelFunc
|
var cancel context.CancelFunc
|
||||||
appCtx, cancel = context.WithCancel(context.Background())
|
appCtx, cancel = context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
logger.Info().Msg("Starting JetKvm")
|
logger.Info().Msg("starting JetKvm")
|
||||||
|
|
||||||
go runWatchdog()
|
go runWatchdog()
|
||||||
go confirmCurrentSystem()
|
go confirmCurrentSystem()
|
||||||
|
|
||||||
http.DefaultClient.Timeout = 1 * time.Minute
|
http.DefaultClient.Timeout = 1 * time.Minute
|
||||||
LoadConfig()
|
|
||||||
logger.Debug().Msg("config loaded")
|
|
||||||
|
|
||||||
err := rootcerts.UpdateDefaultTransport()
|
err := rootcerts.UpdateDefaultTransport()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warn().Err(err).Msg("failed to load CA certs")
|
logger.Warn().Err(err).Msg("failed to load CA certs")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
initNetwork()
|
||||||
|
|
||||||
go TimeSyncLoop()
|
go TimeSyncLoop()
|
||||||
|
|
||||||
StartNativeCtrlSocketServer()
|
StartNativeCtrlSocketServer()
|
||||||
|
|
56
native.go
56
native.go
|
@ -75,25 +75,29 @@ func CallCtrlAction(action string, params map[string]interface{}) (*CtrlResponse
|
||||||
return nil, fmt.Errorf("error marshaling ctrl action: %w", err)
|
return nil, fmt.Errorf("error marshaling ctrl action: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
nativeLogger.Info().Str("action", ctrlAction.Action).Msg("sending ctrl action")
|
scopedLogger := nativeLogger.With().
|
||||||
|
Str("action", ctrlAction.Action).
|
||||||
|
Interface("params", ctrlAction.Params).Logger()
|
||||||
|
|
||||||
|
scopedLogger.Debug().Msg("sending ctrl action")
|
||||||
|
|
||||||
err = WriteCtrlMessage(jsonData)
|
err = WriteCtrlMessage(jsonData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
delete(ongoingRequests, ctrlAction.Seq)
|
delete(ongoingRequests, ctrlAction.Seq)
|
||||||
return nil, fmt.Errorf("error writing ctrl message: %w", err)
|
return nil, ErrorfL(&scopedLogger, "error writing ctrl message", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case response := <-responseChan:
|
case response := <-responseChan:
|
||||||
delete(ongoingRequests, seq)
|
delete(ongoingRequests, seq)
|
||||||
if response.Error != "" {
|
if response.Error != "" {
|
||||||
return nil, fmt.Errorf("error native response: %s", response.Error)
|
return nil, ErrorfL(&scopedLogger, "error native response: %s", fmt.Errorf(response.Error))
|
||||||
}
|
}
|
||||||
return response, nil
|
return response, nil
|
||||||
case <-time.After(5 * time.Second):
|
case <-time.After(5 * time.Second):
|
||||||
close(responseChan)
|
close(responseChan)
|
||||||
delete(ongoingRequests, seq)
|
delete(ongoingRequests, seq)
|
||||||
return nil, fmt.Errorf("timeout waiting for response")
|
return nil, ErrorfL(&scopedLogger, "timeout waiting for response", nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,31 +119,35 @@ func waitCtrlClientConnected() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func StartNativeSocketServer(socketPath string, handleClient func(net.Conn), isCtrl bool) net.Listener {
|
func StartNativeSocketServer(socketPath string, handleClient func(net.Conn), isCtrl bool) net.Listener {
|
||||||
|
scopedLogger := nativeLogger.With().
|
||||||
|
Str("socket_path", socketPath).
|
||||||
|
Logger()
|
||||||
|
|
||||||
// Remove the socket file if it already exists
|
// Remove the socket file if it already exists
|
||||||
if _, err := os.Stat(socketPath); err == nil {
|
if _, err := os.Stat(socketPath); err == nil {
|
||||||
if err := os.Remove(socketPath); err != nil {
|
if err := os.Remove(socketPath); err != nil {
|
||||||
nativeLogger.Warn().Err(err).Str("socket_path", socketPath).Msg("Failed to remove existing socket file")
|
scopedLogger.Warn().Err(err).Msg("failed to remove existing socket file")
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
listener, err := net.Listen("unixpacket", socketPath)
|
listener, err := net.Listen("unixpacket", socketPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
nativeLogger.Warn().Err(err).Str("socket_path", socketPath).Msg("Failed to start server")
|
scopedLogger.Warn().Err(err).Msg("failed to start server")
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
nativeLogger.Info().Str("socket_path", socketPath).Msg("Server listening")
|
scopedLogger.Info().Msg("server listening")
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
conn, err := listener.Accept()
|
conn, err := listener.Accept()
|
||||||
listener.Close()
|
listener.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
nativeLogger.Warn().Err(err).Str("socket_path", socketPath).Msg("failed to accept sock")
|
scopedLogger.Warn().Err(err).Msg("failed to accept socket")
|
||||||
}
|
}
|
||||||
if isCtrl {
|
if isCtrl {
|
||||||
close(ctrlClientConnected)
|
close(ctrlClientConnected)
|
||||||
nativeLogger.Debug().Msg("first native ctrl socket client connected")
|
scopedLogger.Debug().Msg("first native ctrl socket client connected")
|
||||||
}
|
}
|
||||||
handleClient(conn)
|
handleClient(conn)
|
||||||
}()
|
}()
|
||||||
|
@ -160,9 +168,14 @@ func StartNativeVideoSocketServer() {
|
||||||
func handleCtrlClient(conn net.Conn) {
|
func handleCtrlClient(conn net.Conn) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
nativeLogger.Debug().Msg("native socket client connected")
|
scopedLogger := nativeLogger.With().
|
||||||
|
Str("addr", conn.RemoteAddr().String()).
|
||||||
|
Str("type", "ctrl").
|
||||||
|
Logger()
|
||||||
|
|
||||||
|
scopedLogger.Info().Msg("native ctrl socket client connected")
|
||||||
if ctrlSocketConn != nil {
|
if ctrlSocketConn != nil {
|
||||||
nativeLogger.Debug().Msg("closing existing native socket connection")
|
scopedLogger.Debug().Msg("closing existing native socket connection")
|
||||||
ctrlSocketConn.Close()
|
ctrlSocketConn.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +188,7 @@ func handleCtrlClient(conn net.Conn) {
|
||||||
for {
|
for {
|
||||||
n, err := conn.Read(readBuf)
|
n, err := conn.Read(readBuf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
nativeLogger.Warn().Err(err).Msg("error reading from ctrl sock")
|
scopedLogger.Warn().Err(err).Msg("error reading from ctrl sock")
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
readMsg := string(readBuf[:n])
|
readMsg := string(readBuf[:n])
|
||||||
|
@ -183,10 +196,10 @@ func handleCtrlClient(conn net.Conn) {
|
||||||
ctrlResp := CtrlResponse{}
|
ctrlResp := CtrlResponse{}
|
||||||
err = json.Unmarshal([]byte(readMsg), &ctrlResp)
|
err = json.Unmarshal([]byte(readMsg), &ctrlResp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
nativeLogger.Warn().Err(err).Str("data", readMsg).Msg("error parsing ctrl sock msg")
|
scopedLogger.Warn().Err(err).Str("data", readMsg).Msg("error parsing ctrl sock msg")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
nativeLogger.Trace().Interface("data", ctrlResp).Msg("ctrl sock msg")
|
scopedLogger.Trace().Interface("data", ctrlResp).Msg("ctrl sock msg")
|
||||||
|
|
||||||
if ctrlResp.Seq != 0 {
|
if ctrlResp.Seq != 0 {
|
||||||
responseChan, ok := ongoingRequests[ctrlResp.Seq]
|
responseChan, ok := ongoingRequests[ctrlResp.Seq]
|
||||||
|
@ -200,20 +213,25 @@ func handleCtrlClient(conn net.Conn) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nativeLogger.Debug().Msg("ctrl sock disconnected")
|
scopedLogger.Debug().Msg("ctrl sock disconnected")
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleVideoClient(conn net.Conn) {
|
func handleVideoClient(conn net.Conn) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
nativeLogger.Info().Str("addr", conn.RemoteAddr().String()).Msg("Native video socket client connected")
|
scopedLogger := nativeLogger.With().
|
||||||
|
Str("addr", conn.RemoteAddr().String()).
|
||||||
|
Str("type", "video").
|
||||||
|
Logger()
|
||||||
|
|
||||||
|
scopedLogger.Info().Msg("native video socket client connected")
|
||||||
|
|
||||||
inboundPacket := make([]byte, maxFrameSize)
|
inboundPacket := make([]byte, maxFrameSize)
|
||||||
lastFrame := time.Now()
|
lastFrame := time.Now()
|
||||||
for {
|
for {
|
||||||
n, err := conn.Read(inboundPacket)
|
n, err := conn.Read(inboundPacket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
nativeLogger.Warn().Err(err).Msg("error during read")
|
scopedLogger.Warn().Err(err).Msg("error during read")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
|
@ -222,7 +240,7 @@ func handleVideoClient(conn net.Conn) {
|
||||||
if currentSession != nil {
|
if currentSession != nil {
|
||||||
err := currentSession.VideoTrack.WriteSample(media.Sample{Data: inboundPacket[:n], Duration: sinceLastFrame})
|
err := currentSession.VideoTrack.WriteSample(media.Sample{Data: inboundPacket[:n], Duration: sinceLastFrame})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
nativeLogger.Warn().Err(err).Msg("error writing sample")
|
scopedLogger.Warn().Err(err).Msg("error writing sample")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -277,7 +295,7 @@ func ExtractAndRunNativeBin() error {
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
nativeLogger.Info().Int("pid", cmd.Process.Pid).Msg("Binary started")
|
nativeLogger.Info().Int("pid", cmd.Process.Pid).Msg("jetkvm_native binary started")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
19
network.go
19
network.go
|
@ -105,7 +105,11 @@ func checkNetworkState() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if newState != networkState {
|
if newState != networkState {
|
||||||
logger.Info().Msg("network state changed")
|
logger.Info().
|
||||||
|
Interface("newState", newState).
|
||||||
|
Interface("oldState", networkState).
|
||||||
|
Msg("network state changed")
|
||||||
|
|
||||||
// restart MDNS
|
// restart MDNS
|
||||||
_ = startMDNS()
|
_ = startMDNS()
|
||||||
networkState = newState
|
networkState = newState
|
||||||
|
@ -116,7 +120,7 @@ func checkNetworkState() {
|
||||||
func startMDNS() error {
|
func startMDNS() error {
|
||||||
// If server was previously running, stop it
|
// If server was previously running, stop it
|
||||||
if mDNSConn != nil {
|
if mDNSConn != nil {
|
||||||
logger.Info().Msg("Stopping mDNS server")
|
logger.Info().Msg("stopping mDNS server")
|
||||||
err := mDNSConn.Close()
|
err := mDNSConn.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warn().Err(err).Msg("failed to stop mDNS server")
|
logger.Warn().Err(err).Msg("failed to stop mDNS server")
|
||||||
|
@ -124,7 +128,11 @@ func startMDNS() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start a new server
|
// Start a new server
|
||||||
logger.Info().Msg("Starting mDNS server on jetkvm.local")
|
hostname := "jetkvm.local"
|
||||||
|
|
||||||
|
scopedLogger := logger.With().Str("hostname", hostname).Logger()
|
||||||
|
scopedLogger.Info().Msg("starting mDNS server")
|
||||||
|
|
||||||
addr4, err := net.ResolveUDPAddr("udp4", mdns.DefaultAddressIPv4)
|
addr4, err := net.ResolveUDPAddr("udp4", mdns.DefaultAddressIPv4)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -146,10 +154,11 @@ func startMDNS() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
mDNSConn, err = mdns.Server(ipv4.NewPacketConn(l4), ipv6.NewPacketConn(l6), &mdns.Config{
|
mDNSConn, err = mdns.Server(ipv4.NewPacketConn(l4), ipv6.NewPacketConn(l6), &mdns.Config{
|
||||||
LocalNames: []string{"jetkvm.local"}, //TODO: make it configurable
|
LocalNames: []string{hostname}, //TODO: make it configurable
|
||||||
LoggerFactory: defaultLoggerFactory,
|
LoggerFactory: defaultLoggerFactory,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
scopedLogger.Warn().Err(err).Msg("failed to start mDNS server")
|
||||||
mDNSConn = nil
|
mDNSConn = nil
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -190,7 +199,7 @@ func getNTPServersFromDHCPInfo() ([]string, error) {
|
||||||
return servers, nil
|
return servers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func initNetwork() {
|
||||||
ensureConfigLoaded()
|
ensureConfigLoaded()
|
||||||
|
|
||||||
updates := make(chan netlink.LinkUpdate)
|
updates := make(chan netlink.LinkUpdate)
|
||||||
|
|
2
ota.go
2
ota.go
|
@ -194,7 +194,7 @@ func downloadFile(ctx context.Context, path string, url string, downloadProgress
|
||||||
|
|
||||||
func verifyFile(path string, expectedHash string, verifyProgress *float32, scopedLogger *zerolog.Logger) error {
|
func verifyFile(path string, expectedHash string, verifyProgress *float32, scopedLogger *zerolog.Logger) error {
|
||||||
if scopedLogger == nil {
|
if scopedLogger == nil {
|
||||||
scopedLogger = &otaLogger
|
scopedLogger = otaLogger
|
||||||
}
|
}
|
||||||
|
|
||||||
unverifiedPath := path + ".unverified"
|
unverifiedPath := path + ".unverified"
|
||||||
|
|
2
usb.go
2
usb.go
|
@ -15,7 +15,7 @@ func initUsbGadget() {
|
||||||
"jetkvm",
|
"jetkvm",
|
||||||
config.UsbDevices,
|
config.UsbDevices,
|
||||||
config.UsbConfig,
|
config.UsbConfig,
|
||||||
&usbLogger,
|
usbLogger,
|
||||||
)
|
)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
|
|
2
web.go
2
web.go
|
@ -69,7 +69,7 @@ func setupRouter() *gin.Engine {
|
||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
r.Use(gin_logger.SetLogger(
|
r.Use(gin_logger.SetLogger(
|
||||||
gin_logger.WithLogger(func(*gin.Context, zerolog.Logger) zerolog.Logger {
|
gin_logger.WithLogger(func(*gin.Context, zerolog.Logger) zerolog.Logger {
|
||||||
return ginLogger
|
return *ginLogger
|
||||||
}),
|
}),
|
||||||
))
|
))
|
||||||
staticFS, _ := fs.Sub(staticFiles, "static")
|
staticFS, _ := fs.Sub(staticFiles, "static")
|
||||||
|
|
|
@ -38,12 +38,12 @@ func initCertStore() {
|
||||||
websecureLogger.Warn().Msg("TLS store already initialized, it should not be initialized again")
|
websecureLogger.Warn().Msg("TLS store already initialized, it should not be initialized again")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
certStore = websecure.NewCertStore(tlsStorePath, &websecureLogger)
|
certStore = websecure.NewCertStore(tlsStorePath, websecureLogger)
|
||||||
certStore.LoadCertificates()
|
certStore.LoadCertificates()
|
||||||
|
|
||||||
certSigner = websecure.NewSelfSigner(
|
certSigner = websecure.NewSelfSigner(
|
||||||
certStore,
|
certStore,
|
||||||
&websecureLogger,
|
websecureLogger,
|
||||||
webSecureSelfSignedDefaultDomain,
|
webSecureSelfSignedDefaultDomain,
|
||||||
webSecureSelfSignedOrganization,
|
webSecureSelfSignedOrganization,
|
||||||
webSecureSelfSignedOU,
|
webSecureSelfSignedOU,
|
||||||
|
|
|
@ -77,7 +77,7 @@ func newSession(config SessionConfig) (*Session, error) {
|
||||||
l := config.Logger.With().Str("component", "webrtc").Logger()
|
l := config.Logger.With().Str("component", "webrtc").Logger()
|
||||||
scopedLogger = &l
|
scopedLogger = &l
|
||||||
} else {
|
} else {
|
||||||
scopedLogger = &webrtcLogger
|
scopedLogger = webrtcLogger
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.IsCloud {
|
if config.IsCloud {
|
||||||
|
|
6
wol.go
6
wol.go
|
@ -11,7 +11,7 @@ func rpcSendWOLMagicPacket(macAddress string) error {
|
||||||
// Parse the MAC address
|
// Parse the MAC address
|
||||||
mac, err := net.ParseMAC(macAddress)
|
mac, err := net.ParseMAC(macAddress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrorfL(&wolLogger, "invalid MAC address", err)
|
return ErrorfL(wolLogger, "invalid MAC address", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the magic packet
|
// Create the magic packet
|
||||||
|
@ -20,14 +20,14 @@ func rpcSendWOLMagicPacket(macAddress string) error {
|
||||||
// Set up UDP connection
|
// Set up UDP connection
|
||||||
conn, err := net.Dial("udp", "255.255.255.255:9")
|
conn, err := net.Dial("udp", "255.255.255.255:9")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrorfL(&wolLogger, "failed to establish UDP connection", err)
|
return ErrorfL(wolLogger, "failed to establish UDP connection", err)
|
||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
// Send the packet
|
// Send the packet
|
||||||
_, err = conn.Write(packet)
|
_, err = conn.Write(packet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrorfL(&wolLogger, "failed to send WOL packet", err)
|
return ErrorfL(wolLogger, "failed to send WOL packet", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
wolLogger.Info().Str("mac", macAddress).Msg("WOL packet sent")
|
wolLogger.Info().Str("mac", macAddress).Msg("WOL packet sent")
|
||||||
|
|
Loading…
Reference in New Issue