diff --git a/README.md b/README.md index 525d7c8..b0ced5d 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,16 @@ -# HellPot +
+ HellPot [![GoDoc](https://godoc.org/github.com/yunginnanet/HellPot?status.svg)](https://godoc.org/github.com/yunginnanet/HellPot) [![Go Report Card](https://goreportcard.com/badge/github.com/yunginnanet/HellPot)](https://goreportcard.com/report/github.com/yunginnanet/HellPot) [![IRC](https://img.shields.io/badge/ircd.chat-%23tcpdirect-blue.svg)](ircs://ircd.chat:6697/#tcpdirect) [![Mentioned in Awesome Honeypots](https://awesome.re/mentioned-badge.svg)](https://github.com/paralax/awesome-honeypots) +
+ ## Summary HellPot is an endless honeypot based on [Heffalump](https://github.com/carlmjohnson/heffalump) that sends unruly HTTP bots to hell. Notably it implements a [toml configuration file](https://github.com/knadh/koanf), has [JSON logging](https://github.com/rs/zerolog), and comes with significant performance gains. -![Exploding Heffalump](https://tcp.ac/i/H8O9M.gif) - ## Grave Consequences Clients (hopefully bots) that disregard `robots.txt` and connect to your instance of HellPot will **suffer eternal consequences**. diff --git a/internal/config/config.go b/internal/config/config.go index 8e00dff..89b10a2 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -1,6 +1,7 @@ package config import ( + "errors" "fmt" "os" "path/filepath" @@ -24,6 +25,16 @@ var ( snek = viper.New(".") ) +func init() { + home, _ = os.UserHomeDir() + if home == "" { + home = os.Getenv("HOME") + } + if home == "" { + println("WARNING: could not determine home directory") + } +} + // exported generic vars var ( // Trace is the value of our trace (extra verbose) on/off toggle as per the current configuration. @@ -41,8 +52,13 @@ var ( func writeConfig() string { prefConfigLocation, _ := os.UserConfigDir() + if prefConfigLocation == "" { + home, _ = os.UserHomeDir() + prefConfigLocation = filepath.Join(home, ".config", Title) + } + if _, err := os.Stat(prefConfigLocation); os.IsNotExist(err) { - if err = os.MkdirAll(prefConfigLocation, 0o750); err != nil { + if err = os.MkdirAll(prefConfigLocation, 0o750); err != nil && !errors.Is(err, os.ErrExist) { println("error writing new config: " + err.Error()) os.Exit(1) } @@ -92,25 +108,31 @@ func Init() { } if chosen == "" && uconf != "" { + _ = os.MkdirAll(filepath.Join(uconf, Title), 0750) chosen = filepath.Join(uconf, Title, "config.toml") } if chosen == "" { + pwd, _ := os.Getwd() if _, err := os.Stat("./config.toml"); err == nil { chosen = "./config.toml" + } else { + if _, err := os.Stat(filepath.Join(pwd, "config.toml")); err == nil { + chosen = filepath.Join(pwd, "config.toml") + } } } - if chosen == "" { + loadErr := snek.Load(file.Provider(chosen), toml.Parser()) + + if chosen == "" || loadErr != nil { println("No configuration file found, writing new configuration file...") chosen = writeConfig() } - Filename = chosen - if err := snek.Load(file.Provider(chosen), toml.Parser()); err != nil { - println("Error opening specified config file: " + chosen) - println(err.Error()) + if loadErr = snek.Load(file.Provider(chosen), toml.Parser()); loadErr != nil { + fmt.Println("failed to load default config file: ", loadErr.Error()) os.Exit(1) } diff --git a/internal/config/logger.go b/internal/config/logger.go index 92a7373..a9aba64 100644 --- a/internal/config/logger.go +++ b/internal/config/logger.go @@ -4,6 +4,7 @@ import ( "io" "os" "path" + "path/filepath" "strings" "time" @@ -20,10 +21,10 @@ var ( func prepLogDir() { logDir = snek.String("logger.directory") - if err := os.MkdirAll(logDir, 0750); err != nil { - println("cannot create log directory: " + logDir + "(" + err.Error() + ")") - os.Exit(1) + if logDir == "" { + logDir = filepath.Join(home, ".local", "share", Title, "logs") } + _ = os.MkdirAll(logDir, 0750) } // StartLogger instantiates an instance of our zerolog loggger so we can hook it in our main package.