Skip to content

Commit 6345292

Browse files
committed
first commit
1 parent b6163b6 commit 6345292

File tree

3 files changed

+165
-12
lines changed

3 files changed

+165
-12
lines changed

.gitignore

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
# Binaries for programs and plugins
2-
*.exe
3-
*.exe~
4-
*.dll
5-
*.so
6-
*.dylib
7-
8-
# Test binary, build with `go test -c`
9-
*.test
10-
11-
# Output of the go coverage tool, specifically when used with LiteIDE
12-
*.out
1+
# Binaries for programs and plugins
2+
*.exe
3+
*.exe~
4+
*.dll
5+
*.so
6+
*.dylib
7+
8+
# Test binary, build with `go test -c`
9+
*.test
10+
11+
# Output of the go coverage tool, specifically when used with LiteIDE
12+
*.out
13+
certcheck.yml

certcheck.go

+141
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io/ioutil"
7+
"log"
8+
"net/http"
9+
"net/url"
10+
"time"
11+
12+
yaml "gopkg.in/yaml.v2"
13+
)
14+
15+
// Data - Setting File Struct
16+
type Data struct {
17+
Targets []Target `yaml:"targets"`
18+
Slacks []Slack `yaml:"slacks"`
19+
}
20+
21+
// Target - Cert Check Target Struct
22+
type Target struct {
23+
Name string `yaml:"name"`
24+
Endpoint string `yaml:"endpoint"`
25+
SlackNo int `yaml:"slackno"`
26+
Threshold int `yaml:"threshold"`
27+
}
28+
29+
// Slack - Notify Setting Struct
30+
type Slack struct {
31+
No int `yaml:"no"`
32+
URL string `yaml:"url"`
33+
Username string `yaml:"username"`
34+
}
35+
36+
// SlackJSON - Slack Properties
37+
type SlackJSON struct {
38+
Text string `json:"text"`
39+
Username string `json:"username"`
40+
}
41+
42+
func main() {
43+
buf, err := ioutil.ReadFile("certcheck.yml")
44+
if err != nil {
45+
log.Fatal(err)
46+
return
47+
}
48+
var d Data
49+
err = yaml.Unmarshal(buf, &d)
50+
if err != nil {
51+
log.Fatal(err)
52+
return
53+
}
54+
for key, tgt := range d.Targets {
55+
if checkParam(key, tgt) {
56+
message, result := getAPI(tgt.Endpoint, tgt.Threshold)
57+
if result {
58+
postSlack(d.Slacks, message, tgt.SlackNo)
59+
}
60+
log.Printf(message)
61+
}
62+
}
63+
}
64+
65+
func checkParam(key int, tgt Target) bool {
66+
var result = true
67+
if tgt.Name == "" {
68+
log.Printf("name is empty. (key: %d): tgt.Endpoint", key)
69+
result = false
70+
}
71+
if tgt.Endpoint == "" {
72+
log.Printf("endpoint is empty. (key: %d): tgt.Endpoint", key)
73+
result = false
74+
}
75+
if tgt.SlackNo < 0 {
76+
log.Printf("slackno is less than 0. (key: %d): tgt.Endpoint", key)
77+
result = false
78+
}
79+
if tgt.Threshold < 0 {
80+
log.Printf("threshold is less than 0. (key: %d): tgt.Endpoint", key)
81+
result = false
82+
}
83+
return result
84+
}
85+
86+
func getAPI(endpoint string, threshold int) (string, bool) {
87+
var message = ""
88+
var result = true
89+
resp, err := http.Get(endpoint)
90+
if err != nil {
91+
message = fmt.Sprintf("NG: %s", err)
92+
} else {
93+
defer resp.Body.Close()
94+
expire := "-"
95+
if len(resp.TLS.PeerCertificates) > 0 {
96+
expireUTCTime := resp.TLS.PeerCertificates[0].NotAfter
97+
expireJSTTime := expireUTCTime.In(time.FixedZone("Asia/Tokyo", 9*60*60))
98+
expire = expireJSTTime.Format("2006/01/02 15:04")
99+
th := time.Now().AddDate(0, 0, threshold)
100+
if !th.Before(expireJSTTime) {
101+
message = fmt.Sprintf("Warning (expire=%s): %s", expire, endpoint)
102+
} else {
103+
message = fmt.Sprintf("OK (expire=%s): %s", expire, endpoint)
104+
result = false
105+
}
106+
}
107+
}
108+
return message, result
109+
}
110+
111+
func postSlack(slacks []Slack, message string, slackNo int) bool {
112+
for _, slack := range slacks {
113+
if slack.No == slackNo {
114+
if slack.URL == "" {
115+
log.Printf("slack URL is empty. (key: %d)", slackNo)
116+
return false
117+
} else if slack.Username == "" {
118+
log.Printf("slack Username is empty. (key: %d)", slackNo)
119+
return false
120+
}
121+
params, _ := json.Marshal(SlackJSON{
122+
message,
123+
slack.Username})
124+
resp, err := http.PostForm(
125+
slack.URL,
126+
url.Values{"payload": {string(params)}},
127+
)
128+
if err != nil {
129+
log.Fatal(err)
130+
return false
131+
}
132+
defer resp.Body.Close()
133+
_, err = ioutil.ReadAll(resp.Body)
134+
if err != nil {
135+
log.Fatal(err)
136+
return false
137+
}
138+
}
139+
}
140+
return true
141+
}

certcheck.yml.format

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
targets:
2+
-
3+
name: google
4+
endpoint: https://google.com
5+
slackno: 1
6+
threshold: 15
7+
slacks:
8+
-
9+
no: 1
10+
url: https://hooks.slack.com/services/<value1>/<value2>/<value3>
11+
username: certcheck

0 commit comments

Comments
 (0)