diff --git a/README.md b/README.md
index 525d7c8..b0ced5d 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,16 @@
-# 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.