Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement anonymizer's main program #2621

Merged
merged 22 commits into from
Nov 12, 2020
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ examples/memstore-plugin/memstore-plugin
cmd/all-in-one/all-in-one-*
cmd/agent/agent
cmd/agent/agent-*
cmd/anonymizer/anonymizer
cmd/anonymizer/anonymizer-*
cmd/collector/collector
cmd/collector/collector-*
cmd/ingester/ingester
Expand Down
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,10 @@ build-all-in-one build-all-in-one-debug: build-ui elasticsearch-mappings
build-agent build-agent-debug:
$(GOBUILD) $(DISABLE_OPTIMIZATIONS) -o ./cmd/agent/agent$(SUFFIX)-$(GOOS)-$(GOARCH) $(BUILD_INFO) ./cmd/agent/main.go

.PHONY: build-anonymizer
build-anonymizer:
$(GOBUILD) $(DISABLE_OPTIMIZATIONS) -o ./cmd/anonymizer/anonymizer$(SUFFIX)-$(GOOS)-$(GOARCH) $(BUILD_INFO) ./cmd/anonymizer/main.go

.PHONY: build-query build-query-debug
build-query build-query-debug: build-ui
$(GOBUILD) $(DISABLE_OPTIMIZATIONS) -tags ui -o ./cmd/query/query$(SUFFIX)-$(GOOS)-$(GOARCH) $(BUILD_INFO) ./cmd/query/main.go
Expand Down
6 changes: 5 additions & 1 deletion cmd/anonymizer/app/anonymizer/anonymizer.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,18 @@ type Anonymizer struct {

// New creates new Anonymizer. The mappingFile stores the mapping from original to
// obfuscated strings, in case later investigations require looking at the original traces.
func New(mappingFile string, logger *zap.Logger) *Anonymizer {
func New(mappingFile string, logger *zap.Logger, hashStandardTags, hashCustomTags, hashLogs, hashProcess bool) *Anonymizer {
Ashmita152 marked this conversation as resolved.
Show resolved Hide resolved
a := &Anonymizer{
mappingFile: mappingFile,
logger: logger,
mapping: mapping{
Services: make(map[string]string),
Operations: make(map[string]string),
},
hashStandardTags: hashStandardTags,
hashCustomTags: hashCustomTags,
hashLogs: hashLogs,
hashProcess: hashProcess,
}
if _, err := os.Stat(filepath.Clean(mappingFile)); err == nil {
dat, err := ioutil.ReadFile(filepath.Clean(mappingFile))
Expand Down
87 changes: 87 additions & 0 deletions cmd/anonymizer/app/flags.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// Copyright (c) 2020 The Jaeger Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package app

import (
"github.com/spf13/cobra"
)

var QueryGRPCPort, MaxSpansCount int
var QueryGRPCHost, TraceID, OutputDir string
var HashStandardTags, HashCustomTags, HashLogs, HashProcess bool
Ashmita152 marked this conversation as resolved.
Show resolved Hide resolved

const (
queryGRPCHostFlag = "query.host"
queryGRPCPortFlag = "query.port"
outputDirFlag = "output.dir"
traceIDFlag = "trace.id"
hashStandardTagsFlag = "hash.standardtags"
hashCustomTagsFlag = "hash.customtags"
hashLogsFlag = "hash.logs"
hashProcessFlag = "hash.process"
maxSpansCount = "max.spanscount"
Ashmita152 marked this conversation as resolved.
Show resolved Hide resolved
)

// AddFlags adds flags for anonymizer main program
func AddFlags(command *cobra.Command) {
command.Flags().StringVar(
&QueryGRPCHost,
queryGRPCHostFlag,
DefaultQueryGRPCHost,
"hostname of the jaeger-query endpoint")
command.Flags().IntVar(
&QueryGRPCPort,
queryGRPCPortFlag,
DefaultQueryGRPCPort,
"port of the jaeger-query endpoint")
command.Flags().StringVar(
&OutputDir,
outputDirFlag,
DefaultOutputDir,
"directory to store the anonymized trace")
command.Flags().StringVar(
&TraceID,
traceIDFlag,
"",
"trace-id of trace to anonymize")
command.Flags().BoolVar(
&HashStandardTags,
hashStandardTagsFlag,
DefaultHashStandardTags,
"whether to hash standard tags")
command.Flags().BoolVar(
&HashCustomTags,
hashCustomTagsFlag,
DefaultHashCustomTags,
"whether to hash custom tags")
command.Flags().BoolVar(
&HashLogs,
hashLogsFlag,
DefaultHashLogs,
"whether to hash logs")
command.Flags().BoolVar(
&HashProcess,
hashProcessFlag,
DefaultHashProcess,
"whether to hash process")
command.Flags().IntVar(
&MaxSpansCount,
maxSpansCount,
DefaultMaxSpansCount,
"maximum number of spans to anonymize")

// mark traceid flag as mandatory
command.MarkFlagRequired(traceIDFlag)
}
28 changes: 28 additions & 0 deletions cmd/anonymizer/app/options.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Copyright (c) 2020 The Jaeger Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package app

import "github.com/jaegertracing/jaeger/ports"

const (
Ashmita152 marked this conversation as resolved.
Show resolved Hide resolved
DefaultQueryGRPCHost = "localhost"
DefaultQueryGRPCPort = ports.QueryHTTP
DefaultOutputDir = "/tmp"
DefaultHashStandardTags = true
Ashmita152 marked this conversation as resolved.
Show resolved Hide resolved
DefaultHashCustomTags = false
DefaultHashLogs = false
DefaultHashProcess = false
DefaultMaxSpansCount = -1
)
4 changes: 2 additions & 2 deletions cmd/anonymizer/app/writer/writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ type Writer struct {
}

// New creates an Writer
func New(config Config, logger *zap.Logger) (*Writer, error) {
func New(config Config, logger *zap.Logger, hashStandardTags, hashCustomTags, hashLogs, hashProcess bool) (*Writer, error) {
Ashmita152 marked this conversation as resolved.
Show resolved Hide resolved
wd, err := os.Getwd()
if err != nil {
return nil, err
Expand Down Expand Up @@ -80,7 +80,7 @@ func New(config Config, logger *zap.Logger) (*Writer, error) {
logger: logger,
capturedFile: cf,
anonymizedFile: af,
anonymizer: anonymizer.New(config.MappingFile, logger),
anonymizer: anonymizer.New(config.MappingFile, logger, hashStandardTags, hashCustomTags, hashLogs, hashProcess),
}, nil
}

Expand Down
101 changes: 97 additions & 4 deletions cmd/anonymizer/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,106 @@
package main

import (
"context"
"fmt"
"os"
"strconv"
"time"

"github.com/spf13/cobra"
"go.uber.org/zap"
"google.golang.org/grpc"

"github.com/jaegertracing/jaeger/cmd/anonymizer/app/writer"
app "github.com/jaegertracing/jaeger/cmd/anonymizer/app"
writer "github.com/jaegertracing/jaeger/cmd/anonymizer/app/writer"
"github.com/jaegertracing/jaeger/model"
"github.com/jaegertracing/jaeger/pkg/version"
"github.com/jaegertracing/jaeger/proto-gen/api_v2"
"github.com/jaegertracing/jaeger/storage/spanstore"
)

var logger, _ = zap.NewDevelopment()

type grpcClient struct {
api_v2.QueryServiceClient
conn *grpc.ClientConn
}

func newGRPCClient(addr string) *grpcClient {
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()

conn, err := grpc.DialContext(ctx, addr, grpc.WithInsecure())
if err != nil {
logger.Fatal("failed to connect with the jaeger-query service", zap.Error(err))
}

return &grpcClient{
QueryServiceClient: api_v2.NewQueryServiceClient(conn),
conn: conn,
}
}

func main() {
// TODO
_, _ = writer.New(writer.Config{}, zap.NewNop())
println("not implemented")
var command = &cobra.Command{
Use: "jaeger-anonymizer",
Short: "Jaeger anonymizer hashes fields of a trace for easy sharing",
Long: `Jaeger anonymizer queries Jaeger query for a trace, anonymizes fields, and store in file`,
Run: func(cmd *cobra.Command, args []string) {
prefix := app.OutputDir + "/" + app.TraceID
conf := writer.Config{
MaxSpansCount: app.MaxSpansCount,
CapturedFile: prefix + ".orig",
AnonymizedFile: prefix + ".anon",
MappingFile: prefix + ".map",
}

writer, err := writer.New(conf, logger, app.HashStandardTags, app.HashCustomTags, app.HashLogs, app.HashProcess)
if err != nil {
logger.Error("error while creating writer object", zap.Error(err))
Ashmita152 marked this conversation as resolved.
Show resolved Hide resolved
}

queryEndpoint := app.QueryGRPCHost + ":" + strconv.Itoa(app.QueryGRPCPort)
logger.Info(queryEndpoint)

client := newGRPCClient(queryEndpoint)
defer client.conn.Close()

traceID, err := model.TraceIDFromString(app.TraceID)
if err != nil {
logger.Fatal("failed to convert the provided trace id", zap.Error(err))
}
logger.Info(app.TraceID)

response, err := client.GetTrace(context.Background(), &api_v2.GetTraceRequest{
TraceID: traceID,
})
if err != nil {
logger.Fatal("failed to fetch the provided trace id", zap.Error(err))
}

spanResponseChunk, err := response.Recv()
if err == spanstore.ErrTraceNotFound {
logger.Fatal("failed to find the provided trace id", zap.Error(err))
}
if err != nil {
logger.Fatal("failed to fetch spans of provided trace id", zap.Error(err))
}

spans := spanResponseChunk.GetSpans()
Ashmita152 marked this conversation as resolved.
Show resolved Hide resolved

for _, span := range spans {
writer.WriteSpan(&span)
}
Ashmita152 marked this conversation as resolved.
Show resolved Hide resolved
},
}

app.AddFlags(command)

command.AddCommand(version.Command())

if error := command.Execute(); error != nil {
fmt.Println(error.Error())
os.Exit(1)
}
}
11 changes: 11 additions & 0 deletions cmd/opentelemetry/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMX
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-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
yurishkuro marked this conversation as resolved.
Show resolved Hide resolved
github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk=
github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
Expand All @@ -213,6 +214,8 @@ github.com/denis-tingajkin/go-header v0.3.1 h1:ymEpSiFjeItCy1FOP+x0M2KdCELdEAHUs
github.com/denis-tingajkin/go-header v0.3.1/go.mod h1:sq/2IxMhaZX+RRcgHfCRx/m0M5na0fBt4/CRe7Lrji0=
github.com/dgraph-io/badger v1.5.3 h1:5oWIuRvwn93cie+OSt1zSnkaIQ1JFQM8bGlIv6O6Sts=
github.com/dgraph-io/badger v1.5.3/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ=
github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8=
github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE=
github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE=
github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po=
github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
Expand All @@ -238,6 +241,8 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q=
github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
Expand Down Expand Up @@ -1063,6 +1068,7 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU
github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
Expand All @@ -1073,6 +1079,7 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
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.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
Expand Down Expand Up @@ -1127,6 +1134,7 @@ github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6
github.com/uber/jaeger-lib v2.4.0+incompatible h1:fY7QsGQWiCt8pajv4r7JEvmATdCVaWxXbjwyYwsNaLQ=
github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA=
github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg=
Expand Down Expand Up @@ -1195,6 +1203,7 @@ go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM=
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
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-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/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=
Expand Down Expand Up @@ -1318,6 +1327,7 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h
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-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand All @@ -1335,6 +1345,7 @@ golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7w
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-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand Down