Skip to content

Commit

Permalink
Chore: Tidy up, split up files in main package
Browse files Browse the repository at this point in the history
  • Loading branch information
yunginnanet committed Jun 26, 2024
1 parent e9785d2 commit dfad295
Show file tree
Hide file tree
Showing 5 changed files with 180 additions and 182 deletions.
170 changes: 0 additions & 170 deletions cmd/HellPot/HellPot.go
Original file line number Diff line number Diff line change
@@ -1,188 +1,18 @@
package main

import (
"errors"
"fmt"
"io"
"os"
"os/signal"
"path/filepath"
"strconv"
"syscall"
"time"

"github.com/rs/zerolog"

"github.com/yunginnanet/HellPot/internal/config"
"github.com/yunginnanet/HellPot/internal/extra"
"github.com/yunginnanet/HellPot/internal/http"
"github.com/yunginnanet/HellPot/internal/logger"
"github.com/yunginnanet/HellPot/internal/version"
)

var (
runningConfig *config.Parameters
)

func writeConfig(target string) bool {
var f *os.File
var err error
f, err = os.Create(target) // #nosec G304 -- go home gosec, you're drunk
if err != nil {
println("failed to create config file: " + err.Error())
return false
}
if _, err = io.Copy(f, config.Defaults.IO); err != nil {
println("failed to write default config to file: " + err.Error())
_ = f.Close()
return false
}
println("wrote default config to " + target)
runningConfig, _ = config.Setup(f)
_ = f.Close()
return true
}

func searchConfig() string {
var resolvedConf string
uconf, _ := os.UserConfigDir()
if uconf == "" && os.Getenv("HOME") != "" {
uconf = filepath.Join(os.Getenv("HOME"), ".config")
}

for _, path := range []string{
"/etc/HellPot/config.toml",
"/usr/local/etc/HellPot/config.toml",
"./config.toml",
filepath.Join(uconf, "HellPot", "config.toml"),
} {
if _, err := os.Stat(path); err == nil {
resolvedConf = path
break
}
}
return resolvedConf
}

func readConfig(resolvedConf string) error {
var err error
var setupErr error
var f *os.File

if resolvedConf == "" {
return fmt.Errorf("%w: provided config file is an empty string", io.EOF)
}

f, err = os.Open(resolvedConf) // #nosec G304 go home gosec, you're drunk
if err == nil {
runningConfig, setupErr = config.Setup(f)
}
switch {
case setupErr != nil:
println("failed to setup config: " + setupErr.Error())
err = setupErr
case err != nil:
println("failed to open config file for reading: " + err.Error())
println("trying to create it....")
wroteOK := writeConfig(resolvedConf)
if wroteOK {
break
}
println("failed to create config file, cannot continue")
return fmt.Errorf("failed to create config file: %w", err)
case runningConfig != nil:
_ = f.Close()
}

return err
}

func resolveConfig() (usingDefaults bool, resolvedConf string, err error) {
if config.CLIFlags != nil {
confRoot := config.CLIFlags.Lookup("config")
if confRoot != nil && confRoot.Value.String() != "" {
resolvedConf = confRoot.Value.String()
}
}

if resolvedConf == "" && os.Getenv("HELLPOT_CONFIG_FILE") != "" {
resolvedConf = os.Getenv("HELLPOT_CONFIG_FILE")
}

if resolvedConf == "" {
resolvedConf = searchConfig()
}

if err = readConfig(resolvedConf); err != nil && !errors.Is(err, io.EOF) {
return false, "", err
}

if runningConfig == nil {
println("still no config, trying defaults...")
if runningConfig, err = config.Setup(nil); err != nil || runningConfig == nil {
if err == nil {
err = errors.New("unknown failure resulting in missing configuration, cannot continue")
}
return false, "", err
}
return true, "", nil
}

return false, resolvedConf, nil
}

func setup(stopChan chan os.Signal) (log zerolog.Logger, logFile string, resolvedConf string, err error) {
var usingDefaults bool

if usingDefaults, resolvedConf, err = resolveConfig(); err != nil {
return
}

//goland:noinspection GoNilness // we check for nil above
if log, err = logger.New(runningConfig.Logger); err != nil {
return
}

logFile = runningConfig.Logger.ActiveLogFileName

if usingDefaults {
runningConfig.UsingDefaults = true
log.Warn().Msg("continuing with default configuration in ")
for i := 5; i > 0; i-- {
print(strconv.Itoa(i))
for i := 0; i < 5; i++ {
time.Sleep(200 * time.Millisecond)
print(".")
}
}
}

if //goland:noinspection GoNilness
!runningConfig.Logger.NoColor {
extra.Banner()
}

signal.Notify(stopChan, syscall.SIGINT, syscall.SIGTERM)
return
}

func testMain(t interface{ Error(...any) }) (string, string, chan os.Signal, error) {
stopChan := make(chan os.Signal, 1)
log, logFile, resolvedConf, err := setup(stopChan)
if err == nil {
log.Info().Msg("🔥 Starting HellPot 🔥")
go func() {
terr := http.Serve(runningConfig)
if terr != nil {
t.Error("failed to serve HTTP: " + terr.Error())
close(stopChan)
}
}()
}
//goland:noinspection GoNilness
return resolvedConf, logFile, stopChan, err
}

