Implemented configuration

pull/17/head
マリウス 2 years ago
parent a064e2fae0
commit 52db205407
No known key found for this signature in database
GPG Key ID: 272ED814BF63261F

@ -0,0 +1,126 @@
package main
import (
"bytes"
"errors"
"fmt"
"io/ioutil"
"os"
"strings"
"github.com/BurntSushi/toml"
)
type ConfigProfile struct {
From string
Organization string
}
type Config struct {
ConfigFile string `toml:"-"`
ConnectionString string
CachePath string
Logfile string
Profile ConfigProfile
}
func LoadConfig() (*Config, error) {
configDir, exist := os.LookupEnv("XDG_CONFIG_HOME")
if exist == false {
configDir, exist = os.LookupEnv("HOME")
if exist == false {
return nil, errors.New("No XDG_CONFIG_HOME or HOME set!")
}
configDir = fmt.Sprintf("%s/.config", configDir)
}
configFile := fmt.Sprintf("%s/superhighway84.toml", configDir)
f, err := os.OpenFile(configFile, os.O_CREATE|os.O_RDWR, 0644)
if err != nil {
return nil, err
}
defer f.Close()
configFileContent, err := ioutil.ReadAll(f)
if err != nil {
return nil, err
}
cfg := new(Config)
_, err = toml.Decode(string(configFileContent), &cfg)
cfg.ConfigFile = configFile
return cfg, nil
}
func (cfg *Config) Persist() (error) {
buf := new(bytes.Buffer)
if err := toml.NewEncoder(buf).Encode(cfg); err != nil {
return err
}
if err := ioutil.WriteFile(cfg.ConfigFile, buf.Bytes(), 0644); err != nil {
return err
}
return nil
}
func (cfg *Config) WasSetup() (bool) {
if cfg.CachePath == "" ||
cfg.ConnectionString == "" ||
cfg.Logfile == "" {
return false
}
return true
}
func (cfg *Config) Setup() (error) {
fmt.Printf("\nSUPERHIGHWAY84\n\nInitial Setup\n-------------\n\n")
defaultConnectionString := "/orbitdb/bafyreifdpagppa7ve45odxuvudz5snbzcybwyfer777huckl4li4zbc5k4/superhighway84"
fmt.Printf("Database connection string [%s]: ", defaultConnectionString)
fmt.Scanln(&cfg.ConnectionString)
if strings.TrimSpace(cfg.ConnectionString) == "" {
cfg.ConnectionString = defaultConnectionString
}
cacheDir, exist := os.LookupEnv("XDG_CACHE_HOME")
if exist == false {
cacheDir = fmt.Sprintf("%s/.cache", os.Getenv("HOME"))
}
defaultCachePath := fmt.Sprintf("%s/superhighway84", cacheDir)
fmt.Printf("Database cache path [%s]: ", defaultCachePath)
fmt.Scanln(&cfg.CachePath)
if strings.TrimSpace(cfg.CachePath) == "" {
cfg.CachePath = defaultCachePath
}
defaultLogfile := fmt.Sprintf("%s/superhighway84.log", cacheDir)
fmt.Printf("Logfile path [%s]: ", defaultLogfile)
fmt.Scanln(&cfg.Logfile)
if strings.TrimSpace(cfg.Logfile) == "" {
cfg.Logfile = defaultLogfile
}
fmt.Printf("\nProfile information\n-------------------\n\n")
defaultProfileFrom := fmt.Sprintf("%s@localhost", os.Getenv("USER"))
fmt.Printf("From [%s]: ", defaultProfileFrom)
fmt.Scanln(&cfg.Profile.From)
if strings.TrimSpace(cfg.Profile.From) == "" {
cfg.Profile.From = defaultProfileFrom
}
fmt.Printf("Organization []: ")
fmt.Scanln(&cfg.Profile.Organization)
return cfg.Persist()
}

