From d8bf22bef069f8e2daef47d8dbf51c88cfeca928 Mon Sep 17 00:00:00 2001 From: lucheng Date: Fri, 5 Jul 2024 17:03:18 +0800 Subject: [PATCH] Make index.html configurable --- config/config.yaml | 3 ++- pkg/config/config.go | 39 ++++++++++++++++++++++++++------------ pkg/server/server_linux.go | 3 ++- pkg/server/web_linux.go | 5 +++-- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index a25f05d..a0f497d 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -11,4 +11,5 @@ routes: nexthop: wj # route nexthop user name web: enable: true - port: 8000 \ No newline at end of file + #port: 8000 + index: "/opt/virtuallan/static/index.html" # web index html file, must name as index.html \ No newline at end of file diff --git a/pkg/config/config.go b/pkg/config/config.go index 1e57869..44ae56f 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -4,6 +4,7 @@ import ( "fmt" "net" "os" + "strings" "github.com/creasty/defaults" "github.com/go-playground/validator/v10" @@ -16,8 +17,9 @@ const ( ) type WebConfig struct { - Enable bool `yaml:"enable"` - Port int `yaml:"port"` + Enable bool `yaml:"enable"` + Port int `yaml:"port" default:"8000"` + Index string `yaml:"index" validate:"required,validateIndex" default:"./static/index.html"` } type RoutesConfig struct { @@ -26,14 +28,14 @@ type RoutesConfig struct { } type ServerConfig struct { - Port int `yaml:"port" default:"6123"` - IP string `yaml:"ip" validate:"required"` - Bridge string `yaml:"bridge" validate:"required"` - LogLevel string `yaml:"log-level" default:"info"` - Key string `yaml:"key" validate:"required,validateKeyLen"` - DHCPRange string `yaml:"dhcp-range" validate:"required"` - WebConfig `yaml:"web"` - Routes []RoutesConfig `yaml:"routes"` + Port int `yaml:"port" default:"6123"` + IP string `yaml:"ip" validate:"required"` + Bridge string `yaml:"bridge" validate:"required"` + LogLevel string `yaml:"log-level" default:"info"` + Key string `yaml:"key" validate:"required,validateKeyLen"` + DHCPRange string `yaml:"dhcp-range" validate:"required"` + *WebConfig `yaml:"web"` + Routes []RoutesConfig `yaml:"routes"` } func GetCfgPath(dir string) string { @@ -51,14 +53,21 @@ func LoadConfigFile(path string) (*ServerConfig, error) { } cfg := new(ServerConfig) + cfg.WebConfig = new(WebConfig) + err = yaml.Unmarshal(f, cfg) if err != nil { return nil, err } + if err := defaults.Set(cfg); err != nil { + return nil, err + } + cfgValidator := validator.New() cfgValidator.RegisterValidation("validateKeyLen", ValidateKeyLength) cfgValidator.RegisterValidation("validateCidr", ValidateCIDR) + cfgValidator.RegisterValidation("validateIndex", ValidateIndex) if err := cfgValidator.Struct(cfg); err != nil { return nil, err @@ -70,13 +79,19 @@ func LoadConfigFile(path string) (*ServerConfig, error) { } } - if err := defaults.Set(cfg); err != nil { - return nil, err + if cfg.WebConfig != nil && cfg.WebConfig.Enable { + if err := cfgValidator.Struct(cfg.WebConfig); err != nil { + return nil, err + } } return cfg, nil } +func ValidateIndex(fl validator.FieldLevel) bool { + return strings.HasSuffix(fl.Field().String(), "index.html") +} + func ValidateCIDR(fl validator.FieldLevel) bool { if _, _, err := net.ParseCIDR(fl.Field().String()); err != nil { return false diff --git a/pkg/server/server_linux.go b/pkg/server/server_linux.go index aef9290..f278c78 100644 --- a/pkg/server/server_linux.go +++ b/pkg/server/server_linux.go @@ -150,7 +150,8 @@ func Run(cCtx *cli.Context) error { // Run web server if svc.ServerConfig.WebConfig.Enable { webSvc := &webServe{ - port: svc.ServerConfig.WebConfig.Port, + port: svc.ServerConfig.WebConfig.Port, + index: svc.ServerConfig.WebConfig.Index, } go webSvc.Serve() log.Info("run web server on port ", webSvc.port) diff --git a/pkg/server/web_linux.go b/pkg/server/web_linux.go index e9599d7..535bd13 100644 --- a/pkg/server/web_linux.go +++ b/pkg/server/web_linux.go @@ -11,7 +11,8 @@ import ( ) type webServe struct { - port int + port int + index string } type EpEntry struct { @@ -67,7 +68,7 @@ func (svc *webServe) Serve() { gin.DefaultWriter = io.Discard router := gin.Default() - router.LoadHTMLFiles("./static/index.html") + router.LoadHTMLFiles(svc.index) router.GET("/endpoints", listEpEntries) router.GET("/", func(c *gin.Context) {