diff --git a/.gitignore b/.gitignore index 4e0573b..501c251 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ cercat config.yaml dist -dist/** \ No newline at end of file +dist/** +lib/*.xml \ No newline at end of file diff --git a/config.go b/config.go deleted file mode 100644 index 085e203..0000000 --- a/config.go +++ /dev/null @@ -1,73 +0,0 @@ -package main - -import ( - "log" - "os" - "path" - "path/filepath" - "regexp" - - "github.com/spf13/viper" - kingpin "gopkg.in/alecthomas/kingpin.v2" -) - -type configuration struct { - Workers int - SlackWebHookURL string - SlackIconURL string - SlackUsername string - Regexp string - DisplayErrors string -} - -func getConfig() *configuration { - c := &configuration{} - - configFile := kingpin.Flag("configfile", "config file").Short('c').ExistingFile() - kingpin.Parse() - - v := viper.New() - v.SetDefault("SlackWebhookURL", "") - v.SetDefault("SlackIconURL", "") - v.SetDefault("SlackUsername", "Cercat") - v.SetDefault("Regexp", "") - v.SetDefault("Workers", 20) - v.SetDefault("DisplayErrors", "false") - - if *configFile != "" { - d, f := path.Split(*configFile) - if d == "" { - d = "." - } - v.SetConfigName(f[0 : len(f)-len(filepath.Ext(f))]) - v.AddConfigPath(d) - err := v.ReadInConfig() - if err != nil { - log.Printf("[ERROR] : Error when reading config file : %v\n", err) - os.Exit(1) - } - } - v.AutomaticEnv() - v.Unmarshal(c) - - if c.SlackUsername == "" { - c.SlackUsername = "Cercat" - } - if c.DisplayErrors == "" { - c.DisplayErrors = "false" - } - if c.Regexp == "" { - log.Println("[ERROR] : Regexp can't be empty") - os.Exit(1) - } - if _, err := regexp.Compile(c.Regexp); err != nil { - log.Println("[ERROR] : Bad regexp") - os.Exit(1) - } - if c.Workers < -1 { - log.Println("[ERROR] : Workers must be strictly a positive number") - os.Exit(1) - } - - return c -} diff --git a/config_example.yaml b/config_example.yaml deleted file mode 100644 index 87f2a04..0000000 --- a/config_example.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -SlackWebhookURL: "" #Slack Webhook URL -SlackIconURL: "" #Slack Icon (Avatar) URL -SlackUsername: "" #Slack Username -Regexp: ".*\\.fr$" #Regexp to match. Can't be empty. It uses Golang regexp format -Workers: 20 #Number of workers for consuming stream from CertStream -DisplayErrors: false #Enable/Disable display of errors in logs \ No newline at end of file diff --git a/go.mod b/go.mod index 0a3b691..2dbde8c 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,14 @@ module cercat go 1.14 require ( - github.com/CaliDog/certstream-go v0.0.0-20180219203951-6016c5462366 - github.com/falcosecurity/falcosidekick v0.0.0-20200128210241-efc9dea5ac3a github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee // indirect github.com/gobwas/pool v0.2.0 // indirect github.com/gobwas/ws v1.0.3 - github.com/google/pprof v0.0.0-20200413000643-b1a96885c1c6 // indirect - github.com/gorilla/websocket v1.4.2 - github.com/jmoiron/jsonq v0.0.0-20150511023944-e874b168d07e - github.com/likexian/whois-go v1.5.0 - github.com/likexian/whois-parser-go v1.10.4 - github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 - github.com/pkg/errors v0.9.1 + github.com/onsi/ginkgo v1.12.2 + github.com/onsi/gomega v1.10.1 + github.com/patrickmn/go-cache v2.1.0+incompatible + github.com/sirupsen/logrus v1.2.0 github.com/spf13/viper v1.6.3 + github.com/stretchr/testify v1.4.0 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 ) diff --git a/go.sum b/go.sum index 29813a1..a4482b5 100644 --- a/go.sum +++ b/go.sum @@ -1,40 +1,30 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CaliDog/certstream-go v0.0.0-20180219203951-6016c5462366 h1:qjPX+NGqyjCTkoQqEctkfhU4C/B4LhFG0ugVLhM7Maw= -github.com/CaliDog/certstream-go v0.0.0-20180219203951-6016c5462366/go.mod h1:JBo69gi8JyPpZoLZgmZeXiq4o7Ib2qf2RiIxiWC0oYQ= -github.com/DataDog/datadog-go v2.3.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aws/aws-sdk-go v1.23.10/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= 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/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= -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-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/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/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/emersion/go-sasl v0.0.0-20190704090222-36b50694675c/go.mod h1:G/dpzLu16WtQpBfQ/z3LYiYJn3ZhKSGWn83fyoyQe/k= -github.com/emersion/go-sasl v0.0.0-20190817083125-240c8404624e/go.mod h1:G/dpzLu16WtQpBfQ/z3LYiYJn3ZhKSGWn83fyoyQe/k= -github.com/emersion/go-smtp v0.11.2/go.mod h1:byi9Y32SuKwjTJt9DO2tTWYjtF3lEh154tE1AcaJQSY= -github.com/falcosecurity/falcosidekick v0.0.0-20200128210241-efc9dea5ac3a h1:lCsSKSqcpfm1WzZ2u+ZZWz/XvEpE7ekI7kBk1T0QFo8= -github.com/falcosecurity/falcosidekick v0.0.0-20200128210241-efc9dea5ac3a/go.mod h1:pcBs/GBsRah9wSPXvDlEAavbNBghsQAvau+JxZMoniU= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= 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/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -53,44 +43,44 @@ github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 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.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.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20200413000643-b1a96885c1c6 h1:s/fMbk+RxwM7UzGFVT/QqULw08vuMLJ94qH1KZfNO9E= -github.com/google/pprof v0.0.0-20200413000643-b1a96885c1c6/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= 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 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 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/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 h1:UDMh68UUwekSh5iP2OMhRRZJiiBccgV7axzUG8vi56c= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmoiron/jsonq v0.0.0-20150511023944-e874b168d07e h1:ZZCvgaRDZg1gC9/1xrsgaJzQUCQgniKtw0xjWywWAOE= -github.com/jmoiron/jsonq v0.0.0-20150511023944-e874b168d07e/go.mod h1:+rHyWac2R9oAZwFe1wGY2HBzFJJy++RHBg1cU23NkD8= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= 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/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= 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 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/likexian/gokit v0.21.11/go.mod h1:0WlTw7IPdiMtrwu0t5zrLM7XXik27Ey6MhUJHio2fVo= -github.com/likexian/gokit v0.23.1 h1:1P6J3d4r2D+V1C4xbdxm/pWP+L502CoHe5ttZsniHWM= -github.com/likexian/gokit v0.23.1/go.mod h1:/asXq96N3H5gVxyfyNuQO7HFoSorzcU+ZMEImyBGZB8= -github.com/likexian/whois-go v1.5.0 h1:ZqH1a1vc6Hx/PAJFn+tSnv3bxk0tv0Tch2MSc+5nUM0= -github.com/likexian/whois-go v1.5.0/go.mod h1:vczXVMiHUp5OlIg3mlrEGS92gSBuNg/VsU53MmBtV9c= -github.com/likexian/whois-parser-go v1.10.4 h1:1+fUgMT5jjH39RorfxNJjmBCdcerqB6oMKZDshCj57E= -github.com/likexian/whois-parser-go v1.10.4/go.mod h1:I3zHrhbq4XRmc3nn4xtWNafclqmZXJzW7tSx9KXlCwk= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -100,17 +90,22 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ 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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -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/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.12.2 h1:Ke9m3h2Hu0wsZ45yewCqhYr3Z+emcNTuLY2nMWCkrSI= +github.com/onsi/ginkgo v1.12.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -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/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= @@ -122,8 +117,11 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 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/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= 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= @@ -135,17 +133,18 @@ github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.6.3 h1:pDDu1OyEDTKzpJwdq4TiuLyMsUgRa/BT5cn5O62NoHs= github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw= 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/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= 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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -153,48 +152,72 @@ 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-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 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-20181114220301-adae6a3d119a/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-20190311183353-d8887717615a/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-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 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/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-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 h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e h1:9vRrk9YW2BTzLP0VCB9ZDjU4cPqkg+IDWL7XgxA1yxQ= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/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-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +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.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= 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 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= 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 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/lib/config.go b/lib/config.go new file mode 100644 index 0000000..5222314 --- /dev/null +++ b/lib/config.go @@ -0,0 +1,92 @@ +package lib + +import ( + "fmt" + "path" + "path/filepath" + "regexp" + "strings" + + log "github.com/sirupsen/logrus" + "github.com/spf13/viper" + kingpin "gopkg.in/alecthomas/kingpin.v2" +) + +type Configuration struct { + Workers int + SlackWebHookURL string + SlackIconURL string + SlackUsername string + DomainName string + RegIP string + Regexp string + RegIDN string + DisplayErrors string +} + +const RegStrIP = `^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$` + +func GetConfig() *Configuration { + c := &Configuration{ + RegIP: RegStrIP, + } + + configFile := kingpin.Flag("configfile", "config file").Short('c').ExistingFile() + kingpin.Parse() + + v := viper.New() + v.SetDefault("SlackWebhookURL", "") + v.SetDefault("SlackIconURL", "") + v.SetDefault("SlackUsername", "Cercat") + v.SetDefault("DomainName", "") + v.SetDefault("Regexp", "") + v.SetDefault("Workers", 20) + v.SetDefault("DisplayErrors", "false") + + if *configFile != "" { + d, f := path.Split(*configFile) + if d == "" { + d = "." + } + v.SetConfigName(f[0 : len(f)-len(filepath.Ext(f))]) + v.AddConfigPath(d) + err := v.ReadInConfig() + if err != nil { + log.Fatalf("[ERROR] : Error when reading config file : %v\n", err) + } + } + v.AutomaticEnv() + v.Unmarshal(c) + + if c.SlackUsername == "" { + c.SlackUsername = "Cercat" + } + if c.DisplayErrors == "" || c.DisplayErrors == "false" { + log.SetLevel(log.DebugLevel) + } + if c.Regexp == "" { + log.Fatal("Regexp can't be empty") + } + if c.DomainName == "" { + log.Fatal("Specify the domain name to monitor for IDN homographs") + } + if _, err := regexp.Compile(c.Regexp); err != nil { + log.Fatal("Bad regexp") + } + if c.Workers < -1 { + log.Fatal("Workers must be strictly a positive number") + } + + c.RegIDN = BuildIDNRegex(c.DomainName) + + return c +} + +func BuildIDNRegex(name string) string { + if len(name) < 2 { + return "" + } + // Can detect up to two unicode characters in the domain name. + // To adjust according to false positive rate & name length + return fmt.Sprintf("[%s]{%d,%d}", strings.ToLower(name), len(name)-2, len(name)-1) +} diff --git a/lib/lib.go b/lib/lib.go new file mode 100644 index 0000000..8401ec8 --- /dev/null +++ b/lib/lib.go @@ -0,0 +1,165 @@ +package lib + +import ( + "context" + "encoding/json" + "fmt" + "net" + "regexp" + "strings" + "time" + + log "github.com/sirupsen/logrus" + + _ "net/http/pprof" + + _ "expvar" + + "github.com/gobwas/ws" + "github.com/gobwas/ws/wsutil" +) + +type Result struct { + Domain string `json:"domain"` + SAN []string `json:"SAN"` + Issuer string `json:"issuer"` + Addresses []string `json:"Addresses"` +} + +type Certificate struct { + MessageType string `json:"message_type"` + Data Data `json:"data"` +} + +type Data struct { + UpdateType string `json:"update_type"` + LeafCert LeafCert `json:"leaf_cert"` + Chain []LeafCert `json:"chain"` + CertIndex float32 `json:"cert_index"` + Seen float32 `json:"seen"` + Source map[string]string `json:"source"` +} + +type LeafCert struct { + Subject map[string]string `json:"subject"` + Extensions map[string]interface{} `json:"extensions"` + NotBefore float32 `json:"not_before"` + NotAfter float32 `json:"not_after"` + SerialNumber string `json:"serial_number"` + FingerPrint string `json:"fingerprint"` + AsDer string `json:"as_der"` + AllDomains []string `json:"all_domains"` +} + +// MsgChan is the communication channel between certCheckWorkers and LoopCheckCerts +var MsgChan chan []byte + +const certInput = "wss://certstream.calidog.io" + +// CertCheckWorker parses certificates and raises alert if matches config +func CertCheckWorker(config *Configuration) { + reg, _ := regexp.Compile(config.Regexp) + regIP, _ := regexp.Compile(config.RegIP) + regIDN, _ := regexp.Compile(config.RegIDN) + + for { + msg := <-MsgChan + + detailedCert, err := ParseResultCertificate(msg, regIP) + if err != nil { + log.Warnf("Error parsing message: %s", err) + continue + } + if detailedCert == nil { + continue + } + if !IsMatchingCert(detailedCert, reg, regIDN) { + continue + } + notify(config, *detailedCert) + } +} + +func ParseResultCertificate(msg []byte, regIP *regexp.Regexp) (*Result, error) { + var c Certificate + var r *Result + + err := json.Unmarshal(msg, &c) + if err != nil || c.MessageType == "heartbeat" { + return nil, err + } + + r = &Result{ + Domain: c.Data.LeafCert.Subject["CN"], + Issuer: c.Data.Chain[0].Subject["O"], + SAN: c.Data.LeafCert.AllDomains, + Addresses: []string{"N/A"}, + } + r.Addresses = FetchIPAddresses(r.Domain, regIP) + return r, nil +} + +func FetchIPAddresses(name string, regIP *regexp.Regexp) []string { + var ipsList []string + + ips, err := net.LookupIP(name) + if err != nil || len(ips) == 0 { + log.Debugf("Could not fetch IP addresses of domain %s", name) + return ipsList + } + for _, j := range ips { + if regIP.MatchString(j.String()) { + ipsList = append(ipsList, j.String()) + } + } + return ipsList +} + +func IsMatchingCert(cert *Result, reg, regIDN *regexp.Regexp) bool { + + domainList := append(cert.SAN, cert.Domain) + for _, domain := range domainList { + if isIDN(domain) && regIDN.MatchString(domain) { + return true + } + if reg.MatchString(domain) { + return true + } + } + return false +} + +func isIDN(domain string) bool { + return strings.HasPrefix(domain, "xn--") +} + +func notify(config *Configuration, detailedCert Result) { + b, _ := json.Marshal(detailedCert) + + if config.SlackWebHookURL != "" { + go newSlackPayload(detailedCert, config).Post(config) + } else { + fmt.Printf("A certificate for '%v' has been issued : %v\n", detailedCert.Domain, string(b)) + } +} + +// LoopCheckCerts Loops on messages from source +func LoopCheckCerts(config *Configuration) { + for { + conn, _, _, err := ws.DefaultDialer.Dial(context.Background(), certInput) + defer conn.Close() + if err != nil { + log.Warn("Error connecting to certstream! Sleeping a few seconds and reconnecting...") + time.Sleep(1 * time.Second) + continue + } + for { + msg, _, err := wsutil.ReadServerData(conn) + if err != nil { + log.Warn("Error reading message from CertStream") + break + } + MsgChan <- msg + } + } +} diff --git a/lib/lib_suite_test.go b/lib/lib_suite_test.go new file mode 100644 index 0000000..a556e7e --- /dev/null +++ b/lib/lib_suite_test.go @@ -0,0 +1,14 @@ +package lib_test + +import ( + "testing" + + . "github.com/onsi/ginkgo" + "github.com/onsi/ginkgo/reporters" + . "github.com/onsi/gomega" +) + +func TestLib(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecsWithDefaultAndCustomReporters(t, "CerCat - Lib", []Reporter{reporters.NewJUnitReporter("test_report-lib.xml")}) +} diff --git a/lib/lib_test.go b/lib/lib_test.go new file mode 100644 index 0000000..1b915a3 --- /dev/null +++ b/lib/lib_test.go @@ -0,0 +1,68 @@ +package lib_test + +import ( + "cercat/lib" + "io/ioutil" + "regexp" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Handler", func() { + Describe("isMatchingCert", func() { + reg, _ := regexp.Compile(`.+\.com`) + regIDN, _ := regexp.Compile(lib.BuildIDNRegex("test")) + Describe("If certificate matches", func() { + cert := &lib.Result{Domain: "www.test.com"} + It("should return true", func() { + result := lib.IsMatchingCert(cert, reg, regIDN) + Expect(result).To(BeTrue()) + }) + }) + Describe("If alternative subject matches", func() { + cert := &lib.Result{Domain: "www.test.net", SAN: []string{"www.test.com"}} + It("should return true", func() { + result := lib.IsMatchingCert(cert, reg, regIDN) + Expect(result).To(BeTrue()) + }) + }) + Describe("If domain is IDN", func() { + cert := &lib.Result{Domain: "xn--tst-rdd.com"} + It("should return true", func() { + result := lib.IsMatchingCert(cert, reg, regIDN) + Expect(result).To(BeTrue()) + }) + }) + }) + Describe("parseResultCertificate", func() { + regIP, _ := regexp.Compile(lib.RegStrIP) + Describe("If cannot marshall message", func() { + msg := []byte("") + It("should return nil and error", func() { + result, err := lib.ParseResultCertificate(msg, regIP) + Expect(result).To(BeNil()) + Expect(err).To(HaveOccurred()) + }) + }) + Describe("If message is heartbeat", func() { + msg, _ := ioutil.ReadFile("../res/heartbeat.json") + It("should return nil", func() { + result, err := lib.ParseResultCertificate(msg, regIP) + Expect(result).To(BeNil()) + Expect(err).ToNot(HaveOccurred()) + }) + }) + Describe("If message is regular", func() { + msg, _ := ioutil.ReadFile("../res/cert.json") + It("should return valid infos", func() { + result, err := lib.ParseResultCertificate(msg, regIP) + Expect(result.Domain).Should(Equal("baden-mueller.de")) + Expect(result.SAN).Should(Equal([]string{"baden-mueller.de", "www.baden-mueller.de"})) + Expect(result.Issuer).Should(Equal("Let's Encrypt")) + Expect(result.Addresses).Should(Equal([]string{"23.236.62.147"})) + Expect(err).ToNot(HaveOccurred()) + }) + }) + }) +}) diff --git a/slack.go b/lib/slack.go similarity index 82% rename from slack.go rename to lib/slack.go index b18bb30..065c684 100644 --- a/slack.go +++ b/lib/slack.go @@ -1,10 +1,12 @@ -package main +package lib import ( "bytes" "encoding/json" - "log" "net/http" + "strings" + + log "github.com/sirupsen/logrus" ) type slackAttachmentField struct { @@ -28,7 +30,7 @@ type slackPayload struct { Attachments []slackAttachment `json:"attachments,omitempty"` } -func newSlackPayload(r result) slackPayload { +func newSlackPayload(r Result, config *Configuration) slackPayload { var attachments []slackAttachment var attachment slackAttachment var fields []slackAttachmentField @@ -38,27 +40,20 @@ func newSlackPayload(r result) slackPayload { field.Value = r.Domain field.Short = true fields = append(fields, field) + field.Title = "Issuer" field.Value = r.Issuer field.Short = true fields = append(fields, field) - var s string - for _, i := range r.SAN { - s += i + ", " - } field.Title = "SAN" field.Short = false - field.Value = s[:len(s)-2] + field.Value = strings.Join(r.SAN, ",") fields = append(fields, field) - s = "" - for _, i := range r.Addresses { - s += i + ", " - } field.Title = "Addresses" field.Short = false - field.Value = s[:len(s)-2] + field.Value = strings.Join(r.Addresses, ",") fields = append(fields, field) attachment.Fields = fields @@ -74,13 +69,13 @@ func newSlackPayload(r result) slackPayload { Attachments: attachments} } -func (s slackPayload) Post() { +func (s slackPayload) Post(config *Configuration) { body, _ := json.Marshal(s) req, _ := http.NewRequest(http.MethodPost, config.SlackWebHookURL, bytes.NewBuffer(body)) req.Header.Add("Content-Type", "application/json") client := &http.Client{} _, err := client.Do(req) - if err != nil && config.DisplayErrors == "true" { - log.Println("[ERROR] : Slack Post error") + if err != nil { + log.Warn("Slack Post error") } } diff --git a/main.go b/main.go index d8a441b..bdccdb0 100644 --- a/main.go +++ b/main.go @@ -1,127 +1,24 @@ package main import ( - "context" - "encoding/json" - "log" - "net" - "regexp" - - "time" - + "cercat/lib" + _ "expvar" "net/http" _ "net/http/pprof" - - _ "expvar" - - "github.com/gobwas/ws" - "github.com/gobwas/ws/wsutil" ) -type result struct { - Domain string `json:"domain"` - SAN []string `json:"SAN"` - Issuer string `json:"issuer"` - Addresses []string `json:"Addresses"` -} - -type certificate struct { - MessageType string `json:"message_type"` - Data data `json:"data"` -} - -type data struct { - UpdateType string `json:"update_type"` - LeafCert leafCert `json:"leaf_cert"` - Chain []leafCert `json:"chain"` - CertIndex float32 `json:"cert_index"` - Seen float32 `json:"seen"` - Source map[string]string `json:"source"` -} - -type leafCert struct { - Subject map[string]string `json:"subject"` - Extensions map[string]string `json:"extensions"` - NotBefore float32 `json:"not_before"` - NotAfter float32 `json:"not_after"` - SerialNumber string `json:"serial_number"` - FingerPrint string `json:"fingerprint"` - AsDer string `json:"as_der"` - AllDomains []string `json:"all_domains"` -} - -var config *configuration +var config *lib.Configuration func init() { - config = getConfig() + config = lib.GetConfig() } func main() { go http.ListenAndServe("localhost:6060", nil) - - msgChan := make(chan []byte, 10) + lib.MsgChan = make(chan []byte, 10) for i := 0; i < config.Workers; i++ { - go certCheckWorker(msgChan) - } - - for { - conn, _, _, err := ws.DefaultDialer.Dial(context.Background(), "wss://certstream.calidog.io") - - if err != nil { - if config.DisplayErrors == "true" { - log.Println("[ERROR] : Error connecting to certstream! Sleeping a few seconds and reconnecting...") - } - conn.Close() - time.Sleep(1 * time.Second) - continue - } - for { - msg, _, err := wsutil.ReadServerData(conn) - if err != nil { - if config.DisplayErrors == "true" { - log.Println("[ERROR] : Error reading message from CertStream") - } - break - } - msgChan <- msg - } - conn.Close() + go lib.CertCheckWorker(config) } -} -func certCheckWorker(msgChan <-chan []byte) { - reg, _ := regexp.Compile(config.Regexp) - regIP, _ := regexp.Compile(`^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`) - - var c certificate - for { - msg := <-msgChan - json.Unmarshal(msg, &c) - if c.MessageType == "heartbeat" { - continue - } - if reg.MatchString(c.Data.LeafCert.Subject["CN"]) { - r := result{ - Domain: c.Data.LeafCert.Subject["CN"], - Issuer: c.Data.Chain[0].Subject["O"], - SAN: c.Data.LeafCert.AllDomains, - Addresses: []string{"N/A"}, - } - ips, _ := net.LookupIP(r.Domain) - if len(ips) != 0 { - ipsList := []string{} - for _, j := range ips { - if regIP.MatchString(j.String()) { - ipsList = append(ipsList, j.String()) - } - } - r.Addresses = ipsList - } - b, _ := json.Marshal(r) - log.Printf("[INFO] : A certificate for '%v' has been issued : %v\n", r.Domain, string(b)) - if config.SlackWebHookURL != "" { - go newSlackPayload(r).Post() - } - } - } + lib.LoopCheckCerts(config) } diff --git a/res/cert.json b/res/cert.json new file mode 100644 index 0000000..7964f08 --- /dev/null +++ b/res/cert.json @@ -0,0 +1 @@ +{"data":{"cert_index":612101919,"cert_link":"http://ct.googleapis.com/logs/argon2020/ct/v1/get-entries?start=612101919&end=612101919","chain":[{"as_der":"MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0NlowSjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMTGkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EFq6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWAa6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIGCCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNvbTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9kc3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAwVAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcCARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwuY3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsFAAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJouM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwuX4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlGPfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==","extensions":{"authorityInfoAccess":"CA Issuers - URI:http://apps.identrust.com/roots/dstrootcax3.p7c\nOCSP - URI:http://isrg.trustid.ocsp.identrust.com\n","authorityKeyIdentifier":"keyid:C4:A7:B1:A4:7B:2C:71:FA:DB:E1:4B:90:75:FF:C4:15:60:85:89:10\n","basicConstraints":"CA:TRUE","certificatePolicies":"Policy: 1.3.6.1.4.1.44947.1.1.1\n CPS: http://cps.root-x1.letsencrypt.org","crlDistributionPoints":"Full Name:\n URI:http://crl.identrust.com/DSTROOTCAX3CRL.crl","keyUsage":"Digital Signature, Key Cert Sign, C R L Sign","subjectKeyIdentifier":"A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1"},"fingerprint":"E6:A3:B4:5B:06:2D:50:9B:33:82:28:2D:19:6E:FE:97:D5:95:6C:CB","not_after":1615999246,"not_before":1458232846,"serial_number":"A0141420000015385736A0B85ECA708","subject":{"C":"US","CN":"Let's Encrypt Authority X3","L":null,"O":"Let's Encrypt","OU":null,"ST":null,"aggregated":"/C=US/CN=Let's Encrypt Authority X3/O=Let's Encrypt"}},{"as_der":"MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ","extensions":{"basicConstraints":"CA:TRUE","keyUsage":"Key Cert Sign, C R L Sign","subjectKeyIdentifier":"C4:A7:B1:A4:7B:2C:71:FA:DB:E1:4B:90:75:FF:C4:15:60:85:89:10"},"fingerprint":"DA:C9:02:4F:54:D8:F6:DF:94:93:5F:B1:73:26:38:CA:6A:D7:7C:13","not_after":1633010475,"not_before":970348339,"serial_number":"44AFB080D6A327BA893039862EF8406B","subject":{"C":null,"CN":"DST Root CA X3","L":null,"O":"Digital Signature Trust Co.","OU":null,"ST":null,"aggregated":"/CN=DST Root CA X3/O=Digital Signature Trust Co."}}],"leaf_cert":{"all_domains":["baden-mueller.de","www.baden-mueller.de"],"as_der":"MIIEezCCA2OgAwIBAgISA1Gm0sew3z+8nJrpo5Jj1naBMA0GCSqGSIb3DQEBCwUAMEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQDExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA1MjQxODE3NDhaFw0yMDA4MjIxODE3NDhaMBsxGTAXBgNVBAMTEGJhZGVuLW11ZWxsZXIuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCSDtXT7WQQaNmnaH6+BxHwEz7eqHdTx/02HV7x/q9oozIKfWnfc4A3glkMdnJtZUjLlbV4sgAO4MBDNo65Qsq4L/GesRsVTczmYcAxnrfp8e/eK7wF08oqCvdHddXSHD82aXe/6Y6a3hiLEG+oBMDfG1Skwyt7NGNySlenz3EYEbc35IVoFKIkp2CyMV/nkKQPCgQBL10niEiQd9Q9bHDQJZsBtW59VVCy5K5kIPo6P5v295PCt0WTUppXagY2G/YGpQOmvsjl9MFjMZc4yOOd3RhGhcr2jgd9iF04TvownTxvQAU1EbKcXDHcoPVmhH5zDeiN1JbLNpW2wMf5Vr9VAgMBAAGjggGIMIIBhDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFE8R8swxvB64KS8VqcCaUcMFpEjAMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9yZy8wMQYDVR0RBCowKIIQYmFkZW4tbXVlbGxlci5kZYIUd3d3LmJhZGVuLW11ZWxsZXIuZGUwTAYDVR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwEwYKKwYBBAHWeQIEAwEB/wQCBQAwDQYJKoZIhvcNAQELBQADggEBAIUMEOxJNwvA/pWwFm0BR0HClGdzSC1vQprBaZ6cedUM6b/wfAiCPNJXCvJyrfhJp4T1GcnwU5VnMLPE1/nwJ6LY3My86/M+eQn/3HRuXu3p1GFpp5k2cXsHB7VRlw5X78XVvsnYKc6giwOan7L8fL136EcplQTZRc/5qu9hvazeBOBQQc/lCeWceWz0ZDDVbU2IGvY6aF/SAQREOSq8jLVpEoXB0zwq3dXeEi+PfC2Ea03eOpo1y11nmRYB5Usi/GjMi7oXuBxVQMolJXJj38ziJcp1TT1sv2Ha/00F+Pudo54w1NEo04DbDD9yB2H9wTlMM4YsArmD3K22OGA8wNE=","extensions":{"authorityInfoAccess":"CA Issuers - URI:http://cert.int-x3.letsencrypt.org/\nOCSP - URI:http://ocsp.int-x3.letsencrypt.org\n","authorityKeyIdentifier":"keyid:A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1\n","basicConstraints":"CA:FALSE","certificatePolicies":"Policy: 1.3.6.1.4.1.44947.1.1.1\n CPS: http://cps.letsencrypt.org","ctlPoisonByte":true,"extendedKeyUsage":"TLS Web server authentication, TLS Web client authentication","keyUsage":"Digital Signature, Key Encipherment","subjectAltName":"DNS:www.baden-mueller.de, DNS:baden-mueller.de","subjectKeyIdentifier":"4F:11:F2:CC:31:BC:1E:B8:29:2F:15:A9:C0:9A:51:C3:05:A4:48:C0"},"fingerprint":"64:BF:49:41:3B:7A:FD:5D:C1:04:D9:44:64:9D:1C:25:13:A2:49:86","not_after":1598120268,"not_before":1590344268,"serial_number":"351A6D2C7B0DF3FBC9C9AE9A39263D67681","subject":{"C":null,"CN":"baden-mueller.de","L":null,"O":null,"OU":null,"ST":null,"aggregated":"/CN=baden-mueller.de"}},"seen":1590347943.736608,"source":{"name":"Google 'Argon2020' log","url":"ct.googleapis.com/logs/argon2020/"},"update_type":"PrecertLogEntry"},"message_type":"certificate_update"} \ No newline at end of file diff --git a/res/heartbeat.json b/res/heartbeat.json new file mode 100644 index 0000000..a1bcf74 --- /dev/null +++ b/res/heartbeat.json @@ -0,0 +1 @@ +{"data":{"cert_index":612101919,"cert_link":"http://ct.googleapis.com/logs/argon2020/ct/v1/get-entries?start=612101919&end=612101919","chain":[{"as_der":"MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0NlowSjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMTGkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EFq6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWAa6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIGCCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNvbTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9kc3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAwVAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcCARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwuY3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsFAAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJouM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwuX4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlGPfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==","extensions":{"authorityInfoAccess":"CA Issuers - URI:http://apps.identrust.com/roots/dstrootcax3.p7c\nOCSP - URI:http://isrg.trustid.ocsp.identrust.com\n","authorityKeyIdentifier":"keyid:C4:A7:B1:A4:7B:2C:71:FA:DB:E1:4B:90:75:FF:C4:15:60:85:89:10\n","basicConstraints":"CA:TRUE","certificatePolicies":"Policy: 1.3.6.1.4.1.44947.1.1.1\n CPS: http://cps.root-x1.letsencrypt.org","crlDistributionPoints":"Full Name:\n URI:http://crl.identrust.com/DSTROOTCAX3CRL.crl","keyUsage":"Digital Signature, Key Cert Sign, C R L Sign","subjectKeyIdentifier":"A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1"},"fingerprint":"E6:A3:B4:5B:06:2D:50:9B:33:82:28:2D:19:6E:FE:97:D5:95:6C:CB","not_after":1615999246,"not_before":1458232846,"serial_number":"A0141420000015385736A0B85ECA708","subject":{"C":"US","CN":"Let's Encrypt Authority X3","L":null,"O":"Let's Encrypt","OU":null,"ST":null,"aggregated":"/C=US/CN=Let's Encrypt Authority X3/O=Let's Encrypt"}},{"as_der":"MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ","extensions":{"basicConstraints":"CA:TRUE","keyUsage":"Key Cert Sign, C R L Sign","subjectKeyIdentifier":"C4:A7:B1:A4:7B:2C:71:FA:DB:E1:4B:90:75:FF:C4:15:60:85:89:10"},"fingerprint":"DA:C9:02:4F:54:D8:F6:DF:94:93:5F:B1:73:26:38:CA:6A:D7:7C:13","not_after":1633010475,"not_before":970348339,"serial_number":"44AFB080D6A327BA893039862EF8406B","subject":{"C":null,"CN":"DST Root CA X3","L":null,"O":"Digital Signature Trust Co.","OU":null,"ST":null,"aggregated":"/CN=DST Root CA X3/O=Digital Signature Trust Co."}}],"leaf_cert":{"all_domains":["baden-mueller.de","www.baden-mueller.de"],"as_der":"MIIEezCCA2OgAwIBAgISA1Gm0sew3z+8nJrpo5Jj1naBMA0GCSqGSIb3DQEBCwUAMEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQDExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA1MjQxODE3NDhaFw0yMDA4MjIxODE3NDhaMBsxGTAXBgNVBAMTEGJhZGVuLW11ZWxsZXIuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCSDtXT7WQQaNmnaH6+BxHwEz7eqHdTx/02HV7x/q9oozIKfWnfc4A3glkMdnJtZUjLlbV4sgAO4MBDNo65Qsq4L/GesRsVTczmYcAxnrfp8e/eK7wF08oqCvdHddXSHD82aXe/6Y6a3hiLEG+oBMDfG1Skwyt7NGNySlenz3EYEbc35IVoFKIkp2CyMV/nkKQPCgQBL10niEiQd9Q9bHDQJZsBtW59VVCy5K5kIPo6P5v295PCt0WTUppXagY2G/YGpQOmvsjl9MFjMZc4yOOd3RhGhcr2jgd9iF04TvownTxvQAU1EbKcXDHcoPVmhH5zDeiN1JbLNpW2wMf5Vr9VAgMBAAGjggGIMIIBhDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFE8R8swxvB64KS8VqcCaUcMFpEjAMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9yZy8wMQYDVR0RBCowKIIQYmFkZW4tbXVlbGxlci5kZYIUd3d3LmJhZGVuLW11ZWxsZXIuZGUwTAYDVR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwEwYKKwYBBAHWeQIEAwEB/wQCBQAwDQYJKoZIhvcNAQELBQADggEBAIUMEOxJNwvA/pWwFm0BR0HClGdzSC1vQprBaZ6cedUM6b/wfAiCPNJXCvJyrfhJp4T1GcnwU5VnMLPE1/nwJ6LY3My86/M+eQn/3HRuXu3p1GFpp5k2cXsHB7VRlw5X78XVvsnYKc6giwOan7L8fL136EcplQTZRc/5qu9hvazeBOBQQc/lCeWceWz0ZDDVbU2IGvY6aF/SAQREOSq8jLVpEoXB0zwq3dXeEi+PfC2Ea03eOpo1y11nmRYB5Usi/GjMi7oXuBxVQMolJXJj38ziJcp1TT1sv2Ha/00F+Pudo54w1NEo04DbDD9yB2H9wTlMM4YsArmD3K22OGA8wNE=","extensions":{"authorityInfoAccess":"CA Issuers - URI:http://cert.int-x3.letsencrypt.org/\nOCSP - URI:http://ocsp.int-x3.letsencrypt.org\n","authorityKeyIdentifier":"keyid:A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1\n","basicConstraints":"CA:FALSE","certificatePolicies":"Policy: 1.3.6.1.4.1.44947.1.1.1\n CPS: http://cps.letsencrypt.org","ctlPoisonByte":true,"extendedKeyUsage":"TLS Web server authentication, TLS Web client authentication","keyUsage":"Digital Signature, Key Encipherment","subjectAltName":"DNS:www.baden-mueller.de, DNS:baden-mueller.de","subjectKeyIdentifier":"4F:11:F2:CC:31:BC:1E:B8:29:2F:15:A9:C0:9A:51:C3:05:A4:48:C0"},"fingerprint":"64:BF:49:41:3B:7A:FD:5D:C1:04:D9:44:64:9D:1C:25:13:A2:49:86","not_after":1598120268,"not_before":1590344268,"serial_number":"351A6D2C7B0DF3FBC9C9AE9A39263D67681","subject":{"C":null,"CN":"baden-mueller.de","L":null,"O":null,"OU":null,"ST":null,"aggregated":"/CN=baden-mueller.de"}},"seen":1590347943.736608,"source":{"name":"Google 'Argon2020' log","url":"ct.googleapis.com/logs/argon2020/"},"update_type":"PrecertLogEntry"},"message_type":"heartbeat"} \ No newline at end of file