diff --git a/cmd/banforge/command/list.go b/cmd/banforge/command/list.go new file mode 100644 index 0000000..f3a55d8 --- /dev/null +++ b/cmd/banforge/command/list.go @@ -0,0 +1,27 @@ +package command + +import ( + "os" + + "github.com/d3m0k1d/BanForge/internal/logger" + "github.com/d3m0k1d/BanForge/internal/storage" + "github.com/spf13/cobra" +) + +var BanListCmd = &cobra.Command{ + Use: "list", + Short: "List banned IP adresses", + Run: func(cmd *cobra.Command, args []string) { + var log = logger.New(false) + d, err := storage.NewDB() + if err != nil { + log.Error("Failed to create database", "error", err) + os.Exit(1) + } + err = d.BanList() + if err != nil { + log.Error("Failed to get ban list", "error", err) + os.Exit(1) + } + }, +} diff --git a/cmd/banforge/main.go b/cmd/banforge/main.go index 9f0ecd1..30364f4 100644 --- a/cmd/banforge/main.go +++ b/cmd/banforge/main.go @@ -27,6 +27,7 @@ func Execute() { rootCmd.AddCommand(command.RuleCmd) rootCmd.AddCommand(command.BanCmd) rootCmd.AddCommand(command.UnbanCmd) + rootCmd.AddCommand(command.BanListCmd) command.RuleRegister() command.FwRegister() if err := rootCmd.Execute(); err != nil { diff --git a/go.mod b/go.mod index 44b3b62..c1af03b 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,16 @@ go 1.25.5 require ( github.com/BurntSushi/toml v1.6.0 + github.com/jedib0t/go-pretty/v6 v6.7.8 github.com/mattn/go-sqlite3 v1.14.33 github.com/spf13/cobra v1.10.2 ) require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/spf13/pflag v1.0.10 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect ) diff --git a/go.sum b/go.sum index 2349eee..bea3ebb 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,34 @@ github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jedib0t/go-pretty/v6 v6.7.8 h1:BVYrDy5DPBA3Qn9ICT+PokP9cvCv1KaHv2i+Hc8sr5o= +github.com/jedib0t/go-pretty/v6 v6.7.8/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.33 h1:A5blZ5ulQo2AtayQ9/limgHEkFreKj1Dv226a1K73s0= github.com/mattn/go-sqlite3 v1.14.33/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/storage/db.go b/internal/storage/db.go index 56cfce2..b84f9d3 100644 --- a/internal/storage/db.go +++ b/internal/storage/db.go @@ -2,11 +2,13 @@ package storage import ( "database/sql" + "os" "fmt" "time" "github.com/d3m0k1d/BanForge/internal/logger" + "github.com/jedib0t/go-pretty/v6/table" _ "github.com/mattn/go-sqlite3" ) @@ -86,3 +88,31 @@ func (d *DB) AddBan(ip string) error { } return nil } + +func (d *DB) BanList() error { + + var count int + t := table.NewWriter() + t.SetOutputMirror(os.Stdout) + t.SetStyle(table.StyleBold) + t.AppendHeader(table.Row{"№", "IP", "Banned At"}) + rows, err := d.db.Query("SELECT ip, banned_at FROM bans") + if err != nil { + d.logger.Error("Failed to get ban list", "error", err) + return err + } + for rows.Next() { + count++ + var ip string + var bannedAt string + err := rows.Scan(&ip, &bannedAt) + if err != nil { + d.logger.Error("Failed to get ban list", "error", err) + return err + } + t.AppendRow(table.Row{count, ip, bannedAt}) + + } + t.Render() + return nil +}