Skip to content

Commit e3b1a9a

Browse files
authored
Merge pull request #8 from replicatedhq/redact2
Adding basic redaction functionality
2 parents e1abd95 + 9942f4b commit e3b1a9a

File tree

8 files changed

+2034
-2
lines changed

8 files changed

+2034
-2
lines changed

Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
# Image URL to use all building/pushing image targets
33
IMG ?= controller:latest
4+
export GO111MODULE=on
45

56
all: test manager
67

@@ -93,3 +94,9 @@ run-preflight: preflight
9394
--collector-pullpolicy=Always \
9495
--image=localhost:32000/troubleshoot:alpha \
9596
--pullpolicy=Always
97+
98+
.PHONY: run-troubleshoot
99+
run-troubleshoot: troubleshoot
100+
./bin/troubleshoot run \
101+
--image=localhost:32000/troubleshoot:alpha \
102+
--pullpolicy=Always

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ require (
1414
github.com/nwaples/rardecode v1.0.0 // indirect
1515
github.com/onsi/gomega v1.5.0
1616
github.com/pierrec/lz4 v2.0.5+incompatible // indirect
17+
github.com/pkg/errors v0.8.1
18+
github.com/pmezard/go-difflib v1.0.0
19+
github.com/sergi/go-diff v1.0.0
1720
github.com/spf13/cobra v0.0.3
1821
github.com/spf13/viper v1.4.0
1922
github.com/stretchr/testify v1.3.0

go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nA
8585
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
8686
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
8787
github.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ=
88+
github.com/gobuffalo/envy v1.6.15 h1:OsV5vOpHYUpP7ZLS6sem1y40/lNX1BZj+ynMiRi21lQ=
8889
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
8990
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
9091
github.com/gogo/protobuf v1.0.0 h1:2jyBKDKU/8v3v2xVR2PtiWQviFUyiaGk2rpfyFT8rTM=
@@ -162,6 +163,7 @@ github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ
162163
github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI=
163164
github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
164165
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
166+
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
165167
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
166168
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
167169
github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
@@ -190,6 +192,7 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP
190192
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
191193
github.com/manifoldco/promptui v0.3.2 h1:rir7oByTERac6jhpHUPErHuopoRDvO3jxS+FdadEns8=
192194
github.com/manifoldco/promptui v0.3.2/go.mod h1:8JU+igZ+eeiiRku4T5BjtKh2ms8sziGpSYl1gN8Bazw=
195+
github.com/markbates/inflect v1.0.4 h1:5fh1gzTFhfae06u3hzHYO9xe3l3v3nW5Pwt3naLTP5g=
193196
github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs=
194197
github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
195198
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
@@ -279,9 +282,12 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T
279282
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
280283
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
281284
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
285+
github.com/rogpeppe/go-internal v1.2.2 h1:J7U/N7eRtzjhs26d6GqMh2HBuXP8/Z64Densiiieafo=
282286
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
283287
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
284288
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
289+
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
290+
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
285291
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
286292
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
287293
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@@ -425,6 +431,7 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3
425431
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
426432
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
427433
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
434+
golang.org/x/tools v0.0.0-20190501045030-23463209683d h1:D7DVZUZEUgsSIDTivnUtVeGfN5AvhDIKtdIZAqx0ieE=
428435
golang.org/x/tools v0.0.0-20190501045030-23463209683d/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
429436
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
430437
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
@@ -533,6 +540,7 @@ sigs.k8s.io/controller-runtime v0.1.12/go.mod h1:HFAYoOh6XMV+jKF1UjFwrknPbowfyHE
533540
sigs.k8s.io/controller-runtime v0.2.0-beta.2 h1:hOWldx1qmGI9TsU+uUsq1xTgVmUV7AZo08VAYX0dwGI=
534541
sigs.k8s.io/controller-runtime v0.2.0-beta.2/go.mod h1:TSH2R0nSz4WAlUUlNnOFcOR/VUhfwBLlmtq2X6AiQCA=
535542
sigs.k8s.io/controller-tools v0.1.11/go.mod h1:6g08p9m9G/So3sBc1AOQifHfhxH/mb6Sc4z0LMI8XMw=
543+
sigs.k8s.io/controller-tools v0.2.0-beta.2 h1:ucniFzEuW7PFfFDuUxacdY4Fy4q065wPguVl+BE2/t0=
536544
sigs.k8s.io/controller-tools v0.2.0-beta.2/go.mod h1:gC5UAnK1jbxWnDaqTi0yxKIsRsRwshzeRtTUGbM9vos=
537545
sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
538546
sigs.k8s.io/testing_frameworks v0.1.1 h1:cP2l8fkA3O9vekpy5Ks8mmA0NW/F7yBdXf8brkWhVrs=

pkg/collect/cluster_resources.go

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"fmt"
66

7+
"github.com/replicatedhq/troubleshoot/pkg/redact"
78
corev1 "k8s.io/api/core/v1"
89
apiextensionsv1beta1clientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1"
910
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -32,7 +33,7 @@ func ClusterResources() error {
3233
return err
3334
}
3435

35-
clusterResourcesOutput := ClusterResourcesOutput{}
36+
clusterResourcesOutput := &ClusterResourcesOutput{}
3637

3738
// namespaces
3839
namespaces, namespaceList, err := namespaces(client)
@@ -91,7 +92,12 @@ func ClusterResources() error {
9192
}
9293
clusterResourcesOutput.CustomResourceDefinitions = customResourceDefinitions
9394

94-
b, err := json.MarshalIndent(clusterResourcesOutput, "", " ")
95+
redacted, err := clusterResourcesOutput.Redact()
96+
if err != nil {
97+
return err
98+
}
99+
100+
b, err := json.MarshalIndent(redacted, "", " ")
95101
if err != nil {
96102
return err
97103
}
@@ -222,3 +228,55 @@ func crds(client *apiextensionsv1beta1clientset.ApiextensionsV1beta1Client) ([]b
222228

223229
return b, nil
224230
}
231+
232+
func (c *ClusterResourcesOutput) Redact() (*ClusterResourcesOutput, error) {
233+
namespaces, err := redact.Redact(c.Namespaces)
234+
if err != nil {
235+
return nil, err
236+
}
237+
pods, err := redactMap(c.Pods)
238+
if err != nil {
239+
return nil, err
240+
}
241+
services, err := redactMap(c.Services)
242+
if err != nil {
243+
return nil, err
244+
}
245+
deployments, err := redactMap(c.Deployments)
246+
if err != nil {
247+
return nil, err
248+
}
249+
ingress, err := redactMap(c.Ingress)
250+
if err != nil {
251+
return nil, err
252+
}
253+
storageClasses, err := redact.Redact(c.StorageClasses)
254+
if err != nil {
255+
return nil, err
256+
}
257+
crds, err := redact.Redact(c.CustomResourceDefinitions)
258+
if err != nil {
259+
return nil, err
260+
}
261+
return &ClusterResourcesOutput{
262+
Namespaces: namespaces,
263+
Pods: pods,
264+
Services: services,
265+
Deployments: deployments,
266+
Ingress: ingress,
267+
StorageClasses: storageClasses,
268+
CustomResourceDefinitions: crds,
269+
}, nil
270+
}
271+
272+
func redactMap(input map[string][]byte) (map[string][]byte, error) {
273+
result := make(map[string][]byte)
274+
for k, v := range input {
275+
redacted, err := redact.Redact(v)
276+
if err != nil {
277+
return nil, err
278+
}
279+
result[k] = redacted
280+
}
281+
return result, nil
282+
}

pkg/redact/multi_line.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package redact
2+
3+
import (
4+
"bufio"
5+
"fmt"
6+
"io"
7+
"regexp"
8+
)
9+
10+
type MultiLineRedactor struct {
11+
re1 *regexp.Regexp
12+
re2 *regexp.Regexp
13+
maskText string
14+
}
15+
16+
func NewMultiLineRedactor(re1, re2, maskText string) (*MultiLineRedactor, error) {
17+
compiled1, err := regexp.Compile(re1)
18+
if err != nil {
19+
return nil, err
20+
}
21+
compiled2, err := regexp.Compile(re2)
22+
if err != nil {
23+
return nil, err
24+
}
25+
return &MultiLineRedactor{re1: compiled1, re2: compiled2, maskText: maskText}, nil
26+
}
27+
28+
func (r *MultiLineRedactor) Redact(input io.Reader) io.Reader {
29+
reader, writer := io.Pipe()
30+
go func() {
31+
var err error
32+
defer func() {
33+
writer.CloseWithError(err)
34+
}()
35+
36+
substStr := getReplacementPattern(r.re2, r.maskText)
37+
38+
reader := bufio.NewReader(input)
39+
line1, line2, err := getNextTwoLines(reader, nil)
40+
if err != nil {
41+
// this will print 2 blank lines for empty input...
42+
fmt.Fprintf(writer, "%s\n", line1)
43+
fmt.Fprintf(writer, "%s\n", line2)
44+
return
45+
}
46+
47+
flushLastLine := false
48+
for err == nil {
49+
// If line1 matches re1, then transform line2 using re2
50+
if !r.re1.MatchString(line1) {
51+
fmt.Fprintf(writer, "%s\n", line1)
52+
line1, line2, err = getNextTwoLines(reader, &line2)
53+
flushLastLine = true
54+
continue
55+
}
56+
flushLastLine = false
57+
58+
clean := r.re2.ReplaceAllString(line2, substStr)
59+
60+
// io.WriteString would be nicer, but reader strips new lines
61+
fmt.Fprintf(writer, "%s\n%s\n", line1, clean)
62+
if err != nil {
63+
return
64+
}
65+
66+
line1, line2, err = getNextTwoLines(reader, nil)
67+
}
68+
69+
if flushLastLine {
70+
fmt.Fprintf(writer, "%s\n", line1)
71+
}
72+
}()
73+
return reader
74+
}
75+
76+
func getNextTwoLines(reader *bufio.Reader, curLine2 *string) (line1 string, line2 string, err error) {
77+
line1 = ""
78+
line2 = ""
79+
80+
if curLine2 == nil {
81+
line1, err = readLine(reader)
82+
if err != nil {
83+
return
84+
}
85+
86+
line2, err = readLine(reader)
87+
return
88+
}
89+
90+
line1 = *curLine2
91+
line2, err = readLine(reader)
92+
if err != nil {
93+
return
94+
}
95+
96+
return
97+
}

0 commit comments

Comments
 (0)