package cli import ( "fmt" "math" "os" "os/user" "path/filepath" "time" "git.cryptic.systems/volker.raschek/flucky/cli/completion" "git.cryptic.systems/volker.raschek/flucky/cli/daemon" imp "git.cryptic.systems/volker.raschek/flucky/cli/imp" "git.cryptic.systems/volker.raschek/flucky/cli/sensor" "git.cryptic.systems/volker.raschek/flucky/cli/temperature" "git.cryptic.systems/volker.raschek/flucky/pkg/config" uuid "github.com/satori/go.uuid" "github.com/spf13/cobra" ) // Execute a func Execute(version string) error { rootCmd := &cobra.Command{ Use: "flucky", PersistentPreRunE: preRunError, Version: version, } 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{ completion.InitCmd, daemon.InitCmd, imp.InitCmd, sensor.InitCmd, temperature.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) { // Time must be truncated 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 cache directory defaultCacheDir, err := getDefaultCacheDir() if err != nil { return err } // Default configuration dsn := fmt.Sprintf("sqlite3://%v/sqlite.db?cache=shared&mode=memory&foreign_keys=on", defaultCacheDir) cnf := config.Config{ DeviceID: uuid.NewV4().String(), DSN: dsn, } err = config.Write(&cnf, configFile) if err != nil { return err } } return nil } // getDefaultConfigFile returns the default path to the configuration file of // flucky 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 } } // getDefaultCacheDir returns the default path to the cache directory where // flucky stores his measured values. func getDefaultCacheDir() (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 "/var/cache/flucky", nil default: return filepath.Join(u.HomeDir, ".cache/flucky"), nil } }