把之前的代碼組合起來就可以得到一個相對完整的網(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)寫入功能。





暫無評論,快來評論吧!