refactor viper implementation
This commit is contained in:
parent
4b974b62d2
commit
279f175774
|
@ -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 {
|
||||
|
|
258
config/config.go
258
config/config.go
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
}
|
||||
|
|
@ -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{
|
||||
|
|
|
@ -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() + ")")
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue