diff --git a/.gitignore b/.gitignore index 66fd13c..d9592b4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ # Dependency directories (remove the comment below to include it) # vendor/ +.idea/ diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 0000000..802f764 --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,107 @@ +// VulcanizeDB +// Copyright © 2020 Vulcanize + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. + +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cmd + +import ( + "fmt" + "os" + "strings" + + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var ( + cfgFile string + logWithCommand log.Entry +) + +var rootCmd = &cobra.Command{ + Use: "tx_spammer", + PersistentPreRun: initFuncs, +} + +func Execute() { + log.Info("----- Starting tx spammer -----") + if err := rootCmd.Execute(); err != nil { + log.Fatal(err) + } +} + +func initFuncs(cmd *cobra.Command, args []string) { + logfile := viper.GetString("logfile") + if logfile != "" { + file, err := os.OpenFile(logfile, + os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err == nil { + log.Infof("Directing output to %s", logfile) + log.SetOutput(file) + } else { + log.SetOutput(os.Stdout) + log.Info("Failed to log to file, using default stdout") + } + } else { + log.SetOutput(os.Stdout) + } + if err := logLevel(); err != nil { + log.Fatal("Could not set log level: ", err) + } +} + +func logLevel() error { + viper.BindEnv("log.level", "LOGRUS_LEVEL") + lvl, err := log.ParseLevel(viper.GetString("log.level")) + if err != nil { + return err + } + log.SetLevel(lvl) + if lvl > log.InfoLevel { + log.SetReportCaller(true) + } + log.Info("Log level set to ", lvl.String()) + return nil +} + +func init() { + cobra.OnInitialize(initConfig) + viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + viper.AutomaticEnv() + + // flags + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file location") + + rootCmd.PersistentFlags().String("log-level", log.InfoLevel.String(), "Log level (trace, debug, info, warn, error, fatal, panic") + rootCmd.PersistentFlags().String("log-file", "", "file path for logging") + + // and their .toml bindings + viper.BindPFlag("log.file", rootCmd.PersistentFlags().Lookup("log-file")) + viper.BindPFlag("log.level", rootCmd.PersistentFlags().Lookup("log-level")) +} + +func initConfig() { + if cfgFile != "" { + viper.SetConfigFile(cfgFile) + if err := viper.ReadInConfig(); err == nil { + log.Printf("Using config file: %s", viper.ConfigFileUsed()) + } else { + log.Fatal(fmt.Sprintf("Couldn't read config file: %s", err.Error())) + } + } else { + log.Warn("No config file passed with --config flag") + } +} diff --git a/cmd/sendTxs.go b/cmd/sendTxs.go new file mode 100644 index 0000000..ff5d5fc --- /dev/null +++ b/cmd/sendTxs.go @@ -0,0 +1,51 @@ +// Copyright © 2020 Vulcanize, Inc +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +// sendTxsCmd represents the sendTxs command +var sendTxsCmd = &cobra.Command{ + Use: "sendTxs", + Short: "A brief description of your command", + Long: `A longer description that spans multiple lines and likely contains examples +and usage of using your command. For example: + +Cobra is a CLI library for Go that empowers applications. +This application is a tool to generate the needed files +to quickly create a Cobra application.`, + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("sendTxs called") + }, +} + +func init() { + rootCmd.AddCommand(sendTxsCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // sendTxsCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // sendTxsCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +}