lightningtip/config.go

202 lines
4.4 KiB
Go
Raw Permalink Normal View History

2018-03-22 13:52:16 -07:00
package main
import (
"fmt"
2018-03-22 13:52:16 -07:00
"github.com/jessevdk/go-flags"
2018-03-23 16:08:03 -07:00
"github.com/michael1011/lightningtip/backends"
2018-03-22 13:52:16 -07:00
"github.com/op/go-logging"
"os"
2018-03-23 16:08:03 -07:00
"os/user"
"path"
"runtime"
2018-03-22 13:52:16 -07:00
"strings"
)
const (
defaultConfigFile = "lightningTip.conf"
defaultDataDir = "LightningTip"
2018-03-22 13:52:16 -07:00
defaultLogFile = "lightningTip.log"
defaultLogLevel = "info"
2018-03-23 16:08:03 -07:00
2018-03-30 02:04:56 -07:00
defaultRESTHost = "0.0.0.0:8081"
defaultTLSCertFile = ""
defaultTLSKeyFile = ""
2018-03-30 02:04:56 -07:00
defaultAccessDomain = ""
2018-03-24 15:03:55 -07:00
2018-03-25 08:45:42 -07:00
defaultTipExpiry = 3600
2018-03-24 15:03:55 -07:00
2018-03-29 06:01:28 -07:00
defaultLndGRPCHost = "localhost:10009"
2018-03-23 16:08:03 -07:00
defaultLndCertFile = "tls.cert"
defaultMacaroonFile = "admin.macaroon"
2018-03-22 13:52:16 -07:00
)
type config struct {
2018-03-29 06:01:28 -07:00
ConfigFile string `long:"config" Description:"Location of the config file"`
2018-03-22 13:52:16 -07:00
DataDir string `long:"datadir" Description:"Location of the data stored by LightningTip"`
2018-03-29 06:01:28 -07:00
LogFile string `long:"logfile" Description:"Location of the log file"`
2018-03-22 13:52:16 -07:00
LogLevel string `long:"loglevel" Description:"Log level: debug, info, warning, error"`
2018-03-23 16:08:03 -07:00
2018-03-30 02:04:56 -07:00
RESTHost string `long:"resthost" Description:"Host for the REST interface of LightningTip"`
TLSCertFile string `long:"tlscertfile" Description:"Certificate for using LightningTip via HTTPS"`
TLSKeyFile string `long:"tlskeyfile" Description:"Certificate for using LightningTip via HTTPS"`
2018-03-30 02:04:56 -07:00
AccessDomain string `long:"accessdomain" Description:"The domain you are using LightningTip from"`
2018-03-24 15:03:55 -07:00
TipExpiry int64 `long:"tipexpiry" Description:"Invoice expiry time in seconds"`
2018-03-24 15:03:55 -07:00
2018-03-23 16:08:03 -07:00
LND *backends.LND `group:"LND" namespace:"lnd"`
2018-03-22 13:52:16 -07:00
}
var cfg config
2018-03-23 16:08:03 -07:00
var backend backends.Backend
2018-03-22 13:52:16 -07:00
func initConfig() {
cfg = config{
ConfigFile: path.Join(getDefaultDataDir(), defaultConfigFile),
2018-03-22 13:52:16 -07:00
DataDir: getDefaultDataDir(),
LogFile: path.Join(getDefaultDataDir(), defaultLogFile),
2018-03-22 13:52:16 -07:00
LogLevel: defaultLogLevel,
2018-03-23 16:08:03 -07:00
2018-03-30 02:04:56 -07:00
RESTHost: defaultRESTHost,
TLSCertFile: defaultTLSCertFile,
TLSKeyFile: defaultTLSKeyFile,
2018-03-30 02:04:56 -07:00
AccessDomain: defaultAccessDomain,
2018-03-24 15:03:55 -07:00
2018-03-25 08:45:42 -07:00
TipExpiry: defaultTipExpiry,
2018-03-24 15:03:55 -07:00
2018-03-23 16:08:03 -07:00
LND: &backends.LND{
2018-03-29 06:01:28 -07:00
GRPCHost: defaultLndGRPCHost,
CertFile: path.Join(getDefaultLndDir(), defaultLndCertFile),
MacaroonFile: path.Join(getDefaultLndDir(), defaultMacaroonFile),
2018-03-23 16:08:03 -07:00
},
2018-03-22 13:52:16 -07:00
}
2018-03-30 02:04:56 -07:00
// Ignore unknown flags the first time parsing command line flags to prevent showing the unknown flag error twice
flags.NewParser(&cfg, flags.IgnoreUnknown).Parse()
2018-03-22 13:52:16 -07:00
errFile := flags.IniParse(cfg.ConfigFile, &cfg)
// Parse flags again to override config file
2018-03-30 02:04:56 -07:00
_, err := flags.Parse(&cfg)
2018-03-22 13:52:16 -07:00
// Default log level if parsing fails
2018-03-22 13:52:16 -07:00
logLevel := logging.DEBUG
switch strings.ToLower(cfg.LogLevel) {
case "info":
logLevel = logging.INFO
case "warning":
logLevel = logging.WARNING
case "error":
logLevel = logging.ERROR
}
// Create data directory
var errDataDir error
var dataDirCreated bool
if _, err := os.Stat(getDefaultDataDir()); os.IsNotExist(err) {
errDataDir = os.Mkdir(getDefaultDataDir(), 0700)
2018-03-22 13:52:16 -07:00
dataDirCreated = true
}
errLogFile := initLogger(cfg.LogFile, logLevel)
// Show error messages
2018-03-22 13:52:16 -07:00
if err != nil {
log.Error("Failed to parse command line flags")
}
if errDataDir != nil {
log.Error("Could not create data directory")
log.Debug("Data directory path: " + getDefaultDataDir())
} else if dataDirCreated {
log.Debug("Created data directory: " + getDefaultDataDir())
}
2018-03-22 13:52:16 -07:00
if errFile != nil {
log.Warning("Failed to parse config file: " + fmt.Sprint(errFile))
} else {
log.Debug("Parsed config file: " + cfg.ConfigFile)
}
if errLogFile != nil {
log.Error("Failed to initialize log file: " + fmt.Sprint(err))
} else {
log.Debug("Initialized log file: " + cfg.LogFile)
2018-03-23 16:08:03 -07:00
}
2018-03-31 07:11:25 -07:00
backends.UseLogger(*log)
2018-03-24 15:03:55 -07:00
// TODO: add more backend options like for example c-lighting and eclair
2018-03-23 16:08:03 -07:00
backend = cfg.LND
}
func getDefaultDataDir() (dir string) {
homeDir := getHomeDir()
switch runtime.GOOS {
case "windows":
fallthrough
case "darwin":
dir = path.Join(homeDir, defaultDataDir)
default:
dir = path.Join(homeDir, "."+strings.ToLower(defaultDataDir))
}
return dir
}
2018-03-23 16:08:03 -07:00
func getDefaultLndDir() (dir string) {
homeDir := getHomeDir()
switch runtime.GOOS {
case "darwin":
fallthrough
case "windows":
dir = path.Join(homeDir, "Lnd")
default:
dir = path.Join(homeDir, ".lnd")
}
return dir
}
func getHomeDir() (dir string) {
2018-03-23 16:08:03 -07:00
usr, err := user.Current()
if err == nil {
switch runtime.GOOS {
case "darwin":
dir = path.Join(usr.HomeDir, "Library/Application Support")
case "windows":
dir = path.Join(usr.HomeDir, "AppData/Local")
2018-03-23 16:08:03 -07:00
default:
dir = usr.HomeDir
2018-03-23 16:08:03 -07:00
}
2018-03-22 13:52:16 -07:00
}
2018-03-23 16:08:03 -07:00
return dir
}