diff --git a/cmd/knoxite/config.go b/cmd/knoxite/config.go index 27410b82..01076b35 100644 --- a/cmd/knoxite/config.go +++ b/cmd/knoxite/config.go @@ -9,7 +9,6 @@ package main import ( "bytes" "fmt" - "log" "strconv" "strings" diff --git a/cmd/knoxite/logger.go b/cmd/knoxite/logger.go index 9d78c7f0..3b88bc2d 100644 --- a/cmd/knoxite/logger.go +++ b/cmd/knoxite/logger.go @@ -17,14 +17,14 @@ import ( ) type Logger struct { - VerbosityLevel knoxite.Verbosity - w io.Writer + LogLevel knoxite.LogLevel + w io.Writer } -func NewLogger(v knoxite.Verbosity) *Logger { +func NewLogger(v knoxite.LogLevel) *Logger { return &Logger{ - VerbosityLevel: v, - w: os.Stdout, + LogLevel: v, + w: os.Stdout, } } @@ -33,6 +33,16 @@ func (l *Logger) WithWriter(w io.Writer) *Logger { return l } +func (l Logger) Fatal(v ...interface{}) { + l.log(knoxite.LogLevelFatal, v...) + os.Exit(1) +} + +func (l Logger) Fatalf(format string, v ...interface{}) { + l.logf(knoxite.LogLevelFatal, format, v...) + os.Exit(1) +} + func (l Logger) Warn(v ...interface{}) { l.log(knoxite.LogLevelWarning, v...) } @@ -41,6 +51,14 @@ func (l Logger) Warnf(format string, v ...interface{}) { l.logf(knoxite.LogLevelWarning, format, v...) } +func (l Logger) Print(v ...interface{}) { + l.log(knoxite.LogLevelPrint, v...) +} + +func (l Logger) Printf(format string, v ...interface{}) { + l.logf(knoxite.LogLevelPrint, format, v...) +} + func (l Logger) Info(v ...interface{}) { l.log(knoxite.LogLevelInfo, v...) } @@ -57,30 +75,20 @@ func (l Logger) Debugf(format string, v ...interface{}) { l.logf(knoxite.LogLevelDebug, format, v...) } -func (l Logger) Fatal(v ...interface{}) { - l.log(knoxite.LogLevelFatal, v...) - os.Exit(1) -} - -func (l Logger) Fatalf(format string, v ...interface{}) { - l.logf(knoxite.LogLevelFatal, format, v...) - os.Exit(1) -} - -func (l Logger) log(verbosity knoxite.Verbosity, v ...interface{}) { - if verbosity <= l.VerbosityLevel { - l.printV(verbosity, v...) +func (l Logger) log(logLevel knoxite.LogLevel, v ...interface{}) { + if logLevel <= l.LogLevel { + l.printV(logLevel, v...) } } -func (l Logger) logf(verbosity knoxite.Verbosity, format string, v ...interface{}) { - if verbosity <= l.VerbosityLevel { - l.printV(verbosity, fmt.Sprintf(format, v...)) +func (l Logger) logf(logLevel knoxite.LogLevel, format string, v ...interface{}) { + if logLevel <= l.LogLevel { + l.printV(logLevel, fmt.Sprintf(format, v...)) } } -func (l Logger) printV(verbosity knoxite.Verbosity, v ...interface{}) { - _, _ = l.w.Write([]byte(verbosity.String() + ": ")) +func (l Logger) printV(logLevel knoxite.LogLevel, v ...interface{}) { + _, _ = l.w.Write([]byte(logLevel.String() + ": ")) _, _ = l.w.Write([]byte(fmt.Sprint(v...))) _, _ = l.w.Write([]byte("\n")) } diff --git a/cmd/knoxite/main.go b/cmd/knoxite/main.go index 53e2b963..62fd1ccf 100644 --- a/cmd/knoxite/main.go +++ b/cmd/knoxite/main.go @@ -11,8 +11,6 @@ package main import ( "fmt" - "io/ioutil" - "log" "os" "syscall" @@ -41,7 +39,8 @@ type GlobalOptions struct { Alias string Password string ConfigURL string - Verbosity string + Verbosity bool + LogLevel string } var ( @@ -57,25 +56,26 @@ var ( Short: "Knoxite is a data storage & backup tool", Long: "Knoxite is a secure and flexible data storage and backup tool\n" + "Complete documentation is available at https://github.com/knoxite/knoxite", - SilenceErrors: true, - SilenceUsage: true, + SilenceErrors: true, + SilenceUsage: true, DisableAutoGenTag: true, } - logger knoxite.Logger + log knoxite.Logger ) func main() { shutdown.OnSignal(0, os.Interrupt, syscall.SIGTERM) // quiet shutdown logger - shutdown.Logger = shutdown.LogPrinter(log.New(ioutil.Discard, "", log.LstdFlags)) + shutdown.Logger = shutdown.LogPrinter(knoxite.NopLogger{}) // shutdown.SetTimeout(0) RootCmd.PersistentFlags().StringVarP(&globalOpts.Repo, "repo", "r", "", "Repository directory to backup to/restore from (default: current working dir)") RootCmd.PersistentFlags().StringVarP(&globalOpts.Alias, "alias", "R", "", "Repository alias to backup to/restore from") RootCmd.PersistentFlags().StringVar(&globalOpts.Password, "password", "", "Password to use for data encryption") RootCmd.PersistentFlags().StringVarP(&globalOpts.ConfigURL, "configURL", "C", config.DefaultPath(), "Path to the configuration file") - RootCmd.PersistentFlags().StringVarP(&globalOpts.Verbosity, "verbose", "v", "Warning", "Verbose output: possible levels are Debug, Info and Warning") + RootCmd.PersistentFlags().StringVar(&globalOpts.LogLevel, "loglevel", "Warning", "Verbose output. Possible levels are Debug, Info and Warning") + RootCmd.PersistentFlags().BoolVarP(&globalOpts.Verbosity, "verbose", "v", false, "Verbose output on log level Info. Use --loglevel to choose between Debug, Info and Warning") globalOpts.Repo = os.Getenv("KNOXITE_REPOSITORY") globalOpts.Password = os.Getenv("KNOXITE_PASSWORD") @@ -101,8 +101,17 @@ func init() { } func initLogger() { - logger = *NewLogger(utils.VerbosityTypeFromString(globalOpts.Verbosity)). + var logLevel = globalOpts.LogLevel + var verbosity = globalOpts.Verbosity + + if verbosity == true && logLevel == "" { + logLevel = "Info" + } + + log = *NewLogger(utils.LogLevelFromString(logLevel)). WithWriter(os.Stdout) + + knoxite.SetLogger(log) } // initConfig initializes the configuration for knoxite. @@ -111,19 +120,19 @@ func initLogger() { func initConfig() { // We dont allow both flags to be set as this can lead to unclear instructions. if RootCmd.PersistentFlags().Changed("repo") && RootCmd.PersistentFlags().Changed("alias") { - logger.Fatalf("Specify either repository directory '-r' or an alias '-R'") + log.Fatalf("Specify either repository directory '-r' or an alias '-R'") return } var err error cfg, err = config.New(globalOpts.ConfigURL) if err != nil { - logger.Fatalf("error reading the config file: %v", err) + log.Fatalf("error reading the config file: %v", err) return } if err = cfg.Load(); err != nil { - logger.Fatalf("error parsing the toml config file at '%s': %v", cfg.URL().Path, err) + log.Fatalf("error parsing the toml config file at '%s': %v", cfg.URL().Path, err) return } @@ -137,7 +146,7 @@ func initConfig() { if globalOpts.Alias != "" { rep, ok := cfg.Repositories[globalOpts.Alias] if !ok { - logger.Fatalf("error loading the specified alias") + log.Fatalf("error loading the specified alias") return } diff --git a/cmd/knoxite/utils/utils.go b/cmd/knoxite/utils/utils.go index 7cf8c975..e083e06f 100644 --- a/cmd/knoxite/utils/utils.go +++ b/cmd/knoxite/utils/utils.go @@ -193,16 +193,21 @@ func PathToUrl(u string) (*url.URL, error) { return url, nil } -// VerbosityTypeFromString returns the verbosity type from a user-specified string. -func VerbosityTypeFromString(s string) knoxite.Verbosity { +// LogLevelFromString returns the log level from a user-specified string. +// returns log level print as default +func LogLevelFromString(s string) knoxite.LogLevel { switch strings.ToLower(s) { + case "fatal": + return knoxite.LogLevelFatal case "warning": return knoxite.LogLevelWarning + case "print": + return knoxite.LogLevelPrint case "info": return knoxite.LogLevelInfo case "debug": return knoxite.LogLevelDebug default: - return knoxite.LogLevelWarning + return knoxite.LogLevelPrint } } diff --git a/cmd/server/server.go b/cmd/server/server.go index 6f060000..128a2e27 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -4,11 +4,16 @@ import ( "errors" "fmt" "io" - "log" "net/http" "os" "path/filepath" "strings" + + "github.com/knoxite/knoxite" +) + +var ( + log knoxite.Logger ) const storagePath = "/tmp/knoxite.storage" diff --git a/logger.go b/logger.go index 9612154e..13300827 100644 --- a/logger.go +++ b/logger.go @@ -13,6 +13,8 @@ type Logger interface { Fatalf(format string, v ...interface{}) Warn(v ...interface{}) Warnf(format string, v ...interface{}) + Print(v ...interface{}) + Printf(format string, v ...interface{}) Info(v ...interface{}) Infof(format string, v ...interface{}) Debug(v ...interface{}) @@ -31,10 +33,18 @@ func SetLogger(l Logger) { type NopLogger struct { } +func (nl NopLogger) Fatal(v ...interface{}) {} + +func (nl NopLogger) Fatalf(format string, v ...interface{}) {} + func (nl NopLogger) Warn(v ...interface{}) {} func (nl NopLogger) Warnf(format string, v ...interface{}) {} +func (nl NopLogger) Print(v ...interface{}) {} + +func (nl NopLogger) Printf(format string, v ...interface{}) {} + func (nl NopLogger) Info(v ...interface{}) {} func (nl NopLogger) Infof(format string, v ...interface{}) {} @@ -42,7 +52,3 @@ func (nl NopLogger) Infof(format string, v ...interface{}) {} func (nl NopLogger) Debug(v ...interface{}) {} func (nl NopLogger) Debugf(format string, v ...interface{}) {} - -func (nl NopLogger) Fatal(v ...interface{}) {} - -func (nl NopLogger) Fatalf(format string, v ...interface{}) {} diff --git a/storage/http/http.go b/storage/http/http.go index dc16f8df..0ac54a8c 100644 --- a/storage/http/http.go +++ b/storage/http/http.go @@ -11,7 +11,6 @@ import ( "bytes" "fmt" "io/ioutil" - "log" "mime/multipart" "net/http" "net/url" @@ -25,6 +24,10 @@ type HTTPStorage struct { URL url.URL } +var ( + log knoxite.Logger +) + func init() { knoxite.RegisterStorageBackend(&HTTPStorage{}) } diff --git a/verbosity.go b/verbosity.go index 1982fd7b..aa193db3 100644 --- a/verbosity.go +++ b/verbosity.go @@ -8,16 +8,17 @@ package knoxite -// verbosity levels for logging. -type Verbosity int +// log levels for logging. +type LogLevel int const ( LogLevelFatal = iota LogLevelWarning + LogLevelPrint LogLevelInfo LogLevelDebug ) -func (v Verbosity) String() string { - return [...]string{"Fatal", "Warning", "Info", "Debug"}[v] +func (v LogLevel) String() string { + return [...]string{"Fatal", "Warning", "Print", "Info", "Debug"}[v] }