Skip to content

Commit 21a0bd5

Browse files
committed
adding first code for elblogcat
0 parents  commit 21a0bd5

File tree

11 files changed

+962
-0
lines changed

11 files changed

+962
-0
lines changed

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
The MIT License (MIT)
2+
3+
Copyright © 2019 Björn Ahl
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in
13+
all copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21+
THE SOFTWARE.

cmd/cat.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
// Copyright © 2019 NAME HERE <EMAIL ADDRESS>
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package cmd
16+
17+
import (
18+
"bytes"
19+
"fmt"
20+
21+
"github.com/aws/aws-sdk-go/aws"
22+
"github.com/aws/aws-sdk-go/service/s3"
23+
"github.com/dbgeek/elblogcat/logcat"
24+
"github.com/dbgeek/elblogcat/logworker"
25+
"github.com/spf13/cobra"
26+
"github.com/spf13/viper"
27+
)
28+
29+
// catCmd represents the cat command
30+
var catCmd = &cobra.Command{
31+
Use: "cat",
32+
Short: "cat accesslog from s3",
33+
Long: `Download the accesslog and cat it
34+
35+
possible user these filter
36+
* client-ip
37+
* elb-status-code
38+
* target-status-code
39+
* http-method
40+
`,
41+
Run: func(cmd *cobra.Command, args []string) {
42+
awsConfiguration := logworker.AWSconfiguration{Region: "eu-west-1"}
43+
configuration := logworker.NewConfiguration()
44+
45+
accessLogFilter := logworker.NewAccessLogFilter()
46+
client := logworker.NewLogWorker(
47+
&awsConfiguration,
48+
&configuration,
49+
&accessLogFilter,
50+
)
51+
52+
for _, v := range client.List() {
53+
buff := &aws.WriteAtBuffer{}
54+
key := fmt.Sprintf("%s%s%s", configuration.Prefix, accessLogFilter.AccesslogPath(), v)
55+
_, err := client.S3Downloader.Download(buff, &s3.GetObjectInput{
56+
Bucket: aws.String(viper.GetString("s3-bucket")),
57+
Key: aws.String(key),
58+
})
59+
if err != nil {
60+
logworker.Logger.Fatalf("Failed to Download key: %v from s3. Got error: %v",
61+
key,
62+
err)
63+
}
64+
65+
c := logcat.NewRowFilter()
66+
b := bytes.NewBuffer(buff.Bytes())
67+
a := logcat.Accesslog{
68+
Content: b,
69+
RowFilter: c,
70+
}
71+
for _, row := range a.Cat() {
72+
fmt.Println(row)
73+
}
74+
}
75+
},
76+
}
77+
78+
func init() {
79+
rootCmd.AddCommand(catCmd)
80+
81+
// Here you will define your flags and configuration settings.
82+
83+
// Cobra supports Persistent Flags which will work for this command
84+
// and all subcommands, e.g.:
85+
// catCmd.PersistentFlags().String("foo", "", "A help for foo")
86+
87+
// Cobra supports local flags which will only run when this command
88+
// is called directly, e.g.:
89+
//catCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
90+
catCmd.PersistentFlags().StringP("client-ip", "", ".*", "")
91+
viper.BindPFlag("client-ip", catCmd.PersistentFlags().Lookup("client-ip"))
92+
catCmd.PersistentFlags().StringP("elb-status-code", "", ".*", "")
93+
viper.BindPFlag("elb-status-code", catCmd.PersistentFlags().Lookup("elb-status-code"))
94+
catCmd.PersistentFlags().StringP("target-status-code", "", ".*", "")
95+
viper.BindPFlag("target-status-code", catCmd.PersistentFlags().Lookup("target-status-code"))
96+
catCmd.PersistentFlags().StringP("http-method", "", ".*", "")
97+
viper.BindPFlag("http-method", catCmd.PersistentFlags().Lookup("http-method"))
98+
}