@ -21,8 +21,7 @@ import (
type Database struct {
ctx context.Context
Name string
Init bool
ConnectionString string
URI string
Cache string
@ -33,7 +32,7 @@ type Database struct {
StoreEventChan <-chan events.Event
}
func (db *Database)init() (error) {
func (db *Database) init() (error) {
var err error
db.OrbitDB, err = orbitdb.NewOrbitDB(db.ctx, db.IPFSNode, &orbitdb.NewOrbitDBOptions{
@ -63,7 +62,7 @@ func (db *Database)init() (error) {
// db.URI = addr.String()
storetype := "docstore"
db.Store, err = db.OrbitDB.Docs(db.ctx, db.Name, &orbitdb.CreateDBOptions{
db.Store, err = db.OrbitDB.Docs(db.ctx, db.ConnectionString, &orbitdb.CreateDBOptions{
AccessController: ac,
StoreType: &storetype,
StoreSpecificOpts: documentstore.DefaultStoreOptsForMap("id"),
@ -76,43 +75,6 @@ func (db *Database)init() (error) {
return nil
}
// func (db *Database)open() (error) {
// var err error
//
// db.OrbitDB, err = orbitdb.NewOrbitDB(db.ctx, db.IPFSNode, &orbitdb.NewOrbitDBOptions{
// Directory: &db.Cache,
// Logger: db.Logger,
// })
// if err != nil {
// return err
// }
//
// ac := &accesscontroller.CreateAccessControllerOptions{
// Access: map[string][]string{
// "write": {
// "*",
// },
// },
// }
//
// // create := false
// storetype := "docstore"
// dbstore, err := db.OrbitDB.Docs(db.ctx, db.URI, &orbitdb.CreateDBOptions{
// AccessController: ac,
// // Create: &create,
// StoreType: &storetype,
// StoreSpecificOpts: documentstore.DefaultStoreOptsForMap("id"),
// })
// if err != nil {
// return err
// }
//
// db.Store = dbstore.(orbitdb.DocumentStore)
//
// db.StoreEventChan = db.Store.Subscribe(db.ctx)
// return nil
// }
func(db *Database) connectToPeers() error {
var wg sync.WaitGroup
@ -139,19 +101,15 @@ func(db *Database) connectToPeers() error {
func NewDatabase(
ctx context.Context,
dbURI string,
dbConnectionString string,
dbCache string,
dbInit bool,
dbName string,
logger *zap.Logger,
) (*Database, error) {
var err error
db := new(Database)
db.ctx = ctx
db.Name = dbName
db.Init = dbInit
db.URI = dbURI
db.ConnectionString = dbConnectionString
db.Cache = dbCache
db.Logger = logger
@ -202,14 +160,14 @@ func (db *Database) Connect(onReady func(address string)) (error) {
db.Logger.Info("running ...")
go func() {
for {
for ev := range db.StoreEventChan {
db.Logger.Debug("got event", zap.Any("event", ev))
switch ev.(type) {
case *stores.EventReady:
onReady(db.Store.Address().String())
db.URI = db.Store.Address().String()
onReady(db.URI)
}
}
}

@ -17,6 +17,7 @@ require (
bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc // indirect
berty.tech/go-ipfs-log v1.5.0 // indirect
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect
github.com/BurntSushi/toml v0.4.1 // indirect
github.com/Stebalien/go-bitfield v0.0.1 // indirect
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect
github.com/benbjohnson/clock v1.0.3 // indirect

@ -34,6 +34,8 @@ github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOv
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M=
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y=

@ -7,7 +7,6 @@ import (
"time"
"log"
"os"
"github.com/mrusme/superhighway84/database"
"github.com/mrusme/superhighway84/models"
@ -30,28 +29,15 @@ func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
dbInit := false
dbInitValue := os.Getenv("SUPERHIGHWAY84_DB_INIT")
if dbInitValue == "1" {
dbInit = true
}
dbName := os.Getenv("SUPERHIGHWAY84_DB_NAME")
if dbInit == true && dbName == "" {
log.Panicln("SUPERHIGHWAY84_DB_NAME missing!")
}
dbURI := os.Getenv("SUPERHIGHWAY84_DB_URI")
if dbInit == false && dbURI == "" {
log.Panicln("SUPERHIGHWAY84_DB_URI missing!")
cfg, err := LoadConfig()
if err != nil {
log.Panicln(err)
}
dbCache := os.Getenv("SUPERHIGHWAY84_DB_CACHE")
if dbCache == "" {
log.Panicln("SUPERHIGHWAY84_DB_CACHE missing!")
if cfg.WasSetup() == false {
cfg.Setup()
}
logger, err := NewLogger(os.Getenv("LOGFILE"))
logger, err := NewLogger(cfg.Logfile)
if err != nil {
log.Panicln(err)
}
@ -61,7 +47,7 @@ func main() {
TUI := tui.Init(&EMBEDFS)
TUI.ArticlesDatasource = &articles
db, err := database.NewDatabase(ctx, dbURI, dbCache, dbInit, dbName, logger)
db, err := database.NewDatabase(ctx, cfg.ConnectionString, cfg.CachePath, logger)
if err != nil {
log.Panicln(err)
}

Loading…
Cancel
Save