2 Commits

Author SHA1 Message Date
d3m0k1d
db9c94f2c5 Delete: bin after test
All checks were successful
CI.yml / build (push) Successful in 47s
2026-01-13 14:53:32 +03:00
d3m0k1d
72018eb69e feat: Rename and set as method NftablesSetup -> Setup, fix template and types config, add create template config in system, update logic finds firewalls on system, add BurntSushi/toml as dependencies 2026-01-13 14:53:16 +03:00
7 changed files with 77 additions and 19 deletions

View File

@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/d3m0k1d/BanForge/internal/config"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@@ -30,6 +31,16 @@ var initCmd = &cobra.Command{
fmt.Println(err) fmt.Println(err)
os.Exit(1) os.Exit(1)
} }
err = config.CreateConf()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
err = config.FindFirewall()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}, },
} }

5
go.mod
View File

@@ -2,7 +2,10 @@ module github.com/d3m0k1d/BanForge
go 1.25.5 go 1.25.5
require github.com/spf13/cobra v1.10.2 require (
github.com/BurntSushi/toml v1.6.0
github.com/spf13/cobra v1.10.2
)
require ( require (
github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect

2
go.sum
View File

@@ -1,3 +1,5 @@
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/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=

View File

@@ -96,7 +96,7 @@ func (n *Nftables) Unban(ip string) error {
return nil return nil
} }
func SetupNftables(config string) error { func (n *Nftables) Setup(config string) error {
err := validateConfigPath(config) err := validateConfigPath(config)
if err != nil { if err != nil {
return fmt.Errorf("path error: %w", err) return fmt.Errorf("path error: %w", err)

View File

@@ -5,6 +5,8 @@ import (
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"github.com/BurntSushi/toml"
) )
var DetectedFirewall string var DetectedFirewall string
@@ -39,31 +41,65 @@ func CreateConf() error {
if err := os.Chmod(configPath, 0600); err != nil { if err := os.Chmod(configPath, 0600); err != nil {
return fmt.Errorf("failed to set permissions: %w", err) return fmt.Errorf("failed to set permissions: %w", err)
} }
err = os.WriteFile(configPath, []byte(Base_config), 0600)
if err != nil {
return fmt.Errorf("failed to write config file: %w", err)
}
fmt.Printf(" Config file created: %s\n", configPath) fmt.Printf(" Config file created: %s\n", configPath)
return nil return nil
} }
func FindFirewall() error { func FindFirewall() error {
if os.Getegid() != 0 { if os.Getegid() != 0 {
fmt.Printf("Firewall settings needs sudo privileges\n") fmt.Printf("Firewall settings needs sudo privileges\n")
os.Exit(1) os.Exit(1)
} }
firewalls := []string{"iptables", "nft", "firewall-cmd", "ufw"}
firewalls := []string{"nft", "firewall-cmd", "iptables", "ufw"}
for _, firewall := range firewalls { for _, firewall := range firewalls {
_, err := exec.LookPath(firewall) _, err := exec.LookPath(firewall)
if err == nil { if err == nil {
if firewall == "firewall-cmd" { switch firewall {
case "firewall-cmd":
DetectedFirewall = "firewalld" DetectedFirewall = "firewalld"
} case "nft":
if firewall == "nft" {
DetectedFirewall = "nftables" DetectedFirewall = "nftables"
default:
DetectedFirewall = firewall
} }
DetectedFirewall = firewall
fmt.Printf("Detected firewall: %s\n", firewall) fmt.Printf("Detected firewall: %s\n", DetectedFirewall)
cfg := &Config{}
_, err := toml.DecodeFile("/etc/banforge/config.toml", cfg)
if err != nil {
return fmt.Errorf("failed to decode config: %w", err)
}
cfg.Firewall.Name = DetectedFirewall
file, err := os.Create("/etc/banforge/config.toml")
if err != nil {
return fmt.Errorf("failed to create config file: %w", err)
}
encoder := toml.NewEncoder(file)
if err := encoder.Encode(cfg); err != nil {
err = file.Close()
if err != nil {
return fmt.Errorf("failed to close file: %w", err)
}
return fmt.Errorf("failed to encode config: %w", err)
}
if err := file.Close(); err != nil {
return fmt.Errorf("failed to close file: %w", err)
}
fmt.Printf("Config updated with firewall: %s\n", DetectedFirewall)
return nil return nil
} }
} }
return fmt.Errorf("no firewall found (checked ufw, firewall-cmd, iptables, nft) please install one of them")
return fmt.Errorf("firewall not found")
} }

View File

@@ -1,14 +1,15 @@
package config package config
const Base_config = `# This is a TOML config file for BanForge it's a simple config file const Base_config = `
# https://github.com/d3m0k1d/BanForge # This is a TOML config file for BanForge
# [https://github.com/d3m0k1d/BanForge](https://github.com/d3m0k1d/BanForge)
# Firewall settings block
[firewall] [firewall]
name = "iptables" # Name one of the support firewall(iptables, nftables, firewalld, ufw) name = ""
config = "/etc/nftables.conf"
ban_time = 1200 ban_time = 1200
[Service] [service]
name = "nginx" name = "nginx"
log_path = "/var/log/nginx/access.log" log_path = "/var/log/nginx/access.log"
enabled = true enabled = true

View File

@@ -7,7 +7,12 @@ type Firewall struct {
} }
type Service struct { type Service struct {
Name string `toml:"name"` Name string `toml:"name"`
Log_path string `toml:"log_path"` LogPath string `toml:"log_path"`
Enabled bool `toml:"enabled"` Enabled bool `toml:"enabled"`
}
type Config struct {
Firewall Firewall `toml:"firewall"`
Service Service `toml:"service"`
} }