Skip to content

Commit 0d46e00

Browse files
author
Datanoise
committed
pre-implementation commit: including various improvements and fixes
1 parent f608f7d commit 0d46e00

24 files changed

Lines changed: 769 additions & 298 deletions

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ require (
1212
github.com/kazzmir/opus-go v1.2.1
1313
github.com/pion/webrtc/v4 v4.2.8
1414
github.com/sirupsen/logrus v1.9.4
15+
go.uber.org/zap v1.27.1
1516
golang.org/x/crypto v0.48.0
1617
golang.org/x/sys v0.41.0
1718
gorm.io/gorm v1.31.1
@@ -41,6 +42,7 @@ require (
4142
github.com/pion/turn/v4 v4.1.4 // indirect
4243
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
4344
github.com/wlynxg/anet v0.0.5 // indirect
45+
go.uber.org/multierr v1.10.0 // indirect
4446
golang.org/x/net v0.50.0 // indirect
4547
golang.org/x/text v0.34.0 // indirect
4648
golang.org/x/time v0.10.0 // indirect

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD
7474
github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU=
7575
github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
7676
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
77+
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
78+
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
79+
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
80+
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
81+
go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
82+
go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
7783
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
7884
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
7985
golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=

logger/logger.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package logger
2+
3+
import (
4+
"os"
5+
6+
"go.uber.org/zap"
7+
"go.uber.org/zap/zapcore"
8+
)
9+
10+
var L *zap.SugaredLogger
11+
12+
func Init(level string, jsonFormat bool, logFile string) (*zap.Logger, error) {
13+
var zapLevel zapcore.Level
14+
if err := zapLevel.UnmarshalText([]byte(level)); err != nil {
15+
zapLevel = zap.InfoLevel
16+
}
17+
18+
encoderConfig := zap.NewProductionEncoderConfig()
19+
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
20+
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
21+
22+
var encoder zapcore.Encoder
23+
if jsonFormat {
24+
encoder = zapcore.NewJSONEncoder(encoderConfig)
25+
} else {
26+
encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
27+
encoder = zapcore.NewConsoleEncoder(encoderConfig)
28+
}
29+
30+
var writeSyncer zapcore.WriteSyncer
31+
if logFile != "" {
32+
f, err := os.OpenFile(logFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
33+
if err != nil {
34+
return nil, err
35+
}
36+
writeSyncer = zapcore.AddSync(f)
37+
} else {
38+
writeSyncer = zapcore.AddSync(os.Stdout)
39+
}
40+
41+
core := zapcore.NewCore(encoder, writeSyncer, zapLevel)
42+
logger := zap.New(core, zap.AddCaller())
43+
L = logger.Sugar()
44+
45+
return logger, nil
46+
}
47+
48+
func NewAuthLogger(level string, jsonFormat bool, logFile string) (*zap.SugaredLogger, error) {
49+
var zapLevel zapcore.Level
50+
if err := zapLevel.UnmarshalText([]byte(level)); err != nil {
51+
zapLevel = zap.InfoLevel
52+
}
53+
54+
encoderConfig := zap.NewProductionEncoderConfig()
55+
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
56+
57+
var encoder zapcore.Encoder
58+
if jsonFormat {
59+
encoder = zapcore.NewJSONEncoder(encoderConfig)
60+
} else {
61+
encoder = zapcore.NewConsoleEncoder(encoderConfig)
62+
}
63+
64+
f, err := os.OpenFile(logFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
65+
if err != nil {
66+
return nil, err
67+
}
68+
writeSyncer := zapcore.AddSync(f)
69+
70+
core := zapcore.NewCore(encoder, writeSyncer, zapLevel)
71+
logger := zap.New(core)
72+
return logger.Sugar(), nil
73+
}

main.go

Lines changed: 21 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ import (
1616
"time"
1717

1818
"github.com/DatanoiseTV/tinyice/config"
19+
"github.com/DatanoiseTV/tinyice/logger"
1920
"github.com/DatanoiseTV/tinyice/server"
2021
"github.com/DatanoiseTV/tinyice/updater"
21-
"github.com/sirupsen/logrus"
22+
"go.uber.org/zap"
2223
)
2324

2425
var (
@@ -49,48 +50,19 @@ func generateRandomString(n int) string {
4950
return hex.EncodeToString(b)
5051
}
5152

52-
func initLogging() *logrus.Logger {
53-
// Set Level
54-
level, err := logrus.ParseLevel(strings.ToLower(*logLevel))
53+
func initLogging() *zap.SugaredLogger {
54+
_, err := logger.Init(*logLevel, *jsonLogs, *logFile)
5555
if err != nil {
56-
logrus.Warnf("Invalid log level '%s', defaulting to info", *logLevel)
57-
level = logrus.InfoLevel
56+
fmt.Printf("Failed to initialize logging: %v\n", err)
57+
os.Exit(1)
5858
}
59-
logrus.SetLevel(level)
6059

61-
// Set Format
62-
var formatter logrus.Formatter
63-
if *jsonLogs {
64-
formatter = &logrus.JSONFormatter{}
65-
} else {
66-
formatter = &logrus.TextFormatter{
67-
FullTimestamp: true,
68-
}
69-
}
70-
logrus.SetFormatter(formatter)
71-
72-
// Set Output
73-
if *logFile != "" {
74-
f, err := os.OpenFile(*logFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
75-
if err != nil {
76-
logrus.Fatalf("Failed to open log file %s: %v", *logFile, err)
77-
}
78-
logrus.SetOutput(f)
79-
} else {
80-
logrus.SetOutput(os.Stdout)
81-
}
82-
83-
// Create Auth Logger if needed
8460
if *authLogFile != "" {
85-
authLogger := logrus.New()
86-
authLogger.SetLevel(level)
87-
authLogger.SetFormatter(formatter)
88-
f, err := os.OpenFile(*authLogFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
61+
al, err := logger.NewAuthLogger(*logLevel, *jsonLogs, *authLogFile)
8962
if err != nil {
90-
logrus.Fatalf("Failed to open auth log file %s: %v", *authLogFile, err)
63+
logger.L.Fatalf("Failed to open auth log file %s: %v", *authLogFile, err)
9164
}
92-
authLogger.SetOutput(f)
93-
return authLogger
65+
return al
9466
}
9567

9668
return nil
@@ -129,15 +101,15 @@ func main() {
129101
}
130102

131103
if err := os.WriteFile(actualPidFile, []byte(fmt.Sprintf("%d", os.Getpid())), 0644); err != nil {
132-
logrus.Errorf("Failed to write PID file: %v", err)
104+
logger.L.Errorf("Failed to write PID file: %v", err)
133105
}
134106
defer os.Remove(actualPidFile)
135107

136108
ensureConfigExists()
137109

138110
cfg, err := config.LoadConfig(*configPath)
139111
if err != nil {
140-
logrus.Fatalf("Failed to load config: %v", err)
112+
logger.L.Fatalf("Failed to load config: %v", err)
141113
}
142114

143115
if handleCommands(cfg) {
@@ -181,7 +153,7 @@ func main() {
181153

182154
go func() {
183155
if err := srv.Start(); err != nil && err.Error() != "http: Server closed" {
184-
logrus.Fatalf("Server failed: %v", err)
156+
logger.L.Fatalf("Server failed: %v", err)
185157
}
186158
}()
187159

@@ -410,7 +382,7 @@ func handleDaemonMode() {
410382
cmd := exec.Command(os.Args[0], args...)
411383
cmd.Env = append(os.Environ(), "TINYICE_DAEMON=1")
412384
if err := cmd.Start(); err != nil {
413-
logrus.Fatalf("Failed to start daemon: %v", err)
385+
logger.L.Fatalf("Failed to start daemon: %v", err)
414386
}
415387
fmt.Printf("TinyIce starting in background (PID: %d)\n", cmd.Process.Pid)
416388
os.Exit(0)
@@ -419,7 +391,7 @@ func handleDaemonMode() {
419391

420392
func ensureConfigExists() {
421393
if _, err := os.Stat(*configPath); os.IsNotExist(err) {
422-
logrus.Info("Config file not found, generating secure defaults...")
394+
logger.L.Info("Config file not found, generating secure defaults...")
423395

424396
defaultSourcePass := generateRandomString(12)
425397
liveMountPass := generateRandomString(12)
@@ -457,7 +429,7 @@ func ensureConfigExists() {
457429

458430
data, _ := json.MarshalIndent(defaultCfg, "", " ")
459431
if err := os.WriteFile(*configPath, data, 0600); err != nil {
460-
logrus.Fatalf("Failed to create secure config: %v", err)
432+
logger.L.Fatalf("Failed to create secure config: %v", err)
461433
}
462434

463435
fmt.Println("**************************************************")
@@ -469,7 +441,7 @@ func ensureConfigExists() {
469441
fmt.Println(" Stored in:", *configPath)
470442
fmt.Println("**************************************************")
471443
} else {
472-
logrus.WithField("path", *configPath).Info("Starting TinyIce with existing configuration")
444+
logger.L.Infow("Starting TinyIce with existing configuration", "path", *configPath)
473445
fmt.Printf("Note: To reset all credentials, run: rm %s && ./tinyice\n", *configPath)
474446
}
475447
}
@@ -479,21 +451,21 @@ func runEventLoop(srv *server.Server, sigs chan os.Signal) {
479451
sig := <-sigs
480452
switch sig {
481453
case syscall.SIGHUP:
482-
logrus.Info("Received SIGHUP, reloading configuration...")
454+
logger.L.Info("Received SIGHUP, reloading configuration...")
483455
newCfg, err := config.LoadConfig(*configPath)
484456
if err != nil {
485-
logrus.Errorf("Failed to reload config: %v", err)
457+
logger.L.Errorf("Failed to reload config: %v", err)
486458
continue
487459
}
488460
srv.ReloadConfig(newCfg)
489461
case syscall.SIGINT, syscall.SIGTERM:
490-
logrus.Infof("Received %v, shutting down...", sig)
462+
logger.L.Infof("Received %v, shutting down...", sig)
491463
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
492464
defer cancel()
493465
if err := srv.Shutdown(ctx); err != nil {
494-
logrus.Errorf("Graceful shutdown failed: %v", err)
466+
logger.L.Errorf("Graceful shutdown failed: %v", err)
495467
}
496-
logrus.Info("TinyIce stopped")
468+
logger.L.Info("TinyIce stopped")
497469
return
498470
}
499471
}

relay/client.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"sync"
1111
"time"
1212

13-
"github.com/sirupsen/logrus"
13+
"github.com/DatanoiseTV/tinyice/logger"
1414
)
1515

1616
type RelayInstance struct {
@@ -120,7 +120,7 @@ func (rm *RelayManager) runRelay(ctx context.Context, inst *RelayInstance) {
120120
}
121121

122122
func (rm *RelayManager) performPull(ctx context.Context, inst *RelayInstance) {
123-
logrus.WithField("url", inst.URL).Info("Attempting to pull relay stream")
123+
logger.L.Infow("Attempting to pull relay stream", "url", inst.URL)
124124

125125
req, err := http.NewRequestWithContext(ctx, "GET", inst.URL, nil)
126126
if err != nil {
@@ -137,17 +137,17 @@ func (rm *RelayManager) performPull(ctx context.Context, inst *RelayInstance) {
137137

138138
resp, err := http.DefaultClient.Do(req)
139139
if err != nil {
140-
logrus.WithError(err).Error("Relay connection failed")
140+
logger.L.Errorf("Relay connection failed: %v", err)
141141
return
142142
}
143143
defer resp.Body.Close()
144144

145145
if resp.StatusCode != http.StatusOK {
146-
logrus.WithField("status", resp.Status).Error("Relay server returned non-200")
146+
logger.L.Errorw("Relay server returned non-200", "status", resp.Status)
147147
return
148148
}
149149

150-
logrus.WithField("mount", inst.Mount).Info("Relay stream connected and pulling")
150+
logger.L.Infow("Relay stream connected and pulling", "mount", inst.Mount)
151151

152152
stream := rm.relay.GetOrCreateStream(inst.Mount)
153153
stream.SourceIP = "relay-pull"

0 commit comments

Comments
 (0)