mirror of
https://github.com/openziti/ziti.git
synced 2026-10-12 15:28:05 +00:00
Update agent commands
This commit is contained in:
@@ -20,14 +20,14 @@ require (
|
||||
github.com/jedib0t/go-pretty/v6 v6.4.0
|
||||
github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19
|
||||
github.com/michaelquigley/pfxlog v0.6.9
|
||||
github.com/openziti/agent v1.0.7
|
||||
github.com/openziti/agent v1.0.8
|
||||
github.com/openziti/channel/v2 v2.0.25
|
||||
github.com/openziti/edge v0.24.101
|
||||
github.com/openziti/fabric v0.22.7
|
||||
github.com/openziti/edge v0.24.100
|
||||
github.com/openziti/fabric v0.22.9
|
||||
github.com/openziti/foundation/v2 v2.0.10
|
||||
github.com/openziti/identity v1.0.29
|
||||
github.com/openziti/runzmd v1.0.7
|
||||
github.com/openziti/sdk-golang v0.18.21
|
||||
github.com/openziti/runzmd v1.0.8
|
||||
github.com/openziti/sdk-golang v0.18.24
|
||||
github.com/openziti/storage v0.1.31
|
||||
github.com/openziti/transport/v2 v2.0.49
|
||||
github.com/openziti/xweb/v2 v2.0.2
|
||||
@@ -119,7 +119,7 @@ require (
|
||||
github.com/kyokomi/emoji/v2 v2.2.11 // indirect
|
||||
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
||||
github.com/lucsky/cuid v1.2.1 // indirect
|
||||
github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect
|
||||
github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de // indirect
|
||||
github.com/magiconair/properties v1.8.5 // indirect
|
||||
github.com/mailru/easyjson v0.7.7 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
@@ -172,8 +172,8 @@ require (
|
||||
go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect
|
||||
go.opentelemetry.io/otel v1.11.1 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.11.1 // indirect
|
||||
golang.org/x/crypto v0.4.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20221230185412-738e83a70c30 // indirect
|
||||
golang.org/x/crypto v0.5.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20230111222715-75897c7a292a // indirect
|
||||
golang.org/x/image v0.3.0 // indirect
|
||||
golang.org/x/mod v0.6.0 // indirect
|
||||
golang.org/x/sync v0.1.0 // indirect
|
||||
|
||||
@@ -561,8 +561,8 @@ github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i
|
||||
github.com/lucsky/cuid v1.2.1 h1:MtJrL2OFhvYufUIn48d35QGXyeTC8tn0upumW9WwTHg=
|
||||
github.com/lucsky/cuid v1.2.1/go.mod h1:QaaJqckboimOmhRSJXSx/+IT+VTfxfPGSo/6mfgUfmE=
|
||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
|
||||
github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY=
|
||||
github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE=
|
||||
github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de h1:V53FWzU6KAZVi1tPp5UIsMoUWJ2/PNwYIDXnu7QuBCE=
|
||||
github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE=
|
||||
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
|
||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
|
||||
@@ -693,16 +693,16 @@ github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+
|
||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
||||
github.com/openziti/agent v1.0.7 h1:tEZlYQ5/y7oeuYUAdqN6AAayQAloL8Ms6prSddaUDVY=
|
||||
github.com/openziti/agent v1.0.7/go.mod h1:6APWgkPP6Uxf1/VyirdTVLAJxwam2vVyakrVw6yvs40=
|
||||
github.com/openziti/agent v1.0.8 h1:qB4zQO9dz3PL8qbeyzCWbwTrtHZPEZlYtjkJJ78SJPo=
|
||||
github.com/openziti/agent v1.0.8/go.mod h1:6APWgkPP6Uxf1/VyirdTVLAJxwam2vVyakrVw6yvs40=
|
||||
github.com/openziti/channel/v2 v2.0.25 h1:ihw9DDTfMHDL33gZFLqDyADFGKBec4beaThV/VJLWhI=
|
||||
github.com/openziti/channel/v2 v2.0.25/go.mod h1:eHPS7dmvDV+Q/SmbB2gwvdvdz/NcnetFshHsdNzAnZs=
|
||||
github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k=
|
||||
github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo=
|
||||
github.com/openziti/edge v0.24.95 h1:Lj7ycWVOXbqt3TK6NSGPWXj5bp3/5rX7rA+bR5wA8Nc=
|
||||
github.com/openziti/edge v0.24.95/go.mod h1:nVamtrBekK372q8bbKK/D6t0W7LBqQ+Miu0YE1u3od4=
|
||||
github.com/openziti/fabric v0.22.7 h1:o0k/QnCpVZPiC77fh/NoUVCoeQNhfBm4oOICcJsdkWc=
|
||||
github.com/openziti/fabric v0.22.7/go.mod h1:NITYnGTCeu0ENixTd7qXFzGyIDm5GkyJhxKYTnmFzjk=
|
||||
github.com/openziti/edge v0.24.100 h1:sBoG0GtyFCyodukuG1IDCoXm2PjLyjt8jxKhVQjc0ww=
|
||||
github.com/openziti/edge v0.24.100/go.mod h1:Yn3eOldLoe6BZyJvOQbgY02LDOpo9oW48v1ZKhTwqZs=
|
||||
github.com/openziti/fabric v0.22.9 h1:8bI+yeWMBwBYwpteg8A2fxI4rYB65B6UBkIkLSsdh8s=
|
||||
github.com/openziti/fabric v0.22.9/go.mod h1:8i3qG7UJbqWHH3V6nZlhzaaGyqiecn4cCsj9qGf4Rec=
|
||||
github.com/openziti/foundation/v2 v2.0.10 h1:IeOkcPbgBpBTw4JrWz8s9Z76vO/m+i2uIE0cMZ0C2DM=
|
||||
github.com/openziti/foundation/v2 v2.0.10/go.mod h1:Z0gnQsGJb/H/B+pixLtmCIpw1dBllD4QoT6LeD35WzA=
|
||||
github.com/openziti/identity v1.0.29 h1:FkY/Hzpfh2/U2cUzYR2X3380/IKGIQYpJaKWqXpOIAg=
|
||||
@@ -711,10 +711,10 @@ github.com/openziti/jwks v1.0.2 h1:32BGXIAnefS+v7uXKPb1x8/cQ7srek6Ai06dsrMTY4E=
|
||||
github.com/openziti/jwks v1.0.2/go.mod h1:KwO0x9FBG0aoJS5f6nH5xeHoplyR1H143SMI9kF0mC8=
|
||||
github.com/openziti/metrics v1.2.3 h1:h9+mSU673QLSMOb3YibD1vNgE0yIDZ5leiUqDwN5szE=
|
||||
github.com/openziti/metrics v1.2.3/go.mod h1:jK8BfZ9nXMhO+LPcUPpN/sebrLfIeF4uaHlm5JIF7BY=
|
||||
github.com/openziti/runzmd v1.0.7 h1:2EC3bVjjAuFsECaZbwTOJdDbSk3I8JpfaI2ruGdEGiA=
|
||||
github.com/openziti/runzmd v1.0.7/go.mod h1:0AlunP33eJ/S21az+ACP9/INVeUSR80pELXYXs2hK0I=
|
||||
github.com/openziti/sdk-golang v0.18.21 h1:oWJXrvMbXvTGkQ0MF3oFKmAw6dBBKhNt2WxNjj/Z1zA=
|
||||
github.com/openziti/sdk-golang v0.18.21/go.mod h1:LT+IOT2GqsmYLwjjO3YOlcejgBROyMI1a01xo8Xh+A8=
|
||||
github.com/openziti/runzmd v1.0.8 h1:snjZebyVVeXL4UfSYhJxHTzo/jeSKFkvjMwWWZ7uRMg=
|
||||
github.com/openziti/runzmd v1.0.8/go.mod h1:og+vSXZFDZiAturQQJVyfo2j41XFTmv+oZptzKZnPqI=
|
||||
github.com/openziti/sdk-golang v0.18.24 h1:pKNupqa3ZnaLxNRL1tKn7JUT22xAeKcTIWFUSQaHtRk=
|
||||
github.com/openziti/sdk-golang v0.18.24/go.mod h1:MEHIen3YTNwPaDGMgDgcTf04RqG5fCti4CnNRJhk70g=
|
||||
github.com/openziti/storage v0.1.31 h1:YO1c1mzn+DfmBOtzhBlMe6q5cgjSOUv+sY8iUOwXals=
|
||||
github.com/openziti/storage v0.1.31/go.mod h1:DFRIpfCkI7lLuhGUl4CgZR6sGbsMJ/+nGnjkVIqCgrw=
|
||||
github.com/openziti/transport/v2 v2.0.49 h1:P3gUazaC8Z7iy4eXk510wjTKot6GucWMtqexU3mn83U=
|
||||
@@ -1008,8 +1008,8 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh
|
||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
|
||||
golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80=
|
||||
golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
|
||||
golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@@ -1020,8 +1020,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
|
||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/exp v0.0.0-20221230185412-738e83a70c30 h1:m9O6OTJ627iFnN2JIWfdqlZCzneRO6EEBsHXI25P8ws=
|
||||
golang.org/x/exp v0.0.0-20221230185412-738e83a70c30/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
||||
golang.org/x/exp v0.0.0-20230111222715-75897c7a292a h1:/YWeLOBWYV5WAQORVPkZF3Pq9IppkcT72GKnWjNf5W8=
|
||||
golang.org/x/exp v0.0.0-20230111222715-75897c7a292a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
|
||||
+127
-11
@@ -1,6 +1,7 @@
|
||||
package agentcli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/channel/v2"
|
||||
"github.com/openziti/edge/router/debugops"
|
||||
@@ -10,8 +11,12 @@ import (
|
||||
"github.com/openziti/identity"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
"io"
|
||||
"net"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -32,12 +37,13 @@ func NewAgentCmd(p common.OptionsProvider) *cobra.Command {
|
||||
}
|
||||
|
||||
agentCmd.AddCommand(NewPsCmd(p))
|
||||
agentCmd.AddCommand(NewGoVersionCmd(p))
|
||||
agentCmd.AddCommand(NewGcCmd(p))
|
||||
agentCmd.AddCommand(NewListCmd(p))
|
||||
agentCmd.AddCommand(NewSimpleAgentCmd("goversion", agent.Version, p, "Returns the golang version of the target application"))
|
||||
agentCmd.AddCommand(NewSimpleAgentCmd("gc", agent.GC, p, "Run garbage collection in the target application"))
|
||||
agentCmd.AddCommand(NewSetGcCmd(p))
|
||||
agentCmd.AddCommand(NewStackCmd(p))
|
||||
agentCmd.AddCommand(NewMemstatsCmd(p))
|
||||
agentCmd.AddCommand(NewStatsCmd(p))
|
||||
agentCmd.AddCommand(NewSimpleAgentCmd("memstats", agent.MemStats, p, "Returns memory use summary of the target application"))
|
||||
agentCmd.AddCommand(NewSimpleAgentCmd("stats", agent.Stats, p, "Emits some runtime information (# go-routines, threads, cpus, etc) from the target application"))
|
||||
agentCmd.AddCommand(NewPprofHeapCmd(p))
|
||||
agentCmd.AddCommand(NewPprofCpuCmd(p))
|
||||
agentCmd.AddCommand(NewTraceCmd(p))
|
||||
@@ -73,12 +79,12 @@ func NewAgentCmd(p common.OptionsProvider) *cobra.Command {
|
||||
agentCmd.AddCommand(routerCmd)
|
||||
|
||||
routerCmd.AddCommand(NewRouteCmd(p))
|
||||
routerCmd.AddCommand(NewSimpleAgentCustomCmd("dump-routes", AgentAppRouter, router.DumpForwarderTables, p))
|
||||
routerCmd.AddCommand(NewSimpleAgentCustomCmd("disconnect", AgentAppRouter, router.CloseControlChannel, p))
|
||||
routerCmd.AddCommand(NewSimpleAgentCustomCmd("reconnect", AgentAppRouter, router.OpenControlChannel, p))
|
||||
routerCmd.AddCommand(NewSimpleAgentCustomCmd("dump-api-sessions", AgentAppRouter, debugops.DumpApiSessions, p))
|
||||
routerCmd.AddCommand(NewSimpleAgentCustomCmd("dump-links", AgentAppRouter, router.DumpLinks, p))
|
||||
routerCmd.AddCommand(NewSimpleChAgentCustomCmd("dump-routes", AgentAppRouter, int32(mgmt_pb.ContentType_RouterDebugDumpForwarderTablesRequestType), p))
|
||||
routerCmd.AddCommand(NewSimpleChAgentCustomCmd("dump-links", AgentAppRouter, int32(mgmt_pb.ContentType_RouterDebugDumpLinksRequestType), p))
|
||||
routerCmd.AddCommand(NewForgetLinkAgentCmd(p))
|
||||
routerCmd.AddCommand(NewToggleCtrlChannelAgentCmd(p, "disconnect", false))
|
||||
routerCmd.AddCommand(NewToggleCtrlChannelAgentCmd(p, "reconnect", true))
|
||||
|
||||
return agentCmd
|
||||
}
|
||||
@@ -86,6 +92,112 @@ func NewAgentCmd(p common.OptionsProvider) *cobra.Command {
|
||||
// AgentOptions contains the command line options
|
||||
type AgentOptions struct {
|
||||
common.CommonOptions
|
||||
pid uint16
|
||||
processName string
|
||||
appId string
|
||||
appType string
|
||||
appAlias string
|
||||
tcpAddr string
|
||||
timeout time.Duration
|
||||
}
|
||||
|
||||
func (self *AgentOptions) AddAgentOptions(cmd *cobra.Command) {
|
||||
cmd.Flags().Uint16VarP(&self.pid, "pid", "p", 0, "Process ID of host application to talk to")
|
||||
cmd.Flags().StringVarP(&self.processName, "process-name", "n", "", "Process name of host application to talk to")
|
||||
cmd.Flags().StringVarP(&self.appId, "app-id", "i", "", "Id of host application to talk to (like controller or router id)")
|
||||
cmd.Flags().StringVarP(&self.appType, "app-type", "t", "", "Type of host application to talk to (like controller or router)")
|
||||
cmd.Flags().StringVarP(&self.appType, "app-alias", "a", "", "Alias of host application to talk to (specified in host application)")
|
||||
cmd.Flags().StringVar(&self.tcpAddr, "tcp-addr", "", "Type of host application to talk to (like controller or router)")
|
||||
}
|
||||
|
||||
func (self *AgentOptions) GetProcess() (*agent.Process, error) {
|
||||
procList, err := agent.GetGopsProcesses()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var result []*agent.Process
|
||||
for _, p := range procList {
|
||||
if !p.Contactable {
|
||||
continue
|
||||
}
|
||||
if self.Cmd.Flags().Changed("pid") && p.Pid != int(self.pid) {
|
||||
continue
|
||||
}
|
||||
if self.Cmd.Flags().Changed("process-name") && p.Executable != self.processName {
|
||||
continue
|
||||
}
|
||||
if self.Cmd.Flags().Changed("app-id") && p.AppId != self.appId {
|
||||
continue
|
||||
}
|
||||
if self.Cmd.Flags().Changed("app-type") && p.AppType != self.appType {
|
||||
continue
|
||||
}
|
||||
if self.Cmd.Flags().Changed("app-alias") && p.AppAlias != self.appAlias {
|
||||
continue
|
||||
}
|
||||
|
||||
result = append(result, p)
|
||||
}
|
||||
|
||||
if len(result) == 0 {
|
||||
return nil, errors.New("no processes found matching filter, use 'ziti agent ps' to list candidates")
|
||||
}
|
||||
|
||||
if len(result) > 1 {
|
||||
var pids []string
|
||||
for _, r := range result {
|
||||
pids = append(pids, fmt.Sprintf("%v", r.Pid))
|
||||
}
|
||||
return nil, errors.Errorf("too many processes found matching filter: [%v] use 'ziti agent list' for more information", strings.Join(pids, " "))
|
||||
}
|
||||
|
||||
return result[0], nil
|
||||
}
|
||||
|
||||
func (self *AgentOptions) MakeChannelRequest(appId byte, f func(ch channel.Channel) error) error {
|
||||
return self.MakeRequest(agent.CustomOpAsync, []byte{appId}, connToChannelMapper(f))
|
||||
}
|
||||
|
||||
func (self *AgentOptions) MakeRequest(signal byte, params []byte, f func(c net.Conn) error) error {
|
||||
if self.Cmd.Flags().Changed("tcp-addr") {
|
||||
conn, err := net.Dial("tcp", self.tcpAddr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeRequestToConn(conn, signal, params, f)
|
||||
}
|
||||
|
||||
p, err := self.GetProcess()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeProcessRequest(p, signal, params, f)
|
||||
}
|
||||
|
||||
func (self *AgentOptions) CopyToWriter(out io.Writer) func(conn net.Conn) error {
|
||||
return func(conn net.Conn) error {
|
||||
_, err := io.Copy(out, conn)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
func (self *AgentOptions) RunCopyOut(op byte, params []byte, out io.Writer) error {
|
||||
if self.Cmd.Flags().Changed("timeout") {
|
||||
time.AfterFunc(self.timeout, func() {
|
||||
fmt.Println("operation timed out")
|
||||
os.Exit(-1)
|
||||
})
|
||||
}
|
||||
|
||||
if len(self.Args) == 0 {
|
||||
return self.MakeRequest(op, params, self.CopyToWriter(out))
|
||||
}
|
||||
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeRequest(addr, op, params, os.Stdout)
|
||||
}
|
||||
|
||||
func NewAgentChannel(conn net.Conn) (channel.Channel, error) {
|
||||
@@ -95,12 +207,16 @@ func NewAgentChannel(conn net.Conn) (channel.Channel, error) {
|
||||
return channel.NewChannel("agent", dialer, nil, options)
|
||||
}
|
||||
|
||||
func MakeAgentChannelRequest(addr string, signal byte, params []byte, f func(ch channel.Channel) error) error {
|
||||
return agent.MakeRequestF(addr, signal, params, func(conn net.Conn) error {
|
||||
func MakeAgentChannelRequest(addr string, appId byte, f func(ch channel.Channel) error) error {
|
||||
return agent.MakeRequestF(addr, agent.CustomOpAsync, []byte{appId}, connToChannelMapper(f))
|
||||
}
|
||||
|
||||
func connToChannelMapper(f func(ch channel.Channel) error) func(conn net.Conn) error {
|
||||
return func(conn net.Conn) error {
|
||||
ch, err := NewAgentChannel(conn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return f(ch)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,22 +20,17 @@ import (
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/channel/v2"
|
||||
"github.com/openziti/identity"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
||||
type SimpleChAgentCmdOptions struct {
|
||||
type SimpleChAgentCmdAction struct {
|
||||
AgentOptions
|
||||
requestType int32
|
||||
timeout time.Duration
|
||||
}
|
||||
|
||||
func NewSimpleChAgentCustomCmd(name string, appId AgentAppId, op int32, p common.OptionsProvider) *cobra.Command {
|
||||
options := &SimpleChAgentCmdOptions{
|
||||
action := &SimpleChAgentCmdAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
@@ -45,47 +40,45 @@ func NewSimpleChAgentCustomCmd(name string, appId AgentAppId, op int32, p common
|
||||
cmd := &cobra.Command{
|
||||
Args: cobra.MaximumNArgs(1),
|
||||
Use: name + " <optional-target> ",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
options.Cmd = cmd
|
||||
options.Args = args
|
||||
err := options.Run(appId)
|
||||
cmdhelper.CheckErr(err)
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
return action.Run(appId)
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().DurationVarP(&options.timeout, "timeout", "t", 5*time.Second, "How long to wait for operation to complete")
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (o *SimpleChAgentCmdOptions) Run(appId AgentAppId) error {
|
||||
addr, err := agent.ParseGopsAddress(o.Args)
|
||||
func (self *SimpleChAgentCmdAction) Run(appId AgentAppId) error {
|
||||
if len(self.Args) == 0 {
|
||||
return self.MakeChannelRequest(byte(appId), self.makeRequest)
|
||||
}
|
||||
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return agent.MakeRequestF(addr, agent.CustomOpAsync, []byte{byte(appId)}, o.makeRequest)
|
||||
return MakeAgentChannelRequest(addr, byte(appId), self.makeRequest)
|
||||
}
|
||||
|
||||
func (o *SimpleChAgentCmdOptions) makeRequest(conn net.Conn) error {
|
||||
options := channel.DefaultOptions()
|
||||
options.ConnectTimeout = time.Second
|
||||
dialer := channel.NewExistingConnDialer(&identity.TokenId{Token: "agent"}, conn, nil)
|
||||
ch, err := channel.NewChannel("agent", dialer, nil, options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
msg := channel.NewMessage(o.requestType, nil)
|
||||
reply, err := msg.WithTimeout(o.timeout).SendForReply(ch)
|
||||
func (self *SimpleChAgentCmdAction) makeRequest(ch channel.Channel) error {
|
||||
msg := channel.NewMessage(self.requestType, nil)
|
||||
reply, err := msg.WithTimeout(self.timeout).SendForReply(ch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if reply.ContentType == channel.ContentTypeResultType {
|
||||
result := channel.UnmarshalResult(reply)
|
||||
if result.Success {
|
||||
fmt.Println("success")
|
||||
if len(result.Message) != 0 {
|
||||
fmt.Print(result.Message)
|
||||
} else {
|
||||
fmt.Println("success")
|
||||
}
|
||||
} else {
|
||||
fmt.Printf("error: %v\n", result.Message)
|
||||
}
|
||||
|
||||
@@ -19,11 +19,13 @@ package agentcli
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AgentClearChannelLogLevelAction struct {
|
||||
@@ -31,7 +33,7 @@ type AgentClearChannelLogLevelAction struct {
|
||||
}
|
||||
|
||||
func NewClearChannelLogLevelCmd(p common.OptionsProvider) *cobra.Command {
|
||||
options := &AgentClearChannelLogLevelAction{
|
||||
action := &AgentClearChannelLogLevelAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
@@ -42,31 +44,33 @@ func NewClearChannelLogLevelCmd(p common.OptionsProvider) *cobra.Command {
|
||||
Short: "Clears a channel-specific log level in the target application",
|
||||
Args: cobra.MinimumNArgs(1),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
options.Cmd = cmd
|
||||
options.Args = args
|
||||
err := options.Run()
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
err := action.Run()
|
||||
cmdhelper.CheckErr(err)
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *AgentClearChannelLogLevelAction) Run() error {
|
||||
var addr string
|
||||
var err error
|
||||
var channelArg string
|
||||
if len(self.Args) == 1 {
|
||||
addr, err = agent.ParseGopsAddress(nil)
|
||||
channelArg = self.Args[0]
|
||||
} else {
|
||||
addr, err = agent.ParseGopsAddress(self.Args)
|
||||
channelArg = self.Args[1]
|
||||
if self.Cmd.Flags().Changed("timeout") {
|
||||
time.AfterFunc(self.timeout, func() {
|
||||
fmt.Println("operation timed out")
|
||||
os.Exit(-1)
|
||||
})
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
var channelArg string
|
||||
|
||||
if len(self.Args) == 1 {
|
||||
channelArg = self.Args[0]
|
||||
} else {
|
||||
channelArg = self.Args[1]
|
||||
}
|
||||
|
||||
lenBuf := make([]byte, 8)
|
||||
@@ -75,5 +79,13 @@ func (self *AgentClearChannelLogLevelAction) Run() error {
|
||||
buf.Write(lenBuf[:lenLen])
|
||||
buf.Write([]byte(channelArg))
|
||||
|
||||
if len(self.Args) == 1 {
|
||||
return self.MakeRequest(agent.ClearChannelLogLevel, buf.Bytes(), self.CopyToWriter(os.Stdout))
|
||||
}
|
||||
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeRequest(addr, agent.ClearChannelLogLevel, buf.Bytes(), os.Stdout)
|
||||
}
|
||||
|
||||
@@ -18,16 +18,11 @@ package agentcli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/channel/v2"
|
||||
"github.com/openziti/channel/v2/protobufs"
|
||||
"github.com/openziti/edge/pb/edge_mgmt_pb"
|
||||
"github.com/openziti/identity"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AgentCtrlInitOptions struct {
|
||||
@@ -35,62 +30,35 @@ type AgentCtrlInitOptions struct {
|
||||
}
|
||||
|
||||
func NewAgentCtrlInit(p common.OptionsProvider) *cobra.Command {
|
||||
options := &AgentCtrlInitOptions{
|
||||
action := &AgentCtrlInitOptions{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
}
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Args: cobra.RangeArgs(3, 4),
|
||||
Use: "init <optional-target> <username> <password> <name>",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
options.Cmd = cmd
|
||||
options.Args = args
|
||||
err := options.Run()
|
||||
cmdhelper.CheckErr(err)
|
||||
Args: cobra.ExactArgs(3),
|
||||
Use: "init <username> <password> <name>",
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
return action.MakeChannelRequest(byte(AgentAppController), action.makeRequest)
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (o *AgentCtrlInitOptions) Run() error {
|
||||
var addr string
|
||||
var err error
|
||||
|
||||
if len(o.Args) == 4 {
|
||||
addr, err = agent.ParseGopsAddress(o.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return agent.MakeRequestF(addr, agent.CustomOpAsync, []byte{byte(AgentAppController)}, o.makeRequest)
|
||||
}
|
||||
|
||||
func (o *AgentCtrlInitOptions) makeRequest(conn net.Conn) error {
|
||||
options := channel.DefaultOptions()
|
||||
options.ConnectTimeout = time.Second
|
||||
dialer := channel.NewExistingConnDialer(&identity.TokenId{Token: "agent"}, conn, nil)
|
||||
ch, err := channel.NewChannel("agent", dialer, nil, options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
offset := 0
|
||||
if len(o.Args) == 4 {
|
||||
offset = 1
|
||||
}
|
||||
|
||||
func (self *AgentCtrlInitOptions) makeRequest(ch channel.Channel) error {
|
||||
initEdgeRequest := &edge_mgmt_pb.InitEdgeRequest{
|
||||
Username: o.Args[offset],
|
||||
Password: o.Args[offset+1],
|
||||
Name: o.Args[offset+2],
|
||||
Username: self.Args[0],
|
||||
Password: self.Args[1],
|
||||
Name: self.Args[2],
|
||||
}
|
||||
|
||||
reply, err := protobufs.MarshalTyped(initEdgeRequest).WithTimeout(5 * time.Second).SendForReply(ch)
|
||||
reply, err := protobufs.MarshalTyped(initEdgeRequest).WithTimeout(self.timeout).SendForReply(ch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -18,76 +18,44 @@ package agentcli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/channel/v2"
|
||||
"github.com/openziti/fabric/pb/mgmt_pb"
|
||||
"github.com/openziti/identity"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AgentCtrlInitFromDbOptions struct {
|
||||
type AgentCtrlInitFromDbAction struct {
|
||||
AgentOptions
|
||||
Voter bool
|
||||
MemberId string
|
||||
}
|
||||
|
||||
func NewAgentCtrlInitFromDb(p common.OptionsProvider) *cobra.Command {
|
||||
options := &AgentCtrlInitFromDbOptions{
|
||||
action := &AgentCtrlInitFromDbAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
}
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Args: cobra.RangeArgs(1, 2),
|
||||
Use: "init-from-db <optional-target> path/to/source.db",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
options.Cmd = cmd
|
||||
options.Args = args
|
||||
err := options.Run()
|
||||
cmdhelper.CheckErr(err)
|
||||
Args: cobra.ExactArgs(1),
|
||||
Use: "init-from-db path/to/source.db",
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
return action.MakeChannelRequest(byte(AgentAppController), action.makeRequest)
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (o *AgentCtrlInitFromDbOptions) Run() error {
|
||||
var addr string
|
||||
var err error
|
||||
func (self *AgentCtrlInitFromDbAction) makeRequest(ch channel.Channel) error {
|
||||
msg := channel.NewMessage(int32(mgmt_pb.ContentType_RaftInitFromDb), []byte(self.Args[0]))
|
||||
|
||||
if len(o.Args) == 2 {
|
||||
addr, err = agent.ParseGopsAddress(o.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return agent.MakeRequestF(addr, agent.CustomOpAsync, []byte{byte(AgentAppController)}, o.makeRequest)
|
||||
}
|
||||
|
||||
func (o *AgentCtrlInitFromDbOptions) makeRequest(conn net.Conn) error {
|
||||
options := channel.DefaultOptions()
|
||||
options.ConnectTimeout = time.Second
|
||||
dialer := channel.NewExistingConnDialer(&identity.TokenId{Token: "agent"}, conn, nil)
|
||||
ch, err := channel.NewChannel("agent", dialer, nil, options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
offset := 0
|
||||
if len(o.Args) == 2 {
|
||||
offset = 1
|
||||
}
|
||||
|
||||
msg := channel.NewMessage(int32(mgmt_pb.ContentType_RaftInitFromDb), []byte(o.Args[offset]))
|
||||
|
||||
reply, err := msg.WithTimeout(5 * time.Second).SendForReply(ch)
|
||||
reply, err := msg.WithTimeout(self.timeout).SendForReply(ch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -18,86 +18,55 @@ package agentcli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/channel/v2"
|
||||
"github.com/openziti/fabric/controller"
|
||||
"github.com/openziti/fabric/pb/mgmt_pb"
|
||||
"github.com/openziti/identity"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AgentCtrlRaftJoinOptions struct {
|
||||
type AgentCtrlRaftJoinAction struct {
|
||||
AgentOptions
|
||||
Voter bool
|
||||
MemberId string
|
||||
}
|
||||
|
||||
func NewAgentCtrlRaftJoin(p common.OptionsProvider) *cobra.Command {
|
||||
options := &AgentCtrlRaftJoinOptions{
|
||||
action := &AgentCtrlRaftJoinAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
}
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Args: cobra.RangeArgs(1, 2),
|
||||
Use: "raft-join <optional-target> <addr>",
|
||||
Args: cobra.ExactArgs(1),
|
||||
Use: "raft-join <addr>",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
options.Cmd = cmd
|
||||
options.Args = args
|
||||
err := options.Run()
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
err := action.MakeChannelRequest(byte(AgentAppController), action.makeRequest)
|
||||
cmdhelper.CheckErr(err)
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().BoolVar(&options.Voter, "voter", true, "Is this member a voting member")
|
||||
cmd.Flags().StringVar(&options.MemberId, "id", "", "The member id. If not provided, it will be looked up")
|
||||
action.AddAgentOptions(cmd)
|
||||
cmd.Flags().BoolVar(&action.Voter, "voter", true, "Is this member a voting member")
|
||||
cmd.Flags().StringVar(&action.MemberId, "id", "", "The member id. If not provided, it will be looked up")
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (o *AgentCtrlRaftJoinOptions) Run() error {
|
||||
var addr string
|
||||
var err error
|
||||
|
||||
if len(o.Args) == 2 {
|
||||
addr, err = agent.ParseGopsAddress(o.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return agent.MakeRequestF(addr, agent.CustomOpAsync, []byte{byte(AgentAppController)}, o.makeRequest)
|
||||
}
|
||||
|
||||
func (o *AgentCtrlRaftJoinOptions) makeRequest(conn net.Conn) error {
|
||||
options := channel.DefaultOptions()
|
||||
options.ConnectTimeout = time.Second
|
||||
dialer := channel.NewExistingConnDialer(&identity.TokenId{Token: "agent"}, conn, nil)
|
||||
ch, err := channel.NewChannel("agent", dialer, nil, options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
offset := 0
|
||||
if len(o.Args) == 2 {
|
||||
offset = 1
|
||||
}
|
||||
|
||||
func (self *AgentCtrlRaftJoinAction) makeRequest(ch channel.Channel) error {
|
||||
msg := channel.NewMessage(int32(mgmt_pb.ContentType_RaftJoinRequestType), nil)
|
||||
msg.PutStringHeader(controller.AgentAddrHeader, o.Args[offset])
|
||||
msg.PutBoolHeader(controller.AgentIsVoterHeader, o.Voter)
|
||||
msg.PutStringHeader(controller.AgentAddrHeader, self.Args[0])
|
||||
msg.PutBoolHeader(controller.AgentIsVoterHeader, self.Voter)
|
||||
|
||||
if o.MemberId != "" {
|
||||
msg.PutStringHeader(controller.AgentIdHeader, o.MemberId)
|
||||
if self.MemberId != "" {
|
||||
msg.PutStringHeader(controller.AgentIdHeader, self.MemberId)
|
||||
}
|
||||
|
||||
reply, err := msg.WithTimeout(5 * time.Second).SendForReply(ch)
|
||||
reply, err := msg.WithTimeout(self.timeout).SendForReply(ch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -19,23 +19,18 @@ package agentcli
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/golang/protobuf/proto"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/channel/v2"
|
||||
"github.com/openziti/fabric/pb/mgmt_pb"
|
||||
"github.com/openziti/identity"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AgentCtrlRaftListOptions struct {
|
||||
type AgentCtrlRaftListAction struct {
|
||||
AgentOptions
|
||||
}
|
||||
|
||||
func NewAgentCtrlRaftList(p common.OptionsProvider) *cobra.Command {
|
||||
options := &AgentCtrlRaftListOptions{
|
||||
action := &AgentCtrlRaftListAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
@@ -43,44 +38,22 @@ func NewAgentCtrlRaftList(p common.OptionsProvider) *cobra.Command {
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Args: cobra.RangeArgs(0, 1),
|
||||
Use: "raft-list <optional-target>",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
options.Cmd = cmd
|
||||
options.Args = args
|
||||
err := options.Run()
|
||||
cmdhelper.CheckErr(err)
|
||||
Use: "raft-list",
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
return action.MakeChannelRequest(byte(AgentAppController), action.makeRequest)
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (o *AgentCtrlRaftListOptions) Run() error {
|
||||
var addr string
|
||||
var err error
|
||||
|
||||
if len(o.Args) == 1 {
|
||||
addr, err = agent.ParseGopsAddress(o.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return agent.MakeRequestF(addr, agent.CustomOpAsync, []byte{byte(AgentAppController)}, o.makeRequest)
|
||||
}
|
||||
|
||||
func (o *AgentCtrlRaftListOptions) makeRequest(conn net.Conn) error {
|
||||
options := channel.DefaultOptions()
|
||||
options.ConnectTimeout = time.Second
|
||||
dialer := channel.NewExistingConnDialer(&identity.TokenId{Token: "agent"}, conn, nil)
|
||||
ch, err := channel.NewChannel("agent", dialer, nil, options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
func (self *AgentCtrlRaftListAction) makeRequest(ch channel.Channel) error {
|
||||
msg := channel.NewMessage(int32(mgmt_pb.ContentType_RaftListMembersRequestType), nil)
|
||||
reply, err := msg.WithTimeout(5 * time.Second).SendForReply(ch)
|
||||
reply, err := msg.WithTimeout(self.timeout).SendForReply(ch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
Copyright NetFoundry Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package agentcli
|
||||
|
||||
import (
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"os"
|
||||
)
|
||||
|
||||
type AgentGcAction struct {
|
||||
AgentOptions
|
||||
}
|
||||
|
||||
func NewGcCmd(p common.OptionsProvider) *cobra.Command {
|
||||
action := &AgentGcAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
}
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "gc <optional-target>",
|
||||
Short: "Run garbage collection in the target application",
|
||||
Args: cobra.MaximumNArgs(1),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
err := action.Run()
|
||||
cmdhelper.CheckErr(err)
|
||||
},
|
||||
}
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *AgentGcAction) Run() error {
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeRequest(addr, agent.GC, nil, os.Stdout)
|
||||
}
|
||||
@@ -17,6 +17,8 @@
|
||||
package agentcli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/jedib0t/go-pretty/v6/table"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
@@ -24,22 +26,22 @@ import (
|
||||
"os"
|
||||
)
|
||||
|
||||
type AgentGoVersionAction struct {
|
||||
type AgentListAction struct {
|
||||
AgentOptions
|
||||
CtrlListener string
|
||||
}
|
||||
|
||||
func NewGoVersionCmd(p common.OptionsProvider) *cobra.Command {
|
||||
action := &AgentGoVersionAction{
|
||||
// NewListCmd Pss a command object for the "list" command
|
||||
func NewListCmd(p common.OptionsProvider) *cobra.Command {
|
||||
action := &AgentListAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
}
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "goversion <optional-target>",
|
||||
Short: "Returns the golang version of the target application",
|
||||
Args: cobra.MaximumNArgs(1),
|
||||
Use: "list",
|
||||
Short: "List ziti processes",
|
||||
Long: "Show information about currently running Ziti processes",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
@@ -51,11 +53,22 @@ func NewGoVersionCmd(p common.OptionsProvider) *cobra.Command {
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *AgentGoVersionAction) Run() error {
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
func (self *AgentListAction) Run() error {
|
||||
processes, err := agent.GetGopsProcesses()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeRequest(addr, agent.Version, nil, os.Stdout)
|
||||
|
||||
t := table.NewWriter()
|
||||
t.SetStyle(table.StyleRounded)
|
||||
t.AppendHeader(table.Row{"PID", "Executable", "App ID", "Unix Socket", "App Type", "App Version", "App Alias"})
|
||||
|
||||
for _, p := range processes {
|
||||
t.AppendRow(table.Row{p.Pid, p.Executable, p.AppId, p.UnixSocket, p.AppType, p.AppVersion, p.AppAlias})
|
||||
}
|
||||
|
||||
if _, err = fmt.Fprintln(os.Stdout, t.Render()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
Copyright NetFoundry Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package agentcli
|
||||
|
||||
import (
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"os"
|
||||
)
|
||||
|
||||
type AgentMemstatsAction struct {
|
||||
AgentOptions
|
||||
CtrlListener string
|
||||
}
|
||||
|
||||
func NewMemstatsCmd(p common.OptionsProvider) *cobra.Command {
|
||||
action := &AgentMemstatsAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
}
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "memstats <optional-target>",
|
||||
Short: "Returns memory use summary of the target application",
|
||||
Args: cobra.MaximumNArgs(1),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
err := action.Run()
|
||||
cmdhelper.CheckErr(err)
|
||||
},
|
||||
}
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (o *AgentMemstatsAction) Run() error {
|
||||
addr, err := agent.ParseGopsAddress(o.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeRequest(addr, agent.MemStats, nil, os.Stdout)
|
||||
}
|
||||
@@ -17,16 +17,19 @@
|
||||
package agentcli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"io"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AgentPprofCpuAction struct {
|
||||
AgentOptions
|
||||
outputFile string
|
||||
}
|
||||
|
||||
func NewPprofCpuCmd(p common.OptionsProvider) *cobra.Command {
|
||||
@@ -48,11 +51,34 @@ func NewPprofCpuCmd(p common.OptionsProvider) *cobra.Command {
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
cmd.Flags().StringVarP(&action.outputFile, "output-file", "o", "", "Output file for pprof")
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *AgentPprofCpuAction) Run() error {
|
||||
if self.Cmd.Flags().Changed("timeout") {
|
||||
time.AfterFunc(self.timeout, func() {
|
||||
fmt.Println("operation timed out")
|
||||
os.Exit(-1)
|
||||
})
|
||||
}
|
||||
|
||||
if len(self.Args) == 0 {
|
||||
var out io.WriteCloser = os.Stdout
|
||||
var err error
|
||||
if self.outputFile != "" {
|
||||
out, err = os.Create(self.outputFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
}
|
||||
return self.RunCopyOut(agent.CPUProfile, nil, out)
|
||||
}
|
||||
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -17,16 +17,19 @@
|
||||
package agentcli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"io"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AgentPprofHeapAction struct {
|
||||
AgentOptions
|
||||
outputFile string
|
||||
}
|
||||
|
||||
func NewPprofHeapCmd(p common.OptionsProvider) *cobra.Command {
|
||||
@@ -47,11 +50,34 @@ func NewPprofHeapCmd(p common.OptionsProvider) *cobra.Command {
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
cmd.Flags().StringVarP(&action.outputFile, "output-file", "o", "", "Output file for pprof")
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *AgentPprofHeapAction) Run() error {
|
||||
if self.Cmd.Flags().Changed("timeout") {
|
||||
time.AfterFunc(self.timeout, func() {
|
||||
fmt.Println("operation timed out")
|
||||
os.Exit(-1)
|
||||
})
|
||||
}
|
||||
|
||||
if len(self.Args) == 0 {
|
||||
var out io.WriteCloser = os.Stdout
|
||||
var err error
|
||||
if self.outputFile != "" {
|
||||
out, err = os.Create(self.outputFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
}
|
||||
return self.RunCopyOut(agent.HeapProfile, nil, out)
|
||||
}
|
||||
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -17,24 +17,22 @@
|
||||
package agentcli
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"github.com/openziti/agent"
|
||||
"fmt"
|
||||
"github.com/openziti/channel/v2"
|
||||
"github.com/openziti/fabric/pb/ctrl_pb"
|
||||
"github.com/openziti/fabric/pb/mgmt_pb"
|
||||
"github.com/openziti/fabric/router"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"google.golang.org/protobuf/proto"
|
||||
"os"
|
||||
)
|
||||
|
||||
type AgentRouteAction struct {
|
||||
AgentOptions
|
||||
CtrlListener string
|
||||
}
|
||||
|
||||
func NewRouteCmd(p common.OptionsProvider) *cobra.Command {
|
||||
options := &AgentRouteAction{
|
||||
action := &AgentRouteAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
@@ -42,38 +40,26 @@ func NewRouteCmd(p common.OptionsProvider) *cobra.Command {
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Args: cobra.RangeArgs(3, 4),
|
||||
Use: "route <optional-target> <session id> <source-address> <destination-address>",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
options.Cmd = cmd
|
||||
options.Args = args
|
||||
err := options.Run()
|
||||
cmdhelper.CheckErr(err)
|
||||
Use: "route <controller id> <circuit id> <source-address> <destination-address>",
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
return action.MakeChannelRequest(router.AgentAppId, action.makeRequest)
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *AgentRouteAction) Run() error {
|
||||
var addr string
|
||||
var err error
|
||||
|
||||
offset := 0
|
||||
if len(self.Args) == 4 {
|
||||
addr, err = agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
offset = 1
|
||||
}
|
||||
|
||||
func (self *AgentRouteAction) makeRequest(ch channel.Channel) error {
|
||||
route := &ctrl_pb.Route{
|
||||
CircuitId: self.Args[offset],
|
||||
CircuitId: self.Args[1],
|
||||
Forwards: []*ctrl_pb.Route_Forward{
|
||||
{
|
||||
SrcAddress: self.Args[offset+1],
|
||||
DstAddress: self.Args[offset+2],
|
||||
SrcAddress: self.Args[2],
|
||||
DstAddress: self.Args[3],
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -83,15 +69,26 @@ func (self *AgentRouteAction) Run() error {
|
||||
return err
|
||||
}
|
||||
|
||||
fullBuf := make([]byte, len(buf)+6)
|
||||
fullBuf[0] = byte(AgentAppRouter)
|
||||
fullBuf[1] = router.UpdateRoute
|
||||
msg := channel.NewMessage(int32(mgmt_pb.ContentType_RouterDebugUpdateRouteRequestType), buf)
|
||||
msg.PutStringHeader(int32(mgmt_pb.Header_ControllerId), self.Args[0])
|
||||
reply, err := msg.WithTimeout(self.timeout).SendForReply(ch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
sizeBuf := make([]byte, 4)
|
||||
binary.LittleEndian.PutUint32(sizeBuf, uint32(len(buf)))
|
||||
|
||||
copy(fullBuf[2:], sizeBuf)
|
||||
copy(fullBuf[6:], buf)
|
||||
|
||||
return agent.MakeRequest(addr, agent.CustomOp, fullBuf, os.Stdout)
|
||||
if reply.ContentType == channel.ContentTypeResultType {
|
||||
result := channel.UnmarshalResult(reply)
|
||||
if result.Success {
|
||||
if len(result.Message) > 0 {
|
||||
fmt.Printf("success: %v\n", result.Message)
|
||||
} else {
|
||||
fmt.Println("success")
|
||||
}
|
||||
} else {
|
||||
fmt.Printf("error: %v\n", result.Message)
|
||||
}
|
||||
} else {
|
||||
fmt.Printf("unexpected response type %v\n", reply.ContentType)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -18,16 +18,12 @@ package agentcli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/channel/v2"
|
||||
"github.com/openziti/fabric/pb/mgmt_pb"
|
||||
"github.com/openziti/fabric/router"
|
||||
"github.com/openziti/identity"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
||||
type ForgetLinkAgentAction struct {
|
||||
@@ -35,56 +31,38 @@ type ForgetLinkAgentAction struct {
|
||||
}
|
||||
|
||||
func NewForgetLinkAgentCmd(p common.OptionsProvider) *cobra.Command {
|
||||
options := &ForgetLinkAgentAction{
|
||||
action := &ForgetLinkAgentAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
}
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Args: cobra.RangeArgs(1, 2),
|
||||
Use: "forget-link <optional-target> <link-id>",
|
||||
Args: cobra.ExactArgs(1),
|
||||
Use: "forget-link <link-id>",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
options.Cmd = cmd
|
||||
options.Args = args
|
||||
err := options.Run()
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
err := action.Run()
|
||||
cmdhelper.CheckErr(err)
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *ForgetLinkAgentAction) Run() error {
|
||||
var addr string
|
||||
var err error
|
||||
if len(self.Args) == 2 {
|
||||
addr, err = agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return agent.MakeRequestF(addr, agent.CustomOpAsync, []byte{router.AgentAppId}, self.makeRequest)
|
||||
return self.MakeChannelRequest(router.AgentAppId, self.makeRequest)
|
||||
}
|
||||
|
||||
func (self *ForgetLinkAgentAction) makeRequest(conn net.Conn) error {
|
||||
options := channel.DefaultOptions()
|
||||
options.ConnectTimeout = time.Second
|
||||
dialer := channel.NewExistingConnDialer(&identity.TokenId{Token: "agent"}, conn, nil)
|
||||
ch, err := channel.NewChannel("agent", dialer, nil, options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
func (self *ForgetLinkAgentAction) makeRequest(ch channel.Channel) error {
|
||||
linkId := self.Args[0]
|
||||
if len(self.Args) == 2 {
|
||||
linkId = self.Args[1]
|
||||
}
|
||||
|
||||
msg := channel.NewMessage(int32(mgmt_pb.ContentType_RouterDebugForgetLinkRequestType), []byte(linkId))
|
||||
reply, err := msg.WithTimeout(5 * time.Second).SendForReply(ch)
|
||||
reply, err := msg.WithTimeout(self.timeout).SendForReply(ch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
Copyright NetFoundry Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package agentcli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/channel/v2"
|
||||
"github.com/openziti/fabric/pb/mgmt_pb"
|
||||
"github.com/openziti/fabric/router"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
type ToggleCtrlChannelAgentAction struct {
|
||||
AgentOptions
|
||||
enable bool
|
||||
}
|
||||
|
||||
func NewToggleCtrlChannelAgentCmd(p common.OptionsProvider, name string, enable bool) *cobra.Command {
|
||||
options := &ToggleCtrlChannelAgentAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
enable: enable,
|
||||
}
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Args: cobra.RangeArgs(0, 1),
|
||||
Use: name + " <ctrl-id>",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
options.Cmd = cmd
|
||||
options.Args = args
|
||||
err := options.Run()
|
||||
cmdhelper.CheckErr(err)
|
||||
},
|
||||
}
|
||||
|
||||
options.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *ToggleCtrlChannelAgentAction) Run() error {
|
||||
return self.MakeChannelRequest(router.AgentAppId, self.makeRequest)
|
||||
}
|
||||
|
||||
func (self *ToggleCtrlChannelAgentAction) makeRequest(ch channel.Channel) error {
|
||||
var ctrlId string
|
||||
if len(self.Args) > 0 {
|
||||
ctrlId = self.Args[0]
|
||||
}
|
||||
|
||||
msg := channel.NewMessage(int32(mgmt_pb.ContentType_RouterDebugToggleCtrlChannelRequestType), []byte(ctrlId))
|
||||
msg.PutBoolHeader(int32(mgmt_pb.Header_CtrlChanToggle), self.enable)
|
||||
reply, err := msg.WithTimeout(self.timeout).SendForReply(ch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if reply.ContentType == channel.ContentTypeResultType {
|
||||
result := channel.UnmarshalResult(reply)
|
||||
if result.Success {
|
||||
if len(result.Message) > 0 {
|
||||
fmt.Printf("success: %v\n", result.Message)
|
||||
} else {
|
||||
fmt.Println("success")
|
||||
}
|
||||
} else {
|
||||
fmt.Printf("error: %v\n", result.Message)
|
||||
}
|
||||
} else {
|
||||
fmt.Printf("unexpected response type %v\n", reply.ContentType)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -19,6 +19,7 @@ package agentcli
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
@@ -27,6 +28,7 @@ import (
|
||||
"github.com/spf13/cobra"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AgentSetChannelLogLevelAction struct {
|
||||
@@ -52,29 +54,30 @@ func NewSetChannelLogLevelCmd(p common.OptionsProvider) *cobra.Command {
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *AgentSetChannelLogLevelAction) Run() error {
|
||||
var addr string
|
||||
var err error
|
||||
if self.Cmd.Flags().Changed("timeout") {
|
||||
time.AfterFunc(self.timeout, func() {
|
||||
fmt.Println("operation timed out")
|
||||
os.Exit(-1)
|
||||
})
|
||||
}
|
||||
|
||||
var channelArg string
|
||||
var levelArg string
|
||||
if len(self.Args) == 2 {
|
||||
addr, err = agent.ParseGopsAddress(nil)
|
||||
channelArg = self.Args[0]
|
||||
levelArg = self.Args[1]
|
||||
} else {
|
||||
addr, err = agent.ParseGopsAddress(self.Args)
|
||||
channelArg = self.Args[1]
|
||||
levelArg = self.Args[2]
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var level logrus.Level
|
||||
var found bool
|
||||
for _, l := range logrus.AllLevels {
|
||||
@@ -95,5 +98,13 @@ func (self *AgentSetChannelLogLevelAction) Run() error {
|
||||
buf.Write([]byte(channelArg))
|
||||
buf.WriteByte(byte(level))
|
||||
|
||||
if len(self.Args) == 2 {
|
||||
return self.MakeRequest(agent.SetChannelLogLevel, buf.Bytes(), self.CopyToWriter(os.Stdout))
|
||||
}
|
||||
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeRequest(addr, agent.SetChannelLogLevel, buf.Bytes(), os.Stdout)
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package agentcli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
@@ -25,6 +26,7 @@ import (
|
||||
"github.com/spf13/cobra"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AgentSetLogLevelAction struct {
|
||||
@@ -50,24 +52,25 @@ func NewSetLogLevelCmd(p common.OptionsProvider) *cobra.Command {
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *AgentSetLogLevelAction) Run() error {
|
||||
var addr string
|
||||
var err error
|
||||
var levelArg string
|
||||
if len(self.Args) == 1 {
|
||||
addr, err = agent.ParseGopsAddress(nil)
|
||||
levelArg = self.Args[0]
|
||||
} else {
|
||||
addr, err = agent.ParseGopsAddress(self.Args)
|
||||
levelArg = self.Args[1]
|
||||
if self.Cmd.Flags().Changed("timeout") {
|
||||
time.AfterFunc(self.timeout, func() {
|
||||
fmt.Println("operation timed out")
|
||||
os.Exit(-1)
|
||||
})
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
var levelArg string
|
||||
if len(self.Args) == 1 {
|
||||
levelArg = self.Args[0]
|
||||
} else {
|
||||
levelArg = self.Args[1]
|
||||
}
|
||||
|
||||
var level logrus.Level
|
||||
@@ -84,5 +87,14 @@ func (self *AgentSetLogLevelAction) Run() error {
|
||||
}
|
||||
|
||||
buf := []byte{byte(level)}
|
||||
|
||||
if len(self.Args) == 1 {
|
||||
return self.MakeRequest(agent.SetLogLevel, buf, self.CopyToWriter(os.Stdout))
|
||||
}
|
||||
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeRequest(addr, agent.SetLogLevel, buf, os.Stdout)
|
||||
}
|
||||
|
||||
@@ -18,12 +18,14 @@ package agentcli
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AgentSetGcAction struct {
|
||||
@@ -49,24 +51,25 @@ func NewSetGcCmd(p common.OptionsProvider) *cobra.Command {
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (o *AgentSetGcAction) Run() error {
|
||||
var addr string
|
||||
var err error
|
||||
var pctArg string
|
||||
if len(o.Args) == 1 {
|
||||
addr, err = agent.ParseGopsAddress(nil)
|
||||
pctArg = o.Args[0]
|
||||
} else {
|
||||
addr, err = agent.ParseGopsAddress(o.Args)
|
||||
pctArg = o.Args[1]
|
||||
func (self *AgentSetGcAction) Run() error {
|
||||
if self.Cmd.Flags().Changed("timeout") {
|
||||
time.AfterFunc(self.timeout, func() {
|
||||
fmt.Println("operation timed out")
|
||||
os.Exit(-1)
|
||||
})
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
var pctArg string
|
||||
if len(self.Args) == 1 {
|
||||
pctArg = self.Args[0]
|
||||
} else {
|
||||
pctArg = self.Args[1]
|
||||
}
|
||||
|
||||
perc, err := strconv.ParseInt(pctArg, 10, strconv.IntSize)
|
||||
@@ -76,5 +79,14 @@ func (o *AgentSetGcAction) Run() error {
|
||||
buf := make([]byte, binary.MaxVarintLen64)
|
||||
binary.PutVarint(buf, perc)
|
||||
|
||||
if len(self.Args) == 1 {
|
||||
return self.MakeRequest(agent.SetGCPercent, buf, self.CopyToWriter(os.Stdout))
|
||||
}
|
||||
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return agent.MakeRequest(addr, agent.SetGCPercent, buf, os.Stdout)
|
||||
}
|
||||
|
||||
@@ -28,6 +28,29 @@ type SimpleAgentAction struct {
|
||||
AgentOptions
|
||||
}
|
||||
|
||||
func NewSimpleAgentCmd(name string, op byte, p common.OptionsProvider, desc string) *cobra.Command {
|
||||
action := &SimpleAgentAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
}
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Args: cobra.MaximumNArgs(1),
|
||||
Use: name + " <optional-target> ",
|
||||
Short: desc,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
return action.RunCopyOut(op, nil, os.Stdout)
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
func NewSimpleAgentCustomCmd(name string, appId AgentAppId, op byte, p common.OptionsProvider) *cobra.Command {
|
||||
action := &SimpleAgentAction{
|
||||
AgentOptions: AgentOptions{
|
||||
@@ -46,17 +69,13 @@ func NewSimpleAgentCustomCmd(name string, appId AgentAppId, op byte, p common.Op
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *SimpleAgentAction) Run(appId AgentAppId, op byte) error {
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
buf := []byte{byte(appId), op}
|
||||
|
||||
return agent.MakeRequest(addr, agent.CustomOp, buf, os.Stdout)
|
||||
return self.RunCopyOut(agent.CustomOpAsync, buf, os.Stdout)
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package agentcli
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
@@ -49,7 +50,8 @@ func NewStackCmd(p common.OptionsProvider) *cobra.Command {
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().DurationVar(&action.StackTimeout, "stack-timeout", 5*time.Second, "Timeout for stack operation")
|
||||
action.AddAgentOptions(cmd)
|
||||
cmd.Flags().DurationVar(&action.StackTimeout, "stack-timeout", 5*time.Second, "Timeout for stack operation (deprecated, use --timeout instead)")
|
||||
|
||||
return cmd
|
||||
}
|
||||
@@ -57,11 +59,8 @@ func NewStackCmd(p common.OptionsProvider) *cobra.Command {
|
||||
// Run implements the command
|
||||
func (o *AgentStackAction) Run() error {
|
||||
time.AfterFunc(o.StackTimeout, func() {
|
||||
fmt.Println("operation timed out")
|
||||
os.Exit(-1)
|
||||
})
|
||||
addr, err := agent.ParseGopsAddress(o.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeRequest(addr, agent.StackTrace, nil, os.Stdout)
|
||||
return o.RunCopyOut(agent.Stats, nil, os.Stdout)
|
||||
}
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
Copyright NetFoundry Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package agentcli
|
||||
|
||||
import (
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"os"
|
||||
)
|
||||
|
||||
type AgentStatsAction struct {
|
||||
AgentOptions
|
||||
}
|
||||
|
||||
func NewStatsCmd(p common.OptionsProvider) *cobra.Command {
|
||||
action := &AgentStatsAction{
|
||||
AgentOptions: AgentOptions{
|
||||
CommonOptions: p(),
|
||||
},
|
||||
}
|
||||
|
||||
cmd := &cobra.Command{
|
||||
Use: "stats <optional-target>",
|
||||
Short: "Emits some runtime information (# go-routines, threads, cpus, etc) from the target application",
|
||||
Args: cobra.MaximumNArgs(1),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
err := action.Run()
|
||||
cmdhelper.CheckErr(err)
|
||||
},
|
||||
}
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *AgentStatsAction) Run() error {
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeRequest(addr, agent.Stats, nil, os.Stdout)
|
||||
}
|
||||
@@ -19,7 +19,6 @@ package agentcli
|
||||
import (
|
||||
"github.com/openziti/agent"
|
||||
"github.com/openziti/ziti/ziti/cmd/common"
|
||||
cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers"
|
||||
"github.com/spf13/cobra"
|
||||
"os"
|
||||
)
|
||||
@@ -38,22 +37,14 @@ func NewTraceCmd(p common.OptionsProvider) *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "trace",
|
||||
Short: "Turn tracing on for 5 seconds in the target application",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
action.Cmd = cmd
|
||||
action.Args = args
|
||||
err := action.Run()
|
||||
cmdhelper.CheckErr(err)
|
||||
return action.RunCopyOut(agent.Trace, nil, os.Stdout)
|
||||
},
|
||||
}
|
||||
|
||||
action.AddAgentOptions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
// Run implements the command
|
||||
func (self *AgentTraceAction) Run() error {
|
||||
addr, err := agent.ParseGopsAddress(self.Args)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return agent.MakeRequest(addr, agent.Trace, nil, os.Stdout)
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ func (self *AgentEchoServerUpdateTerminatorAction) Run() error {
|
||||
}
|
||||
}
|
||||
|
||||
return agentcli.MakeAgentChannelRequest(addr, agent.CustomOpAsync, []byte{byte(EchoServerAppId)}, self.makeRequest)
|
||||
return agentcli.MakeAgentChannelRequest(addr, EchoServerAppId, self.makeRequest)
|
||||
}
|
||||
|
||||
func (self *AgentEchoServerUpdateTerminatorAction) makeRequest(ch channel.Channel) error {
|
||||
|
||||
@@ -54,6 +54,7 @@ func NewControllerCmd() *cobra.Command {
|
||||
cmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "Enable verbose logging")
|
||||
cmd.PersistentFlags().BoolVarP(&cliAgentEnabled, "cliagent", "a", true, "Enable/disabled CLI Agent (enabled by default)")
|
||||
cmd.PersistentFlags().StringVar(&cliAgentAddr, "cli-agent-addr", "", "Specify where CLI Agent should list (ex: unix:/tmp/myfile.sock or tcp:127.0.0.1:10001)")
|
||||
cmd.PersistentFlags().StringVar(&cliAgentAlias, "cli-agent-alias", "", "Alias which can be used by ziti agent commands to find this instance")
|
||||
cmd.PersistentFlags().StringVar(&logFormatter, "log-formatter", "", "Specify log formatter [json|pfxlog|text]")
|
||||
|
||||
cmd.AddCommand(NewRunCmd())
|
||||
@@ -68,6 +69,7 @@ func NewControllerCmd() *cobra.Command {
|
||||
var verbose bool
|
||||
var cliAgentEnabled bool
|
||||
var cliAgentAddr string
|
||||
var cliAgentAlias string
|
||||
var logFormatter string
|
||||
|
||||
func Execute() {
|
||||
|
||||
@@ -74,9 +74,14 @@ func run(cmd *cobra.Command, args []string) {
|
||||
edgeController.Initialize()
|
||||
|
||||
if cliAgentEnabled {
|
||||
options := agent.Options{Addr: cliAgentAddr}
|
||||
options := agent.Options{
|
||||
Addr: cliAgentAddr,
|
||||
AppId: config.Id.Token,
|
||||
AppType: "controller",
|
||||
AppVersion: version.GetVersion(),
|
||||
AppAlias: cliAgentAlias,
|
||||
}
|
||||
options.CustomOps = map[byte]func(conn net.Conn) error{
|
||||
agent.CustomOp: fabricController.HandleCustomAgentOp,
|
||||
agent.CustomOpAsync: fabricController.HandleCustomAgentAsyncOp,
|
||||
}
|
||||
if err := agent.Listen(options); err != nil {
|
||||
|
||||
@@ -53,6 +53,7 @@ func NewRouterCmd() *cobra.Command {
|
||||
routerCmd.PersistentFlags().StringVar(&logFormatter, "log-formatter", "", "Specify log formatter [json|pfxlog|text]")
|
||||
routerCmd.PersistentFlags().BoolVar(&cliAgentEnabled, "cli-agent", true, "Enable/disable CLI Agent (enabled by default)")
|
||||
routerCmd.PersistentFlags().StringVar(&cliAgentAddr, "cli-agent-addr", "", "Specify where CLI Agent should list (ex: unix:/tmp/myfile.sock or tcp:127.0.0.1:10001)")
|
||||
routerCmd.PersistentFlags().StringVar(&cliAgentAlias, "cli-agent-alias", "", "Alias which can be used by ziti agent commands to find this instance")
|
||||
routerCmd.PersistentFlags().BoolVar(&enableDebugOps, "debug-ops", false, "Enable/disable debug agent operations (disabled by default)")
|
||||
|
||||
routerCmd.AddCommand(NewRunCmd())
|
||||
@@ -67,6 +68,7 @@ var logFormatter string
|
||||
var cliAgentEnabled bool
|
||||
var enableDebugOps bool
|
||||
var cliAgentAddr string
|
||||
var cliAgentAlias string
|
||||
|
||||
func Execute() {
|
||||
if err := NewRouterCmd().Execute(); err != nil {
|
||||
|
||||
+7
-2
@@ -49,7 +49,6 @@ func NewRunCmd() *cobra.Command {
|
||||
|
||||
//flags are added to an internal map and read later on, see getFlags()
|
||||
runCmd.Flags().BoolP("extend", "e", false, "force the router on startup to extend enrollment certificates")
|
||||
|
||||
return runCmd
|
||||
}
|
||||
|
||||
@@ -94,7 +93,13 @@ func run(cmd *cobra.Command, args []string) {
|
||||
}
|
||||
|
||||
if cliAgentEnabled {
|
||||
options := agent.Options{Addr: cliAgentAddr}
|
||||
options := agent.Options{
|
||||
Addr: cliAgentAddr,
|
||||
AppId: config.Id.Token,
|
||||
AppType: "router",
|
||||
AppVersion: version.GetVersion(),
|
||||
AppAlias: cliAgentAlias,
|
||||
}
|
||||
if config.EnableDebugOps {
|
||||
enableDebugOps = true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user