Update agent commands

This commit is contained in:
Paul Lorenz
2023-01-04 10:32:58 -05:00
parent cac05d0b10
commit 58920e6b9d
29 changed files with 587 additions and 581 deletions
+8 -8
View File
@@ -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
+16 -16
View File
@@ -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
View File
@@ -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)
})
}
}
+22 -29
View File
@@ -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)
}
+14 -46
View File
@@ -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
}
+16 -47
View File
@@ -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
}
+11 -38
View File
@@ -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
}
-60
View File
@@ -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
}
-61
View File
@@ -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)
}
+26
View File
@@ -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
+26
View File
@@ -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
+36 -39
View File
@@ -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
}
+11 -33
View File
@@ -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)
}
+23 -11
View File
@@ -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)
}
+24 -12
View File
@@ -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)
}
+26 -7
View File
@@ -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)
}
+5 -6
View File
@@ -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)
}
-60
View File
@@ -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)
}
+4 -13
View File
@@ -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 {
+2
View File
@@ -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() {
+7 -2
View File
@@ -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 {
+2
View File
@@ -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
View File
@@ -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
}