LoginSignup
4

More than 5 years have passed since last update.

Golang と Line Notify を利用して API の証明書期限切れチェック #golang

Last updated at Posted at 2017-09-24

API の死活監視と証明書の有効期限切れ(※)のチェックを golang を利用して行い、結果を Line Notify を使って通知します。
※ Let's Encrypt を利用してるけど 3ヶ月で有効期限切れになる

golang は会社で新しいプロダウトに利用する可能性があったので試しに使ってみることにしました。

前準備

仕様

引数にチェック対象のエンドポイントの URI と Line Notify 用の Token を設定できるようにする

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

ソースコード

$ go version
go version go1.9 darwin/amd64
apichecker.go
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
}

LINE NotifyをGoで送る を参考にしました。

実行結果

OK の場合

$ 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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4