From b93cd8306ee89cb60155d872eae3422b5baa0e1f Mon Sep 17 00:00:00 2001 From: Paul Lecuq Date: Thu, 10 Mar 2022 19:56:03 +0100 Subject: [PATCH] added zmq configs --- cmd/ipbl/ipbl.go | 3 --- src/api/ip.go | 1 - src/config/main.go | 2 -- src/database/main.go | 1 - src/models/cfg.go | 36 ++++++++++++++++++++++++++++++++---- src/models/ip.go | 9 --------- src/models/src.go | 1 - src/routers/funcs.go | 36 ++++++++++++++++++++++++++++++------ src/routers/main.go | 3 --- 9 files changed, 62 insertions(+), 30 deletions(-) diff --git a/cmd/ipbl/ipbl.go b/cmd/ipbl/ipbl.go index d54d5a5..76af294 100644 --- a/cmd/ipbl/ipbl.go +++ b/cmd/ipbl/ipbl.go @@ -25,14 +25,12 @@ func main() { os.Exit(0) } - // Initialize database app context err := database.Initialize(&ctx, &cfg) if err != nil { log.Fatalln(err) } defer cfg.Db.Close() - // Handles IP with no reverse DNS go models.ScanIP(&cfg) // Add cron task to handle them @@ -42,7 +40,6 @@ func main() { //}) //cr.Start() - // Run the ipbl web service err = routers.RunServer(&ctx, &cfg) if err != nil { log.Fatalln(err) diff --git a/src/api/ip.go b/src/api/ip.go index 6ce4b58..ab09fdc 100644 --- a/src/api/ip.go +++ b/src/api/ip.go @@ -1,6 +1,5 @@ package api -// IP describe IP objects via API calls type IP struct { ID int `json:"id"` IP string `json:"ip"` diff --git a/src/config/main.go b/src/config/main.go index 0d16d46..88f4e4e 100644 --- a/src/config/main.go +++ b/src/config/main.go @@ -8,7 +8,6 @@ import ( "xorm.io/xorm" ) -// GetConfig fetch configuration func (cfg *Config) GetConfig() error { var configfile string var debug bool @@ -50,7 +49,6 @@ func (cfg *Config) GetConfig() error { return nil } -// Config is the global config type Config struct { Db *xorm.Engine `json:"-"` DbParams struct { diff --git a/src/database/main.go b/src/database/main.go index 2e18741..9a25af6 100644 --- a/src/database/main.go +++ b/src/database/main.go @@ -13,7 +13,6 @@ import ( "xorm.io/xorm/names" ) -// Init creates connection to database and exec Schema func Initialize(ctx *context.Context, cfg *config.Config) (err error) { var databaseEngine = "postgres" var tables = []interface{}{models.IP{}, models.Cfg{}, models.Src{}} diff --git a/src/models/cfg.go b/src/models/cfg.go index d1e7822..71cf3ea 100644 --- a/src/models/cfg.go +++ b/src/models/cfg.go @@ -12,7 +12,6 @@ import ( //var ipv4_regex = `^(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4})/` var ipv4_cidr_regex = `^(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|)){4}\/([1-3])?([0-9])?$)` -// GetTrustlists ... func GetTrustlists(cfg config.Config) (res []string, err error) { var w = Cfg{Key: "trustlist"} if exists, _ := cfg.Db.Get(&w); exists { @@ -60,7 +59,6 @@ func (wl Trustlist) Verify() bool { return reg.MatchString(wl.IP) } -// GetFolders ... func GetFolders(cfg config.Config) (res []Folder, err error) { var w = Cfg{Key: "folders"} if exists, _ := cfg.Db.Get(&w); exists { @@ -69,7 +67,6 @@ func GetFolders(cfg config.Config) (res []Folder, err error) { return } -// InsertOrUpdateFolders ... func InsertOrUpdateFolders(cfg config.Config, folders []Folder) (res string, err error) { var w = Cfg{Key: "folders"} if exists, _ := cfg.Db.Get(&w); exists { @@ -86,6 +83,23 @@ func InsertOrUpdateFolders(cfg config.Config, folders []Folder) (res string, err return } +func GetZMQ(cfg config.Config, key string) (res ZMQ, err error) { + var w = Cfg{Key: fmt.Sprintf("zmq%s", key)} + if exists, _ := cfg.Db.Get(&w); exists { + err = json.Unmarshal([]byte(w.Value), &res) + } + return +} + +func DiscoverURLS(cfg config.Config) (Discovery, error) { + var disc Discovery + var urls []Url + urls = append(urls, Url{Key: "folders", Path: "/config/folders"}) + urls = append(urls, Url{Key: "trustlist", Path: "/config/trustlist"}) + disc = Discovery{Version: "1.0", URLs: urls} + return disc, nil +} + type Trustlist struct { IP string `json:"ip"` } @@ -95,15 +109,29 @@ type Folder struct { Sets []Set `json:"sets"` } +type ZMQ struct { + Hostname string `json:"hostname"` + Port int `json:"port"` +} + type Set struct { Type string `json:"type"` Filename string `json:"filename"` Regex string `json:"regex"` } -// Cfg is ipbl config type Cfg struct { ID int `xorm:"pk autoincr" json:"-"` Key string `xorm:"text notnull unique" json:"key"` Value string `xorm:"text default" json:"value"` } + +type Discovery struct { + Version string `json:"version"` + URLs []Url `json:"urls"` +} + +type Url struct { + Key string `json:"key"` + Path string `json:"path"` +} diff --git a/src/models/ip.go b/src/models/ip.go index 6be8be0..6e4ac64 100644 --- a/src/models/ip.go +++ b/src/models/ip.go @@ -14,7 +14,6 @@ import ( var lastday = time.Now().Add(-(time.Hour * 24)) -// GetIPs ... func GetIPs(ctx *context.Context, config *config.Config, limit int) (apimailboxes []*api.IP, err error) { var ips []IP err = config.Db.Limit(limit).Desc("created").Find(&ips) @@ -24,7 +23,6 @@ func GetIPs(ctx *context.Context, config *config.Config, limit int) (apimailboxe return } -// GetIPs ... func GetIPsLast(ctx *context.Context, config *config.Config, interval string) (apimailboxes []*api.IP, err error) { var ips []IP err = config.Db.Where(fmt.Sprintf("updated >= (now()-'%s'::interval)", interval)).GroupBy("ip").Find(&ips) @@ -34,7 +32,6 @@ func GetIPsLast(ctx *context.Context, config *config.Config, interval string) (a return } -// GetIP ... func GetIP(ctx *context.Context, config *config.Config, ipquery interface{}) (apiip *api.IP, err error) { var ip IP has, err := config.Db.Where("ip = ?", ipquery).Get(&ip) @@ -49,7 +46,6 @@ func GetIP(ctx *context.Context, config *config.Config, ipquery interface{}) (ap return } -// UpdateRDNS ... func (i *IP) UpdateRDNS() (result string, err error) { res, err := net.LookupAddr(i.IP) if err != nil { @@ -60,13 +56,11 @@ func (i *IP) UpdateRDNS() (result string, err error) { return } -// InsertIP ... func (i *IP) InsertIP(cfg *config.Config) (num int64, err error) { num, err = cfg.Db.Insert(i) return } -// InsertIPBulk ... func InsertIPBulk(cfg *config.Config, ips *[]IP) (numinserts int64, numupdates int64, numfail int64, err error) { var iplist []string for _, ip := range *ips { @@ -88,7 +82,6 @@ func InsertIPBulk(cfg *config.Config, ips *[]IP) (numinserts int64, numupdates i return } -// ScanIP ... func ScanIP(cfg *config.Config) (err error) { for { orphans := []IP{} @@ -109,7 +102,6 @@ func ScanIP(cfg *config.Config) (err error) { } } -// APIFormat returns a JSON formatted object of IP func (ip *IP) APIFormat() *api.IP { if ip == nil { return nil @@ -121,7 +113,6 @@ func (ip *IP) APIFormat() *api.IP { } } -// IP describe IP objects type IP struct { ID int `xorm:"pk autoincr" json:"-"` IP string `xorm:"text notnull unique(ipsrc)" json:"ip"` diff --git a/src/models/src.go b/src/models/src.go index 862e142..5d1585a 100644 --- a/src/models/src.go +++ b/src/models/src.go @@ -1,6 +1,5 @@ package models -// Src is src types type Src struct { ID int `xorm:"pk autoincr" json:"-"` Src string `xorm:"text notnull unique" json:"src"` diff --git a/src/routers/funcs.go b/src/routers/funcs.go index a140b63..38b6cb7 100644 --- a/src/routers/funcs.go +++ b/src/routers/funcs.go @@ -13,7 +13,6 @@ import ( "github.com/labstack/echo/v4" ) -// RegisterRoutes runs the main echo HTTP server func RegisterRoutes(e *echo.Echo, ctx *context.Context, cfg *config.Config) { e.GET("/", func(c echo.Context) error { return c.HTML(http.StatusOK, ` @@ -79,11 +78,11 @@ func RegisterRoutes(e *echo.Echo, ctx *context.Context, cfg *config.Config) { } return Result(c, err, msg) }) - e.GET("/ips/trustlist", func(c echo.Context) (err error) { + e.GET("/config/trustlist", func(c echo.Context) (err error) { trustlists, err := models.GetTrustlists(*cfg) return Result(c, err, trustlists) }) - e.POST("/ips/trustlist", func(c echo.Context) (err error) { + e.POST("/config/trustlist", func(c echo.Context) (err error) { var cidr models.Trustlist err = c.Bind(&cidr) if err == nil && cidr.Verify() { @@ -92,7 +91,7 @@ func RegisterRoutes(e *echo.Echo, ctx *context.Context, cfg *config.Config) { } return Result(c, err, nil) }) - e.DELETE("/ips/trustlist/:ip", func(c echo.Context) (err error) { + e.DELETE("/config/trustlist/:ip", func(c echo.Context) (err error) { var ip = c.Param("ip") var cidr models.Trustlist err = cidr.Delete(*cfg, ip) @@ -101,11 +100,11 @@ func RegisterRoutes(e *echo.Echo, ctx *context.Context, cfg *config.Config) { } return }) - e.GET("/ips/folders", func(c echo.Context) (err error) { + e.GET("/config/folders", func(c echo.Context) (err error) { folders, err := models.GetFolders(*cfg) return Result(c, err, folders) }) - e.POST("/ips/folders", func(c echo.Context) (err error) { + e.POST("/config/folders", func(c echo.Context) (err error) { var folders []models.Folder err = c.Bind(&folders) if err != nil { @@ -114,6 +113,31 @@ func RegisterRoutes(e *echo.Echo, ctx *context.Context, cfg *config.Config) { _, err = models.InsertOrUpdateFolders(*cfg, folders) return Result(c, err, folders) }) + e.GET("/config/folders", func(c echo.Context) (err error) { + folders, err := models.GetFolders(*cfg) + return Result(c, err, folders) + }) + e.POST("/config/folders", func(c echo.Context) (err error) { + var folders []models.Folder + err = c.Bind(&folders) + if err != nil { + return Result(c, err, "Unable to parse JSON") + } + _, err = models.InsertOrUpdateFolders(*cfg, folders) + return Result(c, err, folders) + }) + e.GET("/config/zmqps", func(c echo.Context) (err error) { + folders, err := models.GetZMQ(*cfg, "ps") + return Result(c, err, folders) + }) + e.GET("/config/zmqrr", func(c echo.Context) (err error) { + folders, err := models.GetZMQ(*cfg, "rr") + return Result(c, err, folders) + }) + e.GET("/discovery", func(c echo.Context) (err error) { + disc, err := models.DiscoverURLS(*cfg) + return Result(c, err, disc) + }) e.Logger.Fatal( e.Start( diff --git a/src/routers/main.go b/src/routers/main.go index 9c411ef..60dc4b3 100644 --- a/src/routers/main.go +++ b/src/routers/main.go @@ -10,7 +10,6 @@ import ( "github.com/labstack/echo/v4" ) -// RunServer runs the main echo server func RunServer(ctx *context.Context, cfg *config.Config) (err error) { e := echo.New() e.HideBanner = true @@ -21,7 +20,6 @@ func RunServer(ctx *context.Context, cfg *config.Config) (err error) { return } -// Result handles returns and error management on backend api func Result(c echo.Context, inputerr error, data interface{}) (err error) { if inputerr != nil { if inputerr.Error() == "Not Found" { @@ -41,7 +39,6 @@ func Result(c echo.Context, inputerr error, data interface{}) (err error) { return c.JSON(http.StatusOK, data) } -// ConfigAccess make ip authorization to configuration func ConfigAccess(cfg config.Config, ip string) (ret bool) { switch ip { case "127.0.0.1":