利用 Golang 和 Line Notify 进行 API 证书过期检查 #golang

使用golang进行API的存活监视和证书到期检查,并使用Line Notify通知结果。使用Let’s Encrypt进行证书颁发,但有效期为3个月即过期。

由于Go语言有可能在公司的新产品上使用,我决定试着使用一下。

前期准备

    • Golang の開発環境の構築(以下のサイト参考にした)

Golang 本家サイト
Intellij golang IDE

Line Notify 準備

コマンドラインから LINE にメッセージを送れる LINE Notify

规格

修改参数以使其能够设置要检查的端点 URI 和用于 Line Notify 的令牌。

$ apichecker -endpoint=${エンドポイントURI} -token=${Line Notify 用 Token} 

源代码

$ go version
go version go1.9 darwin/amd64
package main

import (
    "fmt"
    "net/http"
    "flag"
    "log"
    "net/url"
    "strings"
    "io/ioutil"
)

func main() {
    var endpoint = flag.String("endpoint", "", "check target Endpoint URL")
    var lineToken = flag.String("token", "", "LINE notify token")
    flag.Parse()

    var apiResult = getAPI(*endpoint)
    var result = postLINE(*lineToken, apiResult)

    fmt.Printf("LINE Post result [%t]\n", result)
}

func getAPI(endpoint string) string {
    if endpoint == "" {
        log.Fatal("not endpoint")
        return "not endpoint"
    }

    var result = ""
    resp, err := http.Get(endpoint)
    if err != nil {
        result = fmt.Sprintf("NG [%s]", err)
    } else {
        defer resp.Body.Close()
        result = fmt.Sprintf("OK [%s]", endpoint)
    }

    return result
}

func postLINE(token string, message string) bool {
    if token == "" {
        log.Fatal("not token")
        return false
    } else if message == "" {
        log.Fatal("not text")
        return false
    }

    data := url.Values{"message": {message}}
    r, _ := http.NewRequest("POST", "https://notify-api.line.me/api/notify", strings.NewReader(data.Encode()))
    r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
    resp, err := http.DefaultClient.Do(r)
    if err != nil {
        log.Fatal(err)
        return false
    }
    defer resp.Body.Close()
    _, err = ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
        return false
    }

    return true
}

我参考了 “通过 Go 发送 LINE Notify” 的资料。

执行结果

如果一切正常

$ go run apichecker.go -endpoint=https://www.yahoo.co.jp -token=${Line Notify 用 Token}
LINE Post result [true]
スクリーンショット 2017-09-24 16.59.54.png

在 NG 的情况下(证书错误)

$ go run apichecker.go -endpoint=https://www.yahoo.jp -token=${Line Notify 用 Token}
LINE Post result [true]
スクリーンショット 2017-09-24 17.00.04.png

Appendix

    ソースコード
bannerAds