1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
package cli
import (
"log"
"net/http/pprof"
"net/rpc"
"os"
"path/filepath"
"github.com/spiral/errors"
goridgeRpc "github.com/spiral/goridge/v3/pkg/rpc"
rpcPlugin "github.com/spiral/roadrunner/v2/plugins/rpc"
"github.com/spiral/roadrunner/v2/plugins/config"
"net/http"
"github.com/spf13/cobra"
"github.com/spiral/endure"
)
var (
// WorkDir is working directory
WorkDir string
// CfgFile is path to the .rr.yaml
CfgFile string
// Debug mode
Debug bool
// Container is the pointer to the Endure container
Container *endure.Endure
cfg *config.Viper
root = &cobra.Command{
Use: "rr",
SilenceErrors: true,
SilenceUsage: true,
Version: Version,
}
)
func Execute() {
if err := root.Execute(); err != nil {
// exit with error, fatal invoke os.Exit(1)
log.Fatal(err)
}
}
func init() {
root.PersistentFlags().StringVarP(&CfgFile, "config", "c", ".rr.yaml", "config file (default is .rr.yaml)")
root.PersistentFlags().StringVarP(&WorkDir, "WorkDir", "w", "", "work directory")
root.PersistentFlags().BoolVarP(&Debug, "debug", "d", false, "debug mode")
cobra.OnInitialize(func() {
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 {
panic(err)
}
}
}
if WorkDir != "" {
if err := os.Chdir(WorkDir); err != nil {
panic(err)
}
}
cfg = &config.Viper{}
cfg.Path = CfgFile
cfg.Prefix = "rr"
// register config
err := Container.Register(cfg)
if err != nil {
panic(err)
}
// if debug mode is on - run debug server
if Debug {
runDebugServer()
}
})
}
// RPCClient is using to make a requests to the ./rr reset, ./rr workers
func RPCClient() (*rpc.Client, error) {
rpcConfig := &rpcPlugin.Config{}
err := cfg.Init()
if err != nil {
return nil, err
}
if !cfg.Has(rpcPlugin.PluginName) {
return nil, errors.E("rpc service disabled")
}
err = cfg.UnmarshalKey(rpcPlugin.PluginName, rpcConfig)
if err != nil {
return nil, err
}
rpcConfig.InitDefaults()
conn, err := rpcConfig.Dialer()
if err != nil {
return nil, err
}
return rpc.NewClientWithCodec(goridgeRpc.NewClientCodec(conn)), nil
}
// debug server
func runDebugServer() {
mux := http.NewServeMux()
mux.HandleFunc("/debug/pprof/", pprof.Index)
mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
mux.HandleFunc("/debug/pprof/trace", pprof.Trace)
srv := http.Server{
Addr: ":6061",
Handler: mux,
}
if err := srv.ListenAndServe(); err != nil {
log.Fatal(err)
}
}
|