func main() {
stopChan := make(chan os.Signal, 1)
log, _, resolvedConf, err := setup(stopChan)
Expand Down
19 changes: 19 additions & 0 deletions cmd/HellPot/HellPot_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,27 @@ import (
"os"
"testing"
"time"

"github.com/yunginnanet/HellPot/internal/http"
)

func testMain(t interface{ Error(...any) }) (string, string, chan os.Signal, error) {
stopChan := make(chan os.Signal, 1)
log, logFile, resolvedConf, err := setup(stopChan)
if err == nil {
log.Info().Msg("🔥 Starting HellPot 🔥")
go func() {
terr := http.Serve(runningConfig)
if terr != nil {
t.Error("failed to serve HTTP: " + terr.Error())
close(stopChan)
}
}()
}
//goland:noinspection GoNilness
return resolvedConf, logFile, stopChan, err
}

func TestHellPot(t *testing.T) {
resolvedConf, logFile, stopChan, err := testMain(t)
if err != nil {
Expand Down
160 changes: 160 additions & 0 deletions cmd/HellPot/boot.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
package main

import (
"errors"
"fmt"
"io"
"os"
"os/signal"
"path/filepath"
"strconv"
"syscall"
"time"

"github.com/rs/zerolog"

"github.com/yunginnanet/HellPot/internal/config"
"github.com/yunginnanet/HellPot/internal/extra"
"github.com/yunginnanet/HellPot/internal/logger"
)

func writeConfig(target string) bool {
var f *os.File
var err error
f, err = os.Create(target) // #nosec G304 -- go home gosec, you're drunk
if err != nil {
println("failed to create config file: " + err.Error())
return false
}
if _, err = io.Copy(f, config.Defaults.IO); err != nil {
println("failed to write default config to file: " + err.Error())
_ = f.Close()
return false
}
println("wrote default config to " + target)
runningConfig, _ = config.Setup(f)
_ = f.Close()
return true
}

func searchConfig() string {
var resolvedConf string
uconf, _ := os.UserConfigDir()
if uconf == "" && os.Getenv("HOME") != "" {
uconf = filepath.Join(os.Getenv("HOME"), ".config")
}

for _, path := range []string{
"/etc/HellPot/config.toml",
"/usr/local/etc/HellPot/config.toml",
"./config.toml",
filepath.Join(uconf, "HellPot", "config.toml"),
} {
if _, err := os.Stat(path); err == nil {
resolvedConf = path
break
}
}
return resolvedConf
}

func readConfig(resolvedConf string) error {
var err error
var setupErr error
var f *os.File

if resolvedConf == "" {
return fmt.Errorf("%w: provided config file is an empty string", io.EOF)
}

f, err = os.Open(resolvedConf) // #nosec G304 go home gosec, you're drunk
if err == nil {
runningConfig, setupErr = config.Setup(f)
}
switch {
case setupErr != nil:
println("failed to setup config: " + setupErr.Error())
err = setupErr
case err != nil:
println("failed to open config file for reading: " + err.Error())
println("trying to create it....")
wroteOK := writeConfig(resolvedConf)
if wroteOK {
break
}
println("failed to create config file, cannot continue")
return fmt.Errorf("failed to create config file: %w", err)
case runningConfig != nil:
_ = f.Close()
}

return err
}

func resolveConfig() (usingDefaults bool, resolvedConf string, err error) {
if config.CLIFlags != nil {
confRoot := config.CLIFlags.Lookup("config")
if confRoot != nil && confRoot.Value.String() != "" {
resolvedConf = confRoot.Value.String()
}
}

if resolvedConf == "" && os.Getenv("HELLPOT_CONFIG_FILE") != "" {
resolvedConf = os.Getenv("HELLPOT_CONFIG_FILE")
}

if resolvedConf == "" {
resolvedConf = searchConfig()
}

if err = readConfig(resolvedConf); err != nil && !errors.Is(err, io.EOF) {
return false, "", err
}

if runningConfig == nil {
if runningConfig, err = config.Setup(nil); err != nil || runningConfig == nil {
if err == nil {
err = errors.New("unknown failure resulting in missing configuration, cannot continue")
}
return false, "", err
}
return true, "", nil
}

return false, resolvedConf, nil
}

func setup(stopChan chan os.Signal) (log zerolog.Logger, logFile string, resolvedConf string, err error) {
var usingDefaults bool

if usingDefaults, resolvedConf, err = resolveConfig(); err != nil {
return
}

//goland:noinspection GoNilness // we check for nil above
if log, err = logger.New(runningConfig.Logger); err != nil {
return
}

logFile = runningConfig.Logger.ActiveLogFileName

if usingDefaults {
runningConfig.UsingDefaults = true
log.Warn().Msg("continuing with default configuration in ")
for i := 5; i > 0; i-- {
print(strconv.Itoa(i))
for i := 0; i < 5; i++ {
time.Sleep(200 * time.Millisecond)
print(".")
}
}
}

if //goland:noinspection GoNilness
!runningConfig.Logger.NoColor {
extra.Banner()
}

signal.Notify(stopChan, syscall.SIGINT, syscall.SIGTERM)
return
}
12 changes: 1 addition & 11 deletions internal/config/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,7 @@ func (r *readerProvider) Read() (map[string]interface{}, error) {
if err != nil {
return nil, err
}
vals, err := toml.Parser().Unmarshal(b)
if len(vals) == 0 {
err = io.ErrUnexpectedEOF
}
if err != nil {
println(err.Error())
}
for k, v := range vals {
println(k, v)
}
return vals, err //nolint:wrapcheck
return toml.Parser().Unmarshal(b) //nolint:wrapcheck
}

func Setup(source io.Reader) (*Parameters, error) {
Expand Down
Loading

0 comments on commit dfad295

Please sign in to comment.