Checkpoint
Some checks failed
Test and build / Test and lint (push) Failing after 36s
Test and build / Build collector (push) Failing after 43s
Test and build / Build receiver (push) Failing after 42s

This commit is contained in:
2026-03-05 15:38:18 +01:00
parent 3106b2cf45
commit 13afa08e8a
108 changed files with 19509 additions and 729 deletions

99
server/server.go Normal file
View File

@@ -0,0 +1,99 @@
package server
import (
"fmt"
"net"
echologrus "github.com/cemkiy/echo-logrus"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"github.com/sirupsen/logrus"
"git.maze.io/ham/hamview/schema"
)
const DefaultServerListen = ":8073"
// Config holds the server configuration
type Config struct {
Listen string `yaml:"listen"`
}
// DatabaseConfig holds database configuration
type DatabaseConfig struct {
Type string `yaml:"type"`
Conf string `yaml:"conf"`
}
// Server represents the HTTP server
type Server struct {
listen string
listenAddr *net.TCPAddr
logger *logrus.Logger
}
// New creates a new Server instance
func New(serverConfig *Config, databaseConfig *DatabaseConfig, logger *logrus.Logger) (*Server, error) {
if serverConfig.Listen == "" {
serverConfig.Listen = DefaultServerListen
}
listenAddr, err := net.ResolveTCPAddr("tcp", serverConfig.Listen)
if err != nil {
return nil, fmt.Errorf("hamview: invalid listen address %q: %v", serverConfig.Listen, err)
}
if err = schema.Open(databaseConfig.Type, databaseConfig.Conf); err != nil {
return nil, err
}
return &Server{
listen: serverConfig.Listen,
listenAddr: listenAddr,
logger: logger,
}, nil
}
// Run starts the HTTP server
func (s *Server) Run() error {
echologrus.Logger = s.logger
e := echo.New()
e.HideBanner = true
e.Logger = echologrus.GetEchoLogger()
e.Use(echologrus.Hook())
e.Use(middleware.RequestLogger())
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{"*"},
AllowHeaders: []string{echo.HeaderOrigin, echo.HeaderContentType, echo.HeaderAccept},
}))
// Static files
e.File("/", "./dashboard/dist/index.html")
e.Static("/asset/", "./asset")
e.Static("/assets/", "./dashboard/dist/assets")
// Setup API routes
setupRoutes(s, e)
if s.listenAddr.IP == nil || s.listenAddr.IP.Equal(net.ParseIP("0.0.0.0")) || s.listenAddr.IP.Equal(net.ParseIP("::")) {
s.logger.Infof("server: listening on http://127.0.0.1:%d", s.listenAddr.Port)
} else {
s.logger.Infof("server: listening on http://%s:%d", s.listenAddr.IP, s.listenAddr.Port)
}
return e.Start(s.listen)
}
// NewTestServer creates a server for testing with an in-memory SQLite database
func NewTestServer(logger *logrus.Logger) (*Server, error) {
serverConfig := &Config{
Listen: "127.0.0.1:0",
}
databaseConfig := &DatabaseConfig{
Type: "sqlite3",
Conf: ":memory:",
}
return New(serverConfig, databaseConfig, logger)
}