diff options
author | Wolfy-J <[email protected]> | 2018-06-03 12:54:43 +0300 |
---|---|---|
committer | Wolfy-J <[email protected]> | 2018-06-03 12:54:43 +0300 |
commit | 36ea77baa5a41de10bd604cd0e5b5b3cafaaeb64 (patch) | |
tree | 13ca8abd454a6668f490eec2e44b1520bd3953fe /cmd/rr | |
parent | b02611b7266589d888e054a1d2e4432ae370617d (diff) |
service bus, http service, rpc bus, cli commands, new configs
Diffstat (limited to 'cmd/rr')
-rw-r--r-- | cmd/rr/LICENSE | 21 | ||||
-rw-r--r-- | cmd/rr/cmd/root.go | 99 | ||||
-rw-r--r-- | cmd/rr/cmd/serve.go | 48 | ||||
-rw-r--r-- | cmd/rr/http/reload.go | 50 | ||||
-rw-r--r-- | cmd/rr/http/workers.go | 64 | ||||
-rw-r--r-- | cmd/rr/main.go | 44 | ||||
-rw-r--r-- | cmd/rr/utils/config.go | 23 | ||||
-rw-r--r-- | cmd/rr/utils/cprint.go | 32 | ||||
-rw-r--r-- | cmd/rr/utils/verbose.go | 18 |
9 files changed, 399 insertions, 0 deletions
diff --git a/cmd/rr/LICENSE b/cmd/rr/LICENSE new file mode 100644 index 00000000..efb98c87 --- /dev/null +++ b/cmd/rr/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 SpiralScout + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.
\ No newline at end of file diff --git a/cmd/rr/cmd/root.go b/cmd/rr/cmd/root.go new file mode 100644 index 00000000..ac8466ef --- /dev/null +++ b/cmd/rr/cmd/root.go @@ -0,0 +1,99 @@ +// Copyright (c) 2018 SpiralScout +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package cmd + +import ( + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/spiral/roadrunner/service" + "github.com/spiral/roadrunner/cmd/rr/utils" + "os" + "fmt" +) + +// Service bus for all the commands. +var ( + // Shared service bus. + Bus *service.Bus + + // Root is application endpoint. + Root = &cobra.Command{ + Use: "rr", + Short: "RoadRunner, PHP application server", + } + + cfgFile string + verbose bool +) + +// Execute adds all child commands to the Root command and sets flags appropriately. +// This is called by main.main(). It only needs to happen once to the Root. +func Execute(serviceBus *service.Bus) { + Bus = serviceBus + if err := Root.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func init() { + Root.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose output") + Root.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is .rr.yaml)") + + cobra.OnInitialize(func() { + if verbose { + logrus.SetLevel(logrus.DebugLevel) + } + + if cfg := initConfig(cfgFile, []string{"."}, ".rr"); cfg != nil { + if err := Bus.Configure(cfg); err != nil { + panic(err) + } + } + }) +} + +func initConfig(cfgFile string, path []string, name string) service.Config { + cfg := viper.New() + + if cfgFile != "" { + // Use cfg file from the flag. + cfg.SetConfigFile(cfgFile) + } else { + // automatic location + for _, p := range path { + cfg.AddConfigPath(p) + } + cfg.SetConfigName(name) + } + + // read in environment variables that match + cfg.AutomaticEnv() + + // If a cfg file is found, read it in. + if err := cfg.ReadInConfig(); err != nil { + logrus.Warnf("config: %s", err) + return nil + } + + return &utils.ConfigWrapper{cfg} +} diff --git a/cmd/rr/cmd/serve.go b/cmd/rr/cmd/serve.go new file mode 100644 index 00000000..f5524556 --- /dev/null +++ b/cmd/rr/cmd/serve.go @@ -0,0 +1,48 @@ +// Copyright (c) 2018 SpiralScout +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package cmd + +import ( + "github.com/spf13/cobra" + "os" + "os/signal" + "syscall" +) + +var ( + stopSignal = make(chan os.Signal, 1) +) + +func init() { + Root.AddCommand(&cobra.Command{ + Use: "serve", + Short: "Serve RoadRunner service(s)", + Run: serveHandler, + }) + + signal.Notify(stopSignal, syscall.SIGTERM) +} + +func serveHandler(cmd *cobra.Command, args []string) { + Bus.Serve() + <-stopSignal + Bus.Stop() +} diff --git a/cmd/rr/http/reload.go b/cmd/rr/http/reload.go new file mode 100644 index 00000000..6caf0a71 --- /dev/null +++ b/cmd/rr/http/reload.go @@ -0,0 +1,50 @@ +// Copyright (c) 2018 SpiralScout +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package http + +import ( + "github.com/spf13/cobra" + "fmt" + rr "github.com/spiral/roadrunner/cmd/rr/cmd" +) + +func init() { + rr.Root.AddCommand(&cobra.Command{ + Use: "http:reload", + Short: "Reload RoadRunner worker pools for the HTTP service", + Run: reloadHandler, + }) +} + +func reloadHandler(cmd *cobra.Command, args []string) { + client, err := rr.Bus.RCPClient() + if err != nil { + panic(err) // todo: change + } + defer client.Close() + + var r string + if err := client.Call("http.Reset", true, &r); err != nil { + panic(err) + } + + fmt.Println(r) +} diff --git a/cmd/rr/http/workers.go b/cmd/rr/http/workers.go new file mode 100644 index 00000000..c1225987 --- /dev/null +++ b/cmd/rr/http/workers.go @@ -0,0 +1,64 @@ +// Copyright (c) 2018 SpiralScout +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package http + +import ( + "github.com/spf13/cobra" + "github.com/spiral/roadrunner/http" + "github.com/olekukonko/tablewriter" + "os" + "strconv" + rr "github.com/spiral/roadrunner/cmd/rr/cmd" +) + +func init() { + rr.Root.AddCommand(&cobra.Command{ + Use: "http:workers", + Short: "List workers associated with RoadRunner HTTP service", + Run: workersHandler, + }) +} + +func workersHandler(cmd *cobra.Command, args []string) { + client, err := rr.Bus.RCPClient() + if err != nil { + panic(err) // todo: change + } + defer client.Close() + + var r http.WorkerList + if err := client.Call("http.Workers", true, &r); err != nil { + panic(err) + } + + tw := tablewriter.NewWriter(os.Stdout) + tw.SetHeader([]string{"PID", "Status", "Num Execs"}) + + for _, w := range r.Workers { + tw.Append([]string{ + strconv.Itoa(w.Pid), + w.Status, + strconv.Itoa(int(w.NumExecs)), + }) + } + + tw.Render() +} diff --git a/cmd/rr/main.go b/cmd/rr/main.go new file mode 100644 index 00000000..336aeddd --- /dev/null +++ b/cmd/rr/main.go @@ -0,0 +1,44 @@ +// MIT License +// +// Copyright (c) 2018 SpiralScout +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package main + +import ( + "github.com/spiral/roadrunner/cmd/rr/cmd" + "github.com/spiral/roadrunner/service" + "github.com/spiral/roadrunner/http" + _ "github.com/spiral/roadrunner/cmd/rr/http" +) + +var bus *service.Bus + +func init() { + bus = service.NewBus() +} + +func main() { + // http server with PSR7 support + bus.Register(&http.Service{}) + + // you can register additional commands using cmd.Root + cmd.Execute(bus) +} diff --git a/cmd/rr/utils/config.go b/cmd/rr/utils/config.go new file mode 100644 index 00000000..e7e22b3a --- /dev/null +++ b/cmd/rr/utils/config.go @@ -0,0 +1,23 @@ +package utils + +import ( + "github.com/spf13/viper" + "github.com/spiral/roadrunner/service" +) + +type ConfigWrapper struct { + Viper *viper.Viper +} + +func (w *ConfigWrapper) Get(key string) service.Config { + sub := w.Viper.Sub(key) + if sub == nil { + return nil + } + + return &ConfigWrapper{sub} +} + +func (w *ConfigWrapper) Unmarshal(out interface{}) error { + return w.Viper.Unmarshal(out) +} diff --git a/cmd/rr/utils/cprint.go b/cmd/rr/utils/cprint.go new file mode 100644 index 00000000..f6f828f8 --- /dev/null +++ b/cmd/rr/utils/cprint.go @@ -0,0 +1,32 @@ +package utils + +import ( + "fmt" + "gopkg.in/AlecAivazis/survey.v1/core" + "regexp" + "strings" +) + +// 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 { + r, err := regexp.Compile(`<([^>]+)>`) + if err != nil { + panic(err) + } + + format = r.ReplaceAllStringFunc(format, func(s string) string { + return fmt.Sprintf(`{{color "%s"}}`, strings.Trim(s, "<>/")) + }) + + out, err := core.RunTemplate(fmt.Sprintf(format, args...), nil) + if err != nil { + panic(err) + } + + return out +} diff --git a/cmd/rr/utils/verbose.go b/cmd/rr/utils/verbose.go new file mode 100644 index 00000000..43770f34 --- /dev/null +++ b/cmd/rr/utils/verbose.go @@ -0,0 +1,18 @@ +package utils + +//if f.Verbose { +// rr.Observe(func(event int, ctx interface{}) { +// switch event { +// case roadrunner.EventPoolError: +// logrus.Error(ctx) +// case roadrunner.EventWorkerCreate: +// logrus.Infof("%s - created", ctx) +// case roadrunner.EventWorkerError: +// logrus.Errorf("%s: %s", ctx.(roadrunner.WorkerError).Worker, ctx.(roadrunner.WorkerError).Error()) +// case roadrunner.EventWorkerDestruct: +// logrus.Warnf("%s - destructed", ctx) +// case roadrunner.EventWorkerKill: +// logrus.Warnf("%s - killed", ctx) +// } +// }) +//} |