golang學(xué)習(xí)筆記(5)
2111
發(fā)布于 云南 2021-03-31 · 1.4w瀏覽 4贊

      把之前的代碼組合起來就可以得到一個相對完整的網(wǎng)站監(jiān)控程序。從配置文件讀取網(wǎng)站列表,依次檢查每個網(wǎng)站的狀態(tài),記錄報錯信息,然后通過郵件通知網(wǎng)站管理人員。


package main

 

import (

    "fmt"

    "io/ioutil"

    "net/http"

    "net/smtp"

    "os"

    "strings"

)

 

//SendToMail 發(fā)送郵件

func SendToMail(user, password, host, to, subject, body, mailtype string) error {

    hp := strings.Split(host, ":")

    auth := smtp.PlainAuth("", user, password, hp[0])

    sendTo := strings.Split(to, ";")

    done := make(chan error, 1024)

    var contentType string

    if mailtype == "html" {

        contentType = "Content-Type: text/" + mailtype + "; charset=UTF-8"

    } else {

        contentType = "Content-Type: text/plain" + "; charset=UTF-8"

    }

 

    go func() {

        defer close(done)

        for _, strTo := range sendTo {

            msg := []byte("To: " + to + "\r\nFrom: " + user + "\r\nSubject: " + subject + "\r\n" + contentType + "\r\n\r\n" + body)

            err := smtp.SendMail(host, auth, user, []string{strTo}, msg)

            done <- err

        }

    }()

 

    for i := 0; i < len(sendTo); i++ {

        <-done

    }

    //fmt.Println(sendTo)

    return nil

}

 

//Mail 定義標題和內(nèi)容然后調(diào)用發(fā)送郵件方法

func Mail(subject, body string) {

    user := "發(fā)郵件用的郵箱地址"

    password := "發(fā)郵件用的郵箱密碼"

    host := "smtp.exmail.qq.com:25"//smtp服務(wù)器地址,這里使用的是騰訊企業(yè)郵箱的smtp

    to := "接收郵件的郵箱地址1;接收郵件的郵箱地址2"//可以使用;分隔,實現(xiàn)發(fā)送到多個郵箱

 

    fmt.Println("sending email")

    err := SendToMail(user, password, host, to, subject, body, "html")

    if err != nil {

        fmt.Println("Send mail error!")

        fmt.Println(err)

    } else {

        fmt.Println("Send mail success!")

    }

}

 

//WriteFIle 寫入文件

func WriteFIle(name, content string) {

    data := []byte(content)

    if ioutil.WriteFile(name, data, 0644) != nil {

        fmt.Println("寫入文件失敗:", content)

    }

}

 

//CheckSite 檢查網(wǎng)站狀態(tài)

func CheckSite(weblist string) {

    list := ReadFile(weblist)

    site := strings.Split(list, "\r\n")

    var errors string

 

    for _, url := range site {

        resp, err := http.Get(url)

        if err != nil {

            fmt.Println(err.Error())

        } else {

            if !strings.Contains(resp.Status, "200 OK") {

                errors += url + " " + resp.Status + "<br>"

                fmt.Println(url + " " + resp.Status)

            }

        }

        WriteFIle("site_errors", errors)

    }

}

 

//ReadFile 讀取文件內(nèi)容

func ReadFile(filepath string) string {

    f, err := os.Open(filepath)

    if err != nil {

        fmt.Println("read file fail", err)

        return ""

    }

    defer f.Close()

 

    fd, err := ioutil.ReadAll(f)

    if err != nil {

        fmt.Println("read to fd fail", err)

        return ""

    }

 

    return string(fd)

}

 

func main() {

    CheckSite("weblist")

    result := ReadFile("site_errors")

    fmt.Println(result)

    if len(result) > 0 {

        Mail("[告警] 網(wǎng)站發(fā)生故障!", result)

    }

}


      整合了前幾段代碼的功能,新增了文件寫入功能用于記錄錯誤信息,通過"io/ioutil"包實現(xiàn)寫入功能。

2111
~
瀏覽 1.4w
4
相關(guān)推薦
最新評論
贊過的人 4
評論加載中...

暫無評論,快來評論吧!