cmd/list.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// Copyright © 2019 NAME HERE <EMAIL ADDRESS>
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package cmd
16+
17+
import (
18+
"fmt"
19+
20+
"github.com/dbgeek/elblogcat/logworker"
21+
"github.com/spf13/cobra"
22+
)
23+
24+
// listCmd represents the list command
25+
var listCmd = &cobra.Command{
26+
Use: "list",
27+
Short: "Print accesslogs that exists",
28+
Long: `Print all accesslogs that exists and possible to filter by
29+
30+
* region
31+
* start time
32+
* loadbalancer id
33+
`,
34+
Run: func(cmd *cobra.Command, args []string) {
35+
awsConfiguration := logworker.AWSconfiguration{Region: "eu-west-1"}
36+
configuration := logworker.NewConfiguration()
37+
accessLogFilter := logworker.NewAccessLogFilter()
38+
client := logworker.NewLogWorker(
39+
&awsConfiguration,
40+
&configuration,
41+
&accessLogFilter,
42+
)
43+
44+
for _, v := range client.List() {
45+
fmt.Println(v)
46+
}
47+
48+
},
49+
}
50+
51+
func init() {
52+
rootCmd.AddCommand(listCmd)
53+
54+
// Here you will define your flags and configuration settings.
55+
56+
// Cobra supports Persistent Flags which will work for this command
57+
// and all subcommands, e.g.:
58+
// listCmd.PersistentFlags().String("foo", "", "A help for foo")
59+
60+
// Cobra supports local flags which will only run when this command
61+
// is called directly, e.g.:
62+
// listCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
63+
}

cmd/root.go

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
// Copyright © 2019 Björn Ahl
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a copy
4+
// of this software and associated documentation files (the "Software"), to deal
5+
// in the Software without restriction, including without limitation the rights
6+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7+
// copies of the Software, and to permit persons to whom the Software is
8+
// furnished to do so, subject to the following conditions:
9+
//
10+
// The above copyright notice and this permission notice shall be included in
11+
// all copies or substantial portions of the Software.
12+
//
13+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19+
// THE SOFTWARE.
20+
21+
package cmd
22+
23+
import (
24+
"fmt"
25+
"os"
26+
27+
homedir "github.com/mitchellh/go-homedir"
28+
"github.com/spf13/cobra"
29+
"github.com/spf13/viper"
30+
)
31+
32+
var cfgFile string
33+
34+
// rootCmd represents the base command when called without any subcommands
35+
var rootCmd = &cobra.Command{
36+
Use: "elblogcat",
37+
Short: "List & cat aws lb acesses",
38+
Long: `List & cat aws alb/elb accesslog that are stored in s3.
39+
40+
Filter output is possible by:
41+
* timerange for one day
42+
* loadbalancer id
43+
* loadbalancer ip-address
44+
* accesslog unique string
45+
`,
46+
// Uncomment the following line if your bare application
47+
// has an action associated with it:
48+
// Run: func(cmd *cobra.Command, args []string) { },
49+
}
50+
51+
// Execute adds all child commands to the root command and sets flags appropriately.
52+
// This is called by main.main(). It only needs to happen once to the rootCmd.
53+
func Execute() {
54+
if err := rootCmd.Execute(); err != nil {
55+
fmt.Println(err)
56+
os.Exit(1)
57+
}
58+
}
59+
60+
func init() {
61+
cobra.OnInitialize(initConfig)
62+
63+
// Here you will define your flags and configuration settings.
64+
// Cobra supports persistent flags, which, if defined here,
65+
// will be global for your application.
66+
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.elblogcat.yaml)")
67+
rootCmd.PersistentFlags().StringP("aws-account-id", "a", "", "The AWS account ID of the owner.")
68+
viper.BindPFlag("aws-account-id", rootCmd.PersistentFlags().Lookup("aws-account-id"))
69+
rootCmd.PersistentFlags().StringP("region", "r", "", "The region for your load balancer and S3 bucket.")
70+
viper.BindPFlag("region", rootCmd.PersistentFlags().Lookup("region"))
71+
rootCmd.PersistentFlags().StringP("load-balancer-id", "l", ".*", "The resource ID of the load balancer. If the resource ID contains any forward slashes (/), they are replaced with periods (.).")
72+
viper.BindPFlag("load-balancer-id", rootCmd.PersistentFlags().Lookup("load-balancer-id"))
73+
rootCmd.PersistentFlags().StringP("ip-address", "i", ".*", "The IP address of the load balancer node that handled the request. For an internal load balancer, this is a private IP address.")
74+
viper.BindPFlag("ip-address", rootCmd.PersistentFlags().Lookup("ip-address"))
75+
rootCmd.PersistentFlags().StringP("random-string", "s", ".*", "A system-generated random string.")
76+
viper.BindPFlag("random-string", rootCmd.PersistentFlags().Lookup("random-string"))
77+
rootCmd.PersistentFlags().StringP("s3-bucket", "b", ".*", "The name of the S3 bucket.")
78+
viper.BindPFlag("s3-bucket", rootCmd.PersistentFlags().Lookup("s3-bucket"))
79+
rootCmd.PersistentFlags().StringP("s3-prefix", "p", ".*", "The prefix (logical hierarchy) in the bucket. If you don't specify a prefix, the logs are placed at the root level of the bucket.")
80+
viper.BindPFlag("s3-prefix", rootCmd.PersistentFlags().Lookup("s3-prefix"))
81+
rootCmd.PersistentFlags().StringP("start-time", "", ".*", "")
82+
viper.BindPFlag("start-time", rootCmd.PersistentFlags().Lookup("start-time"))
83+
rootCmd.PersistentFlags().StringP("end-time", "", ".*", "")
84+
viper.BindPFlag("end-time", rootCmd.PersistentFlags().Lookup("end-time"))
85+
86+
// Cobra also supports local flags, which will only run
87+
// when this action is called directly.
88+
rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
89+
}
90+
91+
// initConfig reads in config file and ENV variables if set.
92+
func initConfig() {
93+
if cfgFile != "" {
94+
// Use config file from the flag.
95+
viper.SetConfigFile(cfgFile)
96+
} else {
97+
// Find home directory.
98+
home, err := homedir.Dir()
99+
if err != nil {
100+
fmt.Println(err)
101+
os.Exit(1)
102+
}
103+
104+
// Search config in home directory with name ".elblogcat" (without extension).
105+
viper.AddConfigPath(home)
106+
viper.SetConfigName(".elblogcat")
107+
}
108+
109+
viper.AutomaticEnv() // read in environment variables that match
110+
111+
// If a config file is found, read it in.
112+
if err := viper.ReadInConfig(); err == nil {
113+
fmt.Println("Using config file:", viper.ConfigFileUsed())
114+
}
115+
}

