Markus Pesch
10069568f9
Changes: - Renamed storage endpoint into dsn (data source name). - Add additional dsn fallback property. This dsn will be used in futes to store informations, if the main dsn backend does not work correctly. For example, if no connection can be established over the network to a database.
113 lines
2.8 KiB
Go
113 lines
2.8 KiB
Go
package cli
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"os"
|
|
"os/user"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/Masterminds/semver"
|
|
"github.com/volker-raschek/flucky/cli/daemon"
|
|
"github.com/volker-raschek/flucky/cli/sensor"
|
|
"github.com/volker-raschek/flucky/pkg/config"
|
|
"github.com/volker-raschek/flucky/pkg/types"
|
|
|
|
uuid "github.com/satori/go.uuid"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
// Execute a
|
|
func Execute(version *semver.Version) error {
|
|
|
|
rootCmd := &cobra.Command{
|
|
Use: "flucky",
|
|
// Short: "flucky - operate with differen sensors, his values and remote servers to synchronize measured values",
|
|
PersistentPreRunE: preRunError,
|
|
Version: version.String(),
|
|
}
|
|
|
|
defaultConfigFile, err := getDefaultConfigFile()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
rootCmd.PersistentFlags().String("config", defaultConfigFile, "Config file")
|
|
rootCmd.PersistentFlags().String("loglevel", "info", "Set the Loglevel. Possible values: debug, info, warn, error, fatal")
|
|
|
|
subCommands := []func(cmd *cobra.Command) error{
|
|
daemon.InitCmd,
|
|
sensor.InitCmd,
|
|
}
|
|
|
|
for _, subCommand := range subCommands {
|
|
if err := subCommand(rootCmd); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
err = rootCmd.Execute()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func preRunError(cmd *cobra.Command, args []string) error {
|
|
|
|
configFile := cmd.Flag("config").Value.String()
|
|
|
|
// check if config file exists
|
|
if _, err := os.Stat(configFile); os.IsNotExist(err) {
|
|
|
|
hostname, err := os.Hostname()
|
|
if err != nil {
|
|
return fmt.Errorf("Failed to determine the hostname: %v", err)
|
|
}
|
|
|
|
// Time must be truncted for postgres. Postgres currently does not support
|
|
// nanoseconds which is automatically include into the go time object
|
|
postgresTimeStamp := time.Now()
|
|
location, err := time.LoadLocation("Europe/Berlin")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
postgresTimeStamp = time.Date(postgresTimeStamp.Year(), postgresTimeStamp.Month(), postgresTimeStamp.Day(), postgresTimeStamp.Hour(), postgresTimeStamp.Minute(), postgresTimeStamp.Second(), int(math.Round(float64(postgresTimeStamp.Nanosecond())/1000000)*1000000), location)
|
|
|
|
// Default configuration
|
|
cnf := config.Config{
|
|
Device: &types.Device{
|
|
ID: uuid.NewV4().String(),
|
|
Name: hostname,
|
|
CreationDate: postgresTimeStamp,
|
|
},
|
|
DSN: "sqlite3:///var/log/flucky/sqlite.db?cache=shared&mode=memory&FKSupport=True",
|
|
}
|
|
|
|
err = config.Write(&cnf, configFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetDefaultConfigPath returns the default path to the configuration of
|
|
// rpm-distributor
|
|
func getDefaultConfigFile() (string, error) {
|
|
u, err := user.Current()
|
|
if err != nil {
|
|
return "", fmt.Errorf("Can not read current user: %v", err)
|
|
}
|
|
|
|
switch u.Uid {
|
|
case "0":
|
|
return "/etc/flucky/config.json", nil
|
|
default:
|
|
return filepath.Join(u.HomeDir, ".config/flucky/config.json"), nil
|
|
}
|
|
}
|