Files
indra/pkg/storage/configure.go

161 lines
2.7 KiB
Go

package storage
import (
"github.com/spf13/viper"
"os"
"path/filepath"
)
var (
newKeyGenerated bool
isNewDB bool
noKeyProvided bool
key Key
)
func configure() {
log.I.Ln("initializing storage")
configureDirPath()
configureFile()
configureKey()
}
func configureKey() {
log.I.Ln("looking for encryption key")
var err error
if viper.GetString(storeKeyFlag) != "" {
log.I.Ln("found key")
key.Decode(viper.GetString(storeKeyFlag))
return
}
log.I.Ln("no key found, checking for keyfile")
if viper.GetString(storeKeyFileFlag) != "" {
var fileInfo os.FileInfo
if fileInfo, err = os.Stat(viper.GetString(storeKeyFileFlag)); err != nil {
startupErrors <- err
return
}
log.I.Ln("keyfile found")
if fileInfo.Mode() != 0600 {
log.W.Ln("keyfile permissions are too open:", fileInfo.Mode())
log.W.Ln("It is recommended that you change them to 0600")
}
var keyBytes []byte
if keyBytes, err = os.ReadFile(viper.GetString(storeKeyFileFlag)); err != nil {
startupErrors <- err
return
}
key.Decode(string(keyBytes))
return
}
if !isNewDB {
log.I.Ln("no keyfile found")
noKeyProvided = true
return
}
log.I.Ln("no keyfile found, generating a new key")
if key, err = KeyGen(); err != nil {
startupErrors <- err
return
}
log.W.Ln(`
--------------------------------------------------------
--
-- WARNING: The following key will be used to store
-- your database securely, please ensure that you make
-- a copy and store it in a secure place before using
-- this software in a production environment.
--
--
-- Failure to store this key properly will result in
-- no longer being able to decrypt this database.
--
--
-- It is recommended to use the following to generate
-- your key:
--
-- indra seed keygen
--
-- OR
--
-- indra seed keygen --keyfile=/path/to/keyfile
--
--
-- YOU HAVE BEEN WARNED!
--
-------------------------------------------------------
-- KEY:`, key.Encode(), `--
-------------------------------------------------------
`)
newKeyGenerated = true
viper.Set(storeKeyFlag, key.Encode())
}
func configureDirPath() {
var err error
if viper.GetString(storeFilePathFlag) == "" {
viper.Set(storeFilePathFlag, filepath.Join(viper.GetString("data-dir"), fileName))
}
err = os.MkdirAll(
filepath.Dir(storeFilePathFlag),
0755,
)
if err != nil {
startupErrors <- err
return
}
}
func configureFile() {
log.I.Ln("using storage db path:")
log.I.Ln("-", viper.GetString(storeFilePathFlag))
log.I.Ln("checking if database exists")
var err error
if _, err = os.Stat(viper.GetString(storeFilePathFlag)); err != nil {
log.I.Ln("no database found, creating a new one")
isNewDB = true
return
}
log.I.Ln("database found")
}