refactor viper implementation

This commit is contained in:
kayos@tcp.direct 2021-09-09 04:27:36 -07:00
parent 4b974b62d2
commit 279f175774
5 changed files with 125 additions and 176 deletions

View File

@ -1,11 +1,12 @@
package main
import (
"CokePlate/db"
"github.com/rs/zerolog"
"CokePlate/config"
"CokePlate/db"
"CokePlate/extra"
"CokePlate/logger"
"github.com/rs/zerolog"
)
var log zerolog.Logger
@ -13,7 +14,6 @@ var log zerolog.Logger
func init() {
config.Blueprint()
extra.Banner()
config.PrintConfigLog()
log = logger.LogInit()
zerolog.SetGlobalLevel(zerolog.InfoLevel)
if config.Debug {

View File

@ -2,183 +2,155 @@ package config
import (
"bytes"
"github.com/rs/zerolog"
"github.com/spf13/viper"
"fmt"
"io/ioutil"
"os"
)
var (
Val map[string]interface{}
Debug bool
"github.com/spf13/viper"
)
const (
Version = "0.2"
Title = "CokePlate"
version = "0.1a"
title = "CokePlate"
appLabel = title + "-" + version
)
var appLabel string = Title + " " + Version
// -----------------------------------------------------------------
var (
f *os.File
err error
// from cli flags
forcedebug bool = false
customconfig bool
Config *viper.Viper
log zerolog.Logger
configLocations []string
customconfig = false
home string
logBuffer *lineBuffer
configLocations []string
)
type lineBuffer struct {
lines []string // our buffered log lines
}
func (log *lineBuffer) Write(data []byte) (int, error) {
line := string(data)
log.lines = append(log.lines, line)
return len(data), nil
}
func acquireClue() {
// define proper console output before we determine a log file location
log = preLog()
if home, err = os.UserHomeDir(); err != nil {
log.Fatal().Err(err).Msg("failed to determine user's home directory, we will not be able to load our configuration if it is stored there!")
}
// e.g: /home/fuckhole/.jonesapp/config.toml
configLocations = append(configLocations, home+"/."+Title+"/")
// e.g: /etc/jonesapp/config.toml
configLocations = append(configLocations, "/etc/"+Title+"/")
// e.g: /home/fuckhole/Workshop/jonesapp/config.toml
configLocations = append(configLocations, "./")
// e.g: /home/fuckhole/Workshop/config.toml
configLocations = append(configLocations, "../")
// e.g: /home/fuckhole/Workshop/jonesapp/.config/config.toml
configLocations = append(configLocations, "./.config/")
// ----------------------------------------------------------------
}
/* preLog is to temporarily define pretty printing before we finish initializing our json logger
note that here we are piping it to our configLog (see: PrintConfigLog)
/*
Opt represents our program options.
Initially the values that are defined in Opt will be used to define details.
Beyond that, default values will be replaced by options from our config file.
*/
func preLog() zerolog.Logger {
if forcedebug {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
} else {
zerolog.SetGlobalLevel(zerolog.InfoLevel)
}
var Opt map[string]map[string]interface{}
// initiate an instance of our custom writer
logBuffer = new(lineBuffer)
return zerolog.New(zerolog.ConsoleWriter{Out: logBuffer}).With().Timestamp().Logger()
}
var (
// Debug is our global debug toggle
Debug bool
func PrintConfigLog() {
for _, line := range logBuffer.lines {
print(line)
prefConfigLocation string
snek *viper.Viper
)
func init() {
if home, err = os.UserHomeDir(); err != nil {
panic(err)
}
prefConfigLocation = home + "/.config/" + title
Opt = make(map[string]map[string]interface{})
snek = viper.New()
snek.SetConfigType("toml")
snek.SetConfigName(title)
Blueprint()
}
// Blueprint will initialize our toml configuration engine and define our default configuration values which can be written to a new configuration file if desired
func Blueprint() {
argParse()
if customconfig {
associate()
return
}
acquireClue()
var configSections = []string{"logger", "data", "control", "accounts"}
Opt["logger"] = map[string]interface{}{
"debug": true,
"directory": home + ".config/" + title + "/logs/",
}
Opt["data"] = map[string]interface{}{
"directory": home + ".config/" + title + "./.data/",
"maxsizeobj": 20,
}
Opt["control"] = map[string]interface{}{
"listen": "127.0.0.1:4444",
"readtimeout": 5,
"writetimeout": 5,
}
for _, def := range configSections {
snek.SetDefault(def, Opt[def])
}
for _, loc := range configLocations {
snek.AddConfigPath(loc)
}
if err = snek.MergeInConfig(); err != nil {
if _, err := os.Stat(prefConfigLocation); os.IsNotExist(err) {
if err = os.Mkdir(prefConfigLocation, 0755); err != nil {
panic(err)
}
}
fmt.Println(err.Error())
if err = snek.SafeWriteConfigAs(prefConfigLocation + "/" + title + ".toml"); err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
}
associate()
}
func acquireClue() {
configLocations = append(configLocations, prefConfigLocation)
configLocations = append(configLocations, "/etc/"+title+"/")
configLocations = append(configLocations, "./")
configLocations = append(configLocations, "../")
}
func loadCustomConfig(path string) {
if f, err = os.Open(path); err != nil {
println("Error opening specified config file: " + path)
panic("config file open fatal error: " + err.Error())
}
buf, err := ioutil.ReadAll(f)
err2 := snek.ReadConfig(bytes.NewBuffer(buf))
if err != nil || err2 != nil {
switch {
case err != nil:
fmt.Println("config file read fatal error: ", err.Error())
case err2 != nil:
fmt.Println("config file read fatal error: ", err2.Error())
}
}
customconfig = true
}
func argParse() {
for i, arg := range os.Args {
switch arg {
case "-c":
if len(os.Args) <= i-1 {
panic("syntax error! expected file after -c")
}
loadCustomConfig(os.Args[i+1])
default:
continue
}
}
}
if f, err = os.Open(os.Args[i+1]); err != nil {
println("Error opening specified config file: " + os.Args[i+1])
panic("config file open fatal error: " + err.Error())
func associate() {
var newOpt map[string]map[string]interface{}
newOpt = Opt
for category, opt := range Opt {
for optname, value := range opt {
if snek.IsSet(category + "." + optname) {
newOpt[category][optname] = value
}
buf, err := ioutil.ReadAll(f)
err2 := Config.ReadConfig(bytes.NewBuffer(buf))
if err != nil || err2 != nil {
println("Error reading specified config file: " + os.Args[i+1])
if err != nil {
panic("config file read fatal error: " + err.Error())
} else {
panic("config file read fatal error: " + err2.Error())
}
}
customconfig = true
}
}
if customconfig {
associate()
return
}
acquireClue()
Config = viper.New()
///////////////////// defaults //////
//defName := appLabel
var defaults = make(map[string]map[string]interface{})
var configSections = []string{"logger", "data"} //"sockops"}
defaults["logger"] = map[string]interface{}{
"debug": true,
"directory": "./.logs/",
}
defaults["data"] = map[string]interface{}{
"directory": "./.data/",
}
/* EXAMPLE:
defaults["sockops"] = map[string]interface{}{
"healthtimeout": 20,
"healthurls": []string{"http://howtouse.email", "http://wtfismyip.com/text", "http://ipinfo.io"},
"proxyfile": "socks.txt",
"socks5listen": "127.0.0.1:55555",
}
*/
for _, def := range configSections {
Config.SetDefault(def, defaults[def])
}
for _, loc := range configLocations {
Config.AddConfigPath(loc)
}
associate()
}
var DataDir string
func associate() {
err = Config.MergeInConfig()
log.Debug().Fields(Val).Msg("LOAD_CONFIG")
DataDir = Config.GetString("data.directory")
if Config.GetBool("logger.debug") && !forcedebug {
Debug = false
zerolog.SetGlobalLevel(zerolog.InfoLevel)
} else {
Debug = true
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
Opt = newOpt
}

View File

@ -1,22 +0,0 @@
package config
///////////////////// defaults //////
//defName := appLabel
var defaults map[string]map[string]interface{}
var configSections = []string{"logger", "data", "sockops"}
defaults["logger"] = map[string]interface{}{
"debug": true,
"logdir": "./.logs/",
}
defaults["data"] = map[string]interface{}{
"directory": "./.data/",
}
defaults["sockops"] = map[string]interface{}{
"healthtimeout": 20,
"healthurls": []string{"http://howtouse.email", "http://wtfismyip.com/text", "http://ipinfo.io"},
"proxyfile": "socks.txt",
"socks5listen": "127.0.0.1:55555",
}

View File

@ -11,9 +11,7 @@ import (
type Backend interface {
Sync() error
Close() error
Has(key []byte) bool
Get(key []byte) ([]byte, error)
Put(key, value []byte) error
Delete(key []byte) error
@ -35,7 +33,7 @@ type Database struct {
func Initialize() {
var casket *bitcask.Bitcask
var err error
if casket, err = bitcask.Open(config.DataDir + "/" + "data"); err != nil {
if casket, err = bitcask.Open(config.Opt["data"]["directory"].(string) + "/" + "data"); err != nil {
panic(err)
}
General = &Database{

View File

@ -1,12 +1,13 @@
package logger
import (
//"fmt"
"github.com/rs/zerolog"
//"github.com/rs/zerolog/log"
"CokePlate/config"
"os"
"time"
// "fmt"
"github.com/rs/zerolog"
// "github.com/rs/zerolog/log"
"CokePlate/config"
)
var (
@ -17,7 +18,7 @@ var (
var LogDir string
func LogInit() zerolog.Logger {
LogDir = config.Config.GetString("logger.directory")
LogDir = config.Opt["logger"]["directory"].(string)
if err := os.MkdirAll(LogDir, 0755); err != nil {
panic("cannot create log directory: " + LogDir + "(" + err.Error() + ")")
}