go.mod

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module github.com/dbgeek/elblogcat
2+
3+
require (
4+
github.com/BurntSushi/toml v0.3.1 // indirect
5+
github.com/aws/aws-sdk-go v1.17.4
6+
github.com/inconshreveable/mousetrap v1.0.0 // indirect
7+
github.com/kr/pretty v0.1.0 // indirect
8+
github.com/mitchellh/go-homedir v1.1.0
9+
github.com/sirupsen/logrus v1.3.0
10+
github.com/spf13/cobra v0.0.3
11+
github.com/spf13/viper v1.3.1
12+
github.com/stretchr/testify v1.3.0 // indirect
13+
golang.org/x/crypto v0.0.0-20190222235706-ffb98f73852f // indirect
14+
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd // indirect
15+
golang.org/x/sys v0.0.0-20190222171317-cd391775e71e // indirect
16+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
17+
)

go.sum

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
2+
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3+
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
4+
github.com/aws/aws-sdk-go v1.17.4 h1:L2KFocQhg48kIzEAV98SnSz3nmIZ3UDFP+vU647KO3c=
5+
github.com/aws/aws-sdk-go v1.17.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
6+
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
7+
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
8+
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
9+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
10+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
11+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
12+
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
13+
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
14+
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
15+
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
16+
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
17+
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
18+
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
19+
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
20+
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
21+
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
22+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
23+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
24+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
25+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
26+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
27+
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
28+
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
29+
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
30+
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
31+
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
32+
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
33+
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
34+
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
35+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
36+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
37+
github.com/sirupsen/logrus v1.3.0 h1:hI/7Q+DtNZ2kINb6qt/lS+IyXnHQe9e90POfeewL/ME=
38+
github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
39+
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
40+
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
41+
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
42+
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
43+
github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=
44+
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
45+
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
46+
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
47+
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
48+
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
49+
github.com/spf13/viper v1.3.1 h1:5+8j8FTpnFV4nEImW/ofkzEt8VoOiLXxdYIDsB73T38=
50+
github.com/spf13/viper v1.3.1/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
51+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
52+
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
53+
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
54+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
55+
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
56+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
57+
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
58+
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
59+
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
60+
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9 h1:mKdxBk7AujPs8kU4m80U72y/zjbZ3UcXC7dClwKbUI0=
61+
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
62+
golang.org/x/crypto v0.0.0-20190222235706-ffb98f73852f h1:qWFY9ZxP3tfI37wYIs/MnIAqK0vlXp1xnYEa5HxFSSY=
63+
golang.org/x/crypto v0.0.0-20190222235706-ffb98f73852f/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
64+
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd h1:HuTn7WObtcDo9uEEU7rEqL0jYthdXAmZ6PP+meazmaU=
65+
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
66+
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
67+
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A=
68+
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
69+
golang.org/x/sys v0.0.0-20190222171317-cd391775e71e h1:oF7qaQxUH6KzFdKN4ww7NpPdo53SZi4UlcksLrb2y/o=
70+
golang.org/x/sys v0.0.0-20190222171317-cd391775e71e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
71+
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
72+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
73+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
74+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
75+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
76+
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
77+
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

0 commit comments

Comments
 (0)