From 8a90f02161143b06bca38b1f5944636d5a6db7e8 Mon Sep 17 00:00:00 2001 From: David Levanon Date: Sun, 7 Nov 2021 16:00:59 +0200 Subject: [PATCH 01/93] Add support of listening to multiple netns (#418) * multiple netns listen - initial commit * multiple netns listen - actual work * remove redundant log line * map /proc of host to tapper * changing kubernetes provider again after big conflict * revert node-sass version back to 5.0.0 * Rename host_source to hostSource Co-authored-by: gadotroee <55343099+gadotroee@users.noreply.github.com> * PR fixes - adding comment + typos + naming conventions * go fmt + making procfs read only * setns back to the original value after packet source initialized Co-authored-by: gadotroee <55343099+gadotroee@users.noreply.github.com> --- agent/go.sum | 4 +- shared/kubernetes/provider.go | 13 +- tap/go.mod | 3 +- tap/go.sum | 656 +++++++++++++++++++++++++++- tap/passive_tapper.go | 39 +- tap/source/packet_source_manager.go | 154 +++++++ tap/source/tcp_packet_source.go | 23 +- 7 files changed, 861 insertions(+), 31 deletions(-) create mode 100644 tap/source/packet_source_manager.go diff --git a/agent/go.sum b/agent/go.sum index 3994ea223..52d06e485 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -496,6 +496,8 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= @@ -646,6 +648,7 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -654,7 +657,6 @@ golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887 h1:dXfMednGJh/SUUFjTLsWJz3P+TQt9qnR11GgeI3vWKs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= diff --git a/shared/kubernetes/provider.go b/shared/kubernetes/provider.go index 1adda9858..2df6385c6 100644 --- a/shared/kubernetes/provider.go +++ b/shared/kubernetes/provider.go @@ -45,6 +45,8 @@ type Provider struct { const ( fieldManagerName = "mizu-manager" + procfsVolumeName = "proc" + procfsMountPath = "/hostproc" ) func NewProvider(kubeConfigPath string) (*Provider, error) { @@ -641,6 +643,7 @@ func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespac "--tap", "--api-server-address", fmt.Sprintf("ws://%s/wsTapper", apiServerPodIp), "--nodefrag", + "--procfs", procfsMountPath, } debugMode := "" @@ -719,6 +722,14 @@ func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespac noScheduleToleration.WithOperator(core.TolerationOpExists) noScheduleToleration.WithEffect(core.TaintEffectNoSchedule) + // Host procfs is needed inside the container because we need access to + // the network namespaces of processes on the machine. + // + procfsVolume := applyconfcore.Volume() + procfsVolume.WithName(procfsVolumeName).WithHostPath(applyconfcore.HostPathVolumeSource().WithPath("/proc")) + volumeMount := applyconfcore.VolumeMount().WithName(procfsVolumeName).WithMountPath(procfsMountPath).WithReadOnly(true) + agentContainer.WithVolumeMounts(volumeMount) + volumeName := ConfigMapName configMapVolume := applyconfcore.VolumeApplyConfiguration{ Name: &volumeName, @@ -747,7 +758,7 @@ func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespac podSpec.WithContainers(agentContainer) podSpec.WithAffinity(affinity) podSpec.WithTolerations(noExecuteToleration, noScheduleToleration) - podSpec.WithVolumes(&configMapVolume) + podSpec.WithVolumes(&configMapVolume, procfsVolume) podTemplate := applyconfcore.PodTemplateSpec() podTemplate.WithLabels(map[string]string{"app": tapperPodName}) diff --git a/tap/go.mod b/tap/go.mod index 12b93ef10..9d3001cb7 100644 --- a/tap/go.mod +++ b/tap/go.mod @@ -9,8 +9,7 @@ require ( github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/up9inc/mizu/shared v0.0.0 github.com/up9inc/mizu/tap/api v0.0.0 - golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 // indirect - golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073 // indirect + github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f ) replace github.com/up9inc/mizu/tap/api v0.0.0 => ./api diff --git a/tap/go.sum b/tap/go.sum index 965486e84..bdc732fed 100644 --- a/tap/go.sum +++ b/tap/go.sum @@ -1,34 +1,686 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bradleyfalzon/tlsx v0.0.0-20170624122154-28fd0e59bac4 h1:NJOOlc6ZJjix0A1rAU+nxruZtR8KboG1848yqpIUo4M= github.com/bradleyfalzon/tlsx v0.0.0-20170624122154-28fd0e59bac4/go.mod h1:DQPxZS994Ld1Y8uwnJT+dRL04XPD0cElP/pHH/zEBHM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.1 h1:IvVlgbzSsaUNudsw5dcXSzF3EWyXTi5XrAdngnuhRyg= github.com/go-errors/errors v1.4.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +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= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +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/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/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 h1:OgUuv8lsRpBibGNbSizVwKWlysjaNzmC9gYMhPVfqFM= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073 h1:8qxJSnu+7dRq6upnbntrmriWByIakBuct5OM/MdQC1M= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887 h1:dXfMednGJh/SUUFjTLsWJz3P+TQt9qnR11GgeI3vWKs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.21.2/go.mod h1:Lv6UGJZ1rlMI1qusN8ruAp9PUBFyBwpEHAdG24vIsiU= +k8s.io/apimachinery v0.21.2/go.mod h1:CdTY8fU/BlvAbJ2z/8kBwimGki5Zp8/fbVuLY8gJumM= +k8s.io/cli-runtime v0.21.2/go.mod h1:8u/jFcM0QpoI28f6sfrAAIslLCXUYKD5SsPPMWiHYrI= +k8s.io/client-go v0.21.2/go.mod h1:HdJ9iknWpbl3vMGtib6T2PyI/VYxiZfq936WNVHBRrA= +k8s.io/code-generator v0.21.2/go.mod h1:8mXJDCB7HcRo1xiEQstcguZkbxZaqeUOrO9SsicWs3U= +k8s.io/component-base v0.21.2/go.mod h1:9lvmIThzdlrJj5Hp8Z/TOgIkdfsNARQ1pT+3PByuiuc= +k8s.io/component-helpers v0.21.2/go.mod h1:DbyFt/A0p6Cv+R5+QOGSJ5f5t4xDfI8Yb89a57DgJlQ= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/kubectl v0.21.2/go.mod h1:PgeUclpG8VVmmQIl8zpLar3IQEpFc9mrmvlwY3CK1xo= +k8s.io/metrics v0.21.2/go.mod h1:wzlOINZMCtWq8dR9gHlyaOemmYlOpAoldEIXE82gAhI= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/kustomize/api v0.8.8/go.mod h1:He1zoK0nk43Pc6NlV085xDXDXTNprtcyKZVm3swsdNY= +sigs.k8s.io/kustomize/cmd/config v0.9.10/go.mod h1:Mrby0WnRH7hA6OwOYnYpfpiY0WJIMgYrEDfwOeFdMK0= +sigs.k8s.io/kustomize/kustomize/v4 v4.1.2/go.mod h1:PxBvo4WGYlCLeRPL+ziT64wBXqbgfcalOS/SXa/tcyo= +sigs.k8s.io/kustomize/kyaml v0.10.17/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/tap/passive_tapper.go b/tap/passive_tapper.go index 6dfe1390a..77056380c 100644 --- a/tap/passive_tapper.go +++ b/tap/passive_tapper.go @@ -40,6 +40,7 @@ var verbose = flag.Bool("verbose", false, "Be verbose") var debug = flag.Bool("debug", false, "Display debug information") var quiet = flag.Bool("quiet", false, "Be quiet regarding errors") var hexdumppkt = flag.Bool("dumppkt", false, "Dump packet as hex") +var procfs = flag.String("procfs", "/proc", "The procfs directory, used when mapping host volumes into a container") // capture var iface = flag.String("i", "en0", "Interface to read packets from") @@ -48,6 +49,7 @@ var snaplen = flag.Int("s", 65536, "Snap length (number of bytes max to read per var tstype = flag.String("timestamp_type", "", "Type of timestamps to use") var promisc = flag.Bool("promisc", true, "Set promiscuous mode") var staleTimeoutSeconds = flag.Int("staletimout", 120, "Max time in seconds to keep connections which don't transmit data") +var pids = flag.String("pids", "", "A comma separated list of PIDs to capture their network namespaces") var memprofile = flag.String("memprofile", "", "Write memory profile") @@ -129,6 +131,24 @@ func printPeriodicStats(cleaner *Cleaner) { } } +func initializePacketSources() (*source.PacketSourceManager, error) { + var bpffilter string + if len(flag.Args()) > 0 { + bpffilter = strings.Join(flag.Args(), " ") + } + + behaviour := source.TcpPacketSourceBehaviour{ + SnapLength: *snaplen, + Promisc: *promisc, + Tstype: *tstype, + DecoderName: *decoder, + Lazy: *lazy, + BpfFilter: bpffilter, + } + + return source.NewPacketSourceManager(*procfs, *pids, *fname, *iface, behaviour) +} + func startPassiveTapper(outputItems chan *api.OutputChannelItem) { streamsMap := NewTcpStreamMap() go streamsMap.closeTimedoutTcpStreamChannels() @@ -136,25 +156,13 @@ func startPassiveTapper(outputItems chan *api.OutputChannelItem) { diagnose.InitializeErrorsMap(*debug, *verbose, *quiet) diagnose.InitializeTapperInternalStats() - var bpffilter string - if len(flag.Args()) > 0 { - bpffilter = strings.Join(flag.Args(), " ") - } - - packetSource, err := source.NewTcpPacketSource(*fname, *iface, source.TcpPacketSourceBehaviour{ - SnapLength: *snaplen, - Promisc: *promisc, - Tstype: *tstype, - DecoderName: *decoder, - Lazy: *lazy, - BpfFilter: bpffilter, - }) + sources, err := initializePacketSources() if err != nil { logger.Log.Fatal(err) } - defer packetSource.Close() + defer sources.Close() if err != nil { logger.Log.Fatal(err) @@ -163,10 +171,9 @@ func startPassiveTapper(outputItems chan *api.OutputChannelItem) { packets := make(chan source.TcpPacketInfo) assembler := NewTcpAssembler(outputItems, streamsMap) - logger.Log.Info("Starting to read packets") diagnose.AppStats.SetStartTime(time.Now()) - go packetSource.ReadPackets(!*nodefrag, packets) + sources.ReadPackets(!*nodefrag, packets) staleConnectionTimeout := time.Second * time.Duration(*staleTimeoutSeconds) cleaner := Cleaner{ diff --git a/tap/source/packet_source_manager.go b/tap/source/packet_source_manager.go new file mode 100644 index 000000000..41ed1344d --- /dev/null +++ b/tap/source/packet_source_manager.go @@ -0,0 +1,154 @@ +package source + +import ( + "fmt" + "runtime" + "strconv" + "strings" + + "github.com/up9inc/mizu/shared/logger" + "github.com/vishvananda/netns" +) + +type PacketSourceManager struct { + sources []*tcpPacketSource +} + +func NewPacketSourceManager(procfs string, pids string, filename string, interfaceName string, + behaviour TcpPacketSourceBehaviour) (*PacketSourceManager, error) { + sources := make([]*tcpPacketSource, 0) + hostSource, err := newHostPacketSource(filename, interfaceName, behaviour) + + if err != nil { + return nil, err + } + + sources = append(sources, hostSource) + + if pids != "" { + netnsSources := newNetnsPacketSources(procfs, pids, interfaceName, behaviour) + sources = append(sources, netnsSources...) + } + + return &PacketSourceManager{ + sources: sources, + }, nil +} + +func newHostPacketSource(filename string, interfaceName string, + behaviour TcpPacketSourceBehaviour) (*tcpPacketSource, error) { + var name string + + if filename == "" { + name = fmt.Sprintf("host-%v", interfaceName) + } else { + name = fmt.Sprintf("file-%v", filename) + } + + source, err := newTcpPacketSource(name, filename, interfaceName, behaviour) + + if err != nil { + return nil, err + } + + return source, nil +} + +func newNetnsPacketSources(procfs string, pids string, interfaceName string, + behaviour TcpPacketSourceBehaviour) []*tcpPacketSource { + result := make([]*tcpPacketSource, 0) + + for _, pidstr := range strings.Split(pids, ",") { + pid, err := strconv.Atoi(pidstr) + + if err != nil { + logger.Log.Errorf("Invalid PID: %v - %v", pid, err) + continue + } + + nsh, err := netns.GetFromPath(fmt.Sprintf("%v/%v/ns/net", procfs, pid)) + + if err != nil { + logger.Log.Errorf("Unable to get netns of pid %v - %v", pid, err) + continue + } + + src, err := newNetnsPacketSource(pid, nsh, interfaceName, behaviour) + + if err != nil { + logger.Log.Errorf("Error starting netns packet source for %v - %v", pid, err) + continue + } + + result = append(result, src) + } + + return result +} + +func newNetnsPacketSource(pid int, nsh netns.NsHandle, interfaceName string, + behaviour TcpPacketSourceBehaviour) (*tcpPacketSource, error) { + + done := make(chan *tcpPacketSource) + errors := make(chan error) + + go func(done chan<- *tcpPacketSource) { + // Setting a netns should be done from a dedicated OS thread. + // + // goroutines are not really OS threads, we try to mimic the issue by + // locking the OS thread to this goroutine + // + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + oldnetns, err := netns.Get() + + if err != nil { + logger.Log.Errorf("Unable to get netns of current thread %v", err) + errors <- err + return + } + + if err := netns.Set(nsh); err != nil { + logger.Log.Errorf("Unable to set netns of pid %v - %v", pid, err) + errors <- err + return + } + + name := fmt.Sprintf("netns-%v-%v", pid, interfaceName) + src, err := newTcpPacketSource(name, "", interfaceName, behaviour) + + if err != nil { + logger.Log.Errorf("Error listening to PID %v - %v", pid, err) + errors <- err + return + } + + if err := netns.Set(oldnetns); err != nil { + logger.Log.Errorf("Unable to set back netns of current thread %v", err) + errors <- err + return + } + + done <- src + }(done) + + select { + case err := <-errors: + return nil, err + case source := <-done: + return source, nil + } +} + +func (m *PacketSourceManager) ReadPackets(ipdefrag bool, packets chan<- TcpPacketInfo) { + for _, src := range m.sources { + go src.readPackets(ipdefrag, packets) + } +} + +func (m *PacketSourceManager) Close() { + for _, src := range m.sources { + src.close() + } +} diff --git a/tap/source/tcp_packet_source.go b/tap/source/tcp_packet_source.go index 61ff7446d..2ad468b38 100644 --- a/tap/source/tcp_packet_source.go +++ b/tap/source/tcp_packet_source.go @@ -13,11 +13,12 @@ import ( "github.com/up9inc/mizu/tap/diagnose" ) -type TcpPacketSource struct { +type tcpPacketSource struct { source *gopacket.PacketSource handle *pcap.Handle defragger *ip4defrag.IPv4Defragmenter Behaviour *TcpPacketSourceBehaviour + name string } type TcpPacketSourceBehaviour struct { @@ -31,14 +32,15 @@ type TcpPacketSourceBehaviour struct { type TcpPacketInfo struct { Packet gopacket.Packet - Source *TcpPacketSource + Source *tcpPacketSource } -func NewTcpPacketSource(filename string, interfaceName string, - behaviour TcpPacketSourceBehaviour) (*TcpPacketSource, error) { +func newTcpPacketSource(name, filename string, interfaceName string, + behaviour TcpPacketSourceBehaviour) (*tcpPacketSource, error) { var err error - result := &TcpPacketSource{ + result := &tcpPacketSource{ + name: name, defragger: ip4defrag.NewIPv4Defragmenter(), Behaviour: &behaviour, } @@ -96,21 +98,24 @@ func NewTcpPacketSource(filename string, interfaceName string, return result, nil } -func (source *TcpPacketSource) Close() { +func (source *tcpPacketSource) close() { if source.handle != nil { source.handle.Close() } } -func (source *TcpPacketSource) ReadPackets(ipdefrag bool, packets chan<- TcpPacketInfo) error { +func (source *tcpPacketSource) readPackets(ipdefrag bool, packets chan<- TcpPacketInfo) { + logger.Log.Infof("Start reading packets from %v", source.name) + for { packet, err := source.source.NextPacket() if err == io.EOF { - return err + logger.Log.Infof("Got EOF while reading packets from %v", source.name) + return } else if err != nil { if err.Error() != "Timeout Expired" { - logger.Log.Debugf("Error: %T", err) + logger.Log.Debugf("Error while reading from %v - %v", source.name, err) } continue } From b7b012539d40896624d67f32670e8bbff84caca1 Mon Sep 17 00:00:00 2001 From: RamiBerm <54766858+RamiBerm@users.noreply.github.com> Date: Mon, 8 Nov 2021 10:03:01 +0200 Subject: [PATCH 02/93] TRA-3842 daemon acceptance tests (#429) * Update tap_test.go and testsUtils.go * Update tap_test.go * Update testsUtils.go * Update tap_test.go and testsUtils.go * Update tap_test.go and testsUtils.go * Update testsUtils.go * Update tap_test.go * gofmt --- acceptanceTests/tap_test.go | 328 +++++++++++++++++++++++++++------- acceptanceTests/testsUtils.go | 84 ++++++++- 2 files changed, 345 insertions(+), 67 deletions(-) diff --git a/acceptanceTests/tap_test.go b/acceptanceTests/tap_test.go index 7bd7805d7..02bca771f 100644 --- a/acceptanceTests/tap_test.go +++ b/acceptanceTests/tap_test.go @@ -77,7 +77,7 @@ func TestTap(t *testing.T) { return fmt.Errorf("unexpected entries result - Expected more than 0 entries") } - entry := entries[0].(map[string]interface{}) + entry := entries[0].(map[string]interface{}) entryUrl := fmt.Sprintf("%v/entries/%v", apiServerUrl, entry["id"]) requestResult, requestErr = executeHttpGetRequest(entryUrl) @@ -150,10 +150,7 @@ func TestTapAllNamespaces(t *testing.T) { t.Skip("ignored acceptance test") } - expectedPods := []struct{ - Name string - Namespace string - }{ + expectedPods := []PodDescriptor{ {Name: "httpbin", Namespace: "mizu-tests"}, {Name: "httpbin", Namespace: "mizu-tests2"}, } @@ -202,19 +199,7 @@ func TestTapAllNamespaces(t *testing.T) { } for _, expectedPod := range expectedPods { - podFound := false - - for _, pod := range pods { - podNamespace := pod["namespace"].(string) - podName := pod["name"].(string) - - if expectedPod.Namespace == podNamespace && strings.Contains(podName, expectedPod.Name) { - podFound = true - break - } - } - - if !podFound { + if !isPodDescriptorInPodArray(pods, expectedPod) { t.Errorf("unexpected result - expected pod not found, pod namespace: %v, pod name: %v", expectedPod.Namespace, expectedPod.Name) return } @@ -226,10 +211,7 @@ func TestTapMultipleNamespaces(t *testing.T) { t.Skip("ignored acceptance test") } - expectedPods := []struct{ - Name string - Namespace string - }{ + expectedPods := []PodDescriptor{ {Name: "httpbin", Namespace: "mizu-tests"}, {Name: "httpbin2", Namespace: "mizu-tests"}, {Name: "httpbin", Namespace: "mizu-tests2"}, @@ -288,19 +270,7 @@ func TestTapMultipleNamespaces(t *testing.T) { } for _, expectedPod := range expectedPods { - podFound := false - - for _, pod := range pods { - podNamespace := pod["namespace"].(string) - podName := pod["name"].(string) - - if expectedPod.Namespace == podNamespace && strings.Contains(podName, expectedPod.Name) { - podFound = true - break - } - } - - if !podFound { + if !isPodDescriptorInPodArray(pods, expectedPod) { t.Errorf("unexpected result - expected pod not found, pod namespace: %v, pod name: %v", expectedPod.Namespace, expectedPod.Name) return } @@ -313,10 +283,7 @@ func TestTapRegex(t *testing.T) { } regexPodName := "httpbin2" - expectedPods := []struct{ - Name string - Namespace string - }{ + expectedPods := []PodDescriptor{ {Name: regexPodName, Namespace: "mizu-tests"}, } @@ -371,19 +338,7 @@ func TestTapRegex(t *testing.T) { } for _, expectedPod := range expectedPods { - podFound := false - - for _, pod := range pods { - podNamespace := pod["namespace"].(string) - podName := pod["name"].(string) - - if expectedPod.Namespace == podNamespace && strings.Contains(podName, expectedPod.Name) { - podFound = true - break - } - } - - if !podFound { + if !isPodDescriptorInPodArray(pods, expectedPod) { t.Errorf("unexpected result - expected pod not found, pod namespace: %v, pod name: %v", expectedPod.Namespace, expectedPod.Name) return } @@ -431,7 +386,7 @@ func TestTapDryRun(t *testing.T) { resultChannel <- "fail" }() - testResult := <- resultChannel + testResult := <-resultChannel if testResult != "success" { t.Errorf("unexpected result - dry run cmd not done") } @@ -497,7 +452,7 @@ func TestTapRedact(t *testing.T) { return fmt.Errorf("unexpected entries result - Expected more than 0 entries") } - firstEntry := entries[0].(map[string]interface{}) + firstEntry := entries[0].(map[string]interface{}) entryUrl := fmt.Sprintf("%v/entries/%v", apiServerUrl, firstEntry["id"]) requestResult, requestErr = executeHttpGetRequest(entryUrl) @@ -517,7 +472,7 @@ func TestTapRedact(t *testing.T) { entryPayload := entryRequest["payload"].(map[string]interface{}) entryDetails := entryPayload["details"].(map[string]interface{}) - headers := entryDetails["headers"].([]interface{}) + headers := entryDetails["headers"].([]interface{}) for _, headerInterface := range headers { header := headerInterface.(map[string]interface{}) if header["name"].(string) != "User-Agent" { @@ -612,7 +567,7 @@ func TestTapNoRedact(t *testing.T) { return fmt.Errorf("unexpected entries result - Expected more than 0 entries") } - firstEntry := entries[0].(map[string]interface{}) + firstEntry := entries[0].(map[string]interface{}) entryUrl := fmt.Sprintf("%v/entries/%v", apiServerUrl, firstEntry["id"]) requestResult, requestErr = executeHttpGetRequest(entryUrl) @@ -632,7 +587,7 @@ func TestTapNoRedact(t *testing.T) { entryPayload := entryRequest["payload"].(map[string]interface{}) entryDetails := entryPayload["details"].(map[string]interface{}) - headers := entryDetails["headers"].([]interface{}) + headers := entryDetails["headers"].([]interface{}) for _, headerInterface := range headers { header := headerInterface.(map[string]interface{}) if header["name"].(string) != "User-Agent" { @@ -727,7 +682,7 @@ func TestTapRegexMasking(t *testing.T) { return fmt.Errorf("unexpected entries result - Expected more than 0 entries") } - firstEntry := entries[0].(map[string]interface{}) + firstEntry := entries[0].(map[string]interface{}) entryUrl := fmt.Sprintf("%v/entries/%v", apiServerUrl, firstEntry["id"]) requestResult, requestErr = executeHttpGetRequest(entryUrl) @@ -805,7 +760,7 @@ func TestTapIgnoredUserAgents(t *testing.T) { proxyUrl := getProxyUrl(defaultNamespaceName, defaultServiceName) ignoredUserAgentCustomHeader := "Ignored-User-Agent" - headers := map[string]string {"User-Agent": ignoredUserAgentValue, ignoredUserAgentCustomHeader: ""} + headers := map[string]string{"User-Agent": ignoredUserAgentValue, ignoredUserAgentCustomHeader: ""} for i := 0; i < defaultEntriesCount; i++ { if _, requestErr := executeHttpGetRequestWithHeaders(fmt.Sprintf("%v/get", proxyUrl), headers); requestErr != nil { t.Errorf("failed to send proxy request, err: %v", requestErr) @@ -823,7 +778,7 @@ func TestTapIgnoredUserAgents(t *testing.T) { ignoredUserAgentsCheckFunc := func() error { timestamp := time.Now().UnixNano() / int64(time.Millisecond) - entriesUrl := fmt.Sprintf("%v/entries?limit=%v&operator=lt×tamp=%v", apiServerUrl, defaultEntriesCount * 2, timestamp) + entriesUrl := fmt.Sprintf("%v/entries?limit=%v&operator=lt×tamp=%v", apiServerUrl, defaultEntriesCount*2, timestamp) requestResult, requestErr := executeHttpGetRequest(entriesUrl) if requestErr != nil { return fmt.Errorf("failed to get entries, err: %v", requestErr) @@ -853,7 +808,7 @@ func TestTapIgnoredUserAgents(t *testing.T) { entryPayload := entryRequest["payload"].(map[string]interface{}) entryDetails := entryPayload["details"].(map[string]interface{}) - entryHeaders := entryDetails["headers"].([]interface{}) + entryHeaders := entryDetails["headers"].([]interface{}) for _, headerInterface := range entryHeaders { header := headerInterface.(map[string]interface{}) if header["name"].(string) != ignoredUserAgentCustomHeader { @@ -973,3 +928,254 @@ func TestTapDumpLogs(t *testing.T) { return } } + +func TestDaemonSeeTraffic(t *testing.T) { + if testing.Short() { + t.Skip("ignored acceptance test") + } + + tests := []int{50} + + for _, entriesCount := range tests { + t.Run(fmt.Sprintf("%d", entriesCount), func(t *testing.T) { + cliPath, cliPathErr := getCliPath() + if cliPathErr != nil { + t.Errorf("failed to get cli path, err: %v", cliPathErr) + return + } + + tapDaemonCmdArgs := getDefaultTapCommandArgsWithDaemonMode() + + tapNamespace := getDefaultTapNamespace() + tapDaemonCmdArgs = append(tapDaemonCmdArgs, tapNamespace...) + + tapCmd := exec.Command(cliPath, tapDaemonCmdArgs...) + + viewCmd := exec.Command(cliPath, getDefaultViewCommandArgs()...) + + t.Cleanup(func() { + daemonCleanup(t, viewCmd) + }) + + t.Logf("running command: %v", tapCmd.String()) + if err := tapCmd.Run(); err != nil { + t.Errorf("error occured while running the tap command, err: %v", err) + return + } + + t.Logf("running command: %v", viewCmd.String()) + if err := viewCmd.Start(); err != nil { + t.Errorf("error occured while running the view command, err: %v", err) + return + } + + apiServerUrl := getApiServerUrl(defaultApiServerPort) + if err := waitTapPodsReady(apiServerUrl); err != nil { + t.Errorf("failed to start tap pods on time, err: %v", err) + return + } + + proxyUrl := getProxyUrl(defaultNamespaceName, defaultServiceName) + for i := 0; i < entriesCount; i++ { + if _, requestErr := executeHttpGetRequest(fmt.Sprintf("%v/get", proxyUrl)); requestErr != nil { + t.Errorf("failed to send proxy request, err: %v", requestErr) + return + } + } + + entriesCheckFunc := func() error { + timestamp := time.Now().UnixNano() / int64(time.Millisecond) + + entriesUrl := fmt.Sprintf("%v/entries?limit=%v&operator=lt×tamp=%v", apiServerUrl, entriesCount, timestamp) + requestResult, requestErr := executeHttpGetRequest(entriesUrl) + if requestErr != nil { + return fmt.Errorf("failed to get entries, err: %v", requestErr) + } + + entries := requestResult.([]interface{}) + if len(entries) == 0 { + return fmt.Errorf("unexpected entries result - Expected more than 0 entries") + } + + entry := entries[0].(map[string]interface{}) + + entryUrl := fmt.Sprintf("%v/entries/%v", apiServerUrl, entry["id"]) + requestResult, requestErr = executeHttpGetRequest(entryUrl) + if requestErr != nil { + return fmt.Errorf("failed to get entry, err: %v", requestErr) + } + + if requestResult == nil { + return fmt.Errorf("unexpected nil entry result") + } + + return nil + } + if err := retriesExecute(shortRetriesCount, entriesCheckFunc); err != nil { + t.Errorf("%v", err) + return + } + }) + } +} + +func TestDaemonMultipleNamespacesSeePods(t *testing.T) { + if testing.Short() { + t.Skip("ignored acceptance test") + } + + expectedPods := []PodDescriptor{ + {Name: "httpbin", Namespace: "mizu-tests"}, + {Name: "httpbin2", Namespace: "mizu-tests"}, + {Name: "httpbin", Namespace: "mizu-tests2"}, + } + + cliPath, cliPathErr := getCliPath() + if cliPathErr != nil { + t.Errorf("failed to get cli path, err: %v", cliPathErr) + return + } + + tapCmdArgs := getDefaultTapCommandArgsWithDaemonMode() + var namespacesCmd []string + for _, expectedPod := range expectedPods { + namespacesCmd = append(namespacesCmd, "-n", expectedPod.Namespace) + } + tapCmdArgs = append(tapCmdArgs, namespacesCmd...) + + tapCmd := exec.Command(cliPath, tapCmdArgs...) + + viewCmd := exec.Command(cliPath, getDefaultViewCommandArgs()...) + + t.Cleanup(func() { + daemonCleanup(t, viewCmd) + }) + + t.Logf("running command: %v", tapCmd.String()) + if err := tapCmd.Run(); err != nil { + t.Errorf("failed to start tap command, err: %v", err) + return + } + + t.Logf("running command: %v", viewCmd.String()) + if err := viewCmd.Start(); err != nil { + t.Errorf("error occured while running the view command, err: %v", err) + return + } + + apiServerUrl := getApiServerUrl(defaultApiServerPort) + if err := waitTapPodsReady(apiServerUrl); err != nil { + t.Errorf("failed to start tap pods on time, err: %v", err) + return + } + + podsUrl := fmt.Sprintf("%v/status/tap", apiServerUrl) + requestResult, requestErr := executeHttpGetRequest(podsUrl) + if requestErr != nil { + t.Errorf("failed to get tap status, err: %v", requestErr) + return + } + + pods, err := getPods(requestResult) + if err != nil { + t.Errorf("failed to get pods, err: %v", err) + return + } + + if len(expectedPods) != len(pods) { + t.Errorf("unexpected result - expected pods length: %v, actual pods length: %v", len(expectedPods), len(pods)) + return + } + + for _, expectedPod := range expectedPods { + if !isPodDescriptorInPodArray(pods, expectedPod) { + t.Errorf("unexpected result - expected pod not found, pod namespace: %v, pod name: %v", expectedPod.Namespace, expectedPod.Name) + return + } + } +} + +func TestDaemonSingleNamespaceSeePods(t *testing.T) { + if testing.Short() { + t.Skip("ignored acceptance test") + } + + expectedPods := []PodDescriptor{ + {Name: "httpbin", Namespace: "mizu-tests"}, + {Name: "httpbin2", Namespace: "mizu-tests"}, + } + unexpectedPods := []PodDescriptor{ + {Name: "httpbin", Namespace: "mizu-tests2"}, + } + + cliPath, cliPathErr := getCliPath() + if cliPathErr != nil { + t.Errorf("failed to get cli path, err: %v", cliPathErr) + return + } + + tapCmdArgs := getDefaultTapCommandArgsWithDaemonMode() + var namespacesCmd []string + for _, expectedPod := range expectedPods { + namespacesCmd = append(namespacesCmd, "-n", expectedPod.Namespace) + } + tapCmdArgs = append(tapCmdArgs, namespacesCmd...) + + tapCmd := exec.Command(cliPath, tapCmdArgs...) + + viewCmd := exec.Command(cliPath, getDefaultViewCommandArgs()...) + + t.Cleanup(func() { + daemonCleanup(t, viewCmd) + }) + + t.Logf("running command: %v", tapCmd.String()) + if err := tapCmd.Run(); err != nil { + t.Errorf("failed to start tap command, err: %v", err) + return + } + + t.Logf("running command: %v", viewCmd.String()) + if err := viewCmd.Start(); err != nil { + t.Errorf("error occured while running the view command, err: %v", err) + return + } + + apiServerUrl := getApiServerUrl(defaultApiServerPort) + if err := waitTapPodsReady(apiServerUrl); err != nil { + t.Errorf("failed to start tap pods on time, err: %v", err) + return + } + + podsUrl := fmt.Sprintf("%v/status/tap", apiServerUrl) + requestResult, requestErr := executeHttpGetRequest(podsUrl) + if requestErr != nil { + t.Errorf("failed to get tap status, err: %v", requestErr) + return + } + + pods, err := getPods(requestResult) + if err != nil { + t.Errorf("failed to get pods, err: %v", err) + return + } + + for _, unexpectedPod := range unexpectedPods { + if isPodDescriptorInPodArray(pods, unexpectedPod) { + t.Errorf("unexpected result - unexpected pod found, pod namespace: %v, pod name: %v", unexpectedPod.Namespace, unexpectedPod.Name) + return + } + } + + if len(expectedPods) != len(pods) { + t.Errorf("unexpected result - expected pods length: %v, actual pods length: %v", len(expectedPods), len(pods)) + return + } + + for _, expectedPod := range expectedPods { + if !isPodDescriptorInPodArray(pods, expectedPod) { + t.Errorf("unexpected result - expected pod not found, pod namespace: %v, pod name: %v", expectedPod.Namespace, expectedPod.Name) + return + } + } +} diff --git a/acceptanceTests/testsUtils.go b/acceptanceTests/testsUtils.go index 9c7ad955a..3569eb375 100644 --- a/acceptanceTests/testsUtils.go +++ b/acceptanceTests/testsUtils.go @@ -3,6 +3,7 @@ package acceptanceTests import ( "bytes" "encoding/json" + "errors" "fmt" "io/ioutil" "net/http" @@ -11,21 +12,40 @@ import ( "path" "strings" "syscall" + "testing" "time" "github.com/up9inc/mizu/shared" ) const ( - longRetriesCount = 100 - shortRetriesCount = 10 - defaultApiServerPort = shared.DefaultApiServerPort - defaultNamespaceName = "mizu-tests" - defaultServiceName = "httpbin" - defaultEntriesCount = 50 + longRetriesCount = 100 + shortRetriesCount = 10 + defaultApiServerPort = shared.DefaultApiServerPort + defaultNamespaceName = "mizu-tests" + defaultServiceName = "httpbin" + defaultEntriesCount = 50 waitAfterTapPodsReady = 3 * time.Second + cleanCommandTimeout = 1 * time.Minute ) +type PodDescriptor struct { + Name string + Namespace string +} + +func isPodDescriptorInPodArray(pods []map[string]interface{}, podDescriptor PodDescriptor) bool { + for _, pod := range pods { + podNamespace := pod["namespace"].(string) + podName := pod["name"].(string) + + if podDescriptor.Namespace == podNamespace && strings.Contains(podName, podDescriptor.Name) { + return true + } + } + return false +} + func getCliPath() (string, error) { dir, filePathErr := os.Getwd() if filePathErr != nil { @@ -78,6 +98,10 @@ func getDefaultTapCommandArgs() []string { return append([]string{tapCommand}, defaultCmdArgs...) } +func getDefaultTapCommandArgsWithDaemonMode() []string { + return append(getDefaultTapCommandArgs(), "--daemon") +} + func getDefaultTapCommandArgsWithRegex(regex string) []string { tapCommand := "tap" defaultCmdArgs := getDefaultCommandArgs() @@ -103,6 +127,14 @@ func getDefaultConfigCommandArgs() []string { return append([]string{configCommand}, defaultCmdArgs...) } +func getDefaultCleanCommandArgs() []string { + return []string{"clean"} +} + +func getDefaultViewCommandArgs() []string { + return []string{"view"} +} + func retriesExecute(retriesCount int, executeFunc func() error) error { var lastError interface{} @@ -205,6 +237,36 @@ func executeHttpPostRequest(url string, body interface{}) (interface{}, error) { return executeHttpRequest(response, requestErr) } +func runMizuClean() error { + cliPath, err := getCliPath() + if err != nil { + return err + } + + cleanCmdArgs := getDefaultCleanCommandArgs() + + cleanCmd := exec.Command(cliPath, cleanCmdArgs...) + + commandDone := make(chan error) + go func() { + if err := cleanCmd.Run(); err != nil { + commandDone <- err + } + commandDone <- nil + }() + + select { + case err = <- commandDone: + if err != nil { + return err + } + case <- time.After(cleanCommandTimeout): + return errors.New("clean command timed out") + } + + return nil +} + func cleanupCommand(cmd *exec.Cmd) error { if err := cmd.Process.Signal(syscall.SIGQUIT); err != nil { return err @@ -239,6 +301,16 @@ func getLogsPath() (string, error) { return logsPath, nil } +func daemonCleanup(t *testing.T, viewCmd *exec.Cmd) { + if err := runMizuClean(); err != nil { + t.Logf("error running mizu clean: %v", err) + } + + if err := cleanupCommand(viewCmd); err != nil { + t.Logf("failed to cleanup view command, err: %v", err) + } +} + func Contains(slice []string, containsValue string) bool { for _, sliceValue := range slice { if sliceValue == containsValue { From 4cf3c9c6d34f6d7c62c2f4c490add190638bd32b Mon Sep 17 00:00:00 2001 From: RamiBerm <54766858+RamiBerm@users.noreply.github.com> Date: Mon, 8 Nov 2021 11:23:03 +0200 Subject: [PATCH 03/93] TRA-3913 support mizu via expose service (#440) * Update README.md, tapRunner.go, and 4 more files... * Update testsUtils.go * Update proxy.go * Update README.md, testsUtils.go, and 3 more files... * Update testsUtils.go and provider.go --- README.md | 48 +++++++++++++++++++++++++++++++++-- acceptanceTests/testsUtils.go | 2 +- shared/kubernetes/provider.go | 39 ++++++++++++++-------------- shared/kubernetes/proxy.go | 15 +++++++---- ui/src/helpers/api.js | 6 ++--- 5 files changed, 78 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 3c31c489e..8d3c38a4a 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ To tap all pods in current namespace - ``` -To tap specific pod - +###To tap specific pod ```bash $ kubectl get pods NAME READY STATUS RESTARTS AGE @@ -96,7 +96,7 @@ To tap specific pod - ^C ``` -To tap multiple pods using regex - +###To tap multiple pods using regex ```bash $ kubectl get pods NAME READY STATUS RESTARTS AGE @@ -111,6 +111,50 @@ To tap multiple pods using regex - Web interface is now available at http://localhost:8899 ^C ``` +###To run mizu mizu daemon mode (detached from cli) +```bash +$ mizu tap "^ca.*" --daemon + Mizu will store up to 200MB of traffic, old traffic will be cleared once the limit is reached. + Tapping pods in namespaces "sock-shop" + Waiting for mizu to be ready... (may take a few minutes) + +carts-66c77f5fbb-fq65r + +catalogue-5f4cb7cf5-7zrmn + .. + +$ mizu view + Establishing connection to k8s cluster... + Mizu is available at http://localhost:8899 + ^C + .. + +$ mizu clean # mizu will continue running in cluster until clean is executed + Removing mizu resources +``` + + + +###To run mizu daemon mode with LoadBalancer kubernetes service +```bash +$ mizu tap "^ca.*" --daemon + Mizu will store up to 200MB of traffic, old traffic will be cleared once the limit is reached. + Tapping pods in namespaces "sock-shop" + Waiting for mizu to be ready... (may take a few minutes) + .. + +$ kubectl expose deployment -n mizu --port 80 --target-port 8899 mizu-api-server --type=LoadBalancer --name=mizu-lb + service/mizu-lb exposed + .. + +$ kubectl get services -n mizu + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + mizu-api-server ClusterIP 10.107.200.100 80/TCP 5m5s + mizu-lb LoadBalancer 10.107.200.101 34.77.120.116 80:30141/TCP 76s +``` +Note that `LoadBalancer` services only work on supported clusters (usually cloud providers) and might incur extra costs + +If you changed the `mizu-resources-namespace` value, make sure the `-n mizu` flag of the `kubectl expose` command is changed to the value of `mizu-resources-namespace` + +mizu will now be available both by running `mizu view` or by accessing the `EXTERNAL-IP` of the `mizu-lb` service through your browser. ## Configuration diff --git a/acceptanceTests/testsUtils.go b/acceptanceTests/testsUtils.go index 3569eb375..6b6681603 100644 --- a/acceptanceTests/testsUtils.go +++ b/acceptanceTests/testsUtils.go @@ -79,7 +79,7 @@ func getProxyUrl(namespace string, service string) string { } func getApiServerUrl(port uint16) string { - return fmt.Sprintf("http://localhost:%v/mizu", port) + return fmt.Sprintf("http://localhost:%v", port) } func getDefaultCommandArgs() []string { diff --git a/shared/kubernetes/provider.go b/shared/kubernetes/provider.go index 2df6385c6..06538f4c2 100644 --- a/shared/kubernetes/provider.go +++ b/shared/kubernetes/provider.go @@ -241,8 +241,8 @@ func (provider *Provider) GetMizuApiServerPodObject(opts *ApiServerOptions, moun }, }) volumeMounts = append(volumeMounts, core.VolumeMount{ - Name: volumeClaimName, - MountPath: shared.DataDirPath, + Name: volumeClaimName, + MountPath: shared.DataDirPath, }) } @@ -255,8 +255,8 @@ func (provider *Provider) GetMizuApiServerPodObject(opts *ApiServerOptions, moun pod := &core.Pod{ ObjectMeta: metav1.ObjectMeta{ - Name: opts.PodName, - Labels: map[string]string{"app": opts.PodName}, + Name: opts.PodName, + Labels: map[string]string{"app": opts.PodName}, }, Spec: core.PodSpec{ Containers: []core.Container{ @@ -264,8 +264,8 @@ func (provider *Provider) GetMizuApiServerPodObject(opts *ApiServerOptions, moun Name: opts.PodName, Image: opts.PodImage, ImagePullPolicy: opts.ImagePullPolicy, - VolumeMounts: volumeMounts, - Command: command, + VolumeMounts: volumeMounts, + Command: command, Env: []core.EnvVar{ { Name: shared.SyncEntriesConfigEnvVar, @@ -307,7 +307,7 @@ func (provider *Provider) GetMizuApiServerPodObject(opts *ApiServerOptions, moun }, }, }, - Volumes: volumes, + Volumes: volumes, DNSPolicy: core.DNSClusterFirstWithHostNet, TerminationGracePeriodSeconds: new(int64), }, @@ -320,7 +320,6 @@ func (provider *Provider) GetMizuApiServerPodObject(opts *ApiServerOptions, moun return pod, nil } - func (provider *Provider) CreatePod(ctx context.Context, namespace string, podSpec *core.Pod) (*core.Pod, error) { return provider.clientSet.CoreV1().Pods(namespace).Create(ctx, podSpec, metav1.CreateOptions{}) } @@ -335,14 +334,14 @@ func (provider *Provider) CreateDeployment(ctx context.Context, namespace string } deployment := &v1.Deployment{ ObjectMeta: metav1.ObjectMeta{ - Name: deploymentName, + Name: deploymentName, }, Spec: v1.DeploymentSpec{ Selector: &metav1.LabelSelector{ MatchLabels: map[string]string{"app": podSpec.ObjectMeta.Labels["app"]}, }, - Template: *podTemplate, - Strategy: v1.DeploymentStrategy{}, + Template: *podTemplate, + Strategy: v1.DeploymentStrategy{}, }, } return provider.clientSet.AppsV1().Deployments(namespace).Create(ctx, deployment, metav1.CreateOptions{}) @@ -351,7 +350,7 @@ func (provider *Provider) CreateDeployment(ctx context.Context, namespace string func (provider *Provider) CreateService(ctx context.Context, namespace string, serviceName string, appLabelValue string) (*core.Service, error) { service := core.Service{ ObjectMeta: metav1.ObjectMeta{ - Name: serviceName, + Name: serviceName, }, Spec: core.ServiceSpec{ Ports: []core.ServicePort{{TargetPort: intstr.FromInt(shared.DefaultApiServerPort), Port: 80}}, @@ -383,8 +382,8 @@ func (provider *Provider) doesResourceExist(resource interface{}, err error) (bo func (provider *Provider) CreateMizuRBAC(ctx context.Context, namespace string, serviceAccountName string, clusterRoleName string, clusterRoleBindingName string, version string) error { serviceAccount := &core.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ - Name: serviceAccountName, - Labels: map[string]string{"mizu-cli-version": version}, + Name: serviceAccountName, + Labels: map[string]string{"mizu-cli-version": version}, }, } clusterRole := &rbac.ClusterRole{ @@ -436,8 +435,8 @@ func (provider *Provider) CreateMizuRBAC(ctx context.Context, namespace string, func (provider *Provider) CreateMizuRBACNamespaceRestricted(ctx context.Context, namespace string, serviceAccountName string, roleName string, roleBindingName string, version string) error { serviceAccount := &core.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ - Name: serviceAccountName, - Labels: map[string]string{"mizu-cli-version": version}, + Name: serviceAccountName, + Labels: map[string]string{"mizu-cli-version": version}, }, } role := &rbac.Role{ @@ -610,7 +609,7 @@ func (provider *Provider) CreateConfigMap(ctx context.Context, namespace string, APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ - Name: configMapName, + Name: configMapName, }, Data: configMapData, } @@ -853,9 +852,9 @@ func (provider *Provider) CreatePersistentVolumeClaim(ctx context.Context, names ObjectMeta: metav1.ObjectMeta{ Name: volumeClaimName, }, - Spec: core.PersistentVolumeClaimSpec{ - AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, - Resources: core.ResourceRequirements{ + Spec: core.PersistentVolumeClaimSpec{ + AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce}, + Resources: core.ResourceRequirements{ Limits: core.ResourceList{ core.ResourceStorage: *sizeLimitQuantity, }, diff --git a/shared/kubernetes/proxy.go b/shared/kubernetes/proxy.go index cfb69e4db..138bce331 100644 --- a/shared/kubernetes/proxy.go +++ b/shared/kubernetes/proxy.go @@ -28,9 +28,9 @@ func StartProxy(kubernetesProvider *Provider, proxyHost string, mizuPort uint16, return err } mux := http.NewServeMux() - mux.Handle(k8sProxyApiPrefix, proxyHandler) + mux.Handle(k8sProxyApiPrefix, getRerouteHttpHandlerMizuAPI(proxyHandler, mizuNamespace, mizuServiceName)) mux.Handle("/static/", getRerouteHttpHandlerMizuStatic(proxyHandler, mizuNamespace, mizuServiceName)) - mux.Handle("/mizu/", getRerouteHttpHandlerMizuAPI(proxyHandler, mizuNamespace, mizuServiceName)) + l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", proxyHost, int(mizuPort))) if err != nil { @@ -45,16 +45,21 @@ func StartProxy(kubernetesProvider *Provider, proxyHost string, mizuPort uint16, } func getMizuApiServerProxiedHostAndPath(mizuNamespace string, mizuServiceName string) string { - return fmt.Sprintf("/api/v1/namespaces/%s/services/%s:%d/proxy/", mizuNamespace, mizuServiceName, mizuServicePort) + return fmt.Sprintf("/api/v1/namespaces/%s/services/%s:%d/proxy", mizuNamespace, mizuServiceName, mizuServicePort) } func GetMizuApiServerProxiedHostAndPath(mizuPort uint16) string { - return fmt.Sprintf("localhost:%d/mizu", mizuPort) + return fmt.Sprintf("localhost:%d", mizuPort) } func getRerouteHttpHandlerMizuAPI(proxyHandler http.Handler, mizuNamespace string, mizuServiceName string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - r.URL.Path = strings.Replace(r.URL.Path, "/mizu/", getMizuApiServerProxiedHostAndPath(mizuNamespace, mizuServiceName), 1) + proxiedPath := getMizuApiServerProxiedHostAndPath(mizuNamespace, mizuServiceName) + + //avoid redirecting several times + if !strings.Contains(r.URL.Path, proxiedPath) { + r.URL.Path = fmt.Sprintf("%s%s", getMizuApiServerProxiedHostAndPath(mizuNamespace, mizuServiceName), r.URL.Path) + } proxyHandler.ServeHTTP(w, r) }) } diff --git a/ui/src/helpers/api.js b/ui/src/helpers/api.js index 216b5b0c4..3e6d1de65 100644 --- a/ui/src/helpers/api.js +++ b/ui/src/helpers/api.js @@ -1,16 +1,14 @@ import * as axios from "axios"; -const mizuAPIPathPrefix = "/mizu"; - // When working locally cp `cp .env.example .env` -export const MizuWebsocketURL = process.env.REACT_APP_OVERRIDE_WS_URL ? process.env.REACT_APP_OVERRIDE_WS_URL : `ws://${window.location.host}${mizuAPIPathPrefix}/ws`; +export const MizuWebsocketURL = process.env.REACT_APP_OVERRIDE_WS_URL ? process.env.REACT_APP_OVERRIDE_WS_URL : `ws://${window.location.host}/ws`; export default class Api { constructor() { // When working locally cp `cp .env.example .env` - const apiURL = process.env.REACT_APP_OVERRIDE_API_URL ? process.env.REACT_APP_OVERRIDE_API_URL : `${window.location.origin}${mizuAPIPathPrefix}/`; + const apiURL = process.env.REACT_APP_OVERRIDE_API_URL ? process.env.REACT_APP_OVERRIDE_API_URL : `${window.location.origin}/`; this.client = axios.create({ baseURL: apiURL, From 67e9cc10999be84f58a1f32a3654a9d5f6e79817 Mon Sep 17 00:00:00 2001 From: RamiBerm <54766858+RamiBerm@users.noreply.github.com> Date: Mon, 8 Nov 2021 13:23:36 +0200 Subject: [PATCH 04/93] fix readme titles (#442) --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8d3c38a4a..878664c05 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ To tap all pods in current namespace - ``` -###To tap specific pod +### To tap specific pod ```bash $ kubectl get pods NAME READY STATUS RESTARTS AGE @@ -96,7 +96,7 @@ To tap all pods in current namespace - ^C ``` -###To tap multiple pods using regex +### To tap multiple pods using regex ```bash $ kubectl get pods NAME READY STATUS RESTARTS AGE @@ -111,7 +111,7 @@ To tap all pods in current namespace - Web interface is now available at http://localhost:8899 ^C ``` -###To run mizu mizu daemon mode (detached from cli) +### To run mizu mizu daemon mode (detached from cli) ```bash $ mizu tap "^ca.*" --daemon Mizu will store up to 200MB of traffic, old traffic will be cleared once the limit is reached. @@ -133,7 +133,7 @@ $ mizu clean # mizu will continue running in cluster until clean is executed -###To run mizu daemon mode with LoadBalancer kubernetes service +### To run mizu daemon mode with LoadBalancer kubernetes service ```bash $ mizu tap "^ca.*" --daemon Mizu will store up to 200MB of traffic, old traffic will be cleared once the limit is reached. From 31d95c65570a1fee760f7a9402361b9d36eec8a6 Mon Sep 17 00:00:00 2001 From: gadotroee <55343099+gadotroee@users.noreply.github.com> Date: Mon, 8 Nov 2021 14:49:25 +0200 Subject: [PATCH 05/93] Auto close inactive issues (#441) --- .github/workflows/inactive-issues-close.yaml | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/inactive-issues-close.yaml diff --git a/.github/workflows/inactive-issues-close.yaml b/.github/workflows/inactive-issues-close.yaml new file mode 100644 index 000000000..e8509276f --- /dev/null +++ b/.github/workflows/inactive-issues-close.yaml @@ -0,0 +1,22 @@ +name: Close inactive issues +on: + schedule: + - cron: "0 0 * * *" + +jobs: + close-issues: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/stale@v3 + with: + days-before-issue-stale: 30 + days-before-issue-close: 14 + stale-issue-label: "stale" + stale-issue-message: "This issue is stale because it has been open for 30 days with no activity." + close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." + days-before-pr-stale: -1 + days-before-pr-close: -1 + repo-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From d2fe3f6620de63c91f425058b3d2b47c28855b51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Tue, 9 Nov 2021 19:54:48 +0300 Subject: [PATCH 06/93] Migrate from SQLite to Basenine and introduce a new filtering syntax (#279) * Fix the OOMKilled error by calling `debug.FreeOSMemory` periodically * Remove `MAX_NUMBER_OF_GOROUTINES` environment variable * Change the line * Increase the default value of `TCP_STREAM_CHANNEL_TIMEOUT_MS` to `10000` * Write the client and integrate to the new real-time database * Refactor the WebSocket implementaiton for `/ws` * Adapt the UI to the new filtering system * Fix the rest of the issues in the UI * Increase the buffer of the scanner * Implement accessing single records * Increase the buffer of another scanner * Populate `Request` and `Response` fields of `MizuEntry` * Add syntax highlighting for the query * Add database to `Dockerfile` * Fix some issues * Update the `realtime_dbms` Git module commit hash * Upgrade Gin version and print the query string * Revert "Upgrade Gin version and print the query string" This reverts commit aa09f904ee34c9906d1035d4f192c315ff563f12. * Use WebSocket's itself to query instead of the query string * Fix some errors related to conversion to HAR * Fix the issues caused by the latest merge * Fix the build error * Fix PR validation GitHub workflow * Replace the git submodule with latest Basenine version `0.1.0` Remove `realtime_client.go` and use the official client library `github.com/up9inc/basenine/client/go` instead. * Move Basenine host and port constants to `shared` module * Reliably execute and wait for Basenine to become available * Upgrade Basenine version * Properly close WebSocket and data channel * Fix the issues caused by the recent merge commit * Clean up the TypeScript code * Update `.gitignore` * Limit the database size * Add `Macros` method signature to `Dissector` interface and set the macros provided by the protocol extensions * Run `go mod tidy` on `agent` * Upgrade `github.com/up9inc/basenine/client/go` version * Implement a mechanism to update the query using click events in the UI and use it for protocol macros * Update the query on click to timestamps * Fix some issues in the WebSocket and channel handling * Update the query on clicks to status code * Update the query on clicks to method, path and service * Update the query on clicks to is outgoing, source and destination ports * Add an API endpoint to validate the query against syntax errors * Move the query background color state into `TrafficPage` * Fix the logic in `setQuery` * Display a toast message in case of a syntax error in the query * Remove a call to `fmt.Printf` * Upgrade Basenine version to `0.1.3` * Fix an issue related to getting `MAX_ENTRIES_DB_BYTES` environment variable * Have the `path` key in request details, in HTTP * Rearrange the HTTP headers for the querying * Do the same thing for `cookies` and `queryString` * Update the query on click to table elements Add the selectors for `TABLE` type representations in HTTP extension. * Update the query on click to `bodySize` and `elapsedTime` in `EntryTitle` * Add the selectors for `TABLE` type representations in AMQP extension * Add the selectors for `TABLE` type representations in Kafka extension * Add the selectors for `TABLE` type representations in Redis extension * Define a struct in `tap/api.go` for the section representation data * Add the selectors for `BODY` type representations * Add `request.path` to the HTTP request details * Change the summary string's field name from `path` to `summary` * Introduce `queryable` CSS class for queryable UI elements and underline them on hover * Instead of `N requests` at the bottom, make it `Displaying N results (queried X/Y)` and live update the values Upgrade Basenine version to `0.2.0`. * Verify the sha256sum of Basenine executable inside `Dockerfile` * Pass the start time to web UI through WebSocket and always show the `EntriesList` footer * Pipe the `stderr` of Basenine as well * Fix the layout issues related to `CodeEditor` in the UI * Use the correct `shasum` command in `Dockerfile` * Upgrade Basenine version to `0.2.1` * Limit the height of `CodeEditor` container * Remove `Paused` enum `ConnectionStatus` in UI * Fix the issue caused by the recent merge * Add the filtering guide (cheatsheet) * Update open cheatsheet button's title * Update cheatsheet content * Remove the old SQLite code, adapt the `--analyze` related code to Basenine * Change the method signature of `NewEntry` * Change the method signature of `Represent` * Introduce `HTTPPair` field in `MizuEntry` specific to HTTP * Remove `Entry`, `EntryId` and `EstimatedSizeBytes` fields from `MizuEntry` Also remove the `getEstimatedEntrySizeBytes` method. * Remove `gorm.io/gorm` dependency * Remove unused `sensitiveDataFiltering` folder * Increase the left margin of open cheatsheet button * Add `overflow: auto` to the cheatsheet `Modal` * Fix `GetEntry` method * Fix the macro for gRPC * Fix an interface conversion in case of AMQP * Fix two more interface conversion errors in AMQP * Make the `syncEntriesImpl` method blocking * Fix a grammar mistake in the cheatsheet * Adapt to the changes in the recent merge commit * Improve the cheatsheet text * Always display the timestamp in `en-US` * Upgrade Basenine version to `0.2.2` * Fix the order of closing Basenine connections and channels * Don't close the Basenine channels at all * Upgrade Basenine version to `0.2.3` * Set the initial filter to `rlimit(100)` * Make Basenine persistent * Upgrade Basenine version to `0.2.4` * Update `debug.Dockerfile` * Fix a failing test * Upgrade Basenine version to `0.2.5` * Revert "Do not show play icon when disconnected (#428)" This reverts commit 8af2e562f8f5fd384731612ed6861e956937d03f. * Upgrade Basenine version to `0.2.6` * Make all non-informative things informative * Make `100` a constant * Use `===` in JavaScript no matter what * Remove a forgotten `console.log` * Add a comment and update the `query` in `syncEntriesImpl` * Don't call `panic` in `GetEntry` * Replace `panic` calls in `startBasenineServer` with `logger.Log.Panicf` * Remove unnecessary `\n` characters in the logs --- .gitignore | 3 + Dockerfile | 12 +- acceptanceTests/tap_test.go | 6 +- agent/go.mod | 7 +- agent/go.sum | 76 +- agent/main.go | 73 +- agent/pkg/api/main.go | 48 +- agent/pkg/api/socket_routes.go | 101 +- agent/pkg/controllers/entries_controller.go | 89 +- agent/pkg/controllers/query_controller.go | 31 + agent/pkg/database/main.go | 78 -- agent/pkg/database/size_enforcer.go | 102 -- agent/pkg/models/models.go | 65 +- agent/pkg/providers/stats_provider_test.go | 6 - agent/pkg/routes/entries_routes.go | 6 +- agent/pkg/routes/query_routes.go | 13 + agent/pkg/sensitiveDataFiltering/consts.go | 10 - agent/pkg/up9/main.go | 117 ++- agent/pkg/utils/har.go | 56 +- agent/pkg/utils/truncating_logger.go | 60 -- cli/config/config.go | 7 +- debug.Dockerfile | 12 +- shared/consts.go | 2 + shared/models.go | 3 + tap/api/api.go | 108 ++- tap/extensions/amqp/helpers.go | 591 ++++++------ tap/extensions/amqp/main.go | 111 ++- tap/extensions/amqp/spec091.go | 98 +- tap/extensions/amqp/types.go | 26 +- tap/extensions/http/helpers.go | 35 + tap/extensions/http/main.go | 263 +++--- tap/extensions/kafka/helpers.go | 617 ++++++------ tap/extensions/kafka/main.go | 135 +-- tap/extensions/kafka/request.go | 14 +- tap/extensions/kafka/response.go | 8 +- tap/extensions/kafka/structs.go | 894 +++++++++--------- tap/extensions/redis/helpers.go | 38 +- tap/extensions/redis/main.go | 86 +- ui/package-lock.json | 350 +++++++ ui/package.json | 3 + ui/src/components/EntriesList.tsx | 121 +-- ui/src/components/EntryDetailed.tsx | 57 +- .../EntryDetailed/EntrySections.tsx | 42 +- .../components/EntryDetailed/EntryViewer.tsx | 16 +- .../EntryListItem/EntryListItem.tsx | 79 +- ui/src/components/Filters.tsx | 398 +++++--- ui/src/components/TrafficPage.tsx | 153 ++- ui/src/components/UI/EndpointPath.tsx | 15 - ui/src/components/UI/FilterSelect.tsx | 28 - ui/src/components/UI/Protocol.tsx | 35 +- ui/src/components/UI/StatusCode.tsx | 11 +- ui/src/components/UI/Summary.tsx | 32 + .../UI/SyntaxHighlighter/highlighterStyle.ts | 2 +- .../components/UI/style/Protocol.module.sass | 1 - ...ntPath.module.sass => Summary.module.sass} | 4 +- .../components/assets/filter-ui-example-1.png | Bin 0 -> 41498 bytes .../components/assets/filter-ui-example-2.png | Bin 0 -> 16773 bytes .../components/style/EntriesList.module.sass | 9 - ui/src/components/style/Filters.module.sass | 7 +- ui/src/components/style/TrafficPage.sass | 5 + ui/src/helpers/api.js | 16 +- ui/src/index.sass | 13 +- 62 files changed, 3077 insertions(+), 2327 deletions(-) create mode 100644 agent/pkg/controllers/query_controller.go delete mode 100644 agent/pkg/database/main.go delete mode 100644 agent/pkg/database/size_enforcer.go create mode 100644 agent/pkg/routes/query_routes.go delete mode 100644 agent/pkg/sensitiveDataFiltering/consts.go delete mode 100644 agent/pkg/utils/truncating_logger.go create mode 100644 tap/extensions/http/helpers.go delete mode 100644 ui/src/components/UI/EndpointPath.tsx delete mode 100644 ui/src/components/UI/FilterSelect.tsx create mode 100644 ui/src/components/UI/Summary.tsx rename ui/src/components/UI/style/{EndpointPath.module.sass => Summary.module.sass} (75%) create mode 100644 ui/src/components/assets/filter-ui-example-1.png create mode 100644 ui/src/components/assets/filter-ui-example-2.png diff --git a/.gitignore b/.gitignore index 4d5c55b7e..e3efed6b5 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,6 @@ build # pprof pprof/* + +# Database Files +*.bin diff --git a/Dockerfile b/Dockerfile index 65b7b46ea..9345df30c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ FROM golang:1.16-alpine AS builder # Set necessary environment variables needed for our image. ENV CGO_ENABLED=1 GOOS=linux GOARCH=amd64 -RUN apk add libpcap-dev gcc g++ make bash +RUN apk add libpcap-dev gcc g++ make bash perl-utils # Move to agent working directory (/agent-build). WORKDIR /app/agent-build @@ -24,7 +24,7 @@ COPY tap/go.mod tap/go.mod ../tap/ COPY tap/api/go.* ../tap/api/ RUN go mod download # cheap trick to make the build faster (As long as go.mod wasn't changes) -RUN go list -f '{{.Path}}@{{.Version}}' -m all | sed 1d | grep -e 'go-cache' -e 'sqlite' | xargs go get +RUN go list -f '{{.Path}}@{{.Version}}' -m all | sed 1d | grep -e 'go-cache' | xargs go get ARG COMMIT_HASH ARG GIT_BRANCH @@ -41,16 +41,24 @@ RUN go build -ldflags="-s -w \ -X 'mizuserver/pkg/version.BuildTimestamp=${BUILD_TIMESTAMP}' \ -X 'mizuserver/pkg/version.SemVer=${SEM_VER}'" -o mizuagent . +# Download Basenine executable, verify the sha1sum and move it to a directory in $PATH +ADD https://github.com/up9inc/basenine/releases/download/v0.2.6/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.6/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +RUN shasum -a 256 -c basenine_linux_amd64.sha256 +RUN chmod +x ./basenine_linux_amd64 + COPY devops/build_extensions.sh .. RUN cd .. && /bin/bash build_extensions.sh FROM alpine:3.14 RUN apk add bash libpcap-dev tcpdump + WORKDIR /app # Copy binary and config files from /build to root folder of scratch container. COPY --from=builder ["/app/agent-build/mizuagent", "."] +COPY --from=builder ["/app/agent-build/basenine_linux_amd64", "/usr/local/bin/basenine"] COPY --from=builder ["/app/agent/build/extensions", "extensions"] COPY --from=site-build ["/app/ui-build/build", "site"] RUN mkdir /app/data/ diff --git a/acceptanceTests/tap_test.go b/acceptanceTests/tap_test.go index 02bca771f..ebee856de 100644 --- a/acceptanceTests/tap_test.go +++ b/acceptanceTests/tap_test.go @@ -472,7 +472,7 @@ func TestTapRedact(t *testing.T) { entryPayload := entryRequest["payload"].(map[string]interface{}) entryDetails := entryPayload["details"].(map[string]interface{}) - headers := entryDetails["headers"].([]interface{}) + headers := entryDetails["_headers"].([]interface{}) for _, headerInterface := range headers { header := headerInterface.(map[string]interface{}) if header["name"].(string) != "User-Agent" { @@ -587,7 +587,7 @@ func TestTapNoRedact(t *testing.T) { entryPayload := entryRequest["payload"].(map[string]interface{}) entryDetails := entryPayload["details"].(map[string]interface{}) - headers := entryDetails["headers"].([]interface{}) + headers := entryDetails["_headers"].([]interface{}) for _, headerInterface := range headers { header := headerInterface.(map[string]interface{}) if header["name"].(string) != "User-Agent" { @@ -808,7 +808,7 @@ func TestTapIgnoredUserAgents(t *testing.T) { entryPayload := entryRequest["payload"].(map[string]interface{}) entryDetails := entryPayload["details"].(map[string]interface{}) - entryHeaders := entryDetails["headers"].([]interface{}) + entryHeaders := entryDetails["_headers"].([]interface{}) for _, headerInterface := range entryHeaders { header := headerInterface.(map[string]interface{}) if header["name"].(string) != ignoredUserAgentCustomHeader { diff --git a/agent/go.mod b/agent/go.mod index 905c80f0b..f1af6b2fb 100644 --- a/agent/go.mod +++ b/agent/go.mod @@ -3,8 +3,8 @@ module mizuserver go 1.16 require ( + github.com/antelman107/net-wait-go v0.0.0-20210623112055-cf684aebda7b github.com/djherbis/atime v1.0.0 - github.com/fsnotify/fsnotify v1.4.9 github.com/getkin/kin-openapi v0.76.0 github.com/gin-contrib/static v0.0.1 github.com/gin-gonic/gin v1.7.2 @@ -16,13 +16,12 @@ require ( github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/orcaman/concurrent-map v0.0.0-20210106121528-16402b402231 github.com/patrickmn/go-cache v2.1.0+incompatible + github.com/up9inc/basenine/client/go v0.0.0-20211106180626-0193408db715 github.com/up9inc/mizu/shared v0.0.0 github.com/up9inc/mizu/tap v0.0.0 github.com/up9inc/mizu/tap/api v0.0.0 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 - go.mongodb.org/mongo-driver v1.7.1 - gorm.io/driver/sqlite v1.1.4 - gorm.io/gorm v1.21.8 + golang.org/x/text v0.3.5 // indirect k8s.io/api v0.21.2 k8s.io/apimachinery v0.21.2 k8s.io/client-go v0.21.2 diff --git a/agent/go.sum b/agent/go.sum index 52d06e485..fe9b06095 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -52,6 +52,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/antelman107/net-wait-go v0.0.0-20210623112055-cf684aebda7b h1:8m+eVxVVDDyJFidv7Ck1OwqnDaQR6pTSRGlCC2Dnw0A= +github.com/antelman107/net-wait-go v0.0.0-20210623112055-cf684aebda7b/go.mod h1:+tQQjzrp2501Nd6JXrb9s/XsNvFK3ZbxOnCdQl/vDRo= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -94,7 +96,6 @@ github.com/djherbis/atime v1.0.0 h1:ySLvBAM0EvOGaX7TI4dAM5lWj+RdJUCKtGSEHN8SGBg= github.com/djherbis/atime v1.0.0/go.mod h1:5W+KBIuTwVGcqjIfaTwt+KSYX1o6uep8dtevevQP/f8= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -111,7 +112,6 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/getkin/kin-openapi v0.76.0 h1:j77zg3Ec+k+r+GA3d8hBoXpAc6KX9TbBPrwQGBIy2sY= @@ -195,31 +195,7 @@ github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn github.com/go-playground/validator/v10 v10.5.0 h1:X9rflw/KmpACwT8zdrm1upefpvdy6ur8d1kWyq6sg3E= github.com/go-playground/validator/v10 v10.5.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -251,7 +227,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -321,12 +296,6 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= -github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -336,14 +305,10 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -364,16 +329,12 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.14.5 h1:1IdxlwTNazvbKJQSxoJ5/9ECbEeaTTyeU7sEAZ5KKTQ= -github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -395,7 +356,6 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= @@ -419,7 +379,6 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -447,8 +406,6 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -458,8 +415,6 @@ github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAm github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= @@ -468,7 +423,6 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= @@ -485,8 +439,9 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -495,26 +450,22 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/up9inc/basenine/client/go v0.0.0-20211106180626-0193408db715 h1:3RNTMQZO/4g5gRn4R98cPwCjCrsMklmcOS0g+QwCh5c= +github.com/up9inc/basenine/client/go v0.0.0-20211106180626-0193408db715/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.7.1 h1:jwqTeEM3x6L9xDXrCxN0Hbg7vdGfPBOTIkr0+/LYZDA= -go.mongodb.org/mongo-driver v1.7.1/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -527,13 +478,11 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= @@ -611,7 +560,6 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -625,13 +573,10 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -685,13 +630,9 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -805,11 +746,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/sqlite v1.1.4 h1:PDzwYE+sI6De2+mxAneV9Xs11+ZyKV6oxD3wDGkaNvM= -gorm.io/driver/sqlite v1.1.4/go.mod h1:mJCeTFr7+crvS+TRnWc5Z3UvwxUN1BGBLMrf5LA9DYw= -gorm.io/gorm v1.20.7/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v1.21.8 h1:2CEwZSzogdhsKPlJ9OvBKTdlWIpELXb6HbfLfMNhSYI= -gorm.io/gorm v1.21.8/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/agent/main.go b/agent/main.go index 51ffc9a41..907920203 100644 --- a/agent/main.go +++ b/agent/main.go @@ -6,13 +6,10 @@ import ( "errors" "flag" "fmt" - "github.com/up9inc/mizu/shared/kubernetes" "io/ioutil" - v1 "k8s.io/api/core/v1" "mizuserver/pkg/api" "mizuserver/pkg/config" "mizuserver/pkg/controllers" - "mizuserver/pkg/database" "mizuserver/pkg/models" "mizuserver/pkg/providers" "mizuserver/pkg/routes" @@ -20,6 +17,7 @@ import ( "mizuserver/pkg/utils" "net/http" "os" + "os/exec" "os/signal" "path" "path/filepath" @@ -28,10 +26,15 @@ import ( "syscall" "time" + "github.com/up9inc/mizu/shared/kubernetes" + v1 "k8s.io/api/core/v1" + + "github.com/antelman107/net-wait-go/wait" "github.com/gin-contrib/static" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "github.com/op/go-logging" + basenine "github.com/up9inc/basenine/client/go" "github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared/logger" "github.com/up9inc/mizu/tap" @@ -49,10 +52,12 @@ var harsDir = flag.String("hars-dir", "", "Directory to read hars from") var extensions []*tapApi.Extension // global var extensionsMap map[string]*tapApi.Extension // global +var startTime int64 + const ( - socketConnectionRetries = 10 + socketConnectionRetries = 10 socketConnectionRetryDelay = time.Second * 2 - socketHandshakeTimeout = time.Second * 2 + socketHandshakeTimeout = time.Second * 2 ) func main() { @@ -109,7 +114,8 @@ func main() { go pipeTapChannelToSocket(socketConnection, filteredOutputItemsChannel) } else if *apiServerMode { - database.InitDataBase(config.Config.AgentDatabasePath) + startBasenineServer(shared.BasenineHost, shared.BaseninePort) + startTime = time.Now().UnixNano() / int64(time.Millisecond) api.StartResolving(*namespace) outputItemsChannel := make(chan *tapApi.OutputChannelItem) @@ -142,6 +148,53 @@ func main() { logger.Log.Info("Exiting") } +func startBasenineServer(host string, port string) { + cmd := exec.Command("basenine", "-addr", host, "-port", port, "-persistent") + cmd.Dir = config.Config.AgentDatabasePath + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err := cmd.Start() + if err != nil { + logger.Log.Panicf("Failed starting Basenine: %v", err) + } + + if !wait.New( + wait.WithProto("tcp"), + wait.WithWait(200*time.Millisecond), + wait.WithBreak(50*time.Millisecond), + wait.WithDeadline(5*time.Second), + wait.WithDebug(true), + ).Do([]string{fmt.Sprintf("%s:%s", host, port)}) { + logger.Log.Panicf("Basenine is not available: %v", err) + } + + // Make a channel to gracefully exit Basenine. + channel := make(chan os.Signal) + signal.Notify(channel, os.Interrupt, syscall.SIGTERM) + + // Handle the channel. + go func() { + <-channel + cmd.Process.Signal(syscall.SIGTERM) + }() + + // Limit the database size to default 200MB + err = basenine.Limit(host, port, config.Config.MaxDBSizeBytes) + if err != nil { + logger.Log.Panicf("Error while limiting database size: %v", err) + } + + for _, extension := range extensions { + macros := extension.Dissector.Macros() + for macro, expanded := range macros { + err = basenine.Macro(host, port, macro, expanded) + if err != nil { + logger.Log.Panicf("Error while adding a macro: %v", err) + } + } + } +} + func loadExtensions() { dir, _ := filepath.Abs(filepath.Dir(os.Args[0])) extensionsDir := path.Join(dir, "./extensions/") @@ -200,7 +253,8 @@ func hostApi(socketHarOutputChannel chan<- *tapApi.OutputChannelItem) { app.Use(static.ServeRoot("/", "./site")) app.Use(CORSMiddleware()) // This has to be called after the static middleware, does not work if its called before - api.WebSocketRoutes(app, &eventHandlers) + api.WebSocketRoutes(app, &eventHandlers, startTime) + routes.QueryRoutes(app) routes.EntriesRoutes(app) routes.MetadataRoutes(app) routes.StatusRoutes(app) @@ -361,7 +415,7 @@ func dialSocketWithRetry(socketAddress string, retryAmount int, retryDelay time. socketConnection, _, err := dialer.Dial(socketAddress, nil) if err != nil { if i < retryAmount { - logger.Log.Infof("socket connection to %s failed: %v, retrying %d out of %d in %d seconds...", socketAddress, err, i, retryAmount, retryDelay / time.Second) + logger.Log.Infof("socket connection to %s failed: %v, retrying %d out of %d in %d seconds...", socketAddress, err, i, retryAmount, retryDelay/time.Second) time.Sleep(retryDelay) } } else { @@ -371,8 +425,7 @@ func dialSocketWithRetry(socketAddress string, retryAmount int, retryDelay time. return nil, lastErr } - -func startMizuTapperSyncer(ctx context.Context) (*kubernetes.MizuTapperSyncer, error){ +func startMizuTapperSyncer(ctx context.Context) (*kubernetes.MizuTapperSyncer, error) { provider, err := kubernetes.NewProviderInCluster() if err != nil { return nil, err diff --git a/agent/pkg/api/main.go b/agent/pkg/api/main.go index 56968ff3c..8bfc65787 100644 --- a/agent/pkg/api/main.go +++ b/agent/pkg/api/main.go @@ -5,7 +5,6 @@ import ( "context" "encoding/json" "fmt" - "mizuserver/pkg/database" "mizuserver/pkg/holder" "mizuserver/pkg/providers" "os" @@ -14,15 +13,16 @@ import ( "strings" "time" - "go.mongodb.org/mongo-driver/bson/primitive" - "github.com/google/martian/har" + "github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared/logger" tapApi "github.com/up9inc/mizu/tap/api" "mizuserver/pkg/models" "mizuserver/pkg/resolver" "mizuserver/pkg/utils" + + basenine "github.com/up9inc/basenine/client/go" ) var k8sResolver *resolver.Resolver @@ -99,6 +99,12 @@ func startReadingChannel(outputItems <-chan *tapApi.OutputChannelItem, extension panic("Channel of captured messages is nil") } + connection, err := basenine.NewConnection(shared.BasenineHost, shared.BaseninePort) + if err != nil { + panic(err) + } + connection.InsertMode() + disableOASValidation := false ctx := context.Background() doc, contractContent, router, err := loadOAS(ctx) @@ -112,13 +118,13 @@ func startReadingChannel(outputItems <-chan *tapApi.OutputChannelItem, extension extension := extensionsMap[item.Protocol.Name] resolvedSource, resolvedDestionation := resolveIP(item.ConnectionInfo) - mizuEntry := extension.Dissector.Analyze(item, primitive.NewObjectID().Hex(), resolvedSource, resolvedDestionation) + mizuEntry := extension.Dissector.Analyze(item, resolvedSource, resolvedDestionation) baseEntry := extension.Dissector.Summarize(mizuEntry) - mizuEntry.EstimatedSizeBytes = getEstimatedEntrySizeBytes(mizuEntry) + mizuEntry.Base = baseEntry if extension.Protocol.Name == "http" { if !disableOASValidation { var httpPair tapApi.HTTPRequestResponsePair - json.Unmarshal([]byte(mizuEntry.Entry), &httpPair) + json.Unmarshal([]byte(mizuEntry.HTTPPair), &httpPair) contract := handleOAS(ctx, doc, router, httpPair.Request.Payload.RawRequest, httpPair.Response.Payload.RawResponse, contractContent) baseEntry.ContractStatus = contract.Status @@ -128,18 +134,18 @@ func startReadingChannel(outputItems <-chan *tapApi.OutputChannelItem, extension mizuEntry.ContractContent = contract.Content } - var pair tapApi.RequestResponsePair - json.Unmarshal([]byte(mizuEntry.Entry), &pair) - harEntry, err := utils.NewEntry(&pair) + harEntry, err := utils.NewEntry(mizuEntry.Request, mizuEntry.Response, mizuEntry.StartTime, mizuEntry.ElapsedTime) if err == nil { rules, _, _ := models.RunValidationRulesState(*harEntry, mizuEntry.Service) baseEntry.Rules = rules } } - database.CreateEntry(mizuEntry) - baseEntryBytes, _ := models.CreateBaseEntryWebSocketMessage(baseEntry) - BroadcastToBrowserClients(baseEntryBytes) + data, err := json.Marshal(mizuEntry) + if err != nil { + panic(err) + } + connection.SendText(string(data)) } } @@ -171,21 +177,3 @@ func CheckIsServiceIP(address string) bool { } return k8sResolver.CheckIsServiceIP(address) } - -// gives a rough estimate of the size this will take up in the db, good enough for maintaining db size limit accurately -func getEstimatedEntrySizeBytes(mizuEntry *tapApi.MizuEntry) int { - sizeBytes := len(mizuEntry.Entry) - sizeBytes += len(mizuEntry.EntryId) - sizeBytes += len(mizuEntry.Service) - sizeBytes += len(mizuEntry.Url) - sizeBytes += len(mizuEntry.Method) - sizeBytes += len(mizuEntry.RequestSenderIp) - sizeBytes += len(mizuEntry.ResolvedDestination) - sizeBytes += len(mizuEntry.ResolvedSource) - sizeBytes += 8 // Status bytes (sqlite integer is always 8 bytes) - sizeBytes += 8 // Timestamp bytes - sizeBytes += 8 // SizeBytes bytes - sizeBytes += 1 // IsOutgoing bytes - - return sizeBytes -} diff --git a/agent/pkg/api/socket_routes.go b/agent/pkg/api/socket_routes.go index 7e765268c..dff86157f 100644 --- a/agent/pkg/api/socket_routes.go +++ b/agent/pkg/api/socket_routes.go @@ -1,13 +1,18 @@ package api import ( + "encoding/json" "errors" + "fmt" + "mizuserver/pkg/models" "net/http" "sync" "time" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" + basenine "github.com/up9inc/basenine/client/go" + "github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared/debounce" "github.com/up9inc/mizu/shared/logger" ) @@ -39,17 +44,17 @@ func init() { connectedWebsockets = make(map[int]*SocketConnection, 0) } -func WebSocketRoutes(app *gin.Engine, eventHandlers EventHandlers) { +func WebSocketRoutes(app *gin.Engine, eventHandlers EventHandlers, startTime int64) { app.GET("/ws", func(c *gin.Context) { - websocketHandler(c.Writer, c.Request, eventHandlers, false) + websocketHandler(c.Writer, c.Request, eventHandlers, false, startTime) }) app.GET("/wsTapper", func(c *gin.Context) { - websocketHandler(c.Writer, c.Request, eventHandlers, true) + websocketHandler(c.Writer, c.Request, eventHandlers, true, startTime) }) } -func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers EventHandlers, isTapper bool) { - conn, err := websocketUpgrader.Upgrade(w, r, nil) +func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers EventHandlers, isTapper bool, startTime int64) { + ws, err := websocketUpgrader.Upgrade(w, r, nil) if err != nil { logger.Log.Errorf("Failed to set websocket upgrade: %v", err) return @@ -59,23 +64,103 @@ func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers Even connectedWebsocketIdCounter++ socketId := connectedWebsocketIdCounter - connectedWebsockets[socketId] = &SocketConnection{connection: conn, lock: &sync.Mutex{}, eventHandlers: eventHandlers, isTapper: isTapper} + connectedWebsockets[socketId] = &SocketConnection{connection: ws, lock: &sync.Mutex{}, eventHandlers: eventHandlers, isTapper: isTapper} websocketIdsLock.Unlock() + var connection *basenine.Connection + var isQuerySet bool + + // `!isTapper` means it's a connection from the web UI + if !isTapper { + connection, err = basenine.NewConnection(shared.BasenineHost, shared.BaseninePort) + if err != nil { + panic(err) + } + } + + data := make(chan []byte) + meta := make(chan []byte) + defer func() { + data <- []byte(basenine.CloseChannel) + meta <- []byte(basenine.CloseChannel) + connection.Close() socketCleanup(socketId, connectedWebsockets[socketId]) }() eventHandlers.WebSocketConnect(socketId, isTapper) + startTimeBytes, _ := models.CreateWebsocketStartTimeMessage(startTime) + BroadcastToBrowserClients(startTimeBytes) + for { - _, msg, err := conn.ReadMessage() + _, msg, err := ws.ReadMessage() if err != nil { logger.Log.Errorf("Error reading message, socket id: %d, error: %v", socketId, err) break } - eventHandlers.WebSocketMessage(socketId, msg) + + if !isTapper && !isQuerySet { + query := string(msg) + err = basenine.Validate(shared.BasenineHost, shared.BaseninePort, query) + if err != nil { + toastBytes, _ := models.CreateWebsocketToastMessage(&models.ToastMessage{ + Type: "error", + AutoClose: 5000, + Text: fmt.Sprintf("Syntax error: %s", err.Error()), + }) + BroadcastToBrowserClients(toastBytes) + break + } + + isQuerySet = true + + handleDataChannel := func(c *basenine.Connection, data chan []byte) { + for { + bytes := <-data + + if string(bytes) == basenine.CloseChannel { + return + } + + var dataMap map[string]interface{} + err = json.Unmarshal(bytes, &dataMap) + + base := dataMap["base"].(map[string]interface{}) + base["id"] = uint(dataMap["id"].(float64)) + + baseEntryBytes, _ := models.CreateBaseEntryWebSocketMessage(base) + BroadcastToBrowserClients(baseEntryBytes) + } + } + + handleMetaChannel := func(c *basenine.Connection, meta chan []byte) { + for { + bytes := <-meta + + if string(bytes) == basenine.CloseChannel { + return + } + + var metadata *basenine.Metadata + err = json.Unmarshal(bytes, &metadata) + if err != nil { + logger.Log.Debugf("Error recieving metadata: %v\n", err.Error()) + } + + metadataBytes, _ := models.CreateWebsocketQueryMetadataMessage(metadata) + BroadcastToBrowserClients(metadataBytes) + } + } + + go handleDataChannel(connection, data) + go handleMetaChannel(connection, meta) + + connection.Query(query, data, meta) + } else { + eventHandlers.WebSocketMessage(socketId, msg) + } } } diff --git a/agent/pkg/controllers/entries_controller.go b/agent/pkg/controllers/entries_controller.go index 32422d5e4..8b900b23d 100644 --- a/agent/pkg/controllers/entries_controller.go +++ b/agent/pkg/controllers/entries_controller.go @@ -2,14 +2,17 @@ package controllers import ( "encoding/json" - "fmt" - "github.com/gin-gonic/gin" - tapApi "github.com/up9inc/mizu/tap/api" - "mizuserver/pkg/database" "mizuserver/pkg/models" "mizuserver/pkg/utils" - "mizuserver/pkg/validation" "net/http" + "strconv" + + "github.com/gin-gonic/gin" + + basenine "github.com/up9inc/basenine/client/go" + "github.com/up9inc/mizu/shared" + "github.com/up9inc/mizu/shared/logger" + tapApi "github.com/up9inc/mizu/tap/api" ) var extensionsMap map[string]*tapApi.Extension // global @@ -18,68 +21,36 @@ func InitExtensionsMap(ref map[string]*tapApi.Extension) { extensionsMap = ref } -func GetEntries(c *gin.Context) { - entriesFilter := &models.EntriesFilter{} - - if err := c.BindQuery(entriesFilter); err != nil { - c.JSON(http.StatusBadRequest, err) - } - err := validation.Validate(entriesFilter) +func Error(c *gin.Context, err error) bool { if err != nil { - c.JSON(http.StatusBadRequest, err) + logger.Log.Errorf("Error getting entry: %v", err) + c.Error(err) + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": true, "msg": err.Error()}) + return true // signal that there was an error and the caller should return } - - order := database.OperatorToOrderMapping[entriesFilter.Operator] - operatorSymbol := database.OperatorToSymbolMapping[entriesFilter.Operator] - var entries []tapApi.MizuEntry - database.GetEntriesTable(). - Order(fmt.Sprintf("timestamp %s", order)). - Where(fmt.Sprintf("timestamp %s %v", operatorSymbol, entriesFilter.Timestamp)). - Limit(entriesFilter.Limit). - Find(&entries) - - if len(entries) > 0 && order == database.OrderDesc { - // the entries always order from oldest to newest - we should reverse - utils.ReverseSlice(entries) - } - - baseEntries := make([]tapApi.BaseEntryDetails, 0) - for _, entry := range entries { - baseEntryDetails := tapApi.BaseEntryDetails{} - if err := models.GetEntry(&entry, &baseEntryDetails); err != nil { - continue - } - - var pair tapApi.RequestResponsePair - json.Unmarshal([]byte(entry.Entry), &pair) - harEntry, err := utils.NewEntry(&pair) - if err == nil { - rules, _, _ := models.RunValidationRulesState(*harEntry, entry.Service) - baseEntryDetails.Rules = rules - } - - baseEntries = append(baseEntries, baseEntryDetails) - } - - c.JSON(http.StatusOK, baseEntries) + return false // no error, can continue } func GetEntry(c *gin.Context) { - var entryData tapApi.MizuEntry - database.GetEntriesTable(). - Where(map[string]string{"entryId": c.Param("entryId")}). - First(&entryData) + id, _ := strconv.Atoi(c.Param("id")) + var entry tapApi.MizuEntry + bytes, err := basenine.Single(shared.BasenineHost, shared.BaseninePort, id) + if Error(c, err) { + return // exit + } + err = json.Unmarshal(bytes, &entry) + if Error(c, err) { + return // exit + } - extension := extensionsMap[entryData.ProtocolName] - protocol, representation, bodySize, _ := extension.Dissector.Represent(&entryData) + extension := extensionsMap[entry.Protocol.Name] + protocol, representation, bodySize, _ := extension.Dissector.Represent(entry.Protocol, entry.Request, entry.Response) var rules []map[string]interface{} var isRulesEnabled bool - if entryData.ProtocolName == "http" { - var pair tapApi.RequestResponsePair - json.Unmarshal([]byte(entryData.Entry), &pair) - harEntry, _ := utils.NewEntry(&pair) - _, rulesMatched, _isRulesEnabled := models.RunValidationRulesState(*harEntry, entryData.Service) + if entry.Protocol.Name == "http" { + harEntry, _ := utils.NewEntry(entry.Request, entry.Response, entry.StartTime, entry.ElapsedTime) + _, rulesMatched, _isRulesEnabled := models.RunValidationRulesState(*harEntry, entry.Service) isRulesEnabled = _isRulesEnabled inrec, _ := json.Marshal(rulesMatched) json.Unmarshal(inrec, &rules) @@ -89,7 +60,7 @@ func GetEntry(c *gin.Context) { Protocol: protocol, Representation: string(representation), BodySize: bodySize, - Data: entryData, + Data: entry, Rules: rules, IsRulesEnabled: isRulesEnabled, }) diff --git a/agent/pkg/controllers/query_controller.go b/agent/pkg/controllers/query_controller.go new file mode 100644 index 000000000..f74230f8b --- /dev/null +++ b/agent/pkg/controllers/query_controller.go @@ -0,0 +1,31 @@ +package controllers + +import ( + "net/http" + + "github.com/gin-gonic/gin" + basenine "github.com/up9inc/basenine/client/go" + "github.com/up9inc/mizu/shared" +) + +type ValidateResponse struct { + Valid bool `json:"valid"` + Message string `json:"message"` +} + +func PostValidate(c *gin.Context) { + query := c.PostForm("query") + valid := true + message := "" + + err := basenine.Validate(shared.BasenineHost, shared.BaseninePort, query) + if err != nil { + valid = false + message = err.Error() + } + + c.JSON(http.StatusOK, ValidateResponse{ + Valid: valid, + Message: message, + }) +} diff --git a/agent/pkg/database/main.go b/agent/pkg/database/main.go deleted file mode 100644 index 6d199823c..000000000 --- a/agent/pkg/database/main.go +++ /dev/null @@ -1,78 +0,0 @@ -package database - -import ( - "fmt" - "mizuserver/pkg/utils" - "time" - - "gorm.io/driver/sqlite" - "gorm.io/gorm" - "gorm.io/gorm/logger" - - tapApi "github.com/up9inc/mizu/tap/api" -) - -const ( - OrderDesc = "desc" - OrderAsc = "asc" - LT = "lt" - GT = "gt" - TimeFormat = "2006-01-02 15:04:05.000000000" -) - -var ( - DB *gorm.DB - IsDBLocked = false - OperatorToSymbolMapping = map[string]string{ - LT: "<", - GT: ">", - } - OperatorToOrderMapping = map[string]string{ - LT: OrderDesc, - GT: OrderAsc, - } -) - -var DBPath string - -func GetEntriesTable() *gorm.DB { - return DB.Table("mizu_entries") -} - -func CreateEntry(entry *tapApi.MizuEntry) { - if IsDBLocked { - return - } - GetEntriesTable().Create(entry) -} - -func InitDataBase(databasePath string) *gorm.DB { - DBPath = databasePath - DB, _ = gorm.Open(sqlite.Open(databasePath), &gorm.Config{ - Logger: &utils.TruncatingLogger{LogLevel: logger.Warn, SlowThreshold: 500 * time.Millisecond}, - }) - _ = DB.AutoMigrate(&tapApi.MizuEntry{}) // this will ensure table is created - go StartEnforcingDatabaseSize() - return DB -} - -func GetEntriesFromDb(timeFrom time.Time, timeTo time.Time, protocolName *string) []tapApi.MizuEntry { - order := OrderDesc - protocolNameCondition := "1 = 1" - if protocolName != nil { - protocolNameCondition = fmt.Sprintf("protocolName = '%s'", *protocolName) - } - - var entries []tapApi.MizuEntry - GetEntriesTable(). - Where(protocolNameCondition). - Where(fmt.Sprintf("created_at BETWEEN '%s' AND '%s'", timeFrom.Format(TimeFormat), timeTo.Format(TimeFormat))). - Order(fmt.Sprintf("timestamp %s", order)). - Find(&entries) - - if len(entries) > 0 { - // the entries always order from oldest to newest so we should revers - utils.ReverseSlice(entries) - } - return entries -} diff --git a/agent/pkg/database/size_enforcer.go b/agent/pkg/database/size_enforcer.go deleted file mode 100644 index 7e06da7fe..000000000 --- a/agent/pkg/database/size_enforcer.go +++ /dev/null @@ -1,102 +0,0 @@ -package database - -import ( - "mizuserver/pkg/config" - "os" - "time" - - "github.com/fsnotify/fsnotify" - "github.com/up9inc/mizu/shared/debounce" - "github.com/up9inc/mizu/shared/logger" - "github.com/up9inc/mizu/shared/units" - tapApi "github.com/up9inc/mizu/tap/api" -) - -const percentageOfMaxSizeBytesToPrune = 15 - -func StartEnforcingDatabaseSize() { - watcher, err := fsnotify.NewWatcher() - if err != nil { - logger.Log.Fatalf("Error creating filesystem watcher for db size enforcement: %v\n", err) - return - } - - checkFileSizeDebouncer := debounce.NewDebouncer(5*time.Second, func() { - checkFileSize(config.Config.MaxDBSizeBytes) - }) - - go func() { - for { - select { - case event, ok := <-watcher.Events: - if !ok { - return // closed channel - } - if event.Op == fsnotify.Write { - checkFileSizeDebouncer.SetOn() - } - case err, ok := <-watcher.Errors: - if !ok { - return // closed channel - } - logger.Log.Errorf("filesystem watcher encountered error:%v", err) - } - } - }() - - err = watcher.Add(DBPath) - if err != nil { - logger.Log.Fatalf("Error adding %s to filesystem watcher for db size enforcement: %v\n", DBPath, err) - } -} - -func checkFileSize(maxSizeBytes int64) { - fileStat, err := os.Stat(DBPath) - if err != nil { - logger.Log.Errorf("Error checking %s file size: %v", DBPath, err) - } else { - if fileStat.Size() > maxSizeBytes { - pruneOldEntries(fileStat.Size()) - } - } -} - -func pruneOldEntries(currentFileSize int64) { - // sqlite locks the database while delete or VACUUM are running and sqlite is terrible at handling its own db lock while a lot of inserts are attempted, we prevent a significant bottleneck by handling the db lock ourselves here - IsDBLocked = true - defer func() { IsDBLocked = false }() - - amountOfBytesToTrim := currentFileSize / (100 / percentageOfMaxSizeBytesToPrune) - - rows, err := GetEntriesTable().Limit(10000).Order("id").Rows() - if err != nil { - logger.Log.Errorf("Error getting 10000 first db rows: %v", err) - return - } - - entryIdsToRemove := make([]uint, 0) - bytesToBeRemoved := int64(0) - for rows.Next() { - if bytesToBeRemoved >= amountOfBytesToTrim { - break - } - var entry tapApi.MizuEntry - err = DB.ScanRows(rows, &entry) - if err != nil { - logger.Log.Errorf("Error scanning db row: %v", err) - continue - } - - entryIdsToRemove = append(entryIdsToRemove, entry.ID) - bytesToBeRemoved += int64(entry.EstimatedSizeBytes) - } - - if len(entryIdsToRemove) > 0 { - GetEntriesTable().Where(entryIdsToRemove).Delete(tapApi.MizuEntry{}) - // VACUUM causes sqlite to shrink the db file after rows have been deleted, the db file will not shrink without this - DB.Exec("VACUUM") - logger.Log.Errorf("Removed %d rows and cleared %s", len(entryIdsToRemove), units.BytesToHumanReadable(bytesToBeRemoved)) - } else { - logger.Log.Error("Found no rows to remove when pruning") - } -} diff --git a/agent/pkg/models/models.go b/agent/pkg/models/models.go index 0209f3675..6add39eeb 100644 --- a/agent/pkg/models/models.go +++ b/agent/pkg/models/models.go @@ -2,12 +2,12 @@ package models import ( "encoding/json" + "mizuserver/pkg/rules" tapApi "github.com/up9inc/mizu/tap/api" - "mizuserver/pkg/rules" - "github.com/google/martian/har" + basenine "github.com/up9inc/basenine/client/go" "github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/tap" ) @@ -16,15 +16,9 @@ func GetEntry(r *tapApi.MizuEntry, v tapApi.DataUnmarshaler) error { return v.UnmarshalData(r) } -type EntriesFilter struct { - Limit int `form:"limit" validate:"required,min=1,max=200"` - Operator string `form:"operator" validate:"required,oneof='lt' 'gt'"` - Timestamp int64 `form:"timestamp" validate:"required,min=1"` -} - type WebSocketEntryMessage struct { *shared.WebSocketMessageMetadata - Data *tapApi.BaseEntryDetails `json:"data,omitempty"` + Data map[string]interface{} `json:"data,omitempty"` } type WebSocketTappedEntryMessage struct { @@ -42,7 +36,28 @@ type AuthStatus struct { Model string `json:"model"` } -func CreateBaseEntryWebSocketMessage(base *tapApi.BaseEntryDetails) ([]byte, error) { +type ToastMessage struct { + Type string `json:"type"` + AutoClose uint `json:"autoClose"` + Text string `json:"text"` +} + +type WebSocketToastMessage struct { + *shared.WebSocketMessageMetadata + Data *ToastMessage `json:"data,omitempty"` +} + +type WebSocketQueryMetadataMessage struct { + *shared.WebSocketMessageMetadata + Data *basenine.Metadata `json:"data,omitempty"` +} + +type WebSocketStartTimeMessage struct { + *shared.WebSocketMessageMetadata + Data int64 `json:"data"` +} + +func CreateBaseEntryWebSocketMessage(base map[string]interface{}) ([]byte, error) { message := &WebSocketEntryMessage{ WebSocketMessageMetadata: &shared.WebSocketMessageMetadata{ MessageType: shared.WebSocketMessageTypeEntry, @@ -72,6 +87,36 @@ func CreateWebsocketOutboundLinkMessage(base *tap.OutboundLink) ([]byte, error) return json.Marshal(message) } +func CreateWebsocketToastMessage(base *ToastMessage) ([]byte, error) { + message := &WebSocketToastMessage{ + WebSocketMessageMetadata: &shared.WebSocketMessageMetadata{ + MessageType: shared.WebSocketMessageTypeToast, + }, + Data: base, + } + return json.Marshal(message) +} + +func CreateWebsocketQueryMetadataMessage(base *basenine.Metadata) ([]byte, error) { + message := &WebSocketQueryMetadataMessage{ + WebSocketMessageMetadata: &shared.WebSocketMessageMetadata{ + MessageType: shared.WebSocketMessageTypeQueryMetadata, + }, + Data: base, + } + return json.Marshal(message) +} + +func CreateWebsocketStartTimeMessage(base int64) ([]byte, error) { + message := &WebSocketStartTimeMessage{ + WebSocketMessageMetadata: &shared.WebSocketMessageMetadata{ + MessageType: shared.WebSocketMessageTypeStartTime, + }, + Data: base, + } + return json.Marshal(message) +} + // ExtendedHAR is the top level object of a HAR log. type ExtendedHAR struct { Log *ExtendedLog `json:"log"` diff --git a/agent/pkg/providers/stats_provider_test.go b/agent/pkg/providers/stats_provider_test.go index 4e0d3ff62..13acfece9 100644 --- a/agent/pkg/providers/stats_provider_test.go +++ b/agent/pkg/providers/stats_provider_test.go @@ -2,16 +2,10 @@ package providers_test import ( "fmt" - "mizuserver/pkg/config" - "mizuserver/pkg/database" "mizuserver/pkg/providers" "testing" ) -func init() { - database.InitDataBase(config.DefaultDatabasePath) -} - func TestNoEntryAddedCount(t *testing.T) { entriesStats := providers.GetGeneralStats() diff --git a/agent/pkg/routes/entries_routes.go b/agent/pkg/routes/entries_routes.go index 8e578fea4..12a597461 100644 --- a/agent/pkg/routes/entries_routes.go +++ b/agent/pkg/routes/entries_routes.go @@ -1,14 +1,14 @@ package routes import ( - "github.com/gin-gonic/gin" "mizuserver/pkg/controllers" + + "github.com/gin-gonic/gin" ) // EntriesRoutes defines the group of har entries routes. func EntriesRoutes(ginApp *gin.Engine) { routeGroup := ginApp.Group("/entries") - routeGroup.GET("/", controllers.GetEntries) // get entries (base/thin entries) - routeGroup.GET("/:entryId", controllers.GetEntry) // get single (full) entry + routeGroup.GET("/:id", controllers.GetEntry) // get single (full) entry } diff --git a/agent/pkg/routes/query_routes.go b/agent/pkg/routes/query_routes.go new file mode 100644 index 000000000..2807bd0b6 --- /dev/null +++ b/agent/pkg/routes/query_routes.go @@ -0,0 +1,13 @@ +package routes + +import ( + "mizuserver/pkg/controllers" + + "github.com/gin-gonic/gin" +) + +func QueryRoutes(ginApp *gin.Engine) { + routeGroup := ginApp.Group("/query") + + routeGroup.POST("/validate", controllers.PostValidate) +} diff --git a/agent/pkg/sensitiveDataFiltering/consts.go b/agent/pkg/sensitiveDataFiltering/consts.go deleted file mode 100644 index e5624de73..000000000 --- a/agent/pkg/sensitiveDataFiltering/consts.go +++ /dev/null @@ -1,10 +0,0 @@ -package sensitiveDataFiltering - -const maskedFieldPlaceholderValue = "[REDACTED]" - -//these values MUST be all lower case and contain no `-` or `_` characters -var personallyIdentifiableDataFields = []string{"token", "authorization", "authentication", "cookie", "userid", "password", - "username", "user", "key", "passcode", "pass", "auth", "authtoken", "jwt", - "bearer", "clientid", "clientsecret", "redirecturi", "phonenumber", - "zip", "zipcode", "address", "country", "firstname", "lastname", - "middlename", "fname", "lname", "birthdate"} diff --git a/agent/pkg/up9/main.go b/agent/pkg/up9/main.go index 6fa9304bd..49739bbac 100644 --- a/agent/pkg/up9/main.go +++ b/agent/pkg/up9/main.go @@ -7,15 +7,16 @@ import ( "encoding/json" "fmt" "io/ioutil" - "mizuserver/pkg/database" "mizuserver/pkg/utils" "net/http" "net/url" "regexp" "strings" + "sync" "time" "github.com/google/martian/har" + basenine "github.com/up9inc/basenine/client/go" "github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared/logger" tapApi "github.com/up9inc/mizu/tap/api" @@ -23,6 +24,7 @@ import ( const ( AnalyzeCheckSleepTime = 5 * time.Second + SentCountLogInterval = 100 ) type GuestToken struct { @@ -204,44 +206,62 @@ func syncEntriesImpl(token string, model string, envPrefix string, uploadInterva analyzeInformation.AnalyzeDestination = envPrefix analyzeInformation.SentCount = 0 - sleepTime := time.Second * time.Duration(uploadIntervalSec) + // "http or grpc" filter indicates that we're only interested in HTTP and gRPC entries + query := "http or grpc" - var timeFrom time.Time - protocolFilter := "http" + logger.Log.Infof("Getting entries from the database\n") - for { - timeTo := time.Now() - logger.Log.Infof("Getting entries from %v, to %v\n", timeFrom.Format(time.RFC3339Nano), timeTo.Format(time.RFC3339Nano)) - entriesArray := database.GetEntriesFromDb(timeFrom, timeTo, &protocolFilter) + var connection *basenine.Connection + var err error + connection, err = basenine.NewConnection(shared.BasenineHost, shared.BaseninePort) + if err != nil { + panic(err) + } - if len(entriesArray) > 0 { - result := make([]har.Entry, 0) - for _, data := range entriesArray { - var pair tapApi.RequestResponsePair - if err := json.Unmarshal([]byte(data.Entry), &pair); err != nil { - continue - } - harEntry, err := utils.NewEntry(&pair) - if err != nil { - continue - } - if data.ResolvedSource != "" { - harEntry.Request.Headers = append(harEntry.Request.Headers, har.Header{Name: "x-mizu-source", Value: data.ResolvedSource}) - } - if data.ResolvedDestination != "" { - harEntry.Request.Headers = append(harEntry.Request.Headers, har.Header{Name: "x-mizu-destination", Value: data.ResolvedDestination}) - harEntry.Request.URL = utils.SetHostname(harEntry.Request.URL, data.ResolvedDestination) - } + data := make(chan []byte) + meta := make(chan []byte) - // go's default marshal behavior is to encode []byte fields to base64, python's default unmarshal behavior is to not decode []byte fields from base64 - if harEntry.Response.Content.Text, err = base64.StdEncoding.DecodeString(string(harEntry.Response.Content.Text)); err != nil { - continue - } + defer func() { + data <- []byte(basenine.CloseChannel) + meta <- []byte(basenine.CloseChannel) + connection.Close() + }() - result = append(result, *harEntry) + handleDataChannel := func(wg *sync.WaitGroup, connection *basenine.Connection, data chan []byte) { + defer wg.Done() + for { + dataBytes := <-data + + if string(dataBytes) == basenine.CloseChannel { + return } - logger.Log.Infof("About to upload %v entries\n", len(result)) + var dataMap map[string]interface{} + err = json.Unmarshal(dataBytes, &dataMap) + + result := make([]har.Entry, 0) + var entry tapApi.MizuEntry + if err := json.Unmarshal([]byte(dataBytes), &entry); err != nil { + continue + } + harEntry, err := utils.NewEntry(entry.Request, entry.Response, entry.StartTime, entry.ElapsedTime) + if err != nil { + continue + } + if entry.ResolvedSource != "" { + harEntry.Request.Headers = append(harEntry.Request.Headers, har.Header{Name: "x-mizu-source", Value: entry.ResolvedSource}) + } + if entry.ResolvedDestination != "" { + harEntry.Request.Headers = append(harEntry.Request.Headers, har.Header{Name: "x-mizu-destination", Value: entry.ResolvedDestination}) + harEntry.Request.URL = utils.SetHostname(harEntry.Request.URL, entry.ResolvedDestination) + } + + // go's default marshal behavior is to encode []byte fields to base64, python's default unmarshal behavior is to not decode []byte fields from base64 + if harEntry.Response.Content.Text, err = base64.StdEncoding.DecodeString(string(harEntry.Response.Content.Text)); err != nil { + continue + } + + result = append(result, *harEntry) body, jMarshalErr := json.Marshal(result) if jMarshalErr != nil { @@ -273,18 +293,33 @@ func syncEntriesImpl(token string, model string, envPrefix string, uploadInterva logger.Log.Info("Stopping sync entries") logger.Log.Fatal(postErr) } - analyzeInformation.SentCount += len(entriesArray) - logger.Log.Infof("Finish uploading %v entries to %s\n", len(entriesArray), GetTrafficDumpUrl(envPrefix, model)) + analyzeInformation.SentCount += 1 - logger.Log.Infof("Uploaded %v entries until now", analyzeInformation.SentCount) - } else { - logger.Log.Infof("Nothing to upload") + if analyzeInformation.SentCount%SentCountLogInterval == 0 { + logger.Log.Infof("Uploaded %v entries until now", analyzeInformation.SentCount) + } } - - logger.Log.Infof("Sleeping for %v...\n", sleepTime) - time.Sleep(sleepTime) - timeFrom = timeTo } + + handleMetaChannel := func(wg *sync.WaitGroup, connection *basenine.Connection, meta chan []byte) { + defer wg.Done() + for { + metaBytes := <-meta + + if string(metaBytes) == basenine.CloseChannel { + return + } + } + } + + var wg sync.WaitGroup + go handleDataChannel(&wg, connection, data) + go handleMetaChannel(&wg, connection, meta) + wg.Add(2) + + connection.Query(query, data, meta) + + wg.Wait() } func UpdateAnalyzeStatus(callback func(data []byte)) { diff --git a/agent/pkg/utils/har.go b/agent/pkg/utils/har.go index a1a06be78..108e91b7b 100644 --- a/agent/pkg/utils/har.go +++ b/agent/pkg/utils/har.go @@ -10,7 +10,6 @@ import ( "github.com/google/martian/har" "github.com/up9inc/mizu/shared/logger" - "github.com/up9inc/mizu/tap/api" ) // Keep it because we might want cookies in the future @@ -120,13 +119,11 @@ func BuildPostParams(rawParams []interface{}) []har.Param { return params } -func NewRequest(request *api.GenericMessage) (harRequest *har.Request, err error) { - reqDetails := request.Payload.(map[string]interface{})["details"].(map[string]interface{}) +func NewRequest(request map[string]interface{}) (harRequest *har.Request, err error) { + headers, host, scheme, authority, path, _ := BuildHeaders(request["_headers"].([]interface{})) + cookies := make([]har.Cookie, 0) // BuildCookies(request["_cookies"].([]interface{})) - headers, host, scheme, authority, path, _ := BuildHeaders(reqDetails["headers"].([]interface{})) - cookies := make([]har.Cookie, 0) // BuildCookies(reqDetails["cookies"].([]interface{})) - - postData, _ := reqDetails["postData"].(map[string]interface{}) + postData, _ := request["postData"].(map[string]interface{}) mimeType, _ := postData["mimeType"] if mimeType == nil || len(mimeType.(string)) == 0 { mimeType = "text/html" @@ -138,7 +135,7 @@ func NewRequest(request *api.GenericMessage) (harRequest *har.Request, err error } queryString := make([]har.QueryString, 0) - for _, _qs := range reqDetails["queryString"].([]interface{}) { + for _, _qs := range request["_queryString"].([]interface{}) { qs := _qs.(map[string]interface{}) queryString = append(queryString, har.QueryString{ Name: qs["name"].(string), @@ -146,7 +143,7 @@ func NewRequest(request *api.GenericMessage) (harRequest *har.Request, err error }) } - url := fmt.Sprintf("http://%s%s", host, reqDetails["url"].(string)) + url := fmt.Sprintf("http://%s%s", host, request["url"].(string)) if strings.HasPrefix(mimeType.(string), "application/grpc") { url = fmt.Sprintf("%s://%s%s", scheme, authority, path) } @@ -157,9 +154,9 @@ func NewRequest(request *api.GenericMessage) (harRequest *har.Request, err error } harRequest = &har.Request{ - Method: reqDetails["method"].(string), + Method: request["method"].(string), URL: url, - HTTPVersion: reqDetails["httpVersion"].(string), + HTTPVersion: request["httpVersion"].(string), HeadersSize: -1, BodySize: int64(bytes.NewBufferString(postDataText).Len()), QueryString: queryString, @@ -175,13 +172,11 @@ func NewRequest(request *api.GenericMessage) (harRequest *har.Request, err error return } -func NewResponse(response *api.GenericMessage) (harResponse *har.Response, err error) { - resDetails := response.Payload.(map[string]interface{})["details"].(map[string]interface{}) +func NewResponse(response map[string]interface{}) (harResponse *har.Response, err error) { + headers, _, _, _, _, _status := BuildHeaders(response["_headers"].([]interface{})) + cookies := make([]har.Cookie, 0) // BuildCookies(response["_cookies"].([]interface{})) - headers, _, _, _, _, _status := BuildHeaders(resDetails["headers"].([]interface{})) - cookies := make([]har.Cookie, 0) // BuildCookies(resDetails["cookies"].([]interface{})) - - content, _ := resDetails["content"].(map[string]interface{}) + content, _ := response["content"].(map[string]interface{}) mimeType, _ := content["mimeType"] if mimeType == nil || len(mimeType.(string)) == 0 { mimeType = "text/html" @@ -200,9 +195,11 @@ func NewResponse(response *api.GenericMessage) (harResponse *har.Response, err e Size: int64(len(bodyText)), } - status := int(resDetails["status"].(float64)) + status := int(response["status"].(float64)) if strings.HasPrefix(mimeType.(string), "application/grpc") { - status, err = strconv.Atoi(_status) + if _status != "" { + status, err = strconv.Atoi(_status) + } if err != nil { logger.Log.Errorf("Failed converting status to int %s (%v,%+v)", err, err, err) return nil, errors.New("failed converting response status to int for HAR") @@ -210,9 +207,9 @@ func NewResponse(response *api.GenericMessage) (harResponse *har.Response, err e } harResponse = &har.Response{ - HTTPVersion: resDetails["httpVersion"].(string), + HTTPVersion: response["httpVersion"].(string), Status: status, - StatusText: resDetails["statusText"].(string), + StatusText: response["statusText"].(string), HeadersSize: -1, BodySize: int64(bytes.NewBufferString(bodyText).Len()), Headers: headers, @@ -222,34 +219,33 @@ func NewResponse(response *api.GenericMessage) (harResponse *har.Response, err e return } -func NewEntry(pair *api.RequestResponsePair) (*har.Entry, error) { - harRequest, err := NewRequest(&pair.Request) +func NewEntry(request map[string]interface{}, response map[string]interface{}, startTime time.Time, elapsedTime int64) (*har.Entry, error) { + harRequest, err := NewRequest(request) if err != nil { logger.Log.Errorf("Failed converting request to HAR %s (%v,%+v)", err, err, err) return nil, errors.New("failed converting request to HAR") } - harResponse, err := NewResponse(&pair.Response) + harResponse, err := NewResponse(response) if err != nil { logger.Log.Errorf("Failed converting response to HAR %s (%v,%+v)", err, err, err) return nil, errors.New("failed converting response to HAR") } - totalTime := pair.Response.CaptureTime.Sub(pair.Request.CaptureTime).Round(time.Millisecond).Milliseconds() - if totalTime < 1 { - totalTime = 1 + if elapsedTime < 1 { + elapsedTime = 1 } harEntry := har.Entry{ - StartedDateTime: pair.Request.CaptureTime, - Time: totalTime, + StartedDateTime: startTime, + Time: elapsedTime, Request: harRequest, Response: harResponse, Cache: &har.Cache{}, Timings: &har.Timings{ Send: -1, Wait: -1, - Receive: totalTime, + Receive: elapsedTime, }, } diff --git a/agent/pkg/utils/truncating_logger.go b/agent/pkg/utils/truncating_logger.go deleted file mode 100644 index 8302d5512..000000000 --- a/agent/pkg/utils/truncating_logger.go +++ /dev/null @@ -1,60 +0,0 @@ -package utils - -import ( - "context" - "fmt" - "time" - - loggerShared "github.com/up9inc/mizu/shared/logger" - "gorm.io/gorm/logger" - "gorm.io/gorm/utils" -) - -// TruncatingLogger implements the gorm logger.Interface interface. Its purpose is to act as gorm's logger while truncating logs to a max of 50 characters to minimise the performance impact -type TruncatingLogger struct { - LogLevel logger.LogLevel - SlowThreshold time.Duration -} - -func (truncatingLogger *TruncatingLogger) LogMode(logLevel logger.LogLevel) logger.Interface { - truncatingLogger.LogLevel = logLevel - return truncatingLogger -} - -func (truncatingLogger *TruncatingLogger) Info(_ context.Context, message string, __ ...interface{}) { - if truncatingLogger.LogLevel < logger.Info { - return - } - loggerShared.Log.Errorf("gorm info: %.150s", message) -} - -func (truncatingLogger *TruncatingLogger) Warn(_ context.Context, message string, __ ...interface{}) { - if truncatingLogger.LogLevel < logger.Warn { - return - } - loggerShared.Log.Errorf("gorm warning: %.150s", message) -} - -func (truncatingLogger *TruncatingLogger) Error(_ context.Context, message string, __ ...interface{}) { - if truncatingLogger.LogLevel < logger.Error { - return - } - loggerShared.Log.Errorf("gorm error: %.150s", message) -} - -func (truncatingLogger *TruncatingLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { - if truncatingLogger.LogLevel == logger.Silent { - return - } - elapsed := time.Since(begin) - if err != nil { - sql, rows := fc() // copied into every condition as this is a potentially heavy operation best done only when necessary - truncatingLogger.Error(ctx, fmt.Sprintf("Error in %s: %v - elapsed: %fs affected rows: %d, sql: %s", utils.FileWithLineNum(), err, elapsed.Seconds(), rows, sql)) - } else if truncatingLogger.LogLevel >= logger.Warn && elapsed > truncatingLogger.SlowThreshold { - sql, rows := fc() - truncatingLogger.Warn(ctx, fmt.Sprintf("Slow sql query - elapse: %fs rows: %d, sql: %s", elapsed.Seconds(), rows, sql)) - } else if truncatingLogger.LogLevel >= logger.Info { - sql, rows := fc() - truncatingLogger.Info(ctx, fmt.Sprintf("Sql query - elapse: %fs rows: %d, sql: %s", elapsed.Seconds(), rows, sql)) - } -} diff --git a/cli/config/config.go b/cli/config/config.go index 386f4816a..361d50068 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -3,14 +3,15 @@ package config import ( "errors" "fmt" - "github.com/up9inc/mizu/tap/api" "io/ioutil" - "k8s.io/apimachinery/pkg/util/json" "os" "reflect" "strconv" "strings" + "github.com/up9inc/mizu/tap/api" + "k8s.io/apimachinery/pkg/util/json" + "github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared/logger" @@ -396,7 +397,7 @@ func getMizuAgentConfig(targetNamespaces []string, mizuApiFilteringOptions *api. TapperResources: Config.Tap.TapperResources, MizuResourcesNamespace: Config.MizuResourcesNamespace, MizuApiFilteringOptions: *mizuApiFilteringOptions, - AgentDatabasePath: fmt.Sprintf("%s%s", shared.DataDirPath, "entries.db"), + AgentDatabasePath: shared.DataDirPath, } return &config, nil } diff --git a/debug.Dockerfile b/debug.Dockerfile index 2c91746d5..d04e6b995 100644 --- a/debug.Dockerfile +++ b/debug.Dockerfile @@ -12,7 +12,7 @@ FROM golang:1.16-alpine AS builder # Set necessary environment variables needed for our image. ENV CGO_ENABLED=1 GOOS=linux GOARCH=amd64 -RUN apk add libpcap-dev gcc g++ make bash +RUN apk add libpcap-dev gcc g++ make bash perl-utils # Move to agent working directory (/agent-build). WORKDIR /app/agent-build @@ -23,7 +23,7 @@ COPY tap/go.mod tap/go.mod ../tap/ COPY tap/api/go.* ../tap/api/ RUN go mod download # cheap trick to make the build faster (As long as go.mod wasn't changes) -RUN go list -f '{{.Path}}@{{.Version}}' -m all | sed 1d | grep -e 'go-cache' -e 'sqlite' | xargs go get +RUN go list -f '{{.Path}}@{{.Version}}' -m all | sed 1d | grep -e 'go-cache' | xargs go get ARG COMMIT_HASH ARG GIT_BRANCH @@ -36,6 +36,12 @@ COPY tap ../tap COPY agent . RUN go build -gcflags="all=-N -l" -o mizuagent . +# Download Basenine executable, verify the sha1sum and move it to a directory in $PATH +ADD https://github.com/up9inc/basenine/releases/download/v0.2.6/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.6/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +RUN shasum -a 256 -c basenine_linux_amd64.sha256 +RUN chmod +x ./basenine_linux_amd64 + COPY devops/build_extensions_debug.sh .. RUN cd .. && /bin/bash build_extensions_debug.sh @@ -43,10 +49,12 @@ RUN cd .. && /bin/bash build_extensions_debug.sh FROM golang:1.16-alpine RUN apk add bash libpcap-dev tcpdump + WORKDIR /app # Copy binary and config files from /build to root folder of scratch container. COPY --from=builder ["/app/agent-build/mizuagent", "."] +COPY --from=builder ["/app/agent-build/basenine_linux_amd64", "/usr/local/bin/basenine"] COPY --from=builder ["/app/agent/build/extensions", "extensions"] COPY --from=site-build ["/app/ui-build/build", "site"] diff --git a/shared/consts.go b/shared/consts.go index 79e4b84e5..6dc3067b5 100644 --- a/shared/consts.go +++ b/shared/consts.go @@ -14,4 +14,6 @@ const ( GoGCEnvVar = "GOGC" DefaultApiServerPort = 8899 DebugModeEnvVar = "MIZU_DEBUG" + BasenineHost = "localhost" + BaseninePort = "9099" ) diff --git a/shared/models.go b/shared/models.go index 10b47883b..82b0abaef 100644 --- a/shared/models.go +++ b/shared/models.go @@ -17,6 +17,9 @@ const ( WebSocketMessageTypeUpdateStatus WebSocketMessageType = "status" WebSocketMessageTypeAnalyzeStatus WebSocketMessageType = "analyzeStatus" WebsocketMessageTypeOutboundLink WebSocketMessageType = "outboundLink" + WebSocketMessageTypeToast WebSocketMessageType = "toast" + WebSocketMessageTypeQueryMetadata WebSocketMessageType = "queryMetadata" + WebSocketMessageTypeStartTime WebSocketMessageType = "startTime" ) type Resources struct { diff --git a/tap/api/api.go b/tap/api/api.go index 5de34befe..3d1d552ef 100644 --- a/tap/api/api.go +++ b/tap/api/api.go @@ -18,7 +18,8 @@ import ( type Protocol struct { Name string `json:"name"` LongName string `json:"longName"` - Abbreviation string `json:"abbreviation"` + Abbreviation string `json:"abbr"` + Macro string `json:"macro"` Version string `json:"version"` BackgroundColor string `json:"backgroundColor"` ForegroundColor string `json:"foregroundColor"` @@ -28,6 +29,12 @@ type Protocol struct { Priority uint8 `json:"priority"` } +type TCP struct { + IP string `json:"ip"` + Port string `json:"port"` + Name string `json:"name"` +} + type Extension struct { Protocol *Protocol Path string @@ -74,6 +81,7 @@ type OutputChannelItem struct { Timestamp int64 ConnectionInfo *ConnectionInfo Pair *RequestResponsePair + Summary *BaseEntryDetails } type SuperTimer struct { @@ -89,9 +97,10 @@ type Dissector interface { Register(*Extension) Ping() Dissect(b *bufio.Reader, isClient bool, tcpID *TcpID, counterPair *CounterPair, superTimer *SuperTimer, superIdentifier *SuperIdentifier, emitter Emitter, options *TrafficFilteringOptions) error - Analyze(item *OutputChannelItem, entryId string, resolvedSource string, resolvedDestination string) *MizuEntry + Analyze(item *OutputChannelItem, resolvedSource string, resolvedDestination string) *MizuEntry Summarize(entry *MizuEntry) *BaseEntryDetails - Represent(entry *MizuEntry) (protocol Protocol, object []byte, bodySize int64, err error) + Represent(pIn Protocol, request map[string]interface{}, response map[string]interface{}) (pOut Protocol, object []byte, bodySize int64, err error) + Macros() map[string]string } type Emitting struct { @@ -109,39 +118,36 @@ func (e *Emitting) Emit(item *OutputChannelItem) { } type MizuEntry struct { - ID uint `gorm:"primarykey"` - CreatedAt time.Time - UpdatedAt time.Time - ProtocolName string `json:"protocolName" gorm:"column:protocolName"` - ProtocolLongName string `json:"protocolLongName" gorm:"column:protocolLongName"` - ProtocolAbbreviation string `json:"protocolAbbreviation" gorm:"column:protocolAbbreviation"` - ProtocolVersion string `json:"protocolVersion" gorm:"column:protocolVersion"` - ProtocolBackgroundColor string `json:"protocolBackgroundColor" gorm:"column:protocolBackgroundColor"` - ProtocolForegroundColor string `json:"protocolForegroundColor" gorm:"column:protocolForegroundColor"` - ProtocolFontSize int8 `json:"protocolFontSize" gorm:"column:protocolFontSize"` - ProtocolReferenceLink string `json:"protocolReferenceLink" gorm:"column:protocolReferenceLink"` - Entry string `json:"entry,omitempty" gorm:"column:entry"` - EntryId string `json:"entryId" gorm:"column:entryId"` - Url string `json:"url" gorm:"column:url"` - Method string `json:"method" gorm:"column:method"` - Status int `json:"status" gorm:"column:status"` - RequestSenderIp string `json:"requestSenderIp" gorm:"column:requestSenderIp"` - Service string `json:"service" gorm:"column:service"` - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` - ElapsedTime int64 `json:"elapsedTime" gorm:"column:elapsedTime"` - Path string `json:"path" gorm:"column:path"` - ResolvedSource string `json:"resolvedSource,omitempty" gorm:"column:resolvedSource"` - ResolvedDestination string `json:"resolvedDestination,omitempty" gorm:"column:resolvedDestination"` - SourceIp string `json:"sourceIp,omitempty" gorm:"column:sourceIp"` - DestinationIp string `json:"destinationIp,omitempty" gorm:"column:destinationIp"` - SourcePort string `json:"sourcePort,omitempty" gorm:"column:sourcePort"` - DestinationPort string `json:"destinationPort,omitempty" gorm:"column:destinationPort"` - IsOutgoing bool `json:"isOutgoing,omitempty" gorm:"column:isOutgoing"` - ContractStatus ContractStatus `json:"contractStatus,omitempty" gorm:"column:contractStatus"` - ContractRequestReason string `json:"contractRequestReason,omitempty" gorm:"column:contractRequestReason"` - ContractResponseReason string `json:"contractResponseReason,omitempty" gorm:"column:contractResponseReason"` - ContractContent string `json:"contractContent,omitempty" gorm:"column:contractContent"` - EstimatedSizeBytes int `json:"-" gorm:"column:estimatedSizeBytes"` + Id uint `json:"id"` + Protocol Protocol `json:"proto"` + Source *TCP `json:"src"` + Destination *TCP `json:"dst"` + Outgoing bool `json:"outgoing"` + Timestamp int64 `json:"timestamp"` + StartTime time.Time `json:"startTime"` + Request map[string]interface{} `json:"request"` + Response map[string]interface{} `json:"response"` + Base *BaseEntryDetails `json:"base"` + Summary string `json:"summary"` + Url string `json:"url"` + Method string `json:"method"` + Status int `json:"status"` + RequestSenderIp string `json:"requestSenderIp"` + Service string `json:"service"` + ElapsedTime int64 `json:"elapsedTime"` + Path string `json:"path"` + ResolvedSource string `json:"resolvedSource,omitempty"` + ResolvedDestination string `json:"resolvedDestination,omitempty"` + SourceIp string `json:"sourceIp,omitempty"` + DestinationIp string `json:"destinationIp,omitempty"` + SourcePort string `json:"sourcePort,omitempty"` + DestinationPort string `json:"destinationPort,omitempty"` + IsOutgoing bool `json:"isOutgoing,omitempty"` + ContractStatus ContractStatus `json:"contractStatus,omitempty"` + ContractRequestReason string `json:"contractRequestReason,omitempty"` + ContractResponseReason string `json:"contractResponseReason,omitempty"` + ContractContent string `json:"contractContent,omitempty"` + HTTPPair string `json:"httpPair,omitempty"` } type MizuEntryWrapper struct { @@ -154,7 +160,7 @@ type MizuEntryWrapper struct { } type BaseEntryDetails struct { - Id string `json:"id,omitempty"` + Id uint `json:"id"` Protocol Protocol `json:"protocol,omitempty"` Url string `json:"url,omitempty"` RequestSenderIp string `json:"requestSenderIp,omitempty"` @@ -194,17 +200,8 @@ type DataUnmarshaler interface { } func (bed *BaseEntryDetails) UnmarshalData(entry *MizuEntry) error { - bed.Protocol = Protocol{ - Name: entry.ProtocolName, - LongName: entry.ProtocolLongName, - Abbreviation: entry.ProtocolAbbreviation, - Version: entry.ProtocolVersion, - BackgroundColor: entry.ProtocolBackgroundColor, - ForegroundColor: entry.ProtocolForegroundColor, - FontSize: entry.ProtocolFontSize, - ReferenceLink: entry.ProtocolReferenceLink, - } - bed.Id = entry.EntryId + bed.Protocol = entry.Protocol + bed.Id = entry.Id bed.Url = entry.Url bed.RequestSenderIp = entry.RequestSenderIp bed.Service = entry.Service @@ -228,6 +225,21 @@ const ( BODY string = "body" ) +type SectionData struct { + Type string `json:"type"` + Title string `json:"title"` + Data string `json:"data"` + Encoding string `json:"encoding,omitempty"` + MimeType string `json:"mimeType,omitempty"` + Selector string `json:"selector,omitempty"` +} + +type TableData struct { + Name string `json:"name"` + Value interface{} `json:"value"` + Selector string `json:"selector"` +} + const ( TypeHttpRequest = iota TypeHttpResponse diff --git a/tap/extensions/amqp/helpers.go b/tap/extensions/amqp/helpers.go index f7a1842a7..188ae18a1 100644 --- a/tap/extensions/amqp/helpers.go +++ b/tap/extensions/amqp/helpers.go @@ -131,97 +131,109 @@ func representProperties(properties map[string]interface{}, rep []interface{}) ( userId := "" appId := "" - if properties["ContentType"] != nil { - contentType = properties["ContentType"].(string) + if properties["contentType"] != nil { + contentType = properties["contentType"].(string) } - if properties["ContentEncoding"] != nil { - contentEncoding = properties["ContentEncoding"].(string) + if properties["contentEncoding"] != nil { + contentEncoding = properties["contentEncoding"].(string) } - if properties["Delivery Mode"] != nil { - deliveryMode = fmt.Sprintf("%g", properties["DeliveryMode"].(float64)) + if properties["deliveryMode"] != nil { + deliveryMode = fmt.Sprintf("%g", properties["deliveryMode"].(float64)) } - if properties["Priority"] != nil { - priority = fmt.Sprintf("%g", properties["Priority"].(float64)) + if properties["priority"] != nil { + priority = fmt.Sprintf("%g", properties["priority"].(float64)) } - if properties["CorrelationId"] != nil { - correlationId = properties["CorrelationId"].(string) + if properties["correlationId"] != nil { + correlationId = properties["correlationId"].(string) } - if properties["ReplyTo"] != nil { - replyTo = properties["ReplyTo"].(string) + if properties["replyTo"] != nil { + replyTo = properties["replyTo"].(string) } - if properties["Expiration"] != nil { - expiration = properties["Expiration"].(string) + if properties["expiration"] != nil { + expiration = properties["expiration"].(string) } - if properties["MessageId"] != nil { - messageId = properties["MessageId"].(string) + if properties["messageId"] != nil { + messageId = properties["messageId"].(string) } - if properties["Timestamp"] != nil { - timestamp = properties["Timestamp"].(string) + if properties["timestamp"] != nil { + timestamp = properties["timestamp"].(string) } - if properties["Type"] != nil { - _type = properties["Type"].(string) + if properties["type"] != nil { + _type = properties["type"].(string) } - if properties["UserId"] != nil { - userId = properties["UserId"].(string) + if properties["userId"] != nil { + userId = properties["userId"].(string) } - if properties["AppId"] != nil { - appId = properties["AppId"].(string) + if properties["appId"] != nil { + appId = properties["appId"].(string) } - props, _ := json.Marshal([]map[string]string{ + props, _ := json.Marshal([]api.TableData{ { - "name": "Content Type", - "value": contentType, + Name: "Content Type", + Value: contentType, + Selector: `request.properties.contentType`, }, { - "name": "Content Encoding", - "value": contentEncoding, + Name: "Content Encoding", + Value: contentEncoding, + Selector: `request.properties.contentEncoding`, }, { - "name": "Delivery Mode", - "value": deliveryMode, + Name: "Delivery Mode", + Value: deliveryMode, + Selector: `request.properties.deliveryMode`, }, { - "name": "Priority", - "value": priority, + Name: "Priority", + Value: priority, + Selector: `request.properties.priority`, }, { - "name": "Correlation ID", - "value": correlationId, + Name: "Correlation ID", + Value: correlationId, + Selector: `request.properties.correlationId`, }, { - "name": "Reply To", - "value": replyTo, + Name: "Reply To", + Value: replyTo, + Selector: `request.properties.replyTo`, }, { - "name": "Expiration", - "value": expiration, + Name: "Expiration", + Value: expiration, + Selector: `request.properties.expiration`, }, { - "name": "Message ID", - "value": messageId, + Name: "Message ID", + Value: messageId, + Selector: `request.properties.messageId`, }, { - "name": "Timestamp", - "value": timestamp, + Name: "Timestamp", + Value: timestamp, + Selector: `request.properties.timestamp`, }, { - "name": "Type", - "value": _type, + Name: "Type", + Value: _type, + Selector: `request.properties.type`, }, { - "name": "User ID", - "value": userId, + Name: "User ID", + Value: userId, + Selector: `request.properties.userId`, }, { - "name": "App ID", - "value": appId, + Name: "App ID", + Value: appId, + Selector: `request.properties.appId`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Properties", - "data": string(props), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Properties", + Data: string(props), }) return rep, contentType, contentEncoding @@ -230,56 +242,62 @@ func representProperties(properties map[string]interface{}, rep []interface{}) ( func representBasicPublish(event map[string]interface{}) []interface{} { rep := make([]interface{}, 0) - details, _ := json.Marshal([]map[string]string{ + details, _ := json.Marshal([]api.TableData{ { - "name": "Exchange", - "value": event["Exchange"].(string), + Name: "Exchange", + Value: event["exchange"].(string), + Selector: `request.exchange`, }, { - "name": "Routing Key", - "value": event["RoutingKey"].(string), + Name: "Routing Key", + Value: event["routingKey"].(string), + Selector: `request.routingKey`, }, { - "name": "Mandatory", - "value": strconv.FormatBool(event["Mandatory"].(bool)), + Name: "Mandatory", + Value: strconv.FormatBool(event["mandatory"].(bool)), + Selector: `request.mandatory`, }, { - "name": "Immediate", - "value": strconv.FormatBool(event["Immediate"].(bool)), + Name: "Immediate", + Value: strconv.FormatBool(event["immediate"].(bool)), + Selector: `request.immediate`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Details", - "data": string(details), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Details", + Data: string(details), }) - properties := event["Properties"].(map[string]interface{}) + properties := event["properties"].(map[string]interface{}) rep, contentType, _ := representProperties(properties, rep) - if properties["Headers"] != nil { - headers := make([]map[string]string, 0) - for name, value := range properties["Headers"].(map[string]interface{}) { - headers = append(headers, map[string]string{ - "name": name, - "value": value.(string), + if properties["headers"] != nil { + headers := make([]api.TableData, 0) + for name, value := range properties["headers"].(map[string]interface{}) { + headers = append(headers, api.TableData{ + Name: name, + Value: value.(string), + Selector: fmt.Sprintf(`request.properties.headers["%s"]`, name), }) } headersMarshaled, _ := json.Marshal(headers) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Headers", - "data": string(headersMarshaled), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Headers", + Data: string(headersMarshaled), }) } - if event["Body"] != nil { - rep = append(rep, map[string]string{ - "type": api.BODY, - "title": "Body", - "encoding": "base64", - "mime_type": contentType, - "data": event["Body"].(string), + if event["body"] != nil { + rep = append(rep, api.SectionData{ + Type: api.BODY, + Title: "Body", + Encoding: "base64", + MimeType: contentType, + Data: event["body"].(string), + Selector: `request.body`, }) } @@ -293,70 +311,77 @@ func representBasicDeliver(event map[string]interface{}) []interface{} { deliveryTag := "" redelivered := "" - if event["ConsumerTag"] != nil { - consumerTag = event["ConsumerTag"].(string) + if event["consumerTag"] != nil { + consumerTag = event["consumerTag"].(string) } - if event["DeliveryTag"] != nil { - deliveryTag = fmt.Sprintf("%g", event["DeliveryTag"].(float64)) + if event["deliveryTag"] != nil { + deliveryTag = fmt.Sprintf("%g", event["deliveryTag"].(float64)) } - if event["Redelivered"] != nil { - redelivered = strconv.FormatBool(event["Redelivered"].(bool)) + if event["redelivered"] != nil { + redelivered = strconv.FormatBool(event["redelivered"].(bool)) } - details, _ := json.Marshal([]map[string]string{ + details, _ := json.Marshal([]api.TableData{ { - "name": "Consumer Tag", - "value": consumerTag, + Name: "Consumer Tag", + Value: consumerTag, + Selector: `request.consumerTag`, }, { - "name": "Delivery Tag", - "value": deliveryTag, + Name: "Delivery Tag", + Value: deliveryTag, + Selector: `request.deliveryTag`, }, { - "name": "Redelivered", - "value": redelivered, + Name: "Redelivered", + Value: redelivered, + Selector: `request.redelivered`, }, { - "name": "Exchange", - "value": event["Exchange"].(string), + Name: "Exchange", + Value: event["exchange"].(string), + Selector: `request.exchange`, }, { - "name": "Routing Key", - "value": event["RoutingKey"].(string), + Name: "Routing Key", + Value: event["routingKey"].(string), + Selector: `request.routingKey`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Details", - "data": string(details), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Details", + Data: string(details), }) - properties := event["Properties"].(map[string]interface{}) + properties := event["properties"].(map[string]interface{}) rep, contentType, _ := representProperties(properties, rep) - if properties["Headers"] != nil { - headers := make([]map[string]string, 0) - for name, value := range properties["Headers"].(map[string]interface{}) { - headers = append(headers, map[string]string{ - "name": name, - "value": value.(string), + if properties["headers"] != nil { + headers := make([]api.TableData, 0) + for name, value := range properties["headers"].(map[string]interface{}) { + headers = append(headers, api.TableData{ + Name: name, + Value: value.(string), + Selector: fmt.Sprintf(`request.properties.headers["%s"]`, name), }) } headersMarshaled, _ := json.Marshal(headers) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Headers", - "data": string(headersMarshaled), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Headers", + Data: string(headersMarshaled), }) } - if event["Body"] != nil { - rep = append(rep, map[string]string{ - "type": api.BODY, - "title": "Body", - "encoding": "base64", - "mime_type": contentType, - "data": event["Body"].(string), + if event["body"] != nil { + rep = append(rep, api.SectionData{ + Type: api.BODY, + Title: "Body", + Encoding: "base64", + MimeType: contentType, + Data: event["body"].(string), + Selector: `request.body`, }) } @@ -366,51 +391,58 @@ func representBasicDeliver(event map[string]interface{}) []interface{} { func representQueueDeclare(event map[string]interface{}) []interface{} { rep := make([]interface{}, 0) - details, _ := json.Marshal([]map[string]string{ + details, _ := json.Marshal([]api.TableData{ { - "name": "Queue", - "value": event["Queue"].(string), + Name: "Queue", + Value: event["queue"].(string), + Selector: `request.queue`, }, { - "name": "Passive", - "value": strconv.FormatBool(event["Passive"].(bool)), + Name: "Passive", + Value: strconv.FormatBool(event["passive"].(bool)), + Selector: `request.queue`, }, { - "name": "Durable", - "value": strconv.FormatBool(event["Durable"].(bool)), + Name: "Durable", + Value: strconv.FormatBool(event["durable"].(bool)), + Selector: `request.durable`, }, { - "name": "Exclusive", - "value": strconv.FormatBool(event["Exclusive"].(bool)), + Name: "Exclusive", + Value: strconv.FormatBool(event["exclusive"].(bool)), + Selector: `request.exclusive`, }, { - "name": "Auto Delete", - "value": strconv.FormatBool(event["AutoDelete"].(bool)), + Name: "Auto Delete", + Value: strconv.FormatBool(event["autoDelete"].(bool)), + Selector: `request.autoDelete`, }, { - "name": "NoWait", - "value": strconv.FormatBool(event["NoWait"].(bool)), + Name: "NoWait", + Value: strconv.FormatBool(event["noWait"].(bool)), + Selector: `request.noWait`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Details", - "data": string(details), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Details", + Data: string(details), }) - if event["Arguments"] != nil { - headers := make([]map[string]string, 0) - for name, value := range event["Arguments"].(map[string]interface{}) { - headers = append(headers, map[string]string{ - "name": name, - "value": value.(string), + if event["arguments"] != nil { + headers := make([]api.TableData, 0) + for name, value := range event["arguments"].(map[string]interface{}) { + headers = append(headers, api.TableData{ + Name: name, + Value: value.(string), + Selector: fmt.Sprintf(`request.arguments["%s"]`, name), }) } headersMarshaled, _ := json.Marshal(headers) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Arguments", - "data": string(headersMarshaled), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Arguments", + Data: string(headersMarshaled), }) } @@ -420,55 +452,63 @@ func representQueueDeclare(event map[string]interface{}) []interface{} { func representExchangeDeclare(event map[string]interface{}) []interface{} { rep := make([]interface{}, 0) - details, _ := json.Marshal([]map[string]string{ + details, _ := json.Marshal([]api.TableData{ { - "name": "Exchange", - "value": event["Exchange"].(string), + Name: "Exchange", + Value: event["exchange"].(string), + Selector: `request.exchange`, }, { - "name": "Type", - "value": event["Type"].(string), + Name: "Type", + Value: event["type"].(string), + Selector: `request.type`, }, { - "name": "Passive", - "value": strconv.FormatBool(event["Passive"].(bool)), + Name: "Passive", + Value: strconv.FormatBool(event["passive"].(bool)), + Selector: `request.passive`, }, { - "name": "Durable", - "value": strconv.FormatBool(event["Durable"].(bool)), + Name: "Durable", + Value: strconv.FormatBool(event["durable"].(bool)), + Selector: `request.durable`, }, { - "name": "Auto Delete", - "value": strconv.FormatBool(event["AutoDelete"].(bool)), + Name: "Auto Delete", + Value: strconv.FormatBool(event["autoDelete"].(bool)), + Selector: `request.autoDelete`, }, { - "name": "Internal", - "value": strconv.FormatBool(event["Internal"].(bool)), + Name: "Internal", + Value: strconv.FormatBool(event["internal"].(bool)), + Selector: `request.internal`, }, { - "name": "NoWait", - "value": strconv.FormatBool(event["NoWait"].(bool)), + Name: "NoWait", + Value: strconv.FormatBool(event["noWait"].(bool)), + Selector: `request.noWait`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Details", - "data": string(details), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Details", + Data: string(details), }) - if event["Arguments"] != nil { - headers := make([]map[string]string, 0) - for name, value := range event["Arguments"].(map[string]interface{}) { - headers = append(headers, map[string]string{ - "name": name, - "value": value.(string), + if event["arguments"] != nil { + headers := make([]api.TableData, 0) + for name, value := range event["arguments"].(map[string]interface{}) { + headers = append(headers, api.TableData{ + Name: name, + Value: value.(string), + Selector: fmt.Sprintf(`request.arguments["%s"]`, name), }) } headersMarshaled, _ := json.Marshal(headers) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Arguments", - "data": string(headersMarshaled), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Arguments", + Data: string(headersMarshaled), }) } @@ -478,33 +518,37 @@ func representExchangeDeclare(event map[string]interface{}) []interface{} { func representConnectionStart(event map[string]interface{}) []interface{} { rep := make([]interface{}, 0) - details, _ := json.Marshal([]map[string]string{ + details, _ := json.Marshal([]api.TableData{ { - "name": "Version Major", - "value": fmt.Sprintf("%g", event["VersionMajor"].(float64)), + Name: "Version Major", + Value: fmt.Sprintf("%g", event["versionMajor"].(float64)), + Selector: `request.versionMajor`, }, { - "name": "Version Minor", - "value": fmt.Sprintf("%g", event["VersionMinor"].(float64)), + Name: "Version Minor", + Value: fmt.Sprintf("%g", event["versionMinor"].(float64)), + Selector: `request.versionMinor`, }, { - "name": "Mechanisms", - "value": event["Mechanisms"].(string), + Name: "Mechanisms", + Value: event["mechanisms"].(string), + Selector: `request.mechanisms`, }, { - "name": "Locales", - "value": event["Locales"].(string), + Name: "Locales", + Value: event["locales"].(string), + Selector: `request.locales`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Details", - "data": string(details), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Details", + Data: string(details), }) - if event["ServerProperties"] != nil { - headers := make([]map[string]string, 0) - for name, value := range event["ServerProperties"].(map[string]interface{}) { + if event["serverProperties"] != nil { + headers := make([]api.TableData, 0) + for name, value := range event["serverProperties"].(map[string]interface{}) { var outcome string switch value.(type) { case string: @@ -517,16 +561,17 @@ func representConnectionStart(event map[string]interface{}) []interface{} { default: panic("Unknown data type for the server property!") } - headers = append(headers, map[string]string{ - "name": name, - "value": outcome, + headers = append(headers, api.TableData{ + Name: name, + Value: outcome, + Selector: fmt.Sprintf(`request.serverProperties["%s"]`, name), }) } headersMarshaled, _ := json.Marshal(headers) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Server Properties", - "data": string(headersMarshaled), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Server Properties", + Data: string(headersMarshaled), }) } @@ -536,28 +581,32 @@ func representConnectionStart(event map[string]interface{}) []interface{} { func representConnectionClose(event map[string]interface{}) []interface{} { rep := make([]interface{}, 0) - details, _ := json.Marshal([]map[string]string{ + details, _ := json.Marshal([]api.TableData{ { - "name": "Reply Code", - "value": fmt.Sprintf("%g", event["ReplyCode"].(float64)), + Name: "Reply Code", + Value: fmt.Sprintf("%g", event["replyCode"].(float64)), + Selector: `request.replyCode`, }, { - "name": "Reply Text", - "value": event["ReplyText"].(string), + Name: "Reply Text", + Value: event["replyText"].(string), + Selector: `request.replyText`, }, { - "name": "Class ID", - "value": fmt.Sprintf("%g", event["ClassId"].(float64)), + Name: "Class ID", + Value: fmt.Sprintf("%g", event["classId"].(float64)), + Selector: `request.classId`, }, { - "name": "Method ID", - "value": fmt.Sprintf("%g", event["MethodId"].(float64)), + Name: "Method ID", + Value: fmt.Sprintf("%g", event["methodId"].(float64)), + Selector: `request.methodId`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Details", - "data": string(details), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Details", + Data: string(details), }) return rep @@ -566,43 +615,48 @@ func representConnectionClose(event map[string]interface{}) []interface{} { func representQueueBind(event map[string]interface{}) []interface{} { rep := make([]interface{}, 0) - details, _ := json.Marshal([]map[string]string{ + details, _ := json.Marshal([]api.TableData{ { - "name": "Queue", - "value": event["Queue"].(string), + Name: "Queue", + Value: event["queue"].(string), + Selector: `request.queue`, }, { - "name": "Exchange", - "value": event["Exchange"].(string), + Name: "Exchange", + Value: event["exchange"].(string), + Selector: `request.exchange`, }, { - "name": "RoutingKey", - "value": event["RoutingKey"].(string), + Name: "RoutingKey", + Value: event["routingKey"].(string), + Selector: `request.routingKey`, }, { - "name": "NoWait", - "value": strconv.FormatBool(event["NoWait"].(bool)), + Name: "NoWait", + Value: strconv.FormatBool(event["noWait"].(bool)), + Selector: `request.noWait`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Details", - "data": string(details), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Details", + Data: string(details), }) - if event["Arguments"] != nil { - headers := make([]map[string]string, 0) - for name, value := range event["Arguments"].(map[string]interface{}) { - headers = append(headers, map[string]string{ - "name": name, - "value": value.(string), + if event["arguments"] != nil { + headers := make([]api.TableData, 0) + for name, value := range event["arguments"].(map[string]interface{}) { + headers = append(headers, api.TableData{ + Name: name, + Value: value.(string), + Selector: fmt.Sprintf(`request.arguments["%s"]`, name), }) } headersMarshaled, _ := json.Marshal(headers) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Arguments", - "data": string(headersMarshaled), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Arguments", + Data: string(headersMarshaled), }) } @@ -612,51 +666,58 @@ func representQueueBind(event map[string]interface{}) []interface{} { func representBasicConsume(event map[string]interface{}) []interface{} { rep := make([]interface{}, 0) - details, _ := json.Marshal([]map[string]string{ + details, _ := json.Marshal([]api.TableData{ { - "name": "Queue", - "value": event["Queue"].(string), + Name: "Queue", + Value: event["queue"].(string), + Selector: `request.queue`, }, { - "name": "Consumer Tag", - "value": event["ConsumerTag"].(string), + Name: "Consumer Tag", + Value: event["consumerTag"].(string), + Selector: `request.consumerTag`, }, { - "name": "No Local", - "value": strconv.FormatBool(event["NoLocal"].(bool)), + Name: "No Local", + Value: strconv.FormatBool(event["noLocal"].(bool)), + Selector: `request.noLocal`, }, { - "name": "No Ack", - "value": strconv.FormatBool(event["NoAck"].(bool)), + Name: "No Ack", + Value: strconv.FormatBool(event["noAck"].(bool)), + Selector: `request.noAck`, }, { - "name": "Exclusive", - "value": strconv.FormatBool(event["Exclusive"].(bool)), + Name: "Exclusive", + Value: strconv.FormatBool(event["exclusive"].(bool)), + Selector: `request.exclusive`, }, { - "name": "NoWait", - "value": strconv.FormatBool(event["NoWait"].(bool)), + Name: "NoWait", + Value: strconv.FormatBool(event["noWait"].(bool)), + Selector: `request.noWait`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Details", - "data": string(details), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Details", + Data: string(details), }) - if event["Arguments"] != nil { - headers := make([]map[string]string, 0) - for name, value := range event["Arguments"].(map[string]interface{}) { - headers = append(headers, map[string]string{ - "name": name, - "value": value.(string), + if event["arguments"] != nil { + headers := make([]api.TableData, 0) + for name, value := range event["arguments"].(map[string]interface{}) { + headers = append(headers, api.TableData{ + Name: name, + Value: value.(string), + Selector: fmt.Sprintf(`request.arguments["%s"]`, name), }) } headersMarshaled, _ := json.Marshal(headers) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Arguments", - "data": string(headersMarshaled), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Arguments", + Data: string(headersMarshaled), }) } diff --git a/tap/extensions/amqp/main.go b/tap/extensions/amqp/main.go index 133e8997a..dc2bbf9bc 100644 --- a/tap/extensions/amqp/main.go +++ b/tap/extensions/amqp/main.go @@ -16,6 +16,7 @@ var protocol api.Protocol = api.Protocol{ Name: "amqp", LongName: "Advanced Message Queuing Protocol 0-9-1", Abbreviation: "AMQP", + Macro: "amqp", Version: "0-9-1", BackgroundColor: "#ff6600", ForegroundColor: "#ffffff", @@ -222,7 +223,7 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co } } -func (d dissecting) Analyze(item *api.OutputChannelItem, entryId string, resolvedSource string, resolvedDestination string) *api.MizuEntry { +func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, resolvedDestination string) *api.MizuEntry { request := item.Pair.Request.Payload.(map[string]interface{}) reqDetails := request["details"].(map[string]interface{}) service := "amqp" @@ -235,75 +236,79 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, entryId string, resolve summary := "" switch request["method"] { case basicMethodMap[40]: - summary = reqDetails["Exchange"].(string) + summary = reqDetails["exchange"].(string) break case basicMethodMap[60]: - summary = reqDetails["Exchange"].(string) + summary = reqDetails["exchange"].(string) break case exchangeMethodMap[10]: - summary = reqDetails["Exchange"].(string) + summary = reqDetails["exchange"].(string) break case queueMethodMap[10]: - summary = reqDetails["Queue"].(string) + summary = reqDetails["queue"].(string) break case connectionMethodMap[10]: summary = fmt.Sprintf( "%s.%s", - strconv.Itoa(int(reqDetails["VersionMajor"].(float64))), - strconv.Itoa(int(reqDetails["VersionMinor"].(float64))), + strconv.Itoa(int(reqDetails["versionMajor"].(float64))), + strconv.Itoa(int(reqDetails["versionMinor"].(float64))), ) break case connectionMethodMap[50]: - summary = reqDetails["ReplyText"].(string) + summary = reqDetails["replyText"].(string) break case queueMethodMap[20]: - summary = reqDetails["Queue"].(string) + summary = reqDetails["queue"].(string) break case basicMethodMap[20]: - summary = reqDetails["Queue"].(string) + summary = reqDetails["queue"].(string) break } request["url"] = summary - entryBytes, _ := json.Marshal(item.Pair) + reqDetails["method"] = request["method"] return &api.MizuEntry{ - ProtocolName: protocol.Name, - ProtocolLongName: protocol.LongName, - ProtocolAbbreviation: protocol.Abbreviation, - ProtocolVersion: protocol.Version, - ProtocolBackgroundColor: protocol.BackgroundColor, - ProtocolForegroundColor: protocol.ForegroundColor, - ProtocolFontSize: protocol.FontSize, - ProtocolReferenceLink: protocol.ReferenceLink, - EntryId: entryId, - Entry: string(entryBytes), - Url: fmt.Sprintf("%s%s", service, summary), - Method: request["method"].(string), - Status: 0, - RequestSenderIp: item.ConnectionInfo.ClientIP, - Service: service, - Timestamp: item.Timestamp, - ElapsedTime: 0, - Path: summary, - ResolvedSource: resolvedSource, - ResolvedDestination: resolvedDestination, - SourceIp: item.ConnectionInfo.ClientIP, - DestinationIp: item.ConnectionInfo.ServerIP, - SourcePort: item.ConnectionInfo.ClientPort, - DestinationPort: item.ConnectionInfo.ServerPort, - IsOutgoing: item.ConnectionInfo.IsOutgoing, + Protocol: protocol, + Source: &api.TCP{ + Name: resolvedSource, + IP: item.ConnectionInfo.ClientIP, + Port: item.ConnectionInfo.ClientPort, + }, + Destination: &api.TCP{ + Name: resolvedDestination, + IP: item.ConnectionInfo.ServerIP, + Port: item.ConnectionInfo.ServerPort, + }, + Outgoing: item.ConnectionInfo.IsOutgoing, + Request: reqDetails, + Url: fmt.Sprintf("%s%s", service, summary), + Method: request["method"].(string), + Status: 0, + RequestSenderIp: item.ConnectionInfo.ClientIP, + Service: service, + Timestamp: item.Timestamp, + StartTime: item.Pair.Request.CaptureTime, + ElapsedTime: 0, + Summary: summary, + ResolvedSource: resolvedSource, + ResolvedDestination: resolvedDestination, + SourceIp: item.ConnectionInfo.ClientIP, + DestinationIp: item.ConnectionInfo.ServerIP, + SourcePort: item.ConnectionInfo.ClientPort, + DestinationPort: item.ConnectionInfo.ServerPort, + IsOutgoing: item.ConnectionInfo.IsOutgoing, } } func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { return &api.BaseEntryDetails{ - Id: entry.EntryId, + Id: entry.Id, Protocol: protocol, Url: entry.Url, RequestSenderIp: entry.RequestSenderIp, Service: entry.Service, - Summary: entry.Path, + Summary: entry.Summary, StatusCode: entry.Status, Method: entry.Method, Timestamp: entry.Timestamp, @@ -320,39 +325,35 @@ func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { } } -func (d dissecting) Represent(entry *api.MizuEntry) (p api.Protocol, object []byte, bodySize int64, err error) { - p = protocol +func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface{}, response map[string]interface{}) (protoOut api.Protocol, object []byte, bodySize int64, err error) { + protoOut = protocol bodySize = 0 - var root map[string]interface{} - json.Unmarshal([]byte(entry.Entry), &root) representation := make(map[string]interface{}, 0) - request := root["request"].(map[string]interface{})["payload"].(map[string]interface{}) var repRequest []interface{} - details := request["details"].(map[string]interface{}) switch request["method"].(string) { case basicMethodMap[40]: - repRequest = representBasicPublish(details) + repRequest = representBasicPublish(request) break case basicMethodMap[60]: - repRequest = representBasicDeliver(details) + repRequest = representBasicDeliver(request) break case queueMethodMap[10]: - repRequest = representQueueDeclare(details) + repRequest = representQueueDeclare(request) break case exchangeMethodMap[10]: - repRequest = representExchangeDeclare(details) + repRequest = representExchangeDeclare(request) break case connectionMethodMap[10]: - repRequest = representConnectionStart(details) + repRequest = representConnectionStart(request) break case connectionMethodMap[50]: - repRequest = representConnectionClose(details) + repRequest = representConnectionClose(request) break case queueMethodMap[20]: - repRequest = representQueueBind(details) + repRequest = representQueueBind(request) break case basicMethodMap[20]: - repRequest = representBasicConsume(details) + repRequest = representBasicConsume(request) break } representation["request"] = repRequest @@ -360,4 +361,10 @@ func (d dissecting) Represent(entry *api.MizuEntry) (p api.Protocol, object []by return } +func (d dissecting) Macros() map[string]string { + return map[string]string{ + `amqp`: fmt.Sprintf(`proto.abbr == "%s"`, protocol.Abbreviation), + } +} + var Dissector dissecting diff --git a/tap/extensions/amqp/spec091.go b/tap/extensions/amqp/spec091.go index 3dd3dcbd3..0af77a26c 100644 --- a/tap/extensions/amqp/spec091.go +++ b/tap/extensions/amqp/spec091.go @@ -71,11 +71,11 @@ func isSoftExceptionCode(code int) bool { } type ConnectionStart struct { - VersionMajor byte - VersionMinor byte - ServerProperties Table - Mechanisms string - Locales string + VersionMajor byte `json:"versionMajor"` + VersionMinor byte `json:"versionMinor"` + ServerProperties Table `json:"serverProperties"` + Mechanisms string `json:"mechanisms"` + Locales string `json:"locales"` } func (msg *ConnectionStart) id() (uint16, uint16) { @@ -429,10 +429,10 @@ func (msg *connectionOpenOk) read(r io.Reader) (err error) { } type ConnectionClose struct { - ReplyCode uint16 - ReplyText string - ClassId uint16 - MethodId uint16 + ReplyCode uint16 `json:"relyCode"` + ReplyText string `json:"replyText"` + ClassId uint16 `json:"classId"` + MethodId uint16 `json:"methodId"` } func (msg *ConnectionClose) id() (uint16, uint16) { @@ -767,14 +767,14 @@ func (msg *channelCloseOk) read(r io.Reader) (err error) { type ExchangeDeclare struct { reserved1 uint16 - Exchange string - Type string - Passive bool - Durable bool - AutoDelete bool - Internal bool - NoWait bool - Arguments Table + Exchange string `json:"exchange"` + Type string `json:"type"` + Passive bool `json:"passive"` + Durable bool `json:"durable"` + AutoDelete bool `json:"autoDelete"` + Internal bool `json:"internal"` + NoWait bool `json:"noWait"` + Arguments Table `json:"arguments"` } func (msg *ExchangeDeclare) id() (uint16, uint16) { @@ -1163,13 +1163,13 @@ func (msg *exchangeUnbindOk) read(r io.Reader) (err error) { type QueueDeclare struct { reserved1 uint16 - Queue string - Passive bool - Durable bool - Exclusive bool - AutoDelete bool - NoWait bool - Arguments Table + Queue string `json:"queue"` + Passive bool `json:"passive"` + Durable bool `json:"durable"` + Exclusive bool `json:"exclusive"` + AutoDelete bool `json:"autoDelete"` + NoWait bool `json:"noWait"` + Arguments Table `json:"arguments"` } func (msg *QueueDeclare) id() (uint16, uint16) { @@ -1297,11 +1297,11 @@ func (msg *QueueDeclareOk) read(r io.Reader) (err error) { type QueueBind struct { reserved1 uint16 - Queue string - Exchange string - RoutingKey string - NoWait bool - Arguments Table + Queue string `json:"queue"` + Exchange string `json:"exchange"` + RoutingKey string `json:"routingKey"` + NoWait bool `json:"noWait"` + Arguments Table `json:"arguments"` } func (msg *QueueBind) id() (uint16, uint16) { @@ -1737,13 +1737,13 @@ func (msg *basicQosOk) read(r io.Reader) (err error) { type BasicConsume struct { reserved1 uint16 - Queue string - ConsumerTag string - NoLocal bool - NoAck bool - Exclusive bool - NoWait bool - Arguments Table + Queue string `json:"queue"` + ConsumerTag string `json:"consumerTag"` + NoLocal bool `json:"noLocal"` + NoAck bool `json:"noAck"` + Exclusive bool `json:"exclusive"` + NoWait bool `json:"noWait"` + Arguments Table `json:"arguments"` } func (msg *BasicConsume) id() (uint16, uint16) { @@ -1932,12 +1932,12 @@ func (msg *basicCancelOk) read(r io.Reader) (err error) { type BasicPublish struct { reserved1 uint16 - Exchange string - RoutingKey string - Mandatory bool - Immediate bool - Properties Properties - Body []byte + Exchange string `json:"exchange"` + RoutingKey string `json:"routingKey"` + Mandatory bool `json:"mandatory"` + Immediate bool `json:"immediate"` + Properties Properties `json:"properties"` + Body []byte `json:"body"` } func (msg *BasicPublish) id() (uint16, uint16) { @@ -2072,13 +2072,13 @@ func (msg *basicReturn) read(r io.Reader) (err error) { } type BasicDeliver struct { - ConsumerTag string - DeliveryTag uint64 - Redelivered bool - Exchange string - RoutingKey string - Properties Properties - Body []byte + ConsumerTag string `json:"consumerTag"` + DeliveryTag uint64 `json:"deliveryTag"` + Redelivered bool `json:"redelivered"` + Exchange string `json:"exchange"` + RoutingKey string `json:"routingKey"` + Properties Properties `json:"properties"` + Body []byte `json:"body"` } func (msg *BasicDeliver) id() (uint16, uint16) { diff --git a/tap/extensions/amqp/types.go b/tap/extensions/amqp/types.go index ea57556fa..1adee51c6 100644 --- a/tap/extensions/amqp/types.go +++ b/tap/extensions/amqp/types.go @@ -93,19 +93,19 @@ func (e Error) Error() string { // Used by header frames to capture routing and header information type Properties struct { - ContentType string // MIME content type - ContentEncoding string // MIME content encoding - Headers Table // Application or header exchange table - DeliveryMode uint8 // queue implementation use - Transient (1) or Persistent (2) - Priority uint8 // queue implementation use - 0 to 9 - CorrelationId string // application use - correlation identifier - ReplyTo string // application use - address to to reply to (ex: RPC) - Expiration string // implementation use - message expiration spec - MessageId string // application use - message identifier - Timestamp time.Time // application use - message timestamp - Type string // application use - message type name - UserId string // application use - creating user id - AppId string // application use - creating application + ContentType string `json:"contentType"` // MIME content type + ContentEncoding string `json:"contentEncoding"` // MIME content encoding + Headers Table `json:"headers"` // Application or header exchange table + DeliveryMode uint8 `json:"deliveryMode"` // queue implementation use - Transient (1) or Persistent (2) + Priority uint8 `json:"priority"` // queue implementation use - 0 to 9 + CorrelationId string `json:"correlationId"` // application use - correlation identifier + ReplyTo string `json:"replyTo"` // application use - address to to reply to (ex: RPC) + Expiration string `json:"expiration"` // implementation use - message expiration spec + MessageId string `json:"messageId"` // application use - message identifier + Timestamp time.Time `json:"timestamp"` // application use - message timestamp + Type string `json:"type"` // application use - message type name + UserId string `json:"userId"` // application use - creating user id + AppId string `json:"appId"` // application use - creating application reserved1 string // was cluster-id - process for buffer consumption } diff --git a/tap/extensions/http/helpers.go b/tap/extensions/http/helpers.go new file mode 100644 index 000000000..9348ea3cd --- /dev/null +++ b/tap/extensions/http/helpers.go @@ -0,0 +1,35 @@ +package main + +import ( + "encoding/json" + "fmt" + + "github.com/up9inc/mizu/tap/api" +) + +func mapSliceRebuildAsMap(mapSlice []interface{}) (newMap map[string]interface{}) { + newMap = make(map[string]interface{}) + for _, header := range mapSlice { + h := header.(map[string]interface{}) + newMap[h["name"].(string)] = h["value"] + } + + return +} + +func representMapSliceAsTable(mapSlice []interface{}, selectorPrefix string) (representation string) { + var table []api.TableData + for _, header := range mapSlice { + h := header.(map[string]interface{}) + selector := fmt.Sprintf("%s[\"%s\"]", selectorPrefix, h["name"].(string)) + table = append(table, api.TableData{ + Name: h["name"].(string), + Value: h["value"], + Selector: selector, + }) + } + + obj, _ := json.Marshal(table) + representation = string(obj) + return +} diff --git a/tap/extensions/http/main.go b/tap/extensions/http/main.go index 3ca432a71..b58fc7a02 100644 --- a/tap/extensions/http/main.go +++ b/tap/extensions/http/main.go @@ -17,6 +17,7 @@ var protocol api.Protocol = api.Protocol{ Name: "http", LongName: "Hypertext Transfer Protocol -- HTTP/1.1", Abbreviation: "HTTP", + Macro: "http", Version: "1.1", BackgroundColor: "#205cf5", ForegroundColor: "#ffffff", @@ -30,6 +31,7 @@ var http2Protocol api.Protocol = api.Protocol{ Name: "http", LongName: "Hypertext Transfer Protocol Version 2 (HTTP/2) (gRPC)", Abbreviation: "HTTP/2", + Macro: "grpc", Version: "2.0", BackgroundColor: "#244c5a", ForegroundColor: "#ffffff", @@ -117,7 +119,7 @@ func SetHostname(address, newHostname string) string { return replacedUrl.String() } -func (d dissecting) Analyze(item *api.OutputChannelItem, entryId string, resolvedSource string, resolvedDestination string) *api.MizuEntry { +func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, resolvedDestination string) *api.MizuEntry { var host, scheme, authority, path, service string request := item.Pair.Request.Payload.(map[string]interface{}) @@ -145,10 +147,32 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, entryId string, resolve service = fmt.Sprintf("%s://%s", scheme, authority) } else { service = fmt.Sprintf("http://%s", host) - path = reqDetails["url"].(string) + u, err := url.Parse(reqDetails["url"].(string)) + if err != nil { + path = reqDetails["url"].(string) + } else { + path = u.Path + } } - request["url"] = path + request["url"] = reqDetails["url"].(string) + reqDetails["path"] = path + reqDetails["summary"] = path + + // Rearrange the maps for the querying + reqDetails["_headers"] = reqDetails["headers"] + reqDetails["headers"] = mapSliceRebuildAsMap(reqDetails["_headers"].([]interface{})) + resDetails["_headers"] = resDetails["headers"] + resDetails["headers"] = mapSliceRebuildAsMap(resDetails["_headers"].([]interface{})) + + reqDetails["_cookies"] = reqDetails["cookies"] + reqDetails["cookies"] = mapSliceRebuildAsMap(reqDetails["_cookies"].([]interface{})) + resDetails["_cookies"] = resDetails["cookies"] + resDetails["cookies"] = mapSliceRebuildAsMap(resDetails["_cookies"].([]interface{})) + + reqDetails["_queryString"] = reqDetails["queryString"] + reqDetails["queryString"] = mapSliceRebuildAsMap(reqDetails["_queryString"].([]interface{})) + if resolvedDestination != "" { service = SetHostname(service, resolvedDestination) } else if resolvedSource != "" { @@ -156,51 +180,59 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, entryId string, resolve } elapsedTime := item.Pair.Response.CaptureTime.Sub(item.Pair.Request.CaptureTime).Round(time.Millisecond).Milliseconds() - entryBytes, _ := json.Marshal(item.Pair) + httpPair, _ := json.Marshal(item.Pair) + _protocol := protocol + _protocol.Version = item.Protocol.Version return &api.MizuEntry{ - ProtocolName: protocol.Name, - ProtocolLongName: protocol.LongName, - ProtocolAbbreviation: protocol.Abbreviation, - ProtocolVersion: item.Protocol.Version, - ProtocolBackgroundColor: protocol.BackgroundColor, - ProtocolForegroundColor: protocol.ForegroundColor, - ProtocolFontSize: protocol.FontSize, - ProtocolReferenceLink: protocol.ReferenceLink, - EntryId: entryId, - Entry: string(entryBytes), - Url: fmt.Sprintf("%s%s", service, path), - Method: reqDetails["method"].(string), - Status: int(resDetails["status"].(float64)), - RequestSenderIp: item.ConnectionInfo.ClientIP, - Service: service, - Timestamp: item.Timestamp, - ElapsedTime: elapsedTime, - Path: path, - ResolvedSource: resolvedSource, - ResolvedDestination: resolvedDestination, - SourceIp: item.ConnectionInfo.ClientIP, - DestinationIp: item.ConnectionInfo.ServerIP, - SourcePort: item.ConnectionInfo.ClientPort, - DestinationPort: item.ConnectionInfo.ServerPort, - IsOutgoing: item.ConnectionInfo.IsOutgoing, + Protocol: _protocol, + Source: &api.TCP{ + Name: resolvedSource, + IP: item.ConnectionInfo.ClientIP, + Port: item.ConnectionInfo.ClientPort, + }, + Destination: &api.TCP{ + Name: resolvedDestination, + IP: item.ConnectionInfo.ServerIP, + Port: item.ConnectionInfo.ServerPort, + }, + Outgoing: item.ConnectionInfo.IsOutgoing, + Request: reqDetails, + Response: resDetails, + Url: fmt.Sprintf("%s%s", service, path), + Method: reqDetails["method"].(string), + Status: int(resDetails["status"].(float64)), + RequestSenderIp: item.ConnectionInfo.ClientIP, + Service: service, + Timestamp: item.Timestamp, + StartTime: item.Pair.Request.CaptureTime, + ElapsedTime: elapsedTime, + Summary: path, + ResolvedSource: resolvedSource, + ResolvedDestination: resolvedDestination, + SourceIp: item.ConnectionInfo.ClientIP, + DestinationIp: item.ConnectionInfo.ServerIP, + SourcePort: item.ConnectionInfo.ClientPort, + DestinationPort: item.ConnectionInfo.ServerPort, + IsOutgoing: item.ConnectionInfo.IsOutgoing, + HTTPPair: string(httpPair), } } func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { var p api.Protocol - if entry.ProtocolVersion == "2.0" { + if entry.Protocol.Version == "2.0" { p = http2Protocol } else { p = protocol } return &api.BaseEntryDetails{ - Id: entry.EntryId, + Id: entry.Id, Protocol: p, Url: entry.Url, RequestSenderIp: entry.RequestSenderIp, Service: entry.Service, Path: entry.Path, - Summary: entry.Path, + Summary: entry.Summary, StatusCode: entry.Status, Method: entry.Method, Timestamp: entry.Timestamp, @@ -218,45 +250,50 @@ func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { } func representRequest(request map[string]interface{}) (repRequest []interface{}) { - details, _ := json.Marshal([]map[string]string{ + details, _ := json.Marshal([]api.TableData{ { - "name": "Method", - "value": request["method"].(string), + Name: "Method", + Value: request["method"].(string), + Selector: `request.method`, }, { - "name": "URL", - "value": request["url"].(string), + Name: "URL", + Value: request["url"].(string), + Selector: `request.url`, }, { - "name": "Body Size", - "value": fmt.Sprintf("%g bytes", request["bodySize"].(float64)), + Name: "Path", + Value: request["path"].(string), + Selector: `request.path`, + }, + { + Name: "Body Size (bytes)", + Value: int64(request["bodySize"].(float64)), + Selector: `request.bodySize`, }, }) - repRequest = append(repRequest, map[string]string{ - "type": api.TABLE, - "title": "Details", - "data": string(details), + repRequest = append(repRequest, api.SectionData{ + Type: api.TABLE, + Title: "Details", + Data: string(details), }) - headers, _ := json.Marshal(request["headers"].([]interface{})) - repRequest = append(repRequest, map[string]string{ - "type": api.TABLE, - "title": "Headers", - "data": string(headers), + repRequest = append(repRequest, api.SectionData{ + Type: api.TABLE, + Title: "Headers", + Data: representMapSliceAsTable(request["_headers"].([]interface{}), `request.headers`), }) - cookies, _ := json.Marshal(request["cookies"].([]interface{})) - repRequest = append(repRequest, map[string]string{ - "type": api.TABLE, - "title": "Cookies", - "data": string(cookies), + repRequest = append(repRequest, api.SectionData{ + Type: api.TABLE, + Title: "Cookies", + Data: representMapSliceAsTable(request["_cookies"].([]interface{}), `request.cookies`), }) - queryString, _ := json.Marshal(request["queryString"].([]interface{})) - repRequest = append(repRequest, map[string]string{ - "type": api.TABLE, - "title": "Query String", - "data": string(queryString), + repRequest = append(repRequest, api.SectionData{ + Type: api.TABLE, + Title: "Query String", + Data: representMapSliceAsTable(request["_queryString"].([]interface{}), `request.queryString`), }) postData, _ := request["postData"].(map[string]interface{}) @@ -266,12 +303,12 @@ func representRequest(request map[string]interface{}) (repRequest []interface{}) } text, _ := postData["text"] if text != nil { - repRequest = append(repRequest, map[string]string{ - "type": api.BODY, - "title": "POST Data (text/plain)", - "encoding": "", - "mime_type": mimeType.(string), - "data": text.(string), + repRequest = append(repRequest, api.SectionData{ + Type: api.BODY, + Title: "POST Data (text/plain)", + MimeType: mimeType.(string), + Data: text.(string), + Selector: `request.postData.text`, }) } @@ -285,16 +322,16 @@ func representRequest(request map[string]interface{}) (repRequest []interface{}) "value": string(params), }, }) - repRequest = append(repRequest, map[string]string{ - "type": api.TABLE, - "title": "POST Data (multipart/form-data)", - "data": string(multipart), + repRequest = append(repRequest, api.SectionData{ + Type: api.TABLE, + Title: "POST Data (multipart/form-data)", + Data: string(multipart), }) } else { - repRequest = append(repRequest, map[string]string{ - "type": api.TABLE, - "title": "POST Data (application/x-www-form-urlencoded)", - "data": string(params), + repRequest = append(repRequest, api.SectionData{ + Type: api.TABLE, + Title: "POST Data (application/x-www-form-urlencoded)", + Data: representMapSliceAsTable(postData["params"].([]interface{}), `request.postData.params`), }) } } @@ -308,38 +345,39 @@ func representResponse(response map[string]interface{}) (repResponse []interface bodySize = int64(response["bodySize"].(float64)) - details, _ := json.Marshal([]map[string]string{ + details, _ := json.Marshal([]api.TableData{ { - "name": "Status", - "value": fmt.Sprintf("%g", response["status"].(float64)), + Name: "Status", + Value: int64(response["status"].(float64)), + Selector: `response.status`, }, { - "name": "Status Text", - "value": response["statusText"].(string), + Name: "Status Text", + Value: response["statusText"].(string), + Selector: `response.statusText`, }, { - "name": "Body Size", - "value": fmt.Sprintf("%d bytes", bodySize), + Name: "Body Size (bytes)", + Value: bodySize, + Selector: `response.bodySize`, }, }) - repResponse = append(repResponse, map[string]string{ - "type": api.TABLE, - "title": "Details", - "data": string(details), + repResponse = append(repResponse, api.SectionData{ + Type: api.TABLE, + Title: "Details", + Data: string(details), }) - headers, _ := json.Marshal(response["headers"].([]interface{})) - repResponse = append(repResponse, map[string]string{ - "type": api.TABLE, - "title": "Headers", - "data": string(headers), + repResponse = append(repResponse, api.SectionData{ + Type: api.TABLE, + Title: "Headers", + Data: representMapSliceAsTable(response["_headers"].([]interface{}), `response.headers`), }) - cookies, _ := json.Marshal(response["cookies"].([]interface{})) - repResponse = append(repResponse, map[string]string{ - "type": api.TABLE, - "title": "Cookies", - "data": string(cookies), + repResponse = append(repResponse, api.SectionData{ + Type: api.TABLE, + Title: "Cookies", + Data: representMapSliceAsTable(response["_cookies"].([]interface{}), `response.cookies`), }) content, _ := response["content"].(map[string]interface{}) @@ -350,37 +388,40 @@ func representResponse(response map[string]interface{}) (repResponse []interface encoding, _ := content["encoding"] text, _ := content["text"] if text != nil { - repResponse = append(repResponse, map[string]string{ - "type": api.BODY, - "title": "Body", - "encoding": encoding.(string), - "mime_type": mimeType.(string), - "data": text.(string), + repResponse = append(repResponse, api.SectionData{ + Type: api.BODY, + Title: "Body", + Encoding: encoding.(string), + MimeType: mimeType.(string), + Data: text.(string), + Selector: `response.content.text`, }) } return } -func (d dissecting) Represent(entry *api.MizuEntry) (p api.Protocol, object []byte, bodySize int64, err error) { - if entry.ProtocolVersion == "2.0" { - p = http2Protocol +func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface{}, response map[string]interface{}) (protoOut api.Protocol, object []byte, bodySize int64, err error) { + if protoIn.Version == "2.0" { + protoOut = http2Protocol } else { - p = protocol + protoOut = protocol } - var root map[string]interface{} - json.Unmarshal([]byte(entry.Entry), &root) representation := make(map[string]interface{}, 0) - request := root["request"].(map[string]interface{})["payload"].(map[string]interface{}) - response := root["response"].(map[string]interface{})["payload"].(map[string]interface{}) - reqDetails := request["details"].(map[string]interface{}) - resDetails := response["details"].(map[string]interface{}) - repRequest := representRequest(reqDetails) - repResponse, bodySize := representResponse(resDetails) + repRequest := representRequest(request) + repResponse, bodySize := representResponse(response) representation["request"] = repRequest representation["response"] = repResponse object, err = json.Marshal(representation) return } +func (d dissecting) Macros() map[string]string { + return map[string]string{ + `http`: fmt.Sprintf(`proto.abbr == "%s"`, protocol.Abbreviation), + `grpc`: fmt.Sprintf(`proto.abbr == "%s" and proto.version == "%s"`, protocol.Abbreviation, http2Protocol.Version), + `http2`: fmt.Sprintf(`proto.abbr == "%s" and proto.version == "%s"`, protocol.Abbreviation, http2Protocol.Version), + } +} + var Dissector dissecting diff --git a/tap/extensions/kafka/helpers.go b/tap/extensions/kafka/helpers.go index 3a9a238eb..dffe30bd8 100644 --- a/tap/extensions/kafka/helpers.go +++ b/tap/extensions/kafka/helpers.go @@ -27,48 +27,54 @@ type KafkaWrapper struct { } func representRequestHeader(data map[string]interface{}, rep []interface{}) []interface{} { - requestHeader, _ := json.Marshal([]map[string]string{ + requestHeader, _ := json.Marshal([]api.TableData{ { - "name": "ApiKey", - "value": apiNames[int(data["ApiKey"].(float64))], + Name: "ApiKey", + Value: apiNames[int(data["apiKey"].(float64))], + Selector: `request.apiKey`, }, { - "name": "ApiVersion", - "value": fmt.Sprintf("%d", int(data["ApiVersion"].(float64))), + Name: "ApiVersion", + Value: fmt.Sprintf("%d", int(data["apiVersion"].(float64))), + Selector: `request.apiVersion`, }, { - "name": "Client ID", - "value": data["ClientID"].(string), + Name: "Client ID", + Value: data["clientID"].(string), + Selector: `request.clientID`, }, { - "name": "Correlation ID", - "value": fmt.Sprintf("%d", int(data["CorrelationID"].(float64))), + Name: "Correlation ID", + Value: fmt.Sprintf("%d", int(data["correlationID"].(float64))), + Selector: `request.correlationID`, }, { - "name": "Size", - "value": fmt.Sprintf("%d", int(data["Size"].(float64))), + Name: "Size", + Value: fmt.Sprintf("%d", int(data["size"].(float64))), + Selector: `request.size`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Request Header", - "data": string(requestHeader), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Request Header", + Data: string(requestHeader), }) return rep } func representResponseHeader(data map[string]interface{}, rep []interface{}) []interface{} { - requestHeader, _ := json.Marshal([]map[string]string{ + requestHeader, _ := json.Marshal([]api.TableData{ { - "name": "Correlation ID", - "value": fmt.Sprintf("%d", int(data["CorrelationID"].(float64))), + Name: "Correlation ID", + Value: fmt.Sprintf("%d", int(data["correlationID"].(float64))), + Selector: `response.correlationID`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Response Header", - "data": string(requestHeader), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Response Header", + Data: string(requestHeader), }) return rep @@ -79,46 +85,50 @@ func representMetadataRequest(data map[string]interface{}) []interface{} { rep = representRequestHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) + payload := data["payload"].(map[string]interface{}) topics := "" allowAutoTopicCreation := "" includeClusterAuthorizedOperations := "" includeTopicAuthorizedOperations := "" - if payload["Topics"] != nil { - x, _ := json.Marshal(payload["Topics"].([]interface{})) + if payload["topics"] != nil { + x, _ := json.Marshal(payload["topics"].([]interface{})) topics = string(x) } - if payload["AllowAutoTopicCreation"] != nil { - allowAutoTopicCreation = strconv.FormatBool(payload["AllowAutoTopicCreation"].(bool)) + if payload["allowAutoTopicCreation"] != nil { + allowAutoTopicCreation = strconv.FormatBool(payload["allowAutoTopicCreation"].(bool)) } - if payload["IncludeClusterAuthorizedOperations"] != nil { - includeClusterAuthorizedOperations = strconv.FormatBool(payload["IncludeClusterAuthorizedOperations"].(bool)) + if payload["includeClusterAuthorizedOperations"] != nil { + includeClusterAuthorizedOperations = strconv.FormatBool(payload["includeClusterAuthorizedOperations"].(bool)) } - if payload["IncludeTopicAuthorizedOperations"] != nil { - includeTopicAuthorizedOperations = strconv.FormatBool(payload["IncludeTopicAuthorizedOperations"].(bool)) + if payload["includeTopicAuthorizedOperations"] != nil { + includeTopicAuthorizedOperations = strconv.FormatBool(payload["includeTopicAuthorizedOperations"].(bool)) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Topics", - "value": topics, + Name: "Topics", + Value: topics, + Selector: `request.payload.topics`, }, { - "name": "Allow Auto Topic Creation", - "value": allowAutoTopicCreation, + Name: "Allow Auto Topic Creation", + Value: allowAutoTopicCreation, + Selector: `request.payload.allowAutoTopicCreation`, }, { - "name": "Include Cluster Authorized Operations", - "value": includeClusterAuthorizedOperations, + Name: "Include Cluster Authorized Operations", + Value: includeClusterAuthorizedOperations, + Selector: `request.payload.includeClusterAuthorizedOperations`, }, { - "name": "Include Topic Authorized Operations", - "value": includeTopicAuthorizedOperations, + Name: "Include Topic Authorized Operations", + Value: includeTopicAuthorizedOperations, + Selector: `request.payload.includeTopicAuthorizedOperations`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -129,63 +139,69 @@ func representMetadataResponse(data map[string]interface{}) []interface{} { rep = representResponseHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) + payload := data["payload"].(map[string]interface{}) topics := "" - if payload["Topics"] != nil { - _topics, _ := json.Marshal(payload["Topics"].([]interface{})) + if payload["topics"] != nil { + _topics, _ := json.Marshal(payload["topics"].([]interface{})) topics = string(_topics) } brokers := "" - if payload["Brokers"] != nil { - _brokers, _ := json.Marshal(payload["Brokers"].([]interface{})) + if payload["brokers"] != nil { + _brokers, _ := json.Marshal(payload["brokers"].([]interface{})) brokers = string(_brokers) } controllerID := "" clusterID := "" throttleTimeMs := "" clusterAuthorizedOperations := "" - if payload["ControllerID"] != nil { - controllerID = fmt.Sprintf("%d", int(payload["ControllerID"].(float64))) + if payload["controllerID"] != nil { + controllerID = fmt.Sprintf("%d", int(payload["controllerID"].(float64))) } - if payload["ClusterID"] != nil { - clusterID = payload["ClusterID"].(string) + if payload["clusterID"] != nil { + clusterID = payload["clusterID"].(string) } - if payload["ThrottleTimeMs"] != nil { - throttleTimeMs = fmt.Sprintf("%d", int(payload["ThrottleTimeMs"].(float64))) + if payload["throttleTimeMs"] != nil { + throttleTimeMs = fmt.Sprintf("%d", int(payload["throttleTimeMs"].(float64))) } - if payload["ClusterAuthorizedOperations"] != nil { - clusterAuthorizedOperations = fmt.Sprintf("%d", int(payload["ClusterAuthorizedOperations"].(float64))) + if payload["clusterAuthorizedOperations"] != nil { + clusterAuthorizedOperations = fmt.Sprintf("%d", int(payload["clusterAuthorizedOperations"].(float64))) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Throttle Time (ms)", - "value": throttleTimeMs, + Name: "Throttle Time (ms)", + Value: throttleTimeMs, + Selector: `response.payload.throttleTimeMs`, }, { - "name": "Brokers", - "value": brokers, + Name: "Brokers", + Value: brokers, + Selector: `response.payload.brokers`, }, { - "name": "Cluster ID", - "value": clusterID, + Name: "Cluster ID", + Value: clusterID, + Selector: `response.payload.clusterID`, }, { - "name": "Controller ID", - "value": controllerID, + Name: "Controller ID", + Value: controllerID, + Selector: `response.payload.controllerID`, }, { - "name": "Topics", - "value": topics, + Name: "Topics", + Value: topics, + Selector: `response.payload.topics`, }, { - "name": "Cluster Authorized Operations", - "value": clusterAuthorizedOperations, + Name: "Cluster Authorized Operations", + Value: clusterAuthorizedOperations, + Selector: `response.payload.clusterAuthorizedOperations`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -196,29 +212,31 @@ func representApiVersionsRequest(data map[string]interface{}) []interface{} { rep = representRequestHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) + payload := data["payload"].(map[string]interface{}) clientSoftwareName := "" clientSoftwareVersion := "" - if payload["ClientSoftwareName"] != nil { - clientSoftwareName = payload["ClientSoftwareName"].(string) + if payload["clientSoftwareName"] != nil { + clientSoftwareName = payload["clientSoftwareName"].(string) } - if payload["ClientSoftwareVersion"] != nil { - clientSoftwareVersion = payload["ClientSoftwareVersion"].(string) + if payload["clientSoftwareVersion"] != nil { + clientSoftwareVersion = payload["clientSoftwareVersion"].(string) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Client Software Name", - "value": clientSoftwareName, + Name: "Client Software Name", + Value: clientSoftwareName, + Selector: `request.payload.clientSoftwareName`, }, { - "name": "Client Software Version", - "value": clientSoftwareVersion, + Name: "Client Software Version", + Value: clientSoftwareVersion, + Selector: `request.payload.clientSoftwareVersion`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -229,34 +247,37 @@ func representApiVersionsResponse(data map[string]interface{}) []interface{} { rep = representResponseHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) + payload := data["payload"].(map[string]interface{}) apiKeys := "" - if payload["TopicNames"] != nil { - x, _ := json.Marshal(payload["ApiKeys"].([]interface{})) + if payload["apiKeys"] != nil { + x, _ := json.Marshal(payload["apiKeys"].([]interface{})) apiKeys = string(x) } throttleTimeMs := "" - if payload["ThrottleTimeMs"] != nil { - throttleTimeMs = fmt.Sprintf("%d", int(payload["ThrottleTimeMs"].(float64))) + if payload["throttleTimeMs"] != nil { + throttleTimeMs = fmt.Sprintf("%d", int(payload["throttleTimeMs"].(float64))) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Error Code", - "value": fmt.Sprintf("%d", int(payload["ErrorCode"].(float64))), + Name: "Error Code", + Value: fmt.Sprintf("%d", int(payload["errorCode"].(float64))), + Selector: `response.payload.errorCode`, }, { - "name": "ApiKeys", - "value": apiKeys, + Name: "ApiKeys", + Value: apiKeys, + Selector: `response.payload.apiKeys`, }, { - "name": "Throttle Time (ms)", - "value": throttleTimeMs, + Name: "Throttle Time (ms)", + Value: throttleTimeMs, + Selector: `response.payload.throttleTimeMs`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -267,39 +288,43 @@ func representProduceRequest(data map[string]interface{}) []interface{} { rep = representRequestHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) + payload := data["payload"].(map[string]interface{}) topicData := "" - _topicData := payload["TopicData"] + _topicData := payload["topicData"] if _topicData != nil { x, _ := json.Marshal(_topicData.([]interface{})) topicData = string(x) } transactionalID := "" - if payload["TransactionalID"] != nil { - transactionalID = payload["TransactionalID"].(string) + if payload["transactionalID"] != nil { + transactionalID = payload["transactionalID"].(string) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Transactional ID", - "value": transactionalID, + Name: "Transactional ID", + Value: transactionalID, + Selector: `request.payload.transactionalID`, }, { - "name": "Required Acknowledgements", - "value": fmt.Sprintf("%d", int(payload["RequiredAcks"].(float64))), + Name: "Required Acknowledgements", + Value: fmt.Sprintf("%d", int(payload["requiredAcks"].(float64))), + Selector: `request.payload.requiredAcks`, }, { - "name": "Timeout", - "value": fmt.Sprintf("%d", int(payload["Timeout"].(float64))), + Name: "Timeout", + Value: fmt.Sprintf("%d", int(payload["timeout"].(float64))), + Selector: `request.payload.timeout`, }, { - "name": "Topic Data", - "value": topicData, + Name: "Topic Data", + Value: topicData, + Selector: `request.payload.topicData`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -310,30 +335,32 @@ func representProduceResponse(data map[string]interface{}) []interface{} { rep = representResponseHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) + payload := data["payload"].(map[string]interface{}) responses := "" - if payload["Responses"] != nil { - _responses, _ := json.Marshal(payload["Responses"].([]interface{})) + if payload["responses"] != nil { + _responses, _ := json.Marshal(payload["responses"].([]interface{})) responses = string(_responses) } throttleTimeMs := "" - if payload["ThrottleTimeMs"] != nil { - throttleTimeMs = fmt.Sprintf("%d", int(payload["ThrottleTimeMs"].(float64))) + if payload["throttleTimeMs"] != nil { + throttleTimeMs = fmt.Sprintf("%d", int(payload["throttleTimeMs"].(float64))) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Responses", - "value": string(responses), + Name: "Responses", + Value: string(responses), + Selector: `response.payload.responses`, }, { - "name": "Throttle Time (ms)", - "value": throttleTimeMs, + Name: "Throttle Time (ms)", + Value: throttleTimeMs, + Selector: `response.payload.throttleTimeMs`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -344,87 +371,97 @@ func representFetchRequest(data map[string]interface{}) []interface{} { rep = representRequestHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) + payload := data["payload"].(map[string]interface{}) topics := "" - if payload["Topics"] != nil { - _topics, _ := json.Marshal(payload["Topics"].([]interface{})) + if payload["topics"] != nil { + _topics, _ := json.Marshal(payload["topics"].([]interface{})) topics = string(_topics) } replicaId := "" - if payload["ReplicaId"] != nil { - replicaId = fmt.Sprintf("%d", int(payload["ReplicaId"].(float64))) + if payload["replicaId"] != nil { + replicaId = fmt.Sprintf("%d", int(payload["replicaId"].(float64))) } maxBytes := "" - if payload["MaxBytes"] != nil { - maxBytes = fmt.Sprintf("%d", int(payload["MaxBytes"].(float64))) + if payload["maxBytes"] != nil { + maxBytes = fmt.Sprintf("%d", int(payload["maxBytes"].(float64))) } isolationLevel := "" - if payload["IsolationLevel"] != nil { - isolationLevel = fmt.Sprintf("%d", int(payload["IsolationLevel"].(float64))) + if payload["isolationLevel"] != nil { + isolationLevel = fmt.Sprintf("%d", int(payload["isolationLevel"].(float64))) } sessionId := "" - if payload["SessionId"] != nil { - sessionId = fmt.Sprintf("%d", int(payload["SessionId"].(float64))) + if payload["sessionId"] != nil { + sessionId = fmt.Sprintf("%d", int(payload["sessionId"].(float64))) } sessionEpoch := "" - if payload["SessionEpoch"] != nil { - sessionEpoch = fmt.Sprintf("%d", int(payload["SessionEpoch"].(float64))) + if payload["sessionEpoch"] != nil { + sessionEpoch = fmt.Sprintf("%d", int(payload["sessionEpoch"].(float64))) } forgottenTopicsData := "" - if payload["ForgottenTopicsData"] != nil { - x, _ := json.Marshal(payload["ForgottenTopicsData"].(map[string]interface{})) + if payload["forgottenTopicsData"] != nil { + x, _ := json.Marshal(payload["forgottenTopicsData"].(map[string]interface{})) forgottenTopicsData = string(x) } rackId := "" - if payload["RackId"] != nil { - rackId = payload["RackId"].(string) + if payload["rackId"] != nil { + rackId = payload["rackId"].(string) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Replica ID", - "value": replicaId, + Name: "Replica ID", + Value: replicaId, + Selector: `request.payload.replicaId`, }, { - "name": "Maximum Wait (ms)", - "value": fmt.Sprintf("%d", int(payload["MaxWaitMs"].(float64))), + Name: "Maximum Wait (ms)", + Value: fmt.Sprintf("%d", int(payload["maxWaitMs"].(float64))), + Selector: `request.payload.maxWaitMs`, }, { - "name": "Minimum Bytes", - "value": fmt.Sprintf("%d", int(payload["MinBytes"].(float64))), + Name: "Minimum Bytes", + Value: fmt.Sprintf("%d", int(payload["minBytes"].(float64))), + Selector: `request.payload.minBytes`, }, { - "name": "Maximum Bytes", - "value": maxBytes, + Name: "Maximum Bytes", + Value: maxBytes, + Selector: `request.payload.maxBytes`, }, { - "name": "Isolation Level", - "value": isolationLevel, + Name: "Isolation Level", + Value: isolationLevel, + Selector: `request.payload.isolationLevel`, }, { - "name": "Session ID", - "value": sessionId, + Name: "Session ID", + Value: sessionId, + Selector: `request.payload.sessionId`, }, { - "name": "Session Epoch", - "value": sessionEpoch, + Name: "Session Epoch", + Value: sessionEpoch, + Selector: `request.payload.sessionEpoch`, }, { - "name": "Topics", - "value": topics, + Name: "Topics", + Value: topics, + Selector: `request.payload.topics`, }, { - "name": "Forgotten Topics Data", - "value": forgottenTopicsData, + Name: "Forgotten Topics Data", + Value: forgottenTopicsData, + Selector: `request.payload.forgottenTopicsData`, }, { - "name": "Rack ID", - "value": rackId, + Name: "Rack ID", + Value: rackId, + Selector: `request.payload.rackId`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -435,46 +472,50 @@ func representFetchResponse(data map[string]interface{}) []interface{} { rep = representResponseHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) + payload := data["payload"].(map[string]interface{}) responses := "" - if payload["Responses"] != nil { - _responses, _ := json.Marshal(payload["Responses"].([]interface{})) + if payload["responses"] != nil { + _responses, _ := json.Marshal(payload["responses"].([]interface{})) responses = string(_responses) } throttleTimeMs := "" - if payload["ThrottleTimeMs"] != nil { - throttleTimeMs = fmt.Sprintf("%d", int(payload["ThrottleTimeMs"].(float64))) + if payload["throttleTimeMs"] != nil { + throttleTimeMs = fmt.Sprintf("%d", int(payload["throttleTimeMs"].(float64))) } errorCode := "" - if payload["ErrorCode"] != nil { - errorCode = fmt.Sprintf("%d", int(payload["ErrorCode"].(float64))) + if payload["errorCode"] != nil { + errorCode = fmt.Sprintf("%d", int(payload["errorCode"].(float64))) } sessionId := "" - if payload["SessionId"] != nil { - sessionId = fmt.Sprintf("%d", int(payload["SessionId"].(float64))) + if payload["sessionId"] != nil { + sessionId = fmt.Sprintf("%d", int(payload["sessionId"].(float64))) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Throttle Time (ms)", - "value": throttleTimeMs, + Name: "Throttle Time (ms)", + Value: throttleTimeMs, + Selector: `response.payload.throttleTimeMs`, }, { - "name": "Error Code", - "value": errorCode, + Name: "Error Code", + Value: errorCode, + Selector: `response.payload.errorCode`, }, { - "name": "Session ID", - "value": sessionId, + Name: "Session ID", + Value: sessionId, + Selector: `response.payload.sessionId`, }, { - "name": "Responses", - "value": responses, + Name: "Responses", + Value: responses, + Selector: `response.payload.responses`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -485,26 +526,28 @@ func representListOffsetsRequest(data map[string]interface{}) []interface{} { rep = representRequestHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) + payload := data["payload"].(map[string]interface{}) topics := "" - if payload["Topics"] != nil { - _topics, _ := json.Marshal(payload["Topics"].([]interface{})) + if payload["topics"] != nil { + _topics, _ := json.Marshal(payload["topics"].([]interface{})) topics = string(_topics) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Replica ID", - "value": fmt.Sprintf("%d", int(payload["ReplicaId"].(float64))), + Name: "Replica ID", + Value: fmt.Sprintf("%d", int(payload["replicaId"].(float64))), + Selector: `request.payload.replicaId`, }, { - "name": "Topics", - "value": topics, + Name: "Topics", + Value: topics, + Selector: `request.payload.topics`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -515,26 +558,28 @@ func representListOffsetsResponse(data map[string]interface{}) []interface{} { rep = representResponseHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) - topics, _ := json.Marshal(payload["Topics"].([]interface{})) + payload := data["payload"].(map[string]interface{}) + topics, _ := json.Marshal(payload["topics"].([]interface{})) throttleTimeMs := "" - if payload["ThrottleTimeMs"] != nil { - throttleTimeMs = fmt.Sprintf("%d", int(payload["ThrottleTimeMs"].(float64))) + if payload["throttleTimeMs"] != nil { + throttleTimeMs = fmt.Sprintf("%d", int(payload["throttleTimeMs"].(float64))) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Throttle Time (ms)", - "value": throttleTimeMs, + Name: "Throttle Time (ms)", + Value: throttleTimeMs, + Selector: `response.payload.throttleTimeMs`, }, { - "name": "Topics", - "value": string(topics), + Name: "Topics", + Value: string(topics), + Selector: `response.payload.topics`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -545,30 +590,33 @@ func representCreateTopicsRequest(data map[string]interface{}) []interface{} { rep = representRequestHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) - topics, _ := json.Marshal(payload["Topics"].([]interface{})) + payload := data["payload"].(map[string]interface{}) + topics, _ := json.Marshal(payload["topics"].([]interface{})) validateOnly := "" - if payload["ValidateOnly"] != nil { - validateOnly = strconv.FormatBool(payload["ValidateOnly"].(bool)) + if payload["validateOnly"] != nil { + validateOnly = strconv.FormatBool(payload["validateOnly"].(bool)) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Topics", - "value": string(topics), + Name: "Topics", + Value: string(topics), + Selector: `request.payload.topics`, }, { - "name": "Timeout (ms)", - "value": fmt.Sprintf("%d", int(payload["TimeoutMs"].(float64))), + Name: "Timeout (ms)", + Value: fmt.Sprintf("%d", int(payload["timeoutMs"].(float64))), + Selector: `request.payload.timeoutMs`, }, { - "name": "Validate Only", - "value": validateOnly, + Name: "Validate Only", + Value: validateOnly, + Selector: `request.payload.validateOnly`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -579,26 +627,28 @@ func representCreateTopicsResponse(data map[string]interface{}) []interface{} { rep = representResponseHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) - topics, _ := json.Marshal(payload["Topics"].([]interface{})) + payload := data["payload"].(map[string]interface{}) + topics, _ := json.Marshal(payload["topics"].([]interface{})) throttleTimeMs := "" - if payload["ThrottleTimeMs"] != nil { - throttleTimeMs = fmt.Sprintf("%d", int(payload["ThrottleTimeMs"].(float64))) + if payload["throttleTimeMs"] != nil { + throttleTimeMs = fmt.Sprintf("%d", int(payload["throttleTimeMs"].(float64))) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Throttle Time (ms)", - "value": throttleTimeMs, + Name: "Throttle Time (ms)", + Value: throttleTimeMs, + Selector: `response.payload.throttleTimeMs`, }, { - "name": "Topics", - "value": string(topics), + Name: "Topics", + Value: string(topics), + Selector: `response.payload.topics`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -609,35 +659,38 @@ func representDeleteTopicsRequest(data map[string]interface{}) []interface{} { rep = representRequestHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) + payload := data["payload"].(map[string]interface{}) topics := "" - if payload["Topics"] != nil { - x, _ := json.Marshal(payload["Topics"].([]interface{})) + if payload["topics"] != nil { + x, _ := json.Marshal(payload["topics"].([]interface{})) topics = string(x) } topicNames := "" - if payload["TopicNames"] != nil { - x, _ := json.Marshal(payload["TopicNames"].([]interface{})) + if payload["topicNames"] != nil { + x, _ := json.Marshal(payload["topicNames"].([]interface{})) topicNames = string(x) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "TopicNames", - "value": string(topicNames), + Name: "TopicNames", + Value: string(topicNames), + Selector: `request.payload.topicNames`, }, { - "name": "Topics", - "value": string(topics), + Name: "Topics", + Value: string(topics), + Selector: `request.payload.topics`, }, { - "name": "Timeout (ms)", - "value": fmt.Sprintf("%d", int(payload["TimeoutMs"].(float64))), + Name: "Timeout (ms)", + Value: fmt.Sprintf("%d", int(payload["timeoutMs"].(float64))), + Selector: `request.payload.timeoutMs`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep @@ -648,26 +701,28 @@ func representDeleteTopicsResponse(data map[string]interface{}) []interface{} { rep = representResponseHeader(data, rep) - payload := data["Payload"].(map[string]interface{}) - responses, _ := json.Marshal(payload["Responses"].([]interface{})) + payload := data["payload"].(map[string]interface{}) + responses, _ := json.Marshal(payload["responses"].([]interface{})) throttleTimeMs := "" - if payload["ThrottleTimeMs"] != nil { - throttleTimeMs = fmt.Sprintf("%d", int(payload["ThrottleTimeMs"].(float64))) + if payload["throttleTimeMs"] != nil { + throttleTimeMs = fmt.Sprintf("%d", int(payload["throttleTimeMs"].(float64))) } - repPayload, _ := json.Marshal([]map[string]string{ + repPayload, _ := json.Marshal([]api.TableData{ { - "name": "Throttle Time (ms)", - "value": throttleTimeMs, + Name: "Throttle Time (ms)", + Value: throttleTimeMs, + Selector: `response.payload.throttleTimeMs`, }, { - "name": "Responses", - "value": string(responses), + Name: "Responses", + Value: string(responses), + Selector: `response.payload.responses`, }, }) - rep = append(rep, map[string]string{ - "type": api.TABLE, - "title": "Payload", - "data": string(repPayload), + rep = append(rep, api.SectionData{ + Type: api.TABLE, + Title: "Payload", + Data: string(repPayload), }) return rep diff --git a/tap/extensions/kafka/main.go b/tap/extensions/kafka/main.go index b677182d1..4c8ea0697 100644 --- a/tap/extensions/kafka/main.go +++ b/tap/extensions/kafka/main.go @@ -15,6 +15,7 @@ var _protocol api.Protocol = api.Protocol{ Name: "kafka", LongName: "Apache Kafka Protocol", Abbreviation: "KAFKA", + Macro: "kafka", Version: "12", BackgroundColor: "#000000", ForegroundColor: "#ffffff", @@ -61,7 +62,7 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co } } -func (d dissecting) Analyze(item *api.OutputChannelItem, entryId string, resolvedSource string, resolvedDestination string) *api.MizuEntry { +func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, resolvedDestination string) *api.MizuEntry { request := item.Pair.Request.Payload.(map[string]interface{}) reqDetails := request["details"].(map[string]interface{}) service := "kafka" @@ -70,76 +71,76 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, entryId string, resolve } else if resolvedSource != "" { service = resolvedSource } - apiKey := ApiKey(reqDetails["ApiKey"].(float64)) + apiKey := ApiKey(reqDetails["apiKey"].(float64)) summary := "" switch apiKey { case Metadata: - _topics := reqDetails["Payload"].(map[string]interface{})["Topics"] + _topics := reqDetails["payload"].(map[string]interface{})["topics"] if _topics == nil { break } topics := _topics.([]interface{}) for _, topic := range topics { - summary += fmt.Sprintf("%s, ", topic.(map[string]interface{})["Name"].(string)) + summary += fmt.Sprintf("%s, ", topic.(map[string]interface{})["name"].(string)) } if len(summary) > 0 { summary = summary[:len(summary)-2] } break case ApiVersions: - summary = reqDetails["ClientID"].(string) + summary = reqDetails["clientID"].(string) break case Produce: - _topics := reqDetails["Payload"].(map[string]interface{})["TopicData"] + _topics := reqDetails["payload"].(map[string]interface{})["topicData"] if _topics == nil { break } topics := _topics.([]interface{}) for _, topic := range topics { - summary += fmt.Sprintf("%s, ", topic.(map[string]interface{})["Topic"].(string)) + summary += fmt.Sprintf("%s, ", topic.(map[string]interface{})["topic"].(string)) } if len(summary) > 0 { summary = summary[:len(summary)-2] } break case Fetch: - _topics := reqDetails["Payload"].(map[string]interface{})["Topics"] + _topics := reqDetails["payload"].(map[string]interface{})["topics"] if _topics == nil { break } topics := _topics.([]interface{}) for _, topic := range topics { - summary += fmt.Sprintf("%s, ", topic.(map[string]interface{})["Topic"].(string)) + summary += fmt.Sprintf("%s, ", topic.(map[string]interface{})["topic"].(string)) } if len(summary) > 0 { summary = summary[:len(summary)-2] } break case ListOffsets: - _topics := reqDetails["Payload"].(map[string]interface{})["Topics"] + _topics := reqDetails["payload"].(map[string]interface{})["topics"] if _topics == nil { break } topics := _topics.([]interface{}) for _, topic := range topics { - summary += fmt.Sprintf("%s, ", topic.(map[string]interface{})["Name"].(string)) + summary += fmt.Sprintf("%s, ", topic.(map[string]interface{})["name"].(string)) } if len(summary) > 0 { summary = summary[:len(summary)-2] } break case CreateTopics: - topics := reqDetails["Payload"].(map[string]interface{})["Topics"].([]interface{}) + topics := reqDetails["payload"].(map[string]interface{})["topics"].([]interface{}) for _, topic := range topics { - summary += fmt.Sprintf("%s, ", topic.(map[string]interface{})["Name"].(string)) + summary += fmt.Sprintf("%s, ", topic.(map[string]interface{})["name"].(string)) } if len(summary) > 0 { summary = summary[:len(summary)-2] } break case DeleteTopics: - topicNames := reqDetails["TopicNames"].([]string) + topicNames := reqDetails["topicNames"].([]string) for _, name := range topicNames { summary += fmt.Sprintf("%s, ", name) } @@ -148,44 +149,48 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, entryId string, resolve request["url"] = summary elapsedTime := item.Pair.Response.CaptureTime.Sub(item.Pair.Request.CaptureTime).Round(time.Millisecond).Milliseconds() - entryBytes, _ := json.Marshal(item.Pair) return &api.MizuEntry{ - ProtocolName: _protocol.Name, - ProtocolLongName: _protocol.LongName, - ProtocolAbbreviation: _protocol.Abbreviation, - ProtocolVersion: _protocol.Version, - ProtocolBackgroundColor: _protocol.BackgroundColor, - ProtocolForegroundColor: _protocol.ForegroundColor, - ProtocolFontSize: _protocol.FontSize, - ProtocolReferenceLink: _protocol.ReferenceLink, - EntryId: entryId, - Entry: string(entryBytes), - Url: fmt.Sprintf("%s%s", service, summary), - Method: apiNames[apiKey], - Status: 0, - RequestSenderIp: item.ConnectionInfo.ClientIP, - Service: service, - Timestamp: item.Timestamp, - ElapsedTime: elapsedTime, - Path: summary, - ResolvedSource: resolvedSource, - ResolvedDestination: resolvedDestination, - SourceIp: item.ConnectionInfo.ClientIP, - DestinationIp: item.ConnectionInfo.ServerIP, - SourcePort: item.ConnectionInfo.ClientPort, - DestinationPort: item.ConnectionInfo.ServerPort, - IsOutgoing: item.ConnectionInfo.IsOutgoing, + Protocol: _protocol, + Source: &api.TCP{ + Name: resolvedSource, + IP: item.ConnectionInfo.ClientIP, + Port: item.ConnectionInfo.ClientPort, + }, + Destination: &api.TCP{ + Name: resolvedDestination, + IP: item.ConnectionInfo.ServerIP, + Port: item.ConnectionInfo.ServerPort, + }, + Outgoing: item.ConnectionInfo.IsOutgoing, + Request: reqDetails, + Response: item.Pair.Response.Payload.(map[string]interface{})["details"].(map[string]interface{}), + Url: fmt.Sprintf("%s%s", service, summary), + Method: apiNames[apiKey], + Status: 0, + RequestSenderIp: item.ConnectionInfo.ClientIP, + Service: service, + Timestamp: item.Timestamp, + StartTime: item.Pair.Request.CaptureTime, + ElapsedTime: elapsedTime, + Summary: summary, + ResolvedSource: resolvedSource, + ResolvedDestination: resolvedDestination, + SourceIp: item.ConnectionInfo.ClientIP, + DestinationIp: item.ConnectionInfo.ServerIP, + SourcePort: item.ConnectionInfo.ClientPort, + DestinationPort: item.ConnectionInfo.ServerPort, + IsOutgoing: item.ConnectionInfo.IsOutgoing, } } func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { return &api.BaseEntryDetails{ - Id: entry.EntryId, + Id: entry.Id, Protocol: _protocol, Url: entry.Url, RequestSenderIp: entry.RequestSenderIp, Service: entry.Service, - Summary: entry.Path, + Summary: entry.Summary, StatusCode: entry.Status, Method: entry.Method, Timestamp: entry.Timestamp, @@ -202,49 +207,43 @@ func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { } } -func (d dissecting) Represent(entry *api.MizuEntry) (p api.Protocol, object []byte, bodySize int64, err error) { - p = _protocol +func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface{}, response map[string]interface{}) (protoOut api.Protocol, object []byte, bodySize int64, err error) { + protoOut = _protocol bodySize = 0 - var root map[string]interface{} - json.Unmarshal([]byte(entry.Entry), &root) representation := make(map[string]interface{}, 0) - request := root["request"].(map[string]interface{})["payload"].(map[string]interface{}) - response := root["response"].(map[string]interface{})["payload"].(map[string]interface{}) - reqDetails := request["details"].(map[string]interface{}) - resDetails := response["details"].(map[string]interface{}) - apiKey := ApiKey(reqDetails["ApiKey"].(float64)) + apiKey := ApiKey(request["apiKey"].(float64)) var repRequest []interface{} var repResponse []interface{} switch apiKey { case Metadata: - repRequest = representMetadataRequest(reqDetails) - repResponse = representMetadataResponse(resDetails) + repRequest = representMetadataRequest(request) + repResponse = representMetadataResponse(response) break case ApiVersions: - repRequest = representApiVersionsRequest(reqDetails) - repResponse = representApiVersionsResponse(resDetails) + repRequest = representApiVersionsRequest(request) + repResponse = representApiVersionsResponse(response) break case Produce: - repRequest = representProduceRequest(reqDetails) - repResponse = representProduceResponse(resDetails) + repRequest = representProduceRequest(request) + repResponse = representProduceResponse(response) break case Fetch: - repRequest = representFetchRequest(reqDetails) - repResponse = representFetchResponse(resDetails) + repRequest = representFetchRequest(request) + repResponse = representFetchResponse(response) break case ListOffsets: - repRequest = representListOffsetsRequest(reqDetails) - repResponse = representListOffsetsResponse(resDetails) + repRequest = representListOffsetsRequest(request) + repResponse = representListOffsetsResponse(response) break case CreateTopics: - repRequest = representCreateTopicsRequest(reqDetails) - repResponse = representCreateTopicsResponse(resDetails) + repRequest = representCreateTopicsRequest(request) + repResponse = representCreateTopicsResponse(response) break case DeleteTopics: - repRequest = representDeleteTopicsRequest(reqDetails) - repResponse = representDeleteTopicsResponse(resDetails) + repRequest = representDeleteTopicsRequest(request) + repResponse = representDeleteTopicsResponse(response) break } @@ -254,4 +253,10 @@ func (d dissecting) Represent(entry *api.MizuEntry) (p api.Protocol, object []by return } +func (d dissecting) Macros() map[string]string { + return map[string]string{ + `kafka`: fmt.Sprintf(`proto.abbr == "%s"`, _protocol.Abbreviation), + } +} + var Dissector dissecting diff --git a/tap/extensions/kafka/request.go b/tap/extensions/kafka/request.go index b7ac67d7d..263755892 100644 --- a/tap/extensions/kafka/request.go +++ b/tap/extensions/kafka/request.go @@ -10,13 +10,13 @@ import ( ) type Request struct { - Size int32 - ApiKey ApiKey - ApiVersion int16 - CorrelationID int32 - ClientID string - Payload interface{} - CaptureTime time.Time + Size int32 `json:"size"` + ApiKey ApiKey `json:"apiKey"` + ApiVersion int16 `json:"apiVersion"` + CorrelationID int32 `json:"correlationID"` + ClientID string `json:"clientID"` + Payload interface{} `json:"payload"` + CaptureTime time.Time `json:"captureTime"` } func ReadRequest(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer) (apiKey ApiKey, apiVersion int16, err error) { diff --git a/tap/extensions/kafka/response.go b/tap/extensions/kafka/response.go index 574efa8a2..5441e784d 100644 --- a/tap/extensions/kafka/response.go +++ b/tap/extensions/kafka/response.go @@ -10,10 +10,10 @@ import ( ) type Response struct { - Size int32 - CorrelationID int32 - Payload interface{} - CaptureTime time.Time + Size int32 `json:"size"` + CorrelationID int32 `json:"correlationID"` + Payload interface{} `json:"payload"` + CaptureTime time.Time `json:"captureTime"` } func ReadResponse(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer, emitter api.Emitter) (err error) { diff --git a/tap/extensions/kafka/structs.go b/tap/extensions/kafka/structs.go index d9aa5c1cb..67064d85e 100644 --- a/tap/extensions/kafka/structs.go +++ b/tap/extensions/kafka/structs.go @@ -26,38 +26,38 @@ func (acks RequiredAcks) String() string { } type UUID struct { - TimeLow int32 - TimeMid int16 - TimeHiAndVersion int16 - ClockSeq int16 - NodePart1 int32 - NodePart22 int16 + TimeLow int32 `json:"timeLow"` + TimeMid int16 `json:"timeMid"` + TimeHiAndVersion int16 `json:"timeHiAndVersion"` + ClockSeq int16 `json:"clockSeq"` + NodePart1 int32 `json:"nodePart1"` + NodePart22 int16 `json:"nodePart22"` } // Metadata Request (Version: 0) type MetadataRequestTopicV0 struct { - Name string + Name string `json:"name"` } type MetadataRequestV0 struct { - Topics []MetadataRequestTopicV0 + Topics []MetadataRequestTopicV0 `json:"topics"` } // Metadata Request (Version: 4) type MetadataRequestV4 struct { - Topics []MetadataRequestTopicV0 - AllowAutoTopicCreation bool + Topics []MetadataRequestTopicV0 `json:"topics"` + AllowAutoTopicCreation bool `json:"allowAutoTopicCreation"` } // Metadata Request (Version: 8) type MetadataRequestV8 struct { - Topics []MetadataRequestTopicV0 - AllowAutoTopicCreation bool - IncludeClusterAuthorizedOperations bool - IncludeTopicAuthorizedOperations bool + Topics []MetadataRequestTopicV0 `json:"topics"` + AllowAutoTopicCreation bool `json:"allowAutoTopicCreation"` + IncludeClusterAuthorizedOperations bool `json:"includeClusterAuthorizedOperations"` + IncludeTopicAuthorizedOperations bool `json:"includeTopicAuthorizedOperations"` } // Metadata Request (Version: 10) @@ -68,188 +68,188 @@ type MetadataRequestTopicV10 struct { } type MetadataRequestV10 struct { - Topics []MetadataRequestTopicV10 - AllowAutoTopicCreation bool - IncludeClusterAuthorizedOperations bool - IncludeTopicAuthorizedOperations bool + Topics []MetadataRequestTopicV10 `json:"topics"` + AllowAutoTopicCreation bool `json:"allowAutoTopicCreation"` + IncludeClusterAuthorizedOperations bool `json:"includeClusterAuthorizedOperations"` + IncludeTopicAuthorizedOperations bool `json:"includeTopicAuthorizedOperations"` } // Metadata Request (Version: 11) type MetadataRequestV11 struct { - Topics []MetadataRequestTopicV10 - AllowAutoTopicCreation bool - IncludeTopicAuthorizedOperations bool + Topics []MetadataRequestTopicV10 `json:"topics"` + AllowAutoTopicCreation bool `json:"allowAutoTopicCreation"` + IncludeTopicAuthorizedOperations bool `json:"includeTopicAuthorizedOperations"` } // Metadata Response (Version: 0) type BrokerV0 struct { - NodeId int32 - Host string - Port int32 + NodeId int32 `json:"nodeId"` + Host string `json:"host"` + Port int32 `json:"port"` } type PartitionsV0 struct { - ErrorCode int16 - PartitionIndex int32 - LeaderId int32 - ReplicaNodes int32 - IsrNodes int32 + ErrorCode int16 `json:"errorCode"` + PartitionIndex int32 `json:"partitionIndex"` + LeaderId int32 `json:"leaderId"` + ReplicaNodes int32 `json:"replicaNodes"` + IsrNodes int32 `json:"isrNodes"` } type TopicV0 struct { - ErrorCode int16 - Name string - Partitions []PartitionsV0 + ErrorCode int16 `json:"errorCode"` + Name string `json:"name"` + Partitions []PartitionsV0 `json:"partitions"` } type MetadataResponseV0 struct { - Brokers []BrokerV0 - Topics []TopicV0 + Brokers []BrokerV0 `json:"brokers"` + Topics []TopicV0 `json:"topics"` } // Metadata Response (Version: 1) type BrokerV1 struct { - NodeId int32 - Host string - Port int32 - Rack string + NodeId int32 `json:"nodeId"` + Host string `json:"host"` + Port int32 `json:"port"` + Rack string `json:"rack"` } type TopicV1 struct { - ErrorCode int16 - Name string - IsInternal bool - Partitions []PartitionsV0 + ErrorCode int16 `json:"errorCode"` + Name string `json:"name"` + IsInternal bool `json:"isInternal"` + Partitions []PartitionsV0 `json:"partitions"` } type MetadataResponseV1 struct { - Brokers []BrokerV1 - ControllerID int32 - Topics []TopicV1 + Brokers []BrokerV1 `json:"brokers"` + ControllerID int32 `json:"controllerID"` + Topics []TopicV1 `json:"topics"` } // Metadata Response (Version: 2) type MetadataResponseV2 struct { - Brokers []BrokerV1 - ClusterID string - ControllerID int32 - Topics []TopicV1 + Brokers []BrokerV1 `json:"brokers"` + ClusterID string `json:"clusterID"` + ControllerID int32 `json:"controllerID"` + Topics []TopicV1 `json:"topics"` } // Metadata Response (Version: 3) type MetadataResponseV3 struct { - ThrottleTimeMs int32 - Brokers []BrokerV1 - ClusterID string - ControllerID int32 - Topics []TopicV1 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Brokers []BrokerV1 `json:"brokers"` + ClusterID string `json:"clusterID"` + ControllerID int32 `json:"controllerID"` + Topics []TopicV1 `json:"topics"` } // Metadata Response (Version: 5) type PartitionsV5 struct { - ErrorCode int16 - PartitionIndex int32 - LeaderId int32 - ReplicaNodes int32 - IsrNodes int32 - OfflineReplicas int32 + ErrorCode int16 `json:"errorCode"` + PartitionIndex int32 `json:"partitionIndex"` + LeaderId int32 `json:"leaderId"` + ReplicaNodes int32 `json:"replicaNodes"` + IsrNodes int32 `json:"isrNodes"` + OfflineReplicas int32 `json:"offlineReplicas"` } type TopicV5 struct { - ErrorCode int16 - Name string - IsInternal bool - Partitions []PartitionsV5 + ErrorCode int16 `json:"errorCode"` + Name string `json:"name"` + IsInternal bool `json:"isInternal"` + Partitions []PartitionsV5 `json:"partitions"` } type MetadataResponseV5 struct { - ThrottleTimeMs int32 - Brokers []BrokerV1 - ClusterID string - ControllerID int32 - Topics []TopicV5 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Brokers []BrokerV1 `json:"brokers"` + ClusterID string `json:"clusterID"` + ControllerID int32 `json:"controllerID"` + Topics []TopicV5 `json:"topics"` } // Metadata Response (Version: 7) type PartitionsV7 struct { - ErrorCode int16 - PartitionIndex int32 - LeaderId int32 - LeaderEpoch int32 - ReplicaNodes int32 - IsrNodes int32 - OfflineReplicas int32 + ErrorCode int16 `json:"errorCode"` + PartitionIndex int32 `json:"partitionIndex"` + LeaderId int32 `json:"leaderId"` + LeaderEpoch int32 `json:"leaderEpoch"` + ReplicaNodes int32 `json:"replicaNodes"` + IsrNodes int32 `json:"isrNodes"` + OfflineReplicas int32 `json:"offlineReplicas"` } type TopicV7 struct { - ErrorCode int16 - Name string - IsInternal bool - Partitions []PartitionsV7 + ErrorCode int16 `json:"errorCode"` + Name string `json:"name"` + IsInternal bool `json:"isInternal"` + Partitions []PartitionsV7 `json:"partitions"` } type MetadataResponseV7 struct { - ThrottleTimeMs int32 - Brokers []BrokerV1 - ClusterID string - ControllerID int32 - Topics []TopicV7 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Brokers []BrokerV1 `json:"brokers"` + ClusterID string `json:"clusterID"` + ControllerID int32 `json:"controllerID"` + Topics []TopicV7 `json:"topics"` } // Metadata Response (Version: 8) type TopicV8 struct { - ErrorCode int16 - Name string - IsInternal bool - Partitions []PartitionsV7 - TopicAuthorizedOperations int32 + ErrorCode int16 `json:"errorCode"` + Name string `json:"name"` + IsInternal bool `json:"isInternal"` + Partitions []PartitionsV7 `json:"partitions"` + TopicAuthorizedOperations int32 `json:"topicAuthorizedOperations"` } type MetadataResponseV8 struct { - ThrottleTimeMs int32 - Brokers []BrokerV1 - ClusterID string - ControllerID int32 - Topics []TopicV8 - ClusterAuthorizedOperations int32 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Brokers []BrokerV1 `json:"brokers"` + ClusterID string `json:"clusterID"` + ControllerID int32 `json:"controllerID"` + Topics []TopicV8 `json:"topics"` + ClusterAuthorizedOperations int32 `json:"clusterAuthorizedOperations"` } // Metadata Response (Version: 10) type TopicV10 struct { - ErrorCode int16 - Name string - TopicID UUID - IsInternal bool - Partitions []PartitionsV7 - TopicAuthorizedOperations int32 + ErrorCode int16 `json:"errorCode"` + Name string `json:"name"` + TopicID UUID `json:"topicID"` + IsInternal bool `json:"isInternal"` + Partitions []PartitionsV7 `json:"partitions"` + TopicAuthorizedOperations int32 `json:"topicAuthorizedOperations"` } type MetadataResponseV10 struct { - ThrottleTimeMs int32 - Brokers []BrokerV1 - ClusterID string - ControllerID int32 - Topics []TopicV10 - ClusterAuthorizedOperations int32 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Brokers []BrokerV1 `json:"brokers"` + ClusterID string `json:"clusterID"` + ControllerID int32 `json:"controllerID"` + Topics []TopicV10 `json:"topics"` + ClusterAuthorizedOperations int32 `json:"clusterAuthorizedOperations"` } // Metadata Response (Version: 11) type MetadataResponseV11 struct { - ThrottleTimeMs int32 - Brokers []BrokerV1 - ClusterID string - ControllerID int32 - Topics []TopicV10 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Brokers []BrokerV1 `json:"brokers"` + ClusterID string `json:"clusterID"` + ControllerID int32 `json:"controllerID"` + Topics []TopicV10 `json:"topics"` } // ApiVersions Request (Version: 0) @@ -259,742 +259,742 @@ type ApiVersionsRequestV0 struct{} // ApiVersions Request (Version: 3) type ApiVersionsRequestV3 struct { - ClientSoftwareName string - ClientSoftwareVersion string + ClientSoftwareName string `json:"clientSoftwareName"` + ClientSoftwareVersion string `json:"clientSoftwareVersion"` } // ApiVersions Response (Version: 0) type ApiVersionsResponseApiKey struct { - ApiKey int16 - MinVersion int16 - MaxVersion int16 + ApiKey int16 `json:"apiKey"` + MinVersion int16 `json:"minVersion"` + MaxVersion int16 `json:"maxVersion"` } type ApiVersionsResponseV0 struct { - ErrorCode int16 - ApiKeys []ApiVersionsResponseApiKey + ErrorCode int16 `json:"errorCode"` + ApiKeys []ApiVersionsResponseApiKey `json:"apiKeys"` } // ApiVersions Response (Version: 1) type ApiVersionsResponseV1 struct { - ErrorCode int16 - ApiKeys []ApiVersionsResponseApiKey // FIXME: `confluent-kafka-python` causes memory leak - ThrottleTimeMs int32 + ErrorCode int16 `json:"errorCode"` + ApiKeys []ApiVersionsResponseApiKey `json:"apiKeys"` // FIXME: `confluent-kafka-python` causes memory leak + ThrottleTimeMs int32 `json:"throttleTimeMs"` } // Produce Request (Version: 0) // Message is a kafka message type type MessageV0 struct { - Codec int8 // codec used to compress the message contents - CompressionLevel int // compression level - LogAppendTime bool // the used timestamp is LogAppendTime - Key []byte // the message key, may be nil - Value []byte // the message contents - Set *MessageSet // the message set a message might wrap - Version int8 // v1 requires Kafka 0.10 - Timestamp time.Time // the timestamp of the message (version 1+ only) + Codec int8 `json:"codec"` // codec used to compress the message contents + CompressionLevel int `json:"compressionLevel"` // compression level + LogAppendTime bool `json:"logAppendTime"` // the used timestamp is LogAppendTime + Key []byte `json:"key"` // the message key, may be nil + Value []byte `json:"value"` // the message contents + Set *MessageSet `json:"set"` // the message set a message might wrap + Version int8 `json:"version"` // v1 requires Kafka 0.10 + Timestamp time.Time `json:"timestamp"` // the timestamp of the message (version 1+ only) compressedSize int // used for computing the compression ratio metrics } // MessageBlock represents a part of request with message type MessageBlock struct { - Offset int64 - Msg *MessageV0 + Offset int64 `json:"offset"` + Msg *MessageV0 `json:"msg"` } // MessageSet is a replacement for RecordBatch in older versions type MessageSet struct { - PartialTrailingMessage bool // whether the set on the wire contained an incomplete trailing MessageBlock - OverflowMessage bool // whether the set on the wire contained an overflow message - Messages []*MessageBlock + PartialTrailingMessage bool `json:"partialTrailingMessage"` // whether the set on the wire contained an incomplete trailing MessageBlock + OverflowMessage bool `json:"overflowMessage"` // whether the set on the wire contained an overflow message + Messages []*MessageBlock `json:"messages"` } type RecordHeader struct { - HeaderKeyLength int8 - HeaderKey string - HeaderValueLength int8 - Value string + HeaderKeyLength int8 `json:"headerKeyLength"` + HeaderKey string `json:"headerKey"` + HeaderValueLength int8 `json:"headerValueLength"` + Value string `json:"value"` } // Record is kafka record type type RecordV0 struct { - Unknown int8 - Attributes int8 - TimestampDelta int8 - OffsetDelta int8 - KeyLength int8 - Key string - ValueLen int8 - Value string - Headers []RecordHeader + Unknown int8 `json:"unknown"` + Attributes int8 `json:"attributes"` + TimestampDelta int8 `json:"timestampDelta"` + OffsetDelta int8 `json:"offsetDelta"` + KeyLength int8 `json:"keyLength"` + Key string `json:"key"` + ValueLen int8 `json:"valueLen"` + Value string `json:"value"` + Headers []RecordHeader `json:"headers"` } // RecordBatch are records from one kafka request type RecordBatch struct { - BaseOffset int64 - BatchLength int32 - PartitionLeaderEpoch int32 - Magic int8 - Crc int32 - Attributes int16 - LastOffsetDelta int32 - FirstTimestamp int64 - MaxTimestamp int64 - ProducerId int64 - ProducerEpoch int16 - BaseSequence int32 - Record []RecordV0 + BaseOffset int64 `json:"baseOffset"` + BatchLength int32 `json:"batchLength"` + PartitionLeaderEpoch int32 `json:"partitionLeaderEpoch"` + Magic int8 `json:"magic"` + Crc int32 `json:"crc"` + Attributes int16 `json:"attributes"` + LastOffsetDelta int32 `json:"lastOffsetDelta"` + FirstTimestamp int64 `json:"firstTimestamp"` + MaxTimestamp int64 `json:"maxTimestamp"` + ProducerId int64 `json:"producerId"` + ProducerEpoch int16 `json:"producerEpoch"` + BaseSequence int32 `json:"baseSequence"` + Record []RecordV0 `json:"record"` } type Records struct { - RecordBatch RecordBatch + RecordBatch RecordBatch `json:"recordBatch"` // TODO: Implement `MessageSet` // MessageSet MessageSet } type PartitionData struct { - Index int32 - Unknown int32 - Records Records + Index int32 `json:"index"` + Unknown int32 `json:"unknown"` + Records Records `json:"records"` } type Partitions struct { - Length int32 - PartitionData PartitionData + Length int32 `json:"length"` + PartitionData PartitionData `json:"partitionData"` } type TopicData struct { - Topic string - Partitions Partitions + Topic string `json:"topic"` + Partitions Partitions `json:"partitions"` } type ProduceRequestV0 struct { - RequiredAcks RequiredAcks - Timeout int32 - TopicData []TopicData + RequiredAcks RequiredAcks `json:"requiredAcks"` + Timeout int32 `json:"timeout"` + TopicData []TopicData `json:"topicData"` } // Produce Request (Version: 3) type ProduceRequestV3 struct { - TransactionalID string - RequiredAcks RequiredAcks - Timeout int32 - TopicData []TopicData + TransactionalID string `json:"transactionalID"` + RequiredAcks RequiredAcks `json:"requiredAcks"` + Timeout int32 `json:"timeout"` + TopicData []TopicData `json:"topicData"` } // Produce Response (Version: 0) type PartitionResponseV0 struct { - Index int32 - ErrorCode int16 - BaseOffset int64 + Index int32 `json:"index"` + ErrorCode int16 `json:"errorCode"` + BaseOffset int64 `json:"baseOffset"` } type ResponseV0 struct { - Name string - PartitionResponses []PartitionResponseV0 + Name string `json:"name"` + PartitionResponses []PartitionResponseV0 `json:"partitionResponses"` } type ProduceResponseV0 struct { - Responses []ResponseV0 + Responses []ResponseV0 `json:"responses"` } // Produce Response (Version: 1) type ProduceResponseV1 struct { - Responses []ResponseV0 - ThrottleTimeMs int32 + Responses []ResponseV0 `json:"responses"` + ThrottleTimeMs int32 `json:"throttleTimeMs"` } // Produce Response (Version: 2) type PartitionResponseV2 struct { - Index int32 - ErrorCode int16 - BaseOffset int64 - LogAppendTimeMs int64 + Index int32 `json:"index"` + ErrorCode int16 `json:"errorCode"` + BaseOffset int64 `json:"baseOffset"` + LogAppendTimeMs int64 `json:"logAppendTimeMs"` } type ResponseV2 struct { - Name string - PartitionResponses []PartitionResponseV2 + Name string `json:"name"` + PartitionResponses []PartitionResponseV2 `json:"partitionResponses"` } type ProduceResponseV2 struct { - Responses []ResponseV2 - ThrottleTimeMs int32 + Responses []ResponseV2 `json:"responses"` + ThrottleTimeMs int32 `json:"throttleTimeMs"` } // Produce Response (Version: 5) type PartitionResponseV5 struct { - Index int32 - ErrorCode int16 - BaseOffset int64 - LogAppendTimeMs int64 - LogStartOffset int64 + Index int32 `json:"index"` + ErrorCode int16 `json:"errorCode"` + BaseOffset int64 `json:"baseOffset"` + LogAppendTimeMs int64 `json:"logAppendTimeMs"` + LogStartOffset int64 `json:"logStartOffset"` } type ResponseV5 struct { - Name string - PartitionResponses []PartitionResponseV5 + Name string `json:"name"` + PartitionResponses []PartitionResponseV5 `json:"partitionResponses"` } type ProduceResponseV5 struct { - Responses []ResponseV5 - ThrottleTimeMs int32 + Responses []ResponseV5 `json:"responses"` + ThrottleTimeMs int32 `json:"throttleTimeMs"` } // Produce Response (Version: 8) type RecordErrors struct { - BatchIndex int32 - BatchIndexErrorMessage string + BatchIndex int32 `json:"batchIndex"` + BatchIndexErrorMessage string `json:"batchIndexErrorMessage"` } type PartitionResponseV8 struct { - Index int32 - ErrorCode int16 - BaseOffset int64 - LogAppendTimeMs int64 - LogStartOffset int64 - RecordErrors RecordErrors - ErrorMessage string + Index int32 `json:"index"` + ErrorCode int16 `json:"errorCode"` + BaseOffset int64 `json:"baseOffset"` + LogAppendTimeMs int64 `json:"logAppendTimeMs"` + LogStartOffset int64 `json:"logStartOffset"` + RecordErrors RecordErrors `json:"recordErrors"` + ErrorMessage string `json:"errorMessage"` } type ResponseV8 struct { - Name string - PartitionResponses []PartitionResponseV8 + Name string `json:"name"` + PartitionResponses []PartitionResponseV8 `json:"partitionResponses"` } type ProduceResponseV8 struct { - Responses []ResponseV8 - ThrottleTimeMs int32 + Responses []ResponseV8 `json:"responses"` + ThrottleTimeMs int32 `json:"throttleTimeMs"` } // Fetch Request (Version: 0) type FetchPartitionV0 struct { - Partition int32 - FetchOffset int64 - PartitionMaxBytes int32 + Partition int32 `json:"partition"` + FetchOffset int64 `json:"fetchOffset"` + PartitionMaxBytes int32 `json:"partitionMaxBytes"` } type FetchTopicV0 struct { - Topic string - Partitions []FetchPartitionV0 + Topic string `json:"topic"` + Partitions []FetchPartitionV0 `json:"partitions"` } type FetchRequestV0 struct { - ReplicaId int32 - MaxWaitMs int32 - MinBytes int32 - Topics []FetchTopicV0 + ReplicaId int32 `json:"replicaId"` + MaxWaitMs int32 `json:"maxWaitMs"` + MinBytes int32 `json:"minBytes"` + Topics []FetchTopicV0 `json:"topics"` } // Fetch Request (Version: 3) type FetchRequestV3 struct { - ReplicaId int32 - MaxWaitMs int32 - MinBytes int32 - MaxBytes int32 - Topics []FetchTopicV0 + ReplicaId int32 `json:"replicaId"` + MaxWaitMs int32 `json:"maxWaitMs"` + MinBytes int32 `json:"minBytes"` + MaxBytes int32 `json:"maxBytes"` + Topics []FetchTopicV0 `json:"topics"` } // Fetch Request (Version: 4) type FetchRequestV4 struct { - ReplicaId int32 - MaxWaitMs int32 - MinBytes int32 - MaxBytes int32 - IsolationLevel int8 - Topics []FetchTopicV0 + ReplicaId int32 `json:"replicaId"` + MaxWaitMs int32 `json:"maxWaitMs"` + MinBytes int32 `json:"minBytes"` + MaxBytes int32 `json:"maxBytes"` + IsolationLevel int8 `json:"isolationLevel"` + Topics []FetchTopicV0 `json:"topics"` } // Fetch Request (Version: 5) type FetchPartitionV5 struct { - Partition int32 - FetchOffset int64 - LogStartOffset int64 - PartitionMaxBytes int32 + Partition int32 `json:"partition"` + FetchOffset int64 `json:"fetchOffset"` + LogStartOffset int64 `json:"logStartOffset"` + PartitionMaxBytes int32 `json:"partitionMaxBytes"` } type FetchTopicV5 struct { - Topic string - Partitions []FetchPartitionV5 + Topic string `json:"topic"` + Partitions []FetchPartitionV5 `json:"partitions"` } type FetchRequestV5 struct { - ReplicaId int32 - MaxWaitMs int32 - MinBytes int32 - MaxBytes int32 - IsolationLevel int8 - Topics []FetchTopicV5 + ReplicaId int32 `json:"replicaId"` + MaxWaitMs int32 `json:"maxWaitMs"` + MinBytes int32 `json:"minBytes"` + MaxBytes int32 `json:"maxBytes"` + IsolationLevel int8 `json:"isolationLevel"` + Topics []FetchTopicV5 `json:"topics"` } // Fetch Request (Version: 7) type ForgottenTopicsDataV7 struct { - Topic string - Partitions []int32 + Topic string `json:"topic"` + Partitions []int32 `json:"partitions"` } type FetchRequestV7 struct { - ReplicaId int32 - MaxWaitMs int32 - MinBytes int32 - MaxBytes int32 - IsolationLevel int8 - SessionId int32 - SessionEpoch int32 - Topics []FetchTopicV5 - ForgottenTopicsData ForgottenTopicsDataV7 + ReplicaId int32 `json:"replicaId"` + MaxWaitMs int32 `json:"maxWaitMs"` + MinBytes int32 `json:"minBytes"` + MaxBytes int32 `json:"maxBytes"` + IsolationLevel int8 `json:"isolationLevel"` + SessionId int32 `json:"sessionId"` + SessionEpoch int32 `json:"sessionEpoch"` + Topics []FetchTopicV5 `json:"topics"` + ForgottenTopicsData ForgottenTopicsDataV7 `json:"forgottenTopicsData"` } // Fetch Request (Version: 9) type FetchPartitionV9 struct { - Partition int32 - CurrentLeaderEpoch int32 - FetchOffset int64 - LogStartOffset int64 - PartitionMaxBytes int32 + Partition int32 `json:"partition"` + CurrentLeaderEpoch int32 `json:"currentLeaderEpoch"` + FetchOffset int64 `json:"fetchOffset"` + LogStartOffset int64 `json:"logStartOffset"` + PartitionMaxBytes int32 `json:"partitionMaxBytes"` } type FetchTopicV9 struct { - Topic string - Partitions []FetchPartitionV9 + Topic string `json:"topic"` + Partitions []FetchPartitionV9 `json:"partitions"` } type FetchRequestV9 struct { - ReplicaId int32 - MaxWaitMs int32 - MinBytes int32 - MaxBytes int32 - IsolationLevel int8 - SessionId int32 - SessionEpoch int32 - Topics []FetchTopicV9 - ForgottenTopicsData ForgottenTopicsDataV7 + ReplicaId int32 `json:"replicaId"` + MaxWaitMs int32 `json:"maxWaitMs"` + MinBytes int32 `json:"minBytes"` + MaxBytes int32 `json:"maxBytes"` + IsolationLevel int8 `json:"isolationLevel"` + SessionId int32 `json:"sessionId"` + SessionEpoch int32 `json:"sessionEpoch"` + Topics []FetchTopicV9 `json:"topics"` + ForgottenTopicsData ForgottenTopicsDataV7 `json:"forgottenTopicsData"` } // Fetch Request (Version: 11) type FetchRequestV11 struct { - ReplicaId int32 - MaxWaitMs int32 - MinBytes int32 - MaxBytes int32 - IsolationLevel int8 - SessionId int32 - SessionEpoch int32 - Topics []FetchTopicV9 - ForgottenTopicsData ForgottenTopicsDataV7 - RackId string + ReplicaId int32 `json:"replicaId"` + MaxWaitMs int32 `json:"maxWaitMs"` + MinBytes int32 `json:"minBytes"` + MaxBytes int32 `json:"maxBytes"` + IsolationLevel int8 `json:"isolationLevel"` + SessionId int32 `json:"sessionId"` + SessionEpoch int32 `json:"sessionEpoch"` + Topics []FetchTopicV9 `json:"topics"` + ForgottenTopicsData ForgottenTopicsDataV7 `json:"forgottenTopicsData"` + RackId string `json:"rackId"` } // Fetch Response (Version: 0) type PartitionResponseFetchV0 struct { - Partition int32 - ErrorCode int16 - HighWatermark int64 - RecordSet Records + Partition int32 `json:"partition"` + ErrorCode int16 `json:"errorCode"` + HighWatermark int64 `json:"highWatermark"` + RecordSet Records `json:"recordSet"` } type ResponseFetchV0 struct { - Topic string - PartitionResponses []PartitionResponseFetchV0 + Topic string `json:"topic"` + PartitionResponses []PartitionResponseFetchV0 `json:"partitionResponses"` } type FetchResponseV0 struct { - Responses []ResponseFetchV0 + Responses []ResponseFetchV0 `json:"responses"` } // Fetch Response (Version: 1) type FetchResponseV1 struct { - ThrottleTimeMs int32 - Responses []ResponseFetchV0 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Responses []ResponseFetchV0 `json:"responses"` } // Fetch Response (Version: 4) type AbortedTransactionsV4 struct { - ProducerId int32 - FirstOffset int32 + ProducerId int32 `json:"producerId"` + FirstOffset int32 `json:"firstOffset"` } type PartitionResponseFetchV4 struct { - Partition int32 - ErrorCode int16 - HighWatermark int64 - LastStableOffset int64 - AbortedTransactions AbortedTransactionsV4 - RecordSet Records + Partition int32 `json:"partition"` + ErrorCode int16 `json:"errorCode"` + HighWatermark int64 `json:"highWatermark"` + LastStableOffset int64 `json:"lastStableOffset"` + AbortedTransactions AbortedTransactionsV4 `json:"abortedTransactions"` + RecordSet Records `json:"recordSet"` } type ResponseFetchV4 struct { - Topic string - PartitionResponses []PartitionResponseFetchV4 + Topic string `json:"topic"` + PartitionResponses []PartitionResponseFetchV4 `json:"partitionResponses"` } type FetchResponseV4 struct { - ThrottleTimeMs int32 - Responses []ResponseFetchV4 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Responses []ResponseFetchV4 `json:"responses"` } // Fetch Response (Version: 5) type PartitionResponseFetchV5 struct { - Partition int32 - ErrorCode int16 - HighWatermark int64 - LastStableOffset int64 - LogStartOffset int64 - AbortedTransactions AbortedTransactionsV4 - RecordSet Records + Partition int32 `json:"partition"` + ErrorCode int16 `json:"errorCode"` + HighWatermark int64 `json:"highWatermark"` + LastStableOffset int64 `json:"lastStableOffset"` + LogStartOffset int64 `json:"logStartOffset"` + AbortedTransactions AbortedTransactionsV4 `json:"abortedTransactions"` + RecordSet Records `json:"recordSet"` } type ResponseFetchV5 struct { - Topic string - PartitionResponses []PartitionResponseFetchV5 + Topic string `json:"topic"` + PartitionResponses []PartitionResponseFetchV5 `json:"partitionResponses"` } type FetchResponseV5 struct { - ThrottleTimeMs int32 - Responses []ResponseFetchV5 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Responses []ResponseFetchV5 `json:"responses"` } // Fetch Response (Version: 7) type FetchResponseV7 struct { - ThrottleTimeMs int32 - ErrorCode int16 - SessionId int32 - Responses []ResponseFetchV5 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + ErrorCode int16 `json:"errorCode"` + SessionId int32 `json:"sessionId"` + Responses []ResponseFetchV5 `json:"responses"` } // Fetch Response (Version: 11) type PartitionResponseFetchV11 struct { - Partition int32 - ErrorCode int16 - HighWatermark int64 - LastStableOffset int64 - LogStartOffset int64 - AbortedTransactions AbortedTransactionsV4 - PreferredReadReplica int32 - RecordSet Records + Partition int32 `json:"partition"` + ErrorCode int16 `json:"errorCode"` + HighWatermark int64 `json:"highWatermark"` + LastStableOffset int64 `json:"lastStableOffset"` + LogStartOffset int64 `json:"logStartOffset"` + AbortedTransactions AbortedTransactionsV4 `json:"abortedTransactions"` + PreferredReadReplica int32 `json:"preferredReadReplica"` + RecordSet Records `json:"recordSet"` } type ResponseFetchV11 struct { - Topic string - PartitionResponses []PartitionResponseFetchV11 + Topic string `json:"topic"` + PartitionResponses []PartitionResponseFetchV11 `json:"partitionResponses"` } type FetchResponseV11 struct { - ThrottleTimeMs int32 - ErrorCode int16 - SessionId int32 - Responses []ResponseFetchV5 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + ErrorCode int16 `json:"errorCode"` + SessionId int32 `json:"sessionId"` + Responses []ResponseFetchV5 `json:"responses"` } // ListOffsets Request (Version: 0) type ListOffsetsRequestPartitionV0 struct { - PartitionIndex int32 - Timestamp int64 - MaxNumOffsets int32 + PartitionIndex int32 `json:"partitionIndex"` + Timestamp int64 `json:"timestamp"` + MaxNumOffsets int32 `json:"maxNumOffsets"` } type ListOffsetsRequestTopicV0 struct { - Name string - Partitions []ListOffsetsRequestPartitionV0 + Name string `json:"name"` + Partitions []ListOffsetsRequestPartitionV0 `json:"partitions"` } type ListOffsetsRequestV0 struct { - ReplicaId int32 - Topics []ListOffsetsRequestTopicV0 + ReplicaId int32 `json:"replicaId"` + Topics []ListOffsetsRequestTopicV0 `json:"topics"` } // ListOffsets Request (Version: 1) type ListOffsetsRequestPartitionV1 struct { - PartitionIndex int32 - Timestamp int64 + PartitionIndex int32 `json:"partitionIndex"` + Timestamp int64 `json:"timestamp"` } type ListOffsetsRequestTopicV1 struct { - Name string - Partitions []ListOffsetsRequestPartitionV1 + Name string `json:"name"` + Partitions []ListOffsetsRequestPartitionV1 `json:"partitions"` } type ListOffsetsRequestV1 struct { - ReplicaId int32 - Topics []ListOffsetsRequestTopicV1 + ReplicaId int32 `json:"replicaId"` + Topics []ListOffsetsRequestTopicV1 `json:"topics"` } // ListOffsets Request (Version: 2) type ListOffsetsRequestV2 struct { - ReplicaId int32 - IsolationLevel int8 - Topics []ListOffsetsRequestTopicV1 + ReplicaId int32 `json:"replicaId"` + IsolationLevel int8 `json:"isolationLevel"` + Topics []ListOffsetsRequestTopicV1 `json:"topics"` } // ListOffsets Request (Version: 4) type ListOffsetsRequestPartitionV4 struct { - PartitionIndex int32 - CurrentLeaderEpoch int32 - Timestamp int64 + PartitionIndex int32 `json:"partitionIndex"` + CurrentLeaderEpoch int32 `json:"currentLeaderEpoch"` + Timestamp int64 `json:"timestamp"` } type ListOffsetsRequestTopicV4 struct { - Name string - Partitions []ListOffsetsRequestPartitionV4 + Name string `json:"name"` + Partitions []ListOffsetsRequestPartitionV4 `json:"partitions"` } type ListOffsetsRequestV4 struct { - ReplicaId int32 - Topics []ListOffsetsRequestTopicV4 + ReplicaId int32 `json:"replicaId"` + Topics []ListOffsetsRequestTopicV4 `json:"topics"` } // ListOffsets Response (Version: 0) type ListOffsetsResponsePartitionV0 struct { - PartitionIndex int32 - ErrorCode int16 - OldStyleOffsets int64 + PartitionIndex int32 `json:"partitionIndex"` + ErrorCode int16 `json:"errorCode"` + OldStyleOffsets int64 `json:"oldStyleOffsets"` } type ListOffsetsResponseTopicV0 struct { - Name string - Partitions []ListOffsetsResponsePartitionV0 + Name string `json:"name"` + Partitions []ListOffsetsResponsePartitionV0 `json:"partitions"` } type ListOffsetsResponseV0 struct { - Topics []ListOffsetsResponseTopicV0 + Topics []ListOffsetsResponseTopicV0 `json:"topics"` } // ListOffsets Response (Version: 1) type ListOffsetsResponsePartitionV1 struct { - PartitionIndex int32 - ErrorCode int16 - Timestamp int64 - Offset int64 + PartitionIndex int32 `json:"partitionIndex"` + ErrorCode int16 `json:"errorCode"` + Timestamp int64 `json:"timestamp"` + Offset int64 `json:"offset"` } type ListOffsetsResponseTopicV1 struct { - Name string - Partitions []ListOffsetsResponsePartitionV1 + Name string `json:"name"` + Partitions []ListOffsetsResponsePartitionV1 `json:"partitions"` } type ListOffsetsResponseV1 struct { - Topics []ListOffsetsResponseTopicV1 + Topics []ListOffsetsResponseTopicV1 `json:"topics"` } // ListOffsets Response (Version: 2) type ListOffsetsResponseV2 struct { - ThrottleTimeMs int32 - Topics []ListOffsetsResponseTopicV1 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Topics []ListOffsetsResponseTopicV1 `json:"topics"` } // ListOffsets Response (Version: 4) type ListOffsetsResponsePartitionV4 struct { - PartitionIndex int32 - ErrorCode int16 - Timestamp int64 - Offset int64 - LeaderEpoch int32 + PartitionIndex int32 `json:"partitionIndex"` + ErrorCode int16 `json:"errorCode"` + Timestamp int64 `json:"timestamp"` + Offset int64 `json:"offset"` + LeaderEpoch int32 `json:"leaderEpoch"` } type ListOffsetsResponseTopicV4 struct { - Name string - Partitions []ListOffsetsResponsePartitionV4 + Name string `json:"name"` + Partitions []ListOffsetsResponsePartitionV4 `json:"partitions"` } type ListOffsetsResponseV4 struct { - Topics []ListOffsetsResponseTopicV4 + Topics []ListOffsetsResponseTopicV4 `json:"topics"` } // CreateTopics Request (Version: 0) type AssignmentsV0 struct { - PartitionIndex int32 - BrokerIds []int32 + PartitionIndex int32 `json:"partitionIndex"` + BrokerIds []int32 `json:"brokerIds"` } type CreateTopicsRequestConfigsV0 struct { - Name string - Value string + Name string `json:"name"` + Value string `json:"value"` } type CreateTopicsRequestTopicV0 struct { - Name string - NumPartitions int32 - ReplicationFactor int16 - Assignments []AssignmentsV0 - Configs []CreateTopicsRequestConfigsV0 + Name string `json:"name"` + NumPartitions int32 `json:"numPartitions"` + ReplicationFactor int16 `json:"replicationFactor"` + Assignments []AssignmentsV0 `json:"assignments"` + Configs []CreateTopicsRequestConfigsV0 `json:"configs"` } type CreateTopicsRequestV0 struct { - Topics []CreateTopicsRequestTopicV0 - TimeoutMs int32 + Topics []CreateTopicsRequestTopicV0 `json:"topics"` + TimeoutMs int32 `json:"timeoutMs"` } // CreateTopics Request (Version: 1) type CreateTopicsRequestV1 struct { - Topics []CreateTopicsRequestTopicV0 - TimeoutMs int32 - ValidateOnly bool + Topics []CreateTopicsRequestTopicV0 `json:"topics"` + TimeoutMs int32 `json:"timeoutMs"` + ValidateOnly bool `json:"validateOnly"` } // CreateTopics Response (Version: 0) type CreateTopicsResponseTopicV0 struct { - Name string - ErrorCode int16 + Name string `json:"name"` + ErrorCode int16 `json:"errorCode"` } type CreateTopicsResponseV0 struct { - Topics []CreateTopicsResponseTopicV0 + Topics []CreateTopicsResponseTopicV0 `json:"topics"` } // CreateTopics Response (Version: 1) type CreateTopicsResponseTopicV1 struct { - Name string - ErrorCode int16 - ErrorMessage string + Name string `json:"name"` + ErrorCode int16 `json:"errorCode"` + ErrorMessage string `json:"errorMessage"` } type CreateTopicsResponseV1 struct { - Topics []CreateTopicsResponseTopicV1 + Topics []CreateTopicsResponseTopicV1 `json:"topics"` } // CreateTopics Response (Version: 2) type CreateTopicsResponseV2 struct { - ThrottleTimeMs int32 - Topics []CreateTopicsResponseTopicV1 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Topics []CreateTopicsResponseTopicV1 `json:"topics"` } // CreateTopics Response (Version: 5) type CreateTopicsResponseConfigsV5 struct { - Name string - Value string - ReadOnly bool - ConfigSource int8 - IsSensitive bool + Name string `json:"name"` + Value string `json:"value"` + ReadOnly bool `json:"readOnly"` + ConfigSource int8 `json:"configSource"` + IsSensitive bool `json:"isSensitive"` } type CreateTopicsResponseTopicV5 struct { - Name string - ErrorCode int16 - ErrorMessage string - NumPartitions int32 - ReplicationFactor int16 - Configs []CreateTopicsResponseConfigsV5 + Name string `json:"name"` + ErrorCode int16 `json:"errorCode"` + ErrorMessage string `json:"errorMessage"` + NumPartitions int32 `json:"numPartitions"` + ReplicationFactor int16 `json:"replicationFactor"` + Configs []CreateTopicsResponseConfigsV5 `json:"configs"` } type CreateTopicsResponseV5 struct { - ThrottleTimeMs int32 - Topics []CreateTopicsResponseTopicV5 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Topics []CreateTopicsResponseTopicV5 `json:"topics"` } // CreateTopics Response (Version: 7) type CreateTopicsResponseTopicV7 struct { - Name string - TopicID UUID - ErrorCode int16 - ErrorMessage string - NumPartitions int32 - ReplicationFactor int16 - Configs []CreateTopicsResponseConfigsV5 + Name string `json:"name"` + TopicID UUID `json:"topicID"` + ErrorCode int16 `json:"errorCode"` + ErrorMessage string `json:"errorMessage"` + NumPartitions int32 `json:"numPartitions"` + ReplicationFactor int16 `json:"replicationFactor"` + Configs []CreateTopicsResponseConfigsV5 `json:"configs"` } type CreateTopicsResponseV7 struct { - ThrottleTimeMs int32 - Topics []CreateTopicsResponseTopicV7 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Topics []CreateTopicsResponseTopicV7 `json:"topics"` } // DeleteTopics Request (Version: 0) type DeleteTopicsRequestV0 struct { - TopicNames []string - TimeoutMs int32 + TopicNames []string `json:"topicNames"` + TimeoutMs int32 `json:"timeoutMs"` } // DeleteTopics Request (Version: 6) type DeleteTopicsRequestTopicV6 struct { - Name string - UUID UUID + Name string `json:"name"` + UUID UUID `json:"uuid"` } type DeleteTopicsRequestV6 struct { - Topics []DeleteTopicsRequestTopicV6 - TimeoutMs int32 + Topics []DeleteTopicsRequestTopicV6 `json:"topics"` + TimeoutMs int32 `json:"timeoutMs"` } // DeleteTopics Response (Version: 0) type DeleteTopicsReponseResponseV0 struct { - Name string - ErrorCode int16 + Name string `json:"name"` + ErrorCode int16 `json:"errorCode"` } type DeleteTopicsReponseV0 struct { - Responses []DeleteTopicsReponseResponseV0 + Responses []DeleteTopicsReponseResponseV0 `json:"responses"` } // DeleteTopics Response (Version: 1) type DeleteTopicsReponseV1 struct { - ThrottleTimeMs int32 - Responses []DeleteTopicsReponseResponseV0 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Responses []DeleteTopicsReponseResponseV0 `json:"responses"` } // DeleteTopics Response (Version: 5) type DeleteTopicsReponseResponseV5 struct { - Name string - ErrorCode int16 - ErrorMessage string + Name string `json:"name"` + ErrorCode int16 `json:"errorCode"` + ErrorMessage string `json:"errorMessage"` } type DeleteTopicsReponseV5 struct { - ThrottleTimeMs int32 - Responses []DeleteTopicsReponseResponseV5 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Responses []DeleteTopicsReponseResponseV5 `json:"responses"` } // DeleteTopics Response (Version: 6) type DeleteTopicsReponseResponseV6 struct { - Name string - TopicID UUID - ErrorCode int16 - ErrorMessage string + Name string `json:"name"` + TopicID UUID `json:"topicID"` + ErrorCode int16 `json:"errorCode"` + ErrorMessage string `json:"errorMessage"` } type DeleteTopicsReponseV6 struct { - ThrottleTimeMs int32 - Responses []DeleteTopicsReponseResponseV6 + ThrottleTimeMs int32 `json:"throttleTimeMs"` + Responses []DeleteTopicsReponseResponseV6 `json:"responses"` } diff --git a/tap/extensions/redis/helpers.go b/tap/extensions/redis/helpers.go index a020b722d..3f8b61791 100644 --- a/tap/extensions/redis/helpers.go +++ b/tap/extensions/redis/helpers.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "fmt" "github.com/up9inc/mizu/tap/api" ) @@ -24,33 +25,38 @@ type RedisWrapper struct { Details interface{} `json:"details"` } -func representGeneric(generic map[string]interface{}) (representation []interface{}) { - details, _ := json.Marshal([]map[string]string{ +func representGeneric(generic map[string]interface{}, selectorPrefix string) (representation []interface{}) { + details, _ := json.Marshal([]api.TableData{ { - "name": "Type", - "value": generic["type"].(string), + Name: "Type", + Value: generic["type"].(string), + Selector: fmt.Sprintf("%stype", selectorPrefix), }, { - "name": "Command", - "value": generic["command"].(string), + Name: "Command", + Value: generic["command"].(string), + Selector: fmt.Sprintf("%scommand", selectorPrefix), }, { - "name": "Key", - "value": generic["key"].(string), + Name: "Key", + Value: generic["key"].(string), + Selector: fmt.Sprintf("%skey", selectorPrefix), }, { - "name": "Value", - "value": generic["value"].(string), + Name: "Value", + Value: generic["value"].(string), + Selector: fmt.Sprintf("%svalue", selectorPrefix), }, { - "name": "Keyword", - "value": generic["keyword"].(string), + Name: "Keyword", + Value: generic["keyword"].(string), + Selector: fmt.Sprintf("%skeyword", selectorPrefix), }, }) - representation = append(representation, map[string]string{ - "type": api.TABLE, - "title": "Details", - "data": string(details), + representation = append(representation, api.SectionData{ + Type: api.TABLE, + Title: "Details", + Data: string(details), }) return diff --git a/tap/extensions/redis/main.go b/tap/extensions/redis/main.go index be0650bfc..387a82b2f 100644 --- a/tap/extensions/redis/main.go +++ b/tap/extensions/redis/main.go @@ -13,6 +13,7 @@ var protocol api.Protocol = api.Protocol{ Name: "redis", LongName: "Redis Serialization Protocol", Abbreviation: "REDIS", + Macro: "redis", Version: "3.x", BackgroundColor: "#a41e11", ForegroundColor: "#ffffff", @@ -57,9 +58,12 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co } } -func (d dissecting) Analyze(item *api.OutputChannelItem, entryId string, resolvedSource string, resolvedDestination string) *api.MizuEntry { +func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, resolvedDestination string) *api.MizuEntry { request := item.Pair.Request.Payload.(map[string]interface{}) + response := item.Pair.Response.Payload.(map[string]interface{}) reqDetails := request["details"].(map[string]interface{}) + resDetails := response["details"].(map[string]interface{}) + service := "redis" if resolvedDestination != "" { service = resolvedDestination @@ -78,45 +82,49 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, entryId string, resolve } request["url"] = summary - entryBytes, _ := json.Marshal(item.Pair) return &api.MizuEntry{ - ProtocolName: protocol.Name, - ProtocolLongName: protocol.LongName, - ProtocolAbbreviation: protocol.Abbreviation, - ProtocolVersion: protocol.Version, - ProtocolBackgroundColor: protocol.BackgroundColor, - ProtocolForegroundColor: protocol.ForegroundColor, - ProtocolFontSize: protocol.FontSize, - ProtocolReferenceLink: protocol.ReferenceLink, - EntryId: entryId, - Entry: string(entryBytes), - Url: fmt.Sprintf("%s%s", service, summary), - Method: method, - Status: 0, - RequestSenderIp: item.ConnectionInfo.ClientIP, - Service: service, - Timestamp: item.Timestamp, - ElapsedTime: 0, - Path: summary, - ResolvedSource: resolvedSource, - ResolvedDestination: resolvedDestination, - SourceIp: item.ConnectionInfo.ClientIP, - DestinationIp: item.ConnectionInfo.ServerIP, - SourcePort: item.ConnectionInfo.ClientPort, - DestinationPort: item.ConnectionInfo.ServerPort, - IsOutgoing: item.ConnectionInfo.IsOutgoing, + Protocol: protocol, + Source: &api.TCP{ + Name: resolvedSource, + IP: item.ConnectionInfo.ClientIP, + Port: item.ConnectionInfo.ClientPort, + }, + Destination: &api.TCP{ + Name: resolvedDestination, + IP: item.ConnectionInfo.ServerIP, + Port: item.ConnectionInfo.ServerPort, + }, + Outgoing: item.ConnectionInfo.IsOutgoing, + Request: reqDetails, + Response: resDetails, + Url: fmt.Sprintf("%s%s", service, summary), + Method: method, + Status: 0, + RequestSenderIp: item.ConnectionInfo.ClientIP, + Service: service, + Timestamp: item.Timestamp, + StartTime: item.Pair.Request.CaptureTime, + ElapsedTime: 0, + Summary: summary, + ResolvedSource: resolvedSource, + ResolvedDestination: resolvedDestination, + SourceIp: item.ConnectionInfo.ClientIP, + DestinationIp: item.ConnectionInfo.ServerIP, + SourcePort: item.ConnectionInfo.ClientPort, + DestinationPort: item.ConnectionInfo.ServerPort, + IsOutgoing: item.ConnectionInfo.IsOutgoing, } } func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { return &api.BaseEntryDetails{ - Id: entry.EntryId, + Id: entry.Id, Protocol: protocol, Url: entry.Url, RequestSenderIp: entry.RequestSenderIp, Service: entry.Service, - Summary: entry.Path, + Summary: entry.Summary, StatusCode: entry.Status, Method: entry.Method, Timestamp: entry.Timestamp, @@ -133,22 +141,22 @@ func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { } } -func (d dissecting) Represent(entry *api.MizuEntry) (p api.Protocol, object []byte, bodySize int64, err error) { - p = protocol +func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface{}, response map[string]interface{}) (protoOut api.Protocol, object []byte, bodySize int64, err error) { + protoOut = protocol bodySize = 0 - var root map[string]interface{} - json.Unmarshal([]byte(entry.Entry), &root) representation := make(map[string]interface{}, 0) - request := root["request"].(map[string]interface{})["payload"].(map[string]interface{}) - response := root["response"].(map[string]interface{})["payload"].(map[string]interface{}) - reqDetails := request["details"].(map[string]interface{}) - resDetails := response["details"].(map[string]interface{}) - repRequest := representGeneric(reqDetails) - repResponse := representGeneric(resDetails) + repRequest := representGeneric(request, `request.`) + repResponse := representGeneric(response, `response.`) representation["request"] = repRequest representation["response"] = repResponse object, err = json.Marshal(representation) return } +func (d dissecting) Macros() map[string]string { + return map[string]string{ + `redis`: fmt.Sprintf(`proto.abbr == "%s"`, protocol.Abbreviation), + } +} + var Dissector dissecting diff --git a/ui/package-lock.json b/ui/package-lock.json index f6a4eff73..745364d11 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1769,6 +1769,33 @@ } } }, + "@mapbox/rehype-prism": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@mapbox/rehype-prism/-/rehype-prism-0.7.0.tgz", + "integrity": "sha512-zSG46selA6v+3THhCatTyOt9DuTzxTIVTxTbcj15kFmxPDtjzZ5VoFVCLZfjWFouYa9PiXxcbMLLhJoVzCxh9w==", + "requires": { + "hast-util-to-string": "^1.0.4", + "refractor": "^3.4.0", + "unist-util-visit": "^2.0.3" + }, + "dependencies": { + "prismjs": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.24.1.tgz", + "integrity": "sha512-mNPsedLuk90RVJioIky8ANZEwYm5w9LcvCXrxHlwf4fNVSn8jEipMybMkWUyyF0JhnC+C4VcOVSBuHRKs1L5Ow==" + }, + "refractor": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.4.0.tgz", + "integrity": "sha512-dBeD02lC5eytm9Gld2Mx0cMcnR+zhSnsTfPpWqFaMgUMJfC9A6bcN3Br/NaXrnBJcuxnLFR90k1jrkaSyV8umg==", + "requires": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.24.0" + } + } + } + }, "@material-ui/core": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.2.tgz", @@ -1788,6 +1815,14 @@ "react-transition-group": "^4.4.0" } }, + "@material-ui/icons": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", + "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", + "requires": { + "@babel/runtime": "^7.4.4" + } + }, "@material-ui/lab": { "version": "4.0.0-alpha.60", "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz", @@ -2406,6 +2441,11 @@ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, + "@types/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-ARATsLdrGPUnaBvxLhUlnltcMgn7pQG312S8ccdYlnyijabrX9RN/KN/iGj9Am96CoW8e/K9628BA7Bv4XHdrA==" + }, "@types/prettier": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", @@ -2629,6 +2669,26 @@ "eslint-visitor-keys": "^2.0.0" } }, + "@uiw/react-textarea-code-editor": { + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@uiw/react-textarea-code-editor/-/react-textarea-code-editor-1.4.12.tgz", + "integrity": "sha512-op0aIRxX8hLi8OLwm/23dQ2X4o2xHUoK2pLr1DWBFgNbIh4L+RM5zByNFjV8mHfi/NvE6mQLB6LtMd1qaor5MQ==", + "requires": { + "@babel/runtime": "7.15.4", + "@mapbox/rehype-prism": "0.7.0", + "rehype": "12.0.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, "@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -3689,6 +3749,11 @@ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, + "bail": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.1.tgz", + "integrity": "sha512-d5FoTAr2S5DSUPKl85WNm2yUwsINN8eidIdIwsOge2t33DaOfOdSmmsI11jMN3GmALCXaw+Y6HMVHDzePshFAA==" + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4179,6 +4244,11 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "ccount": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.0.tgz", + "integrity": "sha512-VOR0NWFYX65n9gELQdcpqsie5L5ihBXuZGAgaPEp/U7IOSjnPMEH6geE+2f6lcekaNEfWzAHS45mPvSo5bqsUA==" + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -4199,6 +4269,11 @@ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" }, + "character-entities-html4": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.0.0.tgz", + "integrity": "sha512-dwT2xh5ZhUAjyP96k57ilMKoTQyASaw9IAMR9U5c1lCu2RUni6O6jxfpUEdO2RcPT6TJFvr8pqsbami4Jk+2oA==" + }, "character-entities-legacy": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", @@ -7534,11 +7609,121 @@ "minimalistic-assert": "^1.0.1" } }, + "hast-util-from-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz", + "integrity": "sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==", + "requires": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "dependencies": { + "comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" + }, + "hast-util-parse-selector": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz", + "integrity": "sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==", + "requires": { + "@types/hast": "^2.0.0" + } + }, + "hastscript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.0.2.tgz", + "integrity": "sha512-uA8ooUY4ipaBvKcMuPehTAB/YfFLSSzCwFSwT6ltJbocFUKH/GDHLN+tflq7lSRf9H86uOuxOFkh1KgIy3Gg2g==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + } + }, + "property-information": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.0.1.tgz", + "integrity": "sha512-F4WUUAF7fMeF4/JUFHNBWDaKDXi2jbvqBW/y6o5wsf3j19wTZ7S60TmtB5HoBhtgw7NKQRMWuz5vk2PR0CygUg==" + }, + "space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" + } + } + }, + "hast-util-is-element": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.1.tgz", + "integrity": "sha512-ag0fiZfRWsPiR1udvnSbaazJLGv8qd8E+/e3rW8rUZhbKG4HNJmFL4QkEceN+22BgE+uozXY30z/s+2dL6Z++g==", + "requires": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + } + }, "hast-util-parse-selector": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" }, + "hast-util-to-html": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.2.tgz", + "integrity": "sha512-ipLhUTMyyJi9F/LXaNDG9BrRdshP6obCfmUZYbE/+T639IdzqAOkKN4DyrEyID0gbb+rsC3PKf0XlviZwzomhw==", + "requires": { + "@types/hast": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "unist-util-is": "^5.0.0" + }, + "dependencies": { + "comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" + }, + "property-information": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.0.1.tgz", + "integrity": "sha512-F4WUUAF7fMeF4/JUFHNBWDaKDXi2jbvqBW/y6o5wsf3j19wTZ7S60TmtB5HoBhtgw7NKQRMWuz5vk2PR0CygUg==" + }, + "space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==" + } + } + }, + "hast-util-to-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz", + "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==" + }, + "hast-util-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", + "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==" + }, "hastscript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", @@ -7671,6 +7856,11 @@ "terser": "^4.6.3" } }, + "html-void-elements": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.0.tgz", + "integrity": "sha512-4OYzQQsBt0G9bJ/nM9/DDsjm4+fVdzAaPJJcWk5QwA3GIAPxQEeOR0rsI8HbDHQz5Gta8pVvGnnTNSbZVEVvkQ==" + }, "html-webpack-plugin": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", @@ -13470,6 +13660,14 @@ "refractor": "^3.2.0" } }, + "react-toastify": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.0.3.tgz", + "integrity": "sha512-rv3koC7f9lKKSkdpYgo/TGzgWlrB/aaiUInF1DyV7BpiM4kyTs+uhu6/r8XDMtBY2FOIHK+FlK3Iv7OzpA/tCA==", + "requires": { + "clsx": "^1.1.1" + } + }, "react-transition-group": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", @@ -13693,6 +13891,38 @@ } } }, + "rehype": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.0.tgz", + "integrity": "sha512-gZcttmf9R5IYHb8AlI1rlmWqXS1yX0rSB/S5ZGJs8atfYZy2DobvH3Ic/gSzB+HL/+oOHPtBguw1TprfhxXBgQ==", + "requires": { + "@types/hast": "^2.0.0", + "rehype-parse": "^8.0.0", + "rehype-stringify": "^9.0.0", + "unified": "^10.0.0" + } + }, + "rehype-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.3.tgz", + "integrity": "sha512-RGw0CVt+0S6KdvpE8bbP2Db9WXclQcIX7A0ufM3QFqAhTo/ddJMQrrI2j3cijlRPZlGK8R3pRgC8U5HyV76IDw==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^6.0.0", + "unified": "^10.0.0" + } + }, + "rehype-stringify": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.2.tgz", + "integrity": "sha512-BuVA6lAEYtOpXO2xuHLohAzz8UNoQAxAqYRqh4QEEtU39Co+P1JBZhw6wXA9hMWp+JLcmrxWH8+UKcNSr443Fw==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + } + }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -15342,6 +15572,22 @@ } } }, + "stringify-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.1.tgz", + "integrity": "sha512-gmMQxKXPWIO3NXNSPyWNhlYcBNGpPA/487D+9dLPnU4xBnIrnHdr8cv5rGJOS/1BRxEXRb7uKwg7BA36IWV7xg==", + "requires": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^2.0.0" + }, + "dependencies": { + "character-entities-legacy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-2.0.0.tgz", + "integrity": "sha512-YwaEtEvWLpFa6Wh3uVLrvirA/ahr9fki/NUd/Bd4OR6EdJ8D22hovYQEOUCBfQfcqnC4IAMGMsHXY1eXgL4ZZA==" + } + } + }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -15877,6 +16123,11 @@ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, + "trough": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz", + "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==" + }, "true-case-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", @@ -16037,6 +16288,32 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" }, + "unified": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.0.tgz", + "integrity": "sha512-4U3ru/BRXYYhKbwXV6lU6bufLikoAavTwev89H5UxY8enDFaAT2VXmIXYNm6hb5oHPng/EXr77PVyDFcptbk5g==", + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-plain-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", + "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==" + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -16082,6 +16359,38 @@ "crypto-random-string": "^1.0.0" } }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + }, + "unist-util-stringify-position": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz", + "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -16306,6 +16615,42 @@ "extsprintf": "^1.2.0" } }, + "vfile": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.1.0.tgz", + "integrity": "sha512-4o7/DJjEaFPYSh0ckv5kcYkJTHQgCKdL8ozMM1jLAxO9ox95IzveDPXCZp08HamdWq8JXTkClDvfAKaeLQeKtg==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + } + } + }, + "vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "requires": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "vfile-message": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz", + "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -16590,6 +16935,11 @@ "minimalistic-assert": "^1.0.0" } }, + "web-namespaces": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.0.tgz", + "integrity": "sha512-dE7ELZRVWh0ceQsRgkjLgsAvwTuv3kcjSY/hLjqL0llleUlQBDjE9JkB9FCBY5F2mnFEwiyJoowl8+NVGHe8dw==" + }, "web-vitals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.1.tgz", diff --git a/ui/package.json b/ui/package.json index 463ef8c4b..088241fe0 100644 --- a/ui/package.json +++ b/ui/package.json @@ -4,6 +4,7 @@ "private": true, "dependencies": { "@material-ui/core": "^4.11.3", + "@material-ui/icons": "^4.11.2", "@material-ui/lab": "^4.0.0-alpha.60", "@testing-library/jest-dom": "^5.11.10", "@testing-library/react": "^11.2.6", @@ -12,6 +13,7 @@ "@types/node": "^12.20.10", "@types/react": "^17.0.3", "@types/react-dom": "^17.0.3", + "@uiw/react-textarea-code-editor": "^1.4.12", "axios": "^0.21.1", "jsonpath": "^1.1.1", "node-sass": "^5.0.0", @@ -23,6 +25,7 @@ "react-scripts": "4.0.3", "react-scrollable-feed-virtualized": "^1.4.3", "react-syntax-highlighter": "^15.4.3", + "react-toastify": "^8.0.3", "typescript": "^4.2.4", "web-vitals": "^1.1.1" }, diff --git a/ui/src/components/EntriesList.tsx b/ui/src/components/EntriesList.tsx index 53e653a05..4fc05895e 100644 --- a/ui/src/components/EntriesList.tsx +++ b/ui/src/components/EntriesList.tsx @@ -1,10 +1,7 @@ import {EntryItem} from "./EntryListItem/EntryListItem"; -import React, {useCallback, useEffect, useMemo, useRef, useState} from "react"; +import React, {useRef} from "react"; import styles from './style/EntriesList.module.sass'; -import spinner from './assets/spinner.svg'; import ScrollableFeedVirtualized from "react-scrollable-feed-virtualized"; -import {StatusType} from "./Filters"; -import Api from "../helpers/api"; import down from "./assets/downImg.svg"; interface EntriesListProps { @@ -13,114 +10,36 @@ interface EntriesListProps { focusedEntryId: string; setFocusedEntryId: (id: string) => void; connectionOpen: boolean; - noMoreDataTop: boolean; - setNoMoreDataTop: (flag: boolean) => void; - noMoreDataBottom: boolean; - setNoMoreDataBottom: (flag: boolean) => void; - methodsFilter: Array; - statusFilter: Array; - pathFilter: string; - serviceFilter: string; listEntryREF: any; onScrollEvent: (isAtBottom:boolean) => void; scrollableList: boolean; + ws: any + openWebSocket: any; + query: string; + updateQuery: any; + queriedCurrent: number; + queriedTotal: number; + startTime: number; } -enum FetchOperator { - LT = "lt", - GT = "gt" -} - -const api = new Api(); - -export const EntriesList: React.FC = ({entries, setEntries, focusedEntryId, setFocusedEntryId, connectionOpen, noMoreDataTop, setNoMoreDataTop, noMoreDataBottom, setNoMoreDataBottom, methodsFilter, statusFilter, pathFilter, serviceFilter, listEntryREF, onScrollEvent, scrollableList}) => { - - const [loadMoreTop, setLoadMoreTop] = useState(false); - const [isLoadingTop, setIsLoadingTop] = useState(false); +export const EntriesList: React.FC = ({entries, setEntries, focusedEntryId, setFocusedEntryId, connectionOpen, listEntryREF, onScrollEvent, scrollableList, ws, openWebSocket, query, updateQuery, queriedCurrent, queriedTotal, startTime}) => { const scrollableRef = useRef(null); - useEffect(() => { - const list = document.getElementById('list').firstElementChild; - list.addEventListener('scroll', (e) => { - const el: any = e.target; - if(el.scrollTop === 0) { - setLoadMoreTop(true); - } else { - setLoadMoreTop(false); - } - }); - }, []); - - const filterEntries = useCallback((entry) => { - if(methodsFilter.length > 0 && !methodsFilter.includes(entry.method.toLowerCase())) return; - if(pathFilter && entry.path?.toLowerCase()?.indexOf(pathFilter) === -1) return; - if(serviceFilter && entry.service?.toLowerCase()?.indexOf(serviceFilter) === -1) return; - if(statusFilter.includes(StatusType.SUCCESS) && entry.statusCode >= 400) return; - if(statusFilter.includes(StatusType.ERROR) && entry.statusCode < 400) return; - return entry; - },[methodsFilter, pathFilter, statusFilter, serviceFilter]) - - const filteredEntries = useMemo(() => { - return entries.filter(filterEntries); - },[entries, filterEntries]) - - const getOldEntries = useCallback(async () => { - setIsLoadingTop(true); - const data = await api.fetchEntries(FetchOperator.LT, entries[0].timestamp); - setLoadMoreTop(false); - - let scrollTo; - if(data.length === 0) { - setNoMoreDataTop(true); - scrollTo = document.getElementById("noMoreDataTop"); - } else { - scrollTo = document.getElementById(filteredEntries?.[0]?.id); - } - setIsLoadingTop(false); - const newEntries = [...data, ...entries]; - setEntries(newEntries); - - if(scrollTo) { - scrollTo.scrollIntoView(); - } - },[setLoadMoreTop, setIsLoadingTop, entries, setEntries, filteredEntries, setNoMoreDataTop]) - - useEffect(() => { - if(!loadMoreTop || connectionOpen || noMoreDataTop) return; - getOldEntries(); - }, [loadMoreTop, connectionOpen, noMoreDataTop, getOldEntries]); - - const getNewEntries = async () => { - const data = await api.fetchEntries(FetchOperator.GT, entries[entries.length - 1].timestamp); - let scrollTo; - if(data.length === 0) { - setNoMoreDataBottom(true); - } - scrollTo = document.getElementById(filteredEntries?.[filteredEntries.length -1]?.id); - let newEntries = [...entries, ...data]; - setEntries(newEntries); - if(scrollTo) { - scrollTo.scrollIntoView({behavior: "smooth"}); - } - } - return <>
- {isLoadingTop &&
- spinner -
} onScrollEvent(isAtBottom)}> - {noMoreDataTop && !connectionOpen &&
No more data available
} - {filteredEntries.map(entry => )} + isSelected={focusedEntryId === entry.id.toString()} + style={{}} + updateQuery={updateQuery}/>)}
- {!connectionOpen && !noMoreDataBottom &&
-
getNewEntries()}>Fetch more entries
+ {!connectionOpen &&
+
{ws.close(); openWebSocket(query);}}>Reconnect
}
- {entries?.length > 0 &&
-
{filteredEntries?.length !== entries.length && `${filteredEntries?.length} / `} {entries?.length} requests
-
Started listening at {new Date(+entries[0].timestamp)?.toLocaleString()}
-
} +
+
Displaying {entries?.length} results (queried {queriedCurrent}/{queriedTotal})
+ {startTime !== 0 &&
Started listening at {new Date(startTime).toLocaleString()}
} +
; }; diff --git a/ui/src/components/EntryDetailed.tsx b/ui/src/components/EntryDetailed.tsx index ffc5151a9..2c5481a13 100644 --- a/ui/src/components/EntryDetailed.tsx +++ b/ui/src/components/EntryDetailed.tsx @@ -3,7 +3,7 @@ import EntryViewer from "./EntryDetailed/EntryViewer"; import {makeStyles} from "@material-ui/core"; import Protocol from "./UI/Protocol" import StatusCode from "./UI/StatusCode"; -import {EndpointPath} from "./UI/EndpointPath"; +import {Summary} from "./UI/Summary"; const useStyles = makeStyles(() => ({ entryTitle: { @@ -28,50 +28,79 @@ const useStyles = makeStyles(() => ({ interface EntryDetailedProps { entryData: any + updateQuery: any } export const formatSize = (n: number) => n > 1000 ? `${Math.round(n / 1000)}KB` : `${n} B`; -const EntryTitle: React.FC = ({protocol, data, bodySize, elapsedTime}) => { +const EntryTitle: React.FC = ({protocol, data, bodySize, elapsedTime, updateQuery}) => { const classes = useStyles(); - const {response} = JSON.parse(data.entry); + const response = data.response; return
- +
- {response.payload &&
{formatSize(bodySize)}
} - {response.payload &&
{Math.round(elapsedTime)}ms
} + {response &&
{ + updateQuery(`response.bodySize == ${bodySize}`) + }} + > + {formatSize(bodySize)} +
} + {response &&
{ + updateQuery(`elapsedTime >= ${elapsedTime}`) + }} + > + {Math.round(elapsedTime)}ms +
}
; }; -const EntrySummary: React.FC = ({data}) => { +const EntrySummary: React.FC = ({data, updateQuery}) => { const classes = useStyles(); - const {response, request} = JSON.parse(data.entry); + const response = data.response; return
- {response?.payload && response.payload?.details && "status" in response.payload.details &&
- + {response && "status" in response &&
+
}
- +
; }; -export const EntryDetailed: React.FC = ({entryData}) => { +export const EntryDetailed: React.FC = ({entryData, updateQuery}) => { return <> - {entryData.data && } + {entryData.data && } <> - {entryData.data && } + {entryData.data && } }; diff --git a/ui/src/components/EntryDetailed/EntrySections.tsx b/ui/src/components/EntryDetailed/EntrySections.tsx index f364b4a51..b702b4db1 100644 --- a/ui/src/components/EntryDetailed/EntrySections.tsx +++ b/ui/src/components/EntryDetailed/EntrySections.tsx @@ -9,11 +9,29 @@ import ProtobufDecoder from "protobuf-decoder"; interface EntryViewLineProps { label: string; value: number | string; + updateQuery: any; + selector: string; + overrideQueryValue?: string; } -const EntryViewLine: React.FC = ({label, value}) => { +const EntryViewLine: React.FC = ({label, value, updateQuery, selector, overrideQueryValue}) => { return (label && value && - {label} + { + if (!selector) { + return + } else if (overrideQueryValue) { + updateQuery(`${selector} == ${overrideQueryValue}`) + } else if (typeof(value) === "string") { + updateQuery(`${selector} == "${JSON.stringify(value).slice(1, -1)}"`) + } else { + updateQuery(`${selector} == ${value}`) + } + }} + > + {label} + = ({tit interface EntryBodySectionProps { content: any, color: string, + updateQuery: any, encoding?: string, contentType?: string, + selector?: string, } export const EntryBodySection: React.FC = ({ color, + updateQuery, content, encoding, contentType, + selector, }) => { const MAXIMUM_BYTES_TO_HIGHLIGHT = 10000; // The maximum of chars to highlight in body, in case the response can be megabytes const supportedLanguages = [['html', 'html'], ['json', 'json'], ['application/grpc', 'json']]; // [[indicator, languageToUse],...] @@ -107,8 +129,8 @@ export const EntryBodySection: React.FC = ({ {content && content?.length > 0 && - - + +
@@ -132,17 +154,23 @@ interface EntrySectionProps { title: string, color: string, arrayToIterate: any[], + updateQuery: any, } -export const EntryTableSection: React.FC = ({title, color, arrayToIterate}) => { +export const EntryTableSection: React.FC = ({title, color, arrayToIterate, updateQuery}) => { return { arrayToIterate && arrayToIterate.length > 0 ? - {arrayToIterate.map(({name, value}, index) => )} + {arrayToIterate.map(({name, value, selector}, index) => )}
: diff --git a/ui/src/components/EntryDetailed/EntryViewer.tsx b/ui/src/components/EntryDetailed/EntryViewer.tsx index dc8b8f4c7..dabf3d5b7 100644 --- a/ui/src/components/EntryDetailed/EntryViewer.tsx +++ b/ui/src/components/EntryDetailed/EntryViewer.tsx @@ -8,7 +8,7 @@ enum SectionTypes { SectionBody = "body", } -const SectionsRepresentation: React.FC = ({data, color}) => { +const SectionsRepresentation: React.FC = ({data, color, updateQuery}) => { const sections = [] if (data) { @@ -16,12 +16,12 @@ const SectionsRepresentation: React.FC = ({data, color}) => { switch (row.type) { case SectionTypes.SectionTable: sections.push( - + ) break; case SectionTypes.SectionBody: sections.push( - + ) break; default: @@ -33,7 +33,7 @@ const SectionsRepresentation: React.FC = ({data, color}) => { return <>{sections}; } -const AutoRepresentation: React.FC = ({representation, isRulesEnabled, rulesMatched, contractStatus, requestReason, responseReason, contractContent, elapsedTime, color}) => { +const AutoRepresentation: React.FC = ({representation, isRulesEnabled, rulesMatched, contractStatus, requestReason, responseReason, contractContent, elapsedTime, color, updateQuery}) => { var TABS = [ { tab: 'Request' @@ -85,10 +85,10 @@ const AutoRepresentation: React.FC = ({representation, isRulesEnabled, rule
{currentTab === TABS[0].tab && - + } {response && currentTab === TABS[responseTabIndex].tab && - + } {isRulesEnabled && currentTab === TABS[rulesTabIndex].tab && @@ -110,9 +110,10 @@ interface Props { contractContent: string; color: string; elapsedTime: number; + updateQuery: any; } -const EntryViewer: React.FC = ({representation, isRulesEnabled, rulesMatched, contractStatus, requestReason, responseReason, contractContent, elapsedTime, color}) => { +const EntryViewer: React.FC = ({representation, isRulesEnabled, rulesMatched, contractStatus, requestReason, responseReason, contractContent, elapsedTime, color, updateQuery}) => { return = ({representation, isRulesEnabled, rulesMatc contractContent={contractContent} elapsedTime={elapsedTime} color={color} + updateQuery={updateQuery} /> }; diff --git a/ui/src/components/EntryListItem/EntryListItem.tsx b/ui/src/components/EntryListItem/EntryListItem.tsx index fc418631f..ae771801d 100644 --- a/ui/src/components/EntryListItem/EntryListItem.tsx +++ b/ui/src/components/EntryListItem/EntryListItem.tsx @@ -2,7 +2,7 @@ import React from "react"; import styles from './EntryListItem.module.sass'; import StatusCode, {getClassification, StatusCodeClassification} from "../UI/StatusCode"; import Protocol, {ProtocolInterface} from "../UI/Protocol" -import {EndpointPath} from "../UI/EndpointPath"; +import {Summary} from "../UI/Summary"; import ingoingIconSuccess from "../assets/ingoing-traffic-success.svg" import ingoingIconFailure from "../assets/ingoing-traffic-failure.svg" import ingoingIconNeutral from "../assets/ingoing-traffic-neutral.svg" @@ -15,7 +15,7 @@ interface Entry { method?: string, summary: string, service: string, - id: string, + id: number, statusCode?: number; url?: string; timestamp: Date; @@ -40,9 +40,10 @@ interface EntryProps { setFocusedEntryId: (id: string) => void; isSelected?: boolean; style: object; + updateQuery: any; } -export const EntryItem: React.FC = ({entry, setFocusedEntryId, isSelected, style}) => { +export const EntryItem: React.FC = ({entry, setFocusedEntryId, isSelected, style, updateQuery}) => { const classification = getClassification(entry.statusCode) const numberOfRules = entry.rules.numberOfRules let ingoingIcon; @@ -115,10 +116,10 @@ export const EntryItem: React.FC = ({entry, setFocusedEntryId, isSel return <>
setFocusedEntryId(entry.id)} + onClick={() => setFocusedEntryId(entry.id.toString())} style={{ border: isSelected ? `1px ${entry.protocol.backgroundColor} solid` : "1px transparent solid", position: "absolute", @@ -127,14 +128,26 @@ export const EntryItem: React.FC = ({entry, setFocusedEntryId, isSel width: "calc(100% - 25px)", }} > - + {((entry.protocol.name === "http" && "statusCode" in entry) || entry.statusCode !== 0) &&
- +
}
- +
- {entry.service} + { + updateQuery(`service == "${entry.service}"`) + }} + > + {entry.service} +
{ @@ -152,17 +165,53 @@ export const EntryItem: React.FC = ({entry, setFocusedEntryId, isSel : "" }
- {entry.sourcePort} + { + updateQuery(`src.port == "${entry.sourcePort}"`) + }} + > + {entry.sourcePort} + {entry.isOutgoing ? - Ingoing traffic + Ingoing traffic { + updateQuery(`outgoing == true`) + }} + /> : - Outgoing traffic + Outgoing traffic { + updateQuery(`outgoing == false`) + }} + /> } - {entry.destinationPort} + { + updateQuery(`dst.port == "${entry.destinationPort}"`) + }} + > + {entry.destinationPort} +
- - {new Date(+entry.timestamp)?.toLocaleString()} + { + updateQuery(`timestamp >= datetime("${new Date(+entry.timestamp)?.toLocaleString("en-US", {timeZone: 'UTC' })}")`) + }} + > + {new Date(+entry.timestamp)?.toLocaleString("en-US")}
diff --git a/ui/src/components/Filters.tsx b/ui/src/components/Filters.tsx index c1795a67a..3c7e38f74 100644 --- a/ui/src/components/Filters.tsx +++ b/ui/src/components/Filters.tsx @@ -1,137 +1,303 @@ -import React from "react"; +import React, {useRef, useState} from "react"; import styles from './style/Filters.module.sass'; -import {FilterSelect} from "./UI/FilterSelect"; -import {TextField} from "@material-ui/core"; -import {ALL_KEY} from "./UI/Select"; +import {Button, Grid, Modal, Box, Typography, Backdrop, Fade, Divider} from "@material-ui/core"; +import CodeEditor from '@uiw/react-textarea-code-editor'; +import MenuBookIcon from '@material-ui/icons/MenuBook'; +import {SyntaxHighlighter} from "./UI/SyntaxHighlighter/index"; +import filterUIExample1 from "./assets/filter-ui-example-1.png" +import filterUIExample2 from "./assets/filter-ui-example-2.png" interface FiltersProps { - methodsFilter: Array; - setMethodsFilter: (methods: Array) => void; - statusFilter: Array; - setStatusFilter: (methods: Array) => void; - pathFilter: string - setPathFilter: (val: string) => void; - serviceFilter: string - setServiceFilter: (val: string) => void; + query: string + setQuery: any + backgroundColor: string + ws: any + openWebSocket: (query: string) => void; } -export const Filters: React.FC = ({methodsFilter, setMethodsFilter, statusFilter, setStatusFilter, pathFilter, setPathFilter, serviceFilter, setServiceFilter}) => { - +export const Filters: React.FC = ({query, setQuery, backgroundColor, ws, openWebSocket}) => { return
- - - - +
; }; -const _toUpperCase = v => v.toUpperCase(); +interface QueryFormProps { + query: string + setQuery: any + backgroundColor: string + ws: any + openWebSocket: (query: string) => void; +} -const FilterContainer: React.FC = ({children}) => { - return
- {children} -
; +const style = { + position: 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: '80vw', + bgcolor: 'background.paper', + borderRadius: '5px', + boxShadow: 24, + p: 4, + color: '#000', }; -enum HTTPMethod { - GET = "get", - PUT = "put", - POST = "post", - DELETE = "delete", - OPTIONS="options", - PATCH = "patch" -} +export const QueryForm: React.FC = ({query, setQuery, backgroundColor, ws, openWebSocket}) => { -interface MethodFilterProps { - methodsFilter: Array; - setMethodsFilter: (methods: Array) => void; -} + const formRef = useRef(null); -const MethodFilter: React.FC = ({methodsFilter, setMethodsFilter}) => { + const [openModal, setOpenModal] = useState(false); - const methodClicked = (val) => { - if(val === ALL_KEY) { - setMethodsFilter([]); - return; - } - if(methodsFilter.includes(val)) { - setMethodsFilter(methodsFilter.filter(method => method !== val)) - } else { - setMethodsFilter([...methodsFilter, val]); - } + const handleOpenModal = () => setOpenModal(true); + const handleCloseModal = () => setOpenModal(false); + + const handleChange = async (e) => { + setQuery(e.target.value); } - return - methodClicked(val)} - transformDisplay={_toUpperCase} - label={"Methods"} - /> - ; -}; - -export enum StatusType { - SUCCESS = "success", - ERROR = "error" -} - -interface StatusTypesFilterProps { - statusFilter: Array; - setStatusFilter: (methods: Array) => void; -} - -const StatusTypesFilter: React.FC = ({statusFilter, setStatusFilter}) => { - - const statusClicked = (val) => { - if(val === ALL_KEY) { - setStatusFilter([]); - return; - } - setStatusFilter([val]); + const handleSubmit = (e) => { + ws.close() + openWebSocket(query) + e.preventDefault(); } - return - statusClicked(val)} - transformDisplay={_toUpperCase} - label="Status" - /> - ; -}; + return <> +
+ + + + + + + + + +
-interface PathFilterProps { - pathFilter: string; - setPathFilter: (val: string) => void; + + + + + Filtering Guide (Cheatsheet) + + +

Mizu has a rich filtering syntax that let's you query the results both flexibly and efficiently.

+

Here are some examples that you can try;

+
+ + + + This is a simple query that matches to HTTP packets with request path "/catalogue": + + + + The same query can be negated for HTTP path and written like this: + + + + The syntax supports regular expressions. Here is a query that matches the HTTP requests that send JSON to a server: + + + + Here is another query that matches HTTP responses with status code 4xx: + + + + The same exact query can be as integer comparison: + + = 400`} + language="python" + /> + + The results can be queried based on their timestamps: + + + + + + + Since Mizu supports various protocols like gRPC, AMQP, Kafka and Redis. It's possible to write complex queries that match multiple protocols like this: + + + + By clicking the UI elements in both left-pane and right-pane, you can automatically select a field and update the query: + + Clicking to UI elements (left-pane) + + Such that; clicking this in left-pane, would append the query below: + + + + Another queriable UI element example, this time from the right-pane: + + Clicking to UI elements (right-pane) + + A query that compares one selector to another is also a valid query: + + + + + + + There are a few helper methods included the in the filter language* to help building queries more easily. + +

+ + true if the given selector's value starts with the string: + + + + true if the given selector's value ends with the string: + + + + true if the given selector's value contains the string: + + + + returns the UNIX timestamp which is the equivalent of the time that's provided by the string. Invalid input evaluates to false: + + = datetime("10/19/2021, 6:29:02 PM")`} + language="python" + /> + + limits the number of records that are streamed back as a result of a query. Always evaluates to true: + + +
+
+

+ + *The filtering functionality is provided through Basenine database server. Please refer to BFL Syntax Reference for more information. + +
+
+
+ } - -const PathFilter: React.FC = ({pathFilter, setPathFilter}) => { - - return -
Path
-
- setPathFilter(e.target.value)}/> -
-
; -}; - -interface ServiceFilterProps { - serviceFilter: string; - setServiceFilter: (val: string) => void; -} - -const ServiceFilter: React.FC = ({serviceFilter, setServiceFilter}) => { - - return -
Service
-
- setServiceFilter(e.target.value)}/> -
-
; -}; - diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index f1e3be2b1..b8ea48ff7 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -10,6 +10,8 @@ import pauseIcon from './assets/pause.svg'; import variables from '../variables.module.scss'; import {StatusBar} from "./UI/StatusBar"; import Api, {MizuWebsocketURL} from "../helpers/api"; +import { ToastContainer, toast } from 'react-toastify'; +import 'react-toastify/dist/ReactToastify.css'; const useLayoutStyles = makeStyles(() => ({ details: { @@ -34,7 +36,6 @@ const useLayoutStyles = makeStyles(() => ({ enum ConnectionStatus { Closed, Connected, - Paused } interface TrafficPageProps { @@ -52,25 +53,52 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const [focusedEntryId, setFocusedEntryId] = useState(null); const [selectedEntryData, setSelectedEntryData] = useState(null); const [connection, setConnection] = useState(ConnectionStatus.Closed); - const [noMoreDataTop, setNoMoreDataTop] = useState(false); - const [noMoreDataBottom, setNoMoreDataBottom] = useState(false); - - const [methodsFilter, setMethodsFilter] = useState([]); - const [statusFilter, setStatusFilter] = useState([]); - const [pathFilter, setPathFilter] = useState(""); - const [serviceFilter, setServiceFilter] = useState(""); const [tappingStatus, setTappingStatus] = useState(null); const [disableScrollList, setDisableScrollList] = useState(false); + const [query, setQueryDefault] = useState(""); + const [queryBackgroundColor, setQueryBackgroundColor] = useState("#f5f5f5"); + + const [queriedCurrent, setQueriedCurrent] = useState(0); + const [queriedTotal, setQueriedTotal] = useState(0); + + const [startTime, setStartTime] = useState(0); + + const setQuery = async (query) => { + if (!query) { + setQueryBackgroundColor("#f5f5f5") + } else { + const data = await api.validateQuery(query); + if (data.valid) { + setQueryBackgroundColor("#d2fad2") + } else { + setQueryBackgroundColor("#fad6dc") + } + } + setQueryDefault(query) + } + + const updateQuery = (addition) => { + if (query) { + setQuery(`${query} and ${addition}`) + } else { + setQuery(addition) + } + } + const ws = useRef(null); const listEntry = useRef(null); - const openWebSocket = () => { + const openWebSocket = (query) => { + setEntries([]) ws.current = new WebSocket(MizuWebsocketURL); - ws.current.onopen = () => setConnection(ConnectionStatus.Connected); + ws.current.onopen = () => { + ws.current.send(query) + setConnection(ConnectionStatus.Connected); + } ws.current.onclose = () => setConnection(ConnectionStatus.Closed); } @@ -81,11 +109,7 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS switch (message.messageType) { case "entry": const entry = message.data - if (connection === ConnectionStatus.Paused) { - setNoMoreDataBottom(false) - return; - } - if (!focusedEntryId) setFocusedEntryId(entry.id) + if (!focusedEntryId) setFocusedEntryId(entry.id.toString()) let newEntries = [...entries]; setEntries([...newEntries, entry]) if(listEntry.current) { @@ -103,6 +127,25 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS case "outboundLink": onTLSDetected(message.Data.DstIP); break; + case "toast": + toast[message.data.type](message.data.text, { + position: "bottom-right", + theme: "colored", + autoClose: message.data.autoClose, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + }); + break; + case "queryMetadata": + setQueriedCurrent(message.data.current) + setQueriedTotal(message.data.total) + break; + case "startTime": + setStartTime(message.data); + break; default: console.error(`unsupported websocket message type, Got: ${message.messageType}`) } @@ -111,7 +154,7 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS useEffect(() => { (async () => { - openWebSocket(); + openWebSocket("rlimit(100)"); try{ const tapStatusResponse = await api.tapStatus(); setTappingStatus(tapStatusResponse); @@ -139,14 +182,17 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS }, [focusedEntryId]) const toggleConnection = () => { - setConnection(connection === ConnectionStatus.Connected ? ConnectionStatus.Paused : ConnectionStatus.Connected); + if (connection === ConnectionStatus.Connected) { + ws.current.close(); + } else { + openWebSocket(query); + setConnection(ConnectionStatus.Connected); + } } const getConnectionStatusClass = (isContainer) => { const container = isContainer ? "Container" : ""; switch (connection) { - case ConnectionStatus.Paused: - return "orangeIndicator" + container; case ConnectionStatus.Connected: return "greenIndicator" + container; default: @@ -156,8 +202,6 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const getConnectionTitle = () => { switch (connection) { - case ConnectionStatus.Paused: - return "traffic paused"; case ConnectionStatus.Connected: return "connected, waiting for traffic" default: @@ -176,8 +220,10 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS return (
- {connection !== ConnectionStatus.Closed && pause} + pause + play
{getConnectionTitle()}
@@ -185,42 +231,51 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS
- {entries.length > 0 &&
+ {
-
-
- {selectedEntryData && } + {selectedEntryData && }
} {tappingStatus?.pods != null && } +
) }; diff --git a/ui/src/components/UI/EndpointPath.tsx b/ui/src/components/UI/EndpointPath.tsx deleted file mode 100644 index 2561aab44..000000000 --- a/ui/src/components/UI/EndpointPath.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import miscStyles from "./style/misc.module.sass"; -import React from "react"; -import styles from './style/EndpointPath.module.sass'; - -interface EndpointPathProps { - method: string, - path: string -} - -export const EndpointPath: React.FC = ({method, path}) => { - return
- {method && {method}} - {path &&
{path}
} -
-}; diff --git a/ui/src/components/UI/FilterSelect.tsx b/ui/src/components/UI/FilterSelect.tsx deleted file mode 100644 index bf6764ad0..000000000 --- a/ui/src/components/UI/FilterSelect.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from "react"; -import { MenuItem } from '@material-ui/core'; -import style from './style/FilterSelect.module.sass'; -import { Select, SelectProps } from "./Select"; - -interface FilterSelectProps extends SelectProps { - items: string[]; - value: string | string[]; - onChange: (string) => void; - label?: string; - allowMultiple?: boolean; - transformDisplay?: (string) => string; -} - -export const FilterSelect: React.FC = ({items, value, onChange, label, allowMultiple= false, transformDisplay}) => { - return -}; diff --git a/ui/src/components/UI/Protocol.tsx b/ui/src/components/UI/Protocol.tsx index 0b031bf18..0befffce0 100644 --- a/ui/src/components/UI/Protocol.tsx +++ b/ui/src/components/UI/Protocol.tsx @@ -4,7 +4,8 @@ import styles from './style/Protocol.module.sass'; export interface ProtocolInterface { name: string longName: string - abbreviation: string + abbr: string + macro: string backgroundColor: string foregroundColor: string fontSize: number @@ -16,9 +17,10 @@ export interface ProtocolInterface { interface ProtocolProps { protocol: ProtocolInterface horizontal: boolean + updateQuery: any } -const Protocol: React.FC = ({protocol, horizontal}) => { +const Protocol: React.FC = ({protocol, horizontal, updateQuery}) => { if (horizontal) { return = ({protocol, horizontal}) => { color: protocol.foregroundColor, fontSize: 13, }} - title={protocol.abbreviation} + title={protocol.abbr} > {protocol.longName} } else { - return - - {protocol.abbreviation} - - + return { + updateQuery(protocol.macro) + }} + > + {protocol.abbr} + } }; diff --git a/ui/src/components/UI/StatusCode.tsx b/ui/src/components/UI/StatusCode.tsx index b35788ac1..b743aec02 100644 --- a/ui/src/components/UI/StatusCode.tsx +++ b/ui/src/components/UI/StatusCode.tsx @@ -9,16 +9,21 @@ export enum StatusCodeClassification { interface EntryProps { statusCode: number + updateQuery: any } -const StatusCode: React.FC = ({statusCode}) => { +const StatusCode: React.FC = ({statusCode, updateQuery}) => { const classification = getClassification(statusCode) return - {statusCode} + className={`queryable ${styles[classification]} ${styles.base}`} + onClick={() => { + updateQuery(`response.status == ${statusCode}`) + }} + > + {statusCode} }; diff --git a/ui/src/components/UI/Summary.tsx b/ui/src/components/UI/Summary.tsx new file mode 100644 index 000000000..3c05a89a8 --- /dev/null +++ b/ui/src/components/UI/Summary.tsx @@ -0,0 +1,32 @@ +import miscStyles from "./style/misc.module.sass"; +import React from "react"; +import styles from './style/Summary.module.sass'; + +interface SummaryProps { + method: string + summary: string + updateQuery: any +} + +export const Summary: React.FC = ({method, summary, updateQuery}) => { + return
+ {method && { + updateQuery(`method == "${method}"`) + }} + > + {method} + } + {summary &&
{ + updateQuery(`summary == "${summary}"`) + }} + > + {summary} +
} +
+}; diff --git a/ui/src/components/UI/SyntaxHighlighter/highlighterStyle.ts b/ui/src/components/UI/SyntaxHighlighter/highlighterStyle.ts index a5be67b25..1766e309a 100644 --- a/ui/src/components/UI/SyntaxHighlighter/highlighterStyle.ts +++ b/ui/src/components/UI/SyntaxHighlighter/highlighterStyle.ts @@ -112,7 +112,7 @@ export const highlighterStyle = { "color": "#C6C5FE" }, "operator": { - "color": "#EDEDED" + "color": "#A1A1A1" }, "entity": { "color": "#fdab2b", diff --git a/ui/src/components/UI/style/Protocol.module.sass b/ui/src/components/UI/style/Protocol.module.sass index e702f5ae2..9ffeaab14 100644 --- a/ui/src/components/UI/style/Protocol.module.sass +++ b/ui/src/components/UI/style/Protocol.module.sass @@ -6,7 +6,6 @@ background-color: #000 color: #fff margin-left: -8px - margin-bottom: -4px .vertical line-height: 22px diff --git a/ui/src/components/UI/style/EndpointPath.module.sass b/ui/src/components/UI/style/Summary.module.sass similarity index 75% rename from ui/src/components/UI/style/EndpointPath.module.sass rename to ui/src/components/UI/style/Summary.module.sass index 2fc54c0f3..59bc34893 100644 --- a/ui/src/components/UI/style/EndpointPath.module.sass +++ b/ui/src/components/UI/style/Summary.module.sass @@ -2,7 +2,7 @@ display: flex align-items: center -.path +.summary text-overflow: ellipsis overflow: hidden - white-space: nowrap \ No newline at end of file + white-space: nowrap diff --git a/ui/src/components/assets/filter-ui-example-1.png b/ui/src/components/assets/filter-ui-example-1.png new file mode 100644 index 0000000000000000000000000000000000000000..244c1b5113a305b006d82882448c7c8962ba4de6 GIT binary patch literal 41498 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

~Q*A6uQ&B;i6oP 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 L6Dj$k>-&EI3#xgX literal 0 HcmV?d00001 diff --git a/ui/src/components/style/EntriesList.module.sass b/ui/src/components/style/EntriesList.module.sass index 453f46081..c787799ab 100644 --- a/ui/src/components/style/EntriesList.module.sass +++ b/ui/src/components/style/EntriesList.module.sass @@ -38,15 +38,6 @@ border: 1px solid #627ef7 background-color: rgba(255, 255, 255, 0.06) -.spinnerContainer - display: flex - justify-content: center - margin-bottom: 10px - -.noMoreDataAvailable - text-align: center - font-weight: 600 - color: $secondary-font-color .fetchButtonContainer width: 100% display: flex diff --git a/ui/src/components/style/Filters.module.sass b/ui/src/components/style/Filters.module.sass index ae8af8224..b58795bad 100644 --- a/ui/src/components/style/Filters.module.sass +++ b/ui/src/components/style/Filters.module.sass @@ -4,9 +4,6 @@ display: flex flex-direction: row align-items: center - min-height: 3rem - overflow-y: hidden - overflow-x: auto padding: .5rem 0 border-bottom: 1px solid #BCC6DD margin-right: 20px @@ -29,8 +26,8 @@ input padding: 4px 12px background: $main-background-color - border-radius: 12px - font-size: 12px + border-radius: 4px + font-size: 14px border: 1px solid #BCC6DD fieldset border: none diff --git a/ui/src/components/style/TrafficPage.sass b/ui/src/components/style/TrafficPage.sass index ceeefe128..3a3c558f5 100644 --- a/ui/src/components/style/TrafficPage.sass +++ b/ui/src/components/style/TrafficPage.sass @@ -110,3 +110,8 @@ align-items: center height: 17px font-size: 16px + +.playPauseIcon + cursor: pointer + margin-right: 15px + height: 30px \ No newline at end of file diff --git a/ui/src/helpers/api.js b/ui/src/helpers/api.js index 3e6d1de65..2c92eb279 100644 --- a/ui/src/helpers/api.js +++ b/ui/src/helpers/api.js @@ -29,13 +29,8 @@ export default class Api { return response.data; } - getEntry = async (entryId) => { - const response = await this.client.get(`/entries/${entryId}`); - return response.data; - } - - fetchEntries = async (operator, timestamp) => { - const response = await this.client.get(`/entries?limit=50&operator=${operator}×tamp=${timestamp}`); + getEntry = async (id) => { + const response = await this.client.get(`/entries/${id}`); return response.data; } @@ -48,4 +43,11 @@ export default class Api { const response = await this.client.get("/status/auth"); return response.data; } + + validateQuery = async (query) => { + const form = new FormData(); + form.append('query', query) + const response = await this.client.post(`/query/validate`, form); + return response.data; + } } diff --git a/ui/src/index.sass b/ui/src/index.sass index 2cb79f24b..256f72501 100644 --- a/ui/src/index.sass +++ b/ui/src/index.sass @@ -22,6 +22,11 @@ code .uppercase text-transform: uppercase +.queryable + cursor: pointer + &:hover + text-decoration: underline + /**** * Button ***/ @@ -31,11 +36,13 @@ button &:not(.MuiFab-root) &.MuiButtonBase-root box-sizing: border-box - font-weight: 500 + font-weight: 600 line-height: 1 - border-radius: 20px + border-radius: 4px letter-spacing: 0.02857em - text-transform: uppercase + background-color: $blue-color + color: #fff + text-transform: none img:not(.custom) max-width: 13px max-height: 13px From b970640ebc3ae82f214699fff3ca19ed855dfaaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Wed, 10 Nov 2021 17:06:41 +0300 Subject: [PATCH 07/93] Remove the `Reconnect` button (#444) --- ui/src/components/EntriesList.tsx | 6 +----- ui/src/components/TrafficPage.tsx | 1 - ui/src/components/style/EntriesList.module.sass | 8 -------- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/ui/src/components/EntriesList.tsx b/ui/src/components/EntriesList.tsx index 4fc05895e..1ec329469 100644 --- a/ui/src/components/EntriesList.tsx +++ b/ui/src/components/EntriesList.tsx @@ -9,7 +9,6 @@ interface EntriesListProps { setEntries: (entries: any[]) => void; focusedEntryId: string; setFocusedEntryId: (id: string) => void; - connectionOpen: boolean; listEntryREF: any; onScrollEvent: (isAtBottom:boolean) => void; scrollableList: boolean; @@ -22,7 +21,7 @@ interface EntriesListProps { startTime: number; } -export const EntriesList: React.FC = ({entries, setEntries, focusedEntryId, setFocusedEntryId, connectionOpen, listEntryREF, onScrollEvent, scrollableList, ws, openWebSocket, query, updateQuery, queriedCurrent, queriedTotal, startTime}) => { +export const EntriesList: React.FC = ({entries, setEntries, focusedEntryId, setFocusedEntryId, listEntryREF, onScrollEvent, scrollableList, ws, openWebSocket, query, updateQuery, queriedCurrent, queriedTotal, startTime}) => { const scrollableRef = useRef(null); @@ -38,9 +37,6 @@ export const EntriesList: React.FC = ({entries, setEntries, fo style={{}} updateQuery={updateQuery}/>)} - {!connectionOpen &&

-
{ws.close(); openWebSocket(query);}}>Reconnect
-
} +
diff --git a/ui/src/components/EntryListItem/EntryListItem.tsx b/ui/src/components/EntryListItem/EntryListItem.tsx index ae771801d..e9346d6c5 100644 --- a/ui/src/components/EntryListItem/EntryListItem.tsx +++ b/ui/src/components/EntryListItem/EntryListItem.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, {useState} from "react"; import styles from './EntryListItem.module.sass'; import StatusCode, {getClassification, StatusCodeClassification} from "../UI/StatusCode"; import Protocol, {ProtocolInterface} from "../UI/Protocol" @@ -38,12 +38,14 @@ interface Rules { interface EntryProps { entry: Entry; setFocusedEntryId: (id: string) => void; - isSelected?: boolean; style: object; updateQuery: any; } -export const EntryItem: React.FC = ({entry, setFocusedEntryId, isSelected, style, updateQuery}) => { +export const EntryItem: React.FC = ({entry, setFocusedEntryId, style, updateQuery}) => { + + const [isSelected, setIsSelected] = useState(false); + const classification = getClassification(entry.statusCode) const numberOfRules = entry.rules.numberOfRules let ingoingIcon; @@ -119,7 +121,10 @@ export const EntryItem: React.FC = ({entry, setFocusedEntryId, isSel id={entry.id.toString()} className={`${styles.row} ${isSelected && !rule && !contractEnabled ? styles.rowSelected : additionalRulesProperties}`} - onClick={() => setFocusedEntryId(entry.id.toString())} + onClick={() => { + setIsSelected(!isSelected); + setFocusedEntryId(entry.id.toString()); + }} style={{ border: isSelected ? `1px ${entry.protocol.backgroundColor} solid` : "1px transparent solid", position: "absolute", diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index fa0a5ef18..51a33d372 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -1,6 +1,7 @@ import React, {useEffect, useRef, useState} from "react"; import {Filters} from "./Filters"; import {EntriesList} from "./EntriesList"; +import {EntryItem} from "./EntryListItem/EntryListItem"; import {makeStyles} from "@material-ui/core"; import "./style/TrafficPage.sass"; import styles from './style/EntriesList.module.sass'; @@ -50,50 +51,58 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const classes = useLayoutStyles(); const [entries, setEntries] = useState([] as any); + const [entriesBuffer, setEntriesBuffer] = useState([] as any); const [focusedEntryId, setFocusedEntryId] = useState(null); const [selectedEntryData, setSelectedEntryData] = useState(null); const [connection, setConnection] = useState(ConnectionStatus.Closed); const [tappingStatus, setTappingStatus] = useState(null); - const [disableScrollList, setDisableScrollList] = useState(false); + const [isSnappedToBottom, setIsSnappedToBottom] = useState(true); - const [query, setQueryDefault] = useState(""); + const [query, setQuery] = useState(""); const [queryBackgroundColor, setQueryBackgroundColor] = useState("#f5f5f5"); + const [addition, updateQuery] = useState(""); const [queriedCurrent, setQueriedCurrent] = useState(0); const [queriedTotal, setQueriedTotal] = useState(0); const [startTime, setStartTime] = useState(0); - const setQuery = async (query) => { - if (!query) { - setQueryBackgroundColor("#f5f5f5") - } else { - const data = await api.validateQuery(query); - if (data.valid) { - setQueryBackgroundColor("#d2fad2") + useEffect(() => { + (async function() { + if (!query) { + setQueryBackgroundColor("#f5f5f5") } else { - setQueryBackgroundColor("#fad6dc") + const data = await api.validateQuery(query); + if (!data) { + return; + } + if (data.valid) { + setQueryBackgroundColor("#d2fad2"); + } else { + setQueryBackgroundColor("#fad6dc"); + } } - } - setQueryDefault(query) - } + })(); + }, [query]); - const updateQuery = (addition) => { + useEffect(() => { if (query) { - setQuery(`${query} and ${addition}`) + setQuery(`${query} and ${addition}`); } else { - setQuery(addition) + setQuery(addition); } - } + // eslint-disable-next-line + }, [addition]); const ws = useRef(null); const listEntry = useRef(null); const openWebSocket = (query) => { - setEntries([]) + setEntries([]); + setEntriesBuffer([]); ws.current = new WebSocket(MizuWebsocketURL); ws.current.onopen = () => { ws.current.send(query) @@ -108,15 +117,18 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const message = JSON.parse(e.data); switch (message.messageType) { case "entry": - const entry = message.data - if (!focusedEntryId) setFocusedEntryId(entry.id.toString()) - let newEntries = [...entries]; - setEntries([...newEntries, entry]) - if(listEntry.current) { - if(isScrollable(listEntry.current.firstChild)) { - setDisableScrollList(true) - } - } + const entry = message.data; + if (!focusedEntryId) setFocusedEntryId(entry.id.toString()); + setEntriesBuffer([ + ...entriesBuffer, + + ]); break case "status": setTappingStatus(message.tappingStatus); @@ -140,8 +152,9 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS }); break; case "queryMetadata": - setQueriedCurrent(message.data.current) - setQueriedTotal(message.data.total) + setQueriedCurrent(message.data.current); + setQueriedTotal(message.data.total); + setEntries(entriesBuffer); break; case "startTime": setStartTime(message.data); @@ -209,21 +222,17 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS } } - const onScrollEvent = (isAtBottom) => { - isAtBottom ? setDisableScrollList(false) : setDisableScrollList(true) + const onSnapBrokenEvent = () => { + setIsSnappedToBottom(false) } - const isScrollable = (element) => { - return element.scrollHeight > element.clientHeight; - }; - return (
pause play + src={playIcon} onClick={toggleConnection}/>
{getConnectionTitle()}
@@ -243,16 +252,10 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS
{ @@ -45,9 +49,25 @@ export default class Api { } validateQuery = async (query) => { + if (this.source) { + this.source.cancel(); + } + this.source = CancelToken.source(); + const form = new FormData(); form.append('query', query) - const response = await this.client.post(`/query/validate`, form); + const response = await this.client.post(`/query/validate`, form, { + cancelToken: this.source.token + }).catch(function (thrown) { + if (!axios.isCancel(thrown)) { + console.error('Validate error', thrown.message); + } + }); + + if (!response) { + return null; + } + return response.data; } } From ad574956dfb2daae78de2f7ed95bbf1a1140eff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Tue, 16 Nov 2021 00:53:29 +0300 Subject: [PATCH 20/93] Upgrade Basenine version from `0.2.8` to `0.2.9` (#465) Fixes `limit` helper being not finished because of lack of meta updates. --- Dockerfile | 4 ++-- debug.Dockerfile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index b1d74b4f9..fa42bad83 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,8 +42,8 @@ RUN go build -ldflags="-s -w \ -X 'mizuserver/pkg/version.SemVer=${SEM_VER}'" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.8/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.8/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.9/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.9/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/debug.Dockerfile b/debug.Dockerfile index 7728c13e2..65d41070a 100644 --- a/debug.Dockerfile +++ b/debug.Dockerfile @@ -37,8 +37,8 @@ COPY agent . RUN go build -gcflags="all=-N -l" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.8/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.8/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.9/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.9/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 From 58a1eac2479a7026ffcfeba74674f17068a137f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Tue, 16 Nov 2021 01:58:22 +0300 Subject: [PATCH 21/93] Set `response.bodySize` to `0` if it's negative (#466) --- tap/extensions/http/main.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tap/extensions/http/main.go b/tap/extensions/http/main.go index d24a8d478..4a160f1f5 100644 --- a/tap/extensions/http/main.go +++ b/tap/extensions/http/main.go @@ -143,6 +143,10 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, } } + if resDetails["bodySize"].(float64) < 0 { + resDetails["bodySize"] = 0 + } + if item.Protocol.Version == "2.0" { service = fmt.Sprintf("%s://%s", scheme, authority) } else { From a6bf39fad5e65610942a07b7bd0c74192109485f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Tue, 16 Nov 2021 02:52:48 +0300 Subject: [PATCH 22/93] Prevent `elapsedTime` to be negative (#467) Also fix the `elapsedTime` for Redis. --- tap/extensions/http/main.go | 3 +++ tap/extensions/kafka/main.go | 3 +++ tap/extensions/redis/main.go | 7 ++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/tap/extensions/http/main.go b/tap/extensions/http/main.go index 4a160f1f5..28ca4a987 100644 --- a/tap/extensions/http/main.go +++ b/tap/extensions/http/main.go @@ -184,6 +184,9 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, } elapsedTime := item.Pair.Response.CaptureTime.Sub(item.Pair.Request.CaptureTime).Round(time.Millisecond).Milliseconds() + if elapsedTime < 0 { + elapsedTime = 0 + } httpPair, _ := json.Marshal(item.Pair) _protocol := protocol _protocol.Version = item.Protocol.Version diff --git a/tap/extensions/kafka/main.go b/tap/extensions/kafka/main.go index 4c8ea0697..1951a1b39 100644 --- a/tap/extensions/kafka/main.go +++ b/tap/extensions/kafka/main.go @@ -149,6 +149,9 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, request["url"] = summary elapsedTime := item.Pair.Response.CaptureTime.Sub(item.Pair.Request.CaptureTime).Round(time.Millisecond).Milliseconds() + if elapsedTime < 0 { + elapsedTime = 0 + } return &api.MizuEntry{ Protocol: _protocol, Source: &api.TCP{ diff --git a/tap/extensions/redis/main.go b/tap/extensions/redis/main.go index 387a82b2f..3a16132e2 100644 --- a/tap/extensions/redis/main.go +++ b/tap/extensions/redis/main.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "log" + "time" "github.com/up9inc/mizu/tap/api" ) @@ -82,6 +83,10 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, } request["url"] = summary + elapsedTime := item.Pair.Response.CaptureTime.Sub(item.Pair.Request.CaptureTime).Round(time.Millisecond).Milliseconds() + if elapsedTime < 0 { + elapsedTime = 0 + } return &api.MizuEntry{ Protocol: protocol, Source: &api.TCP{ @@ -104,7 +109,7 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, Service: service, Timestamp: item.Timestamp, StartTime: item.Pair.Request.CaptureTime, - ElapsedTime: 0, + ElapsedTime: elapsedTime, Summary: summary, ResolvedSource: resolvedSource, ResolvedDestination: resolvedDestination, From 3e30815fb4750e9a4efba9e93bf2d8ffb937097c Mon Sep 17 00:00:00 2001 From: RoyUP9 <87927115+RoyUP9@users.noreply.github.com> Date: Tue, 16 Nov 2021 11:01:40 +0200 Subject: [PATCH 23/93] changes log format to be more readable (#463) --- shared/logger/logger.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/logger/logger.go b/shared/logger/logger.go index 305246550..7f515f129 100644 --- a/shared/logger/logger.go +++ b/shared/logger/logger.go @@ -9,7 +9,7 @@ import ( var Log = logging.MustGetLogger("mizu") var format = logging.MustStringFormatter( - `%{time} %{level:.5s} â–¶ %{pid} %{shortfile} %{shortfunc} â–¶ %{message}`, + `%{time} %{level:.5s} â–¶ %{message} â–¶ %{pid} %{shortfile} %{shortfunc}`, ) func InitLogger(logPath string) { From a6ec246dd184b223f6489f51e363be5616c99ed2 Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Tue, 16 Nov 2021 11:33:31 +0200 Subject: [PATCH 24/93] Stop reduction of user agent header (#468) --- tap/extensions/http/sensitive_data_cleaner.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tap/extensions/http/sensitive_data_cleaner.go b/tap/extensions/http/sensitive_data_cleaner.go index 4d4487333..8dcf3c2cc 100644 --- a/tap/extensions/http/sensitive_data_cleaner.go +++ b/tap/extensions/http/sensitive_data_cleaner.go @@ -16,6 +16,7 @@ import ( ) const maskedFieldPlaceholderValue = "[REDACTED]" +const userAgent = "user-agent" //these values MUST be all lower case and contain no `-` or `_` characters var personallyIdentifiableDataFields = []string{"token", "authorization", "authentication", "cookie", "userid", "password", @@ -32,7 +33,7 @@ func IsIgnoredUserAgent(item *api.OutputChannelItem, options *api.TrafficFilteri request := item.Pair.Request.Payload.(api.HTTPPayload).Data.(*http.Request) for headerKey, headerValues := range request.Header { - if strings.ToLower(headerKey) == "user-agent" { + if strings.ToLower(headerKey) == userAgent { for _, userAgent := range options.IgnoredUserAgents { for _, headerValue := range headerValues { if strings.Contains(strings.ToLower(headerValue), strings.ToLower(userAgent)) { @@ -89,6 +90,10 @@ func filterResponseBody(response *http.Response, options *api.TrafficFilteringOp func filterHeaders(headers *http.Header) { for key, _ := range *headers { + if strings.ToLower(key) == userAgent { + continue + } + if strings.ToLower(key) == "cookie" { headers.Del(key) } else if isFieldNameSensitive(key) { From 763f72a6401f6a28ab79c7a5520f323309a6a2e9 Mon Sep 17 00:00:00 2001 From: RoyUP9 <87927115+RoyUP9@users.noreply.github.com> Date: Tue, 16 Nov 2021 12:07:48 +0200 Subject: [PATCH 25/93] remove newline in logs, fixed logs time format (#469) --- agent/main.go | 6 +++--- agent/pkg/api/main.go | 8 ++++---- agent/pkg/api/socket_routes.go | 4 ++-- agent/pkg/api/socket_server_handlers.go | 8 ++++---- agent/pkg/controllers/status_controller.go | 2 +- agent/pkg/resolver/resolver.go | 6 +++--- agent/pkg/up9/main.go | 10 +++++----- cli/cmd/tapRunner.go | 6 +++--- cli/cmd/viewRunner.go | 2 +- cli/mizu/fsUtils/mizuLogsUtils.go | 2 +- shared/logger/logger.go | 2 +- shared/models.go | 8 +++----- tap/api/api.go | 2 +- tap/diagnose/diagnose.go | 2 +- tap/extensions/amqp/main.go | 4 ++-- tap/extensions/http/main.go | 2 +- tap/extensions/kafka/main.go | 2 +- tap/extensions/redis/main.go | 2 +- tap/extensions/redis/read.go | 4 ++-- tap/passive_tapper.go | 2 +- tap/tcp_assembler.go | 2 +- tap/tcp_reader.go | 2 +- tap/tcp_streams_map.go | 2 +- tap/tester/tester.go | 12 ++++++------ 24 files changed, 50 insertions(+), 52 deletions(-) diff --git a/agent/main.go b/agent/main.go index 20841dd45..e7196a211 100644 --- a/agent/main.go +++ b/agent/main.go @@ -207,7 +207,7 @@ func loadExtensions() { extensionsMap = make(map[string]*tapApi.Extension) for i, file := range files { filename := file.Name() - logger.Log.Infof("Loading extension: %s\n", filename) + logger.Log.Infof("Loading extension: %s", filename) extension := &tapApi.Extension{ Path: path.Join(extensionsDir, filename), } @@ -219,7 +219,7 @@ func loadExtensions() { var ok bool dissector, ok = symDissector.(tapApi.Dissector) if err != nil || !ok { - panic(fmt.Sprintf("Failed to load the extension: %s\n", extension.Path)) + panic(fmt.Sprintf("Failed to load the extension: %s", extension.Path)) } dissector.Register(extension) extension.Dissector = dissector @@ -232,7 +232,7 @@ func loadExtensions() { }) for _, extension := range extensions { - logger.Log.Infof("Extension Properties: %+v\n", extension) + logger.Log.Infof("Extension Properties: %+v", extension) } controllers.InitExtensionsMap(extensionsMap) diff --git a/agent/pkg/api/main.go b/agent/pkg/api/main.go index 8bfc65787..97291fc9a 100644 --- a/agent/pkg/api/main.go +++ b/agent/pkg/api/main.go @@ -76,7 +76,7 @@ func startReadingFiles(workingDir string) { sort.Sort(utils.ByModTime(harFiles)) if len(harFiles) == 0 { - logger.Log.Infof("Waiting for new files\n") + logger.Log.Infof("Waiting for new files") time.Sleep(3 * time.Second) continue } @@ -109,7 +109,7 @@ func startReadingChannel(outputItems <-chan *tapApi.OutputChannelItem, extension ctx := context.Background() doc, contractContent, router, err := loadOAS(ctx) if err != nil { - logger.Log.Infof("Disabled OAS validation: %s\n", err.Error()) + logger.Log.Infof("Disabled OAS validation: %s", err.Error()) disableOASValidation = true } @@ -154,7 +154,7 @@ func resolveIP(connectionInfo *tapApi.ConnectionInfo) (resolvedSource string, re unresolvedSource := connectionInfo.ClientIP resolvedSource = k8sResolver.Resolve(unresolvedSource) if resolvedSource == "" { - logger.Log.Debugf("Cannot find resolved name to source: %s\n", unresolvedSource) + logger.Log.Debugf("Cannot find resolved name to source: %s", unresolvedSource) if os.Getenv("SKIP_NOT_RESOLVED_SOURCE") == "1" { return } @@ -162,7 +162,7 @@ func resolveIP(connectionInfo *tapApi.ConnectionInfo) (resolvedSource string, re unresolvedDestination := fmt.Sprintf("%s:%s", connectionInfo.ServerIP, connectionInfo.ServerPort) resolvedDestination = k8sResolver.Resolve(unresolvedDestination) if resolvedDestination == "" { - logger.Log.Debugf("Cannot find resolved name to dest: %s\n", unresolvedDestination) + logger.Log.Debugf("Cannot find resolved name to dest: %s", unresolvedDestination) if os.Getenv("SKIP_NOT_RESOLVED_DEST") == "1" { return } diff --git a/agent/pkg/api/socket_routes.go b/agent/pkg/api/socket_routes.go index 6344c66a8..8feccebac 100644 --- a/agent/pkg/api/socket_routes.go +++ b/agent/pkg/api/socket_routes.go @@ -146,7 +146,7 @@ func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers Even var metadata *basenine.Metadata err = json.Unmarshal(bytes, &metadata) if err != nil { - logger.Log.Debugf("Error recieving metadata: %v\n", err.Error()) + logger.Log.Debugf("Error recieving metadata: %v", err.Error()) } metadataBytes, _ := models.CreateWebsocketQueryMetadataMessage(metadata) @@ -167,7 +167,7 @@ func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers Even func socketCleanup(socketId int, socketConnection *SocketConnection) { err := socketConnection.connection.Close() if err != nil { - logger.Log.Errorf("Error closing socket connection for socket id %d: %v\n", socketId, err) + logger.Log.Errorf("Error closing socket connection for socket id %d: %v", socketId, err) } websocketIdsLock.Lock() diff --git a/agent/pkg/api/socket_server_handlers.go b/agent/pkg/api/socket_server_handlers.go index 9a6c8d3e8..d596becb2 100644 --- a/agent/pkg/api/socket_server_handlers.go +++ b/agent/pkg/api/socket_server_handlers.go @@ -65,14 +65,14 @@ func (h *RoutesEventHandlers) WebSocketMessage(_ int, message []byte) { var socketMessageBase shared.WebSocketMessageMetadata err := json.Unmarshal(message, &socketMessageBase) if err != nil { - logger.Log.Infof("Could not unmarshal websocket message %v\n", err) + logger.Log.Infof("Could not unmarshal websocket message %v", err) } else { switch socketMessageBase.MessageType { case shared.WebSocketMessageTypeTappedEntry: var tappedEntryMessage models.WebSocketTappedEntryMessage err := json.Unmarshal(message, &tappedEntryMessage) if err != nil { - logger.Log.Infof("Could not unmarshal message of message type %s %v\n", socketMessageBase.MessageType, err) + logger.Log.Infof("Could not unmarshal message of message type %s %v", socketMessageBase.MessageType, err) } else { // NOTE: This is where the message comes back from the intermediate WebSocket to code. h.SocketOutChannel <- tappedEntryMessage.Data @@ -81,7 +81,7 @@ func (h *RoutesEventHandlers) WebSocketMessage(_ int, message []byte) { var statusMessage shared.WebSocketStatusMessage err := json.Unmarshal(message, &statusMessage) if err != nil { - logger.Log.Infof("Could not unmarshal message of message type %s %v\n", socketMessageBase.MessageType, err) + logger.Log.Infof("Could not unmarshal message of message type %s %v", socketMessageBase.MessageType, err) } else { providers.TapStatus.Pods = statusMessage.TappingStatus.Pods BroadcastToBrowserClients(message) @@ -90,7 +90,7 @@ func (h *RoutesEventHandlers) WebSocketMessage(_ int, message []byte) { var outboundLinkMessage models.WebsocketOutboundLinkMessage err := json.Unmarshal(message, &outboundLinkMessage) if err != nil { - logger.Log.Infof("Could not unmarshal message of message type %s %v\n", socketMessageBase.MessageType, err) + logger.Log.Infof("Could not unmarshal message of message type %s %v", socketMessageBase.MessageType, err) } else { handleTLSLink(outboundLinkMessage) } diff --git a/agent/pkg/controllers/status_controller.go b/agent/pkg/controllers/status_controller.go index fab3bb690..6cd4deeff 100644 --- a/agent/pkg/controllers/status_controller.go +++ b/agent/pkg/controllers/status_controller.go @@ -37,7 +37,7 @@ func PostTappedPods(c *gin.Context) { providers.TapStatus.Pods = tapStatus.Pods message := shared.CreateWebSocketStatusMessage(*tapStatus) if jsonBytes, err := json.Marshal(message); err != nil { - logger.Log.Errorf("Could not Marshal message %v\n", err) + logger.Log.Errorf("Could not Marshal message %v", err) } else { api.BroadcastToBrowserClients(jsonBytes) } diff --git a/agent/pkg/resolver/resolver.go b/agent/pkg/resolver/resolver.go index 3d2ac5544..60533704d 100644 --- a/agent/pkg/resolver/resolver.go +++ b/agent/pkg/resolver/resolver.go @@ -164,10 +164,10 @@ func (resolver *Resolver) watchServices(ctx context.Context) error { func (resolver *Resolver) saveResolvedName(key string, resolved string, eventType watch.EventType) { if eventType == watch.Deleted { resolver.nameMap.Remove(key) - logger.Log.Infof("setting %s=nil\n", key) + logger.Log.Infof("setting %s=nil", key) } else { resolver.nameMap.Set(key, resolved) - logger.Log.Infof("setting %s=%s\n", key, resolved) + logger.Log.Infof("setting %s=%s", key, resolved) } } @@ -188,7 +188,7 @@ func (resolver *Resolver) infiniteErrorHandleRetryFunc(ctx context.Context, fun var statusError *k8serrors.StatusError if errors.As(err, &statusError) { if statusError.ErrStatus.Reason == metav1.StatusReasonForbidden { - logger.Log.Infof("Resolver loop encountered permission error, aborting event listening - %v\n", err) + logger.Log.Infof("Resolver loop encountered permission error, aborting event listening - %v", err) return } } diff --git a/agent/pkg/up9/main.go b/agent/pkg/up9/main.go index 49739bbac..225d3f60d 100644 --- a/agent/pkg/up9/main.go +++ b/agent/pkg/up9/main.go @@ -112,14 +112,14 @@ func GetAnalyzeInfo() *shared.AnalyzeStatus { } func SyncEntries(syncEntriesConfig *shared.SyncEntriesConfig) error { - logger.Log.Infof("Sync entries - started\n") + logger.Log.Infof("Sync entries - started") var ( token, model string guestMode bool ) if syncEntriesConfig.Token == "" { - logger.Log.Infof("Sync entries - creating anonymous token. env %s\n", syncEntriesConfig.Env) + logger.Log.Infof("Sync entries - creating anonymous token. env %s", syncEntriesConfig.Env) guestToken, err := createAnonymousToken(syncEntriesConfig.Env) if err != nil { return fmt.Errorf("failed creating anonymous token, err: %v", err) @@ -133,7 +133,7 @@ func SyncEntries(syncEntriesConfig *shared.SyncEntriesConfig) error { model = syncEntriesConfig.Workspace guestMode = false - logger.Log.Infof("Sync entries - upserting model. env %s, model %s\n", syncEntriesConfig.Env, model) + logger.Log.Infof("Sync entries - upserting model. env %s, model %s", syncEntriesConfig.Env, model) if err := upsertModel(token, model, syncEntriesConfig.Env); err != nil { return fmt.Errorf("failed upserting model, err: %v", err) } @@ -144,7 +144,7 @@ func SyncEntries(syncEntriesConfig *shared.SyncEntriesConfig) error { return fmt.Errorf("invalid model name, model name: %s", model) } - logger.Log.Infof("Sync entries - syncing. token: %s, model: %s, guest mode: %v\n", token, model, guestMode) + logger.Log.Infof("Sync entries - syncing. token: %s, model: %s, guest mode: %v", token, model, guestMode) go syncEntriesImpl(token, model, syncEntriesConfig.Env, syncEntriesConfig.UploadIntervalSec, guestMode) return nil @@ -209,7 +209,7 @@ func syncEntriesImpl(token string, model string, envPrefix string, uploadInterva // "http or grpc" filter indicates that we're only interested in HTTP and gRPC entries query := "http or grpc" - logger.Log.Infof("Getting entries from the database\n") + logger.Log.Infof("Getting entries from the database") var connection *basenine.Connection var err error diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index d027c87e5..7a31525a3 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -282,7 +282,7 @@ func createMizuResources(ctx context.Context, cancel context.CancelFunc, kuberne } if err := createMizuConfigmap(ctx, kubernetesProvider, serializedValidationRules, serializedContract, serializedMizuConfig); err != nil { - logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Failed to create resources required for policy validation. Mizu will not validate policy rules. error: %v\n", errormessage.FormatError(err))) + logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Failed to create resources required for policy validation. Mizu will not validate policy rules. error: %v", errormessage.FormatError(err))) } var err error @@ -441,7 +441,7 @@ func dumpLogsIfNeeded(ctx context.Context, kubernetesProvider *kubernetes.Provid } func cleanUpMizuResources(ctx context.Context, cancel context.CancelFunc, kubernetesProvider *kubernetes.Provider) { - logger.Log.Infof("\nRemoving mizu resources\n") + logger.Log.Infof("\nRemoving mizu resources") var leftoverResources []string @@ -626,7 +626,7 @@ func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provi break } - logger.Log.Infof("Mizu is available at %s\n", url) + logger.Log.Infof("Mizu is available at %s", url) if !config.Config.HeadlessMode { uiUtils.OpenBrowser(url) } diff --git a/cli/cmd/viewRunner.go b/cli/cmd/viewRunner.go index d6904ea05..c9c056be1 100644 --- a/cli/cmd/viewRunner.go +++ b/cli/cmd/viewRunner.go @@ -56,7 +56,7 @@ func runMizuView() { return } - logger.Log.Infof("Mizu is available at %s\n", url) + logger.Log.Infof("Mizu is available at %s", url) if !config.Config.HeadlessMode { uiUtils.OpenBrowser(url) diff --git a/cli/mizu/fsUtils/mizuLogsUtils.go b/cli/mizu/fsUtils/mizuLogsUtils.go index 38295db9d..fe79936cc 100644 --- a/cli/mizu/fsUtils/mizuLogsUtils.go +++ b/cli/mizu/fsUtils/mizuLogsUtils.go @@ -78,6 +78,6 @@ func DumpLogs(ctx context.Context, provider *kubernetes.Provider, filePath strin logger.Log.Debugf("Successfully added file %s", GetLogFilePath()) } - logger.Log.Infof("You can find the zip file with all logs in %s\n", filePath) + logger.Log.Infof("You can find the zip file with all logs in %s", filePath) return nil } diff --git a/shared/logger/logger.go b/shared/logger/logger.go index 7f515f129..56742122c 100644 --- a/shared/logger/logger.go +++ b/shared/logger/logger.go @@ -9,7 +9,7 @@ import ( var Log = logging.MustGetLogger("mizu") var format = logging.MustStringFormatter( - `%{time} %{level:.5s} â–¶ %{message} â–¶ %{pid} %{shortfile} %{shortfunc}`, + `%{time:2006-01-02T15:04:05.999Z-07:00} %{level:-5s} â–¶ %{message} â–¶ %{pid} %{shortfile} %{shortfunc}`, ) func InitLogger(logPath string) { diff --git a/shared/models.go b/shared/models.go index 5bd99d9c0..c0adfc117 100644 --- a/shared/models.go +++ b/shared/models.go @@ -2,9 +2,9 @@ package shared import ( "github.com/op/go-logging" + "github.com/up9inc/mizu/shared/logger" "github.com/up9inc/mizu/tap/api" "io/ioutil" - "log" "strings" "gopkg.in/yaml.v3" @@ -141,14 +141,12 @@ func (r *RulePolicy) validateType() bool { permitedTypes := []string{"json", "header", "slo"} _, found := Find(permitedTypes, r.Type) if !found { - log.Printf("Error: %s. ", r.Name) - log.Printf("Only json, header and slo types are supported on rule definition. This rule will be ignored\n") + logger.Log.Errorf("Only json, header and slo types are supported on rule definition. This rule will be ignored. rule name: %s", r.Name) found = false } if strings.ToLower(r.Type) == "slo" { if r.ResponseTime <= 0 { - log.Printf("Error: %s. ", r.Name) - log.Printf("When type=slo, the field response-time should be specified and have a value >= 1\n\n") + logger.Log.Errorf("When rule type is slo, the field response-time should be specified and have a value >= 1. rule name: %s", r.Name) found = false } } diff --git a/tap/api/api.go b/tap/api/api.go index 3d1d552ef..fd543ab0f 100644 --- a/tap/api/api.go +++ b/tap/api/api.go @@ -287,7 +287,7 @@ func (h HTTPPayload) MarshalJSON() ([]byte, error) { RawResponse: &HTTPResponseWrapper{Response: h.Data.(*http.Response)}, }) default: - panic(fmt.Sprintf("HTTP payload cannot be marshaled: %s\n", h.Type)) + panic(fmt.Sprintf("HTTP payload cannot be marshaled: %s", h.Type)) } } diff --git a/tap/diagnose/diagnose.go b/tap/diagnose/diagnose.go index 2c64a3b35..f40fd5e27 100644 --- a/tap/diagnose/diagnose.go +++ b/tap/diagnose/diagnose.go @@ -39,7 +39,7 @@ func StartMemoryProfiler(envDumpPath string, envTimeInterval string) { filename := fmt.Sprintf("%s/%s__mem.prof", dumpPath, t.Format("15_04_05")) - logger.Log.Infof("Writing memory profile to %s\n", filename) + logger.Log.Infof("Writing memory profile to %s", filename) f, err := os.Create(filename) if err != nil { diff --git a/tap/extensions/amqp/main.go b/tap/extensions/amqp/main.go index dc2bbf9bc..c9d61bbb8 100644 --- a/tap/extensions/amqp/main.go +++ b/tap/extensions/amqp/main.go @@ -37,7 +37,7 @@ func (d dissecting) Register(extension *api.Extension) { } func (d dissecting) Ping() { - log.Printf("pong %s\n", protocol.Name) + log.Printf("pong %s", protocol.Name) } const amqpRequest string = "amqp_request" @@ -218,7 +218,7 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co } default: - // log.Printf("unexpected frame: %+v\n", f) + // log.Printf("unexpected frame: %+v", f) } } } diff --git a/tap/extensions/http/main.go b/tap/extensions/http/main.go index 28ca4a987..ff1d9c32a 100644 --- a/tap/extensions/http/main.go +++ b/tap/extensions/http/main.go @@ -58,7 +58,7 @@ func (d dissecting) Register(extension *api.Extension) { } func (d dissecting) Ping() { - log.Printf("pong %s\n", protocol.Name) + log.Printf("pong %s", protocol.Name) } func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, counterPair *api.CounterPair, superTimer *api.SuperTimer, superIdentifier *api.SuperIdentifier, emitter api.Emitter, options *api.TrafficFilteringOptions) error { diff --git a/tap/extensions/kafka/main.go b/tap/extensions/kafka/main.go index 1951a1b39..fe7f88f7c 100644 --- a/tap/extensions/kafka/main.go +++ b/tap/extensions/kafka/main.go @@ -37,7 +37,7 @@ func (d dissecting) Register(extension *api.Extension) { } func (d dissecting) Ping() { - log.Printf("pong %s\n", _protocol.Name) + log.Printf("pong %s", _protocol.Name) } func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, counterPair *api.CounterPair, superTimer *api.SuperTimer, superIdentifier *api.SuperIdentifier, emitter api.Emitter, options *api.TrafficFilteringOptions) error { diff --git a/tap/extensions/redis/main.go b/tap/extensions/redis/main.go index 3a16132e2..b999fa96d 100644 --- a/tap/extensions/redis/main.go +++ b/tap/extensions/redis/main.go @@ -36,7 +36,7 @@ func (d dissecting) Register(extension *api.Extension) { } func (d dissecting) Ping() { - log.Printf("pong %s\n", protocol.Name) + log.Printf("pong %s", protocol.Name) } func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, counterPair *api.CounterPair, superTimer *api.SuperTimer, superIdentifier *api.SuperIdentifier, emitter api.Emitter, options *api.TrafficFilteringOptions) error { diff --git a/tap/extensions/redis/read.go b/tap/extensions/redis/read.go index 2732970a1..f93fa5a7e 100644 --- a/tap/extensions/redis/read.go +++ b/tap/extensions/redis/read.go @@ -313,7 +313,7 @@ func (p *RedisProtocol) Read() (packet *RedisPacket, err error) { packet.Value = fmt.Sprintf("%s]", packet.Value) } default: - msg := fmt.Sprintf("Unrecognized element in Redis array: %v\n", reflect.TypeOf(array[0])) + msg := fmt.Sprintf("Unrecognized element in Redis array: %v", reflect.TypeOf(array[0])) err = errors.New(msg) return } @@ -333,7 +333,7 @@ func (p *RedisProtocol) Read() (packet *RedisPacket, err error) { case int64: packet.Value = fmt.Sprintf("%d", x.(int64)) default: - msg := fmt.Sprintf("Unrecognized Redis data type: %v\n", reflect.TypeOf(x)) + msg := fmt.Sprintf("Unrecognized Redis data type: %v", reflect.TypeOf(x)) err = errors.New(msg) return } diff --git a/tap/passive_tapper.go b/tap/passive_tapper.go index 77056380c..d1230d50e 100644 --- a/tap/passive_tapper.go +++ b/tap/passive_tapper.go @@ -193,7 +193,7 @@ func startPassiveTapper(outputItems chan *api.OutputChannelItem) { } if err := diagnose.DumpMemoryProfile(*memprofile); err != nil { - logger.Log.Errorf("Error dumping memory profile %v\n", err) + logger.Log.Errorf("Error dumping memory profile %v", err) } assembler.waitAndDump() diff --git a/tap/tcp_assembler.go b/tap/tcp_assembler.go index 4dd05b095..78943ab77 100644 --- a/tap/tcp_assembler.go +++ b/tap/tcp_assembler.go @@ -78,7 +78,7 @@ func (a *tcpAssembler) processPackets(dumpPacket bool, packets <-chan source.Tcp if *checksum { err := tcp.SetNetworkLayerForChecksum(packet.NetworkLayer()) if err != nil { - logger.Log.Fatalf("Failed to set network layer for checksum: %s\n", err) + logger.Log.Fatalf("Failed to set network layer for checksum: %s", err) } } c := context{ diff --git a/tap/tcp_reader.go b/tap/tcp_reader.go index fff0a5a4e..8be3065b2 100644 --- a/tap/tcp_reader.go +++ b/tap/tcp_reader.go @@ -66,7 +66,7 @@ func (h *tcpReader) Read(p []byte) (int, error) { clientHello := tlsx.ClientHello{} err := clientHello.Unmarshall(msg.bytes) if err == nil { - logger.Log.Debugf("Detected TLS client hello with SNI %s\n", clientHello.SNI) + logger.Log.Debugf("Detected TLS client hello with SNI %s", clientHello.SNI) // TODO: Throws `panic: runtime error: invalid memory address or nil pointer dereference` error. // numericPort, _ := strconv.Atoi(h.tcpID.DstPort) // h.outboundLinkWriter.WriteOutboundLink(h.tcpID.SrcIP, h.tcpID.DstIP, numericPort, clientHello.SNI, TLSProtocol) diff --git a/tap/tcp_streams_map.go b/tap/tcp_streams_map.go index 2ea55be8e..7e4489dd7 100644 --- a/tap/tcp_streams_map.go +++ b/tap/tcp_streams_map.go @@ -46,7 +46,7 @@ func (streamMap *tcpStreamMap) closeTimedoutTcpStreamChannels() { if !stream.isClosed && time.Now().After(streamWrapper.createdAt.Add(tcpStreamChannelTimeout)) { stream.Close() diagnose.AppStats.IncDroppedTcpStreams() - logger.Log.Debugf("Dropped an unidentified TCP stream because of timeout. Total dropped: %d Total Goroutines: %d Timeout (ms): %d\n", + logger.Log.Debugf("Dropped an unidentified TCP stream because of timeout. Total dropped: %d Total Goroutines: %d Timeout (ms): %d", diagnose.AppStats.DroppedTcpStreams, runtime.NumGoroutine(), tcpStreamChannelTimeout/1000000) } } else { diff --git a/tap/tester/tester.go b/tap/tester/tester.go index d42d0dbd8..0ae1e9486 100644 --- a/tap/tester/tester.go +++ b/tap/tester/tester.go @@ -33,7 +33,7 @@ func loadExtensions() ([]*tapApi.Extension, error) { continue } - logger.Log.Infof("Loading extension: %s\n", filename) + logger.Log.Infof("Loading extension: %s", filename) extension := &tapApi.Extension{ Path: path.Join(extensionsDir, filename), @@ -55,7 +55,7 @@ func loadExtensions() ([]*tapApi.Extension, error) { dissector, ok := symDissector.(tapApi.Dissector) if !ok { - return nil, errors.Errorf("Symbol Dissector type error: %v %T\n", file, symDissector) + return nil, errors.Errorf("Symbol Dissector type error: %v %T", file, symDissector) } dissector.Register(extension) @@ -68,7 +68,7 @@ func loadExtensions() ([]*tapApi.Extension, error) { }) for _, extension := range extensions { - logger.Log.Infof("Extension Properties: %+v\n", extension) + logger.Log.Infof("Extension Properties: %+v", extension) } return extensions, nil @@ -92,7 +92,7 @@ func internalRun() error { tap.StartPassiveTapper(&opts, outputItems, extenssions, &tapOpts) - logger.Log.Infof("Tapping, press enter to exit...\n") + logger.Log.Infof("Tapping, press enter to exit...") reader := bufio.NewReader(os.Stdin) reader.ReadLine() return nil @@ -104,9 +104,9 @@ func main() { if err != nil { switch err := err.(type) { case *errors.Error: - logger.Log.Errorf("Error: %v\n", err.ErrorStack()) + logger.Log.Errorf("Error: %v", err.ErrorStack()) default: - logger.Log.Errorf("Error: %v\n", err) + logger.Log.Errorf("Error: %v", err) } os.Exit(1) From 89836d8d7547b605c1197b01c8149ce2416d257f Mon Sep 17 00:00:00 2001 From: RamiBerm <54766858+RamiBerm@users.noreply.github.com> Date: Tue, 16 Nov 2021 15:44:27 +0200 Subject: [PATCH 26/93] TRA-3903 better health endpoint for daemon mode (#471) * Update main.go, status_controller.go, and 2 more files... * Update status_controller.go and mizuTapperSyncer.go --- agent/main.go | 3 +- agent/pkg/controllers/status_controller.go | 9 ++++++ agent/pkg/providers/status_provider.go | 2 +- shared/kubernetes/mizuTapperSyncer.go | 32 ++++++++++++---------- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/agent/main.go b/agent/main.go index e7196a211..fbe5ab677 100644 --- a/agent/main.go +++ b/agent/main.go @@ -459,7 +459,7 @@ func startMizuTapperSyncer(ctx context.Context) (*kubernetes.MizuTapperSyncer, e return } logger.Log.Fatalf("fatal tap syncer error: %v", syncerErr) - case _, ok := <-tapperSyncer.TapPodChangesOut: + case tapPodChangeEvent, ok := <-tapperSyncer.TapPodChangesOut: if !ok { logger.Log.Debug("mizuTapperSyncer pod changes channel closed, ending listener loop") return @@ -472,6 +472,7 @@ func startMizuTapperSyncer(ctx context.Context) (*kubernetes.MizuTapperSyncer, e } api.BroadcastToBrowserClients(serializedTapStatus) providers.TapStatus.Pods = tapStatus.Pods + providers.ExpectedTapperAmount = tapPodChangeEvent.ExpectedTapperAmount case <-ctx.Done(): logger.Log.Debug("mizuTapperSyncer event listener loop exiting due to context done") return diff --git a/agent/pkg/controllers/status_controller.go b/agent/pkg/controllers/status_controller.go index 6cd4deeff..305033ace 100644 --- a/agent/pkg/controllers/status_controller.go +++ b/agent/pkg/controllers/status_controller.go @@ -2,7 +2,9 @@ package controllers import ( "encoding/json" + "fmt" "mizuserver/pkg/api" + "mizuserver/pkg/config" "mizuserver/pkg/holder" "mizuserver/pkg/providers" "mizuserver/pkg/up9" @@ -15,6 +17,13 @@ import ( ) func HealthCheck(c *gin.Context) { + if config.Config.DaemonMode { + if providers.ExpectedTapperAmount != providers.TappersCount { + c.JSON(http.StatusInternalServerError, fmt.Sprintf("expecting more tappers than are actually connected (%d expected, %d connected)", providers.ExpectedTapperAmount, providers.TappersCount)) + return + } + } + response := shared.HealthResponse{ TapStatus: providers.TapStatus, TappersCount: providers.TappersCount, diff --git a/agent/pkg/providers/status_provider.go b/agent/pkg/providers/status_provider.go index 15928b9bf..bcc4c3f6e 100644 --- a/agent/pkg/providers/status_provider.go +++ b/agent/pkg/providers/status_provider.go @@ -19,7 +19,7 @@ var ( TapStatus shared.TapStatus authStatus *models.AuthStatus RecentTLSLinks = cache.New(tlsLinkRetainmentTime, tlsLinkRetainmentTime) - + ExpectedTapperAmount = -1 //only relevant in daemon mode as cli manages tappers otherwise tappersCountLock = sync.Mutex{} ) diff --git a/shared/kubernetes/mizuTapperSyncer.go b/shared/kubernetes/mizuTapperSyncer.go index 1d67e98cd..1526eadbd 100644 --- a/shared/kubernetes/mizuTapperSyncer.go +++ b/shared/kubernetes/mizuTapperSyncer.go @@ -16,18 +16,20 @@ import ( const updateTappersDelay = 5 * time.Second type TappedPodChangeEvent struct { - Added []core.Pod - Removed []core.Pod + Added []core.Pod + Removed []core.Pod + ExpectedTapperAmount int } // MizuTapperSyncer uses a k8s pod watch to update tapper daemonsets when targeted pods are removed or created type MizuTapperSyncer struct { - context context.Context - CurrentlyTappedPods []core.Pod - config TapperSyncerConfig - kubernetesProvider *Provider - TapPodChangesOut chan TappedPodChangeEvent - ErrorOut chan K8sTapManagerError + context context.Context + CurrentlyTappedPods []core.Pod + config TapperSyncerConfig + kubernetesProvider *Provider + TapPodChangesOut chan TappedPodChangeEvent + ErrorOut chan K8sTapManagerError + nodeToTappedPodIPMap map[string][]string } type TapperSyncerConfig struct { @@ -160,9 +162,11 @@ func (tapperSyncer *MizuTapperSyncer) updateCurrentlyTappedPods() (err error, ch } if len(addedPods) > 0 || len(removedPods) > 0 { tapperSyncer.CurrentlyTappedPods = podsToTap + tapperSyncer.nodeToTappedPodIPMap = GetNodeHostToTappedPodIpsMap(tapperSyncer.CurrentlyTappedPods) tapperSyncer.TapPodChangesOut <- TappedPodChangeEvent{ - Added: addedPods, - Removed: removedPods, + Added: addedPods, + Removed: removedPods, + ExpectedTapperAmount: len(tapperSyncer.nodeToTappedPodIPMap), } return nil, true } @@ -171,9 +175,7 @@ func (tapperSyncer *MizuTapperSyncer) updateCurrentlyTappedPods() (err error, ch } func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error { - nodeToTappedPodIPMap := GetNodeHostToTappedPodIpsMap(tapperSyncer.CurrentlyTappedPods) - - if len(nodeToTappedPodIPMap) > 0 { + if len(tapperSyncer.nodeToTappedPodIPMap) > 0 { var serviceAccountName string if tapperSyncer.config.MizuServiceAccountExists { serviceAccountName = ServiceAccountName @@ -188,7 +190,7 @@ func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error { tapperSyncer.config.AgentImage, TapperPodName, fmt.Sprintf("%s.%s.svc.cluster.local", ApiServerPodName, tapperSyncer.config.MizuResourcesNamespace), - nodeToTappedPodIPMap, + tapperSyncer.nodeToTappedPodIPMap, serviceAccountName, tapperSyncer.config.TapperResources, tapperSyncer.config.ImagePullPolicy, @@ -197,7 +199,7 @@ func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error { ); err != nil { return err } - logger.Log.Debugf("Successfully created %v tappers", len(nodeToTappedPodIPMap)) + logger.Log.Debugf("Successfully created %v tappers", len(tapperSyncer.nodeToTappedPodIPMap)) } else { if err := tapperSyncer.kubernetesProvider.RemoveDaemonSet(tapperSyncer.context, tapperSyncer.config.MizuResourcesNamespace, TapperDaemonSetName); err != nil { return err From 1c75ce314b93ad9267a3a6071fc19edc9e316d9e Mon Sep 17 00:00:00 2001 From: RoyUP9 <87927115+RoyUP9@users.noreply.github.com> Date: Tue, 16 Nov 2021 15:49:08 +0200 Subject: [PATCH 27/93] fixed redact acceptance test (#472) --- acceptanceTests/tap_test.go | 18 ++++++++++-------- acceptanceTests/testsUtils.go | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/acceptanceTests/tap_test.go b/acceptanceTests/tap_test.go index 08c6ac0d5..51b57a4ea 100644 --- a/acceptanceTests/tap_test.go +++ b/acceptanceTests/tap_test.go @@ -427,9 +427,10 @@ func TestTapRedact(t *testing.T) { } proxyUrl := getProxyUrl(defaultNamespaceName, defaultServiceName) + requestHeaders := map[string]string{"User-Header": "Mizu"} requestBody := map[string]string{"User": "Mizu"} for i := 0; i < defaultEntriesCount; i++ { - if _, requestErr := executeHttpPostRequest(fmt.Sprintf("%v/post", proxyUrl), requestBody); requestErr != nil { + if _, requestErr := executeHttpPostRequestWithHeaders(fmt.Sprintf("%v/post", proxyUrl), requestHeaders, requestBody); requestErr != nil { t.Errorf("failed to send proxy request, err: %v", requestErr) return } @@ -460,12 +461,12 @@ func TestTapRedact(t *testing.T) { headers := request["_headers"].([]interface{}) for _, headerInterface := range headers { header := headerInterface.(map[string]interface{}) - if header["name"].(string) != "User-Agent" { + if header["name"].(string) != "User-Header" { continue } - userAgent := header["value"].(string) - if userAgent != "[REDACTED]" { + userHeader := header["value"].(string) + if userHeader != "[REDACTED]" { return fmt.Errorf("unexpected result - user agent is not redacted") } } @@ -530,9 +531,10 @@ func TestTapNoRedact(t *testing.T) { } proxyUrl := getProxyUrl(defaultNamespaceName, defaultServiceName) + requestHeaders := map[string]string{"User-Header": "Mizu"} requestBody := map[string]string{"User": "Mizu"} for i := 0; i < defaultEntriesCount; i++ { - if _, requestErr := executeHttpPostRequest(fmt.Sprintf("%v/post", proxyUrl), requestBody); requestErr != nil { + if _, requestErr := executeHttpPostRequestWithHeaders(fmt.Sprintf("%v/post", proxyUrl), requestHeaders, requestBody); requestErr != nil { t.Errorf("failed to send proxy request, err: %v", requestErr) return } @@ -563,12 +565,12 @@ func TestTapNoRedact(t *testing.T) { headers := request["_headers"].([]interface{}) for _, headerInterface := range headers { header := headerInterface.(map[string]interface{}) - if header["name"].(string) != "User-Agent" { + if header["name"].(string) != "User-Header" { continue } - userAgent := header["value"].(string) - if userAgent == "[REDACTED]" { + userHeader := header["value"].(string) + if userHeader == "[REDACTED]" { return fmt.Errorf("unexpected result - user agent is redacted") } } diff --git a/acceptanceTests/testsUtils.go b/acceptanceTests/testsUtils.go index 98122dc18..79023e160 100644 --- a/acceptanceTests/testsUtils.go +++ b/acceptanceTests/testsUtils.go @@ -240,13 +240,24 @@ func executeHttpGetRequest(url string) (interface{}, error) { return executeHttpRequest(response, requestErr) } -func executeHttpPostRequest(url string, body interface{}) (interface{}, error) { +func executeHttpPostRequestWithHeaders(url string, headers map[string]string, body interface{}) (interface{}, error) { requestBody, jsonErr := json.Marshal(body) if jsonErr != nil { return nil, jsonErr } - response, requestErr := http.Post(url, "application/json", bytes.NewBuffer(requestBody)) + request, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(requestBody)) + if err != nil { + return nil, err + } + + request.Header.Add("Content-Type", "application/json") + for headerKey, headerValue := range headers { + request.Header.Add(headerKey, headerValue) + } + + client := &http.Client{} + response, requestErr := client.Do(request) return executeHttpRequest(response, requestErr) } From 7f265dc4c5b926c61845f9664757c3a6865ae8a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Tue, 16 Nov 2021 17:13:07 +0300 Subject: [PATCH 28/93] Return `404` instead of `500` if the entry could not be found and display a toast message (#464) --- agent/pkg/controllers/entries_controller.go | 15 +++++++++++++-- ui/src/components/TrafficPage.tsx | 10 ++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/agent/pkg/controllers/entries_controller.go b/agent/pkg/controllers/entries_controller.go index 8b900b23d..167904e48 100644 --- a/agent/pkg/controllers/entries_controller.go +++ b/agent/pkg/controllers/entries_controller.go @@ -25,7 +25,12 @@ func Error(c *gin.Context, err error) bool { if err != nil { logger.Log.Errorf("Error getting entry: %v", err) c.Error(err) - c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": true, "msg": err.Error()}) + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{ + "error": true, + "type": "error", + "autoClose": "5000", + "msg": err.Error(), + }) return true // signal that there was an error and the caller should return } return false // no error, can continue @@ -39,7 +44,13 @@ func GetEntry(c *gin.Context) { return // exit } err = json.Unmarshal(bytes, &entry) - if Error(c, err) { + if err != nil { + c.JSON(http.StatusNotFound, gin.H{ + "error": true, + "type": "error", + "autoClose": "5000", + "msg": string(bytes), + }) return // exit } diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index 51a33d372..804eea59a 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -189,6 +189,16 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const entryData = await api.getEntry(focusedEntryId); setSelectedEntryData(entryData); } catch (error) { + toast[error.response.data.type](`Entry[${focusedEntryId}]: ${error.response.data.msg}`, { + position: "bottom-right", + theme: "colored", + autoClose: error.response.data.autoClose, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + }); console.error(error); } })() From 51e0dd8ba9202316e5e9687d2c7c16c785ad2804 Mon Sep 17 00:00:00 2001 From: RamiBerm <54766858+RamiBerm@users.noreply.github.com> Date: Tue, 16 Nov 2021 17:11:47 +0200 Subject: [PATCH 29/93] TRA-3903 add flag to disable pvc creation for daemon mode (#474) * Update tapRunner.go and tapConfig.go * Update tapConfig.go * Revert "Update tapConfig.go" This reverts commit 5c7c02c4ab652a84878d2555426413ff25c8aa70. --- cli/cmd/tapRunner.go | 28 +++++++++-------- cli/config/configStructs/tapConfig.go | 45 ++++++++++++++++----------- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 7a31525a3..b66f11bbd 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -359,22 +359,24 @@ func createMizuApiServerPod(ctx context.Context, kubernetesProvider *kubernetes. } func createMizuApiServerDeployment(ctx context.Context, kubernetesProvider *kubernetes.Provider, opts *kubernetes.ApiServerOptions) error { - isDefaultStorageClassAvailable, err := kubernetesProvider.IsDefaultStorageProviderAvailable(ctx) volumeClaimCreated := false - if err != nil { - return err - } - if isDefaultStorageClassAvailable { - if _, err = kubernetesProvider.CreatePersistentVolumeClaim(ctx, config.Config.MizuResourcesNamespace, kubernetes.PersistentVolumeClaimName, config.Config.Tap.MaxEntriesDBSizeBytes()+mizu.DaemonModePersistentVolumeSizeBufferBytes); err != nil { - logger.Log.Warningf(uiUtils.Yellow, "An error has occured while creating a persistent volume claim for mizu, this will mean that mizu's data will be lost on pod restart") - logger.Log.Debugf("error creating persistent volume claim: %v", err) - } else { - volumeClaimCreated = true + if !config.Config.Tap.NoPersistentVolumeClaim { + isDefaultStorageClassAvailable, err := kubernetesProvider.IsDefaultStorageProviderAvailable(ctx) + if err != nil { + return err + } + if isDefaultStorageClassAvailable { + if _, err = kubernetesProvider.CreatePersistentVolumeClaim(ctx, config.Config.MizuResourcesNamespace, kubernetes.PersistentVolumeClaimName, config.Config.Tap.MaxEntriesDBSizeBytes()+mizu.DaemonModePersistentVolumeSizeBufferBytes); err != nil { + logger.Log.Warningf(uiUtils.Yellow, "An error has occured while creating a persistent volume claim for mizu, this will mean that mizu's data will be lost on pod restart") + logger.Log.Debugf("error creating persistent volume claim: %v", err) + } else { + volumeClaimCreated = true + } + } else { + logger.Log.Warningf(uiUtils.Yellow, "Could not find default volume provider in this cluster, this will mean that mizu's data will be lost on pod restart") } - } else { - logger.Log.Warningf(uiUtils.Yellow, "Could not find default volume provider in this cluster, this will mean that mizu's data will be lost on pod restart") - } + } pod, err := kubernetesProvider.GetMizuApiServerPodObject(opts, volumeClaimCreated, kubernetes.PersistentVolumeClaimName) if err != nil { return err diff --git a/cli/config/configStructs/tapConfig.go b/cli/config/configStructs/tapConfig.go index c48bdf85b..fcc29ce13 100644 --- a/cli/config/configStructs/tapConfig.go +++ b/cli/config/configStructs/tapConfig.go @@ -3,6 +3,8 @@ package configStructs import ( "errors" "fmt" + "github.com/up9inc/mizu/cli/uiUtils" + "github.com/up9inc/mizu/shared/logger" "regexp" "github.com/up9inc/mizu/shared" @@ -26,25 +28,26 @@ const ( ) type TapConfig struct { - UploadIntervalSec int `yaml:"upload-interval" default:"10"` - PodRegexStr string `yaml:"regex" default:".*"` - GuiPort uint16 `yaml:"gui-port" default:"8899"` - ProxyHost string `yaml:"proxy-host" default:"127.0.0.1"` - Namespaces []string `yaml:"namespaces"` - Analysis bool `yaml:"analysis" default:"false"` - AllNamespaces bool `yaml:"all-namespaces" default:"false"` - PlainTextFilterRegexes []string `yaml:"regex-masking"` - IgnoredUserAgents []string `yaml:"ignored-user-agents"` - DisableRedaction bool `yaml:"no-redact" default:"false"` - HumanMaxEntriesDBSize string `yaml:"max-entries-db-size" default:"200MB"` - DryRun bool `yaml:"dry-run" default:"false"` - Workspace string `yaml:"workspace"` - EnforcePolicyFile string `yaml:"traffic-validation-file"` - ContractFile string `yaml:"contract"` - AskUploadConfirmation bool `yaml:"ask-upload-confirmation" default:"true"` - ApiServerResources shared.Resources `yaml:"api-server-resources"` - TapperResources shared.Resources `yaml:"tapper-resources"` - DaemonMode bool `yaml:"daemon" default:"false"` + UploadIntervalSec int `yaml:"upload-interval" default:"10"` + PodRegexStr string `yaml:"regex" default:".*"` + GuiPort uint16 `yaml:"gui-port" default:"8899"` + ProxyHost string `yaml:"proxy-host" default:"127.0.0.1"` + Namespaces []string `yaml:"namespaces"` + Analysis bool `yaml:"analysis" default:"false"` + AllNamespaces bool `yaml:"all-namespaces" default:"false"` + PlainTextFilterRegexes []string `yaml:"regex-masking"` + IgnoredUserAgents []string `yaml:"ignored-user-agents"` + DisableRedaction bool `yaml:"no-redact" default:"false"` + HumanMaxEntriesDBSize string `yaml:"max-entries-db-size" default:"200MB"` + DryRun bool `yaml:"dry-run" default:"false"` + Workspace string `yaml:"workspace"` + EnforcePolicyFile string `yaml:"traffic-validation-file"` + ContractFile string `yaml:"contract"` + AskUploadConfirmation bool `yaml:"ask-upload-confirmation" default:"true"` + ApiServerResources shared.Resources `yaml:"api-server-resources"` + TapperResources shared.Resources `yaml:"tapper-resources"` + DaemonMode bool `yaml:"daemon" default:"false"` + NoPersistentVolumeClaim bool `yaml:"no-persistent-volume-claim" default:"false"` } func (config *TapConfig) PodRegex() *regexp.Regexp { @@ -79,5 +82,9 @@ func (config *TapConfig) Validate() error { return errors.New(fmt.Sprintf("Can't run with both --%s and --%s flags", AnalysisTapName, WorkspaceTapName)) } + if config.NoPersistentVolumeClaim && !config.DaemonMode { + logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("the --set tap.no-persistent-volume-claim=true flag has no effect without the --%s flag, the claim will not be created anyway.", DaemonModeTapName)) + } + return nil } From 36077a9985ad8c7b431d695f02a34de9d09577d7 Mon Sep 17 00:00:00 2001 From: RamiBerm <54766858+RamiBerm@users.noreply.github.com> Date: Tue, 16 Nov 2021 17:53:38 +0200 Subject: [PATCH 30/93] TRA-3903 - display targetted pods before waiting for all daemon resources to be created (#475) * WIP * Update tapRunner.go * Update tapRunner.go --- cli/cmd/tapRunner.go | 45 ++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index b66f11bbd..4fd9d09c7 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -119,6 +119,9 @@ func RunMizuTap() { logger.Log.Infof("Tapping pods in %s", namespacesStr) if config.Config.Tap.DryRun { + if err := printTappedPodsPreview(ctx, kubernetesProvider, targetNamespaces); err != nil { + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Error listing pods: %v", errormessage.FormatError(err))) + } return } @@ -134,7 +137,7 @@ func RunMizuTap() { return } if config.Config.Tap.DaemonMode { - if err := handleDaemonModePostCreation(cancel, kubernetesProvider); err != nil { + if err := handleDaemonModePostCreation(ctx, cancel, kubernetesProvider, targetNamespaces); err != nil { defer finishMizuExecution(kubernetesProvider, apiProvider) cancel() } else { @@ -156,28 +159,38 @@ func RunMizuTap() { } } -func handleDaemonModePostCreation(cancel context.CancelFunc, kubernetesProvider *kubernetes.Provider) error { +func handleDaemonModePostCreation(ctx context.Context, cancel context.CancelFunc, kubernetesProvider *kubernetes.Provider, namespaces []string) error { + if err := printTappedPodsPreview(ctx, kubernetesProvider, namespaces); err != nil { + return err + } + apiProvider := apiserver.NewProvider(GetApiServerUrl(), 90, 1*time.Second) if err := waitForDaemonModeToBeReady(cancel, kubernetesProvider, apiProvider); err != nil { return err } - if err := printDaemonModeTappedPods(apiProvider); err != nil { - return err - } return nil } -func printDaemonModeTappedPods(apiProvider *apiserver.Provider) error { - if healthStatus, err := apiProvider.GetHealthStatus(); err != nil { +/* +this function is a bit problematic as it might be detached from the actual pods the mizu api server will tap. +The alternative would be to wait for api server to be ready and then query it for the pods it listens to, this has +the arguably worse drawback of taking a relatively very long time before the user sees which pods are targeted, if any. +*/ +func printTappedPodsPreview(ctx context.Context, kubernetesProvider *kubernetes.Provider, namespaces []string) error { + if matchingPods, err := kubernetesProvider.ListAllRunningPodsMatchingRegex(ctx, config.Config.Tap.PodRegex(), namespaces); err != nil { return err } else { - for _, tappedPod := range healthStatus.TapStatus.Pods { + if len(matchingPods) == 0 { + printNoPodsFoundSuggestion(namespaces) + } + logger.Log.Info("Pods that match regex at this instant:") + for _, tappedPod := range matchingPods { logger.Log.Infof(uiUtils.Green, fmt.Sprintf("+%s", tappedPod.Name)) } + return nil } - return nil } func waitForDaemonModeToBeReady(cancel context.CancelFunc, kubernetesProvider *kubernetes.Provider, apiProvider *apiserver.Provider) error { @@ -215,11 +228,7 @@ func startTapperSyncer(ctx context.Context, cancel context.CancelFunc, provider } if len(tapperSyncer.CurrentlyTappedPods) == 0 { - var suggestionStr string - if !shared.Contains(targetNamespaces, kubernetes.K8sAllNamespaces) { - suggestionStr = ". Select a different namespace with -n or tap all namespaces with -A" - } - logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Did not find any pods matching the regex argument%s", suggestionStr)) + printNoPodsFoundSuggestion(targetNamespaces) } go func() { @@ -252,6 +261,14 @@ func startTapperSyncer(ctx context.Context, cancel context.CancelFunc, provider return nil } +func printNoPodsFoundSuggestion(targetNamespaces []string) { + var suggestionStr string + if !shared.Contains(targetNamespaces, kubernetes.K8sAllNamespaces) { + suggestionStr = ". You can also try selecting a different namespace with -n or tap all namespaces with -A" + } + logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Did not find any currently running pods that match the regex argument, mizu will automatically tap matching pods if any are created later%s", suggestionStr)) +} + func getErrorDisplayTextForK8sTapManagerError(err kubernetes.K8sTapManagerError) string { switch err.TapManagerReason { case kubernetes.TapManagerPodListError: From 95d2a868e13c01d9a9b5da8026c3c8fc5f12a69a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Tue, 16 Nov 2021 22:44:31 +0300 Subject: [PATCH 31/93] Update the UI screenshots (#476) * Update the UI screenshots * Update `mizu-ui.png` --- assets/mizu-ui.png | Bin 502777 -> 655204 bytes assets/validation-example1.png | Bin 56018 -> 112753 bytes assets/validation-example2.png | Bin 44017 -> 53998 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/mizu-ui.png b/assets/mizu-ui.png index 29a1d17ba667729b4e34502c7f56778bb7cbc2da..0a27efaceeb8c499ef96071d18b54df181632239 100644 GIT binary patch literal 655204 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≥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%0Abzj@==r#aF}`IXH=TM{B-}t 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�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

14v^DB1gjm=4 z?%723%uG+~6z=mRw^5{qn2!wr*&=m@{(S$f7w#|ryf}Sa1@b(K?%l~S2&sCW#s*Y| zvN^2RUL{K{kk8f2EMK|&dp)Bl_@nUUx>%c%fV3Go#oO^wz<^31Og!`Rmh(<#=Ioc=tC6iT?$ZBU z!`HvAq2^I|7hFSNwIO?4lJ|Mx%%jlf^-{9Q)qn2y!wh!^pMo3#8@6^KSHZh4zZN

@ZdPHEjOKNfEs-?jvyj&$4;=aFRn#P*qk|AUW9@ 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⁡zp zf1m$TlB*!D-5%U?34a;muRF{A==+O;V-+V|^apoMjuo7|<+$u3Cx{1J!>_i!N|Vh2 zAzc1Zm<>U#q;F~8ur#|Cd;T28KR;CqR>&~Pe|B{_u-ID&&ENw zoLRN(M}4_a;=_S67uW7eOc40)%_Utr-5JSe7wunS8~?cD*Dm?y*C$=mqG~rA1&BiE z6`MK>LBLEjP)2cgi`=jkaj9NL5?c!xCz4ot8{>uuAiV4Xr zp`oEC7){Eab8nRaqZ1%h)2Mpr z%%;x@R6C8~{xuG>j$=kf3m0d0e)_rLG03OyKkeR|aCO<+D#Tpon zEAWi>jmTn9`}BYO@wJf}6f^K2G`>n`m|Qd-h_1RfE_SY7Ds+Q+a-kV$IdlD37trjs zXc%)7*QIzK#oss+<1A)u%|XRmL0Xvvtl|<*BlzD31;zvSVZlcP7n@RgQddPa1p$}7 z(v`&S@N4q12YIxJ*g|CB9B}Nggc~m9^3PdJN6KmkdyMW|uU=o^N}~gYtr{4;h^8)!wp1~u1{mTFw7nSIa z17dEy-2LGa8Y=<)7BNb78BwLDNJw(aFj=n0Po5!v#&s0bEPvl=nrV-Se_vpX3x#s| zo3(Yc7SGP1;DuYT(mKhCPOU;I5?SxyEK-Ig~hzG#yZ2 z90^FTNhGWXtO2axfmxg$L5S1+2OZe zePKO1{TCNt(^hqF$c)3NGw}60?^ihrrw8**o0nBf?;Z^089plRoPy%{2fuW=gp`B~ zsoqkX=3eJjR}n-$W+6Czjd4=^UCyP;`>j7upvJf_6CbiVGF@tttIYhwvZPcv1!WHF zrNci+C^?)BN7zfXbvpw^TS7V6UtX_z)R&^#)%GNyFapnf zrj4pPCP(Sr1dk)S8C5^gzvu%7w z18IEys|;(N=Clt7+e`7%^`yz_g`;R*&%iuo%O&ijO>pNSUhiQ=I4`G>^c|G2p-gI9 z=WTImjw^>@OV#r7B7%tOTQ=3Yqj)rr&JVw5b##IlFVqXv1vaG#PsgEeVXS? zk&b(O8cfDmjep58^Nnc|uov4Zdje%`?NNMEK@75^Uc5s?LtXg`o@uJ(?}0)*g3R?S zs{)UC4`a8xM>{w(rqP~56OwCE&jl?s_1*N+h!1H#ik5PJ7@UWqx&I)^4^$~-49*m(#1pU3|Ar@y#@SuqB$4 zvFgEo_b{EH!H?DR;8*%`t}22Q#{}xKRQfz8a;N7mB+T}YyPU;t`0qv22if2>TS#{= z-g&&5uDm%n5b^8D$Cq*X7J`f2?_y(PwHJaqC-CGl_oGVk4VCA!Y+IG4+oB&;@H;?z z=UjjYf2vfBEmkUA(Bvuwi>k(K*4O)>cqM2$Q6~fjiE1SuZm z%7rFc2N_hs!Y$1x4yj@Dz4c4I>5AUz>30`;GxeIeP=k3UH9+qGE->|jruAa$ur(o{ zB#_MsoWY@)Ko%XzEJVaf&FT|x`WYi2sqaWz-)iZ@rrTs;kS|16! zar+CI!zDHWhbM`UN{#K($P@42yR8SV_c8?wUe}&^_^8I*ZbzfJAl(>~A5{nKYEZu0 z{N5F#Sht@)jeql`OH1Ea7s02Z5*>UEsLh>@2`eD@blW?%;^J=!)})Y#JIEtv_IAlI2yh_c{dvA-nq_>`(URJ!R0Fi6-I9Rjhb6=J-XDu2{A=I+tB6y>=VK)ZV6H4dGNKOusT6tE(9BTrYdJg{XQI$l6` ze;X)mCsa?zK}Uw@w26^c4X`@*wj(s5u1jpuFWkj7P%a7u_sC;0p-AY{@W!_WiC!T7GRje3!hz<5i*&V0UDHWYj{r>pBeK?0m{E! zXwQd;f>|SEc~AbVs6pxNzGWO28rJhCS{F-_bK{O8@RNBJCf;-9?!<5o9&{+XgZN);}bkj=MQ==LcuC5Bo%IsGA#2G55 z#quz%BUDZx`whe_5e(J^Ka|ztSgKs+vFkuc_oEu6W8&~JdrzXXp7$NNE$dq$>PUp^ zzkI$cVFFuz;B)QX7g|Y-?&R#}#%YI%Ivb@z<3?x^+1-!GRLs)(dxl9M##gSH85)jQij!Dg>u_%esO|P=~_B>r(*& zv^T2xCqRm+PP+?4Wr1PlCgofK(dMtA6|~l3kwsB)DgKK*{qt5hwNh#vvF=$=!&V99 zA9cV>#>C>|@fEH}SP0tAE$z<3_uikdEGx4-Tv*_|t%L8}olgmw#8h)T8m}ebzC< zI#?lk7JgT#vOyDrzny}vZq5oI-**~ljC16|On{(gz(&j=y+m!S= z?3ME_wluRW-FE390~s$g>0Amg=M-00MBy^x&(oucH1G(MP`-DZlf;yS$geia)+B_5Jy+{a;>4z!tx%; zukz23(LS#n9OP$aL}3rRGnJvurvDlC*dB<|{edB+tV;<>O;(F9ndSzXzequ1gS4@;Aw$g8u&gTet)rts0Dof6igj)af_EAkp-s!r38= z-7EvLP?_|H@$Y>>L+jYqe4n@j?ue*(W0Ds7L=+U26$iOFryz$$?)u&t|F#ZLN!IRo z{qYh@Tf@EhyF*q}Z937KxGP5ifq{8LU4uuM=|cOC*PTgH?Tf{^jgdU;c(SRo@rH-Q zds6KB4H_A$<#j+N{jT)=jH#*OeU#ui`9db7tq2%0m1T~#Nsk0;^*PvHZ+hJlvcj`l z3DujhvvlPc`*AP+CLmov;Wx!p9I5Q#FP=ITD-+fkJaB}0%UfDp8i0P_dhA%ih6TE! zgdS>z4v!#BtNkS9$!hrHj-hO(Ffgs?l{2mZ5A>_`09*gS!0lb^&L#&T?M&l>QQCns0-4dj2pSX^Xs*RLMh=E z$U#5J*cG0+#2^O(Pj7B}lXu07*bNVlNZZ8hGC@Z`5_}wh4y`%qmO)KSN=2U_*MN%n zbJ-CZ!GqrK@_m-L7zk3YawN9{odtRpB);UPByARfUz&ix?C=Q@lZkYm!b`)x-WH=(nKExR+;HnVJb4Ds{NCy@JZRQ(vc5aRS}0<^ zdKbWzggZ1+Qc{Amo5CrXeSv{N7e(rcyHmDi!;9cd*%AuNoAP~=OtUWTgC8`zxq1i?HS8qYgFd{396%-Mf7{3M4%ah}F zQNI`I4(0XhP@iQS88f-Dsi^Uh-d4b3{?OP_%fOTg=YO0Et>limOd1q3Ownb_`x#awNR{1XX6fju`F z$L*@|ik#=zfS4zfp~52^PC!EW3D{*JoudnV>G4wSqW}P}&!D{BJqQFgLVd2VE9t%> zEV5ak)su?(>gXE|2-JC?143IA=&r>&=Fdk8xV--~^hbLSishkU6Cd>VsqvIE;S1mi z%fEr|obd47TlXC}Rrx21`27P5Ah(GQKRipr`zA9+{mq7zc~;V^1hMwC!YEb8vW=-) z;Bc<4nzzM}p12+%QgFgUYPvn59%=B5wW9k-em7iO4L%o$xrBJ%oNnB~YO3AqxJTbc z+ETS$YP%d~*u!8Z5kGkXJn!$F zKc=aebH3+X=Q`K=`Rt9M+CdTcJBc6(&ar?G_d5qdw}wW>fm=}6K2mCsVFwkdKK9p9 zpby^&29zF?d<8YkG462~c2fW99~v6AvF=$t&UaT`-JsE)0mN4ic2~7_!e%Odb*y%R zIHt``5jG}994iXK-e}xx{NWMyo8S)K4C=b(A_HQGXXAUmWFwWW%{?%*T%17flm7_qLgy;S*epXSl`}uo{X7< z@a2n;rtl_>c}XwQoo<11N9h0Y z0*`|Iz;liByBl-pD{#Hf-n=Q~FP8$Cn6wUbv!vLN@2$31M&duQDt}KCyikGbvDs~q zmviV!A^^roV!?wFg;Wu%4<6K}(_FSz+22Gd0aqyIGKXPSP#Gug()L~5jqNNk346Af z?n8KFFtF$hP`ARic6XK%?t4hF6-dg4$-uf)0#%uh=MqQl{lKXZ)|s(Iit`!h@uftII#Sc0QM+ zV8+HaTdJ)keWuSDdk_*sfV$oM-pfZ0HpuZ-0~^J#H27<*C&P8DF0v9vQUjTqMRcWP zZKINW;IA7{q*+{Kqw*{K(9DE!&%;{#Ym$K9tb+1EY9ci|+h&8D%=<${QBe^%DC%oj zVU8nt!lmw}1^T)4uh?ZZ#d5eJ%t_p6?o{~-c{xQPsq>rj+FzhNJV~9PBIw#9MNp}p zGGzrZ2!$NIiAX7VxOLzRsvGas`@6}5`bHBGYnu)}xYEwJMWP&^3-AM-PhYt*-k4D~G1!?c&Gv1(eO5^5=XF;#8{rB{k{CqyBh;?tr*=viFE7y!ko06b<|NbTDSyALAz?umi zZ8${Upt6Z=UKSB)ZiANE}Q{adWJ!+#$#WsaM8dK0lA-f!1a?d zL=TL)Up>EOm%3$JqKlH%sqpR8-(A7>rB}KnSbpw)BqkQnYXMwqb-jKT zkOBbG0&*=0;1KhyPLIP);T*E1KGWZ5N%X|)KJY-aci(}>8Z+E(@ZE#$?XotL zpf>$5;R9P$f~b&52HmmtOmqxNl<$e-vwh&`{>U;KMjt2GcfF4Rge6`}!`h4#vMj>5 z^xMb?u%pTGq)Q|R;V+1)p@wI zbK431b7oC<2tRZf47KY{Ztav$Y&!k_3k6v0`@T^z7_)qL1yR9w&E@pBUIos8kJrk| zpUrU5@>@KUC?pdwzQq$(wnR}5hP)kPvyp*aR`0$QEJnh zG>bYL+5A_taRUsKb1mpki5Hlnw#ckk6GnAIj5_@F*5LVRj7YXqsfG+ zARll#4i`HmwEybO!~yqRjaWUWc6YqBr$@1s%zS}EOCcI}pb5+J*D9JYNQCpJC4xpV zUExDS-&Y(mN7k*PcYle#;f`Rc_p{qAHU+)f<<4`ONA4kqZ8k|~sS5jETj1slf>yZBZG-FD;>dIT8(~fC z`z#`9mSyEt_UjQ($4}}um_?M7SZcbf@INT$u?{5$CDbeX1m@vY#Cd_WOC*lKR zxs1p4M;QMm66qA{_l)*fYZ&Ox;x+PvvGgG{jQjRS`<(kQ`N(e@%p0IyP=#ORdWgSn z3X&k+Tm?c_Vz9|0z;^h%FfqTtpqdfXd$)nEMho53kEk;heWn{|dRJH1i~B2LlVNKU z>Zqe${>P^PGm0U_Go`z=T|VZHidUAKjP!Zq2N?Wvy*@`VbolYv=f+>Hx>_T!gu-2am$) zuCUM7k__`1Hu1=3&kplj${{-+x1ueDFp(Y;nn}ZBW9jxi8IoaRpwF$Q7XYX`_Lto% zk7Uso@F8(yRaI5bxq|5YG0WQ9pqta`o}$OTOCs+A%B{XCRF)J1HjCmH4ieQz=f7@6 zufWqO6|rz_5!%4sJh1H1@ zTYFY_9eyWg8nQuN>D!LWNDz`7qOmFp+(vLlX7($WI_Ez-&v_&XSf*!h2p)f!rFiX{ zfgkcB8w+t@l^Grl+9(cz?}>!RAoJUKz^Sl~j)(rpafmk@BHMK@<8R+{oT;h}-58LJ z4`T~UH{;{#C9L66XC5CqLVjC-jPu9&8xJoxOJ2C?>UtX2n{`b=A>Fn$mRHVyh7eOs zaH0jF3s5tW3Bvw-Kj9dRBE_tJcR`-){D#QBzWwF&OOWyv9YFCffoF8x!D@d}98lpt=QUerg^sj9Hq1`T8JC>BUS0F#AfA|uHfm4N5)>M-%CRQ9P4@Z2C4a5h-F>&yz7fJIT$=#g+9aq*arp2R>4! zPSXS~(@P{A{MaHu`HMlAvo?4K^L8l;sB~ajd3~O(0Ai+NU)S%P3FtN!rnxBXEd{Kz z?4UT-Lib4EQ%o-`bO0mfoGbP5Y}*CaGa%&9>;Qj9)mxjL)dI22lME-XfM{B`;PvbC zwVS>^0r@wxpMkskDe(T8K{PEyCXQ7oxRlbp{Jv8{a9=fFC+q%~6%AwKM^YE5Lpz&1 zCbFq_j*5BXdS3xZO2vTX`(^TILve7v|f1O6dD$Pm3x_iS{s829wNkl~v; z2K>=7<;xM|gI&-a*#`0jH0z*T|4qDZ>{fTWu%J34cb;?dq1SbaRe(^ybh`zZ674_4 zBY$TNCiOUm-KLgAQMT>7oEodJix17kR2=uGZJ)&V6>zh$sm*^s3D*L~)ESU55vP@0 z<4bnP?Mjvp**~ow&!zol7>k7iQ|SzgpQzDZOdn}N)A1slk@7t3;GD`*62AkZMfgK2 zXFR2xxKHq0?s%}OEOQDJ6qt-wE{!tte)^)Ds6b7fBY62t!LGn>^Q*MM;-Jz+M)`nW z+@i*lCIaAacrQ%d+FFZ`y@0zz(me8l%UolsKU?*FrmdBi+ut2$HIDb2fY>w;Rh{>8 z&AEi;^GhS?P|=|x6D=M^=rl`GD$lR-dhi@kw^oQC>c}yY=XQb$Wa(%yV9}`BXofe4&t=m)08{&T{IzDu?^$6XW##2pZ!8D^Y1iB&q;Cjb=92S_2qkXLtgMv$uLGtFDxnhu)JwVU zuTS<4XVH)LNItWqm+ecKpG#ti!0d6;_R(SMGap%N4m5~>SgQl2ocHwdj#v6hGsH+&H*> z7w$#B=3HOz=mHP?PBMfM_(?Ym@?P?~fi=AN6Ly(v z`7`nUhvf=A=2edtXLv)&b0&i&Ch@19J{7Voe@-G|gXcHg%qyq6ShimNb?8>D8BkSp=kvM=HY zxrE@Lg!uTwQl1&m$(aJ-1jhbY;}&CuL(dG*Pw27-s?SO-Y??_gV(=*gKKC^08yCVM zfz>S`hnO3^oQgjRwH!V^wtWZn-~!O4bD;R3bKb+jK^;W*E=t>;57}ML)hEV2>73~T z!Q$BiImNZgwRHiVmpcAsIP9iW9Q3=~R&f|r~-F*8qm{pbBX#ejJ?Jq4xqe+iQ8_5n99G3cP( zuDdpThusKal4C*iCU|V%My$hmJ(4=Ae*9YtVC4a@MEbz}=`{Z7B#7)iLQsu0Q#8YO z4?b-!gF-8CdUCaJBHJsNRG?aYX8!id)5+2V5nJJ-Ow<(+g8_M0PXH6UzrCy)Z>8Lk zD#{J2-HJ(WykP#I2QjY>T+$g;ZlhdfnWdI>{e?abwqTh6raZ4!s_kBHJ{>jxx2|}} z#*7q^1A&#-txV7Vijkpv9uM%SX}55RErN7&U8xRpNED4HVc{$URH3zZGV?(Qy9aAE z-b8wN(90xt`LH%9=*$7IrB8HM#j7kwfdq%N^UxX0|OnczjXW`Tnyl(~YIRU*8wiK$|0hh_iMC zPB$o|v}p28JIyB1Uuj-_9>)w4EFEjnM?L3agKS>{aoV)u+d6i1B4qb+bSfWnn>OTw zPG;Sqt6%WSzzpYPkXOEl)Na^XRSbpN$^|uSt@~Hx6%)gxL5iSzeJ#po&s|PjTpUEe ze^gnThmuKw^`_`!L}9C%cQ&fg`o;Gi%!|CE`x-ObzBrsK2npF;X`X0_j90<8S;Huu zpq}D}b)FELggp<>PZ9}R_O^CHQ!eQ%i1MzE2Nf9?#)|je1bLIvQjzV2ziB@=ZBX5O|@4t>U0I(RSbYx&FrtpHsewN72oPRWb7G zY}M5~@y~vY31E|TqZekEZB_=fxc0umD=VCAY_~k`oj{dXsZxr%Sny-Kky$52$UO<6_j)occosm0 zY5>%dE(hz-wt}-casUUMEi>~lhuj#vrz5cj`nV;-=A}SgB&Txy-q%riX67{J! zI;aCX^u3PmGd=1yh5}8gAII=pKss zJ2{&pty(Eh7Rz(_L06Yyt|kkpvS`Vg2r1x()+>IExOMceuruADP@lL2qvqUvdgLWs zD(iDj`{w1{A5=KMGAMJw#I4druuD6O*>2yk2TY0}KfnHcT4Th0q6W0|0B(z*Gkcdu zCF=Z_+RTYtk|4y>n7>7zzLmvrvUX;lzUf^-?#3CZQ4%&WXeI2px6Gh_mBYS zb?%~42yqkj{%5(kbO7PujbBSGKfNA14L8*ChP{YoDKJH_f++bRdVP|JdAdhbn5xD5 zr)wxOBQOsHjEg$n6Dw-N$;Uxt_;JUFTi?^5qN55t$qt|}gjBw1(iYFz{@iOe2KXK> zRmES{`mG7Iy%Kf za)A3}jRq*%BP?&}c4qPg#BSAcg!BEVjgF2suc~w$O1NZ|l@hkNJit5Zz+d8{fAzn7tD)m4QBW38SjTvZNLWXULP4$G6X5gTH+*so_!pp#v}bX! zmKg#-Rh~@G&>klJTcQ~si(M=*E@6j<5ot%u?Q|uu(TKMoV8KjBcW~!`L&~}1=}|gR zhJ6$c+X(tde*K!QKrj0Uz}?EZTf)9C0mR_n*ITL(f-r*K`RN@ zQ8pCpO1)^hL$+W>{gKFS|Eo7ZJisz}ES2{4$u~y{8!2}2R%$58PK;fgodML;!Ps9$J$GU_ z{_;BW^&Ii(zVEw=X}xf+*ThPzgcm|DWRgRI^?riqr*CuQosxfnvEG z{q7>;TmgU}C3N6b+az!O^iVS!BVw#=tnGW!GVM#{iEHVy4kFjoU;gUThP@TFwvs-~ z>UVI=B;HbeSnJK3-G2jh(LF;M_*`@-LZ`-RqSwzPG*xrtLv@|oJf-7+B@ijb>Z<62(nBRv2qYq-a(A)!3s)NXaCxytFU z@mTkP`&8=MIEuTcm`$?K6ft~?VIK~j1DKz7GrwX|jE;#|)O;QKfEX+^H({X09^R1^ z0lH25Gg_bsRpSabw{&cS6u3NrQJxASXh!{qt$X*_D~Di$-6=wL3jr;lx`++}$n2Cu z_Vfzg#6P28#Zcs34uBc-=ZAkk@Zp=%1zL($5h%s~8moL`At7VwL33!MpHjf;3!ZyE z(lghaOgCq;nup4JT7ED@2nHbYi*!WqorI7U#^**>YF3`*W~IoIhcoiI_!sFEiOBdQ>Su5RsF!7D;%_pO}&_nlzG4O?}n_HTMo5a(nxHP%&kL-7>VpnJ|Y0@sNvwS+2 zL0Iv(Ox|NphEmOi%*rp~zV`xm&18EG6K`Jqj16j|hXM&S|9eQ(0PjgE7F$oNRW!;Ali;vUH0J&wCpY9)>_lk>)Ju3sQi;)DPpHYtAd%zx4TU@4pt>LmD%$hi`={{7)QesveT)5*g zktbb(`C_b|M>ARxQogo!6uFb0NUahuLU_uozh^(}Wd6mVS9jkjMc6to>c7<3*|S8L zrX&!cpO`$l%bAtJ?u;TQtxT6CX&yg_)%ylRjyF8lUegW<}5FVDZ9 z6ExE|{<|IfzXCkJn_D|1El^&W9_@e`cxF{lR1rkI*VHq%ot;u&|?Kl2A@bjHLdT2pGQPsMa;~{5=aL4-7ixN!(n6LZjd-8Yut(gf$m6DyaHWu_9KP523fQl47dkT9 zF`JZcxp5~a^V^{6j9x2keqsIpwF>{|Yu-Ne}V*ga1tQ^mCxCwH`-cu~?{rf_b3RaJ~p7wHU<1>MaS8*c8Hut7g&x=|l zMNBAyz?7E~cNGl&IA7;n;KmUZ+Ed=Y2;v`CC$43v8?%p;L|6D+hg|Q=daC>M*tDD28`U3i%k{c|M zS3qSxsn(7eAzSM32pJ!Q^fS-vO;d~cs8(oLdIS=1ZPi=$>azgzN}8{2ZBZP})g8FZ zRCi8AU||rP=8&W+e}>G-CCJTM{amlU8GHV<{Z~t%Z>`*++dUk%bsUJ2>&9BZ8n!(~ zGT#YZET8sX;`3uHSGWc7l(K>!uZ&C-cDOX#c69TL+hhWWNq-KW4X!%onqxB&EagFx zIh7*ZmVfh>=6T^LK<3(qJvdp%dIx=+0pQzSULT;9p>u8F^|1#?zV8c^Ndc~O%u+?> zOd#Lf`ySd(t#Zrun%D=PjZNRvuyIC)+y^Vc)b`1+c6B4%0XGburm^M%5N-pRefCE~=@WxqWt#^T^XP_tqqF zd+j``*VCj=y^pW6eIXI99D53)an8f6Ce;o-?|_OoE6TIS-Z*p45AOubuN1OF8nE zo@H1k`<-40$N^MY*ER4HjrsnRGIM~!Mt|~Tp&v)&K9;9N>`BGwV6}-ySoyk-2?yC@ z0VlII{kVNlp)gs9HI8Sos@ukr<#Yi zZZ!v!_?SANm-Q0Pv$N;DUQu-Hu5vSSH>awQ2kS$0i3bPW)1C!k8UDSB$3MZ5=Siq{ zZ?gw09HduM#OWCs-#Vq^2R>Kqu0lV6j*0>gq>4h2f?8PJp5eoqtzH({-P&8~@!Ys- z#{XFu2t-f)j%V1ewv!j)QS^K z42eDdi%D@Om{NJ{a8E*(l@4POJ2g!i7|*@Z5v>HkIhd4~fhhP(>uD$y2HU|8t1_aK zTBiFcs?lGzqSunsGKJAnMuvvP11iV3=H_sVm=bf}U5j-3I8YoZAR_X1!aX3PPwZ3i zd)Ml{so;1Uo373tqg%I{0IuqJEBCq~dn3aq&y!j{AN#)^WRSKQ_95kTOU=hQ&b*ee zpVODBOa8~=Ww`gDQ$r9Z)fKq2!&b$I^+Z%L~GFy z$1ni)y9cCx-+w6p-(OV%m@RoUGOEM!ueHC{Okm_z%&Quy^sj^weu`JRO|-dXhK20> z80PF$@WLknOw%vZ7>_S@2gbC=j|*HCx^Fr<+SS{eFkv$i(1}S37q@(&)+!+2>#qXf z1iQX>>EF7QO(K(6rq+;yUwkCA4FDU+SlJ>6EgdbttSEBe;ML2&^lrxmx>3VZ>FGDY zgI0#Dae>JrR5Sd+>S;RuxP8FLrDtVTy3FhEHjyQi(bLs@~0tr{FUtcst^MeHtP^HB|30Tc3G z9CDtMt?;Sr?#M=Beo})= zv{2NXel1mBmg!=g9~rF+=`dbEmrepjX~ZTD1;wJT8kZ zR~_1qxGYv^Cs^0w@LW~&OfE0{yP+=yxHi`(En1Y>o?!-OsV$LDdDuK-?j|1NYHgHR7wLKtslnWYZzm1vQa2pHO&tF>0EX zg592A1t$^lK$gisPwx#QxAMp0WmmHEvh9c^O_8m)ww@rCx*qvDORf~-(fBI!_ZYA4 zRgoIYC#TM=g|b|na+r($N9RgCc+t9h+#2^7)rbBpooID~lgIHnqO;+f-F>D$J0|s7 zhiIOVT3mv6pI!Wn02eQdRVwVK;FqO>vdK+M4n0yH1>wH4&Rr9A(eJ(E#i-M0wia0n z_^+rXs>JEEyeAiXi>PxG{fN{mS4>f^Aj&YN@y=PBX?6go_9`2O%d?oMH|+oXAHo0q zfnB-ctXq6xQRJ=>?V1ZlB*Ntw(4sV_*~IizkDuNqGYI!!IHIyOH7J`EM&h-hLofh5 z$k5ce6(XaJ?)E@Co@+OXU#c%`-<7Y zlT6R+sylKq7u|h(FV$XJ(?ObJJxsq6zyU)b{qHCb_r5u|W*-0N%Lhf*Lf7uK!UB^` z+k=#7DS})r_R?tO9v7?Tszm{zQy-q5A$dF!x3SB1nxYrAc6nfmMbrA5PGK8`b+_0` zy8-)6rhc7Dg)f^y)XM=K8oLbJi@96xlBqWEBGT_M0yi?QG$s7eLl8Y|L&^akfeEf} znH;8@O)hF18sz_Admud_4!Oy!x{i8U>ESdNAkYw!ZMnMcvvf>v_sPXl9okadW?ZuW z5zpfXJ@nI5El%?;1xQUP&wT;XZ{gFs+7iM-We}kJqxlQ0Ckd3k4>QovMAM!!)1I6e z($EV^5BsoBEr$NX+sg#(*D*^6G{Z{Vmz6WrsThQx%@Waos4op`Q5}M{Y<;uKgz&KC zEf$ktgkeH)pD0$EedT&KxA9 zoP|L?q#|Wy$UXxi<$a9G@ovI)2nl;K6d&$k;;uqnh(UPrx~0HulDJLTg>HmdvQuO= zPcg91Q3V-D9C?e*tx~6}!)baypmL>1)@DTOx+DT}JAOZR@25m<%I^^^Kxc(fjLpW( z-to{2wEs*ZD`+l6U4YV(KX|?l>GBgLl6j=a8SZn;@#6_f$Su!LC|1-H{ML@zSWR~} zr#eC1WUz(S_r=Yy+y{4wE^aMbE_>leN*N(@tfGzQZVN3m?Am*MycssAxFt|!WRMF}U(Bf* zq9TGV(Ffx4))8&-Q>fIWj{fJ_H0fg7c;wQN`uek0YVU?#A_!f+6bEs;^t?+^{059^ z5_4jgB!u%Wd3Q{EcG!4z*i?6ecXx$fV(*ch-W@jJLsy%8s%s*LT8x z)Th=>K#N@O&Y)MnM|U{mn+CWQLcPru!XI@H`4Aq23sG0~KAy|_?EAV%1uGh_zk$sz zQamDO7`A|_dj!Ru?7wq{L>Id8?5Eg!n*DAwV~L*fUyTolk{B@_^c$Nb<89G{z8iaD zJp*ol5zeUBnpK0*^iz31%BD-~)xcseBgBsS&LbGGx;62sk|LqM7jBZ!)XV{Zs1>S z%xD<)m1Wh$^hNW4NtA$6SC7NRgw`70G$989R_d2bZy4Fgn!D!6@#`ahRIn65mi{;k z_4h%6Kn@Q)RehaXrKNc8%h++Mpvrf_z`uZi1Oxr_YV%p`{&FZWGz^?@sqX_Bkc+v~ z;g&`F*3;PoQ>a$4UvC~5lGa}+g~VTXPtP|999 zmHxEh&x-m{ea2=op#{SKv&eC>-Yu*e<*AHkETXF4`Mp~$oI&LmQT>N5?IKH$M&$by z#s)bDbH6u_V7dyXlM?r&<&D$uZp9!QLH2Z~R96v2F_LJd-@r5oy}f2-^geOWxI~5TZgrNg}JRl^hSK1Z=GEC0y}@VIMgAc{5Gld8L8Bn znp#9jr9IG|)%Syql(oK@7JDKtP*A66m-78yq8j~4`l-~3r@t=*a5T`f$!naMSow3L_Mt~sFZ_!TO>6uFYgUSA zh~W_12N@gcm@xsTbcFrnGwMy|saOJschrU!;sEhw0QJ2*f||PyBSyE{c06F+m%Wrb zMB$BVxoVJi-=PtP%lYE)lt0;D;YMR(#L^b_2Aqua4Dw7Hp*!}+k*Tqrq(5Z%_E-6{ zdHr`xFEOBWTFNx_H5M;FwIdvplp5AJ^GY~Ai9QtQAA7VDUMqp8DKq9b)meS;++r+FQ z3dSX{^dbR?X9Ne-99?DAd2p;Ba(K7ja$*VJyOs0J1@LKkX_-Xn34hvYZOZuh@ zSlcceg(u>|y&qtUs(F$>Jru0vppBWzC&!_k%DxY$61jd4xmF&`AECScuX3m>wj%8J zooR*GD07&wg|7cCA2dvQ-j5S+f7Gd_v)i%L_yXQ%wA*EUiC|kOS^dhQB zW#)UWo7Zlxb35w4^oBR5TA38@d$1>5QDu!&V~lPwC0etZ3gz8LUqOEXmaW~x`zHNZ z7Vs68b?MG6)SWQ?KVl)0F*K72QTbPA9qJEoyCZm5QW+C8pCJnhgPZbW53-7OM)GE0 zL`I0cFxO5{sb?>Z6|fZ7ZL$PNsTl$-Vxla=0eJ^@7n5;<8KH}n{MCw(heGA=^6p2g z=1rd_n+w_5zzpubn1T@qGgDJ zj_Dz{4PyuvpUe3BA_G5Bs)CSh+Wn%p!L8C)Y+F-mL`5J7)}J>~`Tkuw$4o|fC_Hd8m< zOfIbv3A2#jn*g|WIX`lcV69<@15t`jmK(^j{#Y>PsB z4eVgL*;ITHr9Nzcne_V!zw%1`EfDP#Sh5NIR{$V`vPeUcYyq$vO)~KN_AK#06J)JI zrhudyG3jC)hRY@(p(mQD$NhPR`kNjz`X4J@9;>{~ON|9qHQg!#e@yT50BqFTuW)zG z-{^M7?*kUW{^A&0IVP^5+}*>71dP((s}GT~WDRLSCdN`7j{!pth_?V?tq@!hUtxaJ zu)_Iu>Rbai#Ofw6RXG*Z7PwP=KATkoAEbpM?RVsc^&*N?S5&mATM7I9Z6a_KYPuED z6d*t`7h(-x|1-o*X1hw6(7PSLKxK~>EZjd-w-c5SC1D)@vh{>~OYJeKBfw;Q7|e>| zcwl{@%*ccch;J}_K8s32l_pI+<#tNSsUFO~zijaJkbtQWua&9nf322>A?X4O^+$~% zO9Rq{fGU~-IEysW%1UmkmQ~yl7tWIC*iY&Lx#2LO)aJ=38CJceyChmM*mIQe&! zXvv5S;|y?@1qnuxyG5;sCLmq$e{92{YyU3uhr;!{>u|8j&z;S8P^6{UY-$nMQ70AM zrCAG_bO^X>gfpQqD*y*Q4B%dp6BB25Rsad_1AYC3yYXBl0CycH?e^kpc&k@}Qd6l@ z_((qN#cNta;%_1PunIKtpNDZ2XaJ_&;Zn0yM0sW1rp{T1(C?UB04n^-gB5PaZSa$o zZ&Fh70P49epqUv0oXa2>iJuUpK^yAmyaw#mJAjEv6-wENXW`&554JJ)Ay5a@%0iN< zMG7Yki?^-A*?$jJ!10XwXG};sy{It|sra_GV*8&4KT$KDmXQ>D=_Ne|921UZD(3{{ zpr%aENiQHHUCnHVJbi9O?vX>jR2d+WTWZ{!L>uTT&q-pQT#N#o&n)chMGjd(caaU7 zvGzUbMvv#H_^~ZRa3e-P9s6S9Wpy~Fwys%lc6#fvvTG6D`}LDrG@+t?Q~93%OsC)X zx4E0p_00EJ(p21ch5NFIpwcDPq0>H15N${^j5}p;ydMf<%d08SqFz*jS!P?298?tZ zX-dp0HNj=RvFHYBk7EJJd?6qrFao^qXhM3?u8Ci2MC_JfP)rYW`Ea?lQ*168ZX7S2 zB5ia97yf6fv)HT(2-f?YK%ZJLqUox$>$<=$jQH|J;8RMvo2K3$3B3sBuuB-c+^S~k zyWgP7*Q+p?pQ9ac`c!|caO?i=!8w0D(7=vQ0?+_qYaeSZk||&*01vc5a+}Fs-N)tS zOO-Ad1CNFcx{08XPnz9^=F-?@LRomFxHqUXelFFYpKwU00a{sB`A{PY!xy~K3a4C7&YwSnvP7S zMu6jtq^W>N%JJ>8MGxI*XHQ)Ypnj4P6Lb3e_27-3GTH{9*|V#&vruXh?V`aIE$cr1 z>0C%mRQ$ym|65j;1T6YReSXkd-BvgQr_4RjeBN(|(!G7?CPyI2%C^%AoHft3+Br%q z|4Z*9f4k~ZBKDklX_bMcct4}rq7X~W%CV_yK%mNM?!_60nS7eD#jU4szqg?-h`GnF zx&YvrY%F!n#jG*7u{Tr8;ECb${q5C4IAvR$p*H9P&mxI<${Af}p6u4J)oZ9>ir z`}|M@A>1N{ZxA|s2t?eH?*|IS-@Rrh7|}w568y8o5qVu=_eF~nr=aP_z;W~gb6>2j z8!2iHgs4PKp>(a!Yw+%BwfG<8Zme^HYP8{wv$M%>-xk_?eP&mB649HV>(Ux44Y;8) zRY(igbt_fo7F)oYbQ~v$CyzP#Sthi-SPBV@qR~_b#}4^%{>xPkO6y zfcTPEXln%O*D^#eoDD5i8N3q=Sh9PiDc@ei1#eV~x-4E0Ov+5oVdNZJgi>a0fH3il zc=Pk;?+mO_3jCIu^n>?lTiazvYBnBkFIVUa2niWx$b{u%+%v9f1XGBq+oUZ~r`A|n z{0LI_Rd-$0h$oT&&kBDaN?zRq^e2@A1HFO@3Ys~08PG`B)=RT5j;mu;oQh2&qLif| zH!P*`>eX+4*f6xT{ql`hT*?pD8uzNM-@k~UJ(YrQhlU%%```$h7P|Tr%kp1Z6CrDn z?z4d1NjhW~VOH~~5Ku+t+xOV|ExF}vBdnDHi}yX9!`s{<5?0~uATp)d%l)scf8bvS zvL3}FuSs`8DCcvL+d7c-x?|)Xvtp*3*HqWB?JsDxK(u`5wPLzH3KcI4CtCRgh#Cg3 z2C=Z>q+`kFr!Ew~d-HH&!tLXJdw@s3AN1fm@^Gv84fyaS)m9)ZAHlP@MU30Yz>;+8 z1J?XbQKHqKFHQtdS3j3LJ?i1x$R!c@(tnv?B}&;79m-L!7Hq01Ejk*(!zu55zdarf zDv4TnH2mu=4OVN^0mJPOx{m~{bWZ*R5O(m>(NqKfXiG`^`^gjTBbvWKwW?bhb3KU(S6j_m^>Yi zGU!g(*vDj0`>V0;Z?AM>v3*1K#NF;S_~z`2e|_GB9~{sOI_+Mp14L`#(X z0FxNtG*|SZe3ak^f=LlBrcSXS z7p+%ntoG~&yX%(oRH=L9Bf?lz!;h8xZ!=1ny>i*m(47mfmO?XD!T7}to(KEm<4Pr# z^$&~@MzFv+m_;^BBR#bJn0C|S+mY7yQke)NQYFjZLVEB!AeU%J&Die}J1uPW<-VeS zC=xKW=bU72>ypx*2tOzptKW;53<)R&_%=m}dDO?hP913$5_pVbjPHVdw zMb@}-r5Qh17|Fx0(o~B$+VUf(JvnJmA4(-s(U$1zAr`{`-anXW3nx0v1YQ1N?$Nkv z=Dz-hCf0>3|6ncT-qyVEVB?++xWK4C*_8sn+pUc7YBde! zX=4{N119?i75Ow1jx%t5c=yh+Cw->|&;)14Fni2iVEv&>6u+JW8b+StZ9A>_a_$5sZ`D^tPrN$-aSTI6&6AbnB zKRRR)UtvN~~tM)+5%$&>3%`^!OjT`V|cVF_rR8`KyRH}!& zQ%b0aR~bBPb#CLr?u{=zYVDr$sAAp6J|3)Ql>S;#w5uGG@?E$*5(>JS(pAEW!VkVJ zYYkBZzpOREMP6A~`$wK``S>6wy0EOQUmCl9R<_&rGam8E+GXIA7wH@bM|_oj5lj7= zoCz(y@Mm>y8cZdxQBMPVUPHn~ytK}yBE>D%ht9F#@LJg~`ekhnUooHL+0EcLfUjBq zxZF&Y0PfsQ-KS4?)*8q#cQia~H^1C0Gv6E>`nFdANG0xvt2#70LANXo=pY)0XRGZM zc3}h+J}kYuy=VwZ)cNJ)76!t1`iEy)yLX1osRK=o2T7Tkd>~J%uRkLLGrF)>XW3-8Fa`7Eti}EfNro-O zUBmg#>lJJ4_(q=V*E^gm1$gIP9xB!Oo>{P^15G$F(q9+J?M@BJjD*2Cc#Rh$+}7ozcpnh=Y_K7{R49(!tQoMu}sEf_yKmmU2)CW zEH6~LzfQzFocQgVZG7g*`&$D_z10@A`vtAGg_~rP(rw~R3A8IQ{Npr%ly+YOfy~_ulTx$iY|HR-Redjcb5?yF8%Jz@eOaUz6e1EOASR}lkdz*53@AW1)8dwj6d=WB zmBzy6*9#2tcT2qvX^Fs_DQRmN{TTXAc zGOI)>R9b?pOm~)f)k_nwfdgn!f$P`t1AU6Jy5M5gyytjDBlh)c{kGQoqbvTVCB`G6 zp!>+j1?ie@I&F4cc%=ao8WVF82#-E!#Gm;0;`+0jA8eBSr7siW^S(E{bUH?P>Jst7 z5@L~-Y7a#&EZhKGvG+#;R*;8VH5Ks#KTr#2T>VFK z|M^2ne2GxtPAtkB`VtPTb{48vtC?E$kN7%m{pbZ_kTF)5(3c9>yUnQ${guuqA!jTZ zGLg&W#rdS-=a;Qz8nR1!bltm$9M_}JLwY1Fz2LZbQ*oDJLs@d7IHtaI4WvjIg z>8tO&>&>T{%F6V%pyr0eCtpl=`dgq)c#Qc5Bc$GcWf-_8(=vT4%pL{+<9)l^x~Tv_ zoBx5n@xvu?E~8k|e!!53xmP`(4txG2a<5+$eo(TxwK-H`Zn84j zsE#_A5X6sG0JLK+z7{dSRnEDOO{IRKvsW&~!Kp87Gg=osJeqP?doo=5m<}vgc2>~_ z;9?5iLar64?=7*Mzw{|y<$XSI`07gnNCa^_7KO}$QF!g_?VZ1Vr6`2$zqBIHasUf{ zNUH+AH}BRBc411@J9aB6J)?B@t%m!or1$r7yd*thbRTTT93St<=|M_5L}O^)5II`?=z1F3RWd zjq$#1+z2HP4&Bjeq@-d;f=6ZC%uU8hX-`21VJHGBn7o5pA`yLCTcy$Q;l8QiJ4+6L zp^;AmASm_o!AbC}kX1G1-JgAfAJyJ-g*xWd`L7g9yU5f`hCF;&ph6)~f#FK7j$-0Q zmaXe)XUM2kSW`;cUZ)k$oWprJRGLXsx0tpEv|xkdwQ&593AG3ucLolXhbUqXjK6%l z_b}T26=6;(naB@t3OqO){AEu{V<6x_GbsZ{2{Uv3l)W1xL%UzmS32l|Y|I0^V+cUp zqcU;*-?LW0m+Pmi6@5Z_*38ywjz~k0dj`1Ezv|NeRYq9eofx)xP7)3u3-^axO%fb5 z2DVz@#v|{l*eC7Z%&!veg(dC_sC-J(d6M} zcmR~|Jz#DE!o53%;9^MS7F(V~dE5{p zM?3qLw8=L>7+KMDu&QWhXUBi}@=Z{WhC zCDj5dDwDYQSNL$Q3!+v)pyGU&e~K&b3>vtPY$haSWt9R-MLaE9s-0yH%R%>P%0sUEt&Vksq zYpS44Xb{L5sQ&__i#z}eNe6V48;Ka8n>2NGM?g!O-{vn3a0RNVtGjf(xdJH5wUXTc z>XZq9jn)eet^;L9Ake`FZfi3d8k&SpfZyB&Q1Jo2_Cx@B9~#;KuB}|atQz?LQTLv4 zO{HD?sE(tIA~F_0LBLT!rHVA^R*>F7x{CBBy$0-+W@yquAV5OzJvvC2ULu5mNKfbx zI^?YV%*-?IdH-L|`E-7V-^@@3lD+SJ->Y2LwbpWQh8cu|*}L8O<$$)=op2Frm{1-iKBA;jj3xziGjJ*DW53cV6Acx*vAC(@Nrr8mdoi zhto)DFI0^FJj|{tfBv;?G#7izwUk_8$3FgR%IIF%+;Fa$xQK+pX#M#S|1H0gw>DXc zZB;fs1d@x$YUxYTr6Pc zG-1PoB91JyJwbiP6|TwV{(EMDZfFuE>Ot1Mqo6?kUSMHV?Ogy$bdNd)iM!}1A@f`q zscJu1Yzv~qE@-V+{CM=H>~hnELZh6m(bt^C(0o)Fv!F>PG{7>r;tz@1V2xi{tb}tefN|!1>;60|X^Cc=(y~Jf za-`mhvQkd>ydCq0(Vm zF|liXbe#UlU%%eoZ4BIby|cSp0{swCTQeEHi(lwuJugAs@7_la?;raKBN#*x z2fG_aQpw70O{eDKU*3Wn029T)E~U%-zJ6|DV2)VE2ZKD#zy4#+KNDi)x)1H+yaR}a zX_NaUpCpoXnX^HQXW4^5kz8R6XP33Lsw({K9W+h=;LFUP@HC@*s>NZINi!d1t zh~o7Fa7s(SWX>Krx;{Ig1G9>i)zl&%oQ9Y}%hk2eIJ5lW!DR+EahvJRl*+v=3bzt? zB0bm%ragGDf(&P`b?OQ1Hn2JO!a^a>sl7NKCF-mSp_c$yHd~24twIniDHY!V*>Z`uXo6< z$HQesMnyTWfQCacw+tZ5Xo}-^-Gcur&=i7S!*b zewD3{gBlEzvGW%$h=J{@*;#IdA*q?ZYqOUjhX@Nx?(NkD&(=g;L8pNM!@&YUy=Y#v zMQH&o0hN>UcS`=bZz=&&@)_;&m@tvg75hv?e%nhOz9$f{HS^>(*k7YF2M4y6fAA`4 zzey6|(tIT3+GcFyrB7unIN0aQ;e1Bcw|H-}Bal3kk+e2|qQNJC%s3~{@q=PCqh3X> zYo&vxE>yEhXIdSW5+yK3oh_2@E22@kqyZuSOut2?O!+#N5j|icNP?uB0t5^Eii&NTikK5{MjD(;z+IpIn*H4to8IOn8R~BJuPix)kTZck*dgO zov{pFKePw%FF?LAVEL8N@FYEY)Fku<%+wk`W{5Wiof+#_Fs$D!L?xinpTKjL-=v{W zA)_yo&%tY55)@ST8urOBW|NeZEF{k5DsLMMz9o)6_T;*3E<9pYbXinX7t8@T>i5uB zSIpu26@$hnv1@ww?i!)g{#i<{OzN$hOcND!mqR;Z@6i1j0)A zu1=3iY5Zf~_QjsNN&77J><6APuIkfuzmNg8`qC}pFVxlKi;zsDF3-J;t(jS95o(F# zGJMp#aakwMr3RDz&p5_nRfEt!?I0-XY7O} z{Ap(acxSHq33$YhN%fz@5vvJisS^CC>C_~2^IV0a2O*<%$`dHrB%#(x9@s;AnwrTF zi8WajWx;wm^*~3BR9GHF_I-qr(EyATOs~hi=J0*wU1i!k%>M%3OE1yBC^GBtNbvVOCDGkbro%Ts-8v9Gf~tBpFw)WB@_ zKzF-hn1YI|%fP^Z*$4)50dTuBaE&~xK!QI}80$B7?t^Zh9uQ6=)(}V@h&RLQMl~V! zcEay^!czi6tC5&(VCHiNKpQ>Huod!ele7!9v^m@IL6BnFd|s`nP2J-Ge;9 zJ+_FeC@U9xFFl0gX*2mPCU>kra9a-kmNRgt05Lk2EfKy%Mg$NQcZ@}%IcS>O3QG$U zQ0$;IIlcW{2?(i0!8Sn_H3PAXJ|LAaXFXLzepeR;RVSS|c@k$D0A3aLRsxK(o{wEe zLK7G(FY3K`pGqNU01*M3z|Eujx8HtS{H_nsw3+V=Hz7bkP*5Mb1BikHGPwBSDilyb z;MNU(RLp%^69vQB?Ycg_ghHAIA@hF@ZD+*q8+5rK-9de~@cPwu0CPTvWc0I$Xw%fG zbAVGXBa`CJBcX;jT*qEr?j}ttHOt}tin<5I1O>VD(e76%syS0jr7!{kQsm$Rh!mjw z7ij2+>>L;(0Bm_GX`($Ef#-^ox^_Y6T<-1Tj3t=o!Vdgngc{8VR*fucDZ3)r_ z5UBe8cuEJ5>U1nK(A$6>=^7c-qXHojf`Rmkm7}j+1#(zd>`P6o`Z>Fr3n!-};6pD)GcQ@)?4X zbjMtt%W!ZbUdzgC;@rlYwF|2@3p0aWL%F@~Rm5WEt|(Swj(5hs*L8m=T|IgWWEJT6 z(PcP}chL~rs3*!~K_3W-W(!_0rw}T-kaknV?W7uHN@Aj;Ga!jD0E^WJ85!TfwUZ}L z0zbwKz&y}jK7>k$ZXjVV@BaXv71B35@B;wo8P_b(1Kn!f!2!W?CGU?UIh4_vGiP$g zMwJJ1y@&J&wxdNIayk%ya`-RaC_8pSuf#gmD%cB?e~%w9;#{h@*W92U?Cc&e3+~WV z)HHCHx^veGQb4=#~A(&~=kX+~{`kRchVfdY^_8`4ZcXbKIH zs! zemb-L@8N)&%rno>C8ufd)HDU=Clh@78E@9N4WHUm$V z*U&cw_8ORDl>(2Ioo40SXT+B-x2DHHnBL2mxhN=(cgZ7Y4N%<_Ny*hg4eDlDU2k(fGne6 z;+$MxzTvioI0IA!F~g{JQ`l(wIYu*pr+(_9e;k*lqb_18~41XhOcd1kr^O8p53mJ))%f*>g&;3;T99S4``GcIwQ9 zzJN;d+XEe^I5^DaggrMFN0l96I(v^}RSUEiCcnLy7}jUk2jkUKg=#l$B8C(mCgdL3 z5Ckft)f1%B0m4A-QVClynTIqu4KYYVC}&C=P`d|;ZC7;v4M)!PvdcYETDgg*GF)=aICNYv-i~{nz1Id+AS`D704>l{Cm9!kde#S$*9=STRJ z-Ytxh<9GGs&ySKLa&1QX<<39AE#~Xnl==L?G(gg9U8 z8xL|ONx~Nk^;h&*b^;%3KjBC^p^NjJ-&sxJ@pv5QJ4K8iMS>I7UT6Fs&NFE^>-e1F zbk}f?-oxlp&TNwz{GFgXIb%6T9KO~!btDLBnmC-3Upho64_>FLC&}fon0eoT0EeM=9?AMQe!d5N&g!+HFlgqT46*e}tn4wwWg@=@?T3Q* z%E709?mJ0lnLV-_&2q-Boa4owmH}`=h^zTemh+!?045pSJ!9{42stQU-=54Jg=7Y7 zE#)0i)_)@(LPw_GfB)f9E?4&7YSX{}?uqkxqy~G(Eo744xx8imkNpqStVYCE{RWC{ z!;RkrKrl>Y-f;$8B(jcL(f0RW{r8i9I8vwC?<8Q`N#$1HvZYnXsy!TmuloGrY;A3~ zHpW6d)@BU>FtGu|9x%J-V9iot8s;=a?+B*jyFQ--wq6B|gsQR|Kb|AlCX!0SF|&gd z1^8+`2){)i{P`=q$XztBa$+9fY0HLO-*bUHW*YE!)@zUNN7f&70k=lz z_5}zo`1G?o!FoWpn+BOt@L5T1$HC$cT!^`XbBaJX4&reD$Y%o5dFk4@j=JHHYEZLA{)$t@pFO zh9l$ZWz!QpQ2X)7MtQ1$Iy?`^wW!O_+hFDGAyF~PzyCBbV9ORUGr*-0`Z6>)88~F_ zp(A2qva+-JNp2moP@UX|g*dCkdBiMKX88?-Y?JK?IOsiS3n(-?EzYSD)NW#KIY^_k zt7?Eb=Uv;O63i*DIRiQ&8$HFulnyL}U3rc}+tSfN$VdvnB8C-c zljufAh+ImL?GhtmjpXcqTk5_~cj(2OhpW5yHpas>xRe-W7N0;XsbWW>cw3B!BBShT z7zo=^xK*O2;R^l}=|ea$(Hc#G34us7n6th)l@th^`YP;TzDt+xB49wgq}%G(lNy(< zUM=k2!RhB{J2~ar?;*MLaJ3IieTf7_&38;@aUQD-(pi{Hpwy566+|`|#C~A0LlG=2F3vbZ9ME3= zzd9r2nad~0_;mL*s7a90kQjXuF%`g8TzFsq)5RMx^&@yZIP)yPJs2Q|N>vEfhSLHB z2Nf384nnHsl@%Qz-E#4JzL2bATO8ShAHG21WAH=>YyeLKiBiGSru)ED!3K-aC~~x^HNHIDhVwIi6RUKKW9ON(qW7O(HAhO|o{{ z-HWSH3cfWXoY7}Zj&Nxol{fEbwBYnAg9aDU($U119p9jB>kYM7(GTI_;n0yxx5!Ej z=50_AjzUGH2jtm$paBC2u(`iqAHYllW#xJ60_c9*1OATs^Sw|@SC^K)zCMUz(9o3( zHdOqa9Q11{EG~|ysj1-?5YU6UM<}2RTs=Jl?#FQIW}G>C=(&FOy+5GE8=w$f?y|1D zp~1ny@aB)~?QziY+V02ar&jC-=LxyT&R)CE8w%-XbxjQuh;#slny57Whu8Z1$^MvW zd_&v({$@tlD(NDFyY6(bs2c5$`2zNpwieUgp|V8%_@V4Ei9Kyy{|y~2gO~K>y!m&1 zN`wfimhsgbt-?b?L#hjo4h~$+{O5LV#K*@!azw538I(VMpwtZr<@k>uVcffLNRT1sWp-NGW=tb#COxkC&jq z7-UCQY}uR~P7W+E%)yFcYHG@K{CEo3M%cY^ksS>UJj9p-t|yq8d6Z(MJnW(zB`12y zT`W-Bb7i2W=olXxON9x@*qbkp6qb~r{#we3f&2&0fnN}+*K;S%uH3b3*pin^-AJWi}`_Hd$@udHKP8L`HSd{17 z-Xy5*Cmcx6{8*e#;VihSZpNyg!@_bd+)vS#Cf(iLUAXJ--0ArWQe4vt*E>Mbbga1@ zdj2JBt{{X{J{K4e5jy*uwtbs=EY($72aB-9}*=!PYx4%+8URDNTWdJUBVKEA$oV-3L& zJ%@8O4-cCiICS(%dh?|Pkq((u*NK*y*?}Siy+-8iK$Vdr4a_!)bG&Yw%iaIS9lIB% z9eHvQI)ED~DJfw(pe0gaetuYZxK30t_*0$HKVMG3kg_>z7-J_XB}E3}3xm?u)<&QQ z@E4}l-dZrz0IQkuj9(zwd(h>y>PNL4QX8zZ*oD6CXJ=nS#}1)he0wLv~DDr$LkRaD^R5hnDb z_&Z7%KQSu!VriGye*t>ILz)a`xU{;fj~h&vb0Qx z1R23U07KgXB?KZI0Slzm4Jb1ZZH7wSfa*<9DE2M#E7nR_*uK!(IS)W5M6v)$C#Wiu zj-0xb{O3!0(0M6qX=#BE?*qXCU||Aqw0Pl6s>C=tI$AnA=Ru~_eE$lF3r%3}Yo*+L z3D=UqKSdcGg@$sR0C1?mZ!0S)b-~{wjz&3>x4ET7Sx!!F5Fdz#ZuZE60{Yh6(9jU^ zx~i%Q%osxCD>a^L+RNoVKV{aTFjqdX{<`IE9r*awl@56d1tQib{uE#UXKl-k?dUA?>r5Mm%a7Yvxnf`!M(Ae15uxZT{^BEvzm>(7p{ zHJq5kYaMTc$XhJ`#cT9X3m}QI{PoNF@pm8RUsj35mgIGAB2-Sk1x=?*o9zeN*U|7KdV7(TGmlqeq zxDXl@31{It!EPr5)kT3zEX==BY7PUzAh0n3qpWlH?wcblg4qzKn2iL|YP!3Fv>47< zA|wGE=W%!#@HeM&dGr*XK@^^HbhnhNX7VsguZGYH#mqq29~wv z30C@9+T6f~naS^Mq;9P*2!Wv}ngcTn3WrpP6VhSHnt?DwtQvqwvD}X8V75|0ID+J~ zAj*k&|NcFM4YuUWusF~El>K{4)qgd7R3#^+j^?BOkB3OSmnO7MOf)rm@5kKgXC}aH zm@X7`74k;qz>=s(ZXJ|eW{T>2J&gZ?DHIV$v{l5&$rA(~_D%}TCV9W4<@Y4}@SSvv zTpz3KMo&UtKVz8wLqpfRYYeqJi4M0AL0^c(SYq z=a5bb8WnM6C&y=;H16yRT-jbZ*C;e8Qy6$Zs~7KK0v;`J+<(q7CLP(4@UcPT{o^wA zEoYI{hz+~hBwG00<Hf9i191*-6b|MjZKZ|_ASFQlz~l(mnbA964Y#0l{6BryDY`6+Jh zj0xTxi!Za*haS5obNqKHo&;X_g+|-oevrY4-Q@Z$DPoqZq~Krw_cP5PE9+4G#WY@- z^I8Qi6`XVUa{Jh`^sL_$HoQC|-d)Sk&icDeP_D?(LMX+*Ke&YdDKq`&C-8Zb_31ywb^rc!+~U`N%KZNQVOS`* znt#9j>#OT>3jfk*|NWnvr~iNcqW!vG!aZhJnRx$xZahpo?{xl0`*rO#4 z<|nkK|5%Iv-aLFU{*qhoe}4a;udnaj`TuySd>D2lG%f#+3zLxy`hWajzth$~2Ofw% z{l8yiQPkq=|BLha?_vAAtH2rByR(m75QpTRQ6Jnxv?`#ZdXeUdPFaADn?7yJ>qwXL5f@ z9Iw2wQpd0Qx =kQKiEwyX+C7Eo-@2Wxv3I`sVY_4xF(;N?no8aXYmoK~GNTOi0c zTFB*Yp#}$Uy#mx6>)Uq@B{#F;Z%8-R5E2d-1&&q*y~A@zBMiQ&Z}>X-k>@jh2SuFA zjw$*^cHYPz#U9ta^>pHw-cLTWc+&DeS^)Z-d$lquiTHV92GV65CQo8d-@73s?ug0K z!CZoFq5Py_l3#C)u~*-3*pzqspV|#(zHJC)%gZM|FkBw0u*mRl-IyLM!EIK4`$PKH z_>_)5eA?*RzwZZUvD2K92W3zVZs!9&FA1xch4suK+I^|sgs=@oZofEYhS2U6>O~$D z{mrPQu6B0mmA;B`0wNIn=i|xj@eLXytCW9c!y!OwTrB!%!Gwv?nUpg<8I+fpwqmai zv!Y^X=i09#RN_l+7nYCS-YBpjcjdee7$`FEnjb=hP;0w|8YD9xy$p>6@pLu`&-md$ zue80L6%B;=xq4OmH6wd>)j~B+=_F5V_nncqQCu*-eGx|xJC%S>8u&>BV$k5n$s;UqukSzP?T%(Gg7fH1!6-0mN^HV7J zwA{_sz@4rLrxi?_Z%Hd|u*SaZPbZSTzezO!o2i%0RkiXsY9gYdc$!ZK5n#FJNHvPK zwwHOe3ezCl$=Gz8nu%;rfHcy^a|c{=qyPo?u)ccPBZktKml3eLZMy*?GtW6*`D+l2 zAHb+3V80xoYYmIVrqsQ*C9m4D?#)*r!CQI3nCR@>1FIRo_1SbEw<)>qt1=-nD_GrT zZSp`>G>lI8kk_*3)k;kppV)yU>=O?ITWeWRsFcTS#MB&GcYRZ8d7UakqVaHZ+y1$6 zn3pogH*!^Ou*hB`3UyQH1(s&NOEsyt*4rFV_RaA!M}$HAZT0V?$Bi2l6M90~SXlC! zlhpK6w;1$N{F7PxoHO5kIa%m_!mQBdZLFw6_CDG&*1RmSHWvTc!Ov->0!4{}0Thnp z_&AX3P1(bk)SOWHt$QU{g0>Id)ov*H19L#h6~cC&$x?VCZX+A^)4#}-1$=9QYvfu}WFD($9%kLGN1ainDxyW6#T$1R(sk59iPSspl z+7m5XK1AkS-ya4gwgi2&i&YTdtjcKSZxW?#+UY8`Q}d+3a-VR8Q1%N-Qhsako(sc{ z`t77Y{=n+w4eMx4esN~}@G>%zM{OsF^X$HTiTNOTYKxIoguKOQtBpYJuZc5r*!u*c zzHA@!HUmibN<7t3;u&4+yD{HXcer*XNjSf*| zelJPKbfVQwi#=MIA@@d7KmaQZ@;GFH{duJ9wewwAN&EWC>q^~$@*CGhFd78FIVa{v zb0NR9ZJ(87-JGw&plWv~jZs(aB0y85SNQ0#X_c>DB(Y1EOB-XOZ`qpLYU2wht6P9ER-o0J`^H`pIinT|Oi;#Kggo z!a$Ljo>*gd-&~&HpAj;xekA_p3D?|EZ35@NvE#nbqZjt3MD`|j#4HC-fjP99Ts?!K z{_WA!lJZQeurMns)3a^x$f8hQY@Z!D;laW*j5)=K=ERn1cg)KoxNwQXu=f7F2|a<# z*oGjE)ba80?I?@-Fjxhy-~^F7JMDeS9esfb_ZH5*73+nJ+K)m!nc1 z!XbZ_TM*Y)pQMPQq^yeN*hP#MY9+MiIp&wC)Gqp&3yfC3o>J0wcaPv|9;kSnnCDm3 z??{E;feH_0J$fwWsdKI6V5!$SM@@Iud)`C(n)OevdpL|}8J9W;6Xhl5M(eGF9!XbP z!r(Bsv(!Rkf)guvoS$PqC%^>O_^y7VE)^m|$(SB%tWpopk>8Gr<{+Ea`Xo=5f+oYk zD0LX71-{L?4_QyzNy_jINEy%rhOFAN zi|S#ap`kFWr8ldGB&Do+#nZL?q@_a{Am+UH@}F>J0ius_@6z&8UC1-5!2%A2h3sGB zPR!igTwmUZy-|@}2{^V!#-or#B1#NcA3eD%*Q25gIi+daORu+fJ2`nde@{NJ&DhkD zkqvwzUE*!CGAaTyY{#p&lzd)_gj-AA^X)CRm31_coB2Z#~GUYc!o zVtT^oG~w{{=WVY|+{+!Bzo-v!#^<>+yY2Et z;5fuKi<*xd!D5|cE2n(?UX3Y+s-SswuY@$oxiuU${Y^GcD=A3(>FRddH<;a>2dGn~ zRU7LTwQP5=g70>~#LmReS*WI6I26b!ZFh8sFxG?{b)W5&VkW^(u;9` z*`8A}T5BT=mbz6T=LIc_8eH8DNyI;>Q^+x{(l@R0&;v%QP_5{Gmw};FJHfv5^Tq-l zyY%G8b)+@}2I7Gf(U#P}Fj(Oi4SVNG-wk*7)mwz8MMXt7*Jibw5={pK@8kQO?+F1! z1EMI)n5EBsBsDZ*TZ*XCo-dl(+9EmsM}iaj>r>jM<^->vZpzJrfaZxcb{!m`Vm)lE;B<2T-P+_cu+aIRZ% zrv2Msi!x%rGdKf3rQ90nkD4=HZHRNWfl+9&(taVANxecDfE*cO^{S$*+7r|Dg-W`g z5JoyDa0ZVoBFnVCUsU^;xk!9~Wj&SF?`WigZcoDBC)@lOqgW_Yj7zh*E(3`Gv-0#n zlF?gYY~V51uLr%>5#SPLMIjDSNxR3YO*OS&QIYL{9#YJFY)&fk;q~OiyrpW`lvmi6 zgr&txODj>^rB-e6S)fHGimLnxy|{ae6g37|@(B^PI%23v)rzXB8BkTk9qb*)$nLNs zs{Yi5U<67Pqx4Vrbft2Vy|)8Nc}V_Yy1iyau~tpWg>suLt<*!Y`1`eHaAmYJo3-sp z@6v8*21`A4fWr9cZD+hrQf*Diqk$7Ol0O*WOsUsY zu8STNR)qQugZ0ECHNRt*zKn_aEQ9pC-geoVQ9isAh*q(O8^7uKV?JTjlQ6a-7|^6& zUpVTg7$@#j>5Ll3%%17EXd!n-fRE1}wT*YCj=h^uRuRcG9|^!bnf~TlWq$8oIda7y z*s|@N)}RiIceu|^YpEScwDF%TYTon_kRXU=taOCrB;?5LY+Ml7USo^Aq$Sfq6geyH z6mQ6T<+FD@)ZN+bzG5H`7b%8pI}DaOGSHHoY~9+#{T-mwf$;3A^)%&~~wFy~gs=k}xG(YbIt2Nlfg!7bvo_vSMCe zWCTpAHEU-&RuQ%)9XLs!M;>7*Cf9w$9ER?qR|!jFR>VZVNkhYX_iVQNtDe#zOzi<^ zAG*bKET#UFwL&TJhkVSDWds*TAat0U=j!4jOk@VK4-ut(m#*s_O+3EHtDl`LTjj+k zF0Ov;*gRlv|K_V)CK|bikmBZoY5Epy+}Bo%?c2bqdXf+~N8NN=OMx zQa{?Fpi})!jm000RgI4;rHul=&l&UTVbf+-2(7jK;5;A>8}VL4{ITi9s1n*mOc(qHyA$%mt!BjorQ2oD9UX4|rq+hn$xO}8%E<<}i%0b??0T>*Q2zn@aK^g>8yAD=-96d?8C zObsA%M^Ypc5^1&hVp8Vqwwp08hI+LfH^xwNfuD~2R1Gd{JD5f*03y0i9sfXTjn z-p`(0RMo`S=4BCarW5A1@epC9!@r14Q(ad^kN?orv~1l{Lccq;Buer!J6dxo?`J)= z|MOG3@Zo~;fahCMRKn#P^D6alxi~H$-VF_nEr;&eJ=|)VR(Qql<8%*y1L&4c7M)sA zk0ZHSMHmwkQ_)AAzwcIWT8lY%ncxg^^&ypF=HF>qt=1_sGo@098Za!}C)0O;y-)?X zKUP`KpcxSl%+4#SfHkwthyLPDh{#V(2f z?*lCzJUw|0u@T4iTwtq$BDHcsQ1i1{E~HX;b_~+zKr2;&@tb1zg$kO$xQ)MAh(@(E zTP)}g;3z>(2z`hIGhHKj2j-3OH+E&%`NYIP9TAM?s@WdCJMjJc_{Y+}v#H3DJ?NtGzi(E+TX0}lu_YW0 zG{SKjgU0sZQ+H{Mdm9@Y{KT_o&+39OA!ozo<*`}$`>{;P;1J2QEsE6*LT;|0;V&6D z0~`iwlaQk}z_AU@m`ZG#AL{)6j>~7;TLqnKDi(6~UZ&_MGx zpL6GrTAcx4Hmwd1U;1hI^;A%x@aiYHKHUs;_9D?XV^M=I&wS|bC;fhw|M{0>*nKev zc#CzvKhoOCnfaHhhqo{2Uj?=DOFPPphv-RxDw_* zG#o!Jkv)~ik6pEB`&OfY}?%NkMup4fti5euYp7gI!)Fi@3YivrdQ z$_;|&#C0+ff;{8BlRV>q_*7vLBL94;*&}6aEbX(s)%4}d4WOct3E=&eK5B8vkUlskx(J`lVZcuh{XvJ48DPl}9ICYus*F)pHC~xnNGrMuS zBb^`?E3xXcQ%hW}KmcnOmxiegc+@lfIdQxc=c8L4{Ew{P@TgyDk64^Ec1EN@T{9g7 z!(Uo^TtO3Zp7*^{YOv#w@T(IASa4Cv8{13kPoB zliyiPRZo)P#=Gv>br-)KD9!50u$_PAgEdPvirO`s+j;kl*PsuM!`@Xid3ABm>Z!2)G{Q3d9quSBx2@~Xb3<$!pFml#z=)27C^`st=*1h)jhWq3< zi;tTdFSf4b=Ra0UxO%7RmM1KQF(%nm>1tYf%&^yNrxsYw?ky@C2-vK5K^a%+zJwlT zmt3x$nv89eG&C~e6=(|!@E@BV;Yj3|4DK5=;+{YAly*ZsaYMz=bM6CI&6=0CY)9Ff0Ocr35LIGMj{R)brHm$98?Lshp8JOZ_ld zd^M!O=LcbToxNt5L?Vf{V7Oqzo1#UX=S|w;q$P+br=fB|39mAfve$}#2+awpR2`#- zle9?%g$ib7M`YzL)nVebQX7kDTfcG< z%Ak!3AHU_w(ur=jO85;#Al-OATV-{n=E5Yd0ZY5G+FCg&|J66S=J=Eup!?gfePj|2 z>g$bht`n`cUl&IQ^8=oP)=SL3-2qg*Geqawt__zlssfEb-DRZdXqKFVvwIhg95$|P z_TXm8w=>|V5Jf_H`G$ivLgR*p0uls1J^RLUItri+TVw0;#XdbeKz7{3&ysK@6hfAJ zOt<7b-gb-!y#77l1t2cShG0dzd*O2TypMSEoGgKAPXPW!w?sSg?EH3a+&tw76EBya z-?r-1*ixrQca;XG>9xQcFh{yOexQgt>(-I=AoUO#!ciI7_cHDSZocy^)87-8h9Zem zCEvDRz9dBz;Z&lIMME)LbKmCFM6BH5f&v$*z`bhtDEw9$9qyOJ)*3C8*GK8U1U0CT z0`$U2>D67Y5r{p8rDBIu&Rsc25&08lI*U3?UjfY+Zh*dRb@Ivn2B|BjDL;m-Z;egO zwxV_9Lf<8s8#m^<^MaI=?)JBU*WcBvN$l--uY|s6F-^P5AWDt+~(6yn2j_+AcekkI7`nsWzC#R0-n|RDS`!)+R2?^&n7jfQA+R^N$D@B@wM($Wv<^S=a88w= zd1dxIf`B-jzk_JN;z6EJY#J!bB8om ze|zLZRh3t6o|m#V+TqAfu)Gdb%$cOWliOGbEF{h94Ylqtrj*QGXzmEBYfi&pCM&0n z1BM^6&J^DP1iIAE8#MC4ly{XGISpUGehkq{dy_FRf(}}^K2R8PB=Prb21-9t7DwsN z)#-Y8rvx|+C2hhy34+CoO1?RP@_=hYr<2hw+xjC1_2|2E!$_`P>zbQSo@8LYor#Y> zat8mrOADdZ7a5_u3piVb-sA@dY8HRKC->mW5Foo|J!!pA4G#b(gZG%4ta(N$4{ERC z9kT#0pS`_+Y2j@cy4kk%IIiuRyrDCN9}#Ri*KYF==g#b}lq98M(&hZ`Lp@1JLkMTa z{sSZ3r2@uKV&l~IQT!JDq(J9R-XzXWv-4Ku?vi}o?vNBTurJ{V3*vFQU%Wl3TX6FrqEpWm6!cApL8F0wAAx~u_pp9T zH&Ef0A!u5i_RGQ9zS(+~mEwhHo!SVlxg!JVay7n`8ZSjqTz-}@?TO!WoP0PTyRK*urw`W3jfKCGypc2}|#AJM8A|3d#oXh6^ zDNRk6=A`q@b8{OC4Tnzlx?YqrLh`|7&H!Bi4~A(!WSInvRR7aQLr1FP{GAnDMzi`L zpL=O^3G$1rJ5Sc`e~=^lMy)-jl)~FB?=@avnG-64a1h$0HaH~U;&26L%bcw%hM|G3 zXw`6qEM4Bi`co&_!g0Q>b0tk`0lB$Ol_+Wc)-AAP<9pk9msGAS2&Sp9I{wal_${Jksc*#@Szx+Hh_ce9*Wrrx&9alc32xL;|ULS2U+g#hG$uJ+Dzj zVF!P40j}2`hKvIO20eA(ygJJMFv_c8MFaZFJhXT?@nbsq`}b>*I;)`l{c%ScAMV?C z)=cU44PBI5WJfA;n$1wYIA=Vedm(RO8k!ZM)4(yyqAjwGi`3B&ckVjStR6w()&usf zv9S0AdYoESDLSo^N^WVzeS{ggpFmGHmU4h*YGSfV{4(N}FbvQ`Fso=Uqx?>C`ukvZ zLsoI8uZ;iH+k#R_u>sB7WR6sYhsy70a&RP)iFwW;wuczc#&efbHwQaZ(0^W-Kh*H* zwc<1)rAQ|hS%*UIto!NFTYjHL44q|F`NvSRGMmx!O4@dqWXdsi>AUD>jT)Wl@1uKj zQQJWH!i_XTq>kUK9C6rfU|>6S@?a=nrJZ7C&IN~o+W10;z;e*R(uN$Zqv`{LADg}y{g?xB)6rE>|cS3?^V!eobTU%RpAX zt?t^9-W2U}j=`JPjt=f6N&v^)Qa2BoN&)O*29u zL{68d?esY8f@D$5Y4#cb785f@L`t{q#ITlZ zk4Ca9Tvl66|M){HpZ4U>x(lLiTdGQEAfj97er*D9sjJHi$;3J?s&zvZk2{sD7tAT$ zF4_`s{pFEm-g!&%m4XLQc)@j=H~_CL+?N$783?QjxoNZxYfv_?qciDu=Y?X^@bEBy zIq*C(W*0+}I$z#s#k=5opf{jiNLdha}1fqE#z_CLx^CR#JJ@O}|a=t;IP% z0`CL*0(N3q#z-iub-GkkqSxk=<%X%bkM|fjrA)w{LU^ZB`eiF!Ia(VY2)9z4_!%N` z%cCLL8&t*M3a%P#j`tUGtB9cnMWN3z7jbTM^f;nYNIaaKNk1iY7d_dLkO$27=4NCh zFlbyeKkHSHQmz3n9wA5?`INBXbs~yQ?Y|=ppd`BKB(Ayq6hdt^UxfZcp{kBFFm9Ee zZRMoCiKLmcJ(p02zK#TJt3gn`ytX#^e@kjsii0Y!cbgRj)I+X4G}lj=kQ~38S;)+! z?)5PO<-o9R!KXVVR#aBFx!WLsF$ThJ8x^s%6!rRb2K46T9Vvu4i`E$>_WhRx<;-B6 zy1&RDBd?DH==3F@v+!NGiZC5wIDOph<`YM-%&VPLsH{%)WFNF2K&Nj_<2kVd^g`1+ z6>dhQ?pZrKEt9;VJsIk8!+zV3Xq_=34+A3T%)oj{33*jG^){QK zttH@V9lxELURiDx!nvQZ&{XI!lP&S?`svWaz%Hj+|ITLun$%TG-`w3^>%k>dWdelH zYf_#MrRNw+l_&(Wo6M5!&DK-V$x!X;u2<<@eTk`jET?o_Pk zHV}=OlCr`mYte=5LKx&;;V?Ck7n z^R$L2a0JleM}N+!OiX2J%0NHI7|#XSEd%S-yI;nhL6un^)^x=O%6rKEzSlLnKGg%y z^tb-V7IVKSBjww=l<#aN*aWD`l#xWVR$CqvQHw2i_V0LeDr;|aTvgS>`JpbTw9QSD zpz#Cy0>#F!xyHUJMMXsoR=b2lfSj|ue*%CqHR$o9bh1H1vxp^@JXGNZ1MPE>JQk2) zo4ME$yPi^y5X&aP4oq7tRvA+GYY#rn553igqz}R;QwUYG9US6^X$yf|N{+-5m@cP7 zotIvK#u_QEo`TtZIDI~0;iVJ`&t*xaRC)Fs3c(pLRV=u|!Sz--B>Y>bmj0R2x>pW^ z*%e@8!Fc1>l3O?_=@?`w@NX)rP-Y*EHh>uqylZSy-t^vQAn>@xb9 zgNnDDvVxPlDvpCTZCE`?r$CF(aZ;Y&uKlFdq}Bz3D3D!kVKq+p6AiTGxi8I8=|8#O zQNp{D$T?4)XQtHRN+9V(FkmRKeD~%}7_KU=vU>TQi|)?*XoS@0De8c3BB}{`WljU1 zrtD>$1Dtn~)_W_}>=`(&-b1j{rsEgH{3iK(YMd0F1UjwwtWYH);v=%5TS!kSlmQBX z9v)#UfR%+Nw)F0R;Kd(d>W2mlac%2OcfcA~J|2B$RN`>ifW-i**kNX7_Fa(oA`bN@ z1@?dJvOubglFA%EaDg_%j4wdcQ&(~)qrl=zWr@AV&+>wH{Ku_y2t(4K@k{QR%bt3gUF-2>z5q!9naIt~zv~ z+H+DKNW1~!cQL!67o7hpuJ(mSAgbccpDRMD3-qV>lTUCfPg5m^HABHZjn2f31>AYh z+#@l9N(GrB?=|md^S2e6+uBUU?D{%C-#7q%@{uxyOvbLudz-@^N9r~trI@f#3Et}rPt&w$F&(|M^S;gHymdpg;W?f&0-`Rg9uD(i0iOZbY+QFRJx5-P9v0#MdLYvWWmDQ!xnc76 zl;^%{^Onl%UtZH9lkoW3?MY)(DACKZ&4My2-37UtzE76#@p_C%?awFf_hJ@Yc zizfhT470Myn1M#EUB_>F-8T^GPHh`jV_4;#s#^eAV3garE|Sq9%9bKm)D9xH9Aeo_ zt5B_GI;7#V6w3;yz!;I;Z|lW^=e4fh9>p|NpA$%HyGK{`gly;h}yiI;B#gQaQ@Gj;8~q zLn35JIoj3{xprCQ!IN@Ckt-y*lH0m>bx_KYa?8-%b#w&A!3Cx!l(`6n+J}+%k(ZpZ6#=m4}p2$!ZyGx|26KyDOt= zW(-HQc7uXqUTt8oV%ahUA4w+fSnN7jmHBqtF&9R(96AcMw2OIYh3}}J6_<87pY4(f zwY2x)feOaHY-~Ja7%Fk1)wcE{^h|5S!@3AlbS$SnzkZt?bwEbV6{ zEd*#@e3N@esSK*H&z!N!f$Is|>$P)j?@UM7u6f#Lc%t*08i9UaJs@E1Fpn)`9pyU7 zRL+8Dg+XS*ZgN*Cp>;#gJ(8o({Y_;$0k=8g@NDt$%ALH^b@bUzd>>@`n(_1nFA0v% zw7f>syhFzK_R$&XhA~?(B$_i9@}}6Ip`dH)T8431hQ)=);RbhRfHV*fIi-Q`oz~59 z2ND*4pnY%AhSSZxPs9%&X!39hC!5(2Yv7hB3wr$E)!LuayzkxD%=pRMtq`Jc+pBd7 zp2NF~3}a4dzZDNsFIU&FB^$+J%oyDhy>*^p5L1*1aZ48&ZE_de3hM*%GI&8PeQmua(8W&J+Sgxk$| z2_sbph{bba^Po$b9MCt*n=Eq6@?^(60@2|^wao8_@qI;S;qJ))Q6mrTYJ6KEy@0|A zb)%c{2yzi$_niz0znZAx=33|Slm&1QG|d~r>i9X0#y5sgb84#nWhXe#L<+zeJ-{uB-&Gc$*$e7rq)XR6zAiMi$L zd$%j@JqhP9NG;}>^_qly!>@epH{uO9I0Cv=~U)}Ex2dZ^y56o z4N-^p6r9uaKr7&x!D64=z$y5Xhr>Som}Qhw?G<<9hS;6y71!Z4+>B>SA>})BFTaKx zQ%fF-GJM9tj0J~@kc zLE=eb3{~)^sJyduwOPkQa~zK}@R#hKWaIkHWTo@*Jbw-ls&umGob4%|W5&(A&9FRH zx#Pk0Sk((nD-Im^JJ-4B{+j*H(ZUiN4h!jA==B-Zljm2AYW8GPK;_`T;JL8x& zR>s9uBOUB}7C0kyX3gi){-hR7GhOCqw}daORS7MPo02?t`#rXPwk?TLnDq-!HG~}o zz18G(FYzkkY3HwKyoeQ`Hz>V0SbS}K``SsX$#bnoq^EYD-JR5&bSgKmMPPA`m)seh zzYdSivBtWvq)HPCK*Pu!oqUR08M?~zDY6i#g1>H)`xz4?G8vc6n)iSx)ib z;vX5jM;e(c>H@Up^m!#A$HodMXoOS{N7J^FQ#w&uwvm)vv9+^zu8YK-Ui%}-&kw5M zjda=Ms5{>*cZ6LESRz+*VT{c1ysQsha1?#)`xKK3;_|0vB@cii83!C{LgM$YyYiPO zxRVzGY)yOED-3*FJ2AyGescqsfh+pvCT&XzitOe_sqk-an8yNjknS6_6!uyF&887y zk(L@5@7{>Dk)C2(`4_Helc)ct8Kti;brYgH^$8)5M_Fk!<5)?-{M{st?Hkp5Z%9t+ z{OlT7ak~iBBFx$D@<(ft{vNe!AR{5Lq=ef()T`Z(6`m)|KmBOgdGh(MISOin61~E7 zt?r;^4%ly12@_E*Dt-vE%l%b2s67(`m+0e!h~wg%Ca%g#;5pGW`16`PUjLLwuexU@ zhK9AZj+XUiACY zEq>7Xq+SnqG(rHO3P<{UCHqXth5&0x@yd!xeroN!cXP>_CVt!_%Li>KxCT+g%SMHT z@sDVY2@8F5)4)FP=i7pxv##naY~a1-uMxdTtEG^_CuP?_EkdGyrksD-rxB7m3~HM9 z%UDmhF32TS?C$n=1Y5Vte@y4gxB@|U%Eh@^4b2)?Hf-_l%l|a(F_8WiyQ5Q%_!k>H zxzWCT;ja*DV~b0;+i$c2c9aMatot(PvDb_cq_9a%k;`9Yf~ z4NGoVxsMyUklo$HPE3=)C_Q z|1wa*@-Wqiw9N#>R1rQM%~pTSc%J!JOh{!R$?wsOcTn-5>YiPQ-4pqhfDpUrpg!oy zd^Cy;@2M(ZZ$SEBFwL{o{R~tolh{VbVDRa(k+8etO@#VSSv~L^B~2d;>J5JKdhBY8 zi8yVDbTL_4X~ebp*@A2#yKcF*eO74nv8uSVl69>90fO8u-ohFbog0Zon$o~)L&IK0i?~Nzc7Dq^q~LFC69$NObKsbCD_Z)PJKQ+u2;S$nG(5K$-V0)$@F;HpH zB99GpE#t3(&b3HW;30?FkAy|kSDKFds0qi3fwuVS{`kQ*2i6)^l>It3w9v~I%ZC=! z1FIn{i$8vAWkSZR4+P-qf&4IdvpDE9$lt@96{PN3Z((bZq!1kj2nCBY!={ftuaahy z#IQ;nvLZKZw**kWQ2e_-2tvNC?z-8$vup_X)oz)_nj$jhz%9b8TNYUp`8;B(J!t+2 zi;}$9U4k8D0LrL9uDV>B+q!gOVU=KnAMBXItz_al*iMSv5h=uRZ*c7denv-N=tA>p z)a|IKg4?}4rB8uh8R*?B3M;{B4dn{)*}~ny3Ayb2Yju7M($VLj_wOKEN(oIQ=&aUh z*SL%z;)e046p>&VT@mgp1}X1bPaBB22n_gZ*tpR}qOH{o#bSc;2*u*I(Q%FjPul51 zNVR)^b_#lM&C{+k{#oPQ8mKHB40;>bbn|)1;j#0Je&0$9`(k#-72WvNloK7GcX5!_ zC$NHT4h%;v*jRQ7Vz)0cVy(lvaW{Ne8)@e;U4gVKX1fGIZ5udJ25kASmJ#llJC@bZ zE(W>=kmGr*L92^2lVA@)>i4r&6O?4ceU*}=aMlOkG5h;O-@7@pSnDv;KXNz0Q8{u& zi3L}^<6rMjMC{oOmf@QeC3QTZsWD24!?%&PHZzuxIcjRe_-u4Y2|TO_tD_NvCW3ZLK zQnkfya2Ky_0&}yYN0C}wJi6l_u0YzdeVQ2Wa@-xZ)4-Cpsyg*ZRvJe6ca;#!P49D3 zdl;m;_wzQkQks2C78hZh`ViXntlr!0e|mIZypBqs9K2ZiR~QZZVl9REk9B(Eux?0zUa0bz@vv>whOi>{{FH2HTC0vMX*{N5(~vCl}J^_E%D*hp=mArTM(~ zApC1#F!fDdAE>?=e7y%sjBh5+VZ_s>qM#$5idiVm=6lRiBqN|!*D+E68J=XInZuyx zThBxyv^4w6` zF}qGWIx747IZ_d+T8YWmc6#Z7Y?N~AK5bKo8L+EacuaM2sppm!M)c4SJ-LDOX0`Od ztNbBQky85MF08YSQH?`&mpD5~VIdks^0n`dWOWp z*^v1K=^paPR7#aZPCXO(-nfNdP6fp)1BV2Kvd#x2{L%ET*bNWriu-?os}{VZHl z+~qx-IDF$o_aRSqePhK=YyuFBs6+6llettfInvQRj6 pF>H86tTS;TMlZM!gJ=f z=_Ldbiu4i!QUXc@PJF+!-bZ=P-}CRg*J3eArtEUf%-(zU-0!qCl>z5~=V)kX0IDjF zp3%^p>!hKf^EgXK{YF9Xf&ld&y^D&WI}Oc!^*?_nvSkzUsb8LOf2RD9rlgN;h5F&t zO9c%D8X8m-!*9#eG-nDCs*e<&d!JaF^a?hyX*}B8s3bMoRvEF<#PvnYi|wQr9NWEC4n)NlfhVc-{PkFP6o8{h!VkQX zFrtf_Io%5d2^VK$EiYesi^V91Ubz2PRci5zca`Z)%kk#b{u#y|CUyBy*Oc}}42YS& z!}jdIHE9kB6HtyISglD=3>Vn?#P}%M0MIUQ@geG1y|-hw9O6h!g+L;tp7E8!`A+7D z)BjeHzu_nzRc|VQ>lNvw191{1`W6;3k&D8*|5l?3o*Gv&Ozeh5F~%y;cS<2dvA+%M zIl_gLbg|TI_s+pEt^#qiV&CZuw`Zt=j9f%L zIzDJi#mItNfCinN{0T#hYmQo0hiB8VIy500fbE(u3vSTFz*R4KG>DB->GR~uv04_( zj-pXI`>e4fefb2JV}hrF8#XJJ2QYOqBaZR&S3R>%g;eT^r8Nk%F3*w}}e+io( z8!R{`^P?W1OK-0-#@Kg8qVE|O8^gaT#XVIf~{2cah_{}_&GBFvI~WQP{qbTM+Z<{?yK#Lvwb z9P1_`aJa`xb%{?}?Ek>S+vsfPv3@KZ^F*RnQ2gbotk%~U{<{bEk3;#7(e5E@U@p$% z5<_KwTX3^^d}IgtBQcr(7AcCajXGflA4~`frtlr3?aSDlNK|RZVFn3xeNj37*snBJ zakiGZ^(G~&b|GsoP8|ESLx4ZRG^_a$ZTS-Ye}0nxpQ2TQx{fKaKyV#6n=(?sP*QiT)RSHZ5c5sPZ{hUr6rBaPZpm{~}K=(T6SP z#Q2?KvZjeRuLI)zZ@~Ptpe@%q26Gw~J`==$LF?!Dn*XY&+#sS^M40JJ25@bQ@({g3 zv(Znj^?m##os43;WgfkEGZk?zH%1_ds0UZ7`Prq;)5N<*y>BX=NX*zWjH<%*MZ5w1xC9r8z)QvgC&MHVq3D@CyamApa)~( zqt5tFEbe6bIwe7;`?!x&1bt3t4Pm`GGnSUD5k@G$W^h4bCnqs;{%)l2bk=?j#gSDd z5)*So{j`PnN;AA=xSL72g}@2JfBO;IQL>TWO?YrhNml}_hO{ONkL~*w0f(?ZepswP zxQoHPyN}vX;wGy^Fi+vk7^OLm^WP3=+FI^qM$l>N7jyi+uxc@Qb^NsZgoyLE@7CcE zRtkqV77F4ij4VE*w&X3O*m;eA2M-^k>fG^%UP!~^S^-flj_u@J9Q+tr!7Z~?Z1Yy; z?@Sz#_wI?|*`fT6E*Utuyt&y8;D}J(x*vJy(RD_tk~cUo*@tr4ebViSd}gX+|DEx{ z))w3)y?WZyIrbQ-5hwb-k9=Z^U5GkG$IDjOC-IG2UEoI-Nx!}8U|KbLxOY0_v0|~* zsKU6u;Ss{CcfSm3Cp*x;rX_I<{1*4GgH9L%0!yeUYbh_Ok)W0kwDlR0{*du6$Cf3b4-Fz}_x)-f)9F;&!&)X(+>6jTCHFWQqI1EM zCH^;W<5D)_XrB_sj&9*}3l$gL*;Um!48HGWC@|ji%E_3~?GIb)|7?_>qq8Y1@Ds-}i&fOq2YV6Rl)b=zg&|a_^jKc6tx(W;IY_%w z9Edg%65paE11Mnv&NV!mS9{!%q}KA^GxE*G&#E5p2Gf=UhMa+Y*yy$Rm*k@zSrk~} z6WBnyFD0$o(00+~7x$}!wC0&1iQ26v&Vm%L`R#5b)SE1CXZ!<@xIZ6}S$EiAd^qr; z-#BRMk~+c5xmM7kUx6UEammo_)kZMx*hFDrYs5jBLP{RShgh1r`rY2`s-m2+Uea*w zYUpyRwad_7Khk^+P}>cI^HgQ;$}{p56{PtGSn!vfFXkBY_Jh=!ZhDsyw!Nu~Ut{0! zR`V$)3AREHxd+Wf#QtF#=Oq`%H9xW2lb6`1VO~`pXEB~*dvl7oo?}YdcY1!x`n;Gm zJ{8}wI}HI!!GRz~>MR&*cCNpxxv$RpSot*^M3HvJk5IniUr}dWV8DWvY*>mPgF>mV zlM7CMsejmN1ImaOAjH|6-}_yMzJLQW-v7b)uP*5N-=49qs&fCtU(lEzZofY4ba+i;C-BUJN$XUNQ|0!^kM3V48rnP3ul7cv;g3KI| zE?%RgWgkYWQh%8ch1c#LTYrUGm1H>UZQEX*ej<$&AGaY`__-~7G^<_oH>a?ShAqr) zP!zD{RJ@8LK781#0t)@fd66zYZTV-5BPUY)XLoe#!>VMlmZceLCS{(rgpbo6JiK+N}3=dSg*b|2s{-I>+5zO81zV?SAj5|j69%XZ!M0whwG z>#M8?DzN0q*{PM%AOP+8PKQrARLgQOF#$Iv2f00Y`0J-xNbf-g1=w@&??xVsYP-kn z_|otwBp>LOD&5ZiSkmdEcsnn{qAw4Bz7>mG*J(M!T^Gu9U2ig(t9BcIin3QCqAb_k zBS?IIUgoF0ViSXn{3?@>_x?Olp?0fiN^9;_C8nT`i>cEgiF~-h(^;_ey1cM~2+COU zUYHAzMuckuH?sl%@~YJNHutR8UIo^p#RU3ZV;Lq54T}UAO?m33Kozjj+35VhK*Q}% zRi8)2I8;O-{iQd=G5l05$vrBig;kNSGKunZUL)Q+trNSE~41ClR$sPVPfz+D%!%)eRxVkbU(V%+qA zvD1OmqkT@HcKK0M7H>U1&G=9ye8NY=pWxno#5^YGU#Ku}CF;z40%iYdBqMU$_&q2QtE7J{X_CYmacj9X7l~o*8+n}TZHP%O&VvIGqicP(wexIK2 zjs~ML$uAIs(NaD0J)cxUN+J7*j&HnDCh`QN|bYIwf$VQ(S$QHw&3? z-)&G;_KY0K#PO`xujIa`TIreFgF2KoyD|sZ0D68`DaxknwCihB*YvE4uBl&=Hf<>I z_D;wB{zeh_TA1CjT#I7m*DycZ)^@YOG&YWHoK*BY;>Rms6%#_Yc4WeZSj@qb^bn>Z1UMMp9^vyxqwx?k*K zO)SwSG%@=x%B5{2H1y0cV3_6&n09_r_5=AAt;ys}_?8sQvI(Fgnf5Q`ei^ua`h+1= zKAzUC_cUom1jjzjr?A=n6Cc!e%XK$>be2i`%07wR?Ljzw<;9 zyWhH5jp`-^@RwOxFJN6(3d~NHXEwU(()I*Miu+FJr-5d>eV%V8uXL$aJS{;li9J~j zZF^>fZ8EieZ!GdmxY#n~lC{w0+`?m}5@VzLK*4RHwm7TXR(L=a^0Dp#h%Q3mfGv z8i~eVF9pa>kjdGYA`G+817wd@lre3A0O3b|i-pz=k-0%(<+hsrgb__#1yg3Nq{x}w zB%|s<*VUJy#%ERsucaKsy{ z3NQQ31*FR5f>MgCQ10K~$7a|l2$5DsdKHrxqT(Iy5wPsRG9A}62^q&-e#VzYc%sq#blNeYeyjR zQOecWO)>CCcgLyHAc(iAc_HK=%G{B*OmHiu!mkTf7wRgM}@9Hkc2{wUXga2H0^aG=x#zc%p1i9=~T&$wDjMuE->DI zlAS(j9OCrU$$FaVm?UkI8;a5GX6}K01uuKyX-lvc6R&hu{qtg9WiI$?`ZD}fnmkH9 z)iN-6VSG2X?D=!$WLpMzS>_u{om20lM?jArz5^DJeNDhw22V*Usy1T{SJAJ^Zv#5* zIfcc$d3_8ySRW4mz$0Y2SWCjsB@H*#-@ng$#j>l*g%E5D4XEKiRj>mY!8tRi#g0#Z zI2py>mSD<7Y53Of*1glZJCZ7AJpEne<8@;njWN3Q7f5cMo~k@9C4llRa(RlFb}k@e z@Twi)#tm5ZNA>wjkPtrWf@`0{x-*`e2cv$rp2f-HDxK;fT z^?X#RBQ|z9c3h_s%vrc3A65EwBE4`m1-+fOp)OS2U-_YvMWlDB9e#OwlDTrbfO5Oj zlVC9`;4XmtjcA$Xu9=$|^%W5)aW@Bq+rBk80Z~2M7Ml$J2|azEV>AhonwYGA7j%W zgIi_Jl3?G_IB!oS%GgfeC!GEoD3fSDU7Bug*O9|zWva8wVbka1XduP>^Ger~NJr#{ zF;@iHOxLocH(-$^*+}ZpxCoQ+=GtVg`NydP2Ac++xpz2>kfQzXxMqZKOJF#=*KFHke*mcO0bt zd}E1kiIqIMy6ndr21?+*-?>Gm(*SQW_%LtGr*&YUqEsVm@cTzFNN+@HXyA@S@r)P% zwto9v=)z}{V#)xgQL2w~w;VK(kw9b9iH0k+`l3DuLGm0B~4XFN6AGQWs{K$2!lM-(a;-&I5dyoOF`RYxYM5pGt+i$1?bKfc-^w%-<; zJQ654&mmQ|3R>hlmNaOjahK1Ap180SGnog36& zgJR~eU()+RD(RevRvn+jSPC$unA~*s0MoV#pab?3YF#xX*zeoJUGkWc=7H`~W4@$g zNOs!8>MXu$@lm|q3%;#^V5{(t{T(??lMg)BtFWS;4TEqU*MI}$N&O8;sMgbRjXyYX|a*b@jV%@EzB#H0Fw}1bq1|oGHZI zpf9!FXxq4AqSPNoS87`9Uc?nBd*mCjDHjE}^0x_KVIAoovNr!JOr07&DB)+RwGA+! z+V8?Xmk8xJN%?$BBdVz5QCEA&V_`!UeRb@X)F@#Y#$uJ~RhG&O^Hl+2c5!1ar3fNi zeNGBWB)PKf2LgVs{)A1)zIh`pzOnlTt~VST#kCpj-w zXua^@{1YJPD{N^}6x^zcAAGNkSI&#)RAF!NVCfT_yro_N_dEI*#-bqW+(?ufEtS!v zSQdK_;0=gzb8o=SEV4*7g*)fKZljK^U=+^0|KgGtBSb5vWVomGC;>l)1Izm ztW!s}#^=dF&V2a8dk{QrZTzD5vp9UU{gyHw9N(wmWV^BVPQDYR(KzT*1mCXgea`9t z3-SdxSfILk7IquCB)yaM8`e8z>W$l~!H#SZDXg-u>);67(+U8$G@7K}uTut-tJ)Od z=NY5~Y&M+dLbbjXp!4>2Y7mEY(>y(3B5&cYTHF zb8%(dtw*gnc%wqG&?Kux&Oe2*{K)K<(Evzz8Fd**@Lvf zf9<0P*VYD-4!fsU8D>Qez@IGMF)D({dc`lw@O%v;N$z^?^C^aWrtUgls!AR}3&}oY zv+uEE&kNU;F`t+2@Nt*xRrMMwmVsSZ--qhKii!R!wZqMsGX}DyK87)HL(_^Xa*TVS z<&Q}lF88C&u>h^K?`SK$@l;?cQP|$y$=A*LU{$Va+z?j^ML5Z>yAWAGBPAPH^qRH% z(Z`e<9|aqiRzMtpxNDVQ;_Ak}oT;(`!GknLV(#^Z6DR&g?q<56 zwV(6fDsHw->n?V}yg(b(8b;6hDK!gCSL-#r6rMt%*s^>&P(4GAgZ#EUK|K@mIYTe| z6`@i9zvOX$-=AvZN@-3yVOOaZqCLTmQixVnd?PZyMZf-Rr zJO@cEZPz%~JWa_$5#8> zA`j~4YWWM@@X4H)=1fJhKQ%5^xii=nsmwwB>@?flbQmVV)PohV-u~ix#a-BB6y1iH z7;YGsm780`+sEp}!0C|Z?iM&-16nSiyoLLa-D59h>)XU5M!=8g@?SlJj-<%6Skcx3 z9kHV$jSDd}<{`D`pW~DtzEQOm5X&lZFMZY8u~=p;#liY}#C17o$6##}L`>@SWBv-J zsSaptkal~*g+W<<+s~l}wyj0`eK}xKz~75N{>VxjC4{si?iF3U)nnF>s!1J!d)201 zTZxm_UR*)OLZ!8PnWjO(>die9fQhCMB?`U`c zD~@8~vBSsPu~duer>u~KW&YR;PBqVc9g}s{1>VLT4%No6U3a?{G(DY55-?d_@nTq) zx3}}UEo<4ASYiWEPIn!lVfJl%LJQN`qIwNj*MnT1cRgvdRV`?hikCb|`NiSnKzm4n zE|8PqJgE{rcmd-0R#=c=!)gJGc!A)RZi6=8YLpz9N?Lt%&!9f$!Zmu2RsBH-Z4R9{ z=uuuqeL?~vLlwZW-_Urb7Ggw@h^Ny8eOQH<&H^h(ICJS-K|2K}z6_~h){Gs6p3=S@ z>>v3K$s>F3Ywe;}+9^Zl@o zqo5BKj^#y<|e#@ct-gq1h$iGxF|Mzk--{p+^z^rz0yA zB)|TSEgUQ>4h~zBRi~}ctpYxeI@Of9olO~(Z-hIOWxE!I$0yEb;v&$Ze#%Esw!biC zF~PbSTr^~1XHHu#Zo-TkWh>;*ub#NJjDA{mJJ)#zYjgh0niVJf-lyx?n5L~wi)u_! zKe1uw@~Z5??fzgReKG_KO?ElE;{ufT%T+R(F=Mdzi zlhEn%rhLfvitLL|+xlmc|xo7kLm~6Jn#sGz0#KTJ+!BzG0w%Wj6C<+vJug?I3|P6FvJjs>T1yw z4xF+;IF@J@vb%o+|5K^`sQ*v;(EmP}H#;&i`qPY_W>yM6uf~G=|D4qri%a|M_|b#8 zbqL=p19+=}Dx8(#b^T41O}lRp)o4{7{-;tA^`g*ZY%o!=Fl5qcm|$Y&v-m}mBHx;R zkg-%HNR+n^|Dm0t16cB`n&!h%^F9d8G|QJDA?&RvHRE7G6Bb})73i{mQweQ4*u!?T zoDN_4=6RbFp7DC>mA&uj3L8%#@(DrP4-T`?nN>UiO8yVBJ{m`7BwhMo!NWUhN7daObAH4ET4_^rZzc)y1Zm6q+v!d*qjGBpGktP(CEaLM zFS@7$)jKkLs}3stC;#hzAEnW}vz-ph+pTY=I26-Y7s!^iR6B;1b4}oFjjdu$H;tXS zu_|RQnZe)f(`b^F5jAXoa2@1a-VJ`+ha7^@mVhI6#q@zV4M3wf{Hp zJZx37_?tGJQZfQgI*O|}+J=no@xQW}o<2|X^r%4e`m*$%Fg%dj>N9*M%M2)ojwn>#gz(Vq@`+ey4q#}Sx5(mGI)I3cscX#6uX4NT2w=q8HF@1v z+SBXxb@6FlTDehYF{ehz28~UfzsO^!IeZ>(9NkfsO`j_n4L%&NPTOq?k0?HHPSt5- znvnI6?$0G*8q-xua{~m(qB~6=QU(ro1rqzzi7&lP-Lzwr&y~wQd&-{R=ALR#W7LMr z81++=SWY5#o47k+oC^6n{#V1)0*hqkVt8=X#meg7BDjgZ%+xj*_z7!autc-4KidQf z-i?Qg2^x7@3|BiT8weaW1syGgvrFy;9iRc#h0#THd{M}`ghcV3qog_pvcp-YJknhT zqz_SQC!fDStAu3iven1CDe^qcU)FB1VUEq-*wvhNl=z;^!t}dbO&#dhau=|Ng$R|w zR3V~EMO{u^Dv_alpget3@k%aYiCvihSf#)c3=NE+GtgBZKxw4!>)0oW-|L;^%EPe( zzO3VyVztAqSlzn|+n(Vr)Pg}Q$mEgggJo^8&Q)hbCxmxkW z@$9GxPCoABAL)r7{K`R7YoVFN)jKOoLjd+@-m&(fIV}!E5Kxtn?=LT*K zC3Ry7cP6Ai%mz5IdN88tlp(AS7foOdrFIM@eO40qG6<6tSD;;K{_+&Lp*MLp9%f7n z`OV^DyCk_%1r5Mr2N=65$9jN(234i!Dp-o1 z=Xh5MBtq0Sj^cWa!W%WE(yg>|zprW!k~yTAq6nz%tAtiIs1|~55*E2<<5)+B*GEsi z{2=M7V`c8-MJMTps%gYmK9L?|hNo+OF3`Q4$3*=CqF2?uHWXkStcPIP#n}&Sc zGoOYvPR76VSy%uBKujWGoW)tPpyA#2KZoLk-*vxZf_K_q*E;1xFB_6gjz(3@X{jj+ z3~H8;?h+2?CC}-pqUphA$yI?G(+|?SC(H3lt5K4XK)YcV8!`W@Vqr$pLcdQKX3uB> zCQlnBYUnm{uiS}&8?!$(4N-Ab&Eu!Jwgd~mSL{sDeBz?|qCs*uLB+1L;Fe>M{+)LM zlq-7y@zw%+`29|kRsCvxEc}nXNE-|s8vfz>7~0uXGF;H21TE8@8l@?!CQIDwm0%O) zi25acN0=EgA~{ey5CBOM_ieatPg;2xg|T6^F)dCvoVG*cj!#}S8d+NH@hK{Dcf75$ zkSx56`X+Rr5E|O)YUh_5=xYfA)(g00?stcK_8a$38^dYlEG2bmgQDxWNO zH?QIE$&bv;za!AqZRbp=I`O2sGBs@RDyE1XlcvmyfVySXI#(;PuHG+XM3NU#OZ{*w zj>OybFu@h-9km zchwMjkpxLX@u9fJo8W?!)z&v@3ieUdTmw*2zC!Al(iiHf&6b+cvoGjTay-H~q|;PY zJ(epM<2UKNe`7T=+r8Yj(H#E1FPF~ejDxA`-cr%M$v4j7Zt#4B`vv>A!z2guD4@)6 z$C%5Q4M7g%qOU7nqtO=-pTa^vXkTA=xA?4Tin3y=lRc9I5#nd?yshMp>N-dBkZeNQ z%J2KtlIUo_7^qS}3n1t4NvPz8c|{s>CU(_GA7b&;nvxa`<pW> ztks@kMyO|;-GRmR;5H?K`sCu*)6& zFSJ*<&at8hZM|M7LTr$8D}eVqW(TdTHP$VhaAA&ovzT&Ba)~ zgk$<^!%TD9twkTldOKYRq@2!oZ;e6ySwlBRNH;pI&XGkgNS$C>qwj zA$WaKGs@VAHH4k@8;ICB9jM_DZKy~DieMAw-zRq(<$;&VYrgha!n^76$g(!N`1inH zE|cbZ1&pkwQC+sZ4mJ9;{l;ErdL?8%*Ayzy-94}(K-Ye932y$Bm!HHaFZ<|cIE1{9 zwuDvaG4vXZ)k!-}7j8FB(yMCLVZiMUDm9fNjv-xj=Np;ahD>5SjdBn0PGCM|OyY}> zr5MQY^hDt29kzPR6#u_|!gXEh-fr}ZQ1U)5ym|V5h=O9dR>Rc~u=Wt#Le7a{-fLgG zUg348sz-F7aqu^Fff}q{luL&s`w9C1JGwQe9xD{d<94zC%`vEsQ;}|Ah$&qPEV36V zvb*@4))M$IeEac3FW|t0VL@bqrM*4C$N^%bLtKD1-wa6FD#zOv&NT0Ls4VL|@KRPa zXh?G*;PRELhZp+~={hQg2&{scmGRF)5bJ>{-zu%EFE4~UPF*jba}aZ{veEBcH$HNr zsQGwhWr*Etv^v*MXFVq-hCeiUkuo+=G~}LXE^5v?JdaGCM@OcjD!D`-s9TrTE*ifE zdN8SLn9d*gni+>%LBFHFL~!$3dgBV|Vu`@VcOl$>VmynnA#SPz$ex}HOB0C=dr+L` zE^7Z;IhmG=bx~JpgBoD9QF@xSpo_`H%nH7%JV~5b7htFcWv>>kN;%lA9!v`nE;x?9 zTc5@nEwUnfj0?uK6iVu$#!!>qZV!Tck-Og0%nThA;48oIQITD+{*n;BT#8LBx-fmk znSPwkwDDzwa|x}i96LlztO)l;w)qYz!=U;ea|t%VI-9=-2C%%-vpweGsDQwrqc;i} z36i)Uj=InRGo5`e50agB6DNlM9evD_*r^h(Ai&_Nr?FSq+Qc$tr{c3lv#%!TOX~Nz z>BoO-?j+~5K32pr!f9ultbS{;hJ?$w2gq~?FQPjVbJY8A&EDbp zz6n&(AemP2$YvgxHY~LA;bb-RO$2=9weXAqfM%5ltl9RZRHs$JL`AWaGuu0bI2}3{ z(|OxE8>I{k+HSQTlydDXI*h$4)ouS#)a8Zhej9>>e~i49V~DMzbP;;oA>4K?uUusJ zMkatGc^d@#Oo01CEp)!ZX`n8{SH?G}hjEwZeI4`MBzVUpUAnEef2EDu<6PV6*g$JC z*uLQ(RfLYA{wLz@S=%hq5AZKco?WHScBl~%?1r`>U4@UpRuGo<&AN z7=Bz5Y(S?Qg>E(5Ltd?QSM^UUg-GmDGs|rB#kVC{0PO+UmLh;xy$C}Dy(yzHL7*z& zDe@vW;ZajxU^9uTmQQs3tH1HSt7Fqu?PC1xymH$d0K^-shfY(Y?{xu*y=lzX-`0~M zv(iYtVMeHP21wt!RfCUhS-E3sP61|N;e$NxY_LcvCKQxv1r_pF z;jb1&^=*UH`z;{@LK#H$Px^Iz{&HFb|Ho|zl!wV1+xx1;#b1F_SaJ@RWhx(l8B!x& zG92U_lX6=mbKqXf=qdYEnuk3cqA|naJ#t2hiMu9VgDeG>J-?qoFOk)5=k)28zFQuZ zl50eJ2#`(AJd7zTbjrj%8R+qO;cqSAk;>B%YQmSiXOmUiF1%zk9T%UIz7W%q&{;PK z%OgJS_tHPQ7y=FJeRrys^>>VWk-{_R1FSnvm!TX%{B$!)mcxrEwej98YLGZ?cHXp- z5fTlmf(7_a#K2c}_mq(avgnJoPnSAO2zBc)z$&>IQojwl3OGePP^H};gxgJmec61A zwM1}*a=E0YzzTEBMBHo-s@;zpB3(QT%h*O*t=~|kN7Qnd3{BkJHOt%+kqwi&mC6wC z_5Acd8x4)DizGsHha5@kK@DYQ-ujb;+~SDV)#ryK@ZsQf0j2~8!ByU|I@^FeOj*uQ zG>MvEDC<h36=JSj&%Jdo%rDP0vJIrRs9wqg5O=sBavz9~2=!F%{<*IxS~)XnYsh{mAEi)Q zZ#P^(r$s5haWG+F;5asFc4>W3G)zix_qSAxb_r%~b(mbRJusR@#2-&@HekGMeb?Q;>r(zCFdo`k&>Iw+1vaJH&qJ>t4S8Ipe#}fB)c~^cVm{sF`k@7(- ze~&^#v*WOH#v1#7^5=sY#R1@{+CSOB?BBgg_6DhuoO0WMF*ski+XULR@D&A)x_1T`AbVw|Wr z`0VeKZ0e=1pbXT-Xx+9+%{mK&u@l8#2AZ}!Xz`|+9`m=!N<$-L*P$s7R-=7)zL<&0 zP+O1oPqKO()j&NraILV%*TiXbK_16*{LTy=c8sC(F5qT~uYg3J!ZSzF@YssbpUwX^TeoahUkrL#W6jgh{Y2tE z@ZWY{ydTMXvKcn{*8;vc+}1$S@N zwx;P|Jy|~YMYLbWO0i5m;eJd+1f$RXO721q(kZt2_ktihI$T|)T46jY02cCdNb5tl zVDm&%>Gr?bnKU$3AG?K5wK-6BN$7T6#Uh}c>;;^eU-2YvBwvSgxZ@#U)?hH@OXQc_ zXxLtx7N7R7xEyx$vUyK0p@H`(@WdWQm0(Mj%vQiQ864pH-*F54Q4kL(Q}&6pO4Y1yYi!r-Z+59~`{pMno%f_7!;p^Ds{!)HuE)k>It3`_UdBU8 zt6H7`QdaxzGS|BJ(j9N02rJ;p6)jHkLG^n4gCj>o!{%D?&<&|HJH?{FH0r7SX>qA_ zJ3pvc<*`J3p=W115uAWHs$hn|r4F59KzZzRrsepuCo1SXTs-X{P3C8XWWZF@b`spd zzjPTo>LVWfbv)wI!LQu zEAMu6cMJkL9%Bm*JTZPz47NIgp3dYNZaLR!7WivncZmuOz0iiT->l;QA|b^K3pD&WQ_sU|rIxE8@$qJ|aP;OeCK#`rEa$cxFSh}^B!B#9ub6`~agPizBN%}= zrJ;B+)+gAG(I&MgYBAT$eUv!@_W3^s{CqcCxyBr1^(LUWHvbvAY47Eo@xzoSseWnx zYlW;?7OScO_)^5n&DnOSMmYfujq4VufATMjG)mNY%55?D`7zk8fEp5N8K%w$yq;dR zf*~N?0lD`3*ET7WZxC$==+N8OnZFTrpv*xb9K^<_@}(cN=JN9SG_FnVJ}2yg;y1c? z0YUNa8=cpx1=+j5#ow#{-LvfdxtZtzc`K$cPKhj+C9)H_w z;sRYk5?+`8nc3`7feC?5I~gSOQ{Z}}6D20f|Ep8s9JU#BTixK;5*i_vXmwWU3gD}m zYx@;wkg~C9{ke1w*RL117Lm^1J`c;?=S$t^>iX7I-QT=58#GVyQsd>N+}_-et^1u~ z@#(2rxOp^*c=TeAoi&u?WP*1r>_q|JMrLmW&BrMFLhFy+G-P?fbYlGJ6WYS-*RSsm zvO~R1(T*PhMYc9eU8=bO256^AUds(O)&8_`5=G7H(QDM5JFaMuXICsQrK-JSNcbz< z99F-K-cP39WdR<$4f;ihi&NUn&OjGwx>38t@lLBJA%y8D%X+?N+_^say+--3UP@MN z{zHN0-)?_!UhkN5oVrZvG!}Pm`jwLsbodJ_gw(H;ztt4wKJo=uUM*(*hZ#P#13h&A=PN#{DHTIlF?OJgj4g)^7< zsJBMe_r_UXzhCmzWHYPhQh#XsY_H5ylPR%dtJ{|(5%9@!#PH3TIxpTbiY2{nqkyJ+ zm5&IIV(Y?1eG|C%(9%1v*|2tGVC7pr)ng+I-HLb>Ty*J!{7NSCm}`3I0p-!d!0T7j zPPy{Uhl?LsZ(cRwT>t5Re9S!YI@)s0GQE@1`YIN<=CAb6yH#9#n7_sa#eUT|DyW%r zJGOe$Wa5_@JEb&L*p4_hOOFyl3#StYzr=$zm~9WDYIM$DN$kFNj5L;bw(1D5ra=mv zf2iS*ka>%(Fa-~t4caqiE-`k-9DCac_5Bbdr>)x}3E4i~&*-rcX)cZ*=1Q*~)lWxj zA4naie_5>HWVz*$fc=zfZYZQO8yhpIqFByvoG^|$h8v5WKbMblvrSIc>#NrM)^&ZY zA(H&2KwQlNqvo2t_t(o7{)c>}#KDWvu!qb={${UvquyO|jD9LOakFJ8m#1b!c-v3@ z7>`1}-Zq!dQo?x+4jUx+u_AgBElQ$`OJ7qx-+B*4U8bQ?dN@X}t}`GASiIv(|qW=Eu_&$N6sR)b>Q)9mGE-E_{S~zcp36f-2%z?FFOlFm5Z=Jg4we>Nl== zeUowZVLn9@Jj2X*Cc7Y8uOPXQ_X3k@r%dZ&5aL($^P{DqqgoU2Wg^Vy>(Z{Otv}rQ zYc_u1AFo#^Ez(;aJW-}_k~ioQJ@{LaRR>!^pkgbi^erEe=LFpN_T^X$Av;AEvr_#D zCp;JCo@_rwZLe!emiL)hzV;U1JVTwnj`6*ALO4`=r>u=>a)S(q(~TQ8=opLsQPa5C7uVu%0mJ9yHo$D zH$s^^Imi8BBy)kk?nB*;E`uv2(_F90ukoRX>zuVHYYHJMK8y_-I`^9@LWFE%_q>5r&wQbiRoQ)m-7^X=asxXQQW5JEOO3& zKmX;z=*EG;?mB-=Xy_?bRn?fEKfSMOtP)x0oBWRK7Hgg^_93~cp^u!1Q-J2f9kk6> zX^^ZvYkWmT1&^p`1&O>>ey(;~zZryE57{M;j9lLKRU#1iJtINyrl;>`{8&DRaA0-h zyd2%ALCI>JKD=RF({m&v5XJM8nRhbrW_}aTW^Lo*Oq{#~C;#H$g&jhNVbCYl*P5N{ z{MLc%PPc_0gv7>0^SZ91hClsd`|PxLp0-Xc3q^XW)u2q6K6EE?z0;8sT(5bu-Fd}) zlvVbWHJ{pSmU{bwM%>SLH)1Tvw)T==sBgL{y_joRt&(8=Kwjt&G=l3c4cuhSFDi=d z4_tRUS>DDO^f0YQ)*Au%c8kY@@om%os!=Toy|7zl6(wD#C=Zt7Qpo8~vZaN;d282-l2c@ zPDIZx(_TZP_#mJ|VR$~py+8JG_|f(eeQbO@Z{}m_`l+j4{DD%4r=Dg(JpFU#`E2(j$C9t4 z3*2dXG>&_IC%zX;T@FdxHX2vJDoCgqZr~rYSBN9R#MER!a3;Chrr|8M*%_f4qR)MU z`hp+joIdHI6oqhNYbytv;%(Mt5(d2t}zjCtv_=WEfu{-{D0Vc�!> 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%0A`ZdK|u> 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 z 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

    4kAWoAm2Bru&tO&QaGhMxC#y4R}l160R8-H(t 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%0AqR$0^_fqY86|K+6=%e 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

    7WpbrM*%Vz=%sv!f$FJHa=rh2e4 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 literal 56018 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 diff --git a/assets/validation-example2.png b/assets/validation-example2.png index d870c39e2ff9dee3c3ffb0d28dca281d878fc5e9..5bc07683de94b1eb34f117721f72fa46ac2c454f 100644 GIT binary patch literal 53998 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 BDtZ6_ literal 44017 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 F_dm;R#ZCYK From b7f7daa05c431fff5fae30d890c6398cbd1aa8cc Mon Sep 17 00:00:00 2001 From: RamiBerm <54766858+RamiBerm@users.noreply.github.com> Date: Wed, 17 Nov 2021 11:14:43 +0200 Subject: [PATCH 32/93] TRA-3903 fix daemon mode in permission restricted configs (#473) * Update tapRunner.go, permissions-all-namespaces-daemon.yaml, and 2 more files... * Update tapRunner.go * Update tapRunner.go and permissions-ns-daemon.yaml * Update tapRunner.go * Update tapRunner.go * Update tapRunner.go --- cli/cmd/tapRunner.go | 37 +++++++++++-------- .../permissions-all-namespaces-daemon.yaml | 6 +-- examples/roles/permissions-ns-daemon.yaml | 6 +-- shared/kubernetes/provider.go | 9 +++-- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 4fd9d09c7..111853dd4 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -378,22 +378,9 @@ func createMizuApiServerPod(ctx context.Context, kubernetesProvider *kubernetes. func createMizuApiServerDeployment(ctx context.Context, kubernetesProvider *kubernetes.Provider, opts *kubernetes.ApiServerOptions) error { volumeClaimCreated := false if !config.Config.Tap.NoPersistentVolumeClaim { - isDefaultStorageClassAvailable, err := kubernetesProvider.IsDefaultStorageProviderAvailable(ctx) - if err != nil { - return err - } - if isDefaultStorageClassAvailable { - if _, err = kubernetesProvider.CreatePersistentVolumeClaim(ctx, config.Config.MizuResourcesNamespace, kubernetes.PersistentVolumeClaimName, config.Config.Tap.MaxEntriesDBSizeBytes()+mizu.DaemonModePersistentVolumeSizeBufferBytes); err != nil { - logger.Log.Warningf(uiUtils.Yellow, "An error has occured while creating a persistent volume claim for mizu, this will mean that mizu's data will be lost on pod restart") - logger.Log.Debugf("error creating persistent volume claim: %v", err) - } else { - volumeClaimCreated = true - } - } else { - logger.Log.Warningf(uiUtils.Yellow, "Could not find default volume provider in this cluster, this will mean that mizu's data will be lost on pod restart") - } - + volumeClaimCreated = TryToCreatePersistentVolumeClaim(ctx, kubernetesProvider) } + pod, err := kubernetesProvider.GetMizuApiServerPodObject(opts, volumeClaimCreated, kubernetes.PersistentVolumeClaimName) if err != nil { return err @@ -406,6 +393,26 @@ func createMizuApiServerDeployment(ctx context.Context, kubernetesProvider *kube return nil } +func TryToCreatePersistentVolumeClaim(ctx context.Context, kubernetesProvider *kubernetes.Provider) bool { + isDefaultStorageClassAvailable, err := kubernetesProvider.IsDefaultStorageProviderAvailable(ctx) + if err != nil { + logger.Log.Warningf(uiUtils.Yellow, "An error occured when checking if a default storage provider exists in this cluster, this means mizu data will be lost on mizu-api-server pod restart") + logger.Log.Debugf("error checking if default storage class exists: %v", err) + return false + } else if !isDefaultStorageClassAvailable { + logger.Log.Warningf(uiUtils.Yellow, "Could not find default storage provider in this cluster, this means mizu data will be lost on mizu-api-server pod restart") + return false + } + + if _, err = kubernetesProvider.CreatePersistentVolumeClaim(ctx, config.Config.MizuResourcesNamespace, kubernetes.PersistentVolumeClaimName, config.Config.Tap.MaxEntriesDBSizeBytes()+mizu.DaemonModePersistentVolumeSizeBufferBytes); err != nil { + logger.Log.Warningf(uiUtils.Yellow, "An error has occured while creating a persistent volume claim for mizu, this means mizu data will be lost on mizu-api-server pod restart") + logger.Log.Debugf("error creating persistent volume claim: %v", err) + return false + } + + return true +} + func getMizuApiFilteringOptions() (*api.TrafficFilteringOptions, error) { var compiledRegexSlice []*api.SerializableRegexp diff --git a/examples/roles/permissions-all-namespaces-daemon.yaml b/examples/roles/permissions-all-namespaces-daemon.yaml index 5a32eaaf5..3cbc16a13 100644 --- a/examples/roles/permissions-all-namespaces-daemon.yaml +++ b/examples/roles/permissions-all-namespaces-daemon.yaml @@ -7,15 +7,15 @@ rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch", "delete"] - - apiGroups: [ "" ] + - apiGroups: [ "apps" ] resources: [ "deployments" ] - verbs: [ "create", "delete" ] + verbs: [ "get", "create", "delete" ] - apiGroups: [""] resources: ["services"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: ["apps"] resources: ["daemonsets"] - verbs: ["create", "patch", "delete"] + verbs: ["get", "create", "patch", "delete", "list"] - apiGroups: [""] resources: ["namespaces"] verbs: ["get", "list", "watch", "create", "delete"] diff --git a/examples/roles/permissions-ns-daemon.yaml b/examples/roles/permissions-ns-daemon.yaml index c73513e8c..589470678 100644 --- a/examples/roles/permissions-ns-daemon.yaml +++ b/examples/roles/permissions-ns-daemon.yaml @@ -8,7 +8,7 @@ rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch", "delete"] -- apiGroups: [ "" ] +- apiGroups: [ "apps" ] resources: [ "deployments" ] verbs: [ "get", "create", "delete" ] - apiGroups: [""] @@ -16,7 +16,7 @@ rules: verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: ["apps"] resources: ["daemonsets"] - verbs: ["get", "create", "patch", "delete"] + verbs: ["get", "create", "patch", "delete", "list"] - apiGroups: [""] resources: ["services/proxy"] verbs: ["get"] @@ -32,7 +32,7 @@ rules: - apiGroups: ["rbac.authorization.k8s.io"] resources: ["rolebindings"] verbs: ["get", "create", "delete"] -- apiGroups: ["apps", "extensions"] +- apiGroups: ["apps", "extensions", ""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: ["apps", "extensions"] diff --git a/shared/kubernetes/provider.go b/shared/kubernetes/provider.go index d18ad34bc..be7b29834 100644 --- a/shared/kubernetes/provider.go +++ b/shared/kubernetes/provider.go @@ -579,6 +579,11 @@ func (provider *Provider) RemoveDaemonSet(ctx context.Context, namespace string, return provider.handleRemovalError(err) } +func (provider *Provider) RemovePersistentVolumeClaim(ctx context.Context, namespace string, volumeClaimName string) error { + err := provider.clientSet.CoreV1().PersistentVolumeClaims(namespace).Delete(ctx, volumeClaimName, metav1.DeleteOptions{}) + return provider.handleRemovalError(err) +} + func (provider *Provider) handleRemovalError(err error) error { // Ignore NotFound - There is nothing to delete. // Ignore Forbidden - Assume that a user could not have created the resource in the first place. @@ -859,10 +864,6 @@ func (provider *Provider) CreatePersistentVolumeClaim(ctx context.Context, names return provider.clientSet.CoreV1().PersistentVolumeClaims(namespace).Create(ctx, volumeClaim, metav1.CreateOptions{}) } -func (provider *Provider) RemovePersistentVolumeClaim(ctx context.Context, namespace string, volumeClaimName string) error { - return provider.clientSet.CoreV1().PersistentVolumeClaims(namespace).Delete(ctx, volumeClaimName, metav1.DeleteOptions{}) -} - func getClientSet(config *restclient.Config) (*kubernetes.Clientset, error) { clientSet, err := kubernetes.NewForConfig(config) if err != nil { From 18be46809e88b11b9b8638a00ecb2450afe0471d Mon Sep 17 00:00:00 2001 From: RamiBerm <54766858+RamiBerm@users.noreply.github.com> Date: Wed, 17 Nov 2021 11:18:08 +0200 Subject: [PATCH 33/93] TRA-3903 minor daemon mode refactor (#479) * Update common.go and tapRunner.go * Update common.go --- cli/cmd/common.go | 45 ++++++++++++++++++++++++++++++++++++++++++++ cli/cmd/tapRunner.go | 43 +----------------------------------------- 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/cli/cmd/common.go b/cli/cmd/common.go index bb6e0a992..822335c8e 100644 --- a/cli/cmd/common.go +++ b/cli/cmd/common.go @@ -4,9 +4,15 @@ import ( "context" "errors" "fmt" + "github.com/up9inc/mizu/cli/apiserver" + "github.com/up9inc/mizu/cli/mizu" + "github.com/up9inc/mizu/cli/mizu/fsUtils" + "github.com/up9inc/mizu/cli/telemetry" "os" "os/signal" + "path" "syscall" + "time" "github.com/up9inc/mizu/cli/config" "github.com/up9inc/mizu/cli/config/configStructs" @@ -64,3 +70,42 @@ func handleKubernetesProviderError(err error) { logger.Log.Error(err) } } + +func finishMizuExecution(kubernetesProvider *kubernetes.Provider, apiProvider *apiserver.Provider) { + telemetry.ReportAPICalls(apiProvider) + removalCtx, cancel := context.WithTimeout(context.Background(), cleanupTimeout) + defer cancel() + dumpLogsIfNeeded(removalCtx, kubernetesProvider) + cleanUpMizuResources(removalCtx, cancel, kubernetesProvider) +} + +func dumpLogsIfNeeded(ctx context.Context, kubernetesProvider *kubernetes.Provider) { + if !config.Config.DumpLogs { + return + } + mizuDir := mizu.GetMizuFolderPath() + filePath := path.Join(mizuDir, fmt.Sprintf("mizu_logs_%s.zip", time.Now().Format("2006_01_02__15_04_05"))) + if err := fsUtils.DumpLogs(ctx, kubernetesProvider, filePath); err != nil { + logger.Log.Errorf("Failed dump logs %v", err) + } +} + +func cleanUpMizuResources(ctx context.Context, cancel context.CancelFunc, kubernetesProvider *kubernetes.Provider) { + logger.Log.Infof("\nRemoving mizu resources") + + var leftoverResources []string + + if config.Config.IsNsRestrictedMode() { + leftoverResources = cleanUpRestrictedMode(ctx, kubernetesProvider) + } else { + leftoverResources = cleanUpNonRestrictedMode(ctx, cancel, kubernetesProvider) + } + + if len(leftoverResources) > 0 { + errMsg := fmt.Sprintf("Failed to remove the following resources, for more info check logs at %s:", fsUtils.GetLogFilePath()) + for _, resource := range leftoverResources { + errMsg += "\n- " + resource + } + logger.Log.Errorf(uiUtils.Error, errMsg) + } +} diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 111853dd4..ee21fda7f 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "io/ioutil" - "path" "regexp" "strings" "time" @@ -25,7 +24,6 @@ import ( "github.com/up9inc/mizu/cli/mizu" "github.com/up9inc/mizu/cli/mizu/fsUtils" - "github.com/up9inc/mizu/cli/telemetry" "github.com/up9inc/mizu/cli/uiUtils" "github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared/kubernetes" @@ -185,7 +183,7 @@ func printTappedPodsPreview(ctx context.Context, kubernetesProvider *kubernetes. if len(matchingPods) == 0 { printNoPodsFoundSuggestion(namespaces) } - logger.Log.Info("Pods that match regex at this instant:") + logger.Log.Info("Pods that match the provided criteria at this instant:") for _, tappedPod := range matchingPods { logger.Log.Infof(uiUtils.Green, fmt.Sprintf("+%s", tappedPod.Name)) } @@ -447,45 +445,6 @@ func getSyncEntriesConfig() *shared.SyncEntriesConfig { } } -func finishMizuExecution(kubernetesProvider *kubernetes.Provider, apiProvider *apiserver.Provider) { - telemetry.ReportAPICalls(apiProvider) - removalCtx, cancel := context.WithTimeout(context.Background(), cleanupTimeout) - defer cancel() - dumpLogsIfNeeded(removalCtx, kubernetesProvider) - cleanUpMizuResources(removalCtx, cancel, kubernetesProvider) -} - -func dumpLogsIfNeeded(ctx context.Context, kubernetesProvider *kubernetes.Provider) { - if !config.Config.DumpLogs { - return - } - mizuDir := mizu.GetMizuFolderPath() - filePath := path.Join(mizuDir, fmt.Sprintf("mizu_logs_%s.zip", time.Now().Format("2006_01_02__15_04_05"))) - if err := fsUtils.DumpLogs(ctx, kubernetesProvider, filePath); err != nil { - logger.Log.Errorf("Failed dump logs %v", err) - } -} - -func cleanUpMizuResources(ctx context.Context, cancel context.CancelFunc, kubernetesProvider *kubernetes.Provider) { - logger.Log.Infof("\nRemoving mizu resources") - - var leftoverResources []string - - if config.Config.IsNsRestrictedMode() { - leftoverResources = cleanUpRestrictedMode(ctx, kubernetesProvider) - } else { - leftoverResources = cleanUpNonRestrictedMode(ctx, cancel, kubernetesProvider) - } - - if len(leftoverResources) > 0 { - errMsg := fmt.Sprintf("Failed to remove the following resources, for more info check logs at %s:", fsUtils.GetLogFilePath()) - for _, resource := range leftoverResources { - errMsg += "\n- " + resource - } - logger.Log.Errorf(uiUtils.Error, errMsg) - } -} - func cleanUpRestrictedMode(ctx context.Context, kubernetesProvider *kubernetes.Provider) []string { leftoverResources := make([]string, 0) From bb85312b9f0935b4d1ef1424a95a0dddd6779a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Wed, 17 Nov 2021 15:02:23 +0300 Subject: [PATCH 34/93] Don't omit the key-value pair if the value is `false` in `EntryTableSection` (#478) --- ui/src/components/EntryDetailed/EntrySections.tsx | 2 +- ui/src/components/UI/FancyTextDisplay.tsx | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/ui/src/components/EntryDetailed/EntrySections.tsx b/ui/src/components/EntryDetailed/EntrySections.tsx index b702b4db1..0e0f8942d 100644 --- a/ui/src/components/EntryDetailed/EntrySections.tsx +++ b/ui/src/components/EntryDetailed/EntrySections.tsx @@ -15,7 +15,7 @@ interface EntryViewLineProps { } const EntryViewLine: React.FC = ({label, value, updateQuery, selector, overrideQueryValue}) => { - return (label && value && + return (label && { diff --git a/ui/src/components/UI/FancyTextDisplay.tsx b/ui/src/components/UI/FancyTextDisplay.tsx index 91f10f4bf..148e0d6bd 100644 --- a/ui/src/components/UI/FancyTextDisplay.tsx +++ b/ui/src/components/UI/FancyTextDisplay.tsx @@ -17,7 +17,6 @@ interface Props { const FancyTextDisplay: React.FC = ({text, className, isPossibleToCopy = true, applyTextEllipsis = true, flipped = false, useTooltip= false, displayIconOnMouseOver = false, buttonOnly = false}) => { const [showCopiedNotification, setCopied] = useState(false); const [showTooltip, setShowTooltip] = useState(false); - const displayText = text || ''; const onCopy = () => { setCopied(true) @@ -33,12 +32,12 @@ const FancyTextDisplay: React.FC = ({text, className, isPossibleToCopy = return () => clearTimeout(timer); }, [showCopiedNotification]); - const textElement = {displayText}; + const textElement = {text}; - const copyButton = isPossibleToCopy && displayText ? + const copyButton = isPossibleToCopy && text ? Duplicate full value {showCopiedNotification && Copied} @@ -48,14 +47,14 @@ const FancyTextDisplay: React.FC = ({text, className, isPossibleToCopy = return (

    setShowTooltip(true)} onMouseLeave={ e => setShowTooltip(false)} > {!buttonOnly && flipped && textElement} {copyButton} {!buttonOnly && !flipped && textElement} - {useTooltip && showTooltip && {displayText}} + {useTooltip && showTooltip && {text}}

    ); }; From a13fec3dae85304947444cb7e2f973eb8406675c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Wed, 17 Nov 2021 15:16:49 +0300 Subject: [PATCH 35/93] Sync entries in batches just as before (using `uploadIntervalSec` parameter) (#477) * Sync entries in batches just as before (using `uploadIntervalSec` parameter) * Replace `lastTimeSynced` value with `time.Time{}` Since it will be overwritten by the very first iteration. --- agent/pkg/up9/main.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/agent/pkg/up9/main.go b/agent/pkg/up9/main.go index 225d3f60d..9f0a1d185 100644 --- a/agent/pkg/up9/main.go +++ b/agent/pkg/up9/main.go @@ -227,6 +227,10 @@ func syncEntriesImpl(token string, model string, envPrefix string, uploadInterva connection.Close() }() + lastTimeSynced := time.Time{} + + batch := make([]har.Entry, 0) + handleDataChannel := func(wg *sync.WaitGroup, connection *basenine.Connection, data chan []byte) { defer wg.Done() for { @@ -239,7 +243,6 @@ func syncEntriesImpl(token string, model string, envPrefix string, uploadInterva var dataMap map[string]interface{} err = json.Unmarshal(dataBytes, &dataMap) - result := make([]har.Entry, 0) var entry tapApi.MizuEntry if err := json.Unmarshal([]byte(dataBytes), &entry); err != nil { continue @@ -261,14 +264,22 @@ func syncEntriesImpl(token string, model string, envPrefix string, uploadInterva continue } - result = append(result, *harEntry) + batch = append(batch, *harEntry) - body, jMarshalErr := json.Marshal(result) + now := time.Now() + if lastTimeSynced.Add(time.Duration(uploadIntervalSec) * time.Second).After(now) { + continue + } + lastTimeSynced = now + + body, jMarshalErr := json.Marshal(batch) + batchSize := len(batch) if jMarshalErr != nil { analyzeInformation.Reset() logger.Log.Infof("Stopping sync entries") logger.Log.Fatal(jMarshalErr) } + batch = make([]har.Entry, 0) var in bytes.Buffer w := zlib.NewWriter(&in) @@ -293,7 +304,7 @@ func syncEntriesImpl(token string, model string, envPrefix string, uploadInterva logger.Log.Info("Stopping sync entries") logger.Log.Fatal(postErr) } - analyzeInformation.SentCount += 1 + analyzeInformation.SentCount += batchSize if analyzeInformation.SentCount%SentCountLogInterval == 0 { logger.Log.Infof("Uploaded %v entries until now", analyzeInformation.SentCount) From ad78f1dcd783b4c6b4e9be7de96feb469eb2159c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Wed, 17 Nov 2021 18:20:23 +0300 Subject: [PATCH 36/93] Clear `focusedEntryId` state in case of a filter is applied (#482) --- ui/src/components/TrafficPage.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index 804eea59a..3d2afa71d 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -101,6 +101,7 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const listEntry = useRef(null); const openWebSocket = (query) => { + setFocusedEntryId(null); setEntries([]); setEntriesBuffer([]); ws.current = new WebSocket(MizuWebsocketURL); From dd53a36d5f5527850fac5d4e1267429777d60db7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Wed, 17 Nov 2021 18:50:09 +0300 Subject: [PATCH 37/93] Prevent the crash on client-side in case of `text` being undefined in `FancyTextDisplay` (#481) * Prevent the crash on client-side in case of `text` being undefined in `FancyTextDisplay` * Use `String(text)` instead --- ui/src/components/UI/FancyTextDisplay.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/src/components/UI/FancyTextDisplay.tsx b/ui/src/components/UI/FancyTextDisplay.tsx index 148e0d6bd..10dc49f1c 100644 --- a/ui/src/components/UI/FancyTextDisplay.tsx +++ b/ui/src/components/UI/FancyTextDisplay.tsx @@ -17,6 +17,7 @@ interface Props { const FancyTextDisplay: React.FC = ({text, className, isPossibleToCopy = true, applyTextEllipsis = true, flipped = false, useTooltip= false, displayIconOnMouseOver = false, buttonOnly = false}) => { const [showCopiedNotification, setCopied] = useState(false); const [showTooltip, setShowTooltip] = useState(false); + text = String(text); const onCopy = () => { setCopied(true) @@ -47,7 +48,7 @@ const FancyTextDisplay: React.FC = ({text, className, isPossibleToCopy = return (

    setShowTooltip(true)} onMouseLeave={ e => setShowTooltip(false)} > From 2e75834dd074849eb773cc3fd2959ff2635d7b9e Mon Sep 17 00:00:00 2001 From: Nimrod Gilboa Markevich <59927337+nimrod-up9@users.noreply.github.com> Date: Thu, 18 Nov 2021 11:53:11 +0200 Subject: [PATCH 38/93] Refactor watch pods to allow reusing watch wrapper (#470) Currently shared/kubernetes/watch.go:FilteredWatch only watches pods. This PR makes it reusable for other types of resources. This is done in preparation for watching k8s events. --- cli/cmd/tapRunner.go | 54 +++++++++++++++++++++------ shared/kubernetes/mizuTapperSyncer.go | 46 ++++++++++++++++++----- shared/kubernetes/podWatchHelper.go | 45 ++++++++++++++++++++++ shared/kubernetes/provider.go | 8 ---- shared/kubernetes/watch.go | 52 +++++++++++++++----------- shared/kubernetes/watchEvent.go | 18 +++++++++ 6 files changed, 172 insertions(+), 51 deletions(-) create mode 100644 shared/kubernetes/podWatchHelper.go create mode 100644 shared/kubernetes/watchEvent.go diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index ee21fda7f..395963c56 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -9,19 +9,18 @@ import ( "strings" "time" - "github.com/up9inc/mizu/cli/cmd/goUtils" + "github.com/getkin/kin-openapi/openapi3" + "gopkg.in/yaml.v3" + core "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/wait" - "github.com/getkin/kin-openapi/openapi3" "github.com/up9inc/mizu/cli/apiserver" + "github.com/up9inc/mizu/cli/cmd/goUtils" "github.com/up9inc/mizu/cli/config" "github.com/up9inc/mizu/cli/config/configStructs" "github.com/up9inc/mizu/cli/errormessage" - "gopkg.in/yaml.v3" - core "k8s.io/api/core/v1" - "github.com/up9inc/mizu/cli/mizu" "github.com/up9inc/mizu/cli/mizu/fsUtils" "github.com/up9inc/mizu/cli/uiUtils" @@ -555,7 +554,8 @@ func waitUntilNamespaceDeleted(ctx context.Context, cancel context.CancelFunc, k func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s$", kubernetes.ApiServerPodName)) - added, modified, removed, errorChan := kubernetes.FilteredWatch(ctx, kubernetesProvider, []string{config.Config.MizuResourcesNamespace}, podExactRegex) + podWatchHelper := kubernetes.NewPodWatchHelper(kubernetesProvider, podExactRegex) + added, modified, removed, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.MizuResourcesNamespace}, podWatchHelper) isPodReady := false timeAfter := time.After(25 * time.Second) for { @@ -576,12 +576,19 @@ func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provi logger.Log.Infof("%s removed", kubernetes.ApiServerPodName) cancel() return - case modifiedPod, ok := <-modified: + case wEvent, ok := <-modified: if !ok { modified = nil continue } + modifiedPod, err := wEvent.ToPod() + if err != nil { + logger.Log.Errorf(uiUtils.Error, err) + cancel() + continue + } + logger.Log.Debugf("Watching API Server pod loop, modified: %v", modifiedPod.Status.Phase) if modifiedPod.Status.Phase == core.PodPending { @@ -642,34 +649,57 @@ func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provi func watchTapperPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", kubernetes.TapperDaemonSetName)) - added, modified, removed, errorChan := kubernetes.FilteredWatch(ctx, kubernetesProvider, []string{config.Config.MizuResourcesNamespace}, podExactRegex) + podWatchHelper := kubernetes.NewPodWatchHelper(kubernetesProvider, podExactRegex) + added, modified, removed, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.MizuResourcesNamespace}, podWatchHelper) var prevPodPhase core.PodPhase for { select { - case addedPod, ok := <-added: + case wEvent, ok := <-added: if !ok { added = nil continue } + addedPod, err := wEvent.ToPod() + if err != nil { + logger.Log.Errorf(uiUtils.Error, err) + cancel() + continue + } + logger.Log.Debugf("Tapper is created [%s]", addedPod.Name) - case removedPod, ok := <-removed: + case wEvent, ok := <-removed: if !ok { removed = nil continue } + removedPod, err := wEvent.ToPod() + if err != nil { + logger.Log.Errorf(uiUtils.Error, err) + cancel() + continue + } + + logger.Log.Debugf("Tapper is removed [%s]", removedPod.Name) - case modifiedPod, ok := <-modified: + case wEvent, ok := <-modified: if !ok { modified = nil continue } + modifiedPod, err := wEvent.ToPod() + if err != nil { + logger.Log.Errorf(uiUtils.Error, err) + cancel() + continue + } + if modifiedPod.Status.Phase == core.PodPending && modifiedPod.Status.Conditions[0].Type == core.PodScheduled && modifiedPod.Status.Conditions[0].Status != core.ConditionTrue { logger.Log.Infof(uiUtils.Red, fmt.Sprintf("Wasn't able to deploy the tapper %s. Reason: \"%s\"", modifiedPod.Name, modifiedPod.Status.Conditions[0].Message)) cancel() - break + continue } podStatus := modifiedPod.Status diff --git a/shared/kubernetes/mizuTapperSyncer.go b/shared/kubernetes/mizuTapperSyncer.go index 1526eadbd..dca6877f4 100644 --- a/shared/kubernetes/mizuTapperSyncer.go +++ b/shared/kubernetes/mizuTapperSyncer.go @@ -68,7 +68,8 @@ func CreateAndStartMizuTapperSyncer(ctx context.Context, kubernetesProvider *Pro } func (tapperSyncer *MizuTapperSyncer) watchPodsForTapping() { - added, modified, removed, errorChan := FilteredWatch(tapperSyncer.context, tapperSyncer.kubernetesProvider, tapperSyncer.config.TargetNamespaces, &tapperSyncer.config.PodFilterRegex) + podWatchHelper := NewPodWatchHelper(tapperSyncer.kubernetesProvider, &tapperSyncer.config.PodFilterRegex) + added, modified, removed, errorChan := FilteredWatch(tapperSyncer.context, podWatchHelper, tapperSyncer.config.TargetNamespaces, podWatchHelper) restartTappers := func() { err, changeFound := tapperSyncer.updateCurrentlyTappedPods() @@ -94,28 +95,48 @@ func (tapperSyncer *MizuTapperSyncer) watchPodsForTapping() { for { select { - case pod, ok := <-added: + case wEvent, ok := <-added: if !ok { added = nil continue } + pod, err := wEvent.ToPod() + if err != nil { + tapperSyncer.handleErrorInWatchLoop(err, restartTappersDebouncer) + continue + } + + logger.Log.Debugf("Added matching pod %s, ns: %s", pod.Name, pod.Namespace) restartTappersDebouncer.SetOn() - case pod, ok := <-removed: + case wEvent, ok := <-removed: if !ok { removed = nil continue } + pod, err := wEvent.ToPod() + if err != nil { + tapperSyncer.handleErrorInWatchLoop(err, restartTappersDebouncer) + continue + } + logger.Log.Debugf("Removed matching pod %s, ns: %s", pod.Name, pod.Namespace) restartTappersDebouncer.SetOn() - case pod, ok := <-modified: + case wEvent, ok := <-modified: if !ok { modified = nil continue } + pod, err := wEvent.ToPod() + if err != nil { + tapperSyncer.handleErrorInWatchLoop(err, restartTappersDebouncer) + continue + } + + logger.Log.Debugf("Modified matching pod %s, ns: %s, phase: %s, ip: %s", pod.Name, pod.Namespace, pod.Status.Phase, pod.Status.PodIP) // Act only if the modified pod has already obtained an IP address. // After filtering for IPs, on a normal pod restart this includes the following events: @@ -132,12 +153,8 @@ func (tapperSyncer *MizuTapperSyncer) watchPodsForTapping() { continue } - logger.Log.Debugf("Watching pods loop, got error %v, stopping `restart tappers debouncer`", err) - restartTappersDebouncer.Cancel() - tapperSyncer.ErrorOut <- K8sTapManagerError{ - OriginalError: err, - TapManagerReason: TapManagerPodWatchError, - } + tapperSyncer.handleErrorInWatchLoop(err, restartTappersDebouncer) + continue case <-tapperSyncer.context.Done(): logger.Log.Debugf("Watching pods loop, context done, stopping `restart tappers debouncer`") @@ -148,6 +165,15 @@ func (tapperSyncer *MizuTapperSyncer) watchPodsForTapping() { } } +func (tapperSyncer *MizuTapperSyncer) handleErrorInWatchLoop(err error, restartTappersDebouncer *debounce.Debouncer) { + logger.Log.Debugf("Watching pods loop, got error %v, stopping `restart tappers debouncer`", err) + restartTappersDebouncer.Cancel() + tapperSyncer.ErrorOut <- K8sTapManagerError{ + OriginalError: err, + TapManagerReason: TapManagerPodWatchError, + } +} + func (tapperSyncer *MizuTapperSyncer) updateCurrentlyTappedPods() (err error, changesFound bool) { if matchingPods, err := tapperSyncer.kubernetesProvider.ListAllRunningPodsMatchingRegex(tapperSyncer.context, &tapperSyncer.config.PodFilterRegex, tapperSyncer.config.TargetNamespaces); err != nil { return err, false diff --git a/shared/kubernetes/podWatchHelper.go b/shared/kubernetes/podWatchHelper.go new file mode 100644 index 000000000..2184eeb43 --- /dev/null +++ b/shared/kubernetes/podWatchHelper.go @@ -0,0 +1,45 @@ +package kubernetes + +import ( + "context" + "regexp" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/watch" +) + +type PodWatchHelper struct { + kubernetesProvider *Provider + NameRegexFilter *regexp.Regexp +} + +func NewPodWatchHelper(kubernetesProvider *Provider, NameRegexFilter *regexp.Regexp) *PodWatchHelper { + return &PodWatchHelper{ + kubernetesProvider: kubernetesProvider, + NameRegexFilter: NameRegexFilter, + } +} + +// Implements the EventFilterer Interface +func (pwh *PodWatchHelper) Filter(wEvent *WatchEvent) (bool, error) { + pod, err := wEvent.ToPod() + if err != nil { + return false, nil + } + + if !pwh.NameRegexFilter.MatchString(pod.Name) { + return false, nil + } + + return true, nil +} + +// Implements the WatchCreator Interface +func (pwh *PodWatchHelper) NewWatcher(ctx context.Context, namespace string) (watch.Interface, error) { + watcher, err := pwh.kubernetesProvider.clientSet.CoreV1().Pods(namespace).Watch(ctx, metav1.ListOptions{Watch: true}) + if err != nil { + return nil, err + } + + return watcher, nil +} diff --git a/shared/kubernetes/provider.go b/shared/kubernetes/provider.go index be7b29834..d0647c3ef 100644 --- a/shared/kubernetes/provider.go +++ b/shared/kubernetes/provider.go @@ -153,14 +153,6 @@ func (provider *Provider) WaitUtilNamespaceDeleted(ctx context.Context, name str return err } -func (provider *Provider) GetPodWatcher(ctx context.Context, namespace string) watch.Interface { - watcher, err := provider.clientSet.CoreV1().Pods(namespace).Watch(ctx, metav1.ListOptions{Watch: true}) - if err != nil { - panic(err.Error()) - } - return watcher -} - func (provider *Provider) CreateNamespace(ctx context.Context, name string) (*core.Namespace, error) { namespaceSpec := &core.Namespace{ ObjectMeta: metav1.ObjectMeta{ diff --git a/shared/kubernetes/watch.go b/shared/kubernetes/watch.go index 9bd47ebe4..7e28e152a 100644 --- a/shared/kubernetes/watch.go +++ b/shared/kubernetes/watch.go @@ -6,19 +6,25 @@ import ( "fmt" "github.com/up9inc/mizu/shared/debounce" "github.com/up9inc/mizu/shared/logger" - "regexp" "sync" "time" - corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/watch" ) -func FilteredWatch(ctx context.Context, kubernetesProvider *Provider, targetNamespaces []string, podFilter *regexp.Regexp) (chan *corev1.Pod, chan *corev1.Pod, chan *corev1.Pod, chan error) { - addedChan := make(chan *corev1.Pod) - modifiedChan := make(chan *corev1.Pod) - removedChan := make(chan *corev1.Pod) +type EventFilterer interface { + Filter(*WatchEvent) (bool, error) +} + +type WatchCreator interface { + NewWatcher(ctx context.Context, namespace string) (watch.Interface, error) +} + +func FilteredWatch(ctx context.Context, watcherCreator WatchCreator, targetNamespaces []string, filterer EventFilterer) (chan *WatchEvent, chan *WatchEvent, chan *WatchEvent, chan error) { + addedChan := make(chan *WatchEvent) + modifiedChan := make(chan *WatchEvent) + removedChan := make(chan *WatchEvent) errorChan := make(chan error) var wg sync.WaitGroup @@ -31,8 +37,13 @@ func FilteredWatch(ctx context.Context, kubernetesProvider *Provider, targetName watchRestartDebouncer := debounce.NewDebouncer(1 * time.Minute, func() {}) for { - watcher := kubernetesProvider.GetPodWatcher(ctx, targetNamespace) - err := startWatchLoop(ctx, watcher, podFilter, addedChan, modifiedChan, removedChan) // blocking + watcher, err := watcherCreator.NewWatcher(ctx, targetNamespace) + if err != nil { + errorChan <- fmt.Errorf("error in k8 watch: %v", err) + break + } + + err = startWatchLoop(ctx, watcher, filterer, addedChan, modifiedChan, removedChan) // blocking watcher.Stop() select { @@ -72,7 +83,7 @@ func FilteredWatch(ctx context.Context, kubernetesProvider *Provider, targetName return addedChan, modifiedChan, removedChan, errorChan } -func startWatchLoop(ctx context.Context, watcher watch.Interface, podFilter *regexp.Regexp, addedChan chan *corev1.Pod, modifiedChan chan *corev1.Pod, removedChan chan *corev1.Pod) error { +func startWatchLoop(ctx context.Context, watcher watch.Interface, filterer EventFilterer, addedChan chan *WatchEvent, modifiedChan chan *WatchEvent, removedChan chan *WatchEvent) error { resultChan := watcher.ResultChan() for { select { @@ -81,26 +92,25 @@ func startWatchLoop(ctx context.Context, watcher watch.Interface, podFilter *reg return nil } - if e.Type == watch.Error { - return apierrors.FromObject(e.Object) + wEvent := WatchEvent(e) + + if wEvent.Type == watch.Error { + return apierrors.FromObject(wEvent.Object) } - pod, ok := e.Object.(*corev1.Pod) - if !ok { + if pass, err := filterer.Filter(&wEvent); err != nil { + return err + } else if !pass { continue } - if !podFilter.MatchString(pod.Name) { - continue - } - - switch e.Type { + switch wEvent.Type { case watch.Added: - addedChan <- pod + addedChan <- &wEvent case watch.Modified: - modifiedChan <- pod + modifiedChan <- &wEvent case watch.Deleted: - removedChan <- pod + removedChan <- &wEvent } case <-ctx.Done(): return nil diff --git a/shared/kubernetes/watchEvent.go b/shared/kubernetes/watchEvent.go new file mode 100644 index 000000000..fc1b7e11f --- /dev/null +++ b/shared/kubernetes/watchEvent.go @@ -0,0 +1,18 @@ +package kubernetes + +import ( + "fmt" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/watch" +) + +type WatchEvent watch.Event + +func (we *WatchEvent) ToPod() (*corev1.Pod, error) { + pod, ok := we.Object.(*corev1.Pod) + if !ok { + return nil, fmt.Errorf("Invalid object type on pod event stream") + } + + return pod, nil +} From 8118569460d14104f6a80b815df8715f16037360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Thu, 18 Nov 2021 20:21:51 +0300 Subject: [PATCH 39/93] Show the source and destination IP in the entry feed (#485) --- .../EntryListItem/EntryListItem.module.sass | 11 +++++++-- .../EntryListItem/EntryListItem.tsx | 24 +++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/ui/src/components/EntryListItem/EntryListItem.module.sass b/ui/src/components/EntryListItem/EntryListItem.module.sass index d8e5295d5..5cf3ed227 100644 --- a/ui/src/components/EntryListItem/EntryListItem.module.sass +++ b/ui/src/components/EntryListItem/EntryListItem.module.sass @@ -84,7 +84,14 @@ padding: 4px padding-left: 12px -.port +.tcpInfo font-size: 12px color: $secondary-font-color - margin: 5px + margin-top: 5px + margin-bottom: 5px + +.port + margin-right: 5px + +.ip + margin-left: 5px diff --git a/ui/src/components/EntryListItem/EntryListItem.tsx b/ui/src/components/EntryListItem/EntryListItem.tsx index e9346d6c5..29da5bcdf 100644 --- a/ui/src/components/EntryListItem/EntryListItem.tsx +++ b/ui/src/components/EntryListItem/EntryListItem.tsx @@ -171,7 +171,17 @@ export const EntryItem: React.FC = ({entry, setFocusedEntryId, style }

    { + updateQuery(`src.ip == "${entry.sourceIp}"`) + }} + > + {entry.sourceIp} + + : + { updateQuery(`src.port == "${entry.sourcePort}"`) @@ -199,7 +209,17 @@ export const EntryItem: React.FC = ({entry, setFocusedEntryId, style /> } { + updateQuery(`dst.ip == "${entry.destinationIp}"`) + }} + > + {entry.destinationIp} + + : + { updateQuery(`dst.port == "${entry.destinationPort}"`) From a849aae94ce39c43b6ea3d4b4f59faf3eb7fa1e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Fri, 19 Nov 2021 18:57:19 +0300 Subject: [PATCH 40/93] Upgrade Basenine version from `0.2.9` to `0.2.10` (#484) * Upgrade Basenine version from `0.2.9` to `0.2.10` Fixes the issues in `limit` and `rlimit` helpers that occur when they are on the left operand of a binary expression. * Upgrade the client hash to latest --- Dockerfile | 4 ++-- agent/go.mod | 2 +- agent/go.sum | 4 ++-- debug.Dockerfile | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index fa42bad83..f34b13660 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,8 +42,8 @@ RUN go build -ldflags="-s -w \ -X 'mizuserver/pkg/version.SemVer=${SEM_VER}'" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.9/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.9/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.10/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.10/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/agent/go.mod b/agent/go.mod index a39ab79ce..d7a3bca76 100644 --- a/agent/go.mod +++ b/agent/go.mod @@ -16,7 +16,7 @@ require ( github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/orcaman/concurrent-map v0.0.0-20210106121528-16402b402231 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/up9inc/basenine/client/go v0.0.0-20211114204315-4d028da5fda5 + github.com/up9inc/basenine/client/go v0.0.0-20211118123155-7ed075f85c73 github.com/up9inc/mizu/shared v0.0.0 github.com/up9inc/mizu/tap v0.0.0 github.com/up9inc/mizu/tap/api v0.0.0 diff --git a/agent/go.sum b/agent/go.sum index 4ed8136b3..9b9376476 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -450,8 +450,8 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/up9inc/basenine/client/go v0.0.0-20211114204315-4d028da5fda5 h1:JbLairDLEJpAC8bwmFuOAB+LYpY/oQbzGRSWRpkF7PQ= -github.com/up9inc/basenine/client/go v0.0.0-20211114204315-4d028da5fda5/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= +github.com/up9inc/basenine/client/go v0.0.0-20211118123155-7ed075f85c73 h1:FJUM7w7E0jRGFPcSMa7cVy+jr5zcpbyT6qA30dEtGGI= +github.com/up9inc/basenine/client/go v0.0.0-20211118123155-7ed075f85c73/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= diff --git a/debug.Dockerfile b/debug.Dockerfile index 65d41070a..66fa6ad46 100644 --- a/debug.Dockerfile +++ b/debug.Dockerfile @@ -37,8 +37,8 @@ COPY agent . RUN go build -gcflags="all=-N -l" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.9/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.9/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.10/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.10/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 From 8cf6f56a3c1b1a8b1112ffce03aed97f3868f282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Sun, 21 Nov 2021 09:12:51 +0300 Subject: [PATCH 41/93] Remove unnecessary `tcpdump` dependency from `Dockerfile` (#491) --- Dockerfile | 2 +- debug.Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index f34b13660..ca6a0d618 100644 --- a/Dockerfile +++ b/Dockerfile @@ -52,7 +52,7 @@ RUN cd .. && /bin/bash build_extensions.sh FROM alpine:3.14 -RUN apk add bash libpcap-dev tcpdump +RUN apk add bash libpcap-dev WORKDIR /app diff --git a/debug.Dockerfile b/debug.Dockerfile index 66fa6ad46..ede72037b 100644 --- a/debug.Dockerfile +++ b/debug.Dockerfile @@ -48,7 +48,7 @@ RUN cd .. && /bin/bash build_extensions_debug.sh FROM golang:1.16-alpine -RUN apk add bash libpcap-dev tcpdump +RUN apk add bash libpcap-dev WORKDIR /app From a16faca5fb461f1e9745d68bbd3e379d3c2fa563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Sun, 21 Nov 2021 09:29:01 +0300 Subject: [PATCH 42/93] Ignore gob files (#488) * Ignore gob files * Remove `*.db` from `.gitignore` --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e3efed6b5..ebc2dde3b 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,6 @@ # vendor/ .idea/ build -*.db # Mac OS .DS_Store @@ -32,3 +31,4 @@ pprof/* # Database Files *.bin +*.gob From 2635964a2878de8882e0d87ae71d6f5ea834d854 Mon Sep 17 00:00:00 2001 From: gadotroee <55343099+gadotroee@users.noreply.github.com> Date: Sun, 21 Nov 2021 14:09:21 +0200 Subject: [PATCH 43/93] Update README (#486) --- README.md | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 367cbcfe0..9df60ecd2 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,12 @@ Think TCPDump and Chrome Dev Tools combined. ## Features - Simple and powerful CLI -- Real-time view of all HTTP requests, REST and gRPC API calls +- Monitoring network traffic in real-time. Supported protocols: + - [HTTP/1.1](https://datatracker.ietf.org/doc/html/rfc2616) + - [HTTP/2](https://datatracker.ietf.org/doc/html/rfc7540) (gRPC) + - [AMQP](https://www.rabbitmq.com/amqp-0-9-1-reference.html) (RabbitMQ, Apache Qpid, etc.) + - [Apache Kafka](https://kafka.apache.org/protocol) + - [Redis](https://redis.io/topics/protocol) - No installation or code instrumentation - Works completely on premises @@ -44,15 +49,6 @@ SHA256 checksums are available on the [Releases](https://github.com/up9inc/mizu/ ### Development (unstable) Build Pick one from the [Releases](https://github.com/up9inc/mizu/releases) page -## Kubeconfig & Permissions -While `mizu`most often works out of the box, you can influence its behavior: - -1. [OPTIONAL] Set `KUBECONFIG` environment variable to your Kubernetes configuration. If this is not set, Mizu assumes that configuration is at `${HOME}/.kube/config` -2. `mizu` assumes user running the command has permissions to create resources (such as pods, services, namespaces) on your Kubernetes cluster (no worries - `mizu` resources are cleaned up upon termination) - -For detailed list of k8s permissions see [PERMISSIONS](docs/PERMISSIONS.md) document - - ## How to Run 1. Find pods you'd like to tap to in your Kubernetes cluster @@ -135,21 +131,22 @@ $ mizu clean # mizu will continue running in cluster until clean is executed ## Configuration -Mizu can work with config file which should be stored in ${HOME}/.mizu/config.yaml (macOS: ~/.mizu/config.yaml)
    -In case no config file found, defaults will be used
    +Mizu can optionally work with a config file that can be provided as a CLI argument (using `--set config-path=`) or if not provided, will be stored at ${HOME}/.mizu/config.yaml In case of partial configuration defined, all other fields will be used with defaults
    You can always override the defaults or config file with CLI flags To get the default config params run `mizu config`
    To generate a new config file with default values use `mizu config -r` -### Telemetry - -By default, mizu reports usage telemetry. It can be disabled by adding a line of `telemetry: false` in the `${HOME}/.mizu/config.yaml` file - ## Advanced Usage +### Kubeconfig + +It is possible to change the kubeconfig path using `KUBECONFIG` environment variable or the command like flag +with `--set kube-config-path=`.
    +If both are not set - Mizu assumes that configuration is at `${HOME}/.kube/config` + ### Namespace-Restricted Mode Some users have permission to only manage resources in one particular namespace assigned to them @@ -163,6 +160,8 @@ using the `--namespace` flag or by setting `tap.namespaces` in the config file Setting `mizu-resources-namespace=mizu` resets Mizu to its default behavior +For detailed list of k8s permissions see [PERMISSIONS](docs/PERMISSIONS.md) document + ### User agent filtering User-agent filtering (like health checks) - can be configured using command-line options: From b77ea63f42469ebb797cc8b6d253b20d42707620 Mon Sep 17 00:00:00 2001 From: RoyUP9 <87927115+RoyUP9@users.noreply.github.com> Date: Sun, 21 Nov 2021 15:14:02 +0200 Subject: [PATCH 44/93] Add token validity check (#483) --- cli/cmd/tap.go | 7 +++++++ cli/up9/provider.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 cli/up9/provider.go diff --git a/cli/cmd/tap.go b/cli/cmd/tap.go index f4ed44605..e0a8a5578 100644 --- a/cli/cmd/tap.go +++ b/cli/cmd/tap.go @@ -3,6 +3,7 @@ package cmd import ( "errors" "fmt" + "github.com/up9inc/mizu/cli/up9" "os" "github.com/creasty/defaults" @@ -62,6 +63,12 @@ Supported protocols are HTTP and gRPC.`, logger.Log.Errorf("failed to log in, err: %v", err) return nil } + } else if isValidToken := up9.IsTokenValid(config.Config.Auth.Token, config.Config.Auth.EnvName); !isValidToken { + logger.Log.Errorf("Token is not valid, please log in again to continue") + if err := auth.Login(); err != nil { + logger.Log.Errorf("failed to log in, err: %v", err) + return nil + } } } } diff --git a/cli/up9/provider.go b/cli/up9/provider.go new file mode 100644 index 000000000..63544db04 --- /dev/null +++ b/cli/up9/provider.go @@ -0,0 +1,31 @@ +package up9 + +import ( + "fmt" + "net/http" + "net/url" +) + +func IsTokenValid(tokenString string, envName string) bool { + whoAmIUrl, _ := url.Parse(fmt.Sprintf("https://trcc.%s/admin/whoami", envName)) + + req := &http.Request{ + Method: http.MethodGet, + URL: whoAmIUrl, + Header: map[string][]string{ + "Authorization": {fmt.Sprintf("bearer %s", tokenString)}, + }, + } + + response, err := http.DefaultClient.Do(req) + if err != nil { + return false + } + defer response.Body.Close() + + if response.StatusCode != http.StatusOK { + return false + } + + return true +} From 6caa94f08f3834494dabceaf093a3e323b3aae93 Mon Sep 17 00:00:00 2001 From: David Levanon Date: Sun, 21 Nov 2021 15:45:07 +0200 Subject: [PATCH 45/93] Add support to auto discover envoy processes (#459) * discover envoy pids using cluster ips * add istio flag to cli + rename mtls flag to istio * add istio.md to docs * Fixing typos * Fix minor typos and grammer in docs Co-authored-by: Nimrod Gilboa Markevich --- agent/main.go | 9 ++- cli/cmd/tap.go | 1 + cli/cmd/tapRunner.go | 1 + cli/config/config.go | 1 + cli/config/configStructs/tapConfig.go | 2 + docs/ISTIO.md | 46 +++++++++++ shared/kubernetes/mizuTapperSyncer.go | 2 + shared/kubernetes/provider.go | 7 +- shared/models.go | 1 + tap/passive_tapper.go | 22 ++--- tap/settings.go | 18 ----- tap/source/envoy_discoverer.go | 112 ++++++++++++++++++++++++++ tap/source/packet_source_manager.go | 61 +++++++++++--- tap/tcp_assembler.go | 4 +- tap/tcp_stream_factory.go | 14 ++-- 15 files changed, 248 insertions(+), 53 deletions(-) create mode 100644 docs/ISTIO.md create mode 100644 tap/source/envoy_discoverer.go diff --git a/agent/main.go b/agent/main.go index fbe5ab677..5866f670e 100644 --- a/agent/main.go +++ b/agent/main.go @@ -94,17 +94,17 @@ func main() { panic("API server address must be provided with --api-server-address when using --tap") } + hostMode := os.Getenv(shared.HostModeEnvVar) == "1" + tapOpts := &tap.TapOpts{HostMode: hostMode} tapTargets := getTapTargets() if tapTargets != nil { - tap.SetFilterAuthorities(tapTargets) - logger.Log.Infof("Filtering for the following authorities: %v", tap.GetFilterIPs()) + tapOpts.FilterAuthorities = tapTargets + logger.Log.Infof("Filtering for the following authorities: %v", tapOpts.FilterAuthorities) } filteredOutputItemsChannel := make(chan *tapApi.OutputChannelItem) filteringOptions := getTrafficFilteringOptions() - hostMode := os.Getenv(shared.HostModeEnvVar) == "1" - tapOpts := &tap.TapOpts{HostMode: hostMode} tap.StartPassiveTapper(tapOpts, filteredOutputItemsChannel, extensions, filteringOptions) socketConnection, err := dialSocketWithRetry(*apiServerAddress, socketConnectionRetries, socketConnectionRetryDelay) if err != nil { @@ -443,6 +443,7 @@ func startMizuTapperSyncer(ctx context.Context) (*kubernetes.MizuTapperSyncer, e IgnoredUserAgents: config.Config.IgnoredUserAgents, MizuApiFilteringOptions: config.Config.MizuApiFilteringOptions, MizuServiceAccountExists: true, //assume service account exists since daemon mode will not function without it anyway + Istio: config.Config.Istio, }) if err != nil { diff --git a/cli/cmd/tap.go b/cli/cmd/tap.go index e0a8a5578..f93a8f65a 100644 --- a/cli/cmd/tap.go +++ b/cli/cmd/tap.go @@ -120,4 +120,5 @@ func init() { tapCmd.Flags().String(configStructs.EnforcePolicyFile, defaultTapConfig.EnforcePolicyFile, "Yaml file path with policy rules") tapCmd.Flags().String(configStructs.ContractFile, defaultTapConfig.ContractFile, "OAS/Swagger file to validate to monitor the contracts") tapCmd.Flags().Bool(configStructs.DaemonModeTapName, defaultTapConfig.DaemonMode, "Run mizu in daemon mode, detached from the cli") + tapCmd.Flags().Bool(configStructs.IstioName, defaultTapConfig.Istio, "Record decrypted traffic if the cluster configured with istio and mtls") } diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 395963c56..589112168 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -214,6 +214,7 @@ func startTapperSyncer(ctx context.Context, cancel context.CancelFunc, provider IgnoredUserAgents: config.Config.Tap.IgnoredUserAgents, MizuApiFilteringOptions: mizuApiFilteringOptions, MizuServiceAccountExists: state.mizuServiceAccountExists, + Istio: config.Config.Tap.Istio, }) if err != nil { diff --git a/cli/config/config.go b/cli/config/config.go index 090b45f46..dc9501fab 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -402,6 +402,7 @@ func getMizuAgentConfig(targetNamespaces []string, mizuApiFilteringOptions *api. MizuResourcesNamespace: Config.MizuResourcesNamespace, MizuApiFilteringOptions: *mizuApiFilteringOptions, AgentDatabasePath: shared.DataDirPath, + Istio: Config.Tap.Istio, } return &config, nil } diff --git a/cli/config/configStructs/tapConfig.go b/cli/config/configStructs/tapConfig.go index fcc29ce13..43c29523d 100644 --- a/cli/config/configStructs/tapConfig.go +++ b/cli/config/configStructs/tapConfig.go @@ -25,6 +25,7 @@ const ( EnforcePolicyFile = "traffic-validation-file" ContractFile = "contract" DaemonModeTapName = "daemon" + IstioName = "istio" ) type TapConfig struct { @@ -48,6 +49,7 @@ type TapConfig struct { TapperResources shared.Resources `yaml:"tapper-resources"` DaemonMode bool `yaml:"daemon" default:"false"` NoPersistentVolumeClaim bool `yaml:"no-persistent-volume-claim" default:"false"` + Istio bool `yaml:"istio" default:"false"` } func (config *TapConfig) PodRegex() *regexp.Regexp { diff --git a/docs/ISTIO.md b/docs/ISTIO.md new file mode 100644 index 000000000..bda897b65 --- /dev/null +++ b/docs/ISTIO.md @@ -0,0 +1,46 @@ +![Mizu: The API Traffic Viewer for Kubernetes](../assets/mizu-logo.svg) +# Istio mutual tls (mtls) with Mizu +This document describe how Mizu tapper handles workloads configured with mtls, making the internal traffic between services in a cluster to be encrypted. + +Besides Istio there are other service meshes that implement mtls. However, as of now Istio is the most used one, and this is why we are focusing on it. + +In order to create an Istio setup for development, follow those steps: +1. Deploy a sample application to a Kubernetes cluster, the sample application needs to make internal service to service calls +2. SSH to one of the nodes, and run `tcpdump` +3. Make sure you see the internal service to service calls in a plain text +4. Deploy Istio to the cluster - make sure it is attached to all pods of the sample application, and that it is configured with mtls (default) +5. Run `tcpdump` again, make sure you don't see the internal service to service calls in a plain text + +## The connection between Istio and Envoy +In order to implement its service mesh capabilities, [Istio](https://istio.io) use an [Envoy](https://www.envoyproxy.io) sidecar in front of every pod in the cluster. The Envoy is responsible for the mtls communication, and that's why we are focusing on Envoy proxy. + +In the future we might see more players in that field, then we'll have to either add support for each of them or go with a unified eBPF solution. + +## Network namespaces +A [linux network namespace](https://man7.org/linux/man-pages/man7/network_namespaces.7.html) is an isolation that limit the process view of the network. In the container world it used to isolate one container from another. In the Kubernetes world it used to isolate a pod from another. That means that two containers running on the same pod share the same network namespace. A container can reach a container in the same pod by accessing `localhost`. + +An Envoy proxy configured with mtls receives the inbound traffic directed to the pod, decrypts it and sends it via `localhost` to the target container. + +## Tapping mtls traffic +In order for Mizu to be able to see the decrypted traffic it needs to listen on the same network namespace of the target pod. Multiple threads of the same process can have different network namespaces. + +[gopacket](https://github.com/google/gopacket) uses [libpacp](https://github.com/the-tcpdump-group/libpcap) by default for capturing the traffic. Libpacap doesn't support network namespaces and we can't ask it to listen to traffic on a different namespace. However, we can change the network namespace of the calling thread and then start libpcap to see the traffic on a different namespace. + +## Finding the network namespace of a running process +The network namespace of a running process can be found in `/proc/PID/ns/net` link. Once we have this link, we can ask Linux to change the network namespace of a thread to this one. + +This mean that Mizu needs to have access to the `/proc` (procfs) of the running node. + +## Finding the network namespace of a running pod +In order for Mizu to be able to listen to mtls traffic, it needs to get the PIDs of the the running pods, filter them according to the user filters and then start listen to their internal network namespace traffic. + +There is no official way in Kubernetes to get from pod to PID. The CRI implementation purposefully doesn't force a pod to be a processes on the host. It can be a Virtual Machine as well like [Kata containers](https://katacontainers.io) + +While we can provide a solution for various CRIs (like Docker, Containerd and CRI-O) it's better to have a unified solution. In order to achieve that, Mizu scans all the processes in the host, and finds the Envoy processes using their `/proc/PID/exe` link. + +Once Mizu detects an Envoy process, it need to check whether this specific Envoy process is relevant according the user filters. The user filters are a list of `CLUSTER_IPS`. The tapper gets them via the `TapOpts.FilterAuthorities` list. + +Istio sends an `INSTANCE_IP` environment variable to every Envoy proxy process. By examining the Envoy process's environment variables we can see whether it's relevant or not. Examining a process environment variables is done by reading the `/proc/PID/envion` file. + +## Edge cases +The method we use to find Envoy processes and correlate them to the cluster IPs may be inaccurate in certain situations. If, for example, a user runs an Envoy process manually, and set its `INSTANCE_IP` environment variable to one of the `CLUSTER_IPS` the tapper gets, then Mizu will capture traffic for it. diff --git a/shared/kubernetes/mizuTapperSyncer.go b/shared/kubernetes/mizuTapperSyncer.go index dca6877f4..10b8a5334 100644 --- a/shared/kubernetes/mizuTapperSyncer.go +++ b/shared/kubernetes/mizuTapperSyncer.go @@ -43,6 +43,7 @@ type TapperSyncerConfig struct { IgnoredUserAgents []string MizuApiFilteringOptions api.TrafficFilteringOptions MizuServiceAccountExists bool + Istio bool } func CreateAndStartMizuTapperSyncer(ctx context.Context, kubernetesProvider *Provider, config TapperSyncerConfig) (*MizuTapperSyncer, error) { @@ -222,6 +223,7 @@ func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error { tapperSyncer.config.ImagePullPolicy, tapperSyncer.config.MizuApiFilteringOptions, tapperSyncer.config.LogLevel, + tapperSyncer.config.Istio, ); err != nil { return err } diff --git a/shared/kubernetes/provider.go b/shared/kubernetes/provider.go index d0647c3ef..649444a49 100644 --- a/shared/kubernetes/provider.go +++ b/shared/kubernetes/provider.go @@ -612,7 +612,7 @@ func (provider *Provider) CreateConfigMap(ctx context.Context, namespace string, return nil } -func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespace string, daemonSetName string, podImage string, tapperPodName string, apiServerPodIp string, nodeToTappedPodIPMap map[string][]string, serviceAccountName string, resources shared.Resources, imagePullPolicy core.PullPolicy, mizuApiFilteringOptions api.TrafficFilteringOptions, logLevel logging.Level) error { +func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespace string, daemonSetName string, podImage string, tapperPodName string, apiServerPodIp string, nodeToTappedPodIPMap map[string][]string, serviceAccountName string, resources shared.Resources, imagePullPolicy core.PullPolicy, mizuApiFilteringOptions api.TrafficFilteringOptions, logLevel logging.Level, istio bool) error { logger.Log.Debugf("Applying %d tapper daemon sets, ns: %s, daemonSetName: %s, podImage: %s, tapperPodName: %s", len(nodeToTappedPodIPMap), namespace, daemonSetName, podImage, tapperPodName) if len(nodeToTappedPodIPMap) == 0 { @@ -635,7 +635,10 @@ func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespac "--tap", "--api-server-address", fmt.Sprintf("ws://%s/wsTapper", apiServerPodIp), "--nodefrag", - "--procfs", procfsMountPath, + } + + if istio { + mizuCmd = append(mizuCmd, "--procfs", procfsMountPath, "--istio") } agentContainer := applyconfcore.Container() diff --git a/shared/models.go b/shared/models.go index c0adfc117..1d3893274 100644 --- a/shared/models.go +++ b/shared/models.go @@ -43,6 +43,7 @@ type MizuAgentConfig struct { MizuResourcesNamespace string `json:"mizuResourceNamespace"` MizuApiFilteringOptions api.TrafficFilteringOptions `json:"mizuApiFilteringOptions"` AgentDatabasePath string `json:"agentDatabasePath"` + Istio bool `json:"istio"` } type WebSocketMessageMetadata struct { diff --git a/tap/passive_tapper.go b/tap/passive_tapper.go index d1230d50e..251021359 100644 --- a/tap/passive_tapper.go +++ b/tap/passive_tapper.go @@ -50,14 +50,15 @@ var tstype = flag.String("timestamp_type", "", "Type of timestamps to use") var promisc = flag.Bool("promisc", true, "Set promiscuous mode") var staleTimeoutSeconds = flag.Int("staletimout", 120, "Max time in seconds to keep connections which don't transmit data") var pids = flag.String("pids", "", "A comma separated list of PIDs to capture their network namespaces") +var istio = flag.Bool("istio", false, "Record decrypted traffic if the cluster configured with istio and mtls") var memprofile = flag.String("memprofile", "", "Write memory profile") type TapOpts struct { - HostMode bool + HostMode bool + FilterAuthorities []string } -var hostMode bool // global var extensions []*api.Extension // global var filteringOptions *api.TrafficFilteringOptions // global @@ -80,15 +81,18 @@ func inArrayString(arr []string, valueToCheck string) bool { } func StartPassiveTapper(opts *TapOpts, outputItems chan *api.OutputChannelItem, extensionsRef []*api.Extension, options *api.TrafficFilteringOptions) { - hostMode = opts.HostMode extensions = extensionsRef filteringOptions = options + if opts.FilterAuthorities == nil { + opts.FilterAuthorities = []string{} + } + if GetMemoryProfilingEnabled() { diagnose.StartMemoryProfiler(os.Getenv(MemoryProfilingDumpPath), os.Getenv(MemoryProfilingTimeIntervalSeconds)) } - go startPassiveTapper(outputItems) + go startPassiveTapper(opts, outputItems) } func printPeriodicStats(cleaner *Cleaner) { @@ -131,7 +135,7 @@ func printPeriodicStats(cleaner *Cleaner) { } } -func initializePacketSources() (*source.PacketSourceManager, error) { +func initializePacketSources(opts *TapOpts) (*source.PacketSourceManager, error) { var bpffilter string if len(flag.Args()) > 0 { bpffilter = strings.Join(flag.Args(), " ") @@ -146,17 +150,17 @@ func initializePacketSources() (*source.PacketSourceManager, error) { BpfFilter: bpffilter, } - return source.NewPacketSourceManager(*procfs, *pids, *fname, *iface, behaviour) + return source.NewPacketSourceManager(*procfs, *pids, *fname, *iface, *istio, opts.FilterAuthorities, behaviour) } -func startPassiveTapper(outputItems chan *api.OutputChannelItem) { +func startPassiveTapper(opts *TapOpts, outputItems chan *api.OutputChannelItem) { streamsMap := NewTcpStreamMap() go streamsMap.closeTimedoutTcpStreamChannels() diagnose.InitializeErrorsMap(*debug, *verbose, *quiet) diagnose.InitializeTapperInternalStats() - sources, err := initializePacketSources() + sources, err := initializePacketSources(opts) if err != nil { logger.Log.Fatal(err) @@ -169,7 +173,7 @@ func startPassiveTapper(outputItems chan *api.OutputChannelItem) { } packets := make(chan source.TcpPacketInfo) - assembler := NewTcpAssembler(outputItems, streamsMap) + assembler := NewTcpAssembler(outputItems, streamsMap, opts) diagnose.AppStats.SetStartTime(time.Now()) diff --git a/tap/settings.go b/tap/settings.go index 4e3b6c4a4..b9e25da6d 100644 --- a/tap/settings.go +++ b/tap/settings.go @@ -18,24 +18,6 @@ const ( TcpStreamChannelTimeoutMsDefaultValue = 10000 ) -type globalSettings struct { - filterAuthorities []string -} - -var gSettings = &globalSettings{ - filterAuthorities: []string{}, -} - -func SetFilterAuthorities(ipAddresses []string) { - gSettings.filterAuthorities = ipAddresses -} - -func GetFilterIPs() []string { - addresses := make([]string, len(gSettings.filterAuthorities)) - copy(addresses, gSettings.filterAuthorities) - return addresses -} - func GetMaxBufferedPagesTotal() int { valueFromEnv, err := strconv.Atoi(os.Getenv(MaxBufferedPagesTotalEnvVarName)) if err != nil { diff --git a/tap/source/envoy_discoverer.go b/tap/source/envoy_discoverer.go new file mode 100644 index 000000000..cf5d1e28f --- /dev/null +++ b/tap/source/envoy_discoverer.go @@ -0,0 +1,112 @@ +package source + +import ( + "fmt" + "io/ioutil" + "os" + "regexp" + "strings" + + "github.com/up9inc/mizu/shared/logger" +) + +const envoyBinary = "/envoy" + +var numberRegex = regexp.MustCompile("[0-9]+") + +func discoverRelevantEnvoyPids(procfs string, clusterIps []string) ([]string, error) { + result := make([]string, 0) + + pids, err := ioutil.ReadDir(procfs) + + if err != nil { + return result, err + } + + logger.Log.Infof("Starting envoy auto discoverer %v %v - scanning %v potential pids", + procfs, clusterIps, len(pids)) + + for _, pid := range pids { + if !pid.IsDir() { + continue + } + + if !numberRegex.MatchString(pid.Name()) { + continue + } + + if checkPid(procfs, pid.Name(), clusterIps) { + result = append(result, pid.Name()) + } + } + + logger.Log.Infof("Found %v relevant envoy processes - %v", len(result), result) + + return result, nil +} + +func checkPid(procfs string, pid string, clusterIps []string) bool { + execLink := fmt.Sprintf("%v/%v/exe", procfs, pid) + exec, err := os.Readlink(execLink) + + if err != nil { + // Debug on purpose - it may happen due to many reasons and we only care + // for it during troubleshooting + // + logger.Log.Debugf("Unable to read link %v - %v\n", execLink, err) + return false + } + + if !strings.HasSuffix(exec, envoyBinary) { + return false + } + + environmentFile := fmt.Sprintf("%v/%v/environ", procfs, pid) + clusterIp, err := readEnvironmentVariable(environmentFile, "INSTANCE_IP") + + if err != nil { + return false + } + + if clusterIp == "" { + logger.Log.Debugf("Found an envoy process without INSTANCE_IP variable %v\n", pid) + return false + } + + logger.Log.Infof("Found envoy pid %v with cluster ip %v", pid, clusterIp) + + for _, value := range clusterIps { + if value == clusterIp { + return true + } + } + + return false +} + +func readEnvironmentVariable(file string, name string) (string, error) { + bytes, err := ioutil.ReadFile(file) + + if err != nil { + logger.Log.Warningf("Error reading environment file %v - %v", file, err) + return "", err + } + + envs := strings.Split(string(bytes), string([]byte{0})) + + for _, env := range envs { + if !strings.Contains(env, "=") { + continue + } + + parts := strings.Split(env, "=") + varName := parts[0] + value := parts[1] + + if name == varName { + return value, nil + } + } + + return "", nil +} diff --git a/tap/source/packet_source_manager.go b/tap/source/packet_source_manager.go index 41ed1344d..5d9df21d8 100644 --- a/tap/source/packet_source_manager.go +++ b/tap/source/packet_source_manager.go @@ -15,26 +15,63 @@ type PacketSourceManager struct { } func NewPacketSourceManager(procfs string, pids string, filename string, interfaceName string, - behaviour TcpPacketSourceBehaviour) (*PacketSourceManager, error) { + istio bool, clusterIps []string, behaviour TcpPacketSourceBehaviour) (*PacketSourceManager, error) { sources := make([]*tcpPacketSource, 0) - hostSource, err := newHostPacketSource(filename, interfaceName, behaviour) + sources, err := createHostSource(sources, filename, interfaceName, behaviour) if err != nil { return nil, err } - sources = append(sources, hostSource) - - if pids != "" { - netnsSources := newNetnsPacketSources(procfs, pids, interfaceName, behaviour) - sources = append(sources, netnsSources...) - } + sources = createSourcesFromPids(sources, procfs, pids, interfaceName, behaviour) + sources = createSourcesFromEnvoy(sources, istio, procfs, clusterIps, interfaceName, behaviour) return &PacketSourceManager{ sources: sources, }, nil } +func createHostSource(sources []*tcpPacketSource, filename string, interfaceName string, + behaviour TcpPacketSourceBehaviour) ([]*tcpPacketSource, error) { + hostSource, err := newHostPacketSource(filename, interfaceName, behaviour) + + if err != nil { + return sources, err + } + + return append(sources, hostSource), nil +} + +func createSourcesFromPids(sources []*tcpPacketSource, procfs string, pids string, + interfaceName string, behaviour TcpPacketSourceBehaviour) []*tcpPacketSource { + if pids == "" { + return sources + } + + netnsSources := newNetnsPacketSources(procfs, strings.Split(pids, ","), interfaceName, behaviour) + sources = append(sources, netnsSources...) + return sources +} + +func createSourcesFromEnvoy(sources []*tcpPacketSource, istio bool, procfs string, clusterIps []string, + interfaceName string, behaviour TcpPacketSourceBehaviour) []*tcpPacketSource { + if !istio { + return sources + } + + envoyPids, err := discoverRelevantEnvoyPids(procfs, clusterIps) + + if err != nil { + logger.Log.Warningf("Unable to discover envoy pids - %v", err) + return sources + } + + netnsSources := newNetnsPacketSources(procfs, envoyPids, interfaceName, behaviour) + sources = append(sources, netnsSources...) + + return sources +} + func newHostPacketSource(filename string, interfaceName string, behaviour TcpPacketSourceBehaviour) (*tcpPacketSource, error) { var name string @@ -54,11 +91,11 @@ func newHostPacketSource(filename string, interfaceName string, return source, nil } -func newNetnsPacketSources(procfs string, pids string, interfaceName string, +func newNetnsPacketSources(procfs string, pids []string, interfaceName string, behaviour TcpPacketSourceBehaviour) []*tcpPacketSource { result := make([]*tcpPacketSource, 0) - for _, pidstr := range strings.Split(pids, ",") { + for _, pidstr := range pids { pid, err := strconv.Atoi(pidstr) if err != nil { @@ -100,9 +137,9 @@ func newNetnsPacketSource(pid int, nsh netns.NsHandle, interfaceName string, // runtime.LockOSThread() defer runtime.UnlockOSThread() - + oldnetns, err := netns.Get() - + if err != nil { logger.Log.Errorf("Unable to get netns of current thread %v", err) errors <- err diff --git a/tap/tcp_assembler.go b/tap/tcp_assembler.go index 78943ab77..fa0d05c9d 100644 --- a/tap/tcp_assembler.go +++ b/tap/tcp_assembler.go @@ -33,13 +33,13 @@ func (c *context) GetCaptureInfo() gopacket.CaptureInfo { return c.CaptureInfo } -func NewTcpAssembler(outputItems chan *api.OutputChannelItem, streamsMap *tcpStreamMap) *tcpAssembler { +func NewTcpAssembler(outputItems chan *api.OutputChannelItem, streamsMap *tcpStreamMap, opts *TapOpts) *tcpAssembler { var emitter api.Emitter = &api.Emitting{ AppStats: &diagnose.AppStats, OutputChannel: outputItems, } - streamFactory := NewTcpStreamFactory(emitter, streamsMap) + streamFactory := NewTcpStreamFactory(emitter, streamsMap, opts) streamPool := reassembly.NewStreamPool(streamFactory) assembler := reassembly.NewAssembler(streamPool) diff --git a/tap/tcp_stream_factory.go b/tap/tcp_stream_factory.go index 5176f20aa..96527bf9e 100644 --- a/tap/tcp_stream_factory.go +++ b/tap/tcp_stream_factory.go @@ -24,6 +24,7 @@ type tcpStreamFactory struct { Emitter api.Emitter streamsMap *tcpStreamMap ownIps []string + opts *TapOpts } type tcpStreamWrapper struct { @@ -31,7 +32,7 @@ type tcpStreamWrapper struct { createdAt time.Time } -func NewTcpStreamFactory(emitter api.Emitter, streamsMap *tcpStreamMap) *tcpStreamFactory { +func NewTcpStreamFactory(emitter api.Emitter, streamsMap *tcpStreamMap, opts *TapOpts) *tcpStreamFactory { var ownIps []string if localhostIPs, err := getLocalhostIPs(); err != nil { @@ -47,6 +48,7 @@ func NewTcpStreamFactory(emitter api.Emitter, streamsMap *tcpStreamMap) *tcpStre Emitter: emitter, streamsMap: streamsMap, ownIps: ownIps, + opts: opts, } } @@ -139,17 +141,17 @@ func (factory *tcpStreamFactory) WaitGoRoutines() { } func (factory *tcpStreamFactory) getStreamProps(srcIP string, srcPort string, dstIP string, dstPort string) *streamProps { - if hostMode { - if inArrayString(gSettings.filterAuthorities, fmt.Sprintf("%s:%s", dstIP, dstPort)) { + if factory.opts.HostMode { + if inArrayString(factory.opts.FilterAuthorities, fmt.Sprintf("%s:%s", dstIP, dstPort)) { logger.Log.Debugf("getStreamProps %s", fmt.Sprintf("+ host1 %s:%s", dstIP, dstPort)) return &streamProps{isTapTarget: true, isOutgoing: false} - } else if inArrayString(gSettings.filterAuthorities, dstIP) { + } else if inArrayString(factory.opts.FilterAuthorities, dstIP) { logger.Log.Debugf("getStreamProps %s", fmt.Sprintf("+ host2 %s", dstIP)) return &streamProps{isTapTarget: true, isOutgoing: false} - } else if inArrayString(gSettings.filterAuthorities, fmt.Sprintf("%s:%s", srcIP, srcPort)) { + } else if inArrayString(factory.opts.FilterAuthorities, fmt.Sprintf("%s:%s", srcIP, srcPort)) { logger.Log.Debugf("getStreamProps %s", fmt.Sprintf("+ host3 %s:%s", srcIP, srcPort)) return &streamProps{isTapTarget: true, isOutgoing: true} - } else if inArrayString(gSettings.filterAuthorities, srcIP) { + } else if inArrayString(factory.opts.FilterAuthorities, srcIP) { logger.Log.Debugf("getStreamProps %s", fmt.Sprintf("+ host4 %s", srcIP)) return &streamProps{isTapTarget: true, isOutgoing: true} } From c026656b5ea8918eea0b228b0e2dcb803a9cc1b3 Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Sun, 21 Nov 2021 19:37:02 +0200 Subject: [PATCH 46/93] Improving daemon documentation (#457) --- README.md | 31 ++---------------- docs/DAEMON_MODE.md | 80 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 28 deletions(-) create mode 100644 docs/DAEMON_MODE.md diff --git a/README.md b/README.md index 9df60ecd2..2960ec753 100644 --- a/README.md +++ b/README.md @@ -107,27 +107,6 @@ To tap all pods in current namespace - Web interface is now available at http://localhost:8899 ^C ``` -### To run mizu mizu daemon mode (detached from cli) -```bash -$ mizu tap "^ca.*" --daemon - Mizu will store up to 200MB of traffic, old traffic will be cleared once the limit is reached. - Tapping pods in namespaces "sock-shop" - Waiting for mizu to be ready... (may take a few minutes) - +carts-66c77f5fbb-fq65r - +catalogue-5f4cb7cf5-7zrmn - .. - -$ mizu view - Establishing connection to k8s cluster... - Mizu is available at http://localhost:8899 - ^C - .. - -$ mizu clean # mizu will continue running in cluster until clean is executed - Removing mizu resources -``` - -`mizu view` provides one way to access Mizu. For other options, see [Accessing Mizu Wiki Page](https://github.com/up9inc/mizu/wiki/Accessing-Mizu). ## Configuration @@ -202,14 +181,10 @@ and when changed it will support accessing by IP ### Run in daemon mode -Mizu can be ran detached from the cli using the daemon flag: `mizu tap --daemon`. This type of mizu instance will run indefinitely in the cluster. - -Please note that daemon mode requires you to have RBAC creation permissions, see the [permissions](docs/PERMISSIONS.md) doc for more details. - -In order to access a daemon mizu you will have to run `mizu view` after running the `tap --daemon` command. - -To stop the detached mizu instance and clean all cluster side resources, run `mizu clean` +Mizu can be run detached from the cli using the daemon flag: `mizu tap --daemon`. This type of mizu instance will run +indefinitely in the cluster. +For more information please refer to [DAEMON MODE](docs/DAEMON_MODE.md) ## How to Run local UI diff --git a/docs/DAEMON_MODE.md b/docs/DAEMON_MODE.md new file mode 100644 index 000000000..ab28d7d12 --- /dev/null +++ b/docs/DAEMON_MODE.md @@ -0,0 +1,80 @@ +# Mizu daemon mode + +Mizu can be run detached from the cli using the daemon flag: `mizu tap --daemon`. This type of mizu instance will run +indefinitely in the cluster. + +Please note that daemon mode requires you to have RBAC creation permissions, see the [permissions](PERMISSIONS.md) +doc for more details. + +```bash +$ mizu tap "^ca.*" --daemon + Mizu will store up to 200MB of traffic, old traffic will be cleared once the limit is reached. + Tapping pods in namespaces "sock-shop" + Waiting for mizu to be ready... (may take a few minutes) + +carts-66c77f5fbb-fq65r + +catalogue-5f4cb7cf5-7zrmn + .. +``` + +## Stop mizu daemon + +To stop the detached mizu instance and clean all cluster side resources, run `mizu clean` + +```bash +$ mizu clean # mizu will continue running in cluster until clean is executed + Removing mizu resources +``` + +## Expose mizu web app + +Mizu could be exposed at a later stage in any of the following ways: + +### Using mizu view command + +In a machine that can access both the cluster and a browser, you can run `mizu view` command which creates a proxy. +Besides that, all the regular ways to expose k8s pods are valid. + +```bash +$ mizu view + Establishing connection to k8s cluster... + Mizu is available at http://localhost:8899 + ^C + .. +``` + +### Port Forward + +```bash +$ kubectl port-forward -n mizu deployment/mizu-api-server 8899:8899 +``` + +### NodePort + +```bash +$ kubectl expose -n mizu deployment mizu-api-server --name mizu-node-port --type NodePort --port 80 --target-port 8899 +``` + +Mizu's IP is the IP of any node (get the IP with `kubectl get nodes -o wide`) and the port is the target port of the new +service (`kubectl get services -n mizu mizu-node-port`). Note that this method will expose Mizu to public access if your +nodes are public. + +### LoadBalancer + +```bash +$ kubectl expose deployment -n mizu --port 80 --target-port 8899 mizu-api-server --type=LoadBalancer --name=mizu-lb + service/mizu-lb exposed + .. + +$ kubectl get services -n mizu + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + mizu-api-server ClusterIP 10.107.200.100 80/TCP 5m5s + mizu-lb LoadBalancer 10.107.200.101 34.77.120.116 80:30141/TCP 76s +``` + +Note that `LoadBalancer` services only work on supported clusters (usually cloud providers) and might incur extra costs + +If you changed the `mizu-resources-namespace` value, make sure the `-n mizu` flag of the `kubectl expose` command is +changed to the value of `mizu-resources-namespace` + +mizu will now be available both by running `mizu view` or by accessing the `EXTERNAL-IP` of the `mizu-lb` service +through your browser. From ed7b754eca314bb3dcdaab6c51f021e04b2c00c2 Mon Sep 17 00:00:00 2001 From: Alon Girmonsky <1990761+alongir@users.noreply.github.com> Date: Sun, 21 Nov 2021 23:02:33 -0800 Subject: [PATCH 47/93] Some changes to the doc (#494) --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2960ec753..0ceace408 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A simple-yet-powerful API traffic viewer for Kubernetes enabling you to view all API communication between microservices to help your debug and troubleshoot regressions. -Think TCPDump and Chrome Dev Tools combined. +Think TCPDump and Wireshark re-invented for Kubernetes. ![Simple UI](assets/mizu-ui.png) @@ -12,13 +12,13 @@ Think TCPDump and Chrome Dev Tools combined. - Simple and powerful CLI - Monitoring network traffic in real-time. Supported protocols: - - [HTTP/1.1](https://datatracker.ietf.org/doc/html/rfc2616) + - [HTTP/1.1](https://datatracker.ietf.org/doc/html/rfc2616) (REST, etc.) - [HTTP/2](https://datatracker.ietf.org/doc/html/rfc7540) (gRPC) - [AMQP](https://www.rabbitmq.com/amqp-0-9-1-reference.html) (RabbitMQ, Apache Qpid, etc.) - [Apache Kafka](https://kafka.apache.org/protocol) - [Redis](https://redis.io/topics/protocol) -- No installation or code instrumentation -- Works completely on premises +- Works with Kubernetes APIs. No installation or code instrumentation +- Rich filtering ## Requirements From b1ad2efb96d7a2f21fe5469521853f05246dcf7f Mon Sep 17 00:00:00 2001 From: Nimrod Gilboa Markevich <59927337+nimrod-up9@users.noreply.github.com> Date: Mon, 22 Nov 2021 15:30:10 +0200 Subject: [PATCH 48/93] Warn pods not starting (#493) Print warning event related to mizu k8s resources. In non-daemon print to CLI. In Daemon print to API-Server logs. --- agent/main.go | 100 ++++++++++++++++-- cli/cmd/tapRunner.go | 88 ++++++++++++++- .../permissions-all-namespaces-daemon.yaml | 3 + ...-all-namespaces-without-ip-resolution.yaml | 3 + .../roles/permissions-all-namespaces.yaml | 3 + examples/roles/permissions-ns-daemon.yaml | 3 + .../roles/permissions-ns-with-validation.yaml | 3 + .../permissions-ns-without-ip-resolution.yaml | 3 + examples/roles/permissions-ns.yaml | 3 + shared/kubernetes/eventWatchHelper.go | 45 ++++++++ shared/kubernetes/podWatchHelper.go | 8 +- shared/kubernetes/provider.go | 5 + shared/kubernetes/watch.go | 7 +- shared/kubernetes/watchEvent.go | 28 ++++- 14 files changed, 285 insertions(+), 17 deletions(-) create mode 100644 shared/kubernetes/eventWatchHelper.go diff --git a/agent/main.go b/agent/main.go index 5866f670e..c3a87fe69 100644 --- a/agent/main.go +++ b/agent/main.go @@ -22,6 +22,7 @@ import ( "path" "path/filepath" "plugin" + "regexp" "sort" "syscall" "time" @@ -264,9 +265,16 @@ func hostApi(socketHarOutputChannel chan<- *tapApi.OutputChannelItem) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - if _, err := startMizuTapperSyncer(ctx); err != nil { + kubernetesProvider, err := kubernetes.NewProviderInCluster() + if err != nil { + logger.Log.Fatalf("error creating k8s provider: %+v", err) + } + + if _, err := startMizuTapperSyncer(ctx, kubernetesProvider); err != nil { logger.Log.Fatalf("error initializing tapper syncer: %+v", err) } + + go watchMizuEvents(ctx, kubernetesProvider, cancel) } utils.StartServer(app) @@ -426,12 +434,7 @@ func dialSocketWithRetry(socketAddress string, retryAmount int, retryDelay time. return nil, lastErr } -func startMizuTapperSyncer(ctx context.Context) (*kubernetes.MizuTapperSyncer, error) { - provider, err := kubernetes.NewProviderInCluster() - if err != nil { - return nil, err - } - +func startMizuTapperSyncer(ctx context.Context, provider *kubernetes.Provider) (*kubernetes.MizuTapperSyncer, error) { tapperSyncer, err := kubernetes.CreateAndStartMizuTapperSyncer(ctx, provider, kubernetes.TapperSyncerConfig{ TargetNamespaces: config.Config.TargetNamespaces, PodFilterRegex: config.Config.TapTargetRegex.Regexp, @@ -483,3 +486,86 @@ func startMizuTapperSyncer(ctx context.Context) (*kubernetes.MizuTapperSyncer, e return tapperSyncer, nil } + +func watchMizuEvents(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { + // Round down because k8s CreationTimestamp is given in 1 sec resolution. + startTime := time.Now().Truncate(time.Second) + + mizuResourceRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", kubernetes.MizuResourcesPrefix)) + eventWatchHelper := kubernetes.NewEventWatchHelper(kubernetesProvider, mizuResourceRegex) + added, modified, removed, errorChan := kubernetes.FilteredWatch(ctx, eventWatchHelper, []string{config.Config.MizuResourcesNamespace}, eventWatchHelper) + + for { + select { + case wEvent, ok := <-added: + if !ok { + added = nil + continue + } + + event, err := wEvent.ToEvent() + if err != nil { + logger.Log.Errorf("error parsing Mizu resource added event: %+v", err) + cancel() + } + + if startTime.After(event.CreationTimestamp.Time) { + continue + } + + if event.Type == v1.EventTypeWarning { + logger.Log.Warningf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note) + } + case wEvent, ok := <-removed: + if !ok { + removed = nil + continue + } + + event, err := wEvent.ToEvent() + if err != nil { + logger.Log.Errorf("error parsing Mizu resource removed event: %+v", err) + cancel() + } + + if startTime.After(event.CreationTimestamp.Time) { + continue + } + + if event.Type == v1.EventTypeWarning { + logger.Log.Warningf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note) + } + case wEvent, ok := <-modified: + if !ok { + modified = nil + continue + } + + event, err := wEvent.ToEvent() + if err != nil { + logger.Log.Errorf("error parsing Mizu resource modified event: %+v", err) + cancel() + } + + if startTime.After(event.CreationTimestamp.Time) { + continue + } + + if event.Type == v1.EventTypeWarning { + logger.Log.Warningf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note) + } + case err, ok := <-errorChan: + if !ok { + errorChan = nil + continue + } + + logger.Log.Errorf("error in watch mizu resource events loop: %+v", err) + cancel() + + case <-ctx.Done(): + logger.Log.Debugf("watching Mizu resource events loop, ctx done") + return + } + } +} diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 589112168..17b5d76d3 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -42,6 +42,8 @@ var state tapState var apiProvider *apiserver.Provider func RunMizuTap() { + startTime := time.Now() + mizuApiFilteringOptions, err := getMizuApiFilteringOptions() apiProvider = apiserver.NewProvider(GetApiServerUrl(), apiserver.DefaultRetries, apiserver.DefaultTimeout) if err != nil { @@ -150,6 +152,7 @@ func RunMizuTap() { go goUtils.HandleExcWrapper(watchApiServerPod, ctx, kubernetesProvider, cancel) go goUtils.HandleExcWrapper(watchTapperPod, ctx, kubernetesProvider, cancel) + go goUtils.HandleExcWrapper(watchMizuEvents, ctx, kubernetesProvider, cancel, startTime) // block until exit signal or error waitForFinish(ctx, cancel) @@ -727,7 +730,7 @@ func watchTapperPod(ctx context.Context, kubernetesProvider *kubernetes.Provider continue } - logger.Log.Errorf("[Error] Error in mizu tapper watch, err: %v", err) + logger.Log.Errorf("[Error] Error in mizu tapper pod watch, err: %v", err) cancel() case <-ctx.Done(): @@ -737,6 +740,89 @@ func watchTapperPod(ctx context.Context, kubernetesProvider *kubernetes.Provider } } +func watchMizuEvents(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc, startTime time.Time) { + // Round down because k8s CreationTimestamp is given in 1 sec resolution. + startTime = startTime.Truncate(time.Second) + + mizuResourceRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", kubernetes.MizuResourcesPrefix)) + eventWatchHelper := kubernetes.NewEventWatchHelper(kubernetesProvider, mizuResourceRegex) + added, modified, removed, errorChan := kubernetes.FilteredWatch(ctx, eventWatchHelper, []string{config.Config.MizuResourcesNamespace}, eventWatchHelper) + + for { + select { + case wEvent, ok := <-added: + if !ok { + added = nil + continue + } + + event, err := wEvent.ToEvent() + if err != nil { + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("error parsing Mizu resource added event: %+v", err)) + cancel() + } + + if startTime.After(event.CreationTimestamp.Time) { + continue + } + + if event.Type == core.EventTypeWarning { + logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note)) + } + case wEvent, ok := <-removed: + if !ok { + removed = nil + continue + } + + event, err := wEvent.ToEvent() + if err != nil { + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("error parsing Mizu resource removed event: %+v", err)) + cancel() + } + + if startTime.After(event.CreationTimestamp.Time) { + continue + } + + if event.Type == core.EventTypeWarning { + logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note)) + } + case wEvent, ok := <-modified: + if !ok { + modified = nil + continue + } + + event, err := wEvent.ToEvent() + if err != nil { + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("error parsing Mizu resource modified event: %+v", err)) + cancel() + } + + if startTime.After(event.CreationTimestamp.Time) { + continue + } + + if event.Type == core.EventTypeWarning { + logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note)) + } + case err, ok := <-errorChan: + if !ok { + errorChan = nil + continue + } + + logger.Log.Errorf("error in watch mizu resource events loop: %+v", err) + cancel() + + case <-ctx.Done(): + logger.Log.Debugf("watching Mizu resource events loop, ctx done") + return + } + } +} + func getNamespaces(kubernetesProvider *kubernetes.Provider) []string { if config.Config.Tap.AllNamespaces { return []string{kubernetes.K8sAllNamespaces} diff --git a/examples/roles/permissions-all-namespaces-daemon.yaml b/examples/roles/permissions-all-namespaces-daemon.yaml index 3cbc16a13..99d36110e 100644 --- a/examples/roles/permissions-all-namespaces-daemon.yaml +++ b/examples/roles/permissions-all-namespaces-daemon.yaml @@ -49,6 +49,9 @@ rules: - apiGroups: ["", "apps", "extensions"] resources: ["endpoints"] verbs: ["get", "list", "watch"] + - apiGroups: ["events.k8s.io"] + resources: ["events"] + verbs: ["list", "watch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 diff --git a/examples/roles/permissions-all-namespaces-without-ip-resolution.yaml b/examples/roles/permissions-all-namespaces-without-ip-resolution.yaml index bced278e9..0a743e776 100644 --- a/examples/roles/permissions-all-namespaces-without-ip-resolution.yaml +++ b/examples/roles/permissions-all-namespaces-without-ip-resolution.yaml @@ -23,6 +23,9 @@ rules: - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "create", "delete"] + - apiGroups: ["events.k8s.io"] + resources: ["events"] + verbs: ["list", "watch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 diff --git a/examples/roles/permissions-all-namespaces.yaml b/examples/roles/permissions-all-namespaces.yaml index 097d276e0..7b8b065ee 100644 --- a/examples/roles/permissions-all-namespaces.yaml +++ b/examples/roles/permissions-all-namespaces.yaml @@ -46,6 +46,9 @@ rules: - apiGroups: ["", "apps", "extensions"] resources: ["endpoints"] verbs: ["get", "list", "watch"] +- apiGroups: ["events.k8s.io"] + resources: ["events"] + verbs: ["list", "watch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 diff --git a/examples/roles/permissions-ns-daemon.yaml b/examples/roles/permissions-ns-daemon.yaml index 589470678..0ab880f11 100644 --- a/examples/roles/permissions-ns-daemon.yaml +++ b/examples/roles/permissions-ns-daemon.yaml @@ -41,6 +41,9 @@ rules: - apiGroups: ["", "apps", "extensions"] resources: ["endpoints"] verbs: ["get", "list", "watch"] +- apiGroups: ["events.k8s.io"] + resources: ["events"] + verbs: ["list", "watch"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 diff --git a/examples/roles/permissions-ns-with-validation.yaml b/examples/roles/permissions-ns-with-validation.yaml index e2d6863ec..a3e3eceb2 100644 --- a/examples/roles/permissions-ns-with-validation.yaml +++ b/examples/roles/permissions-ns-with-validation.yaml @@ -38,6 +38,9 @@ rules: - apiGroups: ["", "apps", "extensions"] resources: ["endpoints"] verbs: ["get", "list", "watch"] +- apiGroups: ["events.k8s.io"] + resources: ["events"] + verbs: ["list", "watch"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 diff --git a/examples/roles/permissions-ns-without-ip-resolution.yaml b/examples/roles/permissions-ns-without-ip-resolution.yaml index ef14933a1..24bc0d822 100644 --- a/examples/roles/permissions-ns-without-ip-resolution.yaml +++ b/examples/roles/permissions-ns-without-ip-resolution.yaml @@ -20,6 +20,9 @@ rules: - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "create", "delete"] +- apiGroups: ["events.k8s.io"] + resources: ["events"] + verbs: ["list", "watch"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 diff --git a/examples/roles/permissions-ns.yaml b/examples/roles/permissions-ns.yaml index 3af89afa0..6974ab50f 100644 --- a/examples/roles/permissions-ns.yaml +++ b/examples/roles/permissions-ns.yaml @@ -38,6 +38,9 @@ rules: - apiGroups: ["", "apps", "extensions"] resources: ["endpoints"] verbs: ["get", "list", "watch"] +- apiGroups: ["events.k8s.io"] + resources: ["events"] + verbs: ["list", "watch"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 diff --git a/shared/kubernetes/eventWatchHelper.go b/shared/kubernetes/eventWatchHelper.go new file mode 100644 index 000000000..3ec3cb956 --- /dev/null +++ b/shared/kubernetes/eventWatchHelper.go @@ -0,0 +1,45 @@ +package kubernetes + +import ( + "context" + "regexp" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/watch" +) + +type EventWatchHelper struct { + kubernetesProvider *Provider + NameRegexFilter *regexp.Regexp +} + +func NewEventWatchHelper(kubernetesProvider *Provider, NameRegexFilter *regexp.Regexp) *EventWatchHelper { + return &EventWatchHelper{ + kubernetesProvider: kubernetesProvider, + NameRegexFilter: NameRegexFilter, + } +} + +// Implements the EventFilterer Interface +func (wh *EventWatchHelper) Filter(wEvent *WatchEvent) (bool, error) { + event, err := wEvent.ToEvent() + if err != nil { + return false, nil + } + + if !wh.NameRegexFilter.MatchString(event.Name) { + return false, nil + } + + return true, nil +} + +// Implements the WatchCreator Interface +func (wh *EventWatchHelper) NewWatcher(ctx context.Context, namespace string) (watch.Interface, error) { + watcher, err := wh.kubernetesProvider.clientSet.EventsV1().Events(namespace).Watch(ctx, metav1.ListOptions{Watch: true}) + if err != nil { + return nil, err + } + + return watcher, nil +} diff --git a/shared/kubernetes/podWatchHelper.go b/shared/kubernetes/podWatchHelper.go index 2184eeb43..771964466 100644 --- a/shared/kubernetes/podWatchHelper.go +++ b/shared/kubernetes/podWatchHelper.go @@ -21,13 +21,13 @@ func NewPodWatchHelper(kubernetesProvider *Provider, NameRegexFilter *regexp.Reg } // Implements the EventFilterer Interface -func (pwh *PodWatchHelper) Filter(wEvent *WatchEvent) (bool, error) { +func (wh *PodWatchHelper) Filter(wEvent *WatchEvent) (bool, error) { pod, err := wEvent.ToPod() if err != nil { return false, nil } - if !pwh.NameRegexFilter.MatchString(pod.Name) { + if !wh.NameRegexFilter.MatchString(pod.Name) { return false, nil } @@ -35,8 +35,8 @@ func (pwh *PodWatchHelper) Filter(wEvent *WatchEvent) (bool, error) { } // Implements the WatchCreator Interface -func (pwh *PodWatchHelper) NewWatcher(ctx context.Context, namespace string) (watch.Interface, error) { - watcher, err := pwh.kubernetesProvider.clientSet.CoreV1().Pods(namespace).Watch(ctx, metav1.ListOptions{Watch: true}) +func (wh *PodWatchHelper) NewWatcher(ctx context.Context, namespace string) (watch.Interface, error) { + watcher, err := wh.kubernetesProvider.clientSet.CoreV1().Pods(namespace).Watch(ctx, metav1.ListOptions{Watch: true}) if err != nil { return nil, err } diff --git a/shared/kubernetes/provider.go b/shared/kubernetes/provider.go index 649444a49..0c024ab47 100644 --- a/shared/kubernetes/provider.go +++ b/shared/kubernetes/provider.go @@ -485,6 +485,11 @@ func (provider *Provider) CreateDaemonsetRBAC(ctx context.Context, namespace str Resources: []string{"daemonsets"}, Verbs: []string{"patch", "get", "list", "create", "delete"}, }, + { + APIGroups: []string{"events.k8s.io"}, + Resources: []string{"events"}, + Verbs: []string{"list", "watch"}, + }, }, } roleBinding := &rbac.RoleBinding{ diff --git a/shared/kubernetes/watch.go b/shared/kubernetes/watch.go index 7e28e152a..a9588aa19 100644 --- a/shared/kubernetes/watch.go +++ b/shared/kubernetes/watch.go @@ -9,7 +9,6 @@ import ( "sync" "time" - apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/watch" ) @@ -39,7 +38,7 @@ func FilteredWatch(ctx context.Context, watcherCreator WatchCreator, targetNames for { watcher, err := watcherCreator.NewWatcher(ctx, targetNamespace) if err != nil { - errorChan <- fmt.Errorf("error in k8 watch: %v", err) + errorChan <- fmt.Errorf("error in k8s watch: %v", err) break } @@ -54,7 +53,7 @@ func FilteredWatch(ctx context.Context, watcherCreator WatchCreator, targetNames } if err != nil { - errorChan <- fmt.Errorf("error in k8 watch: %v", err) + errorChan <- fmt.Errorf("error in k8s watch: %v", err) break } else { if !watchRestartDebouncer.IsOn() { @@ -95,7 +94,7 @@ func startWatchLoop(ctx context.Context, watcher watch.Interface, filterer Event wEvent := WatchEvent(e) if wEvent.Type == watch.Error { - return apierrors.FromObject(wEvent.Object) + return wEvent.ToError() } if pass, err := filterer.Filter(&wEvent); err != nil { diff --git a/shared/kubernetes/watchEvent.go b/shared/kubernetes/watchEvent.go index fc1b7e11f..ed07e4cf1 100644 --- a/shared/kubernetes/watchEvent.go +++ b/shared/kubernetes/watchEvent.go @@ -2,17 +2,43 @@ package kubernetes import ( "fmt" + "reflect" + corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/watch" ) +type InvalidObjectType struct { + RequestedType reflect.Type +} + +// Implements the error interface +func (iot *InvalidObjectType) Error() string { + return fmt.Sprintf("Cannot convert event to type %s", iot.RequestedType) +} + type WatchEvent watch.Event func (we *WatchEvent) ToPod() (*corev1.Pod, error) { pod, ok := we.Object.(*corev1.Pod) if !ok { - return nil, fmt.Errorf("Invalid object type on pod event stream") + return nil, &InvalidObjectType{RequestedType: reflect.TypeOf(pod)} } return pod, nil } + +func (we *WatchEvent) ToEvent() (*eventsv1.Event, error) { + event, ok := we.Object.(*eventsv1.Event) + if !ok { + return nil, &InvalidObjectType{RequestedType: reflect.TypeOf(event)} + } + + return event, nil +} + +func (we *WatchEvent) ToError() error { + return apierrors.FromObject(we.Object) +} From 08d7fa988e33df84a77433f076e0544eded733a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Mon, 22 Nov 2021 17:32:38 +0300 Subject: [PATCH 49/93] Remove `tap/tester/` directory (#489) Co-authored-by: gadotroee <55343099+gadotroee@users.noreply.github.com> --- tap/tester/.gitignore | 1 - tap/tester/README.md | 12 ----- tap/tester/launch.sh | 10 ---- tap/tester/tester.go | 114 ------------------------------------------ 4 files changed, 137 deletions(-) delete mode 100644 tap/tester/.gitignore delete mode 100644 tap/tester/README.md delete mode 100755 tap/tester/launch.sh delete mode 100644 tap/tester/tester.go diff --git a/tap/tester/.gitignore b/tap/tester/.gitignore deleted file mode 100644 index 6028450ae..000000000 --- a/tap/tester/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tester \ No newline at end of file diff --git a/tap/tester/README.md b/tap/tester/README.md deleted file mode 100644 index 3fc7e4c65..000000000 --- a/tap/tester/README.md +++ /dev/null @@ -1,12 +0,0 @@ - -This tester used to launch passive-tapper locally without Docker or Kuberenetes environment. - -Its good for testing purposes. - -# How to run - -From the `tap` folder run: -`./tester/launch.sh` - -The tester gets the same arguments the passive_tapper gets, run with `--help` to get a complete list of options. -`./tester/launch.sh --help` diff --git a/tap/tester/launch.sh b/tap/tester/launch.sh deleted file mode 100755 index 5abab4a93..000000000 --- a/tap/tester/launch.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -e - -echo "Building extensions..." -pushd .. && ./devops/build_extensions.sh && popd - -go build -o tester tester/tester.go - -sudo ./tester/tester "$@" diff --git a/tap/tester/tester.go b/tap/tester/tester.go deleted file mode 100644 index 0ae1e9486..000000000 --- a/tap/tester/tester.go +++ /dev/null @@ -1,114 +0,0 @@ -package main - -import ( - "bufio" - "io/ioutil" - "os" - "path" - "plugin" - "sort" - "strings" - - "github.com/op/go-logging" - - "github.com/go-errors/errors" - "github.com/up9inc/mizu/shared/logger" - "github.com/up9inc/mizu/tap" - tapApi "github.com/up9inc/mizu/tap/api" -) - -func loadExtensions() ([]*tapApi.Extension, error) { - extensionsDir := "./extensions" - files, err := ioutil.ReadDir(extensionsDir) - - if err != nil { - return nil, errors.Wrap(err, 0) - } - - extensions := make([]*tapApi.Extension, 0) - for _, file := range files { - filename := file.Name() - - if !strings.HasSuffix(filename, ".so") { - continue - } - - logger.Log.Infof("Loading extension: %s", filename) - - extension := &tapApi.Extension{ - Path: path.Join(extensionsDir, filename), - } - - plug, err := plugin.Open(extension.Path) - - if err != nil { - return nil, errors.Wrap(err, 0) - } - - extension.Plug = plug - symDissector, err := plug.Lookup("Dissector") - - if err != nil { - return nil, errors.Wrap(err, 0) - } - - dissector, ok := symDissector.(tapApi.Dissector) - - if !ok { - return nil, errors.Errorf("Symbol Dissector type error: %v %T", file, symDissector) - } - - dissector.Register(extension) - extension.Dissector = dissector - extensions = append(extensions, extension) - } - - sort.Slice(extensions, func(i, j int) bool { - return extensions[i].Protocol.Priority < extensions[j].Protocol.Priority - }) - - for _, extension := range extensions { - logger.Log.Infof("Extension Properties: %+v", extension) - } - - return extensions, nil -} - -func internalRun() error { - logger.InitLoggerStderrOnly(logging.DEBUG) - - opts := tap.TapOpts{ - HostMode: false, - } - - outputItems := make(chan *tapApi.OutputChannelItem, 1000) - extenssions, err := loadExtensions() - - if err != nil { - return err - } - - tapOpts := tapApi.TrafficFilteringOptions{} - - tap.StartPassiveTapper(&opts, outputItems, extenssions, &tapOpts) - - logger.Log.Infof("Tapping, press enter to exit...") - reader := bufio.NewReader(os.Stdin) - reader.ReadLine() - return nil -} - -func main() { - err := internalRun() - - if err != nil { - switch err := err.(type) { - case *errors.Error: - logger.Log.Errorf("Error: %v", err.ErrorStack()) - default: - logger.Log.Errorf("Error: %v", err) - } - - os.Exit(1) - } -} From 02a125bb86329726525c0dca8a9aa2976b298d42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Mon, 22 Nov 2021 17:35:17 +0300 Subject: [PATCH 50/93] Disable IPv4 defragmentation and support IPv6 (#487) * Remove the extra negation on `nodefrag` flag's value * Support IPv4 fragmentation and IPv6 at the same time * Re-enable `nodefrag` flag --- shared/kubernetes/provider.go | 9 +++---- tap/source/tcp_packet_source.go | 42 ++++++++++++++++----------------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/shared/kubernetes/provider.go b/shared/kubernetes/provider.go index 0c024ab47..0f0feabdb 100644 --- a/shared/kubernetes/provider.go +++ b/shared/kubernetes/provider.go @@ -6,12 +6,16 @@ import ( "encoding/json" "errors" "fmt" + "io" + "net/url" + "path/filepath" + "regexp" + "github.com/op/go-logging" "github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared/logger" "github.com/up9inc/mizu/shared/semver" "github.com/up9inc/mizu/tap/api" - "io" v1 "k8s.io/api/apps/v1" core "k8s.io/api/core/v1" rbac "k8s.io/api/rbac/v1" @@ -32,9 +36,6 @@ import ( "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/clientcmd" watchtools "k8s.io/client-go/tools/watch" - "net/url" - "path/filepath" - "regexp" ) type Provider struct { diff --git a/tap/source/tcp_packet_source.go b/tap/source/tcp_packet_source.go index 2ad468b38..a7c0258ad 100644 --- a/tap/source/tcp_packet_source.go +++ b/tap/source/tcp_packet_source.go @@ -121,29 +121,27 @@ func (source *tcpPacketSource) readPackets(ipdefrag bool, packets chan<- TcpPack } // defrag the IPv4 packet if required - if !ipdefrag { - ip4Layer := packet.Layer(layers.LayerTypeIPv4) - if ip4Layer == nil { - continue - } - ip4 := ip4Layer.(*layers.IPv4) - l := ip4.Length - newip4, err := source.defragger.DefragIPv4(ip4) - if err != nil { - logger.Log.Fatal("Error while de-fragmenting", err) - } else if newip4 == nil { - logger.Log.Debugf("Fragment...") - continue // packet fragment, we don't have whole packet yet. - } - if newip4.Length != l { - diagnose.InternalStats.Ipdefrag++ - logger.Log.Debugf("Decoding re-assembled packet: %s", newip4.NextLayerType()) - pb, ok := packet.(gopacket.PacketBuilder) - if !ok { - logger.Log.Panic("Not a PacketBuilder") + if ipdefrag { + if ip4Layer := packet.Layer(layers.LayerTypeIPv4); ip4Layer != nil { + ip4 := ip4Layer.(*layers.IPv4) + l := ip4.Length + newip4, err := source.defragger.DefragIPv4(ip4) + if err != nil { + logger.Log.Fatal("Error while de-fragmenting", err) + } else if newip4 == nil { + logger.Log.Debugf("Fragment...") + continue // packet fragment, we don't have whole packet yet. + } + if newip4.Length != l { + diagnose.InternalStats.Ipdefrag++ + logger.Log.Debugf("Decoding re-assembled packet: %s", newip4.NextLayerType()) + pb, ok := packet.(gopacket.PacketBuilder) + if !ok { + logger.Log.Panic("Not a PacketBuilder") + } + nextDecoder := newip4.NextLayerType() + _ = nextDecoder.Decode(newip4.Payload, pb) } - nextDecoder := newip4.NextLayerType() - _ = nextDecoder.Decode(newip4.Payload, pb) } } From 12ca3d87796de6096b194e6027f834049ce22093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Mon, 22 Nov 2021 17:46:35 +0300 Subject: [PATCH 51/93] Make the `gRPC` and `HTTP/2` distinction (#492) * Remove the extra negation on `nodefrag` flag's value * Support IPv4 fragmentation and IPv6 at the same time * Set `Method` and `StatusCode` fields correctly for `HTTP/2` * Replace unnecessary `grpc` naming with `http2` * Make the `gRPC` and `HTTP/2` distinction * Fix the macros of `http` extension * Fix the macros of other protocol extensions * Update the method signature of `Represent` * Fix the `HTTP/2` support * Fix some minor issues * Upgrade Basenine version from `0.2.10` to `0.2.11` Sorts macros before expanding them and prioritize the long macros. * Don't regex split the gRPC method name * Re-enable `nodefrag` flag --- Dockerfile | 4 +- agent/go.mod | 2 +- agent/go.sum | 4 +- agent/pkg/controllers/entries_controller.go | 4 +- debug.Dockerfile | 4 +- tap/api/api.go | 2 +- tap/extensions/amqp/main.go | 5 +- tap/extensions/http/handlers.go | 10 ++- .../{grpc_assembler.go => http2_assembler.go} | 79 +++++++++++++++---- tap/extensions/http/main.go | 77 ++++++++++-------- tap/extensions/kafka/main.go | 5 +- tap/extensions/redis/main.go | 5 +- ui/src/components/UI/style/misc.module.sass | 1 - 13 files changed, 129 insertions(+), 73 deletions(-) rename tap/extensions/http/{grpc_assembler.go => http2_assembler.go} (80%) diff --git a/Dockerfile b/Dockerfile index ca6a0d618..5675bc910 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,8 +42,8 @@ RUN go build -ldflags="-s -w \ -X 'mizuserver/pkg/version.SemVer=${SEM_VER}'" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.10/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.10/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.11/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.11/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/agent/go.mod b/agent/go.mod index d7a3bca76..c2b10a534 100644 --- a/agent/go.mod +++ b/agent/go.mod @@ -16,7 +16,7 @@ require ( github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/orcaman/concurrent-map v0.0.0-20210106121528-16402b402231 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/up9inc/basenine/client/go v0.0.0-20211118123155-7ed075f85c73 + github.com/up9inc/basenine/client/go v0.0.0-20211121072216-04366911881c github.com/up9inc/mizu/shared v0.0.0 github.com/up9inc/mizu/tap v0.0.0 github.com/up9inc/mizu/tap/api v0.0.0 diff --git a/agent/go.sum b/agent/go.sum index 9b9376476..1d18d281a 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -450,8 +450,8 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/up9inc/basenine/client/go v0.0.0-20211118123155-7ed075f85c73 h1:FJUM7w7E0jRGFPcSMa7cVy+jr5zcpbyT6qA30dEtGGI= -github.com/up9inc/basenine/client/go v0.0.0-20211118123155-7ed075f85c73/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= +github.com/up9inc/basenine/client/go v0.0.0-20211121072216-04366911881c h1:GJsCVhDKjV/k3mNG255VN7hAQ7fxyNgX5T+VJyzoOQ0= +github.com/up9inc/basenine/client/go v0.0.0-20211121072216-04366911881c/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= diff --git a/agent/pkg/controllers/entries_controller.go b/agent/pkg/controllers/entries_controller.go index 167904e48..0834977ab 100644 --- a/agent/pkg/controllers/entries_controller.go +++ b/agent/pkg/controllers/entries_controller.go @@ -55,7 +55,7 @@ func GetEntry(c *gin.Context) { } extension := extensionsMap[entry.Protocol.Name] - protocol, representation, bodySize, _ := extension.Dissector.Represent(entry.Protocol, entry.Request, entry.Response) + representation, bodySize, _ := extension.Dissector.Represent(entry.Request, entry.Response) var rules []map[string]interface{} var isRulesEnabled bool @@ -68,7 +68,7 @@ func GetEntry(c *gin.Context) { } c.JSON(http.StatusOK, tapApi.MizuEntryWrapper{ - Protocol: protocol, + Protocol: entry.Protocol, Representation: string(representation), BodySize: bodySize, Data: entry, diff --git a/debug.Dockerfile b/debug.Dockerfile index ede72037b..68176ffae 100644 --- a/debug.Dockerfile +++ b/debug.Dockerfile @@ -37,8 +37,8 @@ COPY agent . RUN go build -gcflags="all=-N -l" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.10/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.10/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.11/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.11/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/tap/api/api.go b/tap/api/api.go index fd543ab0f..36bd6241f 100644 --- a/tap/api/api.go +++ b/tap/api/api.go @@ -99,7 +99,7 @@ type Dissector interface { Dissect(b *bufio.Reader, isClient bool, tcpID *TcpID, counterPair *CounterPair, superTimer *SuperTimer, superIdentifier *SuperIdentifier, emitter Emitter, options *TrafficFilteringOptions) error Analyze(item *OutputChannelItem, resolvedSource string, resolvedDestination string) *MizuEntry Summarize(entry *MizuEntry) *BaseEntryDetails - Represent(pIn Protocol, request map[string]interface{}, response map[string]interface{}) (pOut Protocol, object []byte, bodySize int64, err error) + Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) Macros() map[string]string } diff --git a/tap/extensions/amqp/main.go b/tap/extensions/amqp/main.go index c9d61bbb8..af9155461 100644 --- a/tap/extensions/amqp/main.go +++ b/tap/extensions/amqp/main.go @@ -325,8 +325,7 @@ func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { } } -func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface{}, response map[string]interface{}) (protoOut api.Protocol, object []byte, bodySize int64, err error) { - protoOut = protocol +func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) { bodySize = 0 representation := make(map[string]interface{}, 0) var repRequest []interface{} @@ -363,7 +362,7 @@ func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface func (d dissecting) Macros() map[string]string { return map[string]string{ - `amqp`: fmt.Sprintf(`proto.abbr == "%s"`, protocol.Abbreviation), + `amqp`: fmt.Sprintf(`proto.name == "%s"`, protocol.Name), } } diff --git a/tap/extensions/http/handlers.go b/tap/extensions/http/handlers.go index 6b670da8f..f2ea09c02 100644 --- a/tap/extensions/http/handlers.go +++ b/tap/extensions/http/handlers.go @@ -23,8 +23,8 @@ func filterAndEmit(item *api.OutputChannelItem, emitter api.Emitter, options *ap emitter.Emit(item) } -func handleHTTP2Stream(grpcAssembler *GrpcAssembler, tcpID *api.TcpID, superTimer *api.SuperTimer, emitter api.Emitter, options *api.TrafficFilteringOptions) error { - streamID, messageHTTP1, err := grpcAssembler.readMessage() +func handleHTTP2Stream(http2Assembler *Http2Assembler, tcpID *api.TcpID, superTimer *api.SuperTimer, emitter api.Emitter, options *api.TrafficFilteringOptions) error { + streamID, messageHTTP1, isGrpc, err := http2Assembler.readMessage() if err != nil { return err } @@ -73,7 +73,11 @@ func handleHTTP2Stream(grpcAssembler *GrpcAssembler, tcpID *api.TcpID, superTime } if item != nil { - item.Protocol = http2Protocol + if isGrpc { + item.Protocol = grpcProtocol + } else { + item.Protocol = http2Protocol + } filterAndEmit(item, emitter, options) } diff --git a/tap/extensions/http/grpc_assembler.go b/tap/extensions/http/http2_assembler.go similarity index 80% rename from tap/extensions/http/grpc_assembler.go rename to tap/extensions/http/http2_assembler.go index 0f7a8c00f..0563aacb9 100644 --- a/tap/extensions/http/grpc_assembler.go +++ b/tap/extensions/http/http2_assembler.go @@ -10,6 +10,7 @@ import ( "math" "net/http" "net/url" + "strconv" "strings" "golang.org/x/net/http2" @@ -27,6 +28,26 @@ const protoMinorHTTP2 = 0 var maxHTTP2DataLen = 1 * 1024 * 1024 // 1MB +var grpcStatusCodes = []string{ + "OK", + "CANCELLED", + "UNKNOWN", + "INVALID_ARGUMENT", + "DEADLINE_EXCEEDED", + "NOT_FOUND", + "ALREADY_EXISTS", + "PERMISSION_DENIED", + "RESOURCE_EXHAUSTED", + "FAILED_PRECONDITION", + "ABORTED", + "OUT_OF_RANGE", + "UNIMPLEMENTED", + "INTERNAL", + "UNAVAILABLE", + "DATA_LOSS", + "UNAUTHENTICATED", +} + type messageFragment struct { headers []hpack.HeaderField data []byte @@ -71,37 +92,38 @@ func (fbs *fragmentsByStream) pop(streamID uint32) ([]hpack.HeaderField, []byte) return headers, data } -func createGrpcAssembler(b *bufio.Reader) *GrpcAssembler { +func createHTTP2Assembler(b *bufio.Reader) *Http2Assembler { var framerOutput bytes.Buffer framer := http2.NewFramer(&framerOutput, b) framer.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) - return &GrpcAssembler{ + return &Http2Assembler{ fragmentsByStream: make(fragmentsByStream), framer: framer, } } -type GrpcAssembler struct { +type Http2Assembler struct { fragmentsByStream fragmentsByStream framer *http2.Framer } -func (ga *GrpcAssembler) readMessage() (uint32, interface{}, error) { +func (ga *Http2Assembler) readMessage() (streamID uint32, messageHTTP1 interface{}, isGrpc bool, err error) { // Exactly one Framer is used for each half connection. // (Instead of creating a new Framer for each ReadFrame operation) // This is needed in order to decompress the headers, // because the compression context is updated with each requests/response. frame, err := ga.framer.ReadFrame() if err != nil { - return 0, nil, err + return } - streamID := frame.Header().StreamID + streamID = frame.Header().StreamID ga.fragmentsByStream.appendFrame(streamID, frame) if !(ga.isStreamEnd(frame)) { - return 0, nil, nil + streamID = 0 + return } headers, data := ga.fragmentsByStream.pop(streamID) @@ -115,13 +137,29 @@ func (ga *GrpcAssembler) readMessage() (uint32, interface{}, error) { dataString := base64.StdEncoding.EncodeToString(data) // Use http1 types only because they are expected in http_matcher. - // TODO: Create an interface that will be used by http_matcher:registerRequest and http_matcher:registerRequest - // to accept both HTTP/1.x and HTTP/2 requests and responses - var messageHTTP1 interface{} - if _, ok := headersHTTP1[":method"]; ok { + method := headersHTTP1.Get(":method") + status := headersHTTP1.Get(":status") + + // gRPC detection + grpcStatus := headersHTTP1.Get("Grpc-Status") + if grpcStatus != "" { + isGrpc = true + status = grpcStatus + } + + if strings.Contains(headersHTTP1.Get("Content-Type"), "application/grpc") { + isGrpc = true + grpcPath := headersHTTP1.Get(":path") + pathSegments := strings.Split(grpcPath, "/") + if len(pathSegments) > 0 { + method = pathSegments[len(pathSegments)-1] + } + } + + if method != "" { messageHTTP1 = http.Request{ URL: &url.URL{}, - Method: "POST", + Method: method, Header: headersHTTP1, Proto: protoHTTP2, ProtoMajor: protoMajorHTTP2, @@ -129,8 +167,16 @@ func (ga *GrpcAssembler) readMessage() (uint32, interface{}, error) { Body: io.NopCloser(strings.NewReader(dataString)), ContentLength: int64(len(dataString)), } - } else if _, ok := headersHTTP1[":status"]; ok { + } else if status != "" { + var statusCode int + + statusCode, err = strconv.Atoi(status) + if err != nil { + return + } + messageHTTP1 = http.Response{ + StatusCode: statusCode, Header: headersHTTP1, Proto: protoHTTP2, ProtoMajor: protoMajorHTTP2, @@ -139,13 +185,14 @@ func (ga *GrpcAssembler) readMessage() (uint32, interface{}, error) { ContentLength: int64(len(dataString)), } } else { - return 0, nil, errors.New("failed to assemble stream: neither a request nor a message") + err = errors.New("failed to assemble stream: neither a request nor a message") + return } - return streamID, messageHTTP1, nil + return } -func (ga *GrpcAssembler) isStreamEnd(frame http2.Frame) bool { +func (ga *Http2Assembler) isStreamEnd(frame http2.Frame) bool { switch frame := frame.(type) { case *http2.MetaHeadersFrame: if frame.StreamEnded() { diff --git a/tap/extensions/http/main.go b/tap/extensions/http/main.go index ff1d9c32a..045af948d 100644 --- a/tap/extensions/http/main.go +++ b/tap/extensions/http/main.go @@ -23,21 +23,35 @@ var protocol api.Protocol = api.Protocol{ ForegroundColor: "#ffffff", FontSize: 12, ReferenceLink: "https://datatracker.ietf.org/doc/html/rfc2616", - Ports: []string{"80", "8080", "50051"}, + Ports: []string{"80", "443", "8080"}, Priority: 0, } var http2Protocol api.Protocol = api.Protocol{ Name: "http", - LongName: "Hypertext Transfer Protocol Version 2 (HTTP/2) (gRPC)", + LongName: "Hypertext Transfer Protocol Version 2 (HTTP/2)", Abbreviation: "HTTP/2", - Macro: "grpc", + Macro: "http2", Version: "2.0", BackgroundColor: "#244c5a", ForegroundColor: "#ffffff", FontSize: 11, ReferenceLink: "https://datatracker.ietf.org/doc/html/rfc7540", - Ports: []string{"80", "8080"}, + Ports: []string{"80", "443", "8080"}, + Priority: 0, +} + +var grpcProtocol api.Protocol = api.Protocol{ + Name: "http", + LongName: "Hypertext Transfer Protocol Version 2 (HTTP/2) [ gRPC over HTTP/2 ]", + Abbreviation: "gRPC", + Macro: "grpc", + Version: "2.0", + BackgroundColor: "#244c5a", + ForegroundColor: "#ffffff", + FontSize: 11, + ReferenceLink: "https://grpc.github.io/grpc/core/md_doc_statuscodes.html", + Ports: []string{"80", "443", "8080", "50051"}, Priority: 0, } @@ -64,10 +78,10 @@ func (d dissecting) Ping() { func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, counterPair *api.CounterPair, superTimer *api.SuperTimer, superIdentifier *api.SuperIdentifier, emitter api.Emitter, options *api.TrafficFilteringOptions) error { isHTTP2, err := checkIsHTTP2Connection(b, isClient) - var grpcAssembler *GrpcAssembler + var http2Assembler *Http2Assembler if isHTTP2 { prepareHTTP2Connection(b, isClient) - grpcAssembler = createGrpcAssembler(b) + http2Assembler = createHTTP2Assembler(b) } dissected := false @@ -77,7 +91,7 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co } if isHTTP2 { - err = handleHTTP2Stream(grpcAssembler, tcpID, superTimer, emitter, options) + err = handleHTTP2Stream(http2Assembler, tcpID, superTimer, emitter, options) if err == io.EOF || err == io.ErrUnexpectedEOF { break } else if err != nil { @@ -120,7 +134,7 @@ func SetHostname(address, newHostname string) string { } func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, resolvedDestination string) *api.MizuEntry { - var host, scheme, authority, path, service string + var host, authority, path, service string request := item.Pair.Request.Payload.(map[string]interface{}) response := item.Pair.Response.Payload.(map[string]interface{}) @@ -135,9 +149,6 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, if h["name"] == ":authority" { authority = h["value"].(string) } - if h["name"] == ":scheme" { - scheme = h["value"].(string) - } if h["name"] == ":path" { path = h["value"].(string) } @@ -148,9 +159,9 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, } if item.Protocol.Version == "2.0" { - service = fmt.Sprintf("%s://%s", scheme, authority) + service = authority } else { - service = fmt.Sprintf("http://%s", host) + service = host u, err := url.Parse(reqDetails["url"].(string)) if err != nil { path = reqDetails["url"].(string) @@ -183,15 +194,24 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, service = SetHostname(service, resolvedSource) } + method := reqDetails["method"].(string) + statusCode := int(resDetails["status"].(float64)) + if item.Protocol.Abbreviation == "gRPC" { + resDetails["statusText"] = grpcStatusCodes[statusCode] + } + + if item.Protocol.Version == "2.0" { + reqDetails["url"] = path + request["url"] = path + } + elapsedTime := item.Pair.Response.CaptureTime.Sub(item.Pair.Request.CaptureTime).Round(time.Millisecond).Milliseconds() if elapsedTime < 0 { elapsedTime = 0 } httpPair, _ := json.Marshal(item.Pair) - _protocol := protocol - _protocol.Version = item.Protocol.Version return &api.MizuEntry{ - Protocol: _protocol, + Protocol: item.Protocol, Source: &api.TCP{ Name: resolvedSource, IP: item.ConnectionInfo.ClientIP, @@ -206,8 +226,8 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, Request: reqDetails, Response: resDetails, Url: fmt.Sprintf("%s%s", service, path), - Method: reqDetails["method"].(string), - Status: int(resDetails["status"].(float64)), + Method: method, + Status: statusCode, RequestSenderIp: item.ConnectionInfo.ClientIP, Service: service, Timestamp: item.Timestamp, @@ -226,15 +246,9 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, } func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { - var p api.Protocol - if entry.Protocol.Version == "2.0" { - p = http2Protocol - } else { - p = protocol - } return &api.BaseEntryDetails{ Id: entry.Id, - Protocol: p, + Protocol: entry.Protocol, Url: entry.Url, RequestSenderIp: entry.RequestSenderIp, Service: entry.Service, @@ -408,12 +422,7 @@ func representResponse(response map[string]interface{}) (repResponse []interface return } -func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface{}, response map[string]interface{}) (protoOut api.Protocol, object []byte, bodySize int64, err error) { - if protoIn.Version == "2.0" { - protoOut = http2Protocol - } else { - protoOut = protocol - } +func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) { representation := make(map[string]interface{}, 0) repRequest := representRequest(request) repResponse, bodySize := representResponse(response) @@ -425,9 +434,9 @@ func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface func (d dissecting) Macros() map[string]string { return map[string]string{ - `http`: fmt.Sprintf(`proto.abbr == "%s" and proto.version == "%s"`, protocol.Abbreviation, protocol.Version), - `grpc`: fmt.Sprintf(`proto.abbr == "%s" and proto.version == "%s"`, protocol.Abbreviation, http2Protocol.Version), - `http2`: fmt.Sprintf(`proto.abbr == "%s" and proto.version == "%s"`, protocol.Abbreviation, http2Protocol.Version), + `http`: fmt.Sprintf(`proto.name == "%s" and proto.version == "%s"`, protocol.Name, protocol.Version), + `http2`: fmt.Sprintf(`proto.name == "%s" and proto.version == "%s"`, protocol.Name, http2Protocol.Version), + `grpc`: fmt.Sprintf(`proto.name == "%s" and proto.version == "%s" and proto.macro == "%s"`, protocol.Name, grpcProtocol.Version, grpcProtocol.Macro), } } diff --git a/tap/extensions/kafka/main.go b/tap/extensions/kafka/main.go index fe7f88f7c..9dff00388 100644 --- a/tap/extensions/kafka/main.go +++ b/tap/extensions/kafka/main.go @@ -210,8 +210,7 @@ func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { } } -func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface{}, response map[string]interface{}) (protoOut api.Protocol, object []byte, bodySize int64, err error) { - protoOut = _protocol +func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) { bodySize = 0 representation := make(map[string]interface{}, 0) @@ -258,7 +257,7 @@ func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface func (d dissecting) Macros() map[string]string { return map[string]string{ - `kafka`: fmt.Sprintf(`proto.abbr == "%s"`, _protocol.Abbreviation), + `kafka`: fmt.Sprintf(`proto.name == "%s"`, _protocol.Name), } } diff --git a/tap/extensions/redis/main.go b/tap/extensions/redis/main.go index b999fa96d..f2d2836d5 100644 --- a/tap/extensions/redis/main.go +++ b/tap/extensions/redis/main.go @@ -146,8 +146,7 @@ func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { } } -func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface{}, response map[string]interface{}) (protoOut api.Protocol, object []byte, bodySize int64, err error) { - protoOut = protocol +func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) { bodySize = 0 representation := make(map[string]interface{}, 0) repRequest := representGeneric(request, `request.`) @@ -160,7 +159,7 @@ func (d dissecting) Represent(protoIn api.Protocol, request map[string]interface func (d dissecting) Macros() map[string]string { return map[string]string{ - `redis`: fmt.Sprintf(`proto.abbr == "%s"`, protocol.Abbreviation), + `redis`: fmt.Sprintf(`proto.name == "%s"`, protocol.Name), } } diff --git a/ui/src/components/UI/style/misc.module.sass b/ui/src/components/UI/style/misc.module.sass index 8f57e3382..8c3a1cbac 100644 --- a/ui/src/components/UI/style/misc.module.sass +++ b/ui/src/components/UI/style/misc.module.sass @@ -5,7 +5,6 @@ border: solid 1px $secondary-font-color margin-left: 4px padding: 2px 5px - text-transform: uppercase font-family: "Source Sans Pro", sans-serif font-size: 11px font-weight: bold From d66c7445e6e539930fea96d1af0846449a14442a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Mon, 22 Nov 2021 19:30:06 +0300 Subject: [PATCH 52/93] Remove `SetHostname` method in HTTP extension (#496) --- tap/extensions/http/main.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/tap/extensions/http/main.go b/tap/extensions/http/main.go index 045af948d..2bebe7721 100644 --- a/tap/extensions/http/main.go +++ b/tap/extensions/http/main.go @@ -124,15 +124,6 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co return nil } -func SetHostname(address, newHostname string) string { - replacedUrl, err := url.Parse(address) - if err != nil { - return address - } - replacedUrl.Host = newHostname - return replacedUrl.String() -} - func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, resolvedDestination string) *api.MizuEntry { var host, authority, path, service string @@ -189,9 +180,9 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, reqDetails["queryString"] = mapSliceRebuildAsMap(reqDetails["_queryString"].([]interface{})) if resolvedDestination != "" { - service = SetHostname(service, resolvedDestination) + service = resolvedDestination } else if resolvedSource != "" { - service = SetHostname(service, resolvedSource) + service = resolvedSource } method := reqDetails["method"].(string) From 4c97316c02b8bf213ae6182197e82ce4b2acbf7f Mon Sep 17 00:00:00 2001 From: Nimrod Gilboa Markevich <59927337+nimrod-up9@users.noreply.github.com> Date: Tue, 23 Nov 2021 10:03:36 +0200 Subject: [PATCH 53/93] Remove prevPodPhase (#497) prevPodPhase does not take into account the fact that there may be more than one tapper pod. Therefore it is not clear what its value represents. It is only used in a debug print. It is not worth the effort to fix for that one debug print. Co-authored-by: gadotroee <55343099+gadotroee@users.noreply.github.com> --- cli/cmd/tapRunner.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 17b5d76d3..b1ffc5ff2 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -655,7 +655,6 @@ func watchTapperPod(ctx context.Context, kubernetesProvider *kubernetes.Provider podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", kubernetes.TapperDaemonSetName)) podWatchHelper := kubernetes.NewPodWatchHelper(kubernetesProvider, podExactRegex) added, modified, removed, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.MizuResourcesNamespace}, podWatchHelper) - var prevPodPhase core.PodPhase for { select { case wEvent, ok := <-added: @@ -707,11 +706,6 @@ func watchTapperPod(ctx context.Context, kubernetesProvider *kubernetes.Provider } podStatus := modifiedPod.Status - if podStatus.Phase == core.PodPending && prevPodPhase == podStatus.Phase { - logger.Log.Debugf("Tapper %s is %s", modifiedPod.Name, strings.ToLower(string(podStatus.Phase))) - continue - } - prevPodPhase = podStatus.Phase if podStatus.Phase == core.PodRunning { state := podStatus.ContainerStatuses[0].State From 01d6005a7b672365dce4b8a27d47c6a2090ba2c3 Mon Sep 17 00:00:00 2001 From: David Levanon Date: Tue, 23 Nov 2021 14:21:53 +0200 Subject: [PATCH 54/93] minor logging changes (#499) Co-authored-by: gadotroee <55343099+gadotroee@users.noreply.github.com> --- .gitignore | 3 +++ shared/logger/logger.go | 2 +- tap/tcp_assembler.go | 10 ++++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index ebc2dde3b..18b659878 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,6 @@ pprof/* # Database Files *.bin *.gob + +# Nohup Files - https://man7.org/linux/man-pages/man1/nohup.1p.html +nohup.* diff --git a/shared/logger/logger.go b/shared/logger/logger.go index 56742122c..52379a7a6 100644 --- a/shared/logger/logger.go +++ b/shared/logger/logger.go @@ -9,7 +9,7 @@ import ( var Log = logging.MustGetLogger("mizu") var format = logging.MustStringFormatter( - `%{time:2006-01-02T15:04:05.999Z-07:00} %{level:-5s} â–¶ %{message} â–¶ %{pid} %{shortfile} %{shortfunc}`, + `[%{time:2006-01-02T15:04:05.000-0700}] %{level:-5s} â–¶ %{message} â–¶ [%{pid} %{shortfile} %{shortfunc}]`, ) func InitLogger(logPath string) { diff --git a/tap/tcp_assembler.go b/tap/tcp_assembler.go index fa0d05c9d..150834967 100644 --- a/tap/tcp_assembler.go +++ b/tap/tcp_assembler.go @@ -16,6 +16,8 @@ import ( "github.com/up9inc/mizu/tap/source" ) +const PACKETS_SEEN_LOG_THRESHOLD = 1000 + type tcpAssembler struct { *reassembly.Assembler streamPool *reassembly.StreamPool @@ -63,7 +65,11 @@ func (a *tcpAssembler) processPackets(dumpPacket bool, packets <-chan source.Tcp for packetInfo := range packets { packetsCount := diagnose.AppStats.IncPacketsCount() - logger.Log.Debugf("PACKET #%d", packetsCount) + + if packetsCount % PACKETS_SEEN_LOG_THRESHOLD == 0 { + logger.Log.Debugf("Packets seen: #%d", packetsCount) + } + packet := packetInfo.Packet data := packet.Data() diagnose.AppStats.UpdateProcessedBytes(uint64(len(data))) @@ -85,7 +91,7 @@ func (a *tcpAssembler) processPackets(dumpPacket bool, packets <-chan source.Tcp CaptureInfo: packet.Metadata().CaptureInfo, } diagnose.InternalStats.Totalsz += len(tcp.Payload) - logger.Log.Debugf("%s : %v -> %s : %v", packet.NetworkLayer().NetworkFlow().Src(), tcp.SrcPort, packet.NetworkLayer().NetworkFlow().Dst(), tcp.DstPort) + logger.Log.Debugf("%s:%v -> %s:%v", packet.NetworkLayer().NetworkFlow().Src(), tcp.SrcPort, packet.NetworkLayer().NetworkFlow().Dst(), tcp.DstPort) a.assemblerMutex.Lock() a.AssembleWithContext(packet.NetworkLayer().NetworkFlow(), tcp, &c) a.assemblerMutex.Unlock() From 1c18eb1b849c0829045556261499d6a82be238bb Mon Sep 17 00:00:00 2001 From: Nimrod Gilboa Markevich <59927337+nimrod-up9@users.noreply.github.com> Date: Tue, 23 Nov 2021 15:06:27 +0200 Subject: [PATCH 55/93] Use one channel for events instead of three (#495) Use one channel for events instead of three separate channels by event type --- agent/main.go | 48 +----- cli/cmd/tapRunner.go | 226 ++++++++++---------------- shared/kubernetes/mizuTapperSyncer.go | 64 +++----- shared/kubernetes/watch.go | 25 +-- shared/kubernetes/watchEvent.go | 8 + 5 files changed, 128 insertions(+), 243 deletions(-) diff --git a/agent/main.go b/agent/main.go index c3a87fe69..ef2998f00 100644 --- a/agent/main.go +++ b/agent/main.go @@ -493,19 +493,19 @@ func watchMizuEvents(ctx context.Context, kubernetesProvider *kubernetes.Provide mizuResourceRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", kubernetes.MizuResourcesPrefix)) eventWatchHelper := kubernetes.NewEventWatchHelper(kubernetesProvider, mizuResourceRegex) - added, modified, removed, errorChan := kubernetes.FilteredWatch(ctx, eventWatchHelper, []string{config.Config.MizuResourcesNamespace}, eventWatchHelper) + eventChan, errorChan := kubernetes.FilteredWatch(ctx, eventWatchHelper, []string{config.Config.MizuResourcesNamespace}, eventWatchHelper) for { select { - case wEvent, ok := <-added: + case wEvent, ok := <-eventChan: if !ok { - added = nil + eventChan = nil continue } event, err := wEvent.ToEvent() if err != nil { - logger.Log.Errorf("error parsing Mizu resource added event: %+v", err) + logger.Log.Errorf("error parsing Mizu resource event: %+v", err) cancel() } @@ -514,45 +514,7 @@ func watchMizuEvents(ctx context.Context, kubernetesProvider *kubernetes.Provide } if event.Type == v1.EventTypeWarning { - logger.Log.Warningf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note) - } - case wEvent, ok := <-removed: - if !ok { - removed = nil - continue - } - - event, err := wEvent.ToEvent() - if err != nil { - logger.Log.Errorf("error parsing Mizu resource removed event: %+v", err) - cancel() - } - - if startTime.After(event.CreationTimestamp.Time) { - continue - } - - if event.Type == v1.EventTypeWarning { - logger.Log.Warningf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note) - } - case wEvent, ok := <-modified: - if !ok { - modified = nil - continue - } - - event, err := wEvent.ToEvent() - if err != nil { - logger.Log.Errorf("error parsing Mizu resource modified event: %+v", err) - cancel() - } - - if startTime.After(event.CreationTimestamp.Time) { - continue - } - - if event.Type == v1.EventTypeWarning { - logger.Log.Warningf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note) + logger.Log.Warningf("resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note) } case err, ok := <-errorChan: if !ok { diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index b1ffc5ff2..4efd9cd4a 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -559,76 +559,73 @@ func waitUntilNamespaceDeleted(ctx context.Context, cancel context.CancelFunc, k func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s$", kubernetes.ApiServerPodName)) podWatchHelper := kubernetes.NewPodWatchHelper(kubernetesProvider, podExactRegex) - added, modified, removed, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.MizuResourcesNamespace}, podWatchHelper) + eventChan, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.MizuResourcesNamespace}, podWatchHelper) isPodReady := false timeAfter := time.After(25 * time.Second) for { select { - case _, ok := <-added: + case wEvent, ok := <-eventChan: if !ok { - added = nil + eventChan = nil continue } - logger.Log.Debugf("Watching API Server pod loop, added") - case _, ok := <-removed: - if !ok { - removed = nil - continue - } - - logger.Log.Infof("%s removed", kubernetes.ApiServerPodName) - cancel() - return - case wEvent, ok := <-modified: - if !ok { - modified = nil - continue - } - - modifiedPod, err := wEvent.ToPod() - if err != nil { - logger.Log.Errorf(uiUtils.Error, err) + switch wEvent.Type { + case kubernetes.EventAdded: + logger.Log.Debugf("Watching API Server pod loop, added") + case kubernetes.EventDeleted: + logger.Log.Infof("%s removed", kubernetes.ApiServerPodName) cancel() - continue - } - - logger.Log.Debugf("Watching API Server pod loop, modified: %v", modifiedPod.Status.Phase) - - if modifiedPod.Status.Phase == core.PodPending { - if modifiedPod.Status.Conditions[0].Type == core.PodScheduled && modifiedPod.Status.Conditions[0].Status != core.ConditionTrue { - logger.Log.Debugf("Wasn't able to deploy the API server. Reason: \"%s\"", modifiedPod.Status.Conditions[0].Message) - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Wasn't able to deploy the API server, for more info check logs at %s", fsUtils.GetLogFilePath())) + return + case kubernetes.EventModified: + modifiedPod, err := wEvent.ToPod() + if err != nil { + logger.Log.Errorf(uiUtils.Error, err) cancel() - break + continue } - if len(modifiedPod.Status.ContainerStatuses) > 0 && modifiedPod.Status.ContainerStatuses[0].State.Waiting != nil && modifiedPod.Status.ContainerStatuses[0].State.Waiting.Reason == "ErrImagePull" { - logger.Log.Debugf("Wasn't able to deploy the API server. (ErrImagePull) Reason: \"%s\"", modifiedPod.Status.ContainerStatuses[0].State.Waiting.Message) - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Wasn't able to deploy the API server: failed to pull the image, for more info check logs at %v", fsUtils.GetLogFilePath())) - cancel() - break - } - } + logger.Log.Debugf("Watching API Server pod loop, modified: %v", modifiedPod.Status.Phase) - if modifiedPod.Status.Phase == core.PodRunning && !isPodReady { - isPodReady = true - go startProxyReportErrorIfAny(kubernetesProvider, cancel) + if modifiedPod.Status.Phase == core.PodPending { + if modifiedPod.Status.Conditions[0].Type == core.PodScheduled && modifiedPod.Status.Conditions[0].Status != core.ConditionTrue { + logger.Log.Debugf("Wasn't able to deploy the API server. Reason: \"%s\"", modifiedPod.Status.Conditions[0].Message) + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Wasn't able to deploy the API server, for more info check logs at %s", fsUtils.GetLogFilePath())) + cancel() + break + } - url := GetApiServerUrl() - if err := apiProvider.TestConnection(); err != nil { - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Couldn't connect to API server, for more info check logs at %s", fsUtils.GetLogFilePath())) - cancel() - break + if len(modifiedPod.Status.ContainerStatuses) > 0 && modifiedPod.Status.ContainerStatuses[0].State.Waiting != nil && modifiedPod.Status.ContainerStatuses[0].State.Waiting.Reason == "ErrImagePull" { + logger.Log.Debugf("Wasn't able to deploy the API server. (ErrImagePull) Reason: \"%s\"", modifiedPod.Status.ContainerStatuses[0].State.Waiting.Message) + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Wasn't able to deploy the API server: failed to pull the image, for more info check logs at %v", fsUtils.GetLogFilePath())) + cancel() + break + } } - logger.Log.Infof("Mizu is available at %s", url) - if !config.Config.HeadlessMode { - uiUtils.OpenBrowser(url) - } - if err := apiProvider.ReportTappedPods(state.tapperSyncer.CurrentlyTappedPods); err != nil { - logger.Log.Debugf("[Error] failed update tapped pods %v", err) + if modifiedPod.Status.Phase == core.PodRunning && !isPodReady { + isPodReady = true + go startProxyReportErrorIfAny(kubernetesProvider, cancel) + + url := GetApiServerUrl() + if err := apiProvider.TestConnection(); err != nil { + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Couldn't connect to API server, for more info check logs at %s", fsUtils.GetLogFilePath())) + cancel() + break + } + + logger.Log.Infof("Mizu is available at %s", url) + if !config.Config.HeadlessMode { + uiUtils.OpenBrowser(url) + } + if err := apiProvider.ReportTappedPods(state.tapperSyncer.CurrentlyTappedPods); err != nil { + logger.Log.Debugf("[Error] failed update tapped pods %v", err) + } } + case kubernetes.EventBookmark: + break + case kubernetes.EventError: + break } case err, ok := <-errorChan: if !ok { @@ -654,70 +651,53 @@ func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provi func watchTapperPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", kubernetes.TapperDaemonSetName)) podWatchHelper := kubernetes.NewPodWatchHelper(kubernetesProvider, podExactRegex) - added, modified, removed, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.MizuResourcesNamespace}, podWatchHelper) + eventChan, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.MizuResourcesNamespace}, podWatchHelper) + for { select { - case wEvent, ok := <-added: + case wEvent, ok := <-eventChan: if !ok { - added = nil + eventChan = nil continue } - addedPod, err := wEvent.ToPod() + pod, err := wEvent.ToPod() if err != nil { logger.Log.Errorf(uiUtils.Error, err) cancel() continue } - logger.Log.Debugf("Tapper is created [%s]", addedPod.Name) - case wEvent, ok := <-removed: - if !ok { - removed = nil - continue - } + switch wEvent.Type { + case kubernetes.EventAdded: + logger.Log.Debugf("Tapper is created [%s]", pod.Name) + case kubernetes.EventDeleted: + logger.Log.Debugf("Tapper is removed [%s]", pod.Name) + case kubernetes.EventModified: + if pod.Status.Phase == core.PodPending && pod.Status.Conditions[0].Type == core.PodScheduled && pod.Status.Conditions[0].Status != core.ConditionTrue { + logger.Log.Infof(uiUtils.Red, fmt.Sprintf("Wasn't able to deploy the tapper %s. Reason: \"%s\"", pod.Name, pod.Status.Conditions[0].Message)) + cancel() + continue + } - removedPod, err := wEvent.ToPod() - if err != nil { - logger.Log.Errorf(uiUtils.Error, err) - cancel() - continue - } + podStatus := pod.Status - - logger.Log.Debugf("Tapper is removed [%s]", removedPod.Name) - case wEvent, ok := <-modified: - if !ok { - modified = nil - continue - } - - modifiedPod, err := wEvent.ToPod() - if err != nil { - logger.Log.Errorf(uiUtils.Error, err) - cancel() - continue - } - - if modifiedPod.Status.Phase == core.PodPending && modifiedPod.Status.Conditions[0].Type == core.PodScheduled && modifiedPod.Status.Conditions[0].Status != core.ConditionTrue { - logger.Log.Infof(uiUtils.Red, fmt.Sprintf("Wasn't able to deploy the tapper %s. Reason: \"%s\"", modifiedPod.Name, modifiedPod.Status.Conditions[0].Message)) - cancel() - continue - } - - podStatus := modifiedPod.Status - - if podStatus.Phase == core.PodRunning { - state := podStatus.ContainerStatuses[0].State - if state.Terminated != nil { - switch state.Terminated.Reason { - case "OOMKilled": - logger.Log.Infof(uiUtils.Red, fmt.Sprintf("Tapper %s was terminated (reason: OOMKilled). You should consider increasing machine resources.", modifiedPod.Name)) + if podStatus.Phase == core.PodRunning { + state := podStatus.ContainerStatuses[0].State + if state.Terminated != nil { + switch state.Terminated.Reason { + case "OOMKilled": + logger.Log.Infof(uiUtils.Red, fmt.Sprintf("Tapper %s was terminated (reason: OOMKilled). You should consider increasing machine resources.", pod.Name)) + } } } - } - logger.Log.Debugf("Tapper %s is %s", modifiedPod.Name, strings.ToLower(string(podStatus.Phase))) + logger.Log.Debugf("Tapper %s is %s", pod.Name, strings.ToLower(string(podStatus.Phase))) + case kubernetes.EventBookmark: + break + case kubernetes.EventError: + break + } case err, ok := <-errorChan: if !ok { errorChan = nil @@ -740,57 +720,19 @@ func watchMizuEvents(ctx context.Context, kubernetesProvider *kubernetes.Provide mizuResourceRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", kubernetes.MizuResourcesPrefix)) eventWatchHelper := kubernetes.NewEventWatchHelper(kubernetesProvider, mizuResourceRegex) - added, modified, removed, errorChan := kubernetes.FilteredWatch(ctx, eventWatchHelper, []string{config.Config.MizuResourcesNamespace}, eventWatchHelper) + eventChan, errorChan := kubernetes.FilteredWatch(ctx, eventWatchHelper, []string{config.Config.MizuResourcesNamespace}, eventWatchHelper) for { select { - case wEvent, ok := <-added: + case wEvent, ok := <-eventChan: if !ok { - added = nil + eventChan = nil continue } event, err := wEvent.ToEvent() if err != nil { - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("error parsing Mizu resource added event: %+v", err)) - cancel() - } - - if startTime.After(event.CreationTimestamp.Time) { - continue - } - - if event.Type == core.EventTypeWarning { - logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note)) - } - case wEvent, ok := <-removed: - if !ok { - removed = nil - continue - } - - event, err := wEvent.ToEvent() - if err != nil { - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("error parsing Mizu resource removed event: %+v", err)) - cancel() - } - - if startTime.After(event.CreationTimestamp.Time) { - continue - } - - if event.Type == core.EventTypeWarning { - logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note)) - } - case wEvent, ok := <-modified: - if !ok { - modified = nil - continue - } - - event, err := wEvent.ToEvent() - if err != nil { - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("error parsing Mizu resource modified event: %+v", err)) + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("error parsing Mizu resource event: %+v", err)) cancel() } diff --git a/shared/kubernetes/mizuTapperSyncer.go b/shared/kubernetes/mizuTapperSyncer.go index 10b8a5334..ee1f86ad4 100644 --- a/shared/kubernetes/mizuTapperSyncer.go +++ b/shared/kubernetes/mizuTapperSyncer.go @@ -70,7 +70,7 @@ func CreateAndStartMizuTapperSyncer(ctx context.Context, kubernetesProvider *Pro func (tapperSyncer *MizuTapperSyncer) watchPodsForTapping() { podWatchHelper := NewPodWatchHelper(tapperSyncer.kubernetesProvider, &tapperSyncer.config.PodFilterRegex) - added, modified, removed, errorChan := FilteredWatch(tapperSyncer.context, podWatchHelper, tapperSyncer.config.TargetNamespaces, podWatchHelper) + eventChan, errorChan := FilteredWatch(tapperSyncer.context, podWatchHelper, tapperSyncer.config.TargetNamespaces, podWatchHelper) restartTappers := func() { err, changeFound := tapperSyncer.updateCurrentlyTappedPods() @@ -96,9 +96,9 @@ func (tapperSyncer *MizuTapperSyncer) watchPodsForTapping() { for { select { - case wEvent, ok := <-added: + case wEvent, ok := <-eventChan: if !ok { - added = nil + eventChan = nil continue } @@ -109,44 +109,28 @@ func (tapperSyncer *MizuTapperSyncer) watchPodsForTapping() { } - logger.Log.Debugf("Added matching pod %s, ns: %s", pod.Name, pod.Namespace) - restartTappersDebouncer.SetOn() - case wEvent, ok := <-removed: - if !ok { - removed = nil - continue - } - - pod, err := wEvent.ToPod() - if err != nil { - tapperSyncer.handleErrorInWatchLoop(err, restartTappersDebouncer) - continue - } - - logger.Log.Debugf("Removed matching pod %s, ns: %s", pod.Name, pod.Namespace) - restartTappersDebouncer.SetOn() - case wEvent, ok := <-modified: - if !ok { - modified = nil - continue - } - - pod, err := wEvent.ToPod() - if err != nil { - tapperSyncer.handleErrorInWatchLoop(err, restartTappersDebouncer) - continue - } - - - logger.Log.Debugf("Modified matching pod %s, ns: %s, phase: %s, ip: %s", pod.Name, pod.Namespace, pod.Status.Phase, pod.Status.PodIP) - // Act only if the modified pod has already obtained an IP address. - // After filtering for IPs, on a normal pod restart this includes the following events: - // - Pod deletion - // - Pod reaches start state - // - Pod reaches ready state - // Ready/unready transitions might also trigger this event. - if pod.Status.PodIP != "" { + switch wEvent.Type { + case EventAdded: + logger.Log.Debugf("Added matching pod %s, ns: %s", pod.Name, pod.Namespace) restartTappersDebouncer.SetOn() + case EventDeleted: + logger.Log.Debugf("Removed matching pod %s, ns: %s", pod.Name, pod.Namespace) + restartTappersDebouncer.SetOn() + case EventModified: + logger.Log.Debugf("Modified matching pod %s, ns: %s, phase: %s, ip: %s", pod.Name, pod.Namespace, pod.Status.Phase, pod.Status.PodIP) + // Act only if the modified pod has already obtained an IP address. + // After filtering for IPs, on a normal pod restart this includes the following events: + // - Pod deletion + // - Pod reaches start state + // - Pod reaches ready state + // Ready/unready transitions might also trigger this event. + if pod.Status.PodIP != "" { + restartTappersDebouncer.SetOn() + } + case EventBookmark: + break + case EventError: + break } case err, ok := <-errorChan: if !ok { diff --git a/shared/kubernetes/watch.go b/shared/kubernetes/watch.go index a9588aa19..6acc3ef7f 100644 --- a/shared/kubernetes/watch.go +++ b/shared/kubernetes/watch.go @@ -20,10 +20,8 @@ type WatchCreator interface { NewWatcher(ctx context.Context, namespace string) (watch.Interface, error) } -func FilteredWatch(ctx context.Context, watcherCreator WatchCreator, targetNamespaces []string, filterer EventFilterer) (chan *WatchEvent, chan *WatchEvent, chan *WatchEvent, chan error) { - addedChan := make(chan *WatchEvent) - modifiedChan := make(chan *WatchEvent) - removedChan := make(chan *WatchEvent) +func FilteredWatch(ctx context.Context, watcherCreator WatchCreator, targetNamespaces []string, filterer EventFilterer) (<-chan *WatchEvent, <-chan error) { + eventChan := make(chan *WatchEvent) errorChan := make(chan error) var wg sync.WaitGroup @@ -42,7 +40,7 @@ func FilteredWatch(ctx context.Context, watcherCreator WatchCreator, targetNames break } - err = startWatchLoop(ctx, watcher, filterer, addedChan, modifiedChan, removedChan) // blocking + err = startWatchLoop(ctx, watcher, filterer, eventChan) // blocking watcher.Stop() select { @@ -73,16 +71,14 @@ func FilteredWatch(ctx context.Context, watcherCreator WatchCreator, targetNames go func() { <-ctx.Done() wg.Wait() - close(addedChan) - close(modifiedChan) - close(removedChan) + close(eventChan) close(errorChan) }() - return addedChan, modifiedChan, removedChan, errorChan + return eventChan, errorChan } -func startWatchLoop(ctx context.Context, watcher watch.Interface, filterer EventFilterer, addedChan chan *WatchEvent, modifiedChan chan *WatchEvent, removedChan chan *WatchEvent) error { +func startWatchLoop(ctx context.Context, watcher watch.Interface, filterer EventFilterer, eventChan chan<- *WatchEvent) error { resultChan := watcher.ResultChan() for { select { @@ -103,14 +99,7 @@ func startWatchLoop(ctx context.Context, watcher watch.Interface, filterer Event continue } - switch wEvent.Type { - case watch.Added: - addedChan <- &wEvent - case watch.Modified: - modifiedChan <- &wEvent - case watch.Deleted: - removedChan <- &wEvent - } + eventChan <- &wEvent case <-ctx.Done(): return nil } diff --git a/shared/kubernetes/watchEvent.go b/shared/kubernetes/watchEvent.go index ed07e4cf1..81e1d0b09 100644 --- a/shared/kubernetes/watchEvent.go +++ b/shared/kubernetes/watchEvent.go @@ -10,6 +10,14 @@ import ( "k8s.io/apimachinery/pkg/watch" ) +const ( + EventAdded watch.EventType = watch.Added + EventModified watch.EventType = watch.Modified + EventDeleted watch.EventType = watch.Deleted + EventBookmark watch.EventType = watch.Bookmark + EventError watch.EventType = watch.Error +) + type InvalidObjectType struct { RequestedType reflect.Type } From b0c8c0c192273b75337c8ba3822944521c932c6b Mon Sep 17 00:00:00 2001 From: David Levanon Date: Tue, 23 Nov 2021 20:16:07 +0200 Subject: [PATCH 56/93] Add response body to the error in case of failure (#503) * add response body to the error in case of failure * fix typo + make inline condition --- cli/apiserver/provider.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/cli/apiserver/provider.go b/cli/apiserver/provider.go index b032cd4c8..dee6c225e 100644 --- a/cli/apiserver/provider.go +++ b/cli/apiserver/provider.go @@ -3,11 +3,12 @@ package apiserver import ( "bytes" "encoding/json" - "errors" "fmt" + "io" "io/ioutil" "net/http" "net/url" + "strings" "time" "github.com/up9inc/mizu/shared/kubernetes" @@ -61,7 +62,14 @@ func (provider *Provider) GetHealthStatus() (*shared.HealthResponse, error) { if response, err := provider.client.Get(healthUrl); err != nil { return nil, err } else if response.StatusCode > 299 { - return nil, errors.New(fmt.Sprintf("status code: %d", response.StatusCode)) + responseBody := new(strings.Builder) + + if _, err := io.Copy(responseBody, response.Body); err != nil { + return nil, fmt.Errorf("status code: %d - (bad response - %v)", response.StatusCode, err) + } else { + singleLineResponse := strings.ReplaceAll(responseBody.String(), "\n", "") + return nil, fmt.Errorf("status code: %d - (response - %v)", response.StatusCode, singleLineResponse) + } } else { defer response.Body.Close() From 86240e41219fea7b581f0c0a0619b256eb1f19d8 Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Wed, 24 Nov 2021 10:46:07 +0200 Subject: [PATCH 57/93] Remove local dev instruction from readme (#507) --- README.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/README.md b/README.md index 0ceace408..56d537899 100644 --- a/README.md +++ b/README.md @@ -185,15 +185,3 @@ Mizu can be run detached from the cli using the daemon flag: `mizu tap --daemon` indefinitely in the cluster. For more information please refer to [DAEMON MODE](docs/DAEMON_MODE.md) - -## How to Run local UI - -- run from mizu/agent `go run main.go --hars-read --hars-dir ` - -- copy Har files into the folder from last command - -- change `MizuWebsocketURL` and `apiURL` in `api.js` file - -- run from mizu/ui - `npm run start` - -- open browser on `localhost:3000` From e667597e6eca8db6cdd765d762f73291eb6f340c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Thu, 25 Nov 2021 20:15:43 +0300 Subject: [PATCH 58/93] Rename `URL` field to `Target URI` in the UI to prevent confusion (#509) --- tap/extensions/http/main.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tap/extensions/http/main.go b/tap/extensions/http/main.go index 2bebe7721..531c030f0 100644 --- a/tap/extensions/http/main.go +++ b/tap/extensions/http/main.go @@ -162,6 +162,7 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, } request["url"] = reqDetails["url"].(string) + reqDetails["targetUri"] = reqDetails["url"] reqDetails["path"] = path reqDetails["summary"] = path @@ -269,9 +270,9 @@ func representRequest(request map[string]interface{}) (repRequest []interface{}) Selector: `request.method`, }, { - Name: "URL", - Value: request["url"].(string), - Selector: `request.url`, + Name: "Target URI", + Value: request["targetUri"].(string), + Selector: `request.targetUri`, }, { Name: "Path", From a62842ac9f27751dbfae627765a74f47704b7fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Thu, 25 Nov 2021 20:36:13 +0300 Subject: [PATCH 59/93] Add HTTP2 Over Cleartext (H2C) support (#510) * Add HTTP2 Over Cleartext (H2C) support * Remove a parameter which is a remnant of debugging --- tap/extensions/http/handlers.go | 46 +++++++++++++++++++++---------- tap/extensions/http/main.go | 49 ++++++++++++++++++++++++++++++--- tap/extensions/http/matcher.go | 2 +- 3 files changed, 78 insertions(+), 19 deletions(-) diff --git a/tap/extensions/http/handlers.go b/tap/extensions/http/handlers.go index f2ea09c02..ffcbe8c7f 100644 --- a/tap/extensions/http/handlers.go +++ b/tap/extensions/http/handlers.go @@ -7,6 +7,7 @@ import ( "io" "io/ioutil" "net/http" + "strings" "github.com/up9inc/mizu/tap/api" ) @@ -34,12 +35,13 @@ func handleHTTP2Stream(http2Assembler *Http2Assembler, tcpID *api.TcpID, superTi switch messageHTTP1 := messageHTTP1.(type) { case http.Request: ident := fmt.Sprintf( - "%s->%s %s->%s %d", + "%s->%s %s->%s %d %s", tcpID.SrcIP, tcpID.DstIP, tcpID.SrcPort, tcpID.DstPort, streamID, + "HTTP2", ) item = reqResMatcher.registerRequest(ident, &messageHTTP1, superTimer.CaptureTime) if item != nil { @@ -53,12 +55,13 @@ func handleHTTP2Stream(http2Assembler *Http2Assembler, tcpID *api.TcpID, superTi } case http.Response: ident := fmt.Sprintf( - "%s->%s %s->%s %d", + "%s->%s %s->%s %d %s", tcpID.DstIP, tcpID.SrcIP, tcpID.DstPort, tcpID.SrcPort, streamID, + "HTTP2", ) item = reqResMatcher.registerResponse(ident, &messageHTTP1, superTimer.CaptureTime) if item != nil { @@ -84,23 +87,30 @@ func handleHTTP2Stream(http2Assembler *Http2Assembler, tcpID *api.TcpID, superTi return nil } -func handleHTTP1ClientStream(b *bufio.Reader, tcpID *api.TcpID, counterPair *api.CounterPair, superTimer *api.SuperTimer, emitter api.Emitter, options *api.TrafficFilteringOptions) error { - req, err := http.ReadRequest(b) +func handleHTTP1ClientStream(b *bufio.Reader, tcpID *api.TcpID, counterPair *api.CounterPair, superTimer *api.SuperTimer, emitter api.Emitter, options *api.TrafficFilteringOptions) (switchingProtocolsHTTP2 bool, req *http.Request, err error) { + req, err = http.ReadRequest(b) if err != nil { - return err + return } counterPair.Request++ - body, err := ioutil.ReadAll(req.Body) + // Check HTTP2 upgrade - HTTP2 Over Cleartext (H2C) + if strings.Contains(strings.ToLower(req.Header.Get("Connection")), "upgrade") && strings.ToLower(req.Header.Get("Upgrade")) == "h2c" { + switchingProtocolsHTTP2 = true + } + + var body []byte + body, err = ioutil.ReadAll(req.Body) req.Body = io.NopCloser(bytes.NewBuffer(body)) // rewind ident := fmt.Sprintf( - "%s->%s %s->%s %d", + "%s->%s %s->%s %d %s", tcpID.SrcIP, tcpID.DstIP, tcpID.SrcPort, tcpID.DstPort, counterPair.Request, + "HTTP1", ) item := reqResMatcher.registerRequest(ident, req, superTimer.CaptureTime) if item != nil { @@ -113,26 +123,34 @@ func handleHTTP1ClientStream(b *bufio.Reader, tcpID *api.TcpID, counterPair *api } filterAndEmit(item, emitter, options) } - return nil + return } -func handleHTTP1ServerStream(b *bufio.Reader, tcpID *api.TcpID, counterPair *api.CounterPair, superTimer *api.SuperTimer, emitter api.Emitter, options *api.TrafficFilteringOptions) error { - res, err := http.ReadResponse(b, nil) +func handleHTTP1ServerStream(b *bufio.Reader, tcpID *api.TcpID, counterPair *api.CounterPair, superTimer *api.SuperTimer, emitter api.Emitter, options *api.TrafficFilteringOptions) (switchingProtocolsHTTP2 bool, err error) { + var res *http.Response + res, err = http.ReadResponse(b, nil) if err != nil { - return err + return } counterPair.Response++ - body, err := ioutil.ReadAll(res.Body) + // Check HTTP2 upgrade - HTTP2 Over Cleartext (H2C) + if res.StatusCode == 101 && strings.Contains(strings.ToLower(res.Header.Get("Connection")), "upgrade") && strings.ToLower(res.Header.Get("Upgrade")) == "h2c" { + switchingProtocolsHTTP2 = true + } + + var body []byte + body, err = ioutil.ReadAll(res.Body) res.Body = io.NopCloser(bytes.NewBuffer(body)) // rewind ident := fmt.Sprintf( - "%s->%s %s->%s %d", + "%s->%s %s->%s %d %s", tcpID.DstIP, tcpID.SrcIP, tcpID.DstPort, tcpID.SrcPort, counterPair.Response, + "HTTP1", ) item := reqResMatcher.registerResponse(ident, res, superTimer.CaptureTime) if item != nil { @@ -145,5 +163,5 @@ func handleHTTP1ServerStream(b *bufio.Reader, tcpID *api.TcpID, counterPair *api } filterAndEmit(item, emitter, options) } - return nil + return } diff --git a/tap/extensions/http/main.go b/tap/extensions/http/main.go index 531c030f0..fa3eea323 100644 --- a/tap/extensions/http/main.go +++ b/tap/extensions/http/main.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "log" + "net/http" "net/url" "time" @@ -85,7 +86,15 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co } dissected := false + switchingProtocolsHTTP2 := false for { + if switchingProtocolsHTTP2 { + switchingProtocolsHTTP2 = false + isHTTP2, err = checkIsHTTP2Connection(b, isClient) + prepareHTTP2Connection(b, isClient) + http2Assembler = createHTTP2Assembler(b) + } + if superIdentifier.Protocol != nil && superIdentifier.Protocol != &protocol { return errors.New("Identified by another protocol") } @@ -99,15 +108,39 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co } dissected = true } else if isClient { - err = handleHTTP1ClientStream(b, tcpID, counterPair, superTimer, emitter, options) + var req *http.Request + switchingProtocolsHTTP2, req, err = handleHTTP1ClientStream(b, tcpID, counterPair, superTimer, emitter, options) if err == io.EOF || err == io.ErrUnexpectedEOF { break } else if err != nil { continue } dissected = true + + // In case of an HTTP2 upgrade, duplicate the HTTP1 request into HTTP2 with stream ID 1 + if switchingProtocolsHTTP2 { + ident := fmt.Sprintf( + "%s->%s %s->%s 1 %s", + tcpID.SrcIP, + tcpID.DstIP, + tcpID.SrcPort, + tcpID.DstPort, + "HTTP2", + ) + item := reqResMatcher.registerRequest(ident, req, superTimer.CaptureTime) + if item != nil { + item.ConnectionInfo = &api.ConnectionInfo{ + ClientIP: tcpID.SrcIP, + ClientPort: tcpID.SrcPort, + ServerIP: tcpID.DstIP, + ServerPort: tcpID.DstPort, + IsOutgoing: true, + } + filterAndEmit(item, emitter, options) + } + } } else { - err = handleHTTP1ServerStream(b, tcpID, counterPair, superTimer, emitter, options) + switchingProtocolsHTTP2, err = handleHTTP1ServerStream(b, tcpID, counterPair, superTimer, emitter, options) if err == io.EOF || err == io.ErrUnexpectedEOF { break } else if err != nil { @@ -132,6 +165,8 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, reqDetails := request["details"].(map[string]interface{}) resDetails := response["details"].(map[string]interface{}) + isRequestUpgradedH2C := false + for _, header := range reqDetails["headers"].([]interface{}) { h := header.(map[string]interface{}) if h["name"] == "Host" { @@ -143,13 +178,19 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, if h["name"] == ":path" { path = h["value"].(string) } + + if h["name"] == "Upgrade" { + if h["value"].(string) == "h2c" { + isRequestUpgradedH2C = true + } + } } if resDetails["bodySize"].(float64) < 0 { resDetails["bodySize"] = 0 } - if item.Protocol.Version == "2.0" { + if item.Protocol.Version == "2.0" && !isRequestUpgradedH2C { service = authority } else { service = host @@ -192,7 +233,7 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, resDetails["statusText"] = grpcStatusCodes[statusCode] } - if item.Protocol.Version == "2.0" { + if item.Protocol.Version == "2.0" && !isRequestUpgradedH2C { reqDetails["url"] = path request["url"] = path } diff --git a/tap/extensions/http/matcher.go b/tap/extensions/http/matcher.go index 08a0b4e5c..01048fa21 100644 --- a/tap/extensions/http/matcher.go +++ b/tap/extensions/http/matcher.go @@ -92,6 +92,6 @@ func splitIdent(ident string) []string { } func genKey(split []string) string { - key := fmt.Sprintf("%s:%s->%s:%s,%s", split[0], split[2], split[1], split[3], split[4]) + key := fmt.Sprintf("%s:%s->%s:%s,%s%s", split[0], split[2], split[1], split[3], split[4], split[5]) return key } From a1bda0a6c384f00008dc30776f88372585345235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Fri, 26 Nov 2021 09:40:44 +0300 Subject: [PATCH 60/93] Hide `Encoding` field if it's `undefined` or empty in the UI (#511) --- ui/src/components/EntryDetailed/EntrySections.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/components/EntryDetailed/EntrySections.tsx b/ui/src/components/EntryDetailed/EntrySections.tsx index 0e0f8942d..88db7b310 100644 --- a/ui/src/components/EntryDetailed/EntrySections.tsx +++ b/ui/src/components/EntryDetailed/EntrySections.tsx @@ -130,7 +130,7 @@ export const EntryBodySection: React.FC = ({ - + {encoding && }
    From 9696ad9bad60de2f695a2591e981fd6d926dc126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Sun, 28 Nov 2021 10:59:40 +0300 Subject: [PATCH 61/93] Show the `EntryItem` as `EntrySummary` in `EntryDetailed` (#506) --- ui/src/components/EntryDetailed.tsx | 25 ++++++++-------- .../EntryDetailed/EntryViewer.module.sass | 1 + .../EntryListItem/EntryListItem.tsx | 15 ++++++---- ui/src/components/TrafficPage.tsx | 30 ++++++++++++------- 4 files changed, 41 insertions(+), 30 deletions(-) diff --git a/ui/src/components/EntryDetailed.tsx b/ui/src/components/EntryDetailed.tsx index 2c5481a13..47dab4883 100644 --- a/ui/src/components/EntryDetailed.tsx +++ b/ui/src/components/EntryDetailed.tsx @@ -1,9 +1,8 @@ import React from "react"; import EntryViewer from "./EntryDetailed/EntryViewer"; +import {EntryItem} from "./EntryListItem/EntryListItem"; import {makeStyles} from "@material-ui/core"; import Protocol from "./UI/Protocol" -import StatusCode from "./UI/StatusCode"; -import {Summary} from "./UI/Summary"; const useStyles = makeStyles(() => ({ entryTitle: { @@ -12,6 +11,7 @@ const useStyles = makeStyles(() => ({ maxHeight: 46, alignItems: 'center', marginBottom: 4, + marginLeft: 6, padding: 2, paddingBottom: 0 }, @@ -64,18 +64,17 @@ const EntryTitle: React.FC = ({protocol, data, bodySize, elapsedTime, updat }; const EntrySummary: React.FC = ({data, updateQuery}) => { - const classes = useStyles(); + const entry = data.base; - const response = data.response; - - return
    - {response && "status" in response &&
    - -
    } -
    - -
    -
    ; + return ; }; export const EntryDetailed: React.FC = ({entryData, updateQuery}) => { diff --git a/ui/src/components/EntryDetailed/EntryViewer.module.sass b/ui/src/components/EntryDetailed/EntryViewer.module.sass index 740a4c417..fdc1e7195 100644 --- a/ui/src/components/EntryDetailed/EntryViewer.module.sass +++ b/ui/src/components/EntryDetailed/EntryViewer.module.sass @@ -4,6 +4,7 @@ font-family: "Source Sans Pro", Lucida Grande, Tahoma, sans-serif height: calc(100% - 70px) width: 100% + margin-top: 10px h3, h4 diff --git a/ui/src/components/EntryListItem/EntryListItem.tsx b/ui/src/components/EntryListItem/EntryListItem.tsx index 29da5bcdf..b27299221 100644 --- a/ui/src/components/EntryListItem/EntryListItem.tsx +++ b/ui/src/components/EntryListItem/EntryListItem.tsx @@ -40,11 +40,13 @@ interface EntryProps { setFocusedEntryId: (id: string) => void; style: object; updateQuery: any; + forceSelect: boolean; + headingMode: boolean; } -export const EntryItem: React.FC = ({entry, setFocusedEntryId, style, updateQuery}) => { +export const EntryItem: React.FC = ({entry, setFocusedEntryId, style, updateQuery, forceSelect, headingMode}) => { - const [isSelected, setIsSelected] = useState(false); + const [isSelected, setIsSelected] = useState(!forceSelect ? false : true); const classification = getClassification(entry.statusCode) const numberOfRules = entry.rules.numberOfRules @@ -122,22 +124,23 @@ export const EntryItem: React.FC = ({entry, setFocusedEntryId, style className={`${styles.row} ${isSelected && !rule && !contractEnabled ? styles.rowSelected : additionalRulesProperties}`} onClick={() => { + if (!setFocusedEntryId) return; setIsSelected(!isSelected); setFocusedEntryId(entry.id.toString()); }} style={{ border: isSelected ? `1px ${entry.protocol.backgroundColor} solid` : "1px transparent solid", - position: "absolute", + position: !headingMode ? "absolute" : "unset", top: style['top'], marginTop: style['marginTop'], - width: "calc(100% - 25px)", + width: !headingMode ? "calc(100% - 25px)" : "calc(100% - 18px)", }} > - + /> : null} {((entry.protocol.name === "http" && "statusCode" in entry) || entry.statusCode !== 0) &&
    } diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index 3d2afa71d..b530dea5d 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -119,7 +119,11 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS switch (message.messageType) { case "entry": const entry = message.data; - if (!focusedEntryId) setFocusedEntryId(entry.id.toString()); + var forceSelect = false; + if (!focusedEntryId) { + setFocusedEntryId(entry.id.toString()); + forceSelect = true; + } setEntriesBuffer([ ...entriesBuffer, = ({setAnalyzeStatus, onTLS setFocusedEntryId={setFocusedEntryId} style={{}} updateQuery={updateQuery} + forceSelect={forceSelect} + headingMode={false} /> ]); break @@ -190,16 +196,18 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const entryData = await api.getEntry(focusedEntryId); setSelectedEntryData(entryData); } catch (error) { - toast[error.response.data.type](`Entry[${focusedEntryId}]: ${error.response.data.msg}`, { - position: "bottom-right", - theme: "colored", - autoClose: error.response.data.autoClose, - hideProgressBar: false, - closeOnClick: true, - pauseOnHover: true, - draggable: true, - progress: undefined, - }); + if (error.response) { + toast[error.response.data.type](`Entry[${focusedEntryId}]: ${error.response.data.msg}`, { + position: "bottom-right", + theme: "colored", + autoClose: error.response.data.autoClose, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + }); + } console.error(error); } })() From 873f252544d0f7e3829070570b0f09e5be5b3c4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Tue, 30 Nov 2021 15:27:10 +0300 Subject: [PATCH 62/93] Fix the selected entry behavior by propagating the `focusedEntryId` through WebSocket (before #452) TRA-3983 (#513) * Revert the select entry behavior into its original state RACING! (before #452) [TRA-3983 alternative 3] * Remove the remaining `forceSelect`(s) * Add a missing `focusedEntryId` prop * Fix the race condition * Propagate the `focusedEntryId` through WebSocket to prevent racing --- agent/pkg/api/socket_routes.go | 117 ++++++++++-------- agent/pkg/models/models.go | 15 +++ shared/models.go | 6 +- ui/src/components/EntryDetailed.tsx | 2 +- .../EntryListItem/EntryListItem.tsx | 9 +- ui/src/components/TrafficPage.tsx | 21 +++- 6 files changed, 107 insertions(+), 63 deletions(-) diff --git a/agent/pkg/api/socket_routes.go b/agent/pkg/api/socket_routes.go index 8feccebac..b82c7c338 100644 --- a/agent/pkg/api/socket_routes.go +++ b/agent/pkg/api/socket_routes.go @@ -6,6 +6,7 @@ import ( "fmt" "mizuserver/pkg/models" "net/http" + "strconv" "sync" "time" @@ -94,6 +95,8 @@ func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers Even startTimeBytes, _ := models.CreateWebsocketStartTimeMessage(startTime) SendToSocket(socketId, startTimeBytes) + queryRecieved := false + for { _, msg, err := ws.ReadMessage() if err != nil { @@ -101,65 +104,75 @@ func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers Even break } - if !isTapper && !isQuerySet { - query := string(msg) - err = basenine.Validate(shared.BasenineHost, shared.BaseninePort, query) - if err != nil { - toastBytes, _ := models.CreateWebsocketToastMessage(&models.ToastMessage{ - Type: "error", - AutoClose: 5000, - Text: fmt.Sprintf("Syntax error: %s", err.Error()), - }) - SendToSocket(socketId, toastBytes) - break - } - - isQuerySet = true - - handleDataChannel := func(c *basenine.Connection, data chan []byte) { - for { - bytes := <-data - - if string(bytes) == basenine.CloseChannel { - return - } - - var dataMap map[string]interface{} - err = json.Unmarshal(bytes, &dataMap) - - base := dataMap["base"].(map[string]interface{}) - base["id"] = uint(dataMap["id"].(float64)) - - baseEntryBytes, _ := models.CreateBaseEntryWebSocketMessage(base) - SendToSocket(socketId, baseEntryBytes) + if !queryRecieved { + if !isTapper && !isQuerySet { + queryRecieved = true + query := string(msg) + err = basenine.Validate(shared.BasenineHost, shared.BaseninePort, query) + if err != nil { + toastBytes, _ := models.CreateWebsocketToastMessage(&models.ToastMessage{ + Type: "error", + AutoClose: 5000, + Text: fmt.Sprintf("Syntax error: %s", err.Error()), + }) + SendToSocket(socketId, toastBytes) + break } - } - handleMetaChannel := func(c *basenine.Connection, meta chan []byte) { - for { - bytes := <-meta + isQuerySet = true - if string(bytes) == basenine.CloseChannel { - return + handleDataChannel := func(c *basenine.Connection, data chan []byte) { + for { + bytes := <-data + + if string(bytes) == basenine.CloseChannel { + return + } + + var dataMap map[string]interface{} + err = json.Unmarshal(bytes, &dataMap) + + base := dataMap["base"].(map[string]interface{}) + base["id"] = uint(dataMap["id"].(float64)) + + baseEntryBytes, _ := models.CreateBaseEntryWebSocketMessage(base) + SendToSocket(socketId, baseEntryBytes) } - - var metadata *basenine.Metadata - err = json.Unmarshal(bytes, &metadata) - if err != nil { - logger.Log.Debugf("Error recieving metadata: %v", err.Error()) - } - - metadataBytes, _ := models.CreateWebsocketQueryMetadataMessage(metadata) - SendToSocket(socketId, metadataBytes) } + + handleMetaChannel := func(c *basenine.Connection, meta chan []byte) { + for { + bytes := <-meta + + if string(bytes) == basenine.CloseChannel { + return + } + + var metadata *basenine.Metadata + err = json.Unmarshal(bytes, &metadata) + if err != nil { + logger.Log.Debugf("Error recieving metadata: %v", err.Error()) + } + + metadataBytes, _ := models.CreateWebsocketQueryMetadataMessage(metadata) + SendToSocket(socketId, metadataBytes) + } + } + + go handleDataChannel(connection, data) + go handleMetaChannel(connection, meta) + + connection.Query(query, data, meta) + } else { + eventHandlers.WebSocketMessage(socketId, msg) } - - go handleDataChannel(connection, data) - go handleMetaChannel(connection, meta) - - connection.Query(query, data, meta) } else { - eventHandlers.WebSocketMessage(socketId, msg) + id, err := strconv.Atoi(string(msg)) + if err != nil { + continue + } + focusEntryBytes, _ := models.CreateWebsocketFocusEntry(id) + SendToSocket(socketId, focusEntryBytes) } } } diff --git a/agent/pkg/models/models.go b/agent/pkg/models/models.go index 6add39eeb..17113180e 100644 --- a/agent/pkg/models/models.go +++ b/agent/pkg/models/models.go @@ -57,6 +57,11 @@ type WebSocketStartTimeMessage struct { Data int64 `json:"data"` } +type WebSocketFocusEntryMessage struct { + *shared.WebSocketMessageMetadata + Id int `json:"id"` +} + func CreateBaseEntryWebSocketMessage(base map[string]interface{}) ([]byte, error) { message := &WebSocketEntryMessage{ WebSocketMessageMetadata: &shared.WebSocketMessageMetadata{ @@ -117,6 +122,16 @@ func CreateWebsocketStartTimeMessage(base int64) ([]byte, error) { return json.Marshal(message) } +func CreateWebsocketFocusEntry(id int) ([]byte, error) { + message := &WebSocketFocusEntryMessage{ + WebSocketMessageMetadata: &shared.WebSocketMessageMetadata{ + MessageType: shared.WebSocketMessageFocusEntry, + }, + Id: id, + } + return json.Marshal(message) +} + // ExtendedHAR is the top level object of a HAR log. type ExtendedHAR struct { Log *ExtendedLog `json:"log"` diff --git a/shared/models.go b/shared/models.go index 1d3893274..59ba6c085 100644 --- a/shared/models.go +++ b/shared/models.go @@ -1,11 +1,12 @@ package shared import ( + "io/ioutil" + "strings" + "github.com/op/go-logging" "github.com/up9inc/mizu/shared/logger" "github.com/up9inc/mizu/tap/api" - "io/ioutil" - "strings" "gopkg.in/yaml.v3" ) @@ -21,6 +22,7 @@ const ( WebSocketMessageTypeToast WebSocketMessageType = "toast" WebSocketMessageTypeQueryMetadata WebSocketMessageType = "queryMetadata" WebSocketMessageTypeStartTime WebSocketMessageType = "startTime" + WebSocketMessageFocusEntry WebSocketMessageType = "focusEntry" ) type Resources struct { diff --git a/ui/src/components/EntryDetailed.tsx b/ui/src/components/EntryDetailed.tsx index 47dab4883..f8854a293 100644 --- a/ui/src/components/EntryDetailed.tsx +++ b/ui/src/components/EntryDetailed.tsx @@ -69,10 +69,10 @@ const EntrySummary: React.FC = ({data, updateQuery}) => { return ; }; diff --git a/ui/src/components/EntryListItem/EntryListItem.tsx b/ui/src/components/EntryListItem/EntryListItem.tsx index b27299221..4461b4f70 100644 --- a/ui/src/components/EntryListItem/EntryListItem.tsx +++ b/ui/src/components/EntryListItem/EntryListItem.tsx @@ -1,4 +1,4 @@ -import React, {useState} from "react"; +import React from "react"; import styles from './EntryListItem.module.sass'; import StatusCode, {getClassification, StatusCodeClassification} from "../UI/StatusCode"; import Protocol, {ProtocolInterface} from "../UI/Protocol" @@ -37,16 +37,16 @@ interface Rules { interface EntryProps { entry: Entry; + focusedEntryId: string; setFocusedEntryId: (id: string) => void; style: object; updateQuery: any; - forceSelect: boolean; headingMode: boolean; } -export const EntryItem: React.FC = ({entry, setFocusedEntryId, style, updateQuery, forceSelect, headingMode}) => { +export const EntryItem: React.FC = ({entry, focusedEntryId, setFocusedEntryId, style, updateQuery, headingMode}) => { - const [isSelected, setIsSelected] = useState(!forceSelect ? false : true); + const isSelected = focusedEntryId === entry.id.toString(); const classification = getClassification(entry.statusCode) const numberOfRules = entry.rules.numberOfRules @@ -125,7 +125,6 @@ export const EntryItem: React.FC = ({entry, setFocusedEntryId, style ${isSelected && !rule && !contractEnabled ? styles.rowSelected : additionalRulesProperties}`} onClick={() => { if (!setFocusedEntryId) return; - setIsSelected(!isSelected); setFocusedEntryId(entry.id.toString()); }} style={{ diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index b530dea5d..f741c39e3 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -119,20 +119,20 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS switch (message.messageType) { case "entry": const entry = message.data; - var forceSelect = false; + var focusThis = false; if (!focusedEntryId) { + focusThis = true; setFocusedEntryId(entry.id.toString()); - forceSelect = true; } setEntriesBuffer([ ...entriesBuffer, ]); @@ -166,6 +166,16 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS case "startTime": setStartTime(message.data); break; + case "focusEntry": + // To achieve selecting only one entry, render all elements in the buffer + // with the current `focusedEntryId` value. + entriesBuffer.forEach((entry: any, i: number) => { + entriesBuffer[i] = React.cloneElement(entry, { + focusedEntryId: focusedEntryId + }); + }) + setEntries(entriesBuffer); + break; default: console.error(`unsupported websocket message type, Got: ${message.messageType}`) } @@ -191,6 +201,11 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS useEffect(() => { if (!focusedEntryId) return; setSelectedEntryData(null); + + if (ws.current.readyState === WebSocket.OPEN) { + ws.current.send(focusedEntryId); + } + (async () => { try { const entryData = await api.getEntry(focusedEntryId); From b745f65971f4c26597e75b72c225ba95a14211cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Tue, 30 Nov 2021 16:30:18 +0300 Subject: [PATCH 63/93] Handle unexpected socket close and replace the default `rlimit(100)` filter with `leftOff(-1)` filter (#508) * Handle unexpected socket close and replace the default `rlimit(100)` filter with `leftOff(-1)` filter * Rename `dontClear` parameter to `resetEntriesBuffer` and remove negation --- Dockerfile | 4 ++-- agent/go.mod | 2 +- agent/go.sum | 4 ++-- debug.Dockerfile | 4 ++-- ui/src/components/Filters.tsx | 8 +++---- ui/src/components/TrafficPage.tsx | 37 +++++++++++++++++++++++-------- 6 files changed, 39 insertions(+), 20 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5675bc910..304684627 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,8 +42,8 @@ RUN go build -ldflags="-s -w \ -X 'mizuserver/pkg/version.SemVer=${SEM_VER}'" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.11/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.11/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.12/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.12/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/agent/go.mod b/agent/go.mod index c2b10a534..06108bf9b 100644 --- a/agent/go.mod +++ b/agent/go.mod @@ -16,7 +16,7 @@ require ( github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/orcaman/concurrent-map v0.0.0-20210106121528-16402b402231 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/up9inc/basenine/client/go v0.0.0-20211121072216-04366911881c + github.com/up9inc/basenine/client/go v0.0.0-20211125004153-d0e8aec03fea github.com/up9inc/mizu/shared v0.0.0 github.com/up9inc/mizu/tap v0.0.0 github.com/up9inc/mizu/tap/api v0.0.0 diff --git a/agent/go.sum b/agent/go.sum index 1d18d281a..30e473925 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -450,8 +450,8 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/up9inc/basenine/client/go v0.0.0-20211121072216-04366911881c h1:GJsCVhDKjV/k3mNG255VN7hAQ7fxyNgX5T+VJyzoOQ0= -github.com/up9inc/basenine/client/go v0.0.0-20211121072216-04366911881c/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= +github.com/up9inc/basenine/client/go v0.0.0-20211125004153-d0e8aec03fea h1:GpJGO2PNTS/S0j2E1yqBi3ST/VXfokzuOrTQyaYgWnA= +github.com/up9inc/basenine/client/go v0.0.0-20211125004153-d0e8aec03fea/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= diff --git a/debug.Dockerfile b/debug.Dockerfile index 68176ffae..b6af5df92 100644 --- a/debug.Dockerfile +++ b/debug.Dockerfile @@ -37,8 +37,8 @@ COPY agent . RUN go build -gcflags="all=-N -l" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.11/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.11/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.12/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.12/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/ui/src/components/Filters.tsx b/ui/src/components/Filters.tsx index 734bb126e..87463085a 100644 --- a/ui/src/components/Filters.tsx +++ b/ui/src/components/Filters.tsx @@ -13,7 +13,7 @@ interface FiltersProps { setQuery: any backgroundColor: string ws: any - openWebSocket: (query: string) => void; + openWebSocket: (query: string, resetEntriesBuffer: boolean) => void; } export const Filters: React.FC = ({query, setQuery, backgroundColor, ws, openWebSocket}) => { @@ -33,7 +33,7 @@ interface QueryFormProps { setQuery: any backgroundColor: string ws: any - openWebSocket: (query: string) => void; + openWebSocket: (query: string, resetEntriesBuffer: boolean) => void; } const style = { @@ -63,8 +63,8 @@ export const QueryForm: React.FC = ({query, setQuery, background } const handleSubmit = (e) => { - ws.close() - openWebSocket(query) + ws.close(); + openWebSocket(query, true); e.preventDefault(); } diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index f741c39e3..13175f236 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -66,6 +66,7 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const [queriedCurrent, setQueriedCurrent] = useState(0); const [queriedTotal, setQueriedTotal] = useState(0); + const [leftOff, setLeftOff] = useState(0); const [startTime, setStartTime] = useState(0); @@ -100,16 +101,30 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const listEntry = useRef(null); - const openWebSocket = (query) => { - setFocusedEntryId(null); - setEntries([]); - setEntriesBuffer([]); + const openWebSocket = (query: string, resetEntriesBuffer: boolean) => { + if (resetEntriesBuffer) { + setFocusedEntryId(null); + setEntries([]); + setEntriesBuffer([]); + } else { + setEntriesBuffer(entries); + } ws.current = new WebSocket(MizuWebsocketURL); ws.current.onopen = () => { - ws.current.send(query) setConnection(ConnectionStatus.Connected); + ws.current.send(query); + } + ws.current.onclose = () => { + setConnection(ConnectionStatus.Closed); + } + ws.current.onerror = (event) => { + console.error("WebSocket error:", event); + if (query) { + openWebSocket(`(${query}) and leftOff(${leftOff})`, false); + } else { + openWebSocket(`leftOff(${leftOff})`, false); + } } - ws.current.onclose = () => setConnection(ConnectionStatus.Closed); } if (ws.current) { @@ -161,6 +176,7 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS case "queryMetadata": setQueriedCurrent(message.data.current); setQueriedTotal(message.data.total); + setLeftOff(message.data.leftOff); setEntries(entriesBuffer); break; case "startTime": @@ -184,7 +200,7 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS useEffect(() => { (async () => { - openWebSocket("rlimit(100)"); + openWebSocket("leftOff(-1)", true); try{ const tapStatusResponse = await api.tapStatus(); setTappingStatus(tapStatusResponse); @@ -232,8 +248,11 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS if (connection === ConnectionStatus.Connected) { ws.current.close(); } else { - openWebSocket(query); - setConnection(ConnectionStatus.Connected); + if (query) { + openWebSocket(`(${query}) and leftOff(${leftOff})`, false); + } else { + openWebSocket(`leftOff(${leftOff})`, false); + } } } From af557f7052072eb22f70366a701392a5e9707eab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Tue, 30 Nov 2021 17:52:21 +0300 Subject: [PATCH 64/93] Add `Queryable` component to show a green add circle icon for the queryable UI elements (#512) * Add `Queryable` component to show a green circle and use it in `EntryViewLine` * Refactor `Queryable` component * Use the `Queryable` component `EntryDetailed` * Use the `Queryable` component `Summary` * Instead of passing the style to `Queryable`, pass the children components directly * Make `useTooltip = true` by default in `Queryable` * Refactor a lot of styling to achieve using `Queryable` in `Protocol` component * Migrate the last queryable elements in `EntryListItem` to `Queryable` component * Fix some of the styling issues * Make horizontal `Protocol` `Queryable` too * Remove unnecessary child constants * Revert some of the changes in 2a93f365f5c815dde16e97ac84a835c2ac9016de * Fix rest of the styling issues * Fix one more styling issue * Update the screenshots and text in the cheatsheet according to the change * Use `let` not `var` * Add missing dependencies to the React hook --- ui/src/components/EntryDetailed.tsx | 42 +++-- .../EntryDetailed/EntrySections.module.sass | 2 +- .../EntryDetailed/EntrySections.tsx | 43 +++-- .../EntryListItem/EntryListItem.module.sass | 5 +- .../EntryListItem/EntryListItem.tsx | 173 +++++++++++------- ui/src/components/Filters.tsx | 6 +- ui/src/components/TrafficPage.tsx | 2 +- ui/src/components/UI/Protocol.tsx | 54 +++--- ui/src/components/UI/Queryable.tsx | 62 +++++++ ui/src/components/UI/StatusCode.tsx | 21 ++- ui/src/components/UI/Summary.tsx | 37 ++-- ui/src/components/UI/style/Queryable.sass | 48 +++++ .../components/UI/style/Summary.module.sass | 2 - ui/src/components/UI/style/misc.module.sass | 3 +- .../components/assets/filter-ui-example-1.png | Bin 41498 -> 41510 bytes .../components/assets/filter-ui-example-2.png | Bin 16773 -> 24606 bytes ui/src/components/style/TrafficPage.sass | 2 +- ui/src/index.sass | 5 - ui/src/variables.module.scss | 2 +- 19 files changed, 343 insertions(+), 166 deletions(-) create mode 100644 ui/src/components/UI/Queryable.tsx create mode 100644 ui/src/components/UI/style/Queryable.sass diff --git a/ui/src/components/EntryDetailed.tsx b/ui/src/components/EntryDetailed.tsx index f8854a293..9a331a6ba 100644 --- a/ui/src/components/EntryDetailed.tsx +++ b/ui/src/components/EntryDetailed.tsx @@ -3,6 +3,7 @@ import EntryViewer from "./EntryDetailed/EntryViewer"; import {EntryItem} from "./EntryListItem/EntryListItem"; import {makeStyles} from "@material-ui/core"; import Protocol from "./UI/Protocol" +import Queryable from "./UI/Queryable"; const useStyles = makeStyles(() => ({ entryTitle: { @@ -37,28 +38,33 @@ const EntryTitle: React.FC = ({protocol, data, bodySize, elapsedTime, updat const classes = useStyles(); const response = data.response; - return
    - +
    - {response &&
    { - updateQuery(`response.bodySize == ${bodySize}`) - }} + {response && - {formatSize(bodySize)} -
    } - {response &&
    { - updateQuery(`elapsedTime >= ${elapsedTime}`) - }} +
    + {formatSize(bodySize)} +
    + } + {response && = ${elapsedTime}`} + updateQuery={updateQuery} + style={{marginRight: 18}} + displayIconOnMouseOver={true} > - {Math.round(elapsedTime)}ms -
    } +
    + {Math.round(elapsedTime)}ms +
    + }
    ; }; diff --git a/ui/src/components/EntryDetailed/EntrySections.module.sass b/ui/src/components/EntryDetailed/EntrySections.module.sass index a7ec762ca..b1b8471f6 100644 --- a/ui/src/components/EntryDetailed/EntrySections.module.sass +++ b/ui/src/components/EntryDetailed/EntrySections.module.sass @@ -27,7 +27,7 @@ font-weight: 600 font-size: .75rem line-height: 1.2 - margin: .3rem 0 + margin-bottom: -2px .dataKey color: $blue-gray diff --git a/ui/src/components/EntryDetailed/EntrySections.tsx b/ui/src/components/EntryDetailed/EntrySections.tsx index 88db7b310..1d183d279 100644 --- a/ui/src/components/EntryDetailed/EntrySections.tsx +++ b/ui/src/components/EntryDetailed/EntrySections.tsx @@ -3,6 +3,7 @@ import React, {useState} from "react"; import {SyntaxHighlighter} from "../UI/SyntaxHighlighter/index"; import CollapsibleContainer from "../UI/CollapsibleContainer"; import FancyTextDisplay from "../UI/FancyTextDisplay"; +import Queryable from "../UI/Queryable"; import Checkbox from "../UI/Checkbox"; import ProtobufDecoder from "protobuf-decoder"; @@ -15,23 +16,29 @@ interface EntryViewLineProps { } const EntryViewLine: React.FC = ({label, value, updateQuery, selector, overrideQueryValue}) => { + let query: string; + if (!selector) { + query = ""; + } else if (overrideQueryValue) { + query = `${selector} == ${overrideQueryValue}`; + } else if (typeof(value) == "string") { + query = `${selector} == "${JSON.stringify(value).slice(1, -1)}"`; + } else { + query = `${selector} == ${value}`; + } return (label && - { - if (!selector) { - return - } else if (overrideQueryValue) { - updateQuery(`${selector} == ${overrideQueryValue}`) - } else if (typeof(value) === "string") { - updateQuery(`${selector} == "${JSON.stringify(value).slice(1, -1)}"`) - } else { - updateQuery(`${selector} == ${value}`) - } - }} - > - {label} - + + + {label} + + = ({title, color, isExpanded}) => { return
    - +
    {isExpanded ? '-' : '+'} - +
    {title}
    } diff --git a/ui/src/components/EntryListItem/EntryListItem.module.sass b/ui/src/components/EntryListItem/EntryListItem.module.sass index 5cf3ed227..296404727 100644 --- a/ui/src/components/EntryListItem/EntryListItem.module.sass +++ b/ui/src/components/EntryListItem/EntryListItem.module.sass @@ -19,7 +19,6 @@ .rowSelected border: 1px $blue-color solid - margin-right: 3px .ruleSuccessRow background: #E8FFF1 @@ -52,7 +51,6 @@ white-space: nowrap color: $secondary-font-color padding-left: 4px - padding-top: 3px padding-right: 10px display: flex font-size: 12px @@ -70,8 +68,9 @@ flex-direction: column overflow: hidden padding-right: 10px - padding-left: 10px flex-grow: 1 + padding-top: 5px + margin-left: -6px .separatorRight display: flex diff --git a/ui/src/components/EntryListItem/EntryListItem.tsx b/ui/src/components/EntryListItem/EntryListItem.tsx index 4461b4f70..b18e2e2f9 100644 --- a/ui/src/components/EntryListItem/EntryListItem.tsx +++ b/ui/src/components/EntryListItem/EntryListItem.tsx @@ -3,6 +3,7 @@ import styles from './EntryListItem.module.sass'; import StatusCode, {getClassification, StatusCodeClassification} from "../UI/StatusCode"; import Protocol, {ProtocolInterface} from "../UI/Protocol" import {Summary} from "../UI/Summary"; +import Queryable from "../UI/Queryable"; import ingoingIconSuccess from "../assets/ingoing-traffic-success.svg" import ingoingIconFailure from "../assets/ingoing-traffic-failure.svg" import ingoingIconNeutral from "../assets/ingoing-traffic-neutral.svg" @@ -131,7 +132,7 @@ export const EntryItem: React.FC = ({entry, focusedEntryId, setFocus border: isSelected ? `1px ${entry.protocol.backgroundColor} solid` : "1px transparent solid", position: !headingMode ? "absolute" : "unset", top: style['top'], - marginTop: style['marginTop'], + marginTop: !headingMode ? style['marginTop'] : "10px", width: !headingMode ? "calc(100% - 25px)" : "calc(100% - 18px)", }} > @@ -146,15 +147,18 @@ export const EntryItem: React.FC = ({entry, focusedEntryId, setFocus
    - { - updateQuery(`service == "${entry.service}"`) - }} + - {entry.service} - + + {entry.service} + +
    { @@ -172,74 +176,109 @@ export const EntryItem: React.FC = ({entry, focusedEntryId, setFocus : "" }
    - { - updateQuery(`src.ip == "${entry.sourceIp}"`) - }} + - {entry.sourceIp} - - : - { - updateQuery(`src.port == "${entry.sourcePort}"`) - }} + + {entry.sourceIp} + + + : + - {entry.sourcePort} - + + {entry.sourcePort} + + {entry.isOutgoing ? - Ingoing traffic { - updateQuery(`outgoing == true`) - }} - /> + + Ingoing traffic + : - Outgoing traffic { - updateQuery(`outgoing == false`) - }} - /> + + Outgoing traffic { + updateQuery(`outgoing == false`) + }} + /> + } - { - updateQuery(`dst.ip == "${entry.destinationIp}"`) - }} + - {entry.destinationIp} - - : - { - updateQuery(`dst.port == "${entry.destinationPort}"`) - }} + + {entry.destinationIp} + + + : + - {entry.destinationPort} - + + {entry.destinationPort} + +
    - { - updateQuery(`timestamp >= datetime("${new Date(+entry.timestamp)?.toLocaleString("en-US", {timeZone: 'UTC' })}")`) - }} + = datetime("${new Date(+entry.timestamp)?.toLocaleString("en-US", {timeZone: 'UTC' })}")`} + updateQuery={updateQuery} + displayIconOnMouseOver={true} + flipped={false} > - {new Date(+entry.timestamp)?.toLocaleString("en-US")} - + + {new Date(+entry.timestamp)?.toLocaleString("en-US")} + +
    diff --git a/ui/src/components/Filters.tsx b/ui/src/components/Filters.tsx index 87463085a..9168b3472 100644 --- a/ui/src/components/Filters.tsx +++ b/ui/src/components/Filters.tsx @@ -226,7 +226,7 @@ export const QueryForm: React.FC = ({query, setQuery, background language="python" /> - By clicking the UI elements in both left-pane and right-pane, you can automatically select a field and update the query: + By clicking the plus icon that appears beside the queryable UI elements on hovering in both left-pane and right-pane, you can automatically select a field and update the query: = ({query, setQuery, background title="Clicking to UI elements (left-pane)" /> - Such that; clicking this in left-pane, would append the query below: + Such that; clicking this icon in left-pane, would append the query below: diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index 13175f236..0887ef0e0 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -21,7 +21,7 @@ const useLayoutStyles = makeStyles(() => ({ padding: "12px 24px", borderRadius: 4, marginTop: 15, - background: variables.headerBackgoundColor, + background: variables.headerBackgroundColor, }, viewer: { diff --git a/ui/src/components/UI/Protocol.tsx b/ui/src/components/UI/Protocol.tsx index 0befffce0..5369847fb 100644 --- a/ui/src/components/UI/Protocol.tsx +++ b/ui/src/components/UI/Protocol.tsx @@ -1,5 +1,6 @@ import React from "react"; import styles from './style/Protocol.module.sass'; +import Queryable from "./Queryable"; export interface ProtocolInterface { name: string @@ -22,34 +23,45 @@ interface ProtocolProps { const Protocol: React.FC = ({protocol, horizontal, updateQuery}) => { if (horizontal) { - return
    + return + + + {protocol.longName} + + + + } else { + return - {protocol.longName} + {protocol.abbr} - - } else { - return { - updateQuery(protocol.macro) - }} - > - {protocol.abbr} - + } }; diff --git a/ui/src/components/UI/Queryable.tsx b/ui/src/components/UI/Queryable.tsx new file mode 100644 index 000000000..e08d36cd9 --- /dev/null +++ b/ui/src/components/UI/Queryable.tsx @@ -0,0 +1,62 @@ +import React, { useEffect, useState } from 'react'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; +import AddCircleIcon from '@material-ui/icons/AddCircle'; +import './style/Queryable.sass'; + +interface Props { + query: string, + updateQuery: any, + style?: object, + iconStyle?: object, + className?: string, + useTooltip?: boolean, + displayIconOnMouseOver?: boolean, + flipped?: boolean, +} + +const Queryable: React.FC = ({query, updateQuery, style, iconStyle, className, useTooltip= true, displayIconOnMouseOver = false, flipped = false, children}) => { + const [showAddedNotification, setAdded] = useState(false); + const [showTooltip, setShowTooltip] = useState(false); + + const onCopy = () => { + setAdded(true) + }; + + useEffect(() => { + let timer; + if (showAddedNotification) { + updateQuery(query); + timer = setTimeout(() => { + setAdded(false); + }, 1000); + } + return () => clearTimeout(timer); + }, [showAddedNotification, query, updateQuery]); + + const addButton = query ? + + + {showAddedNotification && Added} + + : null; + + return ( +
    setShowTooltip(true)} + onMouseLeave={ e => setShowTooltip(false)} + > + {flipped && addButton} + {children} + {!flipped && addButton} + {useTooltip && showTooltip && {query}} +
    + ); +}; + +export default Queryable; diff --git a/ui/src/components/UI/StatusCode.tsx b/ui/src/components/UI/StatusCode.tsx index b743aec02..d9180680a 100644 --- a/ui/src/components/UI/StatusCode.tsx +++ b/ui/src/components/UI/StatusCode.tsx @@ -1,5 +1,6 @@ import React from "react"; import styles from './style/StatusCode.module.sass'; +import Queryable from "./Queryable"; export enum StatusCodeClassification { SUCCESS = "success", @@ -16,15 +17,19 @@ const StatusCode: React.FC = ({statusCode, updateQuery}) => { const classification = getClassification(statusCode) - return { - updateQuery(`response.status == ${statusCode}`) - }} + return - {statusCode} - + + {statusCode} + + }; export function getClassification(statusCode: number): string { diff --git a/ui/src/components/UI/Summary.tsx b/ui/src/components/UI/Summary.tsx index 3c05a89a8..7303e11e5 100644 --- a/ui/src/components/UI/Summary.tsx +++ b/ui/src/components/UI/Summary.tsx @@ -1,6 +1,7 @@ import miscStyles from "./style/misc.module.sass"; import React from "react"; import styles from './style/Summary.module.sass'; +import Queryable from "./Queryable"; interface SummaryProps { method: string @@ -9,24 +10,28 @@ interface SummaryProps { } export const Summary: React.FC = ({method, summary, updateQuery}) => { + return
    - {method && { - updateQuery(`method == "${method}"`) - }} + {method && - {method} - } - {summary &&
    { - updateQuery(`summary == "${summary}"`) - }} + + {method} + + } + {summary && - {summary} -
    } +
    + {summary} +
    + }
    }; diff --git a/ui/src/components/UI/style/Queryable.sass b/ui/src/components/UI/style/Queryable.sass new file mode 100644 index 000000000..f045f2183 --- /dev/null +++ b/ui/src/components/UI/style/Queryable.sass @@ -0,0 +1,48 @@ +.Queryable-Container + display: flex + align-items: center + + &.displayIconOnMouseOver + .Queryable-Icon + opacity: 0 + width: 0px + pointer-events: none + &:hover + .Queryable-Icon + opacity: 1 + pointer-events: all + + + .Queryable-Icon + height: 22px + width: 22px + cursor: pointer + color: #27AE60 + + &:hover + background-color: rgba(255, 255, 255, 0.06) + border-radius: 4px + color: #1E884B + + .Queryable-AddNotifier + background-color: #1E884B + font-weight: normal + padding: 2px 5px + border-radius: 4px + position: absolute + transform: translate(0, 10%) + color: white + z-index: 1000 + font-size: 11px + + .Queryable-Tooltip + background-color: #1E884B + font-weight: normal + padding: 2px 5px + border-radius: 4px + position: absolute + transform: translate(0, -80%) + color: white + z-index: 1000 + font-size: 11px + diff --git a/ui/src/components/UI/style/Summary.module.sass b/ui/src/components/UI/style/Summary.module.sass index 59bc34893..2bce9af67 100644 --- a/ui/src/components/UI/style/Summary.module.sass +++ b/ui/src/components/UI/style/Summary.module.sass @@ -3,6 +3,4 @@ align-items: center .summary - text-overflow: ellipsis - overflow: hidden white-space: nowrap diff --git a/ui/src/components/UI/style/misc.module.sass b/ui/src/components/UI/style/misc.module.sass index 8c3a1cbac..bef317cd3 100644 --- a/ui/src/components/UI/style/misc.module.sass +++ b/ui/src/components/UI/style/misc.module.sass @@ -11,13 +11,14 @@ &.method margin-right: 10px + height: 12px &.filterPlate border-color: #bcc6dd20 color: #a0b2ff font-size: 10px -.noSelect +.noSelect -webkit-touch-callout: none -webkit-user-select: none -khtml-user-select: none diff --git a/ui/src/components/assets/filter-ui-example-1.png b/ui/src/components/assets/filter-ui-example-1.png index 244c1b5113a305b006d82882448c7c8962ba4de6..f8f76b85ae9ffe86f611a5f4bb9d8fd1499f32c0 100644 GIT binary patch literal 41510 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 B#y0=} literal 41498 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

    ~Q*A6uQ&B;i6oP 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 L6Dj$k>-&EI3#xgX diff --git a/ui/src/components/style/TrafficPage.sass b/ui/src/components/style/TrafficPage.sass index 3a3c558f5..68d4c3d08 100644 --- a/ui/src/components/style/TrafficPage.sass +++ b/ui/src/components/style/TrafficPage.sass @@ -114,4 +114,4 @@ .playPauseIcon cursor: pointer margin-right: 15px - height: 30px \ No newline at end of file + height: 30px diff --git a/ui/src/index.sass b/ui/src/index.sass index b8f707d22..2cb79f24b 100644 --- a/ui/src/index.sass +++ b/ui/src/index.sass @@ -22,11 +22,6 @@ code .uppercase text-transform: uppercase -.queryable - cursor: pointer - &:hover - text-decoration: underline - /**** * Button ***/ diff --git a/ui/src/variables.module.scss b/ui/src/variables.module.scss index d2f3d89bd..9e25bb3c3 100644 --- a/ui/src/variables.module.scss +++ b/ui/src/variables.module.scss @@ -11,7 +11,7 @@ $blue-gray: #494677; :export { mainBackgroundColor: $main-background-color; - headerBackgoundColor: $header-background-color; + headerBackgroundColor: $header-background-color; fontColor: $font-color; secondaryFontColor: $secondary-font-color; blueColor: $blue-color; From c47959dbd84ec0457afb4e647c7bc59daae15371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Wed, 1 Dec 2021 11:55:13 +0300 Subject: [PATCH 65/93] Bring back `GetEntries` HTTP endpoint (#515) * Bring back `GetEntries` HTTP endpoint * Upgrade Basenine version from `0.2.12` to `0.2.13` * Accept negative `leftOff` value * Remove `max`es from the validations * Make `timeoutMs` optional * Update the route comment * Add `EntriesResponse` struct --- Dockerfile | 4 +- agent/go.mod | 2 +- agent/go.sum | 4 +- agent/pkg/controllers/entries_controller.go | 58 +++++++++++++++++++++ agent/pkg/models/models.go | 13 +++++ agent/pkg/routes/entries_routes.go | 1 + debug.Dockerfile | 4 +- 7 files changed, 79 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 304684627..ce4b8449c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,8 +42,8 @@ RUN go build -ldflags="-s -w \ -X 'mizuserver/pkg/version.SemVer=${SEM_VER}'" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.12/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.12/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.13/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.13/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/agent/go.mod b/agent/go.mod index 06108bf9b..b0c7c1e5c 100644 --- a/agent/go.mod +++ b/agent/go.mod @@ -16,7 +16,7 @@ require ( github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/orcaman/concurrent-map v0.0.0-20210106121528-16402b402231 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/up9inc/basenine/client/go v0.0.0-20211125004153-d0e8aec03fea + github.com/up9inc/basenine/client/go v0.0.0-20211130202146-cf837626a065 github.com/up9inc/mizu/shared v0.0.0 github.com/up9inc/mizu/tap v0.0.0 github.com/up9inc/mizu/tap/api v0.0.0 diff --git a/agent/go.sum b/agent/go.sum index 30e473925..54425e23c 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -450,8 +450,8 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/up9inc/basenine/client/go v0.0.0-20211125004153-d0e8aec03fea h1:GpJGO2PNTS/S0j2E1yqBi3ST/VXfokzuOrTQyaYgWnA= -github.com/up9inc/basenine/client/go v0.0.0-20211125004153-d0e8aec03fea/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= +github.com/up9inc/basenine/client/go v0.0.0-20211130202146-cf837626a065 h1:kfciLExAWkJMeMoKtnO5G5czqNv5/d0zjupG2nAeBmo= +github.com/up9inc/basenine/client/go v0.0.0-20211130202146-cf837626a065/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= diff --git a/agent/pkg/controllers/entries_controller.go b/agent/pkg/controllers/entries_controller.go index 0834977ab..2d5e2e536 100644 --- a/agent/pkg/controllers/entries_controller.go +++ b/agent/pkg/controllers/entries_controller.go @@ -4,8 +4,10 @@ import ( "encoding/json" "mizuserver/pkg/models" "mizuserver/pkg/utils" + "mizuserver/pkg/validation" "net/http" "strconv" + "time" "github.com/gin-gonic/gin" @@ -36,6 +38,62 @@ func Error(c *gin.Context, err error) bool { return false // no error, can continue } +func GetEntries(c *gin.Context) { + entriesRequest := &models.EntriesRequest{} + + if err := c.BindQuery(entriesRequest); err != nil { + c.JSON(http.StatusBadRequest, err) + } + validationError := validation.Validate(entriesRequest) + if validationError != nil { + c.JSON(http.StatusBadRequest, validationError) + } + + if entriesRequest.TimeoutMs == 0 { + entriesRequest.TimeoutMs = 3000 + } + + data, meta, err := basenine.Fetch(shared.BasenineHost, shared.BaseninePort, + entriesRequest.LeftOff, entriesRequest.Direction, entriesRequest.Query, + entriesRequest.Limit, time.Duration(entriesRequest.TimeoutMs)*time.Millisecond) + if err != nil { + c.JSON(http.StatusInternalServerError, validationError) + } + + response := &models.EntriesResponse{} + var dataSlice []interface{} + + for _, row := range data { + var dataMap map[string]interface{} + err = json.Unmarshal(row, &dataMap) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "error": true, + "type": "error", + "autoClose": "5000", + "msg": string(row), + }) + return // exit + } + + base := dataMap["base"].(map[string]interface{}) + base["id"] = uint(dataMap["id"].(float64)) + + dataSlice = append(dataSlice, base) + } + + var metadata *basenine.Metadata + err = json.Unmarshal(meta, &metadata) + if err != nil { + logger.Log.Debugf("Error recieving metadata: %v", err.Error()) + } + + response.Data = dataSlice + response.Meta = metadata + + c.JSON(http.StatusOK, response) +} + func GetEntry(c *gin.Context) { id, _ := strconv.Atoi(c.Param("id")) var entry tapApi.MizuEntry diff --git a/agent/pkg/models/models.go b/agent/pkg/models/models.go index 17113180e..9094ae5b1 100644 --- a/agent/pkg/models/models.go +++ b/agent/pkg/models/models.go @@ -16,6 +16,19 @@ func GetEntry(r *tapApi.MizuEntry, v tapApi.DataUnmarshaler) error { return v.UnmarshalData(r) } +type EntriesRequest struct { + LeftOff int `form:"leftOff" validate:"required,min=-1"` + Direction int `form:"direction" validate:"required,oneof='1' '-1'"` + Query string `form:"query"` + Limit int `form:"limit" validate:"required,min=1"` + TimeoutMs int `form:"timeoutMs" validate:"min=1"` +} + +type EntriesResponse struct { + Data []interface{} `json:"data"` + Meta *basenine.Metadata `json:"meta"` +} + type WebSocketEntryMessage struct { *shared.WebSocketMessageMetadata Data map[string]interface{} `json:"data,omitempty"` diff --git a/agent/pkg/routes/entries_routes.go b/agent/pkg/routes/entries_routes.go index 12a597461..d931196a9 100644 --- a/agent/pkg/routes/entries_routes.go +++ b/agent/pkg/routes/entries_routes.go @@ -10,5 +10,6 @@ import ( func EntriesRoutes(ginApp *gin.Engine) { routeGroup := ginApp.Group("/entries") + routeGroup.GET("/", controllers.GetEntries) // get entries (base/thin entries) and metadata routeGroup.GET("/:id", controllers.GetEntry) // get single (full) entry } diff --git a/debug.Dockerfile b/debug.Dockerfile index b6af5df92..9673a4048 100644 --- a/debug.Dockerfile +++ b/debug.Dockerfile @@ -37,8 +37,8 @@ COPY agent . RUN go build -gcflags="all=-N -l" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.12/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.12/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.13/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.13/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 From 291061111144d332edab5bae2883549999a830e5 Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Thu, 2 Dec 2021 09:20:27 +0200 Subject: [PATCH 66/93] Disable telemetry by env var MIZU_DISABLE_TELEMTRY (#517) --- cli/telemetry/telemetry.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cli/telemetry/telemetry.go b/cli/telemetry/telemetry.go index 1bd10acfd..e032b4ef7 100644 --- a/cli/telemetry/telemetry.go +++ b/cli/telemetry/telemetry.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "net/http" + "os" "github.com/denisbrodbeck/machineid" "github.com/up9inc/mizu/cli/apiserver" @@ -62,6 +63,9 @@ func ReportAPICalls(apiProvider *apiserver.Provider) { } func shouldRunTelemetry() bool { + if _, present := os.LookupEnv("MIZU_DISABLE_TELEMTRY"); present { + return false + } if !config.Config.Telemetry { return false } From 296e1bb6679b7d692de24176bd391c0993ee6344 Mon Sep 17 00:00:00 2001 From: David Levanon Date: Thu, 2 Dec 2021 11:41:13 +0200 Subject: [PATCH 67/93] Replace `privileged` with specific CAPABILITIES requests (#514) --- shared/kubernetes/provider.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/shared/kubernetes/provider.go b/shared/kubernetes/provider.go index 0f0feabdb..523b9c503 100644 --- a/shared/kubernetes/provider.go +++ b/shared/kubernetes/provider.go @@ -651,7 +651,17 @@ func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespac agentContainer.WithName(tapperPodName) agentContainer.WithImage(podImage) agentContainer.WithImagePullPolicy(imagePullPolicy) - agentContainer.WithSecurityContext(applyconfcore.SecurityContext().WithPrivileged(true)) + + caps := applyconfcore.Capabilities().WithDrop("ALL").WithAdd("NET_RAW").WithAdd("NET_ADMIN") + + if istio { + caps = caps.WithAdd("SYS_ADMIN") // for reading /proc/PID/net/ns + caps = caps.WithAdd("SYS_PTRACE") // for setting netns to other process + caps = caps.WithAdd("DAC_OVERRIDE") // for reading /proc/PID/environ + } + + agentContainer.WithSecurityContext(applyconfcore.SecurityContext().WithCapabilities(caps)) + agentContainer.WithCommand(mizuCmd...) agentContainer.WithEnv( applyconfcore.EnvVar().WithName(shared.LogLevelEnvVar).WithValue(logLevel.String()), From 880842c39fe9b6aadcd26fe659579f921f66eb7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Sat, 4 Dec 2021 20:25:22 +0300 Subject: [PATCH 68/93] Fix the styling of `Queryable` under `StatusCode` and `Summary` components (#519) --- ui/src/components/EntryListItem/EntryListItem.module.sass | 3 +-- ui/src/components/UI/StatusCode.tsx | 3 ++- ui/src/components/UI/Summary.tsx | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ui/src/components/EntryListItem/EntryListItem.module.sass b/ui/src/components/EntryListItem/EntryListItem.module.sass index 296404727..e323137f0 100644 --- a/ui/src/components/EntryListItem/EntryListItem.module.sass +++ b/ui/src/components/EntryListItem/EntryListItem.module.sass @@ -68,9 +68,8 @@ flex-direction: column overflow: hidden padding-right: 10px + padding-left: 10px flex-grow: 1 - padding-top: 5px - margin-left: -6px .separatorRight display: flex diff --git a/ui/src/components/UI/StatusCode.tsx b/ui/src/components/UI/StatusCode.tsx index d9180680a..84dfba351 100644 --- a/ui/src/components/UI/StatusCode.tsx +++ b/ui/src/components/UI/StatusCode.tsx @@ -20,8 +20,9 @@ const StatusCode: React.FC = ({statusCode, updateQuery}) => { return = ({method, summary, updateQuery}) className={`${miscStyles.protocol} ${miscStyles.method}`} updateQuery={updateQuery} displayIconOnMouseOver={true} + style={{whiteSpace: "nowrap"}} > {method} From 9aaf18842b31ea1e5ac5978c06fab1767f9e49e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Tue, 7 Dec 2021 14:15:49 +0300 Subject: [PATCH 69/93] Fix the CSS issue in `Queryable` inside `EntryViewLine` (#521) --- ui/src/components/EntryDetailed/EntrySections.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/components/EntryDetailed/EntrySections.tsx b/ui/src/components/EntryDetailed/EntrySections.tsx index 1d183d279..7201b5206 100644 --- a/ui/src/components/EntryDetailed/EntrySections.tsx +++ b/ui/src/components/EntryDetailed/EntrySections.tsx @@ -31,7 +31,7 @@ const EntryViewLine: React.FC = ({label, value, updateQuery, Date: Wed, 8 Dec 2021 15:19:35 +0300 Subject: [PATCH 70/93] TRA-4017 Bring back `getOldEntries` method using fetch API and always start streaming from now (#518) * Bring back `getOldEntries` method using fetch API * Determine no more data on top based on `leftOff` value * Remove `entriesBuffer` state * Always open WebSocket with some `leftOff` value * Rename `leftOff` state to `leftOffBottom` * Don't set the `focusedEntryId` through WebSocket if the WebSocket is closed * Call `setQueriedCurrent` with addition * Close WebSocket upon reaching to top * Open WebSocket upon snapping to bottom * Close the WebSocket on snap broken event instead * Set queried current value to zero upon filter submit * Upgrade `react-scrollable-feed-virtualized` version and use `scrollToIndex` function * Change the footer text format * Improve no more data top logic * Fix `closeWebSocket()` call logic in `onSnapBrokenEvent` and handle `data.meta` being `null` in `getOldEntries` * Fix the issues around fetching old records * Clean up `EntriesList.module.sass` * Decrement initial `leftOffTop` value by `2` * Fix the order of `incomingEntries` in `getOldEntries` * Request `leftOffTop - 1` from `fetchEntries` * Limit the front-end total entries fetched through WebSocket count to `10000` * Lose the UI performance gain that's provided by #452 * Revert "Fix the selected entry behavior by propagating the `focusedEntryId` through WebSocket (before #452) TRA-3983 (#513)" This reverts commit 873f252544d0f7e3829070570b0f09e5be5b3c4d. * Fix the issues caused by 09371f141f89f6528a557dbf82a597af491bb4a6 * Upgrade Basenine version from `0.2.13` to `0.2.14` * Upgrade Basenine version from `0.2.14` to `0.2.15` * Fix the condition of "Fetch old records" button visibility * Upgrade Basenine version from `0.2.15` to `0.2.16` and fix the UI code related to fetching old records * Make `newEntries` constant --- Dockerfile | 4 +- agent/go.mod | 2 +- agent/go.sum | 4 +- agent/pkg/api/socket_routes.go | 127 ++++++++---------- agent/pkg/models/models.go | 15 --- debug.Dockerfile | 4 +- shared/models.go | 6 +- ui/package-lock.json | 6 +- ui/package.json | 2 +- ui/src/components/EntriesList.tsx | 111 ++++++++++++++- ui/src/components/EntryDetailed.tsx | 2 +- .../EntryListItem/EntryListItem.tsx | 2 +- ui/src/components/Filters.tsx | 10 +- ui/src/components/TrafficPage.tsx | 110 +++++++-------- .../components/style/EntriesList.module.sass | 25 ++++ ui/src/helpers/api.js | 8 ++ 16 files changed, 274 insertions(+), 164 deletions(-) diff --git a/Dockerfile b/Dockerfile index ce4b8449c..dffc183fc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,8 +42,8 @@ RUN go build -ldflags="-s -w \ -X 'mizuserver/pkg/version.SemVer=${SEM_VER}'" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.13/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.13/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.16/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.16/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/agent/go.mod b/agent/go.mod index b0c7c1e5c..822531ba8 100644 --- a/agent/go.mod +++ b/agent/go.mod @@ -16,7 +16,7 @@ require ( github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/orcaman/concurrent-map v0.0.0-20210106121528-16402b402231 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/up9inc/basenine/client/go v0.0.0-20211130202146-cf837626a065 + github.com/up9inc/basenine/client/go v0.0.0-20211207165834-2ced7577f9e6 github.com/up9inc/mizu/shared v0.0.0 github.com/up9inc/mizu/tap v0.0.0 github.com/up9inc/mizu/tap/api v0.0.0 diff --git a/agent/go.sum b/agent/go.sum index 54425e23c..9627935ed 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -450,8 +450,8 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/up9inc/basenine/client/go v0.0.0-20211130202146-cf837626a065 h1:kfciLExAWkJMeMoKtnO5G5czqNv5/d0zjupG2nAeBmo= -github.com/up9inc/basenine/client/go v0.0.0-20211130202146-cf837626a065/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= +github.com/up9inc/basenine/client/go v0.0.0-20211207165834-2ced7577f9e6 h1:8JOkoaZHhUPi4r7vSL/xo83foSz8BHPSabTDpxmtHFU= +github.com/up9inc/basenine/client/go v0.0.0-20211207165834-2ced7577f9e6/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= diff --git a/agent/pkg/api/socket_routes.go b/agent/pkg/api/socket_routes.go index b82c7c338..8feccebac 100644 --- a/agent/pkg/api/socket_routes.go +++ b/agent/pkg/api/socket_routes.go @@ -6,7 +6,6 @@ import ( "fmt" "mizuserver/pkg/models" "net/http" - "strconv" "sync" "time" @@ -95,8 +94,6 @@ func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers Even startTimeBytes, _ := models.CreateWebsocketStartTimeMessage(startTime) SendToSocket(socketId, startTimeBytes) - queryRecieved := false - for { _, msg, err := ws.ReadMessage() if err != nil { @@ -104,75 +101,65 @@ func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers Even break } - if !queryRecieved { - if !isTapper && !isQuerySet { - queryRecieved = true - query := string(msg) - err = basenine.Validate(shared.BasenineHost, shared.BaseninePort, query) - if err != nil { - toastBytes, _ := models.CreateWebsocketToastMessage(&models.ToastMessage{ - Type: "error", - AutoClose: 5000, - Text: fmt.Sprintf("Syntax error: %s", err.Error()), - }) - SendToSocket(socketId, toastBytes) - break - } - - isQuerySet = true - - handleDataChannel := func(c *basenine.Connection, data chan []byte) { - for { - bytes := <-data - - if string(bytes) == basenine.CloseChannel { - return - } - - var dataMap map[string]interface{} - err = json.Unmarshal(bytes, &dataMap) - - base := dataMap["base"].(map[string]interface{}) - base["id"] = uint(dataMap["id"].(float64)) - - baseEntryBytes, _ := models.CreateBaseEntryWebSocketMessage(base) - SendToSocket(socketId, baseEntryBytes) - } - } - - handleMetaChannel := func(c *basenine.Connection, meta chan []byte) { - for { - bytes := <-meta - - if string(bytes) == basenine.CloseChannel { - return - } - - var metadata *basenine.Metadata - err = json.Unmarshal(bytes, &metadata) - if err != nil { - logger.Log.Debugf("Error recieving metadata: %v", err.Error()) - } - - metadataBytes, _ := models.CreateWebsocketQueryMetadataMessage(metadata) - SendToSocket(socketId, metadataBytes) - } - } - - go handleDataChannel(connection, data) - go handleMetaChannel(connection, meta) - - connection.Query(query, data, meta) - } else { - eventHandlers.WebSocketMessage(socketId, msg) - } - } else { - id, err := strconv.Atoi(string(msg)) + if !isTapper && !isQuerySet { + query := string(msg) + err = basenine.Validate(shared.BasenineHost, shared.BaseninePort, query) if err != nil { - continue + toastBytes, _ := models.CreateWebsocketToastMessage(&models.ToastMessage{ + Type: "error", + AutoClose: 5000, + Text: fmt.Sprintf("Syntax error: %s", err.Error()), + }) + SendToSocket(socketId, toastBytes) + break } - focusEntryBytes, _ := models.CreateWebsocketFocusEntry(id) - SendToSocket(socketId, focusEntryBytes) + + isQuerySet = true + + handleDataChannel := func(c *basenine.Connection, data chan []byte) { + for { + bytes := <-data + + if string(bytes) == basenine.CloseChannel { + return + } + + var dataMap map[string]interface{} + err = json.Unmarshal(bytes, &dataMap) + + base := dataMap["base"].(map[string]interface{}) + base["id"] = uint(dataMap["id"].(float64)) + + baseEntryBytes, _ := models.CreateBaseEntryWebSocketMessage(base) + SendToSocket(socketId, baseEntryBytes) + } + } + + handleMetaChannel := func(c *basenine.Connection, meta chan []byte) { + for { + bytes := <-meta + + if string(bytes) == basenine.CloseChannel { + return + } + + var metadata *basenine.Metadata + err = json.Unmarshal(bytes, &metadata) + if err != nil { + logger.Log.Debugf("Error recieving metadata: %v", err.Error()) + } + + metadataBytes, _ := models.CreateWebsocketQueryMetadataMessage(metadata) + SendToSocket(socketId, metadataBytes) + } + } + + go handleDataChannel(connection, data) + go handleMetaChannel(connection, meta) + + connection.Query(query, data, meta) + } else { + eventHandlers.WebSocketMessage(socketId, msg) } } } diff --git a/agent/pkg/models/models.go b/agent/pkg/models/models.go index 9094ae5b1..84f8e9842 100644 --- a/agent/pkg/models/models.go +++ b/agent/pkg/models/models.go @@ -70,11 +70,6 @@ type WebSocketStartTimeMessage struct { Data int64 `json:"data"` } -type WebSocketFocusEntryMessage struct { - *shared.WebSocketMessageMetadata - Id int `json:"id"` -} - func CreateBaseEntryWebSocketMessage(base map[string]interface{}) ([]byte, error) { message := &WebSocketEntryMessage{ WebSocketMessageMetadata: &shared.WebSocketMessageMetadata{ @@ -135,16 +130,6 @@ func CreateWebsocketStartTimeMessage(base int64) ([]byte, error) { return json.Marshal(message) } -func CreateWebsocketFocusEntry(id int) ([]byte, error) { - message := &WebSocketFocusEntryMessage{ - WebSocketMessageMetadata: &shared.WebSocketMessageMetadata{ - MessageType: shared.WebSocketMessageFocusEntry, - }, - Id: id, - } - return json.Marshal(message) -} - // ExtendedHAR is the top level object of a HAR log. type ExtendedHAR struct { Log *ExtendedLog `json:"log"` diff --git a/debug.Dockerfile b/debug.Dockerfile index 9673a4048..db1827b5d 100644 --- a/debug.Dockerfile +++ b/debug.Dockerfile @@ -37,8 +37,8 @@ COPY agent . RUN go build -gcflags="all=-N -l" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.13/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.13/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.16/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.16/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/shared/models.go b/shared/models.go index 59ba6c085..1d3893274 100644 --- a/shared/models.go +++ b/shared/models.go @@ -1,12 +1,11 @@ package shared import ( - "io/ioutil" - "strings" - "github.com/op/go-logging" "github.com/up9inc/mizu/shared/logger" "github.com/up9inc/mizu/tap/api" + "io/ioutil" + "strings" "gopkg.in/yaml.v3" ) @@ -22,7 +21,6 @@ const ( WebSocketMessageTypeToast WebSocketMessageType = "toast" WebSocketMessageTypeQueryMetadata WebSocketMessageType = "queryMetadata" WebSocketMessageTypeStartTime WebSocketMessageType = "startTime" - WebSocketMessageFocusEntry WebSocketMessageType = "focusEntry" ) type Resources struct { diff --git a/ui/package-lock.json b/ui/package-lock.json index c0d6ddd5a..f653eadce 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -13644,9 +13644,9 @@ } }, "react-scrollable-feed-virtualized": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/react-scrollable-feed-virtualized/-/react-scrollable-feed-virtualized-1.4.8.tgz", - "integrity": "sha512-zsSO/9QB+4V6HEk39lxeMEUA6JFSZjfV4stw7RF17+vZdlVhyATsTBCzsj8hZywY4F29cBfH+3/GKrMhwmhAsw==" + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/react-scrollable-feed-virtualized/-/react-scrollable-feed-virtualized-1.4.9.tgz", + "integrity": "sha512-YkFkPjdIXDUsaCNYhZ+Blpp3LF+CsJWscwn/0fGSjF5QBKCtPURO9AEUA362Qnjr4S8LF2IjSAOCCFedIEnVNw==" }, "react-syntax-highlighter": { "version": "15.4.3", diff --git a/ui/package.json b/ui/package.json index 68dc98301..c042966e1 100644 --- a/ui/package.json +++ b/ui/package.json @@ -23,7 +23,7 @@ "react-copy-to-clipboard": "^5.0.3", "react-dom": "^17.0.2", "react-scripts": "4.0.3", - "react-scrollable-feed-virtualized": "^1.4.8", + "react-scrollable-feed-virtualized": "^1.4.9", "react-syntax-highlighter": "^15.4.3", "react-toastify": "^8.0.3", "typescript": "^4.2.4", diff --git a/ui/src/components/EntriesList.tsx b/ui/src/components/EntriesList.tsx index 081c1966f..e6bfab092 100644 --- a/ui/src/components/EntriesList.tsx +++ b/ui/src/components/EntriesList.tsx @@ -1,33 +1,132 @@ -import React, {useRef} from "react"; +import React, {useCallback, useEffect, useMemo, useRef, useState} from "react"; import styles from './style/EntriesList.module.sass'; import ScrollableFeedVirtualized from "react-scrollable-feed-virtualized"; +import {EntryItem} from "./EntryListItem/EntryListItem"; import down from "./assets/downImg.svg"; +import spinner from './assets/spinner.svg'; +import Api from "../helpers/api"; interface EntriesListProps { entries: any[]; + setEntries: any; + query: string; listEntryREF: any; onSnapBrokenEvent: () => void; isSnappedToBottom: boolean; setIsSnappedToBottom: any; queriedCurrent: number; + setQueriedCurrent: any; queriedTotal: number; startTime: number; + noMoreDataTop: boolean; + setNoMoreDataTop: (flag: boolean) => void; + focusedEntryId: string; + setFocusedEntryId: (id: string) => void; + updateQuery: any; + leftOffTop: number; + setLeftOffTop: (leftOffTop: number) => void; + reconnectWebSocket: any; + isWebSocketConnectionClosed: boolean; + closeWebSocket: any; } -export const EntriesList: React.FC = ({entries, listEntryREF, onSnapBrokenEvent, isSnappedToBottom, setIsSnappedToBottom, queriedCurrent, queriedTotal, startTime}) => { +const api = new Api(); +export const EntriesList: React.FC = ({entries, setEntries, query, listEntryREF, onSnapBrokenEvent, isSnappedToBottom, setIsSnappedToBottom, queriedCurrent, setQueriedCurrent, queriedTotal, startTime, noMoreDataTop, setNoMoreDataTop, focusedEntryId, setFocusedEntryId, updateQuery, leftOffTop, setLeftOffTop, reconnectWebSocket, isWebSocketConnectionClosed, closeWebSocket}) => { + const [loadMoreTop, setLoadMoreTop] = useState(false); + const [isLoadingTop, setIsLoadingTop] = useState(false); const scrollableRef = useRef(null); + useEffect(() => { + const list = document.getElementById('list').firstElementChild; + list.addEventListener('scroll', (e) => { + const el: any = e.target; + if(el.scrollTop === 0) { + setLoadMoreTop(true); + } else { + setNoMoreDataTop(false); + setLoadMoreTop(false); + } + }); + }, [setLoadMoreTop, setNoMoreDataTop]); + + const memoizedEntries = useMemo(() => { + return entries; + },[entries]); + + const getOldEntries = useCallback(async () => { + setLoadMoreTop(false); + if (leftOffTop === null || leftOffTop <= 0) { + return; + } + setIsLoadingTop(true); + const data = await api.fetchEntries(leftOffTop, -1, query, 100, 3000); + if (!data || !data.meta) { + setNoMoreDataTop(true); + setIsLoadingTop(false); + return; + } + setLeftOffTop(data.meta.leftOff); + + let scrollTo: boolean; + if (data.meta.leftOff === 0) { + setNoMoreDataTop(true); + scrollTo = false; + } else { + scrollTo = true; + } + setIsLoadingTop(false); + + const newEntries = [...data.data.reverse(), ...entries]; + setEntries(newEntries); + + setQueriedCurrent(queriedCurrent + data.meta.current); + + if (scrollTo) { + scrollableRef.current.scrollToIndex(data.data.length - 1); + } + },[setLoadMoreTop, setIsLoadingTop, entries, setEntries, query, setNoMoreDataTop, leftOffTop, setLeftOffTop, queriedCurrent, setQueriedCurrent]); + + useEffect(() => { + if(!isWebSocketConnectionClosed || !loadMoreTop || noMoreDataTop) return; + getOldEntries(); + }, [loadMoreTop, noMoreDataTop, getOldEntries, isWebSocketConnectionClosed]); + + const scrollbarVisible = scrollableRef.current?.childWrapperRef.current.clientHeight > scrollableRef.current?.wrapperRef.current.clientHeight; + return <>

    + {isLoadingTop &&
    + spinner +
    } + {noMoreDataTop &&
    No more data available
    } - {false /* TODO: why there is a need for something here (not necessarily false)? */} - {entries} + {false /* It's because the first child is ignored by ScrollableFeedVirtualized */} + {memoizedEntries.map(entry => )} +
    -
    Displaying {entries?.length} results (queried {queriedCurrent}/{queriedTotal})
    +
    Displaying {entries?.length} results out of {queriedTotal} total
    {startTime !== 0 &&
    Started listening at {new Date(startTime).toLocaleString()}
    }
    diff --git a/ui/src/components/EntryDetailed.tsx b/ui/src/components/EntryDetailed.tsx index 9a331a6ba..72f8ba5c7 100644 --- a/ui/src/components/EntryDetailed.tsx +++ b/ui/src/components/EntryDetailed.tsx @@ -73,7 +73,7 @@ const EntrySummary: React.FC = ({data, updateQuery}) => { const entry = data.base; return = ({entry, focusedEntryId, setFocus return <>
    { diff --git a/ui/src/components/Filters.tsx b/ui/src/components/Filters.tsx index 9168b3472..fba4a0565 100644 --- a/ui/src/components/Filters.tsx +++ b/ui/src/components/Filters.tsx @@ -13,7 +13,7 @@ interface FiltersProps { setQuery: any backgroundColor: string ws: any - openWebSocket: (query: string, resetEntriesBuffer: boolean) => void; + openWebSocket: (query: string, resetEntries: boolean) => void; } export const Filters: React.FC = ({query, setQuery, backgroundColor, ws, openWebSocket}) => { @@ -33,7 +33,7 @@ interface QueryFormProps { setQuery: any backgroundColor: string ws: any - openWebSocket: (query: string, resetEntriesBuffer: boolean) => void; + openWebSocket: (query: string, resetEntries: boolean) => void; } const style = { @@ -64,7 +64,11 @@ export const QueryForm: React.FC = ({query, setQuery, background const handleSubmit = (e) => { ws.close(); - openWebSocket(query, true); + if (query) { + openWebSocket(`(${query}) and leftOff(-1)`, true); + } else { + openWebSocket(`leftOff(-1)`, true); + } e.preventDefault(); } diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index 0887ef0e0..76fe8fd47 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -1,7 +1,6 @@ import React, {useEffect, useRef, useState} from "react"; import {Filters} from "./Filters"; import {EntriesList} from "./EntriesList"; -import {EntryItem} from "./EntryListItem/EntryListItem"; import {makeStyles} from "@material-ui/core"; import "./style/TrafficPage.sass"; import styles from './style/EntriesList.module.sass'; @@ -51,11 +50,12 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const classes = useLayoutStyles(); const [entries, setEntries] = useState([] as any); - const [entriesBuffer, setEntriesBuffer] = useState([] as any); const [focusedEntryId, setFocusedEntryId] = useState(null); const [selectedEntryData, setSelectedEntryData] = useState(null); const [connection, setConnection] = useState(ConnectionStatus.Closed); + const [noMoreDataTop, setNoMoreDataTop] = useState(false); + const [tappingStatus, setTappingStatus] = useState(null); const [isSnappedToBottom, setIsSnappedToBottom] = useState(true); @@ -66,7 +66,8 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const [queriedCurrent, setQueriedCurrent] = useState(0); const [queriedTotal, setQueriedTotal] = useState(0); - const [leftOff, setLeftOff] = useState(0); + const [leftOffBottom, setLeftOffBottom] = useState(0); + const [leftOffTop, setLeftOffTop] = useState(null); const [startTime, setStartTime] = useState(0); @@ -101,13 +102,13 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const listEntry = useRef(null); - const openWebSocket = (query: string, resetEntriesBuffer: boolean) => { - if (resetEntriesBuffer) { + const openWebSocket = (query: string, resetEntries: boolean) => { + if (resetEntries) { setFocusedEntryId(null); setEntries([]); - setEntriesBuffer([]); - } else { - setEntriesBuffer(entries); + setQueriedCurrent(0); + setLeftOffTop(null); + setNoMoreDataTop(false); } ws.current = new WebSocket(MizuWebsocketURL); ws.current.onopen = () => { @@ -120,9 +121,9 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS ws.current.onerror = (event) => { console.error("WebSocket error:", event); if (query) { - openWebSocket(`(${query}) and leftOff(${leftOff})`, false); + openWebSocket(`(${query}) and leftOff(${leftOffBottom})`, false); } else { - openWebSocket(`leftOff(${leftOff})`, false); + openWebSocket(`leftOff(${leftOffBottom})`, false); } } } @@ -134,23 +135,14 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS switch (message.messageType) { case "entry": const entry = message.data; - var focusThis = false; - if (!focusedEntryId) { - focusThis = true; - setFocusedEntryId(entry.id.toString()); + if (!focusedEntryId) setFocusedEntryId(entry.id.toString()) + const newEntries = [...entries, entry]; + if (newEntries.length === 10001) { + setLeftOffTop(newEntries[0].entry.id); + newEntries.shift(); + setNoMoreDataTop(false); } - setEntriesBuffer([ - ...entriesBuffer, - - ]); + setEntries(newEntries); break case "status": setTappingStatus(message.tappingStatus); @@ -174,24 +166,16 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS }); break; case "queryMetadata": - setQueriedCurrent(message.data.current); + setQueriedCurrent(queriedCurrent + message.data.current); setQueriedTotal(message.data.total); - setLeftOff(message.data.leftOff); - setEntries(entriesBuffer); + setLeftOffBottom(message.data.leftOff); + if (leftOffTop === null) { + setLeftOffTop(message.data.leftOff - 1); + } break; case "startTime": setStartTime(message.data); break; - case "focusEntry": - // To achieve selecting only one entry, render all elements in the buffer - // with the current `focusedEntryId` value. - entriesBuffer.forEach((entry: any, i: number) => { - entriesBuffer[i] = React.cloneElement(entry, { - focusedEntryId: focusedEntryId - }); - }) - setEntries(entriesBuffer); - break; default: console.error(`unsupported websocket message type, Got: ${message.messageType}`) } @@ -217,11 +201,6 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS useEffect(() => { if (!focusedEntryId) return; setSelectedEntryData(null); - - if (ws.current.readyState === WebSocket.OPEN) { - ws.current.send(focusedEntryId); - } - (async () => { try { const entryData = await api.getEntry(focusedEntryId); @@ -241,18 +220,27 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS } console.error(error); } - })() - }, [focusedEntryId]) + })(); + // eslint-disable-next-line + }, [focusedEntryId]); + + const closeWebSocket = () => { + ws.current.close(); + } + + const reconnectWebSocket = () => { + if (query) { + openWebSocket(`(${query}) and leftOff(${leftOffBottom})`, false); + } else { + openWebSocket(`leftOff(${leftOffBottom})`, false); + } + } const toggleConnection = () => { if (connection === ConnectionStatus.Connected) { - ws.current.close(); + closeWebSocket(); } else { - if (query) { - openWebSocket(`(${query}) and leftOff(${leftOff})`, false); - } else { - openWebSocket(`leftOff(${leftOff})`, false); - } + reconnectWebSocket(); } } @@ -276,7 +264,10 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS } const onSnapBrokenEvent = () => { - setIsSnappedToBottom(false) + setIsSnappedToBottom(false); + if (connection === ConnectionStatus.Connected) { + closeWebSocket(); + } } return ( @@ -305,13 +296,26 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS
    diff --git a/ui/src/components/style/EntriesList.module.sass b/ui/src/components/style/EntriesList.module.sass index 9d83ac5bb..5295dd656 100644 --- a/ui/src/components/style/EntriesList.module.sass +++ b/ui/src/components/style/EntriesList.module.sass @@ -38,6 +38,31 @@ border: 1px solid #627ef7 background-color: rgba(255, 255, 255, 0.06) +.spinnerContainer + display: flex + justify-content: center + margin-bottom: 10px + +.noMoreDataAvailable + text-align: center + font-weight: 600 + color: $secondary-font-color + +.btnOld + position: absolute + top: 20px + right: 10px + background: #205CF5 + border-radius: 50% + height: 35px + width: 35px + border: none + cursor: pointer + z-index: 1 + img + height: 10px + transform: scaleY(-1) + .btnLive position: absolute bottom: 10px diff --git a/ui/src/helpers/api.js b/ui/src/helpers/api.js index 164eabce8..ef7404996 100644 --- a/ui/src/helpers/api.js +++ b/ui/src/helpers/api.js @@ -38,6 +38,14 @@ export default class Api { return response.data; } + fetchEntries = async (leftOff, direction, query, limit, timeoutMs) => { + const response = await this.client.get(`/entries/?leftOff=${leftOff}&direction=${direction}&query=${query}&limit=${limit}&timeoutMs=${timeoutMs}`).catch(function (thrown) { + console.error(thrown.message); + return {}; + }); + return response.data; + } + getRecentTLSLinks = async () => { const response = await this.client.get("/status/recentTLSLinks"); return response.data; From 1ef37780512e6bf6b1f35602d3fc8620a83f13a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Wed, 8 Dec 2021 16:53:57 +0300 Subject: [PATCH 71/93] Add type switch for `Base` field of `MizuEntry` (#520) --- agent/pkg/api/socket_routes.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/agent/pkg/api/socket_routes.go b/agent/pkg/api/socket_routes.go index 8feccebac..a96bb11ff 100644 --- a/agent/pkg/api/socket_routes.go +++ b/agent/pkg/api/socket_routes.go @@ -127,8 +127,15 @@ func websocketHandler(w http.ResponseWriter, r *http.Request, eventHandlers Even var dataMap map[string]interface{} err = json.Unmarshal(bytes, &dataMap) - base := dataMap["base"].(map[string]interface{}) - base["id"] = uint(dataMap["id"].(float64)) + var base map[string]interface{} + switch dataMap["base"].(type) { + case map[string]interface{}: + base = dataMap["base"].(map[string]interface{}) + base["id"] = uint(dataMap["id"].(float64)) + default: + logger.Log.Debugf("Base field has an unrecognized type: %+v", dataMap) + continue + } baseEntryBytes, _ := models.CreateBaseEntryWebSocketMessage(base) SendToSocket(socketId, baseEntryBytes) From 005f000ef688aa02fe1062e05f1cd42b10bfd261 Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Thu, 9 Dec 2021 12:11:36 +0200 Subject: [PATCH 72/93] Disable version check for devs (#522) --- cli/mizu/consts.go | 2 ++ cli/mizu/version/versionCheck.go | 5 +++++ cli/telemetry/telemetry.go | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/cli/mizu/consts.go b/cli/mizu/consts.go index 7c5ce60fa..d730ef059 100644 --- a/cli/mizu/consts.go +++ b/cli/mizu/consts.go @@ -14,6 +14,8 @@ var ( DaemonModePersistentVolumeSizeBufferBytes = int64(500 * 1000 * 1000) //500mb ) +const DEVENVVAR = "MIZU_DISABLE_TELEMTRY" + func GetMizuFolderPath() string { home, homeDirErr := os.UserHomeDir() if homeDirErr != nil { diff --git a/cli/mizu/version/versionCheck.go b/cli/mizu/version/versionCheck.go index 63f02ff2c..93d32d4d7 100644 --- a/cli/mizu/version/versionCheck.go +++ b/cli/mizu/version/versionCheck.go @@ -5,6 +5,7 @@ import ( "fmt" "io/ioutil" "net/http" + "os" "runtime" "strings" "time" @@ -39,6 +40,10 @@ func CheckVersionCompatibility(apiServerProvider *apiserver.Provider) (bool, err } func CheckNewerVersion(versionChan chan string) { + if _, present := os.LookupEnv(mizu.DEVENVVAR); present { + versionChan <- "" + return + } logger.Log.Debugf("Checking for newer version...") start := time.Now() client := github.NewClient(nil) diff --git a/cli/telemetry/telemetry.go b/cli/telemetry/telemetry.go index e032b4ef7..71a3c23ea 100644 --- a/cli/telemetry/telemetry.go +++ b/cli/telemetry/telemetry.go @@ -63,7 +63,7 @@ func ReportAPICalls(apiProvider *apiserver.Provider) { } func shouldRunTelemetry() bool { - if _, present := os.LookupEnv("MIZU_DISABLE_TELEMTRY"); present { + if _, present := os.LookupEnv(mizu.DEVENVVAR); present { return false } if !config.Config.Telemetry { From 3c64c1c7ca4b9641f839dec85954f17c0d160947 Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Thu, 9 Dec 2021 13:12:15 +0200 Subject: [PATCH 73/93] Report the platform in telemtry (#523) Co-authored-by: Igor Gov --- cli/Makefile | 3 ++- cli/mizu/consts.go | 1 + cli/telemetry/telemetry.go | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/cli/Makefile b/cli/Makefile index 48f42b94e..8275a12da 100644 --- a/cli/Makefile +++ b/cli/Makefile @@ -18,8 +18,9 @@ build: ## Build mizu CLI binary (select platform via GOOS / GOARCH env variables go build -ldflags="-X 'github.com/up9inc/mizu/cli/mizu.GitCommitHash=$(COMMIT_HASH)' \ -X 'github.com/up9inc/mizu/cli/mizu.Branch=$(GIT_BRANCH)' \ -X 'github.com/up9inc/mizu/cli/mizu.BuildTimestamp=$(BUILD_TIMESTAMP)' \ + -X 'github.com/up9inc/mizu/cli/mizu.Platform=$(SUFFIX)' \ -X 'github.com/up9inc/mizu/cli/mizu.SemVer=$(SEM_VER)'" \ - -o bin/mizu_$(SUFFIX) mizu.go + -o bin/mizu_$(SUFFIX) mizu.go (cd bin && shasum -a 256 mizu_${SUFFIX} > mizu_${SUFFIX}.sha256) build-all: ## Build for all supported platforms. diff --git a/cli/mizu/consts.go b/cli/mizu/consts.go index d730ef059..73621a2ff 100644 --- a/cli/mizu/consts.go +++ b/cli/mizu/consts.go @@ -11,6 +11,7 @@ var ( GitCommitHash = "" // this var is overridden using ldflags in makefile when building BuildTimestamp = "" // this var is overridden using ldflags in makefile when building RBACVersion = "v1" + Platform = "" DaemonModePersistentVolumeSizeBufferBytes = int64(500 * 1000 * 1000) //500mb ) diff --git a/cli/telemetry/telemetry.go b/cli/telemetry/telemetry.go index 71a3c23ea..f89a7d877 100644 --- a/cli/telemetry/telemetry.go +++ b/cli/telemetry/telemetry.go @@ -83,6 +83,7 @@ func sendTelemetry(telemetryType string, argsMap map[string]interface{}) error { argsMap["buildTimestamp"] = mizu.BuildTimestamp argsMap["branch"] = mizu.Branch argsMap["version"] = mizu.SemVer + argsMap["Platform"] = mizu.Platform if machineId, err := machineid.ProtectedID("mizu"); err == nil { argsMap["machineId"] = machineId From 0a2aacfb02951ea630114bb41ebda73d50a9d1a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Fri, 10 Dec 2021 18:03:17 +0300 Subject: [PATCH 74/93] Include milliseconds information into the timestamps in the UI (#524) * Include milliseconds information into the timestamps in the UI * Upgrade Basenine version from `0.2.16` to `0.2.17` * Increase the `width` of timestamp --- Dockerfile | 4 ++-- debug.Dockerfile | 4 ++-- ui/package-lock.json | 5 +++++ ui/package.json | 1 + ui/src/components/EntriesList.tsx | 3 ++- ui/src/components/EntryListItem/EntryListItem.module.sass | 2 +- ui/src/components/EntryListItem/EntryListItem.tsx | 5 +++-- ui/src/components/Filters.tsx | 4 ++-- 8 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index dffc183fc..13acced00 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,8 +42,8 @@ RUN go build -ldflags="-s -w \ -X 'mizuserver/pkg/version.SemVer=${SEM_VER}'" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.16/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.16/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.17/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.17/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/debug.Dockerfile b/debug.Dockerfile index db1827b5d..858b6ae31 100644 --- a/debug.Dockerfile +++ b/debug.Dockerfile @@ -37,8 +37,8 @@ COPY agent . RUN go build -gcflags="all=-N -l" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.16/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.16/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.17/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.17/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/ui/package-lock.json b/ui/package-lock.json index f653eadce..a0fa2a952 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -11080,6 +11080,11 @@ "minimist": "^1.2.5" } }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", diff --git a/ui/package.json b/ui/package.json index c042966e1..f8fcebd2a 100644 --- a/ui/package.json +++ b/ui/package.json @@ -16,6 +16,7 @@ "@uiw/react-textarea-code-editor": "^1.4.12", "axios": "^0.21.1", "jsonpath": "^1.1.1", + "moment": "^2.29.1", "node-sass": "^5.0.0", "numeral": "^2.0.6", "protobuf-decoder": "^0.1.0", diff --git a/ui/src/components/EntriesList.tsx b/ui/src/components/EntriesList.tsx index e6bfab092..14fff2e87 100644 --- a/ui/src/components/EntriesList.tsx +++ b/ui/src/components/EntriesList.tsx @@ -1,6 +1,7 @@ import React, {useCallback, useEffect, useMemo, useRef, useState} from "react"; import styles from './style/EntriesList.module.sass'; import ScrollableFeedVirtualized from "react-scrollable-feed-virtualized"; +import Moment from 'moment'; import {EntryItem} from "./EntryListItem/EntryListItem"; import down from "./assets/downImg.svg"; import spinner from './assets/spinner.svg'; @@ -136,7 +137,7 @@ export const EntriesList: React.FC = ({entries, setEntries, qu
    Displaying {entries?.length} results out of {queriedTotal} total
    - {startTime !== 0 &&
    Started listening at {new Date(startTime).toLocaleString()}
    } + {startTime !== 0 &&
    Started listening at {Moment(startTime).utc().format('MM/DD/YYYY, h:mm:ss.SSS A')}
    }

    +ds@6w##y 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

; diff --git a/ui/src/components/EntryListItem/EntryListItem.module.sass b/ui/src/components/EntryListItem/EntryListItem.module.sass index e323137f0..11886f7de 100644 --- a/ui/src/components/EntryListItem/EntryListItem.module.sass +++ b/ui/src/components/EntryListItem/EntryListItem.module.sass @@ -60,7 +60,7 @@ color: $secondary-font-color padding-left: 12px flex-shrink: 0 - width: 145px + width: 185px text-align: left .endpointServiceContainer diff --git a/ui/src/components/EntryListItem/EntryListItem.tsx b/ui/src/components/EntryListItem/EntryListItem.tsx index 40d94e99f..1241b25b2 100644 --- a/ui/src/components/EntryListItem/EntryListItem.tsx +++ b/ui/src/components/EntryListItem/EntryListItem.tsx @@ -1,4 +1,5 @@ import React from "react"; +import Moment from 'moment'; import styles from './EntryListItem.module.sass'; import StatusCode, {getClassification, StatusCodeClassification} from "../UI/StatusCode"; import Protocol, {ProtocolInterface} from "../UI/Protocol" @@ -268,7 +269,7 @@ export const EntryItem: React.FC = ({entry, focusedEntryId, setFocus
= datetime("${new Date(+entry.timestamp)?.toLocaleString("en-US", {timeZone: 'UTC' })}")`} + query={`timestamp >= datetime("${Moment(+entry.timestamp)?.utc().format('MM/DD/YYYY, h:mm:ss.SSS A')}")`} updateQuery={updateQuery} displayIconOnMouseOver={true} flipped={false} @@ -276,7 +277,7 @@ export const EntryItem: React.FC = ({entry, focusedEntryId, setFocus - {new Date(+entry.timestamp)?.toLocaleString("en-US")} + {Moment(+entry.timestamp)?.utc().format('MM/DD/YYYY, h:mm:ss.SSS A')}
diff --git a/ui/src/components/Filters.tsx b/ui/src/components/Filters.tsx index fba4a0565..3ee23001b 100644 --- a/ui/src/components/Filters.tsx +++ b/ui/src/components/Filters.tsx @@ -214,7 +214,7 @@ export const QueryForm: React.FC = ({query, setQuery, background @@ -305,7 +305,7 @@ export const QueryForm: React.FC = ({query, setQuery, background = datetime("10/19/2021, 6:29:02 PM")`} + code={`timestamp >= datetime("10/19/2021, 6:29:02.593 PM")`} language="python" /> From d274db2d87492ca6c0de4a12e8ca05b3acf1c08f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Sun, 12 Dec 2021 19:38:14 +0300 Subject: [PATCH 75/93] Fix the CSS issues in queryable vertical protocol element (#526) --- ui/src/components/EntryListItem/EntryListItem.module.sass | 1 - ui/src/components/EntryListItem/EntryListItem.tsx | 8 ++++++-- ui/src/components/UI/Protocol.tsx | 3 ++- ui/src/components/UI/StatusCode.tsx | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ui/src/components/EntryListItem/EntryListItem.module.sass b/ui/src/components/EntryListItem/EntryListItem.module.sass index 11886f7de..5a86a38ba 100644 --- a/ui/src/components/EntryListItem/EntryListItem.module.sass +++ b/ui/src/components/EntryListItem/EntryListItem.module.sass @@ -68,7 +68,6 @@ flex-direction: column overflow: hidden padding-right: 10px - padding-left: 10px flex-grow: 1 .separatorRight diff --git a/ui/src/components/EntryListItem/EntryListItem.tsx b/ui/src/components/EntryListItem/EntryListItem.tsx index 1241b25b2..0a3c12285 100644 --- a/ui/src/components/EntryListItem/EntryListItem.tsx +++ b/ui/src/components/EntryListItem/EntryListItem.tsx @@ -120,6 +120,10 @@ export const EntryItem: React.FC = ({entry, focusedEntryId, setFocus break; } + const isStatusCodeEnabled = ((entry.protocol.name === "http" && "statusCode" in entry) || entry.statusCode !== 0); + var endpointServiceContainer = "10px"; + if (!isStatusCodeEnabled) endpointServiceContainer = "20px"; + return <>
= ({entry, focusedEntryId, setFocus horizontal={false} updateQuery={updateQuery} /> : null} - {((entry.protocol.name === "http" && "statusCode" in entry) || entry.statusCode !== 0) &&
+ {isStatusCodeEnabled &&
} -
+
= ({protocol, horizontal, updateQuery}) updateQuery={updateQuery} displayIconOnMouseOver={true} flipped={false} - iconStyle={{marginTop: "48px"}} + iconStyle={{marginTop: "52px", marginRight: "10px", zIndex: 1000}} > = ({protocol, horizontal, updateQuery}) backgroundColor: protocol.backgroundColor, color: protocol.foregroundColor, fontSize: protocol.fontSize, + marginRight: "-20px", }} title={protocol.longName} > diff --git a/ui/src/components/UI/StatusCode.tsx b/ui/src/components/UI/StatusCode.tsx index 84dfba351..054be378a 100644 --- a/ui/src/components/UI/StatusCode.tsx +++ b/ui/src/components/UI/StatusCode.tsx @@ -22,7 +22,7 @@ const StatusCode: React.FC = ({statusCode, updateQuery}) => { updateQuery={updateQuery} displayIconOnMouseOver={true} flipped={true} - iconStyle={{marginTop: "40px"}} + iconStyle={{marginTop: "40px", paddingLeft: "10px"}} > Date: Tue, 14 Dec 2021 11:36:02 +0300 Subject: [PATCH 76/93] Remove unnecessary fields and split `service` into `src.name` and `dst.name` (#525) * Remove unnecessary fields and split `service` into `src.name` and `dst.name` * Don't fall back to IP address but instead display `[Unresolved]` text * Fix the CSS issues in the plus icon position and replace the separator `->` text with `SwapHorizIcon` --- agent/pkg/api/main.go | 2 +- agent/pkg/controllers/entries_controller.go | 2 +- agent/pkg/up9/main.go | 10 +-- tap/api/api.go | 53 ++++--------- tap/extensions/amqp/main.go | 58 +++++--------- tap/extensions/http/main.go | 74 +++++++----------- tap/extensions/kafka/main.go | 60 +++++--------- tap/extensions/redis/main.go | 61 +++++---------- .../EntryListItem/EntryListItem.module.sass | 2 +- .../EntryListItem/EntryListItem.tsx | 55 ++++++++----- ui/src/components/Filters.tsx | 2 +- .../components/assets/filter-ui-example-1.png | Bin 41510 -> 47299 bytes 12 files changed, 151 insertions(+), 228 deletions(-) diff --git a/agent/pkg/api/main.go b/agent/pkg/api/main.go index 97291fc9a..42f86817a 100644 --- a/agent/pkg/api/main.go +++ b/agent/pkg/api/main.go @@ -136,7 +136,7 @@ func startReadingChannel(outputItems <-chan *tapApi.OutputChannelItem, extension harEntry, err := utils.NewEntry(mizuEntry.Request, mizuEntry.Response, mizuEntry.StartTime, mizuEntry.ElapsedTime) if err == nil { - rules, _, _ := models.RunValidationRulesState(*harEntry, mizuEntry.Service) + rules, _, _ := models.RunValidationRulesState(*harEntry, mizuEntry.Destination.Name) baseEntry.Rules = rules } } diff --git a/agent/pkg/controllers/entries_controller.go b/agent/pkg/controllers/entries_controller.go index 2d5e2e536..0b2f0724a 100644 --- a/agent/pkg/controllers/entries_controller.go +++ b/agent/pkg/controllers/entries_controller.go @@ -119,7 +119,7 @@ func GetEntry(c *gin.Context) { var isRulesEnabled bool if entry.Protocol.Name == "http" { harEntry, _ := utils.NewEntry(entry.Request, entry.Response, entry.StartTime, entry.ElapsedTime) - _, rulesMatched, _isRulesEnabled := models.RunValidationRulesState(*harEntry, entry.Service) + _, rulesMatched, _isRulesEnabled := models.RunValidationRulesState(*harEntry, entry.Destination.Name) isRulesEnabled = _isRulesEnabled inrec, _ := json.Marshal(rulesMatched) json.Unmarshal(inrec, &rules) diff --git a/agent/pkg/up9/main.go b/agent/pkg/up9/main.go index 9f0a1d185..e44c2b9e2 100644 --- a/agent/pkg/up9/main.go +++ b/agent/pkg/up9/main.go @@ -251,12 +251,12 @@ func syncEntriesImpl(token string, model string, envPrefix string, uploadInterva if err != nil { continue } - if entry.ResolvedSource != "" { - harEntry.Request.Headers = append(harEntry.Request.Headers, har.Header{Name: "x-mizu-source", Value: entry.ResolvedSource}) + if entry.Source.Name != "" { + harEntry.Request.Headers = append(harEntry.Request.Headers, har.Header{Name: "x-mizu-source", Value: entry.Source.Name}) } - if entry.ResolvedDestination != "" { - harEntry.Request.Headers = append(harEntry.Request.Headers, har.Header{Name: "x-mizu-destination", Value: entry.ResolvedDestination}) - harEntry.Request.URL = utils.SetHostname(harEntry.Request.URL, entry.ResolvedDestination) + if entry.Destination.Name != "" { + harEntry.Request.Headers = append(harEntry.Request.Headers, har.Header{Name: "x-mizu-destination", Value: entry.Destination.Name}) + harEntry.Request.URL = utils.SetHostname(harEntry.Request.URL, entry.Destination.Name) } // go's default marshal behavior is to encode []byte fields to base64, python's default unmarshal behavior is to not decode []byte fields from base64 diff --git a/tap/api/api.go b/tap/api/api.go index 36bd6241f..3b1f9834a 100644 --- a/tap/api/api.go +++ b/tap/api/api.go @@ -129,19 +129,10 @@ type MizuEntry struct { Response map[string]interface{} `json:"response"` Base *BaseEntryDetails `json:"base"` Summary string `json:"summary"` - Url string `json:"url"` Method string `json:"method"` Status int `json:"status"` - RequestSenderIp string `json:"requestSenderIp"` - Service string `json:"service"` ElapsedTime int64 `json:"elapsedTime"` Path string `json:"path"` - ResolvedSource string `json:"resolvedSource,omitempty"` - ResolvedDestination string `json:"resolvedDestination,omitempty"` - SourceIp string `json:"sourceIp,omitempty"` - DestinationIp string `json:"destinationIp,omitempty"` - SourcePort string `json:"sourcePort,omitempty"` - DestinationPort string `json:"destinationPort,omitempty"` IsOutgoing bool `json:"isOutgoing,omitempty"` ContractStatus ContractStatus `json:"contractStatus,omitempty"` ContractRequestReason string `json:"contractRequestReason,omitempty"` @@ -160,24 +151,20 @@ type MizuEntryWrapper struct { } type BaseEntryDetails struct { - Id uint `json:"id"` - Protocol Protocol `json:"protocol,omitempty"` - Url string `json:"url,omitempty"` - RequestSenderIp string `json:"requestSenderIp,omitempty"` - Service string `json:"service,omitempty"` - Path string `json:"path,omitempty"` - Summary string `json:"summary,omitempty"` - StatusCode int `json:"statusCode"` - Method string `json:"method,omitempty"` - Timestamp int64 `json:"timestamp,omitempty"` - SourceIp string `json:"sourceIp,omitempty"` - DestinationIp string `json:"destinationIp,omitempty"` - SourcePort string `json:"sourcePort,omitempty"` - DestinationPort string `json:"destinationPort,omitempty"` - IsOutgoing bool `json:"isOutgoing,omitempty"` - Latency int64 `json:"latency"` - Rules ApplicableRules `json:"rules,omitempty"` - ContractStatus ContractStatus `json:"contractStatus"` + Id uint `json:"id"` + Protocol Protocol `json:"protocol,omitempty"` + Url string `json:"url,omitempty"` + Path string `json:"path,omitempty"` + Summary string `json:"summary,omitempty"` + StatusCode int `json:"statusCode"` + Method string `json:"method,omitempty"` + Timestamp int64 `json:"timestamp,omitempty"` + Source *TCP `json:"src"` + Destination *TCP `json:"dst"` + IsOutgoing bool `json:"isOutgoing,omitempty"` + Latency int64 `json:"latency"` + Rules ApplicableRules `json:"rules,omitempty"` + ContractStatus ContractStatus `json:"contractStatus"` } type ApplicableRules struct { @@ -202,18 +189,13 @@ type DataUnmarshaler interface { func (bed *BaseEntryDetails) UnmarshalData(entry *MizuEntry) error { bed.Protocol = entry.Protocol bed.Id = entry.Id - bed.Url = entry.Url - bed.RequestSenderIp = entry.RequestSenderIp - bed.Service = entry.Service bed.Path = entry.Path - bed.Summary = entry.Path + bed.Summary = entry.Summary bed.StatusCode = entry.Status bed.Method = entry.Method bed.Timestamp = entry.Timestamp - bed.SourceIp = entry.SourceIp - bed.DestinationIp = entry.DestinationIp - bed.SourcePort = entry.SourcePort - bed.DestinationPort = entry.DestinationPort + bed.Source = entry.Source + bed.Destination = entry.Destination bed.IsOutgoing = entry.IsOutgoing bed.Latency = entry.ElapsedTime bed.ContractStatus = entry.ContractStatus @@ -271,7 +253,6 @@ func (h HTTPPayload) MarshalJSON() ([]byte, error) { } return json.Marshal(&HTTPWrapper{ Method: harRequest.Method, - Url: "", Details: harRequest, RawRequest: &HTTPRequestWrapper{Request: h.Data.(*http.Request)}, }) diff --git a/tap/extensions/amqp/main.go b/tap/extensions/amqp/main.go index af9155461..01bd2fac6 100644 --- a/tap/extensions/amqp/main.go +++ b/tap/extensions/amqp/main.go @@ -226,12 +226,6 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, resolvedDestination string) *api.MizuEntry { request := item.Pair.Request.Payload.(map[string]interface{}) reqDetails := request["details"].(map[string]interface{}) - service := "amqp" - if resolvedDestination != "" { - service = resolvedDestination - } else if resolvedSource != "" { - service = resolvedSource - } summary := "" switch request["method"] { @@ -279,45 +273,31 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, IP: item.ConnectionInfo.ServerIP, Port: item.ConnectionInfo.ServerPort, }, - Outgoing: item.ConnectionInfo.IsOutgoing, - Request: reqDetails, - Url: fmt.Sprintf("%s%s", service, summary), - Method: request["method"].(string), - Status: 0, - RequestSenderIp: item.ConnectionInfo.ClientIP, - Service: service, - Timestamp: item.Timestamp, - StartTime: item.Pair.Request.CaptureTime, - ElapsedTime: 0, - Summary: summary, - ResolvedSource: resolvedSource, - ResolvedDestination: resolvedDestination, - SourceIp: item.ConnectionInfo.ClientIP, - DestinationIp: item.ConnectionInfo.ServerIP, - SourcePort: item.ConnectionInfo.ClientPort, - DestinationPort: item.ConnectionInfo.ServerPort, - IsOutgoing: item.ConnectionInfo.IsOutgoing, + Outgoing: item.ConnectionInfo.IsOutgoing, + Request: reqDetails, + Method: request["method"].(string), + Status: 0, + Timestamp: item.Timestamp, + StartTime: item.Pair.Request.CaptureTime, + ElapsedTime: 0, + Summary: summary, + IsOutgoing: item.ConnectionInfo.IsOutgoing, } } func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { return &api.BaseEntryDetails{ - Id: entry.Id, - Protocol: protocol, - Url: entry.Url, - RequestSenderIp: entry.RequestSenderIp, - Service: entry.Service, - Summary: entry.Summary, - StatusCode: entry.Status, - Method: entry.Method, - Timestamp: entry.Timestamp, - SourceIp: entry.SourceIp, - DestinationIp: entry.DestinationIp, - SourcePort: entry.SourcePort, - DestinationPort: entry.DestinationPort, - IsOutgoing: entry.IsOutgoing, - Latency: entry.ElapsedTime, + Id: entry.Id, + Protocol: protocol, + Summary: entry.Summary, + StatusCode: entry.Status, + Method: entry.Method, + Timestamp: entry.Timestamp, + Source: entry.Source, + Destination: entry.Destination, + IsOutgoing: entry.IsOutgoing, + Latency: entry.ElapsedTime, Rules: api.ApplicableRules{ Latency: 0, Status: false, diff --git a/tap/extensions/http/main.go b/tap/extensions/http/main.go index fa3eea323..26cf40c8c 100644 --- a/tap/extensions/http/main.go +++ b/tap/extensions/http/main.go @@ -158,7 +158,7 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co } func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, resolvedDestination string) *api.MizuEntry { - var host, authority, path, service string + var host, authority, path string request := item.Pair.Request.Payload.(map[string]interface{}) response := item.Pair.Response.Payload.(map[string]interface{}) @@ -191,9 +191,13 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, } if item.Protocol.Version == "2.0" && !isRequestUpgradedH2C { - service = authority + if resolvedDestination == "" { + resolvedDestination = authority + } + if resolvedDestination == "" { + resolvedDestination = host + } } else { - service = host u, err := url.Parse(reqDetails["url"].(string)) if err != nil { path = reqDetails["url"].(string) @@ -221,12 +225,6 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, reqDetails["_queryString"] = reqDetails["queryString"] reqDetails["queryString"] = mapSliceRebuildAsMap(reqDetails["_queryString"].([]interface{})) - if resolvedDestination != "" { - service = resolvedDestination - } else if resolvedSource != "" { - service = resolvedSource - } - method := reqDetails["method"].(string) statusCode := int(resDetails["status"].(float64)) if item.Protocol.Abbreviation == "gRPC" { @@ -255,47 +253,33 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, IP: item.ConnectionInfo.ServerIP, Port: item.ConnectionInfo.ServerPort, }, - Outgoing: item.ConnectionInfo.IsOutgoing, - Request: reqDetails, - Response: resDetails, - Url: fmt.Sprintf("%s%s", service, path), - Method: method, - Status: statusCode, - RequestSenderIp: item.ConnectionInfo.ClientIP, - Service: service, - Timestamp: item.Timestamp, - StartTime: item.Pair.Request.CaptureTime, - ElapsedTime: elapsedTime, - Summary: path, - ResolvedSource: resolvedSource, - ResolvedDestination: resolvedDestination, - SourceIp: item.ConnectionInfo.ClientIP, - DestinationIp: item.ConnectionInfo.ServerIP, - SourcePort: item.ConnectionInfo.ClientPort, - DestinationPort: item.ConnectionInfo.ServerPort, - IsOutgoing: item.ConnectionInfo.IsOutgoing, - HTTPPair: string(httpPair), + Outgoing: item.ConnectionInfo.IsOutgoing, + Request: reqDetails, + Response: resDetails, + Method: method, + Status: statusCode, + Timestamp: item.Timestamp, + StartTime: item.Pair.Request.CaptureTime, + ElapsedTime: elapsedTime, + Summary: path, + IsOutgoing: item.ConnectionInfo.IsOutgoing, + HTTPPair: string(httpPair), } } func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { return &api.BaseEntryDetails{ - Id: entry.Id, - Protocol: entry.Protocol, - Url: entry.Url, - RequestSenderIp: entry.RequestSenderIp, - Service: entry.Service, - Path: entry.Path, - Summary: entry.Summary, - StatusCode: entry.Status, - Method: entry.Method, - Timestamp: entry.Timestamp, - SourceIp: entry.SourceIp, - DestinationIp: entry.DestinationIp, - SourcePort: entry.SourcePort, - DestinationPort: entry.DestinationPort, - IsOutgoing: entry.IsOutgoing, - Latency: entry.ElapsedTime, + Id: entry.Id, + Protocol: entry.Protocol, + Path: entry.Path, + Summary: entry.Summary, + StatusCode: entry.Status, + Method: entry.Method, + Timestamp: entry.Timestamp, + Source: entry.Source, + Destination: entry.Destination, + IsOutgoing: entry.IsOutgoing, + Latency: entry.ElapsedTime, Rules: api.ApplicableRules{ Latency: 0, Status: false, diff --git a/tap/extensions/kafka/main.go b/tap/extensions/kafka/main.go index 9dff00388..43af66140 100644 --- a/tap/extensions/kafka/main.go +++ b/tap/extensions/kafka/main.go @@ -65,12 +65,6 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, resolvedDestination string) *api.MizuEntry { request := item.Pair.Request.Payload.(map[string]interface{}) reqDetails := request["details"].(map[string]interface{}) - service := "kafka" - if resolvedDestination != "" { - service = resolvedDestination - } else if resolvedSource != "" { - service = resolvedSource - } apiKey := ApiKey(reqDetails["apiKey"].(float64)) summary := "" @@ -164,45 +158,31 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, IP: item.ConnectionInfo.ServerIP, Port: item.ConnectionInfo.ServerPort, }, - Outgoing: item.ConnectionInfo.IsOutgoing, - Request: reqDetails, - Response: item.Pair.Response.Payload.(map[string]interface{})["details"].(map[string]interface{}), - Url: fmt.Sprintf("%s%s", service, summary), - Method: apiNames[apiKey], - Status: 0, - RequestSenderIp: item.ConnectionInfo.ClientIP, - Service: service, - Timestamp: item.Timestamp, - StartTime: item.Pair.Request.CaptureTime, - ElapsedTime: elapsedTime, - Summary: summary, - ResolvedSource: resolvedSource, - ResolvedDestination: resolvedDestination, - SourceIp: item.ConnectionInfo.ClientIP, - DestinationIp: item.ConnectionInfo.ServerIP, - SourcePort: item.ConnectionInfo.ClientPort, - DestinationPort: item.ConnectionInfo.ServerPort, - IsOutgoing: item.ConnectionInfo.IsOutgoing, + Outgoing: item.ConnectionInfo.IsOutgoing, + Request: reqDetails, + Response: item.Pair.Response.Payload.(map[string]interface{})["details"].(map[string]interface{}), + Method: apiNames[apiKey], + Status: 0, + Timestamp: item.Timestamp, + StartTime: item.Pair.Request.CaptureTime, + ElapsedTime: elapsedTime, + Summary: summary, + IsOutgoing: item.ConnectionInfo.IsOutgoing, } } func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { return &api.BaseEntryDetails{ - Id: entry.Id, - Protocol: _protocol, - Url: entry.Url, - RequestSenderIp: entry.RequestSenderIp, - Service: entry.Service, - Summary: entry.Summary, - StatusCode: entry.Status, - Method: entry.Method, - Timestamp: entry.Timestamp, - SourceIp: entry.SourceIp, - DestinationIp: entry.DestinationIp, - SourcePort: entry.SourcePort, - DestinationPort: entry.DestinationPort, - IsOutgoing: entry.IsOutgoing, - Latency: entry.ElapsedTime, + Id: entry.Id, + Protocol: _protocol, + Summary: entry.Summary, + StatusCode: entry.Status, + Method: entry.Method, + Timestamp: entry.Timestamp, + Source: entry.Source, + Destination: entry.Destination, + IsOutgoing: entry.IsOutgoing, + Latency: entry.ElapsedTime, Rules: api.ApplicableRules{ Latency: 0, Status: false, diff --git a/tap/extensions/redis/main.go b/tap/extensions/redis/main.go index f2d2836d5..e8a6d0f31 100644 --- a/tap/extensions/redis/main.go +++ b/tap/extensions/redis/main.go @@ -65,13 +65,6 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, reqDetails := request["details"].(map[string]interface{}) resDetails := response["details"].(map[string]interface{}) - service := "redis" - if resolvedDestination != "" { - service = resolvedDestination - } else if resolvedSource != "" { - service = resolvedSource - } - method := "" if reqDetails["command"] != nil { method = reqDetails["command"].(string) @@ -99,46 +92,32 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string, IP: item.ConnectionInfo.ServerIP, Port: item.ConnectionInfo.ServerPort, }, - Outgoing: item.ConnectionInfo.IsOutgoing, - Request: reqDetails, - Response: resDetails, - Url: fmt.Sprintf("%s%s", service, summary), - Method: method, - Status: 0, - RequestSenderIp: item.ConnectionInfo.ClientIP, - Service: service, - Timestamp: item.Timestamp, - StartTime: item.Pair.Request.CaptureTime, - ElapsedTime: elapsedTime, - Summary: summary, - ResolvedSource: resolvedSource, - ResolvedDestination: resolvedDestination, - SourceIp: item.ConnectionInfo.ClientIP, - DestinationIp: item.ConnectionInfo.ServerIP, - SourcePort: item.ConnectionInfo.ClientPort, - DestinationPort: item.ConnectionInfo.ServerPort, - IsOutgoing: item.ConnectionInfo.IsOutgoing, + Outgoing: item.ConnectionInfo.IsOutgoing, + Request: reqDetails, + Response: resDetails, + Method: method, + Status: 0, + Timestamp: item.Timestamp, + StartTime: item.Pair.Request.CaptureTime, + ElapsedTime: elapsedTime, + Summary: summary, + IsOutgoing: item.ConnectionInfo.IsOutgoing, } } func (d dissecting) Summarize(entry *api.MizuEntry) *api.BaseEntryDetails { return &api.BaseEntryDetails{ - Id: entry.Id, - Protocol: protocol, - Url: entry.Url, - RequestSenderIp: entry.RequestSenderIp, - Service: entry.Service, - Summary: entry.Summary, - StatusCode: entry.Status, - Method: entry.Method, - Timestamp: entry.Timestamp, - SourceIp: entry.SourceIp, - DestinationIp: entry.DestinationIp, - SourcePort: entry.SourcePort, - DestinationPort: entry.DestinationPort, - IsOutgoing: entry.IsOutgoing, - Latency: entry.ElapsedTime, + Id: entry.Id, + Protocol: protocol, + Summary: entry.Summary, + StatusCode: entry.Status, + Method: entry.Method, + Timestamp: entry.Timestamp, + Source: entry.Source, + Destination: entry.Destination, + IsOutgoing: entry.IsOutgoing, + Latency: entry.ElapsedTime, Rules: api.ApplicableRules{ Latency: 0, Status: false, diff --git a/ui/src/components/EntryListItem/EntryListItem.module.sass b/ui/src/components/EntryListItem/EntryListItem.module.sass index 5a86a38ba..7e396d136 100644 --- a/ui/src/components/EntryListItem/EntryListItem.module.sass +++ b/ui/src/components/EntryListItem/EntryListItem.module.sass @@ -45,7 +45,7 @@ .ruleNumberTextSuccess color: #219653 -.service +.resolvedName text-overflow: ellipsis overflow: hidden white-space: nowrap diff --git a/ui/src/components/EntryListItem/EntryListItem.tsx b/ui/src/components/EntryListItem/EntryListItem.tsx index 0a3c12285..0b9a860a4 100644 --- a/ui/src/components/EntryListItem/EntryListItem.tsx +++ b/ui/src/components/EntryListItem/EntryListItem.tsx @@ -1,5 +1,6 @@ import React from "react"; import Moment from 'moment'; +import SwapHorizIcon from '@material-ui/icons/SwapHoriz'; import styles from './EntryListItem.module.sass'; import StatusCode, {getClassification, StatusCodeClassification} from "../UI/StatusCode"; import Protocol, {ProtocolInterface} from "../UI/Protocol" @@ -12,19 +13,21 @@ import outgoingIconSuccess from "../assets/outgoing-traffic-success.svg" import outgoingIconFailure from "../assets/outgoing-traffic-failure.svg" import outgoingIconNeutral from "../assets/outgoing-traffic-neutral.svg" +interface TCPInterface { + ip: string + port: string + name: string +} + interface Entry { protocol: ProtocolInterface, method?: string, summary: string, - service: string, id: number, statusCode?: number; - url?: string; timestamp: Date; - sourceIp: string, - sourcePort: string, - destinationIp: string, - destinationPort: string, + src: TCPInterface, + dst: TCPInterface, isOutgoing?: boolean; latency: number; rules: Rules; @@ -151,17 +154,33 @@ export const EntryItem: React.FC = ({entry, focusedEntryId, setFocus
}
-
+
+ + {entry.src.name ? entry.src.name : "[Unresolved]"} + + + + - {entry.service} + {entry.dst.name ? entry.dst.name : "[Unresolved]"}
@@ -182,7 +201,7 @@ export const EntryItem: React.FC = ({entry, focusedEntryId, setFocus }
= ({entry, focusedEntryId, setFocus className={`${styles.tcpInfo} ${styles.ip}`} title="Source IP" > - {entry.sourceIp} + {entry.src.ip} : = ({entry, focusedEntryId, setFocus className={`${styles.tcpInfo} ${styles.port}`} title="Source Port" > - {entry.sourcePort} + {entry.src.port} {entry.isOutgoing ? @@ -243,7 +262,7 @@ export const EntryItem: React.FC = ({entry, focusedEntryId, setFocus } = ({entry, focusedEntryId, setFocus className={`${styles.tcpInfo} ${styles.ip}`} title="Destination IP" > - {entry.destinationIp} + {entry.dst.ip} : = ({entry, focusedEntryId, setFocus className={`${styles.tcpInfo} ${styles.port}`} title="Destination Port" > - {entry.destinationPort} + {entry.dst.port}
diff --git a/ui/src/components/Filters.tsx b/ui/src/components/Filters.tsx index 3ee23001b..0afc7325d 100644 --- a/ui/src/components/Filters.tsx +++ b/ui/src/components/Filters.tsx @@ -244,7 +244,7 @@ export const QueryForm: React.FC = ({query, setQuery, background diff --git a/ui/src/components/assets/filter-ui-example-1.png b/ui/src/components/assets/filter-ui-example-1.png index f8f76b85ae9ffe86f611a5f4bb9d8fd1499f32c0..6f4d8843045687610ca7b5d1ad5d91f7244e5aa4 100644 GIT binary patch literal 47299 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«UZLqh`u2pU@uz+0*Xhx zw>@Zmb@*eNIG%mH*3Mo8s$UpT{5Ll`o4GSl&Y*!+nc(x6QRc1;W+7snIQavY-Q?u=RBusHL2T+i22`GGQzlWKe*Y66t2 z%bU>6B8t!M02HvC_NuM1pAXdwM}4@owzvKc>McOT-m<#v-c`qc(ytDv(XMldA@L0v zt(Csyyp4;El}Ro@K*IJuYx#QDUlU1&ZYRindLAh*tV|*Os1Oc*hq@;wcXGTpA~w>; z!{cGm<;RQJ%KchTYI|_hI^%Y)-$R7gW1?i=|bF3 zJ1wQL#ESmr#^hbvO=d!JEh`b`jo7+T*O0x@SQa-(N6YH9i2JjbX_l!KHir{L5n}Cu z(1v!9iG+f1lVm=sR1HA^Rrm}UV})GcG#NnG@2uw2#eLn#9{KnXfDfU)zhAIEUv~8d zc%Vuw`FRsv+^!xd>Ns6QMMOxiWe372dsVrsx4Q=hHU@dHH}BL{?;vErN#HoatXc{o zfjTpg4RQlcH+FhTMnjV@HdglhwAP_prY^r z%1R?reuTo*LoRvK<&M{}7qcfrx@}L^-YMm&0MAt6O~>`Y{H;Xn8QjA|?&)4!bhJR7 z=-2Fl>4omNtZ&+)5VOz_sDaBwpyt`!_SVi;>0>EOPn7kQJyJ@thYRejLBoQW$^1-z zRqgH4VI%qA1+ZgTu3Q=6vh+Dp>I?b&Ld4)UXlcv7P7Htf3K!xDig~&89OdlOp*ly5 zuU`vFObp(Gy*2(U{pS4sCAZyQFn?pY+6W{ht#X-~3Xj&yEoAZW_{jI1A4M1Evn)M1 zO{V|R?fpuQfmv_-WaI;_X!pEtPLx$$P;xCW>xp{%_fJ00)?Bz9H)5TcF-22pr)%uf zyRVVNN9O(wxDv22ZKQ@Qq#BjRYoCGwa2f-rDTL>tCA77Z&F$e07S;xnsX_=kH%|V- zq24U^nR0{nU~g0;7xaSRDY6vYs%v+?JV2I`n-4^Rlb^<;)6Zk z($)3HB>7A97mL?m-kRIms+#Vw%Ko^}Qc(ChlVk${L$$_6Q7R6wc7K2JpM%^$2@fc= zkbKZMQV+e(19qJRj>=R}*-&fN_y=I~8-jX3sG~!p0l%dKRlWG5!9d-0W7eqQXa?K) z&iMD4D4w6IHN3kutfs`P(X~m_*bGO&OLC&c)Xhw2R%1`tiyAVeS$} zg_R>aQ`=@a3i*9k(iva@5D-Br=a3r*iQK4#goWckRrqY_;Gk!1kb4=Zr!9r%)-|@f zeqp5;F-UO0^q@0e(+^5CkbC6C6MQQda(sh>(ZnP3lGH1ucJ|Nl#>mLoBlBnN=NGY>c9;o{YzM>;+x-b#8`<_w&68skiTa-gV&b2 zrCu}vE%ero4%|n*T$M_5Ml>`#P}e+z2D%Y-ISO1KS{s~<25N6lEfWCx=J4n_420w; z4*M3wms7#P1!w_S_gW6GmPaiEanE0adNL-I1cC89Kr~OK`VXi}zU@Uzi%1VPH8%$* z^DnNiN-xkcG^U5fgYs4fN?m0B{kv4V|3P2;H5V-W1)sEZVVCnnt}=o<&%<2=xg=hR z>9*L$ptgjN&vOI>4xz>`fgzni%`+Wh2|l3O#$%z~tkm9o{i-P8d>8gJ3w_7zY=FWl zHsij<&sMFz`Np##G=+4^5s|^Z_xzzkkqo&Ko(i$Jv4$qQ3qBqbOMz-aP#K%V|G}1!zNVk z@4zYNr$fb4ZOY!bjO$D9Lf`cC?EdHq5~Bk}=-OFl-~8dAvL?5F*`sdDhXVQWao=JZ z_|+dq(pC^k4%&T#X>F>j>PP!An+u`P^lz)v^VBcZ;wdz>(RqZJwtHv7W*suk5vWo6 zSuJm$GgdzOh@}h2^M?`Bzz@&VzV3kd%=tC+(m6dWN$KLiLxlFObjiZLJcM{yoVP8^ z`Ls?-7w=q=lh@r724k&PW7)=8u-u~y>JOY{6`a=`1zRAXoTF4>T8C)EVp~z1=r^29 zj&Y}T305oM^Hj|iE8r0Hdxjz_A-qjK~+nF)=I zjiS4laTN$JE=SF~S$(0T)^rx_p?OCx9$)v)aW5QQj#bsQWpB0HpijyVVz4aW{H_2Sbn_oj`oqnT=do}_9cop zVXKd>7PdlPh}^@x35q`*=do2MG+DEy+GB^rw_YIMW@#6*py^j|ib;RJ31*x7jnX=q zN=sl;w$gjPSp4m((7Apc`#^B<(^34vBQ-Dk6X7Z(a0D&^i;BscY`2v~15;B8&|d}J z*+N@3(0Zc>K30qyqOpZaE?bRUdWU7qn(6GD}_lTF%#$G^ULWTYJ3{d&6tY~MdoQ~8wy-cb=~|Xs4ca~Dw-Rc zZ?rt_KHN+GH#(m8vBM>LVjTm%-%YyyK_ykpHBgly(JDhJ&(VULMPErm>y{blVC^KX zsUDN+_*G@lnuwj@S}9>}ty9d`#g|5Ev3@K^jlWoQ#SptkdX|bJYqmOrIq6b;YhjhIwN5`jNQJiP>PFea4W}K+%U@)TFL~ z6rFRdCx|BO5H8xEBg8_#j=5ljY{nO|6C9PTS}SmFx3u%$Zd#e2<<7u`SPf(;P@0o*e;Z$?nG1Gec+)aBv(A?Pp zYbI$%E1+p`d_7Le8QdQhSy)P>V{+LpGV30pZ1?I_$+|YrHt^&Cn%r>VkrN$_6CWSH zM)`nlyrUXIfPI-OJd%gBAc6qhfB{4~;g+#n;9n%5ugG+LA7QY{(B4O8Yioj^A0B1qP45wP+w^{~KuKmPIxN8D zzkYNcw$miP)%qEqx@YqRhjFFe{5AonA0on1p*Xn3Mydu(7dFWH&qPi=eZ99Fip5Ow z@2q!Gm(0g#VAPaM#6;R8!9sl2l(8E3Tf(1DSh%pu%HZROOtwONgS9MI%MKL9_Pkp` zKQvi{LOrH^WA&LSccPnujO?ZqKYth+cmKP_19iCvw1#UU)z%w&KyoAR>n`k{6pB23^J~Jl>G9u zxpz*^XLHy;H@2KKKRZN$gB3w~qG( zTh=y`ipTs;3?}9`IZutTPEalgeDaNfBN!6VpO?$c>vks#4c0_dyDl2LI>!EXWj<%5 zmktV)r7Vp(owRD$WeGKrtwd~a^skS4ptO8XL4W>QRaJTdp{H-)t2D)CT#ZKqF-a_X zici=VpBljYH_jAi)Mj+`^)_C35b`*xC4Ug-bM6UyG|>GtG(PdHX}FG45!Yd;b|4Hc zMG`fzn6dI&d1tJ7F4!+~hn|WffIkWy=9{UZnqjpy^cYLFYm3yKYx8oXC6{=YTSefg zzZAd0^%uru@af>vciGK>zNzN~G-iYyJnxL&M!n^)5c?ezBN=)<*qw`|eHq<1@8!qo z(ZsBS{awcxu_?asZra9FzIdPFBzsj?S1;w!{#;V=89|F5p3^yIXru)!RX7M!ix{7YPy0?%{Jcd zZmlw1c>_J`{@p!2R~IEINI`?2&zwHe<|f6<3j+`ube&52M&g-Gun5>~l7MMjuK8=- zH##mE+Z8b^H&ZDmJ*u<>VQU*^TUKn$p0n1*=SO;_hz{yCqka1{N(tJYg<*7dLK9v* zkgm4+#b09G==t28{e2$n1GcPo6wx!m%tkwVy%R;StZ`GatsSQkpLBq66?83MG3xgv zfkOx?>gtUw@>?KH016L!q30+B>~Dc%x7z>F(}ua+gF^nEiRsk!_kyJ{hwoRk)y-vL zj6w)X)?z|275C;uD_(m>KIM<4@!NdiZ#u^9(RyJbQj#qLBcTx_o8edYj+gQ!Yh92F z?FXvC3mZY92A5t)P)-YIYjImwW2&lpXWVXCzDdOjY8}mHK;_)|+|VyF-~>7Y{X849 zl||Or&^M3vDZBO?p8t@@io@JGZJmHcXm=;Qx<%4Gg8uHPGzIc?Ee%O zan3zD87Jmsh2@1(cp4fTCMkRxf1Df{>j`s{L`7vNeQVKI&H*|53{FbP?YYLrTIpy+ z0;?>{E@dHOMu&)}xv9Pu2OC#Z6{AF+uhm?Zi$@&;ZE(sLEC5k!jU3#nZw6vq! z!^YLMHG#zj7v!y0MQYU&udXf;?ptbu;`{%&5H-F*z^Nl}tjq&=z^%@CT3=Ex-k{FB=xvQxJVcy4$&SYgb#yJvPMGVE=#M4^7~2$`<0cw_GbivMH)C6o(`gcXWtDCuO#-f(u@*0 z?1M>!gTa9>FK`qNSYgxj`(wQq1L9em!TAUg35m9*CKz;dbhS$Jpa$20teL$%Q{XP| z^hU-8N0g>!W=1N^)bR-jpw;;8nmX^^z1y2E^&J|L0g=AAxTw3on4OxQ##9eZOCts6 zM~;t-PsJ3(`Ie}8H^Iy&0g z)8p@hiuYs|=e(`1s`~73wB)=!S8E>vytK=EdwqY1`PY#DA6M@I&Se|Ek85g)LW)9! z?46V-g^YwqMn)oJWTa$8A!P5J?3HAc9kMq?DKj!6LS+BXr}z8){eQ>rJ&yM{I^Mh= zpXYw=`?{~|yw3Bynlq`=ysxTQpAuRP%?=O@JpN5#*O>G-?vRWa$9{!NJbW`gOB-}8m?TZ_=SH(hpZxQx+K=9V+~!8K0wXuKP#Km< zt6g9UVltT;T2g&16>RaRuELacY-5aE~2Zdh_U`w$U#km8%ap ze|_Wr{C2xk*j7*L#mR!?tQPZ*kL@P}j=!m2+x8*l#B2q(1m$Fpds}ZsTYx)5P+Xv# zs^g{dwL@W^$)xIsG+If$$W64htT|FHY!VoDW}Xur%>DR@m@NLa|LiL9z@3)-7; zKV_f3TmZM~M((X0*ff*8Z?7}AJFfk;BG~E>%K0-$)D8^9%Y}0AJN~`*CNB@9 z67tOJ*~9Bg1H61K!+sOcZ9!=_XI6s6)G9Qq{PLyfy)~f-y6CyTqX;y*W5L9BAJ{q=3xJwMP~z0iu~2W@=CANpF4m2bP+SXa|u z4%kQd7J2RbQA_Kd0@Z2@;~}9ytg5VZ1%UMibap%iv|X*?KPI|Tzf`zX6vx(JmqT_3(b)y)I=6f- za}YtVC>j4AK61or>N9_#*_Wy`<;3>RPLBJca@M})U*5Pwh5`n{lfb|Om6erTy5%uT z11`FKc5!wPM&f(OR5-8Sv$OjF2qsJGtsl2mVSCAg)|J5IEAwi(mILBEy5-Nav$;VJ z1#zpyjvFeKN$Xgwwea0;KBMNt;F^-2hsbPVV&e4Kvov4rOTbAKQZ~1o(@h5gO{Vfnw9u|AZ_v6QpOP4MY@Zbk()uSL{S99`{{oEE=*B%55p)mvgY5KM+hCJyy`37NB09 z1tn@CzJqmV4d>YB?7aNU?ii?0Ts!MrU)iqrYJfbs*x?GYK-VoU&gZpN`tuucrEjhHd-KfuS?My9 z>)AWlEMi_bO&2a?^~F7=)bi$9`kudbVd{B>%q~&Q5{lTvHBa|51jI#Fek zlPln5;(xj6a!qZOUz~I7GP5!NDEHK!a}Q8rWYaA2r|I*GyF3ien&R3i@~g>xHQ~bv z=|hp5-=ZZRbF&q;f6Sv#)Y?B9ek^Z(wCvsDwU8I`F8o=_mb9uC^}pNo#EzC3|4{S4 zDx#o1)AhN_zmH~Vo^g?W=Ht)C?9UE6b~Zgd$%&RIapOWEd=GoqF=x|8NFH?OJFPML z^#R9G^8^J1Jcg(Yxx zFtoXDBQ^e*b^w={ie*n{XJhy#KK5FIHAQ<*r#d9}8!0mAH0xw@*=P+Oc^4jMnp}kGcovvduaLW`#F5;X)t&(gZ!y-FBSouWAq;orjd?cnl zudYn@7VPErOiyP=PNL=?MQB*->O2DiVrHh<+1b%A^MD#IQ-;34a$qB|VZ@?u$t&(A>=Q&ZZYKKqe9w z7dQExjg5^a`bTDCdwT$guU1%8N7sz!&-Xp|^+ng>0Gj%1d>`=+6ywBXA(x7K5d?uv zZ*T8ODsQH*7ABopN(oy@Ajl9hZhs81Zu-v(q(1n*DId($L4ZW&0=e(@$B>}W@MsSr zVol-}T;}nuS}AoY%nWj*r|Kb%lW>W9{FnrdXF-GmAMUz5$DLA_E)5P1CG2+;J$+iw z(()?8g;(cCD6ls_2d*CZQfhDG_T-6|w>O7?k|CJIueM#gcFoM(yy*VVLxdvsd?@xM%IM|NsjUO@hr^G)K;Bq@-{D#SmH92>=C)azoD*5OI`O$X1<{} z$0xhu_!%R!sFq=6iQJ{CpG6UBQ7nq|xm!bI3|K*H)*xD1*z$b5qj)%(=sZbRRnMI2!Ue ze#afkpypPcI7jV`Bs&ZdPBz$@L_|acyV=XvSJ<>^ctzRDzW3`_N(Ki1;9yE@Zx&*VZDfJu^5t$?<0z_vS0@B1v4`vRAK;;YmC1kF!ms%sFa;x@{PkqoJiW z-^iImRh%kJ>+AaBpIFe*v3auO$4GjI@jK*e;DwR$73T|8q}^&=572$zzElVGWO|Et z=G&qO+W9?;nL*Ca~tLJQcBA8Kl3b<%4_ zO$-eUUw;q~5efeMq_r@0#aUMEwUlB?4KEB(n1;d!<*))RmGMj7PWu4;?6a@x3&b-I+!`HcD$T?p*l)s`u)CV zckZwDGZTORCMT9UPZ$TdMxHob#iLm5b;x5y7pqYK38}BkCy0k-3oDt4yD~Q;M9<)%3%Tz5|Fn~ zX;?t*4DvnyjoRbkO${wA$v7EE3vD25M-Y9gm|Bg@9zG)wMtkA@Mgq*p&F$+;ClUk$ z5#-lCT$%YyYR((ymUx*bNr&`!nT5~I&}9{eR50H$G&~Zk8uitKJUF#q@PwFH3{<5m zue3$MB&+O9mOpaVE=xA&8QwJRFF$RbRMfDge}{cKZ(mRBxQFthA=ngYCsE=f6o)M>?;Oo{-i*8PmK=^?vz^}o*f`}l7J$VGE`0q3ecvH z(kZp2ZtEFI@uao2?};-SXJTmOaySuUPGA#)4=i-V)FKt6v9FU(E3-7rM_ZO3KYKPB zKgn-BQh%_x$L=5mm6fiH@&w1rck~(xHpi4_i$;!uxnG1FH=reYUZ0uIR|$& zzwdYzLq#deNFnx)ce|TR4d4}%&LpqOprSQGu#1ErEpwY-9Ws{VOiWvWHw3$;`ADXA zQL|f|Q#gVQ3W8smJ+HMX)`Kb##tzZVZo?MB_+WD0q>EC{9am; z$^0}t0u9`rSFc{#PJZ;l;&y^L!o+4IZowN8dE--}BDr-)K;)mnJJ)NNdk5ZsJLMQ5 z_J@8S7|~&+cW`b$0N?;)Hc2+&B~lO2!Vuuv2!(e`%V=`Aj%4O17`*_j2x1*@T3HzS zYFROg@Fi6{#2+5?%^<}L#u%a~rYhl;lcrO423aShHG%jZQB*G(q#VT9fpusUm{J3Z zS8?QjI7pqkM9b|X#*323-``*P>oI6*feH!S8+?DOj?rLIJ@XTx-369|)S^kq`G%E& zj>(Ftvccf@cM{l@iqKkruk){iZVpNg2&#Rt_m0nG56>MHHl+eC1Fdx~icx95qbAnO zgdSVgJWVAXtaZZO!u^s!k+vUPX5bBy3R@S%@Ox0Ed+a+RdFj&AzmjwLyVcsZ3fwO3 zGd)_+sQ%r~Xlwkhbyo)s*_|f0x@P*xU;UaJ^m*o_kTA+ z{=U9fa_tYvC@)3eb8va5eKOtV&wZ`X=h-v7_?;>WM`>tiV0@$jXC)}%$wSBTE-5JN zgQv#{M#jhQ-=E+1o6UtQ{Y`V;3&zAxre9!VgC1V#V(;CZ^o~FJ$?@KvK7ESc)P~YK zDVD9tZMe47b0U-c?9MQ?$bhjL+rP8=D~r>d-0X{Ub1&gkaa7d$!}&A;wyXcyFQi}3 zrmfgm;e<&5>jU+p0=J)0B{t%p5sPd9pM=8_pfo_9>DUC3g}D?NjfWlR(li_LgIwlY zgS9UAG`yvBroJ1TsXVt_{>A+g$K(2vJL6M*L5JeVG#(gjV@y;Vl|JA9%5|&ji-$Yk zj#qn1rX5`KJiNY|r1FE&z_`h|D!@$!9x^od?%x+K{@DpE0Dyx8AV;oKJlABO!S3bU zxtmc6H146H)Nn8OR%+j+=VlLh`quZ&2rUn1x_Ja!*)g~t;9i9fMn~#Z2ErKwo*@f& z-%2N5NLLlO+s##MJHa$9fb}mz-JZbs)wCcAC?xJ}h0#WGyG$IVS5yH-2zkIKNt0FB zuh0hv1qC$Rma09!HSP9H?Vaoap{8FmGs}emOQHT>_d0g|xFXPLe%fC7rg6G1OHb!+ zHMI=YA(%n!?75GlVQpFRg$^@2dIW3y$giS+)ctRKEU!?KRDt}{Onb=%5H|A(V?Ez5Z9j^-zGv8jd~G(UevkFj!vH!O3s z^YO^5C~`2&tVPvFeE*i#6>F+U-|S$&Qy_954ISI7lv?Y#>-`qwz8tGv4QDL_vPOfJ zhQ1`2QktF~BU6-M*w~hQMrPrBrAyGCRqKhq{smsHmQ0bC4qfzS;ww3P5$8$vna%IH zQbxDy;x4&MV0ChYHV&Q!PFtjHF)N=V{?76OLd$NLN$FNNyO&BMG0n}-$Hm~0mUa@^ zn}@r*lviW^+qWXL^WR4rf?-_Kg}U#biB5O6mK6+itVbJT&N+nn(D2Un-p!E>E{3L< zZo3=rtLO7$ZNab#K@AUJTxeGknZ5jR*q2PeQN_;A&b{zv1psJ3YDQC^b9Yj9pm@W! z*z={Us>%(=>Xg~%^GZq-c;DLZ?zsXn>ZovWVYIxHL-;pYeV4{9a|!Sr;DQvZ@3n>p zH|r0dn_SSlw9d#g(0Pxu{2m{NCHaol{V8k>aK^y9kqx-U5vrnVb?@H$o*o(*85ul) z45BI2IJjI6z|zX($Q9YuKv8>ubwNP0hJXF?gM}1=I-97d#zE@6VYqVCP!34JMFPzV zTErw|-98y=nZtvFj}gOg5#R1gxq_6Hl#Y%Lk=G+SI{Ji1=)xKAk~+Bhm_Vqtxv`q_ zk!A@NGsuK4JSlB^3JzO?4-9D_*5OVhRZQdEG;eY#^OM|f z2WuOf4%335GQ6t5hTA{}_q({bpgu9xlLsjJ(Nq{@&Yf-#tekM?MK#aEMdw{{G3~Af z5Y-29$8IMjMOvuL!C>}!6aeJ)0cc5TT3h|F7{PII7K~x1PoJjJvMkbWjXUQ6Vq&0O3)!pK3Foy#jL;KzAj!FYIhkZ*XR z?3gI${dGo6Osw5lXl=et0=dL)0Pcig2Ko=V{Y5M_NIH>Y-mOk>Zm{MENG0^a|OBid%7XL*)?$T%tvLvUz5Dp3Ck3l|O4{JX_wlpE`Xi zU}@B}TsuN%cEGTD3rk&V=JFg_*RN5_2lP_$wKsQ(mbwP_B%%hUs-+ZDe|Ng5<8#S@ zC(%n)sgi2?6c@a{z-j}$*v{Wbp#eakNy4KLb6WXKJeEX=Viq{Ba^|O<6~#X%1}Y?A zHN?iw?gclu4w$bU4A=N5kceo26o+@WnzOSr)`PHRG1>hsGpC%R#u1Vjc;oHE2HTd< zsCs0qEuKwWoIpj;quIml0xz^G{G*rodkxK=+FBD1@svRNELpmbu# zYgFHW`f=3n0H^Id*yv_BY4DM-$w6S%$Ndh#KPf_g zaX-Sw|Ic{G6I>^-)dJJtp}jrPJuuNwgH9bEQ3G@hw{4V&rQh|;(E*oD7GYs(JR^dr ze!D-h?@ur@KVg9Mc`#<<9k4D~DF9HsgsNX(Uw`LBl#q#AcsLC%znyOOR!$7jB1ZmZqIMN_zUo7BYYvjp$vh60h$0X{|gYm+T39C zcXo&f1b_`*T+d9-UC|Hojd}@fE1bg)_pz(!(SGTB+G$?hW9YrCbAc^fH1AJ95c!yd zyFZ0iY!HF6UC>}NP&dV9*v*69oXdwgGmb5;raUk#y7EPlWk787 za=ZO!&98a4s&Y|Xf5ekqw$oG&K~~P&?!9i->JEy?_^wkNwy>(Z+Sk~S zKFC#9EB9Gm$?gN&kHKH8w`Rq7TH__!P*^Ga`o=~frbtU(Qn$#^WVA0}uZ?&-u_XW# z^6OVUmAUSrnED+!Xw~O7{!MySew#1f`*sTo3#+XpODjEc-nZVBboo=cGh?2IqwMO6 zR9$I(Ys<*eI;T7Tj;*eP{Ou`k7-mkL2*BRxaK% zwZQq7GySHTvRQLR=gXP5C_2BR4uUtBlF)T_ud)Z>PN_=~3g3scU0FX(QrcJNpMJMI zUa`-tH@LBt+Fc*t?K~Dv&P#kT_WZ2wNbVlBYeskOi7fw~9=~Hbec8xj#pPwfRQ9o^ z6AT5KEm<0Q=vEOYj3`C!PpX#x9p3wBaSHC0hyDEg5Q&3BLu-(V6yY9}OIGP+k*aX0 ze`DA*J39+Tw$-0WH5|O(i;F4fV1RM-2DusHyROT+Fp75;M#lHXvFOZQL}iaA2?+c{ zqoY!9E&7sPxa&GEvk4m_U=axwe7s8X=d01&OP;=DZf^ej&!1%6zd^6jUgws)c(KT7^%MZNzst+iy^YtQ zy*z(mNq;9#`nOHyG^1p5%3*197Xj1YGriQ3;=j%FMD%Lrp z{jOx+%NNY|zn*D`Y6#_7V05$(E+4R^gQsi(kmEt+;fjS~9OdWyTobQ+E-7JH3cw6@ zocpn)$)E*HeSJ&*&#M-hb)ri8iLZD7Tv+411)2HGe&cjfOTJDtmkjng8lY1HEoCUtZG-DV;#ra{M5o;$1tMWXyx&PqZ>IW; zRu~S5v?%MBjgG ztnTraZSAH7#2LbW;I|sS#KpxG&@}qg)06V((dU3n@g75mSwe-3^}33~YEr&DJm1il zB&OWke`sT^J|W=p4hleKk%D&!Di3V4#?VM1)*Mc)c-=ROtXaS(Vmy610tq4>vKoEL zr0JX7TwJH`Pg0?Yl?0_EDr-0^$e|03F7^(>kC^CFC0z8BYf?rwXNhY>>9W{Cr|Q?1 zN8eE>r+okHMc08s?*HE@{z?UQ9`-sH)+M;;c+HE5IrdrIs$Y_WWllCoN2 zbL}Eh)GHP;QGtQ33asF~?*vqaQa@72B*^s{_ym%$0wS43b&WcK05wm2oUnx%vhv)^ ziI3@&5*vS+;n10YyOIQLrt_xqXzy`c&#H%An-6tHXP)g&rfYd;4hdx%JQ_c3r`XbW z!uN#Ar&mT|>wv0E`ih0&Tey>O^Fv1xB5%UDx-o>E$fLrWP{}0els&>;pGGfXz0 zy|Ek~be&XBZ;(fC^_v=n^U~$icpKeXBf9cUOitU%>A20N) zEq5WNUamvK-Q!qe)z(lsL!nKy(eI7aADH-Cw$#szBoZ*X_~zQY`CBe;^qdye5mo3a|yi`FaUTv*r!XM?Y{ZB^-IZ^Y>T2ZD{V?l_TKxP-6@vYJP*&>i^sL< zDLX!BpV(*c{K&io@PTE{XwfgaX(mLJI^!Vt5CH(Q#1t z4cRGesvYJpKbhth@|=0Uyi8{*?G#(NSBHfr;@I?URw)h}GyBCUjY5k)Iq*CPV@7-! zKvwWe;tu}#3g;BUcN2Y^DwtzyR5+i5+wVSFq58C&QUed$MNI8Kai6$uE?VG2DUz7{ zy;kSX?levR#GXX2(nIdj!QtwTkC+6Gjo&^ao0Xx|ded=o&;MRqTf2HceCIN&8`{dB z!Ft}*qi}Xvp!RD+aQc-eQg_2i$~>iTYvPx6ZWqH2LPB>=H4fQ|`>-^4SphLI3NRZ# z5j9?R4UWy0*UM3#@9aPRIDa8MP1YU&1AY`Y9(>H&5FmGvlc!=EpmsT=Sq`1(GnBlJ z%X5fL1njTM5t<(}h4O|#72a7HkgTn(jdvuHlAy&s>MPR!9=+%^GC)_fzB_Sw!9x=S zHCQfZF$xH%9Ax&sn+f*b`!nQTQ1&2z7x=ytfGkiS3qF#(klo@Acz zsEmoxt`EMvKvrEo^w=puY)P7Kk9%*o=32(bq0gbgTsptmyoTPA9I?peFqoNsuCVbw zv9YpNXWy&;YX@8FZ*}G8P)#G+<;YH1nVByhq?o(<&Zin4!M@TLAw&QID&6%FmdB{$ z0YNnFSXcO8E`a1e=*Am%sRS<)1$+xfDq^N~xnm^I&=)XGM|yeu0s#!ioQobiLUi4n zmq%$}j(S3$iHAoq>Ya#Xe+C~n%URAht#mkC6}qG(k<9bA}e^lj(o2dy_j2cI#BK^@|)AvBfHRs zC5R!&l@A^`;0k6FGBsvl;ZQWCglNfzhK2yE2Si6}-FE3*DnZ=DFZ1&EAM<2zX5`@5 zQ=sXqnf(K%-pGSxUj`7F8(D=ZnK$pHa5kPyHI5+W;Tx+xwB1~~Qr4G_YKF4T{3(_A zG0OIT^0~OXTu*mzm+E+Hsf$C|2m}N0%Da*hLF}#PfuIXUpH%E^iO~ZdlxH;@y zh5qpIiylPgh$;o}JY-(cu&93WP!XvJv5ip8?}axt$`y9*vt5+YFSti!@3Se_S#FL* zb#vHK(dqRa20*|H1tL%{ycZuhCL=$B=G6nx1~wk*ZgD&j$^?ESh{)bQAfh%S=k=ii zT}ZSVP_jK569l3H8)iN9;yP8j;BqLxF2CUWa#h-)u z?;Bfxtmmdel50C|td(byE6+?+WlE14Z)vLM8p<8GOQ+V zaWM+}UUfy7p;_eH?nzCv4mH}ouTdhaU%bO8cgej+dP95*7*BJbnwHrs@a1RVBV0>TIyk|p$F#T&Y%LV$ym~Xyw zI)#-Mp4LT2g*0tVk6pjsy>HJr@NrxuM{$FXSc_U0mEOped#Ja2`_{^B^wPGS{)v*W ziL|sb&+VBq3&pNIzdzk@D1KW=(_qfUFR$gO?q~$jtTP-J!;E%cPX21(57F+R4uC&zw=h(oIm};>wWP*$6XS7Cid)A zJ1&0_ND+>a8!{N=sA$dIsdU?cU)1lkbQ3V?)8u5sa>oxRVafB^-k&r?heUup1Uq#&v?n0njlJ%vm?^c>J#1s* zL1^vzqIA_I>n`{?c4 zL(&u^_Dv)b)1rY|<~oKm%exe{C8Qo1?F_ewOO0~4&%+UvoX>VOj%#rlp^d1DYip$s zrZ*qRcp8Dvjw7X)z7*7OTl!pz_rc_+H~xEo1IJbI(p=x0;o<2OsmH&j?HxTx-K-@* zE}tFtqwlA+hV#oy_6?)fLbSdOhdCuf@U7bBA8Jutd#Q3EFynyl{O98eWc+0OGnpQvYgFDd?4yRI_sXci1dP zXaX17<~MoevINwd{}o_^`bD&vDYDaVRvp<3l!RaT@37QXd3oKZ_5e1@nEp%9*HI@Y zpv)t7m;Kl=nEE;37c{rZq^sUCkEKZ)h>!{8uaxtrctxy>K>wlpuTCapob+cmxD`5^ zLHv>n8oxVoG}ibkGn(f(3zSCHF0^h+YY0rMQ{VbUEdJ)YSFkn@d}(&_^75kJ=mT&p z_Cfy;Y@J{uGifwRj6#Wtja5ELg)bpQdnF-u)B9lNQ)2JMh5zpUY<0nkV{_ikO|5b% zn)%<0IIp*V_fo!gQS#9D0fA+^7?x1&5yPb;4@HibD3t%MV=-MeP4~{U!iW8KCGNOQ zbK4hPFS>3gw3fTql)2a^R2i19VVEEy{YVLXyWe592O==@ob>$=#S1T9lg>F=jN3lm zA6tI($vp8UV)PkLH2m@pd*e7ZAJ>#*^TsiU=KjV7#U1lByXeEFC3@Qp<^1@b;s=%b zcSn5;6U@q#iu6`h@{lCn%&s^#+wuG}A8E^Rt)4N&h>yZb89p^b_CZ4e#6uj<^^8`LotH`74+& zl2B5Ss2kUvbdfdKz}&z$&&ED#=f~=n7Bbx0=uY2w#Dw2wSpVtg?w}hi;Z5E*XiswH z$MDUF{?BQ;dT=k&IbuU|t?2$FAhOwo4@ISWi$q0@^P^VdlwWk2bePO<=X96!OHQUn z&YA@HqUtgJAEjCt{=fV*8PIgRZIwFU;)UPrR|7ixByui3yGDHELrseRR!r{sP-jVL zGV`HB*FS${fBp7tc-V|dL9tlEWcgUAV&=ufPk`&#K^6dzYxcbRWmn^cS5j=j1G>W5 zg8O8WxAm?6)=G7F{f%$a=3n(1xBWjz;(~1IdH2@waNm0BJ?!OF;{i%m;b$8LT_cGP$CNUgT@E!Q~BVro=cJg*NmBfMAtDEf;=kL6}tLxejL~IQD zp@=NOVjt5DE78q|+<2I+m0eH&1=sURQ4>n#UL8+JSub(KUSF-h`zcX|9Op%CQpiv( z?7SWi(*N5SFk~2{4s2?oBeBlLvWv~o6YW6s3OCsV1%5ubDa>^J+~;wDcR?~QdAqmC; zIb#rVmgI{~o44aHff6=Oi5q`@Jw$1K(WbXBt2Zglv9WhQ00u(0Lqu9!Tk{QU@p=XZ z)%fhgXKd3#e$~+Ee)#%z)oY=QDSTs;F204X?H{cCaP5EgmSNMny;6C^WU}VU9pJG5 zcae>s=W!8Z(8Ag2yy&8R2LmylwMJKj=N+{L5DdP&g`d4uNLV%dge)pF+ zc=Tv9m;>lr5fmZtAW~n>Q2Sj;X7KU(`0pJvJ~X8$*&x>BMgFyyj+^(F{1@8pleZq; zJ}(>(+(aJ{JugoXa6hY%&_bZDGD;K>mH`!BJ#%Q6!(O?5kIkAwaLU+G^>PaxDg%G= zYR7A{ztxYOxx!=(@}@Ry>c93~oth&8kXtJ05Rr0V7breUlJJO9EAL5e2>RuE&v3s$ zkVLVOiWCKT|R^qJ98?2*V5sT9XxWR;kADC^Dqh2MjOjx3_#lJfI{9VdnAlrm*C|t zY^PI}{mnp^WD~$4(cwT2dlZn#6GvUJ zNs+hLA!F4jeaMf#pMU9IYD3G%=$jJk#r>G0fxibwGf$&O!t~?G?pHUP0G{n8Cl`6P zdOM5E`|jJId@CZ!hu{Q`Vn%>v2$`c2z0^&0XW({-#|Ef@06$8o-bCwG2CIXgJJsvo zoIZnQJb?vU13S~kD-+L)OrivRdr`K^2g5<2{fBx`KIo#)Yb z0A%c(wi3zlRaKYg(T(mS&r5dH-LAIMWE0E!7dustixHX4d8NWAwT;a)`@}NjimO#I zi3vJ712hK+1sv*_4%F-5jk6~ok#H8nD;tAL%3yP(AaEXn25@A=Krw2K7<{&q^0Li5 zglmK7g)*Hu@f6!>7_vYkqm&E%81|%(k0b%#fR=jzt>Ci{e(@R9?n5Phm`{&nz;T|8 zw`?J3B+?ph9`mMT0l}g&*9UirXoncJ(6al3(zUTvu{kt2_#RUUBE_A~V7$j5rq5NO zq5-4F3bUZ#XS3z~vjfZzrwe)_&N-aIrT6`lx~?IbC&0G>hAz~vTv1-62Sj`=ML{2= zSYnnL3OOsVBlBKWpsXR7fZ)mCpJ)F5yl=>wO+;+I-q0OGGKG;=S1^r(XvR{qDhwjG ztkF?-7GEBr1YdFY{{5#k8EhueYA{C$^i(=gfAGDl`%0kbAM?(n-QclIu{W;S&WIktfDGZj}Mehr;G1yEgb)o`UwR7HFe?Wp+A|4Ka5ex}shHV=%mW_P_J32%@RfTD&6}|MNHC?vJLIaW zDiwy^F)}iqKWItQHrQy0kGGhM)0th~n&Jzfrs#EtT?3el;5MUGbQ8Cq0 zJ%Fh9uua^sBl=1+1H4`iXYHl}h?n@u2KW(z4+&AJyR7{tMHDeYf5lMX6_r_V(8rdT z)uxbRa-B)AwZxDJ(Q-#>m|BM#mSjGN+@<#R+F;_2FWKLIPdWz!c=NQ24AIH=aF*FZX=`DA18~9{1f$9qY z{qh*h#cR==A}H=#1C!?6KjCCuHrkAb%rKYu&}YwEil_mf<$vyCCx`3r<3t1YOC$K=}5Q9ipQ85X2%6C}ihJsyplw*yN-(b70yi#GVOd zy%NP|+|G#hVHMG6BXoL`4YvSywo#zVM{=APg~OHc!#0-*?J)o(BAl$JT^1} zF@=tMXO8bt(I9cBmDgap;yg(Mbi_eC&c)Sitb_IN3>vY4lo90aS`hgn`SiCE6$1bu z^a6n5s++EsqOS}5EmyB{D+IrLF_}yZ-4F8EF_hEw4Gjr^sxX$Z`*v?#?!r~wcmzZ$ z%^zw}KSe(6lq!fWGReU&Meh+VTo|*aE%y~^7NK0gLO1;Eq@<&3s$+0z#uU3sG`5Lg zj?YBLtM+~Mr2gd1*H>xO2VU;lwTqxR88WFJxf|@6{8gWh(<$(|_ zaOE1DGh(=0ywhT&#(knKL+k5-HZanao#1z2kO#N&T8XW|4v8seHQx3FDD`|MXMcrUhI#UOy%p ztuT4sL1NjJLI%M-$71muFXt6mS$*_G{s~a~9sEJ9peYU;UWpcUDt@;zN%YvjxC5!n z51XOA+{pnG0ILO#Fg!1i1-bdleNLYEH&d%DXa&0h_e13jS-EN89|tPKaHBQqe^Dyo z1B=g_)l$^op&_i_yyDfsIs8&&!-h^jhjqz#Dj6v$DW>a0rXyo0a)mBqOXQ;cPG7f z5(k})g~c763;`T}@S=Q5}DYL^EW5*1R66ilTIYFM~&IaZI zk&z~E`sS`_(}9y7gHEfC!?ZBCqSau#MF^Q3BqgWkS}fjED^UVf8!RUD@OJ=2JrU$W z(s&T8owfjFBTz|Xh0IvntK!Q~+uPd(jxhf}3qOPh8tu9&VF)%CoQccoSI&9AasLlT zs`J&>v5OaeQ?mO@vPx9*`p%b8~rP>v@1zdzya7C6^ ze&)FI$8AB;M38muR+=jClNAcAlqfP9ot=-{tyAv$a5^C38tZbsJA1qYHUZJnoGG36 z%U^BJ12KOalq;o6{SI6@r4h&`I$mt8yr!_R+dpEB*hYsP{uN3m_a9e1=Sht8LNYBe z-_rqB9B6XKX;m2?R#7Glx6(!P{VVi3{5zz)RDbyWPZ7Es@P3>GFn9Op=&yn<$EZ0} z2a%sAx3ayy_yB6kn$l$nG0L9Uit^aAf0&qt(;60bd#UH<+7Eg-Ef}A`6h6`+eHj?z zzR(txG5t6@6so?$=lFrq%$y;+sWA6U)2Q{gKF;=B0|)Wtg>xM0i(J8uO}&R|8_|;< zb*C}qyQk+;>+5n1)H+kT(UB3Q%9gs@QE*OwV=(3+(|c-7x``t~Q>#Tq7 z+uG`_Y>M;DogCZw(LCB}RvkkWEgR$jEXsWKj!D_v}AZ5>Kw82i06K!;h9tliz$ zh0JdFi?EemXp8GhTB@t*gMUpq+96IK>ewKOd0gRQAih4ejaE3LEy-&p_ukMP)6e-K z&ufv39cTSVG?%9O$ay-yRu;R^TQZ{v(y;kHhEpB~st5GOUilghA5o<`Rd{MUDLIdAxqOe`KDske@ndU^ z;kr(9{}%Re=4z6xfk{Uxv-}}XluUPax_z#O&**apS$hlvb+$TTs_QFGs&~ ztyTR~mOc*lqE=p-Os#3k880kJ?`jHBa8kre7u(tgVuN7Z)3&!3HT>qiG|h2kBqXqi zR%+Ygxc&!|E~sU?Qk+#YuZO;VUA>QffmULT?`mVJ?tnhDUT(bwPDez3-H$p&rnkD- zw=ll3Cq3QdFX`Wox4INgt2=&I?G+{gyi#uaO0loke~K2hl23&Tv$l5QHlWUMT`UqZ z{k%t=#&WXfZmYVkvyV!8NIzPm%L5CRvvD;cDCMqG;|Nu4tJu)I^4LX7 z`(~-h$Jf*qn}weT*LVN++D_`9_~s6`*g41D`{`v=RQ7~&bdU5sXrYY7JfR~Xy!ss# zz0Twyv0p2qs=#upM7tIXZr3^;OX7Nc)GK@LJlz3 zMtwTP;IzgATB%`6)Su4fq$Dc0Cv`(=$@_KGOa*Vx{`^+%fN3h7a04dKF_)1sE9#F zTTZ{0hzZyI)dm~l2mwQ}iuK}%XU`HpzWUx&>&y9jHf{U+A1z;xoMw#R6_1D1@Ep7~ zp!&@FyV5-v|L3?$|7P?C8D2gpf)C;O0iNL#l895&dof$GYOpeA_Q%r>|25hN)4g@T zQIfu6%5048kIl-zA~IcX3iW)P&gI$abRm<;HfR{u zW?Tl^QF!^-{J&g)Q!UZL`eU!o?V}e8YHsG@;%=cc1#1YwEA10`*!F0HnL2%+;dhP` z9HE>J2wD*$@A}{NVK|I&_s94vo3DoLz8%9Sx4=g_H?P33S7t^jFNGZAg`$b|&r8|J zzdO)tyy3D@^c>-8e*W7`+RfD+6Kj>P+a;Y$*CnENk^Ae7)E_5-T!@LuZ+KEO4#zv+ zxP$63#2g1GDVspF@*;f}s|lFCYh-DeM1rpA}~>wfouC4EEt z@kAw#d9hvd4(b!<(ii&GfjZoJft=Az=7cJmTaZv!JXD)4BC5LWZD_3g;<_`Y%<_mW zkonHs2X-2n+dR+5feNq+Wh?tRY|U&;&CFhJY{tTC)y_R@)%4gFEB2Frf9 zw;&p1NYh74zYuwk#XGKSP*$Ya+~K95c@Rx=){X?@aZ1*T^^P0Vm9>ftIBq#V)88j6 zCkJ5ezT=-isUf^G3Yw30T3&H{LY{gq;u}~6C~&uEYK`5ts2AfUnWg5ZqCJyOvEF)Dw`DLAq#omm3_(KQFkl zNJc0`yC#x0S4hw6dD5$9jI`<=cR8FdD?lI_Y1y4<((~&A-CtpgCoqkT-njWBFOQOhpFel| zpQGU8RwE@iOoH378jK3wiZx7{dn9Pmc^Ve)Cr7*T>PR%-np{ZrJ9hZo3ilzdzg|DM zqe9Z2gWhrG{*)AM{LaHW?A;7Mx5&{p{wZ!=oG-uvGm%*(Y41$n*eGF?`o*I?Ly`r{49r zmX3CEM?FY#w7*m6{t9kcdme+6bjEH z(O%}v9gAYl@SKi{O};}sQU39|7omtS>B|tTWcIx5v_2ZXqKw0DMi&Q)SBPs$5<&wq&;^s5TNXLB$cS}0Bjd`pz@-^PDAI9NEV^O zB8?KBC)L|5zXwth7&Stdm#X~*{|?n1>HOW9Tydx|)2OAC#V7ae@V?f!CS9H9lLS2a zcS<;J3JO*%yCDzTMnSa@)UYBKd_Ozv^XJov_F5X6%9VXr_MDj+AHR`xvoX|$iJkq+ zpf=_pkcova4BwV(JV)Zk;9t!9@UXY>MNcvzT9@YYQ(I7XKl2lBlIbc3?<@)eGg;jz z`CCLR{qXcehC`3YX|!V+QsbS@&xrT!9qq`nrvzIjlw)*}%1Cczo53a7$#L2RFzovg!w!pDcqCx7MlZPk$<{ zwRm$H8G{4k;*J+&J0HAJ+2@PeX?Es^lG}_!zLb=d4d*Gp7casaS{k-Q?km#%{X#cF z!-MD^m27`wP^W`Umn2@gJfIZNF#eUdp06+_a+xXkKzkBD^h+K~56f*ahJ`UW_hE;1 zzmw&g{D#LmX51!``uYc+di=Wedw2(VZP;qCnG>zMkS3Al{DO*lc8<9%6KW`rQI(<*6Y+%*$Opj0%|D)3j%eo_HH#2KRczeH_anOcXNvc zxaVi5jU^Q=8QBE`wbi->JNUZ8?B4a3@V|5BjdBor$aLTMpx(Hl{+&Bb*eZJW6bXPm zej}!4{c&ev-S#fQaTZYfDl4B1O%2erHb+VTmY6xZ@2j7`{}ScFj70z}cNN1xYX`z+qVn-Nc}RvH(lLk@-0nR`0h%3QIpR; zx>LmT1!@gl+0(KLDR$Yc((@p$@^~`YVLFu{iHS+gOi)Bvn4i`T^(QtK)ced|>Q*IJ z^ke2I3CHye;{Zk8V(JeOpSLMNU4K1CLo&9wfWEQczxohzm>b0lA`_>-Z%)IgCZwmZ z)}^}LlS%Gc@z$4}s#KShKOEe9i%r_#C2QE>E4O4jVvgDsWH)XMq_L4)Hg}gAH!o{P*z{6%Z z{Mz=#1vbVPbP%s5rEGZk`?IlKW#u!TeQeZ1XJY4PEg1i&z530sm;+vyJ{Mm9?CN+E z)JD?H<-dYd`;}6RSl1T69vQs>*QghXiHX))dQLAh-o2y3I5!HPnoH8Z3?_nRLJXrK zE?*Y23CS{JXBy1@GLw;A;^npd=FOW^(_bklDZPq{BKHLTe?6UdG}izB#-%~SM?{f~ zh^!KlY#}qrPKvCokd^ErA}dKkMk;PQMA<4M5?PtqWbZxlyYBBFzs~8Lj-1@R->><6 zUf1L5$u_i;dE&qL?WxexbhmydsS1xuq$^0MLF9x?!TV1s5`kQ2lRsqETS8eFeV<`< zCF?{7vu|DmTb!7?BL_cyldOYkwC)c9lImclFORnQIfm%p^- zXHLj#b{Fl2wcqMPL2KmV@-hgulxqt?c63LNhekxOT`Jv8FCsugNx6C_Qcp*xAtk{> z>A{*J?clAYdp7FBk+r4)Bs|uW`<(MWSbV{jiR4%IGt(Ck$1oT|ulY**uY9XP>6Yt& zpSs89&jV$fUV*UYGd@V1KM^#SSk(|eQeJ}Z87U_p1 zj|il0>tiiH6v~^<_XV!2z2nuhp_tTU6LDJp)n|K~J59N^zWiHrM4w=*3HcF;Z-;~8 zXQ*l)?Up^qFLX&)Hy9^tKD84mry_fLx}HZyswywIzK&zmUbt2Aj5{hd&oVbZ->B|I zRJ6c|8P33Yy{{XSRlD`dZIA414;!kLdjF`a6LIDaZ=5`lpq^M#B4bjPk#X1G&)>w# zs_t~cR?vTpf128bSwz-Pw4{{&kv32>G)&(BK|l@x=$Ec6Q4J1;=6ZHFZmoSg{*rh7 z#ke4c@C`#pM?sxT9p-@U`YT>b$u{~TMowo(#IsvPLbaGX^)#5ozq1lt!tN}aZ?j!r z-k-TaP+J)r3qWfjsq{&#a{TDZYRlL`2~UX)e?l*{$lVSW_&Jr^&t5{^>qU0ijV-w; zr_~uxSbL+r`8G(ry`?e{yP5yBC66s-@Cd!6F=vX}>G=&U*DG27F?Ksn3|sP^(RY~C z5ryr)>4x2nt}|F}>CY1qy6knIU2(8Wmb!2mdN(3_M@c-e%9xmXV;`P zj-g}cG(M=}u|-eI7hPl^$-Oc0pq=xAr*Y1!U3hsyLT0mNzV*%tmz|tW95JNN)=;1g z<396)WQ?kV5u1Jz>#CrU%*B)=&)2qBH%qn~7$z32Q*{{%QO2e|dg0Yj&7g>@K)k0r zWv*+>eN>z!4C3js^0P*M=xP|K*W!kCJmXVaTic5$-P@+7gh4%R!-UtZFQOn3*h|P{ zC%CB5ilA67E+O{JVMZozxb6p!qNIEL-h+Qr-CQ1}k+sQ&UHbA?xgtST!%|kOjXib3 zyS+MAnI&@%aoAQks%lB7-mEWL`E)9EVyGh0_kmtvOIyK^=9y2n=ax6Q>fRM zTG&yq;0lB2m5H5uf@I&meZh3}b-y!<*H#sFWG%)H5`$9fj(NcujN*A#r0$OdqLW=y zUHwh2(kE*+J6ZYaSqjC>o}Qa{g;WggG^yvK@~yqEo#fHrGjN*{MJB7jovC}(!Hie+ zpkExwUT9KCnA>R8ZT+pg%X7EqKH&k{p@9MU?t%s+yD}a1ERlX|eznp+ljN}a#P#UW!dw4G5=BRty5~Vu+aj-`qc6<8OUukOYj1QXp#lj~ zn)fKra@!M+|ANj53%|G4?UV0*&i3=YpP%dQ=Wj}qNM&VxMaNkwOy#ys486ZY?!o`y zJBe{p*spY5%7ujk^!%(#Coi4eCpQ-0%=G4v2p&?c?#`wJEEpfWcTQfpa_SKMf{*{! z&vbXq5wsAGT<|z&^o>l@z~IZ$xLuyp_@@$a{;fARTZ%#%C6sKhGT}mR$&%+_wueVo z{)2P(jgk^kQr6tOT!yh9wYA@xb7?WS)09Q{Z?L6Xvgm5-UDnoi&KuUyXwcNtyF4rU z_+^sKf!sx-pgl>-6`ChgTd9=0o@s|r>5%fXV?@l+M{Q+_V7?{t4uH-a|tf6i34OyBYE%g%p-)MNX)?@5>w!XpG-jUp*eJ!O-bp90uAk#LfVeCXH%|P;(`CX zZg_@2cX;&mE9+FebWi@ogjMpD_`s~JS8eI#?PJl&waFwhG8^~Co6Y`X3V0)1v!X1J zqd@6Bc%%BG?$;>8c&uZ|#J}JrAYjc|0z#uM$-DP3e637UsR;@lt(ek&o zb|%eHNrr8vmN#(y(~0WsNa6QUju4KNHr`L%f*+P2S8IEl7WCxRYoFuI-r1hqBY${4 zZ-&tm%rnmv6%|c|_IzzO%)b3MbcgNaze5}x)G{(|iw$Ce`@QJcYI@5kn)t&#)<@c3 zi`&O6{?*L+U~wrskpz7NiuXM&)dQd3Qj|o1Me$0~$7F5US5(vUS^)UcroDd<5NkLRZaOpd`yfzLN9Hstz{h+ zT<_oQ3wawMac49+W6P3J!}7nk@_r}7=^U5qoW0hJD6q?YX>FCW@r(_!=L;FVyCCAV zVSnb&mXE9J;KiHWh1WE0)bW+SHvSu`c;duVN3OF?p2VK5Ezy>o2r@&jc?x-d{|D|a ztQTeo0%QN)4k|6JM$7~)(Z zAHGZliW1aqmtGCvM0)qO=B{0T#ySN_kPY-Zv%8X@Zd4~OL0TLU$8Ofx>kE}$>7$0C z>GaIZkuScy#z~YBFJAa07@F&3ZLnQ`s z*q7zPd$qJZnDC{kT&g4tGvJg#Ht{EQw6s& zz7Wdxi{|-l-7j9d9u&M_+o5b=!1U&gFaL!LgVoEi8HVM4Kx#uFk(_^)nOQAl1rR2M zif`SAX;0-wMzS9;s^83`_-0tzXJo+ zSX4eX7e1J0h2C%}rGSr(EdtJ}ys;raig?d|>osWRqpF#`Pk{IQ33GF@JLSv!A~-_+u1t&JsvxUo7>4$hHSf+gen?C!r^wvpVmz=eLd=}4XP)(2w*S(oCd zxA<>!c5XDolDL)XXJdiy{*-OrAjUjbd)m<0)Ku|$$8Ffl{eyzq*~)38uoO3Ys%vT0 zPw6dck3NdKWsPIzS24%l%Ac8kOu|~SQy1QbxUZZrZDjf>ryW*d`~PG5oPa>3R7Kd4 z@=A0#9twmZJof&5oA2MhYpHnswoCB4eDLP2?u9npAlH$$s25+}({_AxrCt2%`F&v| z{cxb%(iDBgMga5t@^~kwp0=>XhIzu7B;9N#NI$}b(%B%|*qvDVglD!yFe0^uBXy5N zyPVc8-mSS?Q&UqNAMAO^R%(pz-VKg&IbC35n0-q66tzi#oqnTB-;N?q9>^A^$pJWaK+}n9+FTbt+G~D!ntmm&`@1&tt!G zByg<~E^2C%x6^dsEBTcWnOqtOXh2ar9Qe1GB;NtZb`}Y}4Xs2&moM`BO~qH1#XQkGTO3n!-kB!!6A>q35}I zc)nG4Me60H%#Wuqr&h)`k8ZZMn}gJU@@#UoiJ4g^CqH|CLeRp3!_C*F(eu@&5TdX+ z1&|E9FAX08xNO>XMzB79{*b{rxO-Qzo~UUQszT`e;+}Zr%IGHVGcV!1Sly zZw;ksX+n{oushmN$KrTWiORjMH9DMNmj!Iqp3gc&nT$$T~{UAx*7L2PpspJ z6uNMyG22uu+@xI(2JZI8h&(x}eoNEuQ9OUPbF{Q!jcsF3 zA|=$A@YT)D6wm(43~_;S5894fud2cxK_WCTGz3anpSqr2V3h7@50BD&&Nkgs6lU7m zLP0y`T-uS5Yh+GC6Oog+P~zGzyzjrM&7P&I#m|9hYD{f?a;a>otrEIh497*u`LeHi zEdD%@mX=2BYW;MeZmi{`6-jsg1Q8=`Kn-S7D|s(Bo&NGh9c&e7K2C|WZ8v2L>_ zvetCNxGL^zpDW*rCLwbmZ`aP(s-95W&_9Zw8P#+*8}^88np{4Ky=*cE=Yi|h4xi!tiaul+fa5Gj*X8?=z7kJ+a?`fbkex%b(}3@ zVuC8DYO06!OYx$V@pP9e9o=#8?{^NE%%8|ob10T(NsEz&Q=S-j0*y~FM0U`CaV6OF zmPDgtmiAK^cC0H`t|0Sb7xdk*2Ja46d>j|Y2rz~jNoPqfFk_aQ)n>VB`rVZEwZ5=Kjg_@E>ax7}r!gIm z98Ys|%+ul?fpZncTC$w$!C)4kCh?`C&=n%fo@0kN?R zK;Tw<|2`J(EXng3A}#lo?{=ecLMqG8V?a3p*#e4@sGW5E{9cgS~p$M%wgli84UYctb=6Cm zbNCU-85xH_O84;e1Xxug%U5;0{^w72aHr9wN=r{C(lC%m0a+>G46aSFcRM~@ifli3 zt^!JFD2|BUVp?iLuJ*xMb3TZFgH%lHgwtW(&N=9v46QLi| z_|?SFo^6wR(XGL4vf_`_mjXBa|dsux6YO*Zuwbx7^(|rJ;ji54|NZKEBtg z9urO4KRh}Ltjy7yw{DFXSU4L~b15=JU-^C8H#R;#RF3scMn*8SrbD1FB(ya|HBsv|hbbI=Q6eH898+D>x<%|NTph?}5X*7SsbE znauzfgL-yga`FdU8bnwU5KfpqY>~5VwZQ~}FX>U0T9S_D6c$TkMp59<-pp^pRx*ut@> zwsv)5tkX$)Tm+yQ&zYK*mdGWhmvB2z0#-6B?6eTzpA1*TFBtTn;>1EI6@Qa@A9Z!2 z&K2#AXi;Zwd@jsHVmu0#Mik_UbQ(~xRQO6C%dwu6l#GX9Qow!XF8jO|8p#I3pkE_= zZ5Qy32M!)2!Ull9RUXVQ6iuK#0q8H}*+h8UI}JuA%Ztpe&Q5*^R`yxD3ii5HK?<^zRjE$(AY?d_*oSQ3@ugoK0;gmBy3yyl%!#4mgm zYaIYYbJYxXgj-@XM7=A&U__tOO&uM1D=ThXL~eh5ykA*O3?F=^uRKhP+eW$o!C5R= z>7t^{!wGd~2q#CLPDM{Y3!?w4_3wAP&^ra|^$_Lpz0o8cv0dMz7jkdDzj;4ZYos%h zEGmBe3)-0MKyD?SJBahmTxD%qb#wmmhvxex9MTnw!MV8tP>m=fZbwl`$?|YZx|g_e zs#YCXT0}i73JDm`Lr7}EyL}Nm2bKUDgbM2F;a$vrG2AV9kY;R{hCg#mYLG@Pg_Ibp zZa8n`Zr@I9KJp&(ix@J4m@C*|+o+>eBj0oo)Z#?7*&&$c#;%QNpb5xbg$W;+@t~Xe zVbcQ}>y1a&+qW%=|A^o$bdT!{2Y}(Wzkgrn`Bi|wxQBJ%Sp)V1a(abzaZsM%$ZG+1 zEM&5Ko0=>A?9`yfsB4u>N2N^a#`2vNq27+2lP$%iGJjXfZWgh>Eor!=xaw$SVZ>_t zf?x$@5>((oh30%&gc(^wM~5hbZ)%SsD?83_yaxh$HXfdX)@Y=-DyygvnX33iuYv3c zcVd$A0>ys=;!p+YnatlTH3efjcU4h|03pwLl0_+2)Jh>U{` zi||YtWEV68H1za33DXx8%!}_Y#Ks*wZ~)sA=*!ZbJNVzRgNth2or$6(1lOO7i+A@= zPyfU|jQ#TEbAnYy@6StkeP}e-38_8WxZn07v%sQBMyZ*T$Uq`G+BR1l6hh&yI|8pB z%!-%{cDamQFZ7sE_yz=+E07OMCj|Mj@Qdk)E+YbMb+x9wU3YxoDBOau7a+pk;srqf zSq&?Xkb8o*1WMfzFf?!la$_Q38;2u>XiKOo!Crl{$O-m4%7w*6zhke=LkJsUmonbg zh)E=ynDsp0T3}7euGz)X6j4s6UB|t1ec05YkvlLe{FgoP!2dl>{`>n4CLR3wfm7@1 zh34Ut?vZXKGi>dya!n;^NWj`Ji6-YL^K1o z2<}EkMn=f4+pRLM>G}hjf$_<`9uyQ52xk*WxNvKhUiyPK*IDesC*ihq?Kw|O9ddL2 zLXVA-k_wk2tYkQ+UA)(iZmuOA1H%x&_X!CJb^Fr2#8i}(IXO9hjfu?v=_I#RwzJ?M z$i+PW_u!g3^0W3!QFonuac|Y=^>*g*PFb>pmR=MWEjiL?;t#|;1NbI0Gt)uyKiG-` zkx7M>$|^7|`D~@7atc;r3~d}wuucr6?LTZBU%!3RZl;MfLsTG+TW!)|g9HtE{~obUgw$Zo z7_q;J_XBx9xKrP%s{C-d#UU-}?i1s0y{|BI@jQO5)mKzJ#4?ihj`r9wU=6g$LqLOp z%Pc)|+Ul()M}$2d5c`*m84Jr>8kb|&uSHc{>p;Zd8;AOsv`+<`XU~q}7z*1OaqEsW zU!G3m(%1g9&!Eu34>ES17St=@+S8$yQ_X){XhsUjN;uqa!~{G{@!IS${E0-6jx84;so^eCa`ZQ>Y42)5w+^w_t=+{IPMaal`Tb+QbIp! ztX@I2;Aet+NH{Tmhz*cDY_OIuYJdD7o?EbmbDLy}Uya5Z0!M@(Sa~5i)qs`bs6i3H zA1Eh-Q)a}ZPqF|FzwE>y?5q#a-WweJilaV5h8XT@TH4xFa6w_iJ#GUU5-(2P8uK@J z;HARWyfoP!2G22UJwy{L?mJ*C`e9GN0M~YkdG(5gI*^l#OWn<`wdUt*2CG`mW${RY zI<#!?zN3B&|lmRa4>y@ z!@~IqT6?%U0Foh=*g<%M?_=bS4o3taXBkWHh<64UUqSXuO5a@5PeCL*ynDpBNGu{L zA3xIU-tD`u<^VhOepgpl?#Di)Fe1Ux_zVCx&ajoD;$oiNPpscACOk|_;|3JZuei9l zc`>)BC+;;{s&|s-NADdk zIN-43{8rSmv`$~9f*BNkTdmOC&aN(QZ*o`aMOj84A0O~G&EPAo6T&WZeLAM^MFSCT ziRXvW27ih}-r$8FrUIZS7P_z6?)E`zlNMS6RM9h*Xe3=`PTYdpdRR!ECGDTw@UeCc zjg=`)(S1eo9yH=nD@U&mM;==kPaWy0EnTiTs2(X^{qoUT*s+VUIXz=RY07)ksfmTA zGvqur0bD1UB1v|IU6^ehfL#`B9?MgS@U;-#IN01m+=R}j)I*F1_TL{1mWho|zlF?0 zeia;gwiC16|7Ew?!;y_sS}65`;%UAxTwB+nAM@l7$=u)VreFCnndmUnC~?7a;Zq?d}Q*ey)t5tH4OH%zxU3_9+Vm{^HGo( z%nZ5eM<$D7aAdC_3J1g`@3oY7nR*hScVy<~=ICo*#ASz;mi7>nI3nYYqmBijrKW8e z?$#)Ys1P@v>WkuCM8Nxv#+>Sn8Sq_kC0qc<3K23gmoDvcUzsw(^s(Y2TNA7q$|imZ z2gMpB>d+fr$qA*Wqk~_65wHKVy)S5SY174c9z@R@?$a?heOs5kf#Sz`g&mF`_=_c) z){Ibs!u{E>a8yD`ztn!nze{M&vOWxUMr`fT=o~;x3qK$QyzwIL8GsGz|cNZ el40>^hb(F4h0H-AV=fZ>Qo4LqE=%UN&;J2xlyOb~ literal 41510 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 B#y0=} From f1ba3975434558736974f980ad75b91bcb430b86 Mon Sep 17 00:00:00 2001 From: Alex Haiut Date: Tue, 14 Dec 2021 20:03:26 +0200 Subject: [PATCH 77/93] make description of mizu config options public (#527) --- docs/CONFIGURATION.md | 91 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 docs/CONFIGURATION.md diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md new file mode 100644 index 000000000..ad9c64889 --- /dev/null +++ b/docs/CONFIGURATION.md @@ -0,0 +1,91 @@ +![Mizu: The API Traffic Viewer for Kubernetes](../assets/mizu-logo.svg) +# Configuration options for Mizu + +Mizu has many configuration options and flags that affect its behavior. Their values can be modified via command-line interface or via configuration file. + +The list below covers most useful configuration options. + +### Config file +Mizu behaviour can be modified via YAML configuration file located at `$HOME/.mizu/config.yaml`. + +Default values for the file can be viewed via `mizu config` command. + +### Applying config options via command line +To apply any configuration option via command line, use `--set` following by config option name and value, like in the following example: + +``` +mizu tap --set tap.dry-run=true +``` + +Please make sure to use full option name (`tap.dry-run` as opposed to `dry-run` only), incl. section (`tap`, in this example) + +## General section + +* `agent-image` - full path to Mizu container image, in format `full.path.to/your/image:tag`. Default value is set at compilation time to `gcr.io/up9-docker-hub/mizu/:` + +* `dump-logs` - if set to `true`, saves log files for all Mizu components (tapper, api-server, CLI) in a zip file under `$HOME/.mizu`. Default value is `false` + +* `image-pull-policy` - container image pull policy for Kubernetes, default value `Always`. Other accepted values are `Never` or `IfNotExist`. Please mind the implications when changing this. + +* `kube-config-path` - path to alternative kubeconfig file to use for all interactions with Kubernetes cluster. By default - `$HOME/.kubeconfig` + +* `mizu-resources-namespace` - Kubernetes namespace where all Mizu-related resources are created. Default value `mizu` + +* `telemetry` - report anonymous usage statistics. Default value `true` + +## section `tap` +* `namespaces` - list of namespace names, in which pods are tapped. Default value is empty, meaning only pods in the current namespace are tapped. Typically supplied as command line options. + +* `all-namespaces` - special flag indicating whether Mizu should search and tap pods, matching the regex, in all namespaces. Default is `false`. Please use with caution, tapping too many pods can affect resource consumption. + +* `daemon` - instructs Mizu whether to run daemon mode (where CLI command exits after launch, and tapper & api-server pods in Kubernetes continue to run without controlling CLI). Typically supplied as command-line option `--daemon`. Default valie is `false` + +* `dry-run` - if true, Mizu will print list of pods matching the supplied (or default) regex and exit without actually tapping the traffic. Default value is `false`. Typically supplied as command-line option `--dry-run` + +* `proxy-host` - IP address on which proxy to Mizu API service is launched; should be accessible at `proxy-host:gui-port`. Default value is `127.0.0.1` + +* `gui-port` - port on which Mizu GUI is accessible, default value is `8899` (stands for `8899/tcp`) + +* `regex` - regular expression used to match pods to tap, when no regex is given in the command line; default value is `.*`, which means `mizu tap` with no additional arguments is runnining as `mizu tap .*` (i.e. tap all pods found in current workspace) + +* `no-redact` - instructs Mizu whether to redact certain sensitive fields in the collected traffic. Default value is `false`, i.e. Mizu will replace sentitive data values with *REDACTED* placeholder. + +* `ignored-user-agents` - array of strings, describing HTTP *User-Agent* header values to be ignored. Useful to ignore Kubernetes healthcheck and other similar noisy periodic probes. Default value is empty. + +* `max-entries-db-size` - maximal size of traffic stored locally in the `mizu-api-server` pod. When this size is reached, older traffic is overwritten with new entries. Default value is `200MB` + + +### section `tap.api-server-resources` +Kubernetes request and limit values for the `mizu-api-server` pod. +Parameters and their default values are same as used natively in Kubernetes pods: + +``` + cpu-limit: 750m + memory-limit: 1Gi + cpu-requests: 50m + memory-requests: 50Mi +``` + +### section `tap.tapper-resources` +Kubernetes request and limit values for the `mizu-tapper` pods (launched via daemonset). +Parameters and their default values are same as used natively in Kubernetes pods: + +``` + cpu-limit: 750m + memory-limit: 1Gi + cpu-requests: 50m + memory-requests: 50Mi +``` + + +-- + +* `analsys` - enables advanced analysis of collected traffic in the UP9 coud platform. Default value is `false` + +* `upload-interval` - in the *analysis* mode, push traffic to UP9 cloud every `upload-interval` seconds. Default value is `10` seconds + +* `ask-upload-confirmation` - request user confirmation when uploading tapped data to UP9 cloud + + +## section `version` +* `debug`- print additional version and build information when `mizu version` command is invoked. Default value is `false`. From a830bbe0238c26ea801fb63bbf7adead5431bb3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Wed, 15 Dec 2021 12:26:18 +0300 Subject: [PATCH 78/93] Fix the glitch (#529) * Fix the glitch * Bring back the functionality to "Fetch old records" and "Snap to bottom" buttons --- ui/src/components/EntriesList.tsx | 17 ++++++++++++----- ui/src/components/TrafficPage.tsx | 27 ++++++++++----------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/ui/src/components/EntriesList.tsx b/ui/src/components/EntriesList.tsx index 14fff2e87..b5da7736e 100644 --- a/ui/src/components/EntriesList.tsx +++ b/ui/src/components/EntriesList.tsx @@ -26,14 +26,15 @@ interface EntriesListProps { updateQuery: any; leftOffTop: number; setLeftOffTop: (leftOffTop: number) => void; - reconnectWebSocket: any; isWebSocketConnectionClosed: boolean; - closeWebSocket: any; + ws: any; + openWebSocket: (query: string, resetEntries: boolean) => void; + leftOffBottom: number; } const api = new Api(); -export const EntriesList: React.FC = ({entries, setEntries, query, listEntryREF, onSnapBrokenEvent, isSnappedToBottom, setIsSnappedToBottom, queriedCurrent, setQueriedCurrent, queriedTotal, startTime, noMoreDataTop, setNoMoreDataTop, focusedEntryId, setFocusedEntryId, updateQuery, leftOffTop, setLeftOffTop, reconnectWebSocket, isWebSocketConnectionClosed, closeWebSocket}) => { +export const EntriesList: React.FC = ({entries, setEntries, query, listEntryREF, onSnapBrokenEvent, isSnappedToBottom, setIsSnappedToBottom, queriedCurrent, setQueriedCurrent, queriedTotal, startTime, noMoreDataTop, setNoMoreDataTop, focusedEntryId, setFocusedEntryId, updateQuery, leftOffTop, setLeftOffTop, isWebSocketConnectionClosed, ws, openWebSocket, leftOffBottom}) => { const [loadMoreTop, setLoadMoreTop] = useState(false); const [isLoadingTop, setIsLoadingTop] = useState(false); const scrollableRef = useRef(null); @@ -118,7 +119,7 @@ export const EntriesList: React.FC = ({entries, setEntries, qu title="Fetch old records" className={`${styles.btnOld} ${!scrollbarVisible && leftOffTop > 0 ? styles.showButton : styles.hideButton}`} onClick={(_) => { - closeWebSocket(); + ws.close(); getOldEntries(); }}> down @@ -127,7 +128,13 @@ export const EntriesList: React.FC = ({entries, setEntries, qu title="Snap to bottom" className={`${styles.btnLive} ${isSnappedToBottom && !isWebSocketConnectionClosed ? styles.hideButton : styles.showButton}`} onClick={(_) => { - reconnectWebSocket(); + if (isWebSocketConnectionClosed) { + if (query) { + openWebSocket(`(${query}) and leftOff(${leftOffBottom})`, false); + } else { + openWebSocket(`leftOff(${leftOffBottom})`, false); + } + } scrollableRef.current.jumpToBottom(); setIsSnappedToBottom(true); }}> diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index 76fe8fd47..f9264588d 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -224,23 +224,15 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS // eslint-disable-next-line }, [focusedEntryId]); - const closeWebSocket = () => { - ws.current.close(); - } - - const reconnectWebSocket = () => { - if (query) { - openWebSocket(`(${query}) and leftOff(${leftOffBottom})`, false); - } else { - openWebSocket(`leftOff(${leftOffBottom})`, false); - } - } - const toggleConnection = () => { if (connection === ConnectionStatus.Connected) { - closeWebSocket(); + ws.current.close(); } else { - reconnectWebSocket(); + if (query) { + openWebSocket(`(${query}) and leftOff(${leftOffBottom})`, false); + } else { + openWebSocket(`leftOff(${leftOffBottom})`, false); + } } } @@ -266,7 +258,7 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const onSnapBrokenEvent = () => { setIsSnappedToBottom(false); if (connection === ConnectionStatus.Connected) { - closeWebSocket(); + ws.current.close(); } } @@ -313,9 +305,10 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS updateQuery={updateQuery} leftOffTop={leftOffTop} setLeftOffTop={setLeftOffTop} - reconnectWebSocket={reconnectWebSocket} isWebSocketConnectionClosed={connection === ConnectionStatus.Closed} - closeWebSocket={closeWebSocket} + ws={ws.current} + openWebSocket={openWebSocket} + leftOffBottom={leftOffBottom} />
From 0a915b3fe7152263e8da80df8a65653cd761d943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Wed, 15 Dec 2021 12:28:46 +0300 Subject: [PATCH 79/93] Fix the CSS issue in `Queryable` component for `src.name` field on heading mode (#530) --- ui/src/components/EntryListItem/EntryListItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/components/EntryListItem/EntryListItem.tsx b/ui/src/components/EntryListItem/EntryListItem.tsx index 0b9a860a4..60c0f5db5 100644 --- a/ui/src/components/EntryListItem/EntryListItem.tsx +++ b/ui/src/components/EntryListItem/EntryListItem.tsx @@ -161,7 +161,7 @@ export const EntryItem: React.FC = ({entry, focusedEntryId, setFocus displayIconOnMouseOver={true} flipped={true} style={{marginTop: "-4px", overflow: "visible"}} - iconStyle={{marginTop: "4px", left: "68px", position: "absolute"}} + iconStyle={!headingMode ? {marginTop: "4px", left: "68px", position: "absolute"} : {marginTop: "4px", left: "calc(50vw + 41px)", position: "absolute"}} > Date: Wed, 15 Dec 2021 14:52:49 +0200 Subject: [PATCH 80/93] API server stores tappers status (#531) --- agent/main.go | 60 +---- agent/pkg/controllers/status_controller.go | 28 ++- agent/pkg/providers/status_provider.go | 11 +- agent/pkg/routes/status_routes.go | 1 + cli/apiserver/provider.go | 19 +- cli/cmd/tapRunner.go | 264 +++++---------------- shared/kubernetes/eventWatchHelper.go | 13 +- shared/kubernetes/mizuTapperSyncer.go | 96 ++++++-- shared/kubernetes/provider.go | 26 +- shared/kubernetes/utils.go | 3 +- shared/models.go | 12 +- 11 files changed, 243 insertions(+), 290 deletions(-) diff --git a/agent/main.go b/agent/main.go index ef2998f00..a9d94f998 100644 --- a/agent/main.go +++ b/agent/main.go @@ -22,7 +22,6 @@ import ( "path" "path/filepath" "plugin" - "regexp" "sort" "syscall" "time" @@ -273,8 +272,6 @@ func hostApi(socketHarOutputChannel chan<- *tapApi.OutputChannelItem) { if _, err := startMizuTapperSyncer(ctx, kubernetesProvider); err != nil { logger.Log.Fatalf("error initializing tapper syncer: %+v", err) } - - go watchMizuEvents(ctx, kubernetesProvider, cancel) } utils.StartServer(app) @@ -447,7 +444,7 @@ func startMizuTapperSyncer(ctx context.Context, provider *kubernetes.Provider) ( MizuApiFilteringOptions: config.Config.MizuApiFilteringOptions, MizuServiceAccountExists: true, //assume service account exists since daemon mode will not function without it anyway Istio: config.Config.Istio, - }) + }, time.Now()) if err != nil { return nil, err @@ -477,6 +474,16 @@ func startMizuTapperSyncer(ctx context.Context, provider *kubernetes.Provider) ( api.BroadcastToBrowserClients(serializedTapStatus) providers.TapStatus.Pods = tapStatus.Pods providers.ExpectedTapperAmount = tapPodChangeEvent.ExpectedTapperAmount + case tapperStatus, ok := <-tapperSyncer.TapperStatusChangedOut: + if !ok { + logger.Log.Debug("mizuTapperSyncer tapper status changed channel closed, ending listener loop") + return + } + if providers.TappersStatus == nil { + providers.TappersStatus = make(map[string]shared.TapperStatus) + } + providers.TappersStatus[tapperStatus.NodeName] = tapperStatus + case <-ctx.Done(): logger.Log.Debug("mizuTapperSyncer event listener loop exiting due to context done") return @@ -486,48 +493,3 @@ func startMizuTapperSyncer(ctx context.Context, provider *kubernetes.Provider) ( return tapperSyncer, nil } - -func watchMizuEvents(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { - // Round down because k8s CreationTimestamp is given in 1 sec resolution. - startTime := time.Now().Truncate(time.Second) - - mizuResourceRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", kubernetes.MizuResourcesPrefix)) - eventWatchHelper := kubernetes.NewEventWatchHelper(kubernetesProvider, mizuResourceRegex) - eventChan, errorChan := kubernetes.FilteredWatch(ctx, eventWatchHelper, []string{config.Config.MizuResourcesNamespace}, eventWatchHelper) - - for { - select { - case wEvent, ok := <-eventChan: - if !ok { - eventChan = nil - continue - } - - event, err := wEvent.ToEvent() - if err != nil { - logger.Log.Errorf("error parsing Mizu resource event: %+v", err) - cancel() - } - - if startTime.After(event.CreationTimestamp.Time) { - continue - } - - if event.Type == v1.EventTypeWarning { - logger.Log.Warningf("resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note) - } - case err, ok := <-errorChan: - if !ok { - errorChan = nil - continue - } - - logger.Log.Errorf("error in watch mizu resource events loop: %+v", err) - cancel() - - case <-ctx.Done(): - logger.Log.Debugf("watching Mizu resource events loop, ctx done") - return - } - } -} diff --git a/agent/pkg/controllers/status_controller.go b/agent/pkg/controllers/status_controller.go index 305033ace..b86c1a56e 100644 --- a/agent/pkg/controllers/status_controller.go +++ b/agent/pkg/controllers/status_controller.go @@ -24,14 +24,19 @@ func HealthCheck(c *gin.Context) { } } + tappers := make([]shared.TapperStatus, len(providers.TappersStatus)) + for _, value := range providers.TappersStatus { + tappers = append(tappers, value) + } + response := shared.HealthResponse{ - TapStatus: providers.TapStatus, - TappersCount: providers.TappersCount, + TapStatus: providers.TapStatus, + TappersCount: providers.TappersCount, + TappersStatus: tappers, } c.JSON(http.StatusOK, response) } - func PostTappedPods(c *gin.Context) { tapStatus := &shared.TapStatus{} if err := c.Bind(tapStatus); err != nil { @@ -52,6 +57,23 @@ func PostTappedPods(c *gin.Context) { } } +func PostTapperStatus(c *gin.Context) { + tapperStatus := &shared.TapperStatus{} + if err := c.Bind(tapperStatus); err != nil { + c.JSON(http.StatusBadRequest, err) + return + } + if err := validation.Validate(tapperStatus); err != nil { + c.JSON(http.StatusBadRequest, err) + return + } + logger.Log.Infof("[Status] POST request, tapper status: %v", tapperStatus) + if providers.TappersStatus == nil { + providers.TappersStatus = make(map[string]shared.TapperStatus) + } + providers.TappersStatus[tapperStatus.NodeName] = *tapperStatus +} + func GetTappersCount(c *gin.Context) { c.JSON(http.StatusOK, providers.TappersCount) } diff --git a/agent/pkg/providers/status_provider.go b/agent/pkg/providers/status_provider.go index bcc4c3f6e..85fe8793b 100644 --- a/agent/pkg/providers/status_provider.go +++ b/agent/pkg/providers/status_provider.go @@ -15,12 +15,13 @@ import ( const tlsLinkRetainmentTime = time.Minute * 15 var ( - TappersCount int - TapStatus shared.TapStatus - authStatus *models.AuthStatus - RecentTLSLinks = cache.New(tlsLinkRetainmentTime, tlsLinkRetainmentTime) + TappersCount int + TapStatus shared.TapStatus + TappersStatus map[string]shared.TapperStatus + authStatus *models.AuthStatus + RecentTLSLinks = cache.New(tlsLinkRetainmentTime, tlsLinkRetainmentTime) ExpectedTapperAmount = -1 //only relevant in daemon mode as cli manages tappers otherwise - tappersCountLock = sync.Mutex{} + tappersCountLock = sync.Mutex{} ) func GetAuthStatus() (*models.AuthStatus, error) { diff --git a/agent/pkg/routes/status_routes.go b/agent/pkg/routes/status_routes.go index 505e0b5f5..dd601213d 100644 --- a/agent/pkg/routes/status_routes.go +++ b/agent/pkg/routes/status_routes.go @@ -11,6 +11,7 @@ func StatusRoutes(ginApp *gin.Engine) { routeGroup.GET("/health", controllers.HealthCheck) routeGroup.POST("/tappedPods", controllers.PostTappedPods) + routeGroup.POST("/tapperStatus", controllers.PostTapperStatus) routeGroup.GET("/tappersCount", controllers.GetTappersCount) routeGroup.GET("/tap", controllers.GetTappingStatus) diff --git a/cli/apiserver/provider.go b/cli/apiserver/provider.go index dee6c225e..dc5dff5e9 100644 --- a/cli/apiserver/provider.go +++ b/cli/apiserver/provider.go @@ -42,7 +42,7 @@ func (provider *Provider) TestConnection() error { retriesLeft := provider.retries for retriesLeft > 0 { if _, err := provider.GetHealthStatus(); err != nil { - logger.Log.Debugf("[ERROR] api server not ready yet %v", err) + logger.Log.Debugf("api server not ready yet %v", err) } else { logger.Log.Debugf("connection test to api server passed successfully") break @@ -81,6 +81,23 @@ func (provider *Provider) GetHealthStatus() (*shared.HealthResponse, error) { } } +func (provider *Provider) ReportTapperStatus(tapperStatus shared.TapperStatus) error { + tapperStatusUrl := fmt.Sprintf("%s/status/tapperStatus", provider.url) + + if jsonValue, err := json.Marshal(tapperStatus); err != nil { + return fmt.Errorf("failed Marshal the tapper status %w", err) + } else { + if response, err := provider.client.Post(tapperStatusUrl, "application/json", bytes.NewBuffer(jsonValue)); err != nil { + return fmt.Errorf("failed sending to API server the tapped pods %w", err) + } else if response.StatusCode != 200 { + return fmt.Errorf("failed sending to API server the tapper status, response status code %v", response.StatusCode) + } else { + logger.Log.Debugf("Reported to server API about tapper status: %v", tapperStatus) + return nil + } + } +} + func (provider *Provider) ReportTappedPods(pods []core.Pod) error { tappedPodsUrl := fmt.Sprintf("%s/status/tappedPods", provider.url) diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 4efd9cd4a..d4fa44ce7 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -33,6 +33,9 @@ import ( const cleanupTimeout = time.Minute type tapState struct { + startTime time.Time + targetNamespaces []string + apiServerService *core.Service tapperSyncer *kubernetes.MizuTapperSyncer mizuServiceAccountExists bool @@ -42,7 +45,7 @@ var state tapState var apiProvider *apiserver.Provider func RunMizuTap() { - startTime := time.Now() + state.startTime = time.Now() mizuApiFilteringOptions, err := getMizuApiFilteringOptions() apiProvider = apiserver.NewProvider(GetApiServerUrl(), apiserver.DefaultRetries, apiserver.DefaultTimeout) @@ -92,16 +95,16 @@ func RunMizuTap() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // cancel will be called when this function exits - targetNamespaces := getNamespaces(kubernetesProvider) + state.targetNamespaces = getNamespaces(kubernetesProvider) - serializedMizuConfig, err := config.GetSerializedMizuAgentConfig(targetNamespaces, mizuApiFilteringOptions) + serializedMizuConfig, err := config.GetSerializedMizuAgentConfig(state.targetNamespaces, mizuApiFilteringOptions) if err != nil { logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Error composing mizu config: %v", errormessage.FormatError(err))) return } if config.Config.IsNsRestrictedMode() { - if len(targetNamespaces) != 1 || !shared.Contains(targetNamespaces, config.Config.MizuResourcesNamespace) { + if len(state.targetNamespaces) != 1 || !shared.Contains(state.targetNamespaces, config.Config.MizuResourcesNamespace) { logger.Log.Errorf("Not supported mode. Mizu can't resolve IPs in other namespaces when running in namespace restricted mode.\n"+ "You can use the same namespace for --%s and --%s", configStructs.NamespacesTapName, config.MizuResourcesNamespaceConfigName) return @@ -109,18 +112,19 @@ func RunMizuTap() { } var namespacesStr string - if !shared.Contains(targetNamespaces, kubernetes.K8sAllNamespaces) { - namespacesStr = fmt.Sprintf("namespaces \"%s\"", strings.Join(targetNamespaces, "\", \"")) + if !shared.Contains(state.targetNamespaces, kubernetes.K8sAllNamespaces) { + namespacesStr = fmt.Sprintf("namespaces \"%s\"", strings.Join(state.targetNamespaces, "\", \"")) } else { namespacesStr = "all namespaces" } logger.Log.Infof("Tapping pods in %s", namespacesStr) + if err := printTappedPodsPreview(ctx, kubernetesProvider, state.targetNamespaces); err != nil { + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Error listing pods: %v", errormessage.FormatError(err))) + } + if config.Config.Tap.DryRun { - if err := printTappedPodsPreview(ctx, kubernetesProvider, targetNamespaces); err != nil { - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Error listing pods: %v", errormessage.FormatError(err))) - } return } @@ -136,7 +140,7 @@ func RunMizuTap() { return } if config.Config.Tap.DaemonMode { - if err := handleDaemonModePostCreation(ctx, cancel, kubernetesProvider, targetNamespaces); err != nil { + if err := handleDaemonModePostCreation(ctx, cancel, kubernetesProvider, state.targetNamespaces); err != nil { defer finishMizuExecution(kubernetesProvider, apiProvider) cancel() } else { @@ -145,14 +149,7 @@ func RunMizuTap() { } else { defer finishMizuExecution(kubernetesProvider, apiProvider) - if err = startTapperSyncer(ctx, cancel, kubernetesProvider, targetNamespaces, *mizuApiFilteringOptions); err != nil { - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Error starting mizu tapper syncer: %v", err)) - cancel() - } - go goUtils.HandleExcWrapper(watchApiServerPod, ctx, kubernetesProvider, cancel) - go goUtils.HandleExcWrapper(watchTapperPod, ctx, kubernetesProvider, cancel) - go goUtils.HandleExcWrapper(watchMizuEvents, ctx, kubernetesProvider, cancel, startTime) // block until exit signal or error waitForFinish(ctx, cancel) @@ -185,7 +182,6 @@ func printTappedPodsPreview(ctx context.Context, kubernetesProvider *kubernetes. if len(matchingPods) == 0 { printNoPodsFoundSuggestion(namespaces) } - logger.Log.Info("Pods that match the provided criteria at this instant:") for _, tappedPod := range matchingPods { logger.Log.Infof(uiUtils.Green, fmt.Sprintf("+%s", tappedPod.Name)) } @@ -205,7 +201,7 @@ func waitForDaemonModeToBeReady(cancel context.CancelFunc, kubernetesProvider *k return nil } -func startTapperSyncer(ctx context.Context, cancel context.CancelFunc, provider *kubernetes.Provider, targetNamespaces []string, mizuApiFilteringOptions api.TrafficFilteringOptions) error { +func startTapperSyncer(ctx context.Context, cancel context.CancelFunc, provider *kubernetes.Provider, targetNamespaces []string, mizuApiFilteringOptions api.TrafficFilteringOptions, startTime time.Time) error { tapperSyncer, err := kubernetes.CreateAndStartMizuTapperSyncer(ctx, provider, kubernetes.TapperSyncerConfig{ TargetNamespaces: targetNamespaces, PodFilterRegex: *config.Config.Tap.PodRegex(), @@ -218,20 +214,12 @@ func startTapperSyncer(ctx context.Context, cancel context.CancelFunc, provider MizuApiFilteringOptions: mizuApiFilteringOptions, MizuServiceAccountExists: state.mizuServiceAccountExists, Istio: config.Config.Tap.Istio, - }) + }, startTime) if err != nil { return err } - for _, tappedPod := range tapperSyncer.CurrentlyTappedPods { - logger.Log.Infof(uiUtils.Green, fmt.Sprintf("+%s", tappedPod.Name)) - } - - if len(tapperSyncer.CurrentlyTappedPods) == 0 { - printNoPodsFoundSuggestion(targetNamespaces) - } - go func() { for { select { @@ -250,6 +238,14 @@ func startTapperSyncer(ctx context.Context, cancel context.CancelFunc, provider if err := apiProvider.ReportTappedPods(tapperSyncer.CurrentlyTappedPods); err != nil { logger.Log.Debugf("[Error] failed update tapped pods %v", err) } + case tapperStatus, ok := <-tapperSyncer.TapperStatusChangedOut: + if !ok { + logger.Log.Debug("mizuTapperSyncer tapper status changed channel closed, ending listener loop") + return + } + if err := apiProvider.ReportTapperStatus(tapperStatus); err != nil { + logger.Log.Debugf("[Error] failed update tapper status %v", err) + } case <-ctx.Done(): logger.Log.Debug("mizuTapperSyncer event listener loop exiting due to context done") return @@ -557,171 +553,9 @@ func waitUntilNamespaceDeleted(ctx context.Context, cancel context.CancelFunc, k } func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { - podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s$", kubernetes.ApiServerPodName)) - podWatchHelper := kubernetes.NewPodWatchHelper(kubernetesProvider, podExactRegex) - eventChan, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.MizuResourcesNamespace}, podWatchHelper) - isPodReady := false - timeAfter := time.After(25 * time.Second) - for { - select { - case wEvent, ok := <-eventChan: - if !ok { - eventChan = nil - continue - } - - switch wEvent.Type { - case kubernetes.EventAdded: - logger.Log.Debugf("Watching API Server pod loop, added") - case kubernetes.EventDeleted: - logger.Log.Infof("%s removed", kubernetes.ApiServerPodName) - cancel() - return - case kubernetes.EventModified: - modifiedPod, err := wEvent.ToPod() - if err != nil { - logger.Log.Errorf(uiUtils.Error, err) - cancel() - continue - } - - logger.Log.Debugf("Watching API Server pod loop, modified: %v", modifiedPod.Status.Phase) - - if modifiedPod.Status.Phase == core.PodPending { - if modifiedPod.Status.Conditions[0].Type == core.PodScheduled && modifiedPod.Status.Conditions[0].Status != core.ConditionTrue { - logger.Log.Debugf("Wasn't able to deploy the API server. Reason: \"%s\"", modifiedPod.Status.Conditions[0].Message) - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Wasn't able to deploy the API server, for more info check logs at %s", fsUtils.GetLogFilePath())) - cancel() - break - } - - if len(modifiedPod.Status.ContainerStatuses) > 0 && modifiedPod.Status.ContainerStatuses[0].State.Waiting != nil && modifiedPod.Status.ContainerStatuses[0].State.Waiting.Reason == "ErrImagePull" { - logger.Log.Debugf("Wasn't able to deploy the API server. (ErrImagePull) Reason: \"%s\"", modifiedPod.Status.ContainerStatuses[0].State.Waiting.Message) - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Wasn't able to deploy the API server: failed to pull the image, for more info check logs at %v", fsUtils.GetLogFilePath())) - cancel() - break - } - } - - if modifiedPod.Status.Phase == core.PodRunning && !isPodReady { - isPodReady = true - go startProxyReportErrorIfAny(kubernetesProvider, cancel) - - url := GetApiServerUrl() - if err := apiProvider.TestConnection(); err != nil { - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Couldn't connect to API server, for more info check logs at %s", fsUtils.GetLogFilePath())) - cancel() - break - } - - logger.Log.Infof("Mizu is available at %s", url) - if !config.Config.HeadlessMode { - uiUtils.OpenBrowser(url) - } - if err := apiProvider.ReportTappedPods(state.tapperSyncer.CurrentlyTappedPods); err != nil { - logger.Log.Debugf("[Error] failed update tapped pods %v", err) - } - } - case kubernetes.EventBookmark: - break - case kubernetes.EventError: - break - } - case err, ok := <-errorChan: - if !ok { - errorChan = nil - continue - } - - logger.Log.Errorf("[ERROR] Agent creation, watching %v namespace, error: %v", config.Config.MizuResourcesNamespace, err) - cancel() - - case <-timeAfter: - if !isPodReady { - logger.Log.Errorf(uiUtils.Error, "Mizu API server was not ready in time") - cancel() - } - case <-ctx.Done(): - logger.Log.Debugf("Watching API Server pod loop, ctx done") - return - } - } -} - -func watchTapperPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { - podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", kubernetes.TapperDaemonSetName)) - podWatchHelper := kubernetes.NewPodWatchHelper(kubernetesProvider, podExactRegex) - eventChan, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.MizuResourcesNamespace}, podWatchHelper) - - for { - select { - case wEvent, ok := <-eventChan: - if !ok { - eventChan = nil - continue - } - - pod, err := wEvent.ToPod() - if err != nil { - logger.Log.Errorf(uiUtils.Error, err) - cancel() - continue - } - - switch wEvent.Type { - case kubernetes.EventAdded: - logger.Log.Debugf("Tapper is created [%s]", pod.Name) - case kubernetes.EventDeleted: - logger.Log.Debugf("Tapper is removed [%s]", pod.Name) - case kubernetes.EventModified: - if pod.Status.Phase == core.PodPending && pod.Status.Conditions[0].Type == core.PodScheduled && pod.Status.Conditions[0].Status != core.ConditionTrue { - logger.Log.Infof(uiUtils.Red, fmt.Sprintf("Wasn't able to deploy the tapper %s. Reason: \"%s\"", pod.Name, pod.Status.Conditions[0].Message)) - cancel() - continue - } - - podStatus := pod.Status - - if podStatus.Phase == core.PodRunning { - state := podStatus.ContainerStatuses[0].State - if state.Terminated != nil { - switch state.Terminated.Reason { - case "OOMKilled": - logger.Log.Infof(uiUtils.Red, fmt.Sprintf("Tapper %s was terminated (reason: OOMKilled). You should consider increasing machine resources.", pod.Name)) - } - } - } - - logger.Log.Debugf("Tapper %s is %s", pod.Name, strings.ToLower(string(podStatus.Phase))) - case kubernetes.EventBookmark: - break - case kubernetes.EventError: - break - } - case err, ok := <-errorChan: - if !ok { - errorChan = nil - continue - } - - logger.Log.Errorf("[Error] Error in mizu tapper pod watch, err: %v", err) - cancel() - - case <-ctx.Done(): - logger.Log.Debugf("Watching tapper pod loop, ctx done") - return - } - } -} - -func watchMizuEvents(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc, startTime time.Time) { - // Round down because k8s CreationTimestamp is given in 1 sec resolution. - startTime = startTime.Truncate(time.Second) - - mizuResourceRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", kubernetes.MizuResourcesPrefix)) - eventWatchHelper := kubernetes.NewEventWatchHelper(kubernetesProvider, mizuResourceRegex) + podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s", kubernetes.ApiServerPodName)) + eventWatchHelper := kubernetes.NewEventWatchHelper(kubernetesProvider, podExactRegex, "pod") eventChan, errorChan := kubernetes.FilteredWatch(ctx, eventWatchHelper, []string{config.Config.MizuResourcesNamespace}, eventWatchHelper) - for { select { case wEvent, ok := <-eventChan: @@ -732,16 +566,46 @@ func watchMizuEvents(ctx context.Context, kubernetesProvider *kubernetes.Provide event, err := wEvent.ToEvent() if err != nil { - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("error parsing Mizu resource event: %+v", err)) - cancel() + logger.Log.Errorf(fmt.Sprintf("Error parsing Mizu resource event: %+v", err)) } - if startTime.After(event.CreationTimestamp.Time) { + if state.startTime.After(event.CreationTimestamp.Time) { continue } - if event.Type == core.EventTypeWarning { - logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Resource %s in state %s - %s", event.Regarding.Name, event.Reason, event.Note)) + logger.Log.Debugf( + fmt.Sprintf("Watching API server events loop, event %s, time: %v, resource: %s (%s), reason: %s, note: %s", + event.Name, + event.CreationTimestamp.Time, + event.Regarding.Name, + event.Regarding.Kind, + event.Reason, + event.Note)) + + switch event.Reason { + case "Started": + go startProxyReportErrorIfAny(kubernetesProvider, cancel) + + url := GetApiServerUrl() + if err := apiProvider.TestConnection(); err != nil { + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Couldn't connect to API server, for more info check logs at %s", fsUtils.GetLogFilePath())) + cancel() + break + } + options, _ := getMizuApiFilteringOptions() + if err = startTapperSyncer(ctx, cancel, kubernetesProvider, state.targetNamespaces, *options, state.startTime); err != nil { + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Error starting mizu tapper syncer: %v", err)) + cancel() + } + + logger.Log.Infof("Mizu is available at %s", url) + if !config.Config.HeadlessMode { + uiUtils.OpenBrowser(url) + } + case "FailedScheduling", "Failed", "Killing": + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Mizu API Server status: %s - %s", event.Reason, event.Note)) + cancel() + break } case err, ok := <-errorChan: if !ok { @@ -749,11 +613,9 @@ func watchMizuEvents(ctx context.Context, kubernetesProvider *kubernetes.Provide continue } - logger.Log.Errorf("error in watch mizu resource events loop: %+v", err) - cancel() - + logger.Log.Errorf("Watching API server events loop, error: %+v", err) case <-ctx.Done(): - logger.Log.Debugf("watching Mizu resource events loop, ctx done") + logger.Log.Debugf("Watching API server events loop, ctx done") return } } diff --git a/shared/kubernetes/eventWatchHelper.go b/shared/kubernetes/eventWatchHelper.go index 3ec3cb956..332fdd4e6 100644 --- a/shared/kubernetes/eventWatchHelper.go +++ b/shared/kubernetes/eventWatchHelper.go @@ -3,6 +3,7 @@ package kubernetes import ( "context" "regexp" + "strings" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/watch" @@ -10,13 +11,15 @@ import ( type EventWatchHelper struct { kubernetesProvider *Provider - NameRegexFilter *regexp.Regexp + NameRegexFilter *regexp.Regexp + Kind string } -func NewEventWatchHelper(kubernetesProvider *Provider, NameRegexFilter *regexp.Regexp) *EventWatchHelper { +func NewEventWatchHelper(kubernetesProvider *Provider, NameRegexFilter *regexp.Regexp, kind string) *EventWatchHelper { return &EventWatchHelper{ kubernetesProvider: kubernetesProvider, - NameRegexFilter: NameRegexFilter, + NameRegexFilter: NameRegexFilter, + Kind: kind, } } @@ -31,6 +34,10 @@ func (wh *EventWatchHelper) Filter(wEvent *WatchEvent) (bool, error) { return false, nil } + if strings.ToLower(event.Regarding.Kind) != strings.ToLower(wh.Kind) { + return false, nil + } + return true, nil } diff --git a/shared/kubernetes/mizuTapperSyncer.go b/shared/kubernetes/mizuTapperSyncer.go index ee1f86ad4..fd11ded3e 100644 --- a/shared/kubernetes/mizuTapperSyncer.go +++ b/shared/kubernetes/mizuTapperSyncer.go @@ -23,13 +23,15 @@ type TappedPodChangeEvent struct { // MizuTapperSyncer uses a k8s pod watch to update tapper daemonsets when targeted pods are removed or created type MizuTapperSyncer struct { - context context.Context - CurrentlyTappedPods []core.Pod - config TapperSyncerConfig - kubernetesProvider *Provider - TapPodChangesOut chan TappedPodChangeEvent - ErrorOut chan K8sTapManagerError - nodeToTappedPodIPMap map[string][]string + startTime time.Time + context context.Context + CurrentlyTappedPods []core.Pod + config TapperSyncerConfig + kubernetesProvider *Provider + TapPodChangesOut chan TappedPodChangeEvent + TapperStatusChangedOut chan shared.TapperStatus + ErrorOut chan K8sTapManagerError + nodeToTappedPodIPMap map[string][]string } type TapperSyncerConfig struct { @@ -46,14 +48,16 @@ type TapperSyncerConfig struct { Istio bool } -func CreateAndStartMizuTapperSyncer(ctx context.Context, kubernetesProvider *Provider, config TapperSyncerConfig) (*MizuTapperSyncer, error) { +func CreateAndStartMizuTapperSyncer(ctx context.Context, kubernetesProvider *Provider, config TapperSyncerConfig, startTime time.Time) (*MizuTapperSyncer, error) { syncer := &MizuTapperSyncer{ - context: ctx, - CurrentlyTappedPods: make([]core.Pod, 0), - config: config, - kubernetesProvider: kubernetesProvider, - TapPodChangesOut: make(chan TappedPodChangeEvent, 100), - ErrorOut: make(chan K8sTapManagerError, 100), + startTime: startTime.Truncate(time.Second), // Round down because k8s CreationTimestamp is given in 1 sec resolution. + context: ctx, + CurrentlyTappedPods: make([]core.Pod, 0), + config: config, + kubernetesProvider: kubernetesProvider, + TapPodChangesOut: make(chan TappedPodChangeEvent, 100), + TapperStatusChangedOut: make(chan shared.TapperStatus, 100), + ErrorOut: make(chan K8sTapManagerError, 100), } if err, _ := syncer.updateCurrentlyTappedPods(); err != nil { @@ -65,9 +69,72 @@ func CreateAndStartMizuTapperSyncer(ctx context.Context, kubernetesProvider *Pro } go syncer.watchPodsForTapping() + go syncer.watchTapperEvents() return syncer, nil } +func (tapperSyncer *MizuTapperSyncer) watchTapperEvents() { + mizuResourceRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", TapperPodName)) + eventWatchHelper := NewEventWatchHelper(tapperSyncer.kubernetesProvider, mizuResourceRegex, "pod") + eventChan, errorChan := FilteredWatch(tapperSyncer.context, eventWatchHelper, []string{tapperSyncer.config.MizuResourcesNamespace}, eventWatchHelper) + + for { + select { + case wEvent, ok := <-eventChan: + if !ok { + eventChan = nil + continue + } + + event, err := wEvent.ToEvent() + if err != nil { + logger.Log.Errorf(fmt.Sprintf("Error parsing Mizu resource event: %+v", err)) + } + + if tapperSyncer.startTime.After(event.CreationTimestamp.Time) { + continue + } + + logger.Log.Debugf( + fmt.Sprintf("Watching tapper events loop, event %s, time: %v, resource: %s (%s), reason: %s, note: %s", + event.Name, + event.CreationTimestamp.Time, + event.Regarding.Name, + event.Regarding.Kind, + event.Reason, + event.Note)) + + pod, err1 := tapperSyncer.kubernetesProvider.GetPod(tapperSyncer.context, tapperSyncer.config.MizuResourcesNamespace, event.Regarding.Name) + if err1 != nil { + logger.Log.Debugf(fmt.Sprintf("Failed to get tapper pod %s", event.Regarding.Name)) + continue + } + + nodeName := "" + if event.Reason != "FailedScheduling" { + nodeName = pod.Spec.NodeName + } else { + nodeName = pod.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchFields[0].Values[0] + } + + taperStatus := shared.TapperStatus{TapperName: pod.Name, NodeName: nodeName, Status: event.Reason} + tapperSyncer.TapperStatusChangedOut <- taperStatus + + case err, ok := <-errorChan: + if !ok { + errorChan = nil + continue + } + + logger.Log.Errorf("Watching tapper events loop, error: %+v", err) + + case <-tapperSyncer.context.Done(): + logger.Log.Debugf("Watching tapper events loop, ctx done") + return + } + } +} + func (tapperSyncer *MizuTapperSyncer) watchPodsForTapping() { podWatchHelper := NewPodWatchHelper(tapperSyncer.kubernetesProvider, &tapperSyncer.config.PodFilterRegex) eventChan, errorChan := FilteredWatch(tapperSyncer.context, podWatchHelper, tapperSyncer.config.TargetNamespaces, podWatchHelper) @@ -108,7 +175,6 @@ func (tapperSyncer *MizuTapperSyncer) watchPodsForTapping() { continue } - switch wEvent.Type { case EventAdded: logger.Log.Debugf("Added matching pod %s, ns: %s", pod.Name, pod.Namespace) diff --git a/shared/kubernetes/provider.go b/shared/kubernetes/provider.go index 523b9c503..41f32214f 100644 --- a/shared/kubernetes/provider.go +++ b/shared/kubernetes/provider.go @@ -351,8 +351,8 @@ func (provider *Provider) CreateService(ctx context.Context, namespace string, s } func (provider *Provider) DoesServicesExist(ctx context.Context, namespace string, name string) (bool, error) { - resource, err := provider.clientSet.CoreV1().Services(namespace).Get(ctx, name, metav1.GetOptions{}) - return provider.doesResourceExist(resource, err) + serviceResource, err := provider.clientSet.CoreV1().Services(namespace).Get(ctx, name, metav1.GetOptions{}) + return provider.doesResourceExist(serviceResource, err) } func (provider *Provider) doesResourceExist(resource interface{}, err error) (bool, error) { @@ -642,7 +642,7 @@ func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespac "--api-server-address", fmt.Sprintf("ws://%s/wsTapper", apiServerPodIp), "--nodefrag", } - + if istio { mizuCmd = append(mizuCmd, "--procfs", procfsMountPath, "--istio") } @@ -653,13 +653,13 @@ func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespac agentContainer.WithImagePullPolicy(imagePullPolicy) caps := applyconfcore.Capabilities().WithDrop("ALL").WithAdd("NET_RAW").WithAdd("NET_ADMIN") - + if istio { - caps = caps.WithAdd("SYS_ADMIN") // for reading /proc/PID/net/ns - caps = caps.WithAdd("SYS_PTRACE") // for setting netns to other process + caps = caps.WithAdd("SYS_ADMIN") // for reading /proc/PID/net/ns + caps = caps.WithAdd("SYS_PTRACE") // for setting netns to other process caps = caps.WithAdd("DAC_OVERRIDE") // for reading /proc/PID/environ } - + agentContainer.WithSecurityContext(applyconfcore.SecurityContext().WithCapabilities(caps)) agentContainer.WithCommand(mizuCmd...) @@ -780,10 +780,10 @@ func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespac return err } -func (provider *Provider) ListAllPodsMatchingRegex(ctx context.Context, regex *regexp.Regexp, namespaces []string) ([]core.Pod, error) { +func (provider *Provider) listPodsImpl(ctx context.Context, regex *regexp.Regexp, namespaces []string, listOptions metav1.ListOptions) ([]core.Pod, error) { var pods []core.Pod for _, namespace := range namespaces { - namespacePods, err := provider.clientSet.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{}) + namespacePods, err := provider.clientSet.CoreV1().Pods(namespace).List(ctx, listOptions) if err != nil { return nil, fmt.Errorf("failed to get pods in ns: [%s], %w", namespace, err) } @@ -800,6 +800,14 @@ func (provider *Provider) ListAllPodsMatchingRegex(ctx context.Context, regex *r return matchingPods, nil } +func (provider *Provider) ListAllPodsMatchingRegex(ctx context.Context, regex *regexp.Regexp, namespaces []string) ([]core.Pod, error) { + return provider.listPodsImpl(ctx, regex, namespaces, metav1.ListOptions{}) +} + +func (provider *Provider) GetPod(ctx context.Context, namespaces string, podName string) (*core.Pod, error) { + return provider.clientSet.CoreV1().Pods(namespaces).Get(ctx, podName, metav1.GetOptions{}) +} + func (provider *Provider) ListAllRunningPodsMatchingRegex(ctx context.Context, regex *regexp.Regexp, namespaces []string) ([]core.Pod, error) { pods, err := provider.ListAllPodsMatchingRegex(ctx, regex, namespaces) if err != nil { diff --git a/shared/kubernetes/utils.go b/shared/kubernetes/utils.go index 6a020e259..8aa84344b 100644 --- a/shared/kubernetes/utils.go +++ b/shared/kubernetes/utils.go @@ -57,11 +57,10 @@ func getMissingPods(pods1 []core.Pod, pods2 []core.Pod) []core.Pod { return missingPods } - func GetPodInfosForPods(pods []core.Pod) []shared.PodInfo { podInfos := make([]shared.PodInfo, 0) for _, pod := range pods { - podInfos = append(podInfos, shared.PodInfo{Name: pod.Name, Namespace: pod.Namespace}) + podInfos = append(podInfos, shared.PodInfo{Name: pod.Name, Namespace: pod.Namespace, NodeName: pod.Spec.NodeName}) } return podInfos } diff --git a/shared/models.go b/shared/models.go index 1d3893274..c12edcb72 100644 --- a/shared/models.go +++ b/shared/models.go @@ -67,6 +67,12 @@ type WebSocketStatusMessage struct { TappingStatus TapStatus `json:"tappingStatus"` } +type TapperStatus struct { + TapperName string `json:"tapperName"` + NodeName string `json:"nodeName"` + Status string `json:"status"` +} + type TapStatus struct { Pods []PodInfo `json:"pods"` TLSLinks []TLSLinkInfo `json:"tlsLinks"` @@ -75,6 +81,7 @@ type TapStatus struct { type PodInfo struct { Namespace string `json:"namespace"` Name string `json:"name"` + NodeName string `json:"nodeName"` } type TLSLinkInfo struct { @@ -110,8 +117,9 @@ func CreateWebSocketMessageTypeAnalyzeStatus(analyzeStatus AnalyzeStatus) WebSoc } type HealthResponse struct { - TapStatus TapStatus `json:"tapStatus"` - TappersCount int `json:"tappersCount"` + TapStatus TapStatus `json:"tapStatus"` + TappersCount int `json:"tappersCount"` + TappersStatus []TapperStatus `json:"tappersStatus"` } type VersionResponse struct { From f266f32fea7f2229b347aa5007a4a7bcffa0e2ab Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Thu, 16 Dec 2021 10:36:03 +0200 Subject: [PATCH 81/93] Decreased API server boot time (#536) --- cli/cmd/tapRunner.go | 13 ++++++++++++- shared/kubernetes/provider.go | 21 --------------------- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index d4fa44ce7..024b9a4d1 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "io/ioutil" + "k8s.io/apimachinery/pkg/util/intstr" "regexp" "strings" "time" @@ -128,6 +129,7 @@ func RunMizuTap() { return } + logger.Log.Infof("Waiting for Mizu Agent to start...") if err := createMizuResources(ctx, cancel, kubernetesProvider, serializedValidationRules, serializedContract, serializedMizuConfig); err != nil { logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Error creating resources: %v", errormessage.FormatError(err))) @@ -382,7 +384,16 @@ func createMizuApiServerDeployment(ctx context.Context, kubernetesProvider *kube if err != nil { return err } - + pod.Spec.Containers[0].LivenessProbe = &core.Probe{ + Handler: core.Handler{ + HTTPGet: &core.HTTPGetAction{ + Path: "/echo", + Port: intstr.FromInt(shared.DefaultApiServerPort), + }, + }, + InitialDelaySeconds: 1, + PeriodSeconds: 10, + } if _, err = kubernetesProvider.CreateDeployment(ctx, config.Config.MizuResourcesNamespace, opts.PodName, pod); err != nil { return err } diff --git a/shared/kubernetes/provider.go b/shared/kubernetes/provider.go index 41f32214f..61907bebd 100644 --- a/shared/kubernetes/provider.go +++ b/shared/kubernetes/provider.go @@ -240,8 +240,6 @@ func (provider *Provider) GetMizuApiServerPodObject(opts *ApiServerOptions, moun }) } - port := intstr.FromInt(shared.DefaultApiServerPort) - pod := &core.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: opts.PodName, @@ -275,25 +273,6 @@ func (provider *Provider) GetMizuApiServerPodObject(opts *ApiServerOptions, moun "memory": memRequests, }, }, - ReadinessProbe: &core.Probe{ - Handler: core.Handler{ - TCPSocket: &core.TCPSocketAction{ - Port: port, - }, - }, - InitialDelaySeconds: 5, - PeriodSeconds: 10, - }, - LivenessProbe: &core.Probe{ - Handler: core.Handler{ - HTTPGet: &core.HTTPGetAction{ - Path: "/echo", - Port: port, - }, - }, - InitialDelaySeconds: 5, - PeriodSeconds: 10, - }, }, }, Volumes: volumes, From b565492eba6163aa6f6097f5826c4afe13edca9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Thu, 16 Dec 2021 11:42:17 +0300 Subject: [PATCH 82/93] Change the connection status text and the toggle connection behavior (#534) --- ui/src/components/EntryListItem/EntryListItem.tsx | 2 +- ui/src/components/TrafficPage.tsx | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ui/src/components/EntryListItem/EntryListItem.tsx b/ui/src/components/EntryListItem/EntryListItem.tsx index 60c0f5db5..d88575250 100644 --- a/ui/src/components/EntryListItem/EntryListItem.tsx +++ b/ui/src/components/EntryListItem/EntryListItem.tsx @@ -298,7 +298,7 @@ export const EntryItem: React.FC = ({entry, focusedEntryId, setFocus flipped={false} > {Moment(+entry.timestamp)?.utc().format('MM/DD/YYYY, h:mm:ss.SSS A')} diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index f9264588d..7d4075e01 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -225,13 +225,12 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS }, [focusedEntryId]); const toggleConnection = () => { - if (connection === ConnectionStatus.Connected) { - ws.current.close(); - } else { + ws.current.close(); + if (connection !== ConnectionStatus.Connected) { if (query) { - openWebSocket(`(${query}) and leftOff(${leftOffBottom})`, false); + openWebSocket(`(${query}) and leftOff(-1)`, true); } else { - openWebSocket(`leftOff(${leftOffBottom})`, false); + openWebSocket(`leftOff(-1)`, true); } } } @@ -249,9 +248,9 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const getConnectionTitle = () => { switch (connection) { case ConnectionStatus.Connected: - return "connected, waiting for traffic" + return "streaming live traffic" default: - return "not connected"; + return "streaming paused"; } } From a06d5cfbdede824fc3de70a5a70744249a8eb28b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Thu, 16 Dec 2021 11:46:50 +0300 Subject: [PATCH 83/93] Update the "Started listening at" timestamp and `queriedTotal` state based on database truncation (#533) --- Dockerfile | 4 ++-- agent/go.mod | 2 +- agent/go.sum | 4 ++-- debug.Dockerfile | 4 ++-- ui/src/components/EntriesList.tsx | 11 ++++++++--- ui/src/components/TrafficPage.tsx | 5 +++++ 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 13acced00..51a42eae9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,8 +42,8 @@ RUN go build -ldflags="-s -w \ -X 'mizuserver/pkg/version.SemVer=${SEM_VER}'" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.17/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.17/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.19/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.19/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/agent/go.mod b/agent/go.mod index 822531ba8..c2c3ba36e 100644 --- a/agent/go.mod +++ b/agent/go.mod @@ -16,7 +16,7 @@ require ( github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/orcaman/concurrent-map v0.0.0-20210106121528-16402b402231 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/up9inc/basenine/client/go v0.0.0-20211207165834-2ced7577f9e6 + github.com/up9inc/basenine/client/go v0.0.0-20211215185650-10083bb9a1b3 github.com/up9inc/mizu/shared v0.0.0 github.com/up9inc/mizu/tap v0.0.0 github.com/up9inc/mizu/tap/api v0.0.0 diff --git a/agent/go.sum b/agent/go.sum index 9627935ed..2c113c74a 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -450,8 +450,8 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/up9inc/basenine/client/go v0.0.0-20211207165834-2ced7577f9e6 h1:8JOkoaZHhUPi4r7vSL/xo83foSz8BHPSabTDpxmtHFU= -github.com/up9inc/basenine/client/go v0.0.0-20211207165834-2ced7577f9e6/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= +github.com/up9inc/basenine/client/go v0.0.0-20211215185650-10083bb9a1b3 h1:FeDCVOBFVpZA5/O5hfPdGTn0rdR2jTEYo3iB2htELI4= +github.com/up9inc/basenine/client/go v0.0.0-20211215185650-10083bb9a1b3/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= diff --git a/debug.Dockerfile b/debug.Dockerfile index 858b6ae31..e063e887f 100644 --- a/debug.Dockerfile +++ b/debug.Dockerfile @@ -37,8 +37,8 @@ COPY agent . RUN go build -gcflags="all=-N -l" -o mizuagent . # Download Basenine executable, verify the sha1sum and move it to a directory in $PATH -ADD https://github.com/up9inc/basenine/releases/download/v0.2.17/basenine_linux_amd64 ./basenine_linux_amd64 -ADD https://github.com/up9inc/basenine/releases/download/v0.2.17/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.19/basenine_linux_amd64 ./basenine_linux_amd64 +ADD https://github.com/up9inc/basenine/releases/download/v0.2.19/basenine_linux_amd64.sha256 ./basenine_linux_amd64.sha256 RUN shasum -a 256 -c basenine_linux_amd64.sha256 RUN chmod +x ./basenine_linux_amd64 diff --git a/ui/src/components/EntriesList.tsx b/ui/src/components/EntriesList.tsx index b5da7736e..14e78bec2 100644 --- a/ui/src/components/EntriesList.tsx +++ b/ui/src/components/EntriesList.tsx @@ -18,6 +18,7 @@ interface EntriesListProps { queriedCurrent: number; setQueriedCurrent: any; queriedTotal: number; + setQueriedTotal: any; startTime: number; noMoreDataTop: boolean; setNoMoreDataTop: (flag: boolean) => void; @@ -30,11 +31,13 @@ interface EntriesListProps { ws: any; openWebSocket: (query: string, resetEntries: boolean) => void; leftOffBottom: number; + truncatedTimestamp: number; + setTruncatedTimestamp: any; } const api = new Api(); -export const EntriesList: React.FC = ({entries, setEntries, query, listEntryREF, onSnapBrokenEvent, isSnappedToBottom, setIsSnappedToBottom, queriedCurrent, setQueriedCurrent, queriedTotal, startTime, noMoreDataTop, setNoMoreDataTop, focusedEntryId, setFocusedEntryId, updateQuery, leftOffTop, setLeftOffTop, isWebSocketConnectionClosed, ws, openWebSocket, leftOffBottom}) => { +export const EntriesList: React.FC = ({entries, setEntries, query, listEntryREF, onSnapBrokenEvent, isSnappedToBottom, setIsSnappedToBottom, queriedCurrent, setQueriedCurrent, queriedTotal, setQueriedTotal, startTime, noMoreDataTop, setNoMoreDataTop, focusedEntryId, setFocusedEntryId, updateQuery, leftOffTop, setLeftOffTop, isWebSocketConnectionClosed, ws, openWebSocket, leftOffBottom, truncatedTimestamp, setTruncatedTimestamp}) => { const [loadMoreTop, setLoadMoreTop] = useState(false); const [isLoadingTop, setIsLoadingTop] = useState(false); const scrollableRef = useRef(null); @@ -83,11 +86,13 @@ export const EntriesList: React.FC = ({entries, setEntries, qu setEntries(newEntries); setQueriedCurrent(queriedCurrent + data.meta.current); + setQueriedTotal(data.meta.total); + setTruncatedTimestamp(data.meta.truncatedTimestamp); if (scrollTo) { scrollableRef.current.scrollToIndex(data.data.length - 1); } - },[setLoadMoreTop, setIsLoadingTop, entries, setEntries, query, setNoMoreDataTop, leftOffTop, setLeftOffTop, queriedCurrent, setQueriedCurrent]); + },[setLoadMoreTop, setIsLoadingTop, entries, setEntries, query, setNoMoreDataTop, leftOffTop, setLeftOffTop, queriedCurrent, setQueriedCurrent, setQueriedTotal, setTruncatedTimestamp]); useEffect(() => { if(!isWebSocketConnectionClosed || !loadMoreTop || noMoreDataTop) return; @@ -144,7 +149,7 @@ export const EntriesList: React.FC = ({entries, setEntries, qu
Displaying {entries?.length} results out of {queriedTotal} total
- {startTime !== 0 &&
Started listening at {Moment(startTime).utc().format('MM/DD/YYYY, h:mm:ss.SSS A')}
} + {startTime !== 0 &&
Started listening at {Moment(truncatedTimestamp ? truncatedTimestamp : startTime).utc().format('MM/DD/YYYY, h:mm:ss.SSS A')}
}
; diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index 7d4075e01..d79356293 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -68,6 +68,7 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const [queriedTotal, setQueriedTotal] = useState(0); const [leftOffBottom, setLeftOffBottom] = useState(0); const [leftOffTop, setLeftOffTop] = useState(null); + const [truncatedTimestamp, setTruncatedTimestamp] = useState(0); const [startTime, setStartTime] = useState(0); @@ -169,6 +170,7 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS setQueriedCurrent(queriedCurrent + message.data.current); setQueriedTotal(message.data.total); setLeftOffBottom(message.data.leftOff); + setTruncatedTimestamp(message.data.truncatedTimestamp); if (leftOffTop === null) { setLeftOffTop(message.data.leftOff - 1); } @@ -296,6 +298,7 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS queriedCurrent={queriedCurrent} setQueriedCurrent={setQueriedCurrent} queriedTotal={queriedTotal} + setQueriedTotal={setQueriedTotal} startTime={startTime} noMoreDataTop={noMoreDataTop} setNoMoreDataTop={setNoMoreDataTop} @@ -308,6 +311,8 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS ws={ws.current} openWebSocket={openWebSocket} leftOffBottom={leftOffBottom} + truncatedTimestamp={truncatedTimestamp} + setTruncatedTimestamp={setTruncatedTimestamp} />
From ab029f4394722eb6a7067b697f98b654dd814d96 Mon Sep 17 00:00:00 2001 From: David Levanon Date: Thu, 16 Dec 2021 10:51:03 +0200 Subject: [PATCH 84/93] Send pod info to tapper (#532) --- agent/main.go | 8 +++---- shared/kubernetes/mizuTapperSyncer.go | 12 +++++------ shared/kubernetes/provider.go | 14 ++++++------- shared/kubernetes/utils.go | 30 ++++++++++++++++++++------- tap/go.mod | 3 +-- tap/go.sum | 26 +++++++++++++++++++++-- tap/passive_tapper.go | 5 +++-- tap/source/envoy_discoverer.go | 19 +++++++++-------- tap/source/packet_source_manager.go | 7 ++++--- tap/tcp_stream_factory.go | 18 ++++++++++++---- 10 files changed, 96 insertions(+), 46 deletions(-) diff --git a/agent/main.go b/agent/main.go index a9d94f998..ab8612022 100644 --- a/agent/main.go +++ b/agent/main.go @@ -304,8 +304,8 @@ func CORSMiddleware() gin.HandlerFunc { } } -func parseEnvVar(env string) map[string][]string { - var mapOfList map[string][]string +func parseEnvVar(env string) map[string][]v1.Pod { + var mapOfList map[string][]v1.Pod val, present := os.LookupEnv(env) @@ -315,12 +315,12 @@ func parseEnvVar(env string) map[string][]string { err := json.Unmarshal([]byte(val), &mapOfList) if err != nil { - panic(fmt.Sprintf("env var %s's value of %s is invalid! must be map[string][]string %v", env, mapOfList, err)) + panic(fmt.Sprintf("env var %s's value of %v is invalid! must be map[string][]v1.Pod %v", env, mapOfList, err)) } return mapOfList } -func getTapTargets() []string { +func getTapTargets() []v1.Pod { nodeName := os.Getenv(shared.NodeNameEnvVar) tappedAddressesPerNodeDict := parseEnvVar(shared.TappedAddressesPerNodeDictEnvVar) return tappedAddressesPerNodeDict[nodeName] diff --git a/shared/kubernetes/mizuTapperSyncer.go b/shared/kubernetes/mizuTapperSyncer.go index fd11ded3e..31dba52d1 100644 --- a/shared/kubernetes/mizuTapperSyncer.go +++ b/shared/kubernetes/mizuTapperSyncer.go @@ -31,7 +31,7 @@ type MizuTapperSyncer struct { TapPodChangesOut chan TappedPodChangeEvent TapperStatusChangedOut chan shared.TapperStatus ErrorOut chan K8sTapManagerError - nodeToTappedPodIPMap map[string][]string + nodeToTappedPodMap map[string][]core.Pod } type TapperSyncerConfig struct { @@ -239,11 +239,11 @@ func (tapperSyncer *MizuTapperSyncer) updateCurrentlyTappedPods() (err error, ch } if len(addedPods) > 0 || len(removedPods) > 0 { tapperSyncer.CurrentlyTappedPods = podsToTap - tapperSyncer.nodeToTappedPodIPMap = GetNodeHostToTappedPodIpsMap(tapperSyncer.CurrentlyTappedPods) + tapperSyncer.nodeToTappedPodMap = GetNodeHostToTappedPodsMap(tapperSyncer.CurrentlyTappedPods) tapperSyncer.TapPodChangesOut <- TappedPodChangeEvent{ Added: addedPods, Removed: removedPods, - ExpectedTapperAmount: len(tapperSyncer.nodeToTappedPodIPMap), + ExpectedTapperAmount: len(tapperSyncer.nodeToTappedPodMap), } return nil, true } @@ -252,7 +252,7 @@ func (tapperSyncer *MizuTapperSyncer) updateCurrentlyTappedPods() (err error, ch } func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error { - if len(tapperSyncer.nodeToTappedPodIPMap) > 0 { + if len(tapperSyncer.nodeToTappedPodMap) > 0 { var serviceAccountName string if tapperSyncer.config.MizuServiceAccountExists { serviceAccountName = ServiceAccountName @@ -267,7 +267,7 @@ func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error { tapperSyncer.config.AgentImage, TapperPodName, fmt.Sprintf("%s.%s.svc.cluster.local", ApiServerPodName, tapperSyncer.config.MizuResourcesNamespace), - tapperSyncer.nodeToTappedPodIPMap, + tapperSyncer.nodeToTappedPodMap, serviceAccountName, tapperSyncer.config.TapperResources, tapperSyncer.config.ImagePullPolicy, @@ -277,7 +277,7 @@ func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error { ); err != nil { return err } - logger.Log.Debugf("Successfully created %v tappers", len(tapperSyncer.nodeToTappedPodIPMap)) + logger.Log.Debugf("Successfully created %v tappers", len(tapperSyncer.nodeToTappedPodMap)) } else { if err := tapperSyncer.kubernetesProvider.RemoveDaemonSet(tapperSyncer.context, tapperSyncer.config.MizuResourcesNamespace, TapperDaemonSetName); err != nil { return err diff --git a/shared/kubernetes/provider.go b/shared/kubernetes/provider.go index 61907bebd..a1a0195d1 100644 --- a/shared/kubernetes/provider.go +++ b/shared/kubernetes/provider.go @@ -597,14 +597,14 @@ func (provider *Provider) CreateConfigMap(ctx context.Context, namespace string, return nil } -func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespace string, daemonSetName string, podImage string, tapperPodName string, apiServerPodIp string, nodeToTappedPodIPMap map[string][]string, serviceAccountName string, resources shared.Resources, imagePullPolicy core.PullPolicy, mizuApiFilteringOptions api.TrafficFilteringOptions, logLevel logging.Level, istio bool) error { - logger.Log.Debugf("Applying %d tapper daemon sets, ns: %s, daemonSetName: %s, podImage: %s, tapperPodName: %s", len(nodeToTappedPodIPMap), namespace, daemonSetName, podImage, tapperPodName) +func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespace string, daemonSetName string, podImage string, tapperPodName string, apiServerPodIp string, nodeToTappedPodMap map[string][]core.Pod, serviceAccountName string, resources shared.Resources, imagePullPolicy core.PullPolicy, mizuApiFilteringOptions api.TrafficFilteringOptions, logLevel logging.Level, istio bool) error { + logger.Log.Debugf("Applying %d tapper daemon sets, ns: %s, daemonSetName: %s, podImage: %s, tapperPodName: %s", len(nodeToTappedPodMap), namespace, daemonSetName, podImage, tapperPodName) - if len(nodeToTappedPodIPMap) == 0 { + if len(nodeToTappedPodMap) == 0 { return fmt.Errorf("daemon set %s must tap at least 1 pod", daemonSetName) } - nodeToTappedPodIPMapJsonStr, err := json.Marshal(nodeToTappedPodIPMap) + nodeToTappedPodMapJsonStr, err := json.Marshal(nodeToTappedPodMap) if err != nil { return err } @@ -645,7 +645,7 @@ func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespac agentContainer.WithEnv( applyconfcore.EnvVar().WithName(shared.LogLevelEnvVar).WithValue(logLevel.String()), applyconfcore.EnvVar().WithName(shared.HostModeEnvVar).WithValue("1"), - applyconfcore.EnvVar().WithName(shared.TappedAddressesPerNodeDictEnvVar).WithValue(string(nodeToTappedPodIPMapJsonStr)), + applyconfcore.EnvVar().WithName(shared.TappedAddressesPerNodeDictEnvVar).WithValue(string(nodeToTappedPodMapJsonStr)), applyconfcore.EnvVar().WithName(shared.GoGCEnvVar).WithValue("12800"), applyconfcore.EnvVar().WithName(shared.MizuFilteringOptionsEnvVar).WithValue(string(mizuApiFilteringOptionsJsonStr)), ) @@ -683,8 +683,8 @@ func (provider *Provider) ApplyMizuTapperDaemonSet(ctx context.Context, namespac agentResources := applyconfcore.ResourceRequirements().WithRequests(agentResourceRequests).WithLimits(agentResourceLimits) agentContainer.WithResources(agentResources) - nodeNames := make([]string, 0, len(nodeToTappedPodIPMap)) - for nodeName := range nodeToTappedPodIPMap { + nodeNames := make([]string, 0, len(nodeToTappedPodMap)) + for nodeName := range nodeToTappedPodMap { nodeNames = append(nodeNames, nodeName) } nodeSelectorRequirement := applyconfcore.NodeSelectorRequirement() diff --git a/shared/kubernetes/utils.go b/shared/kubernetes/utils.go index 8aa84344b..39871e269 100644 --- a/shared/kubernetes/utils.go +++ b/shared/kubernetes/utils.go @@ -1,22 +1,38 @@ package kubernetes import ( + "regexp" + "github.com/up9inc/mizu/shared" core "k8s.io/api/core/v1" - "regexp" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func GetNodeHostToTappedPodIpsMap(tappedPods []core.Pod) map[string][]string { - nodeToTappedPodIPMap := make(map[string][]string, 0) +func GetNodeHostToTappedPodsMap(tappedPods []core.Pod) map[string][]core.Pod { + nodeToTappedPodMap := make(map[string][]core.Pod, 0) for _, pod := range tappedPods { - existingList := nodeToTappedPodIPMap[pod.Spec.NodeName] + minimizedPod := getMinimizedPod(pod) + + existingList := nodeToTappedPodMap[pod.Spec.NodeName] if existingList == nil { - nodeToTappedPodIPMap[pod.Spec.NodeName] = []string{pod.Status.PodIP} + nodeToTappedPodMap[pod.Spec.NodeName] = []core.Pod{minimizedPod} } else { - nodeToTappedPodIPMap[pod.Spec.NodeName] = append(nodeToTappedPodIPMap[pod.Spec.NodeName], pod.Status.PodIP) + nodeToTappedPodMap[pod.Spec.NodeName] = append(nodeToTappedPodMap[pod.Spec.NodeName], minimizedPod) } } - return nodeToTappedPodIPMap + return nodeToTappedPodMap +} + +func getMinimizedPod(fullPod core.Pod) core.Pod { + return core.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: fullPod.Name, + }, + Status: v1.PodStatus{ + PodIP: fullPod.Status.PodIP, + }, + } } func excludeMizuPods(pods []core.Pod) []core.Pod { diff --git a/tap/go.mod b/tap/go.mod index 9d3001cb7..a6ce9aad0 100644 --- a/tap/go.mod +++ b/tap/go.mod @@ -4,12 +4,11 @@ go 1.16 require ( github.com/bradleyfalzon/tlsx v0.0.0-20170624122154-28fd0e59bac4 - github.com/go-errors/errors v1.4.1 github.com/google/gopacket v1.1.19 - github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/up9inc/mizu/shared v0.0.0 github.com/up9inc/mizu/tap/api v0.0.0 github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f + k8s.io/api v0.21.2 ) replace github.com/up9inc/mizu/tap/api v0.0.0 => ./api diff --git a/tap/go.sum b/tap/go.sum index bdc732fed..a33956565 100644 --- a/tap/go.sum +++ b/tap/go.sum @@ -77,6 +77,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -103,8 +104,6 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-errors/errors v1.4.1 h1:IvVlgbzSsaUNudsw5dcXSzF3EWyXTi5XrAdngnuhRyg= -github.com/go-errors/errors v1.4.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -114,6 +113,7 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -160,6 +160,7 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -194,8 +195,10 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= @@ -247,6 +250,7 @@ github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -262,6 +266,7 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= @@ -291,13 +296,16 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= @@ -316,6 +324,7 @@ github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -359,6 +368,7 @@ github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= @@ -368,6 +378,7 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= @@ -528,6 +539,7 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -577,6 +589,7 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -633,9 +646,11 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -647,8 +662,10 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= @@ -658,7 +675,9 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.21.2 h1:vz7DqmRsXTCSa6pNxXwQ1IYeAZgdIsua+DZU+o+SX3Y= k8s.io/api v0.21.2/go.mod h1:Lv6UGJZ1rlMI1qusN8ruAp9PUBFyBwpEHAdG24vIsiU= +k8s.io/apimachinery v0.21.2 h1:vezUc/BHqWlQDnZ+XkrpXSmnANSLbpnlpwo0Lhk0gpc= k8s.io/apimachinery v0.21.2/go.mod h1:CdTY8fU/BlvAbJ2z/8kBwimGki5Zp8/fbVuLY8gJumM= k8s.io/cli-runtime v0.21.2/go.mod h1:8u/jFcM0QpoI28f6sfrAAIslLCXUYKD5SsPPMWiHYrI= k8s.io/client-go v0.21.2/go.mod h1:HdJ9iknWpbl3vMGtib6T2PyI/VYxiZfq936WNVHBRrA= @@ -669,6 +688,7 @@ k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= k8s.io/kubectl v0.21.2/go.mod h1:PgeUclpG8VVmmQIl8zpLar3IQEpFc9mrmvlwY3CK1xo= @@ -682,5 +702,7 @@ sigs.k8s.io/kustomize/cmd/config v0.9.10/go.mod h1:Mrby0WnRH7hA6OwOYnYpfpiY0WJIM sigs.k8s.io/kustomize/kustomize/v4 v4.1.2/go.mod h1:PxBvo4WGYlCLeRPL+ziT64wBXqbgfcalOS/SXa/tcyo= sigs.k8s.io/kustomize/kyaml v0.10.17/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8= sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/tap/passive_tapper.go b/tap/passive_tapper.go index 251021359..275f0288d 100644 --- a/tap/passive_tapper.go +++ b/tap/passive_tapper.go @@ -20,6 +20,7 @@ import ( "github.com/up9inc/mizu/tap/api" "github.com/up9inc/mizu/tap/diagnose" "github.com/up9inc/mizu/tap/source" + v1 "k8s.io/api/core/v1" ) const cleanPeriod = time.Second * 10 @@ -56,7 +57,7 @@ var memprofile = flag.String("memprofile", "", "Write memory profile") type TapOpts struct { HostMode bool - FilterAuthorities []string + FilterAuthorities []v1.Pod } var extensions []*api.Extension // global @@ -85,7 +86,7 @@ func StartPassiveTapper(opts *TapOpts, outputItems chan *api.OutputChannelItem, filteringOptions = options if opts.FilterAuthorities == nil { - opts.FilterAuthorities = []string{} + opts.FilterAuthorities = []v1.Pod{} } if GetMemoryProfilingEnabled() { diff --git a/tap/source/envoy_discoverer.go b/tap/source/envoy_discoverer.go index cf5d1e28f..0230b1273 100644 --- a/tap/source/envoy_discoverer.go +++ b/tap/source/envoy_discoverer.go @@ -8,13 +8,14 @@ import ( "strings" "github.com/up9inc/mizu/shared/logger" + v1 "k8s.io/api/core/v1" ) const envoyBinary = "/envoy" var numberRegex = regexp.MustCompile("[0-9]+") -func discoverRelevantEnvoyPids(procfs string, clusterIps []string) ([]string, error) { +func discoverRelevantEnvoyPids(procfs string, pods []v1.Pod) ([]string, error) { result := make([]string, 0) pids, err := ioutil.ReadDir(procfs) @@ -24,7 +25,7 @@ func discoverRelevantEnvoyPids(procfs string, clusterIps []string) ([]string, er } logger.Log.Infof("Starting envoy auto discoverer %v %v - scanning %v potential pids", - procfs, clusterIps, len(pids)) + procfs, pods, len(pids)) for _, pid := range pids { if !pid.IsDir() { @@ -35,7 +36,7 @@ func discoverRelevantEnvoyPids(procfs string, clusterIps []string) ([]string, er continue } - if checkPid(procfs, pid.Name(), clusterIps) { + if checkPid(procfs, pid.Name(), pods) { result = append(result, pid.Name()) } } @@ -45,7 +46,7 @@ func discoverRelevantEnvoyPids(procfs string, clusterIps []string) ([]string, er return result, nil } -func checkPid(procfs string, pid string, clusterIps []string) bool { +func checkPid(procfs string, pid string, pods []v1.Pod) bool { execLink := fmt.Sprintf("%v/%v/exe", procfs, pid) exec, err := os.Readlink(execLink) @@ -62,21 +63,21 @@ func checkPid(procfs string, pid string, clusterIps []string) bool { } environmentFile := fmt.Sprintf("%v/%v/environ", procfs, pid) - clusterIp, err := readEnvironmentVariable(environmentFile, "INSTANCE_IP") + podIp, err := readEnvironmentVariable(environmentFile, "INSTANCE_IP") if err != nil { return false } - if clusterIp == "" { + if podIp == "" { logger.Log.Debugf("Found an envoy process without INSTANCE_IP variable %v\n", pid) return false } - logger.Log.Infof("Found envoy pid %v with cluster ip %v", pid, clusterIp) + logger.Log.Infof("Found envoy pid %v with cluster ip %v", pid, podIp) - for _, value := range clusterIps { - if value == clusterIp { + for _, pod := range pods { + if pod.Status.PodIP == podIp { return true } } diff --git a/tap/source/packet_source_manager.go b/tap/source/packet_source_manager.go index 5d9df21d8..af88554ea 100644 --- a/tap/source/packet_source_manager.go +++ b/tap/source/packet_source_manager.go @@ -8,6 +8,7 @@ import ( "github.com/up9inc/mizu/shared/logger" "github.com/vishvananda/netns" + v1 "k8s.io/api/core/v1" ) type PacketSourceManager struct { @@ -15,7 +16,7 @@ type PacketSourceManager struct { } func NewPacketSourceManager(procfs string, pids string, filename string, interfaceName string, - istio bool, clusterIps []string, behaviour TcpPacketSourceBehaviour) (*PacketSourceManager, error) { + istio bool, pods []v1.Pod, behaviour TcpPacketSourceBehaviour) (*PacketSourceManager, error) { sources := make([]*tcpPacketSource, 0) sources, err := createHostSource(sources, filename, interfaceName, behaviour) @@ -24,7 +25,7 @@ func NewPacketSourceManager(procfs string, pids string, filename string, interfa } sources = createSourcesFromPids(sources, procfs, pids, interfaceName, behaviour) - sources = createSourcesFromEnvoy(sources, istio, procfs, clusterIps, interfaceName, behaviour) + sources = createSourcesFromEnvoy(sources, istio, procfs, pods, interfaceName, behaviour) return &PacketSourceManager{ sources: sources, @@ -53,7 +54,7 @@ func createSourcesFromPids(sources []*tcpPacketSource, procfs string, pids strin return sources } -func createSourcesFromEnvoy(sources []*tcpPacketSource, istio bool, procfs string, clusterIps []string, +func createSourcesFromEnvoy(sources []*tcpPacketSource, istio bool, procfs string, clusterIps []v1.Pod, interfaceName string, behaviour TcpPacketSourceBehaviour) []*tcpPacketSource { if !istio { return sources diff --git a/tap/tcp_stream_factory.go b/tap/tcp_stream_factory.go index 96527bf9e..847ca10d1 100644 --- a/tap/tcp_stream_factory.go +++ b/tap/tcp_stream_factory.go @@ -7,6 +7,7 @@ import ( "github.com/up9inc/mizu/shared/logger" "github.com/up9inc/mizu/tap/api" + v1 "k8s.io/api/core/v1" "github.com/google/gopacket" "github.com/google/gopacket/layers" // pulls in all layers decoders @@ -140,18 +141,27 @@ func (factory *tcpStreamFactory) WaitGoRoutines() { factory.wg.Wait() } +func inArrayPod(pods []v1.Pod, address string) bool { + for _, pod := range pods { + if pod.Status.PodIP == address { + return true + } + } + return false +} + func (factory *tcpStreamFactory) getStreamProps(srcIP string, srcPort string, dstIP string, dstPort string) *streamProps { if factory.opts.HostMode { - if inArrayString(factory.opts.FilterAuthorities, fmt.Sprintf("%s:%s", dstIP, dstPort)) { + if inArrayPod(factory.opts.FilterAuthorities, fmt.Sprintf("%s:%s", dstIP, dstPort)) { logger.Log.Debugf("getStreamProps %s", fmt.Sprintf("+ host1 %s:%s", dstIP, dstPort)) return &streamProps{isTapTarget: true, isOutgoing: false} - } else if inArrayString(factory.opts.FilterAuthorities, dstIP) { + } else if inArrayPod(factory.opts.FilterAuthorities, dstIP) { logger.Log.Debugf("getStreamProps %s", fmt.Sprintf("+ host2 %s", dstIP)) return &streamProps{isTapTarget: true, isOutgoing: false} - } else if inArrayString(factory.opts.FilterAuthorities, fmt.Sprintf("%s:%s", srcIP, srcPort)) { + } else if inArrayPod(factory.opts.FilterAuthorities, fmt.Sprintf("%s:%s", srcIP, srcPort)) { logger.Log.Debugf("getStreamProps %s", fmt.Sprintf("+ host3 %s:%s", srcIP, srcPort)) return &streamProps{isTapTarget: true, isOutgoing: true} - } else if inArrayString(factory.opts.FilterAuthorities, srcIP) { + } else if inArrayPod(factory.opts.FilterAuthorities, srcIP) { logger.Log.Debugf("getStreamProps %s", fmt.Sprintf("+ host4 %s", srcIP)) return &streamProps{isTapTarget: true, isOutgoing: true} } From 4de795e46396175adc462b78d6d2dabcb5f58dcd Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Thu, 16 Dec 2021 11:04:36 +0200 Subject: [PATCH 85/93] Alert on acceptance tests failure (#537) --- .github/workflows/acceptance_tests.yml | 12 +++++++++++ .github/workflows/security_validation.yml | 25 ----------------------- 2 files changed, 12 insertions(+), 25 deletions(-) delete mode 100644 .github/workflows/security_validation.yml diff --git a/.github/workflows/acceptance_tests.yml b/.github/workflows/acceptance_tests.yml index a23f3c445..5486bb755 100644 --- a/.github/workflows/acceptance_tests.yml +++ b/.github/workflows/acceptance_tests.yml @@ -30,3 +30,15 @@ jobs: - name: Test run: make acceptance-test + + - name: Slack notification on failure + uses: ravsamhq/notify-slack-action@v1 + if: always() + with: + status: ${{ job.status }} + notification_title: 'Mizu {workflow} has {status_message}' + message_format: '{emoji} *{workflow}* {status_message} during <{run_url}|run>, after commit: <{commit_url}|{commit_sha}>' + footer: 'Linked Repo <{repo_url}|{repo}>' + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} diff --git a/.github/workflows/security_validation.yml b/.github/workflows/security_validation.yml deleted file mode 100644 index 2808638a8..000000000 --- a/.github/workflows/security_validation.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Security validation - -on: - pull_request: - branches: - - 'develop' - - 'main' - -jobs: - security: - name: Check for vulnerabilities - runs-on: ubuntu-latest - env: - SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} - steps: - - uses: actions/checkout@v2 - - - uses: snyk/actions/setup@master - - name: Set up Go 1.16 - uses: actions/setup-go@v2 - with: - go-version: '1.16' - - - name: Run snyl on all projects - run: snyk test --all-projects From 397d3931adae64f70b675e202885d958701e78dc Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Thu, 16 Dec 2021 12:39:45 +0200 Subject: [PATCH 86/93] Fix health tapper status count (#538) --- agent/pkg/controllers/status_controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/pkg/controllers/status_controller.go b/agent/pkg/controllers/status_controller.go index b86c1a56e..8e95e82e2 100644 --- a/agent/pkg/controllers/status_controller.go +++ b/agent/pkg/controllers/status_controller.go @@ -24,7 +24,7 @@ func HealthCheck(c *gin.Context) { } } - tappers := make([]shared.TapperStatus, len(providers.TappersStatus)) + tappers := make([]shared.TapperStatus, 0) for _, value := range providers.TappersStatus { tappers = append(tappers, value) } From 3b695085812dbae53ec78d45e95f6d1c4915ff8a Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Thu, 16 Dec 2021 14:38:32 +0200 Subject: [PATCH 87/93] Fix: acceptance tests (#539) --- cli/cmd/tapRunner.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 024b9a4d1..442bae8e0 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -613,7 +613,7 @@ func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provi if !config.Config.HeadlessMode { uiUtils.OpenBrowser(url) } - case "FailedScheduling", "Failed", "Killing": + case "FailedScheduling", "Failed": logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Mizu API Server status: %s - %s", event.Reason, event.Note)) cancel() break From 23332639d0db0f795fd2b2ca4d28605baed62836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Mert=20Y=C4=B1ld=C4=B1ran?= Date: Fri, 17 Dec 2021 17:26:36 +0300 Subject: [PATCH 88/93] Fix a JavaScript error in case of `null` attribute and an interface conversion error in the API server (#540) --- tap/extensions/amqp/helpers.go | 8 +++++++- ui/src/components/EntriesList.tsx | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tap/extensions/amqp/helpers.go b/tap/extensions/amqp/helpers.go index 188ae18a1..2c3a8b571 100644 --- a/tap/extensions/amqp/helpers.go +++ b/tap/extensions/amqp/helpers.go @@ -579,12 +579,18 @@ func representConnectionStart(event map[string]interface{}) []interface{} { } func representConnectionClose(event map[string]interface{}) []interface{} { + replyCode := "" + + if event["replyCode"] != nil { + replyCode = fmt.Sprintf("%g", event["replyCode"].(float64)) + } + rep := make([]interface{}, 0) details, _ := json.Marshal([]api.TableData{ { Name: "Reply Code", - Value: fmt.Sprintf("%g", event["replyCode"].(float64)), + Value: replyCode, Selector: `request.replyCode`, }, { diff --git a/ui/src/components/EntriesList.tsx b/ui/src/components/EntriesList.tsx index 14e78bec2..6b3a6917b 100644 --- a/ui/src/components/EntriesList.tsx +++ b/ui/src/components/EntriesList.tsx @@ -66,7 +66,7 @@ export const EntriesList: React.FC = ({entries, setEntries, qu } setIsLoadingTop(true); const data = await api.fetchEntries(leftOffTop, -1, query, 100, 3000); - if (!data || !data.meta) { + if (!data || data.data === null || data.meta === null) { setNoMoreDataTop(true); setIsLoadingTop(false); return; From 36828bcc1db8d2e550fd436f4893c7894ce5661c Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Sun, 19 Dec 2021 09:29:09 +0200 Subject: [PATCH 89/93] Bringing back the pod watch api server events to make acceptance test more stable (#541) --- cli/cmd/tapRunner.go | 102 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 83 insertions(+), 19 deletions(-) diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 442bae8e0..a4307fa46 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -151,6 +151,7 @@ func RunMizuTap() { } else { defer finishMizuExecution(kubernetesProvider, apiProvider) + go goUtils.HandleExcWrapper(watchApiServerEvents, ctx, kubernetesProvider, cancel) go goUtils.HandleExcWrapper(watchApiServerPod, ctx, kubernetesProvider, cancel) // block until exit signal or error @@ -564,6 +565,67 @@ func waitUntilNamespaceDeleted(ctx context.Context, cancel context.CancelFunc, k } func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { + podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s$", kubernetes.ApiServerPodName)) + podWatchHelper := kubernetes.NewPodWatchHelper(kubernetesProvider, podExactRegex) + eventChan, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.MizuResourcesNamespace}, podWatchHelper) + isPodReady := false + timeAfter := time.After(25 * time.Second) + for { + select { + case wEvent, ok := <-eventChan: + if !ok { + eventChan = nil + continue + } + + switch wEvent.Type { + case kubernetes.EventAdded: + logger.Log.Debugf("Watching API Server pod loop, added") + case kubernetes.EventDeleted: + logger.Log.Infof("%s removed", kubernetes.ApiServerPodName) + cancel() + return + case kubernetes.EventModified: + modifiedPod, err := wEvent.ToPod() + if err != nil { + logger.Log.Errorf(uiUtils.Error, err) + cancel() + continue + } + + logger.Log.Debugf("Watching API Server pod loop, modified: %v", modifiedPod.Status.Phase) + + if modifiedPod.Status.Phase == core.PodRunning && !isPodReady { + isPodReady = true + postApiServerStarted(ctx, kubernetesProvider, cancel, err) + } + case kubernetes.EventBookmark: + break + case kubernetes.EventError: + break + } + case err, ok := <-errorChan: + if !ok { + errorChan = nil + continue + } + + logger.Log.Errorf("[ERROR] Agent creation, watching %v namespace, error: %v", config.Config.MizuResourcesNamespace, err) + cancel() + + case <-timeAfter: + if !isPodReady { + logger.Log.Errorf(uiUtils.Error, "Mizu API server was not ready in time") + cancel() + } + case <-ctx.Done(): + logger.Log.Debugf("Watching API Server pod loop, ctx done") + return + } + } +} + +func watchApiServerEvents(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s", kubernetes.ApiServerPodName)) eventWatchHelper := kubernetes.NewEventWatchHelper(kubernetesProvider, podExactRegex, "pod") eventChan, errorChan := kubernetes.FilteredWatch(ctx, eventWatchHelper, []string{config.Config.MizuResourcesNamespace}, eventWatchHelper) @@ -594,25 +656,6 @@ func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provi event.Note)) switch event.Reason { - case "Started": - go startProxyReportErrorIfAny(kubernetesProvider, cancel) - - url := GetApiServerUrl() - if err := apiProvider.TestConnection(); err != nil { - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Couldn't connect to API server, for more info check logs at %s", fsUtils.GetLogFilePath())) - cancel() - break - } - options, _ := getMizuApiFilteringOptions() - if err = startTapperSyncer(ctx, cancel, kubernetesProvider, state.targetNamespaces, *options, state.startTime); err != nil { - logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Error starting mizu tapper syncer: %v", err)) - cancel() - } - - logger.Log.Infof("Mizu is available at %s", url) - if !config.Config.HeadlessMode { - uiUtils.OpenBrowser(url) - } case "FailedScheduling", "Failed": logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Mizu API Server status: %s - %s", event.Reason, event.Note)) cancel() @@ -632,6 +675,27 @@ func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provi } } +func postApiServerStarted(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc, err error) { + go startProxyReportErrorIfAny(kubernetesProvider, cancel) + + url := GetApiServerUrl() + if err := apiProvider.TestConnection(); err != nil { + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Couldn't connect to API server, for more info check logs at %s", fsUtils.GetLogFilePath())) + cancel() + return + } + options, _ := getMizuApiFilteringOptions() + if err = startTapperSyncer(ctx, cancel, kubernetesProvider, state.targetNamespaces, *options, state.startTime); err != nil { + logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Error starting mizu tapper syncer: %v", err)) + cancel() + } + + logger.Log.Infof("Mizu is available at %s", url) + if !config.Config.HeadlessMode { + uiUtils.OpenBrowser(url) + } +} + func getNamespaces(kubernetesProvider *kubernetes.Provider) []string { if config.Config.Tap.AllNamespaces { return []string{kubernetes.K8sAllNamespaces} From d316589bda21745b36fc2cf518461ccde0c65037 Mon Sep 17 00:00:00 2001 From: RamiBerm <54766858+RamiBerm@users.noreply.github.com> Date: Sun, 19 Dec 2021 11:24:17 +0200 Subject: [PATCH 90/93] TRA-4060 fix proxying error (#542) --- ui/src/components/TrafficPage.tsx | 35 +++++++++++++++++-------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index d79356293..cdc21e1de 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -1,4 +1,4 @@ -import React, {useEffect, useRef, useState} from "react"; +import React, {useEffect, useMemo, useRef, useState} from "react"; import {Filters} from "./Filters"; import {EntriesList} from "./EntriesList"; import {makeStyles} from "@material-ui/core"; @@ -12,6 +12,7 @@ import {StatusBar} from "./UI/StatusBar"; import Api, {MizuWebsocketURL} from "../helpers/api"; import { ToastContainer, toast } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; +import debounce from 'lodash/debounce'; const useLayoutStyles = makeStyles(() => ({ details: { @@ -72,22 +73,24 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS const [startTime, setStartTime] = useState(0); - useEffect(() => { - (async function() { - if (!query) { - setQueryBackgroundColor("#f5f5f5") - } else { - const data = await api.validateQuery(query); - if (!data) { - return; - } - if (data.valid) { - setQueryBackgroundColor("#d2fad2"); - } else { - setQueryBackgroundColor("#fad6dc"); - } + const handleQueryChange = useMemo(() => debounce(async (query: string) => { + if (!query) { + setQueryBackgroundColor("#f5f5f5") + } else { + const data = await api.validateQuery(query); + if (!data) { + return; } - })(); + if (data.valid) { + setQueryBackgroundColor("#d2fad2"); + } else { + setQueryBackgroundColor("#fad6dc"); + } + } + }, 500), []) as (query: string) => void; + + useEffect(() => { + handleQueryChange(query); }, [query]); useEffect(() => { From 791f762803388529f3228bc79820f23d44ce779d Mon Sep 17 00:00:00 2001 From: RamiBerm <54766858+RamiBerm@users.noreply.github.com> Date: Sun, 19 Dec 2021 11:52:43 +0200 Subject: [PATCH 91/93] TRA-4062 remove duplicate target pod print (#543) --- cli/cmd/tapRunner.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index a4307fa46..90b7eb071 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -5,11 +5,12 @@ import ( "errors" "fmt" "io/ioutil" - "k8s.io/apimachinery/pkg/util/intstr" "regexp" "strings" "time" + "k8s.io/apimachinery/pkg/util/intstr" + "github.com/getkin/kin-openapi/openapi3" "gopkg.in/yaml.v3" core "k8s.io/api/core/v1" @@ -160,10 +161,6 @@ func RunMizuTap() { } func handleDaemonModePostCreation(ctx context.Context, cancel context.CancelFunc, kubernetesProvider *kubernetes.Provider, namespaces []string) error { - if err := printTappedPodsPreview(ctx, kubernetesProvider, namespaces); err != nil { - return err - } - apiProvider := apiserver.NewProvider(GetApiServerUrl(), 90, 1*time.Second) if err := waitForDaemonModeToBeReady(cancel, kubernetesProvider, apiProvider); err != nil { @@ -193,7 +190,6 @@ func printTappedPodsPreview(ctx context.Context, kubernetesProvider *kubernetes. } func waitForDaemonModeToBeReady(cancel context.CancelFunc, kubernetesProvider *kubernetes.Provider, apiProvider *apiserver.Provider) error { - logger.Log.Info("Waiting for mizu to be ready... (may take a few minutes)") go startProxyReportErrorIfAny(kubernetesProvider, cancel) // TODO: TRA-3903 add a smarter test to see that tapping/pod watching is functioning properly From cba0c682e5e118be111d55dc6956e9b7d073a8da Mon Sep 17 00:00:00 2001 From: Igor Gov Date: Sun, 19 Dec 2021 13:03:53 +0200 Subject: [PATCH 92/93] Report pods "isTapped" to FE (#535) --- agent/go.mod | 2 +- agent/go.sum | 2 ++ agent/main.go | 12 ++++++-- agent/pkg/api/socket_server_handlers.go | 1 - agent/pkg/controllers/status_controller.go | 21 +++++++++++-- shared/models.go | 15 ++++++---- ui/src/components/TrafficPage.tsx | 2 +- ui/src/components/UI/StatusBar.tsx | 20 +++++++++---- ui/src/components/UI/style/StatusBar.sass | 5 ++++ ui/src/components/assets/failed.svg | 1 + ui/src/components/assets/success.svg | 1 + ui/src/components/assets/warning_icon.svg | 34 ++++++++++++++++++++++ 12 files changed, 98 insertions(+), 18 deletions(-) create mode 100644 ui/src/components/assets/failed.svg create mode 100644 ui/src/components/assets/success.svg create mode 100644 ui/src/components/assets/warning_icon.svg diff --git a/agent/go.mod b/agent/go.mod index c2c3ba36e..a4ccbb693 100644 --- a/agent/go.mod +++ b/agent/go.mod @@ -7,7 +7,7 @@ require ( github.com/djherbis/atime v1.0.0 github.com/getkin/kin-openapi v0.76.0 github.com/gin-contrib/static v0.0.1 - github.com/gin-gonic/gin v1.7.2 + github.com/gin-gonic/gin v1.7.7 github.com/go-playground/locales v0.13.0 github.com/go-playground/universal-translator v0.17.0 github.com/go-playground/validator/v10 v10.5.0 diff --git a/agent/go.sum b/agent/go.sum index 2c113c74a..ed288cfc1 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -125,6 +125,8 @@ github.com/gin-contrib/static v0.0.1/go.mod h1:CSxeF+wep05e0kCOsqWdAWbSszmc31zTI github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= +github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= diff --git a/agent/main.go b/agent/main.go index ab8612022..564588a02 100644 --- a/agent/main.go +++ b/agent/main.go @@ -23,6 +23,7 @@ import ( "path/filepath" "plugin" "sort" + "strings" "syscall" "time" @@ -465,14 +466,19 @@ func startMizuTapperSyncer(ctx context.Context, provider *kubernetes.Provider) ( logger.Log.Debug("mizuTapperSyncer pod changes channel closed, ending listener loop") return } - tapStatus := shared.TapStatus{Pods: kubernetes.GetPodInfosForPods(tapperSyncer.CurrentlyTappedPods)} + providers.TapStatus = shared.TapStatus{Pods: kubernetes.GetPodInfosForPods(tapperSyncer.CurrentlyTappedPods)} - serializedTapStatus, err := json.Marshal(shared.CreateWebSocketStatusMessage(tapStatus)) + tappedPodsStatus := make([]shared.TappedPodStatus, 0) + for _, pod := range providers.TapStatus.Pods { + isTapped := strings.ToLower(providers.TappersStatus[pod.NodeName].Status) == "started" + tappedPodsStatus = append(tappedPodsStatus, shared.TappedPodStatus{Name: pod.Name, Namespace: pod.Namespace, IsTapped: isTapped}) + } + + serializedTapStatus, err := json.Marshal(shared.CreateWebSocketStatusMessage(tappedPodsStatus)) if err != nil { logger.Log.Fatalf("error serializing tap status: %v", err) } api.BroadcastToBrowserClients(serializedTapStatus) - providers.TapStatus.Pods = tapStatus.Pods providers.ExpectedTapperAmount = tapPodChangeEvent.ExpectedTapperAmount case tapperStatus, ok := <-tapperSyncer.TapperStatusChangedOut: if !ok { diff --git a/agent/pkg/api/socket_server_handlers.go b/agent/pkg/api/socket_server_handlers.go index d596becb2..a02aaa82b 100644 --- a/agent/pkg/api/socket_server_handlers.go +++ b/agent/pkg/api/socket_server_handlers.go @@ -83,7 +83,6 @@ func (h *RoutesEventHandlers) WebSocketMessage(_ int, message []byte) { if err != nil { logger.Log.Infof("Could not unmarshal message of message type %s %v", socketMessageBase.MessageType, err) } else { - providers.TapStatus.Pods = statusMessage.TappingStatus.Pods BroadcastToBrowserClients(message) } case shared.WebsocketMessageTypeOutboundLink: diff --git a/agent/pkg/controllers/status_controller.go b/agent/pkg/controllers/status_controller.go index 8e95e82e2..6d049433d 100644 --- a/agent/pkg/controllers/status_controller.go +++ b/agent/pkg/controllers/status_controller.go @@ -10,6 +10,7 @@ import ( "mizuserver/pkg/up9" "mizuserver/pkg/validation" "net/http" + "strings" "github.com/gin-gonic/gin" "github.com/up9inc/mizu/shared" @@ -49,7 +50,17 @@ func PostTappedPods(c *gin.Context) { } logger.Log.Infof("[Status] POST request: %d tapped pods", len(tapStatus.Pods)) providers.TapStatus.Pods = tapStatus.Pods - message := shared.CreateWebSocketStatusMessage(*tapStatus) + broadcastTappedPodsStatus() +} + +func broadcastTappedPodsStatus() { + tappedPodsStatus := make([]shared.TappedPodStatus, 0) + for _, pod := range providers.TapStatus.Pods { + isTapped := strings.ToLower(providers.TappersStatus[pod.NodeName].Status) == "started" + tappedPodsStatus = append(tappedPodsStatus, shared.TappedPodStatus{Name: pod.Name, Namespace: pod.Namespace, IsTapped: isTapped}) + } + + message := shared.CreateWebSocketStatusMessage(tappedPodsStatus) if jsonBytes, err := json.Marshal(message); err != nil { logger.Log.Errorf("Could not Marshal message %v", err) } else { @@ -72,6 +83,7 @@ func PostTapperStatus(c *gin.Context) { providers.TappersStatus = make(map[string]shared.TapperStatus) } providers.TappersStatus[tapperStatus.NodeName] = *tapperStatus + broadcastTappedPodsStatus() } func GetTappersCount(c *gin.Context) { @@ -89,7 +101,12 @@ func GetAuthStatus(c *gin.Context) { } func GetTappingStatus(c *gin.Context) { - c.JSON(http.StatusOK, providers.TapStatus) + tappedPodsStatus := make([]shared.TappedPodStatus, 0) + for _, pod := range providers.TapStatus.Pods { + isTapped := strings.ToLower(providers.TappersStatus[pod.NodeName].Status) == "started" + tappedPodsStatus = append(tappedPodsStatus, shared.TappedPodStatus{Name: pod.Name, Namespace: pod.Namespace, IsTapped: isTapped}) + } + c.JSON(http.StatusOK, tappedPodsStatus) } func AnalyzeInformation(c *gin.Context) { diff --git a/shared/models.go b/shared/models.go index c12edcb72..ef0cb2949 100644 --- a/shared/models.go +++ b/shared/models.go @@ -64,7 +64,7 @@ type AnalyzeStatus struct { type WebSocketStatusMessage struct { *WebSocketMessageMetadata - TappingStatus TapStatus `json:"tappingStatus"` + TappingStatus []TappedPodStatus `json:"tappingStatus"` } type TapperStatus struct { @@ -73,9 +73,14 @@ type TapperStatus struct { Status string `json:"status"` } +type TappedPodStatus struct { + Name string `json:"name"` + Namespace string `json:"namespace"` + IsTapped bool `json:"isTapped"` +} + type TapStatus struct { - Pods []PodInfo `json:"pods"` - TLSLinks []TLSLinkInfo `json:"tlsLinks"` + Pods []PodInfo `json:"pods"` } type PodInfo struct { @@ -98,12 +103,12 @@ type SyncEntriesConfig struct { UploadIntervalSec int `json:"interval"` } -func CreateWebSocketStatusMessage(tappingStatus TapStatus) WebSocketStatusMessage { +func CreateWebSocketStatusMessage(tappedPodsStatus []TappedPodStatus) WebSocketStatusMessage { return WebSocketStatusMessage{ WebSocketMessageMetadata: &WebSocketMessageMetadata{ MessageType: WebSocketMessageTypeUpdateStatus, }, - TappingStatus: tappingStatus, + TappingStatus: tappedPodsStatus, } } diff --git a/ui/src/components/TrafficPage.tsx b/ui/src/components/TrafficPage.tsx index cdc21e1de..0faf7a816 100644 --- a/ui/src/components/TrafficPage.tsx +++ b/ui/src/components/TrafficPage.tsx @@ -323,7 +323,7 @@ export const TrafficPage: React.FC = ({setAnalyzeStatus, onTLS {selectedEntryData && }
} - {tappingStatus?.pods != null && } + {tappingStatus && } { @@ -22,23 +26,29 @@ export const StatusBar: React.FC = ({tappingStatus}) => { const [expandedBar, setExpandedBar] = useState(false); - const uniqueNamespaces = Array.from(new Set(tappingStatus.pods.map(pod => pod.namespace))); - const amountOfPods = tappingStatus.pods.length; + const uniqueNamespaces = Array.from(new Set(tappingStatus.map(pod => pod.namespace))); + const amountOfPods = tappingStatus.length; + const amountOfTappedPods = tappingStatus.filter(pod => pod.isTapped).length; + const amountOfUntappedPods = amountOfPods - amountOfTappedPods; return
setExpandedBar(true)} onMouseLeave={() => setExpandedBar(false)}> -
{`Tapping ${amountOfPods} ${pluralize('pod', amountOfPods)} in ${pluralize('namespace', uniqueNamespaces.length)} ${uniqueNamespaces.join(", ")}`}
+
+ {tappingStatus.some(pod => !pod.isTapped) && warning} + {`Tapping ${amountOfUntappedPods > 0 ? amountOfTappedPods + " / " + amountOfPods : amountOfPods} ${pluralize('pod', amountOfPods)} in ${pluralize('namespace', uniqueNamespaces.length)} ${uniqueNamespaces.join(", ")}`}
{expandedBar &&
+ - {tappingStatus.pods.map(pod => + {tappingStatus.map(pod => + )}
Pod name NamespaceTapping
{pod.name} {pod.namespace}status
diff --git a/ui/src/components/UI/style/StatusBar.sass b/ui/src/components/UI/style/StatusBar.sass index 6a55dbc36..f6e66624c 100644 --- a/ui/src/components/UI/style/StatusBar.sass +++ b/ui/src/components/UI/style/StatusBar.sass @@ -24,8 +24,13 @@ padding: 8px font-weight: 600 + img + margin-right: 10px + height: 22px + th text-align: left + padding-right: 15px td padding-right: 15px padding-top: 5px diff --git a/ui/src/components/assets/failed.svg b/ui/src/components/assets/failed.svg new file mode 100644 index 000000000..bab53af12 --- /dev/null +++ b/ui/src/components/assets/failed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/src/components/assets/success.svg b/ui/src/components/assets/success.svg new file mode 100644 index 000000000..f8fe3aa64 --- /dev/null +++ b/ui/src/components/assets/success.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/src/components/assets/warning_icon.svg b/ui/src/components/assets/warning_icon.svg new file mode 100644 index 000000000..7ef6ba5a2 --- /dev/null +++ b/ui/src/components/assets/warning_icon.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 2d78785558fe2c75cb7b9d369cf999997629abdd Mon Sep 17 00:00:00 2001 From: gadotroee <55343099+gadotroee@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:46:14 +0200 Subject: [PATCH 93/93] Fix acceptance tests (after pods status request change) (#545) --- acceptanceTests/testsUtils.go | 5 ++--- agent/main.go | 7 +------ agent/pkg/controllers/status_controller.go | 21 ++++++--------------- agent/pkg/utils/utils.go | 17 ++++++++--------- 4 files changed, 17 insertions(+), 33 deletions(-) diff --git a/acceptanceTests/testsUtils.go b/acceptanceTests/testsUtils.go index 79023e160..715df51d7 100644 --- a/acceptanceTests/testsUtils.go +++ b/acceptanceTests/testsUtils.go @@ -304,11 +304,10 @@ func cleanupCommand(cmd *exec.Cmd) error { } func getPods(tapStatusInterface interface{}) ([]map[string]interface{}, error) { - tapStatus := tapStatusInterface.(map[string]interface{}) - podsInterface := tapStatus["pods"].([]interface{}) + tapPodsInterface := tapStatusInterface.([]interface{}) var pods []map[string]interface{} - for _, podInterface := range podsInterface { + for _, podInterface := range tapPodsInterface { pods = append(pods, podInterface.(map[string]interface{})) } diff --git a/agent/main.go b/agent/main.go index 564588a02..f90dc0f96 100644 --- a/agent/main.go +++ b/agent/main.go @@ -23,7 +23,6 @@ import ( "path/filepath" "plugin" "sort" - "strings" "syscall" "time" @@ -468,11 +467,7 @@ func startMizuTapperSyncer(ctx context.Context, provider *kubernetes.Provider) ( } providers.TapStatus = shared.TapStatus{Pods: kubernetes.GetPodInfosForPods(tapperSyncer.CurrentlyTappedPods)} - tappedPodsStatus := make([]shared.TappedPodStatus, 0) - for _, pod := range providers.TapStatus.Pods { - isTapped := strings.ToLower(providers.TappersStatus[pod.NodeName].Status) == "started" - tappedPodsStatus = append(tappedPodsStatus, shared.TappedPodStatus{Name: pod.Name, Namespace: pod.Namespace, IsTapped: isTapped}) - } + tappedPodsStatus := utils.GetTappedPodsStatus() serializedTapStatus, err := json.Marshal(shared.CreateWebSocketStatusMessage(tappedPodsStatus)) if err != nil { diff --git a/agent/pkg/controllers/status_controller.go b/agent/pkg/controllers/status_controller.go index 6d049433d..0987ddc16 100644 --- a/agent/pkg/controllers/status_controller.go +++ b/agent/pkg/controllers/status_controller.go @@ -3,18 +3,17 @@ package controllers import ( "encoding/json" "fmt" + "github.com/gin-gonic/gin" + "github.com/up9inc/mizu/shared" + "github.com/up9inc/mizu/shared/logger" "mizuserver/pkg/api" "mizuserver/pkg/config" "mizuserver/pkg/holder" "mizuserver/pkg/providers" "mizuserver/pkg/up9" + "mizuserver/pkg/utils" "mizuserver/pkg/validation" "net/http" - "strings" - - "github.com/gin-gonic/gin" - "github.com/up9inc/mizu/shared" - "github.com/up9inc/mizu/shared/logger" ) func HealthCheck(c *gin.Context) { @@ -54,11 +53,7 @@ func PostTappedPods(c *gin.Context) { } func broadcastTappedPodsStatus() { - tappedPodsStatus := make([]shared.TappedPodStatus, 0) - for _, pod := range providers.TapStatus.Pods { - isTapped := strings.ToLower(providers.TappersStatus[pod.NodeName].Status) == "started" - tappedPodsStatus = append(tappedPodsStatus, shared.TappedPodStatus{Name: pod.Name, Namespace: pod.Namespace, IsTapped: isTapped}) - } + tappedPodsStatus := utils.GetTappedPodsStatus() message := shared.CreateWebSocketStatusMessage(tappedPodsStatus) if jsonBytes, err := json.Marshal(message); err != nil { @@ -101,11 +96,7 @@ func GetAuthStatus(c *gin.Context) { } func GetTappingStatus(c *gin.Context) { - tappedPodsStatus := make([]shared.TappedPodStatus, 0) - for _, pod := range providers.TapStatus.Pods { - isTapped := strings.ToLower(providers.TappersStatus[pod.NodeName].Status) == "started" - tappedPodsStatus = append(tappedPodsStatus, shared.TappedPodStatus{Name: pod.Name, Namespace: pod.Namespace, IsTapped: isTapped}) - } + tappedPodsStatus := utils.GetTappedPodsStatus() c.JSON(http.StatusOK, tappedPodsStatus) } diff --git a/agent/pkg/utils/utils.go b/agent/pkg/utils/utils.go index 4838fe666..95b92e288 100644 --- a/agent/pkg/utils/utils.go +++ b/agent/pkg/utils/utils.go @@ -3,11 +3,12 @@ package utils import ( "context" "fmt" + "mizuserver/pkg/providers" "net/http" "net/url" "os" "os/signal" - "reflect" + "strings" "syscall" "time" @@ -44,15 +45,13 @@ func StartServer(app *gin.Engine) { } } -func ReverseSlice(data interface{}) { - value := reflect.ValueOf(data) - valueLen := value.Len() - for i := 0; i <= int((valueLen-1)/2); i++ { - reverseIndex := valueLen - 1 - i - tmp := value.Index(reverseIndex).Interface() - value.Index(reverseIndex).Set(value.Index(i)) - value.Index(i).Set(reflect.ValueOf(tmp)) +func GetTappedPodsStatus() []shared.TappedPodStatus { + tappedPodsStatus := make([]shared.TappedPodStatus, 0) + for _, pod := range providers.TapStatus.Pods { + isTapped := strings.ToLower(providers.TappersStatus[pod.NodeName].Status) == "started" + tappedPodsStatus = append(tappedPodsStatus, shared.TappedPodStatus{Name: pod.Name, Namespace: pod.Namespace, IsTapped: isTapped}) } + return tappedPodsStatus } func CheckErr(e error) {