diff options
Diffstat (limited to 'cmd/util')
-rw-r--r-- | cmd/util/config.go | 181 | ||||
-rw-r--r-- | cmd/util/cprint.go | 47 | ||||
-rw-r--r-- | cmd/util/debug.go | 61 | ||||
-rw-r--r-- | cmd/util/exit.go | 15 | ||||
-rw-r--r-- | cmd/util/rpc.go | 18 | ||||
-rw-r--r-- | cmd/util/table.go | 60 |
6 files changed, 0 insertions, 382 deletions
diff --git a/cmd/util/config.go b/cmd/util/config.go deleted file mode 100644 index 08e01a89..00000000 --- a/cmd/util/config.go +++ /dev/null @@ -1,181 +0,0 @@ -package util - -import ( - "bytes" - "fmt" - "github.com/spf13/viper" - "github.com/spiral/roadrunner/service" - "os" - "path/filepath" - "strings" -) - -// ConfigWrapper provides interface bridge between v configs and service.Config. -type ConfigWrapper struct { - v *viper.Viper -} - -// Get nested config section (sub-map), returns nil if section not found. -func (w *ConfigWrapper) Get(key string) service.Config { - sub := w.v.Sub(key) - if sub == nil { - return nil - } - - return &ConfigWrapper{sub} -} - -// Unmarshal unmarshal config data into given struct. -func (w *ConfigWrapper) Unmarshal(out interface{}) error { - return w.v.Unmarshal(out) -} - -// LoadConfig config and merge it's values with set of flags. -func LoadConfig(cfgFile string, path []string, name string, flags []string, jsonConfig string) (*ConfigWrapper, error) { - cfg := viper.New() - - if cfgFile != "" { - if absPath, err := filepath.Abs(cfgFile); err == nil { - cfgFile = absPath - - // force working absPath related to config file - if err := os.Chdir(filepath.Dir(absPath)); err != nil { - return nil, err - } - } - - // Use cfg file from the flag. - cfg.SetConfigFile(cfgFile) - - if dir, err := filepath.Abs(cfgFile); err == nil { - // force working absPath related to config file - if err := os.Chdir(filepath.Dir(dir)); err != nil { - return nil, err - } - } - } else { - // automatic location - for _, p := range path { - cfg.AddConfigPath(p) - } - - cfg.SetConfigName(name) - } - - // read in environment variables that match - cfg.AutomaticEnv() - cfg.SetEnvPrefix("rr") - cfg.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) - - // If a cfg file is found, read it in. - if err := cfg.ReadInConfig(); err != nil { - if len(flags) == 0 && jsonConfig == "" { - return nil, err - } - } - - // merge included configs - if include, ok := cfg.Get("include").([]interface{}); ok { - for _, file := range include { - filename, ok := file.(string) - if !ok { - continue - } - - partial := viper.New() - partial.AutomaticEnv() - partial.SetEnvPrefix("rr") - partial.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) - partial.SetConfigFile(filename) - - if err := partial.ReadInConfig(); err != nil { - return nil, err - } - - // merging - if err := cfg.MergeConfigMap(partial.AllSettings()); err != nil { - return nil, err - } - } - } - - // automatically inject ENV variables using ${ENV} pattern - for _, key := range cfg.AllKeys() { - val := cfg.Get(key) - cfg.Set(key, parseEnv(val)) - } - - // merge with console flags - if len(flags) != 0 { - for _, f := range flags { - k, v, err := parseFlag(f) - if err != nil { - return nil, err - } - - cfg.Set(k, v) - } - } - - if jsonConfig != "" { - jConfig := viper.New() - jConfig.AutomaticEnv() - jConfig.SetEnvPrefix("rr") - jConfig.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) - - jConfig.SetConfigType("json") - if err := jConfig.ReadConfig(bytes.NewBufferString(jsonConfig)); err != nil { - return nil, err - } - - // merging - if err := cfg.MergeConfigMap(jConfig.AllSettings()); err != nil { - return nil, err - } - } - - merged := viper.New() - - // we have to copy all the merged values into new config in order normalize it (viper bug?) - if err := merged.MergeConfigMap(cfg.AllSettings()); err != nil { - return nil, err - } - - return &ConfigWrapper{merged}, nil -} - -func parseFlag(flag string) (string, string, error) { - if !strings.Contains(flag, "=") { - return "", "", fmt.Errorf("invalid flag `%s`", flag) - } - - parts := strings.SplitN(strings.TrimLeft(flag, " \"'`"), "=", 2) - - return strings.Trim(parts[0], " \n\t"), parseValue(strings.Trim(parts[1], " \n\t")), nil -} - -func parseValue(value string) string { - escape := []rune(value)[0] - - if escape == '"' || escape == '\'' || escape == '`' { - value = strings.Trim(value, string(escape)) - value = strings.Replace(value, fmt.Sprintf("\\%s", string(escape)), string(escape), -1) - } - - return value -} - -func parseEnv(value interface{}) interface{} { - str, ok := value.(string) - if !ok || len(str) <= 3 { - return value - } - - if str[0:2] == "${" && str[len(str)-1:] == "}" { - if v, ok := os.LookupEnv(str[2 : len(str)-1]); ok { - return v - } - } - - return str -} diff --git a/cmd/util/cprint.go b/cmd/util/cprint.go deleted file mode 100644 index 3a986fd6..00000000 --- a/cmd/util/cprint.go +++ /dev/null @@ -1,47 +0,0 @@ -package util - -import ( - "fmt" - "github.com/mgutz/ansi" - "os" - "regexp" - "strings" -) - -var ( - reg *regexp.Regexp - - // Colorize enables colors support. - Colorize = true -) - -func init() { - reg, _ = regexp.Compile(`<([^>]+)>`) -} - -// Printf works identically to fmt.Print but adds `<white+hb>color formatting support for CLI</reset>`. -func Printf(format string, args ...interface{}) { - fmt.Print(Sprintf(format, args...)) -} - -// Sprintf works identically to fmt.Sprintf but adds `<white+hb>color formatting support for CLI</reset>`. -func Sprintf(format string, args ...interface{}) string { - format = reg.ReplaceAllStringFunc(format, func(s string) string { - if !Colorize { - return "" - } - - return ansi.ColorCode(strings.Trim(s, "<>/")) - }) - - return fmt.Sprintf(format, args...) -} - -// Panicf prints `<white+hb>color formatted message to STDERR</reset>`. -func Panicf(format string, args ...interface{}) error { - _, err := fmt.Fprint(os.Stderr, Sprintf(format, args...)) - if err != nil { - return err - } - return nil -} diff --git a/cmd/util/debug.go b/cmd/util/debug.go deleted file mode 100644 index 9b94510d..00000000 --- a/cmd/util/debug.go +++ /dev/null @@ -1,61 +0,0 @@ -package util - -import ( - "github.com/sirupsen/logrus" - "github.com/spiral/roadrunner" - "strings" -) - -// LogEvent outputs rr event into given logger and return false if event was not handled. -func LogEvent(logger *logrus.Logger, event int, ctx interface{}) bool { - switch event { - case roadrunner.EventWorkerKill: - w := ctx.(*roadrunner.Worker) - logger.Warning(Sprintf( - "<white+hb>worker.%v</reset> <yellow>killed</reset>", - *w.Pid, - )) - return true - case roadrunner.EventWorkerError: - err := ctx.(roadrunner.WorkerError) - logger.Error(Sprintf( - "<white+hb>worker.%v</reset> <red>%s</reset>", - *err.Worker.Pid, - err.Caused, - )) - return true - } - - // outputs - switch event { - case roadrunner.EventStderrOutput: - for _, line := range strings.Split(string(ctx.([]byte)), "\n") { - if line == "" { - continue - } - - logger.Warning(strings.Trim(line, "\r\n")) - } - - return true - } - - // rr server events - switch event { - case roadrunner.EventServerFailure: - logger.Error(Sprintf("<red>server is dead</reset>")) - return true - } - - // pool events - switch event { - case roadrunner.EventPoolConstruct: - logger.Debug(Sprintf("<cyan>new worker pool</reset>")) - return true - case roadrunner.EventPoolError: - logger.Error(Sprintf("<red>%s</reset>", ctx)) - return true - } - - return false -} diff --git a/cmd/util/exit.go b/cmd/util/exit.go deleted file mode 100644 index 8871a483..00000000 --- a/cmd/util/exit.go +++ /dev/null @@ -1,15 +0,0 @@ -package util - -import ( - "os" -) - -// ExitWithError prints error and exits with error code`. -func ExitWithError(err error) { - errP := Panicf("<red+hb>Error:</reset> <red>%s</reset>\n", err) - if errP != nil { - // in case of error during Panicf, print this error via build-int print function - println("error occurred during fmt.Fprint: " + err.Error()) - } - os.Exit(1) -} diff --git a/cmd/util/rpc.go b/cmd/util/rpc.go deleted file mode 100644 index 8ff6720a..00000000 --- a/cmd/util/rpc.go +++ /dev/null @@ -1,18 +0,0 @@ -package util - -import ( - "errors" - "github.com/spiral/roadrunner/service" - rrpc "github.com/spiral/roadrunner/service/rpc" - "net/rpc" -) - -// RPCClient returns RPC client associated with given rr service container. -func RPCClient(container service.Container) (*rpc.Client, error) { - svc, st := container.Get(rrpc.ID) - if st < service.StatusOK { - return nil, errors.New("RPC service is not configured") - } - - return svc.(*rrpc.Service).Client() -} diff --git a/cmd/util/table.go b/cmd/util/table.go deleted file mode 100644 index c0e20837..00000000 --- a/cmd/util/table.go +++ /dev/null @@ -1,60 +0,0 @@ -package util - -import ( - "github.com/dustin/go-humanize" - "github.com/olekukonko/tablewriter" - rrutil "github.com/spiral/roadrunner/util" - "os" - "strconv" - "time" -) - -// WorkerTable renders table with information about rr server workers. -func WorkerTable(workers []*rrutil.State) *tablewriter.Table { - tw := tablewriter.NewWriter(os.Stdout) - tw.SetHeader([]string{"PID", "Status", "Execs", "Memory", "Created"}) - tw.SetColMinWidth(0, 7) - tw.SetColMinWidth(1, 9) - tw.SetColMinWidth(2, 7) - tw.SetColMinWidth(3, 7) - tw.SetColMinWidth(4, 18) - - for _, w := range workers { - tw.Append([]string{ - strconv.Itoa(w.Pid), - renderStatus(w.Status), - renderJobs(w.NumJobs), - humanize.Bytes(w.MemoryUsage), - renderAlive(time.Unix(0, w.Created)), - }) - } - - return tw -} - -func renderStatus(status string) string { - switch status { - case "inactive": - return Sprintf("<yellow>inactive</reset>") - case "ready": - return Sprintf("<cyan>ready</reset>") - case "working": - return Sprintf("<green>working</reset>") - case "invalid": - return Sprintf("<yellow>invalid</reset>") - case "stopped": - return Sprintf("<red>stopped</reset>") - case "errored": - return Sprintf("<red>errored</reset>") - } - - return status -} - -func renderJobs(number int64) string { - return humanize.Comma(int64(number)) -} - -func renderAlive(t time.Time) string { - return humanize.RelTime(t, time.Now(), "ago", "") -} |