From a5f6c3b1d9f699e766a2132922a7079c55916244 Mon Sep 17 00:00:00 2001 From: imbytecat Date: Fri, 23 Aug 2024 13:28:48 +0800 Subject: [PATCH] =?UTF-8?q?refactor(zabbix):=20=E4=BD=BF=20zabbix=20agent?= =?UTF-8?q?=20=E6=8F=92=E4=BB=B6=E9=9B=86=E6=88=90=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + config.yaml | 10 +---- config/config.go | 27 +++++--------- config/integration.go | 10 ----- constant/app.go | 6 +++ integration/zabbixagent/constant.go | 5 +++ integration/zabbixagent/handler.go | 10 ++--- integration/zabbixagent/main.go | 3 +- integration/zabbixagent/plugin.go | 11 ++---- main.go | 55 +++++++++++++++++++++------- router/handler/onvif/subscription.go | 2 +- zabbixagent.dockerfile | 6 +-- 12 files changed, 78 insertions(+), 68 deletions(-) delete mode 100644 config/integration.go create mode 100644 constant/app.go create mode 100644 integration/zabbixagent/constant.go diff --git a/.gitignore b/.gitignore index edc87bc..3b8d2c5 100644 --- a/.gitignore +++ b/.gitignore @@ -170,6 +170,7 @@ Temporary Items .apdisk # Application +log/ config.dev.yaml compose.dev.yaml diff --git a/config.yaml b/config.yaml index 2671bcb..bcf59ef 100644 --- a/config.yaml +++ b/config.yaml @@ -1,12 +1,4 @@ -server: +app: port: 8080 host: "localhost" - -app: url: "http://localhost:8080" - -integrations: - zabbix_agent: - plugin: - name: "Onvif" - version: "1.0.0" diff --git a/config/config.go b/config/config.go index 5d3b3e9..c4a831a 100644 --- a/config/config.go +++ b/config/config.go @@ -4,29 +4,21 @@ import ( "fmt" "github.com/spf13/viper" "log" + "onvif-agent/constant" "os" ) type config struct { - Server serverConfig `mapstructure:"server"` - App appConfig `mapstructure:"app"` - Integrations integrationConfig `mapstructure:"integrations"` -} - -type serverConfig struct { - Port int `mapstructure:"port"` - Host string `mapstructure:"host"` + App appConfig `mapstructure:"app"` } type appConfig struct { - URL string `mapstructure:"url"` + Port int `mapstructure:"port"` + Host string `mapstructure:"host"` + URL string `mapstructure:"url"` // web server url } -type integrationConfig struct { - ZabbixAgent IntegrationConfig `mapstructure:"zabbix_agent"` -} - -var Conf config +var Config config func LoadConfig() error { env := os.Getenv("PROFILE") @@ -37,17 +29,18 @@ func LoadConfig() error { configName = fmt.Sprint("config.", env) } - log.Println("Loading config: ", configName) - viper.SetConfigName(configName) viper.SetConfigType("yaml") viper.AddConfigPath(".") + viper.AddConfigPath(fmt.Sprintf("/etc/%s", constant.AppName)) if err := viper.ReadInConfig(); err != nil { return err } - if err := viper.Unmarshal(&Conf); err != nil { + log.Println("Loading config file:", viper.ConfigFileUsed()) + + if err := viper.Unmarshal(&Config); err != nil { return err } diff --git a/config/integration.go b/config/integration.go deleted file mode 100644 index 47d605a..0000000 --- a/config/integration.go +++ /dev/null @@ -1,10 +0,0 @@ -package config - -type IntegrationConfig struct { - Plugin PluginConfig `mapstructure:"plugin"` -} - -type PluginConfig struct { - Name string `mapstructure:"name"` - Version string `mapstructure:"version"` -} diff --git a/constant/app.go b/constant/app.go new file mode 100644 index 0000000..c182bff --- /dev/null +++ b/constant/app.go @@ -0,0 +1,6 @@ +package constant + +const ( + AppName = "onvif-agent" + AppVersion = "1.0.0" +) diff --git a/integration/zabbixagent/constant.go b/integration/zabbixagent/constant.go new file mode 100644 index 0000000..cd480bb --- /dev/null +++ b/integration/zabbixagent/constant.go @@ -0,0 +1,5 @@ +package zabbixagent + +const ( + PluginName = "OnvifAgent" +) diff --git a/integration/zabbixagent/handler.go b/integration/zabbixagent/handler.go index bc0d695..7752017 100644 --- a/integration/zabbixagent/handler.go +++ b/integration/zabbixagent/handler.go @@ -7,6 +7,7 @@ import ( "io" "net/http" "onvif-agent/config" + "onvif-agent/constant" "strings" ) @@ -22,8 +23,8 @@ type Handler struct { client *http.Client } -func (h *Handler) GetPluginVersion(_ context.Context, _ map[string]string, _ ...string) (any, error) { - return config.Conf.Integrations.ZabbixAgent.Plugin.Version, nil +func (h *Handler) GetAppVersion(_ context.Context, _ map[string]string, _ ...string) (any, error) { + return constant.AppVersion, nil } func (h *Handler) HTTPClient(ctx context.Context, params map[string]string, _ ...string) (any, error) { @@ -34,13 +35,12 @@ func (h *Handler) HTTPClient(ctx context.Context, params map[string]string, _ .. url := params["url"] if !strings.HasPrefix(url, "http") { - url = fmt.Sprintf("http://localhost:%d/%s", config.Conf.Server.Port, url) + url = fmt.Sprintf("http://localhost:%d/%s", config.Config.App.Port, url) } body := params["body"] - //req, err := http.NewRequestWithContext(ctx, method, "https://api.imbytecat.com/ip", http.NoBody) - req, err := http.NewRequestWithContext(ctx, method, "https://api.imbytecat.com/ip", strings.NewReader(body)) + req, err := http.NewRequestWithContext(ctx, method, "https://api.imbytecat.com/ip", strings.NewReader(body)) // TODO: if empty use http.NoBody if err != nil { return nil, errs.Wrapf(err, "failed to create request") } diff --git a/integration/zabbixagent/main.go b/integration/zabbixagent/main.go index 471db65..178d659 100644 --- a/integration/zabbixagent/main.go +++ b/integration/zabbixagent/main.go @@ -3,7 +3,6 @@ package zabbixagent import ( "errors" "fmt" - "onvif-agent/config" "os" "golang.zabbix.com/sdk/plugin/flag" @@ -37,7 +36,7 @@ const ( func Run() { err := flag.HandleFlags( - config.Conf.Integrations.ZabbixAgent.Plugin.Name, + PluginName, os.Args[0], fmt.Sprintf(copyrightMessage, pluginLicenseYear), pluginVersionRC, diff --git a/integration/zabbixagent/plugin.go b/integration/zabbixagent/plugin.go index 5241ef1..7080d5e 100644 --- a/integration/zabbixagent/plugin.go +++ b/integration/zabbixagent/plugin.go @@ -7,12 +7,9 @@ import ( "golang.zabbix.com/sdk/plugin" "golang.zabbix.com/sdk/plugin/container" "golang.zabbix.com/sdk/zbxerr" - "onvif-agent/config" "time" ) -var Name = config.Conf.Integrations.ZabbixAgent.Plugin.Name - type metricKey string type metricBinding struct { @@ -34,7 +31,7 @@ func Launch() error { return err } - h, err := container.NewHandler(Name) + h, err := container.NewHandler(PluginName) if err != nil { return errs.Wrap(err, "failed to create new handler") } @@ -81,11 +78,11 @@ func (p *zabbixAgentPlugin) registerMetrics() error { p.metrics = map[metricKey]*metricBinding{ "onvif.version": { metric: metric.New( - "ONVIF plugin version", + "ONVIF app version", nil, false, ), - handler: h.GetPluginVersion, + handler: h.GetAppVersion, }, "onvif.client": { metric: metric.New( @@ -107,7 +104,7 @@ func (p *zabbixAgentPlugin) registerMetrics() error { metricSet[string(k)] = m.metric } - err := plugin.RegisterMetrics(p, Name, metricSet.List()...) + err := plugin.RegisterMetrics(p, PluginName, metricSet.List()...) if err != nil { return errs.Wrap(err, "failed to register metrics") } diff --git a/main.go b/main.go index 40e480a..499d022 100644 --- a/main.go +++ b/main.go @@ -1,12 +1,39 @@ package main import ( + "fmt" + "github.com/gin-gonic/gin" + "io" "log" "onvif-agent/config" + "onvif-agent/constant" "onvif-agent/integration/zabbixagent" + "onvif-agent/router" + "os" + "time" ) func main() { + /** + * Logging + */ + date := time.Now().Format("2006-01-02") + f, err := os.OpenFile(fmt.Sprintf("/var/log/%s/%s.log", constant.AppName, date), os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModePerm) + if err != nil { + log.Fatalf("Error opening file: %v", err) + } + + defer func(f *os.File) { + err := f.Close() + if err != nil { + log.Fatalf("Error closing file: %v", err) + } + }(f) + + writer := io.MultiWriter(os.Stdout, f) + log.SetOutput(writer) + log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) + /** * Load config */ @@ -17,23 +44,23 @@ func main() { /** * Web server */ - //go func() { - // r := gin.Default() - // - // router.SetupRoutes(r) - // - // addr := fmt.Sprintf("%s:%d", config.Conf.Server.Host, config.Conf.Server.Port) - // if err := r.Run(addr); err != nil { - // fmt.Println("Failed to start server:", err) - // } - //}() + go func() { + r := gin.Default() + + router.SetupRoutes(r) + + addr := fmt.Sprintf("%s:%d", config.Config.App.Host, config.Config.App.Port) + if err := r.Run(addr); err != nil { + fmt.Println("Failed to start server:", err) + } + }() /** * Zabbix agent */ - //go func() { - zabbixagent.Run() - //}() + go func() { + zabbixagent.Run() + }() - //select {} + select {} } diff --git a/router/handler/onvif/subscription.go b/router/handler/onvif/subscription.go index efd0b9d..0658c93 100644 --- a/router/handler/onvif/subscription.go +++ b/router/handler/onvif/subscription.go @@ -12,7 +12,7 @@ import ( func CreateEventSubscription(c *gin.Context) { xaddr := c.Param("xaddr") - callbackURL := event.AttributedURIType(fmt.Sprintf("%s/onvif/subscriptions/%s/callback", config.Conf.App.URL, xaddr)) + callbackURL := event.AttributedURIType(fmt.Sprintf("%s/onvif/subscriptions/%s/callback", config.Config.App.URL, xaddr)) log.Printf("CreateEventSubscription callback URL: %s", callbackURL) conn := conns[xaddr] diff --git a/zabbixagent.dockerfile b/zabbixagent.dockerfile index bf8297d..9d7510a 100644 --- a/zabbixagent.dockerfile +++ b/zabbixagent.dockerfile @@ -2,8 +2,8 @@ FROM golang:1.23 AS builder WORKDIR /build COPY . ./ RUN GOPROXY=https://goproxy.cn go mod download -RUN PROFILE=dev CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o /app +RUN PROFILE=dev CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o out/app FROM zabbix/zabbix-agent2:ubuntu-7.0-latest -COPY --from=builder /app /usr/sbin/zabbix-agent2-plugin/onvif -RUN echo "Plugins.Onvif.System.Path=/usr/sbin/zabbix-agent2-plugin/onvif" >> /etc/zabbix/zabbix_agent2.d/plugins.d/onvif.conf +COPY --from=builder /build/out/app /usr/sbin/onvif-agent +RUN echo "Plugins.Onvif.System.Path=/usr/sbin/onvif-agent" >> /etc/zabbix/zabbix_agent2.d/plugins.d/onvif.conf