123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- package watcher
- import (
- "crypto/tls"
- "fmt"
- "github.com/SongZihuan/web-watcher/src/config"
- "github.com/SongZihuan/web-watcher/src/logger"
- "github.com/SongZihuan/web-watcher/src/notify"
- "io"
- "net/http"
- "strings"
- )
- func Run() error {
- if !config.IsReady() {
- panic("config is not ready")
- }
- for _, url := range config.GetConfig().Watcher.URLs {
- logger.Infof("开始请求 %s", url.Name)
- _, err := httpProcessRetry(url.URL, url.Name, url.Status, url.ClientKeyPair, url.SkipTLSVerify.IsEnable(false))
- if err != nil {
- logger.Errorf("请求 %s 出现异常:%s", url.Name, err.Error())
- notify.NewRecord(url.Name, url.URL, err.Error())
- }
- logger.Infof("处理 %s 完成", url.Name)
- }
- notify.SendNotify()
- return nil
- }
- func httpProcessRetry(url string, name string, statusList []string, cert *tls.Certificate, skipTLSVerify bool) (int, error) {
- var err1, err2, err3 error
- var statusCode int
- statusCode, err1 = httpProcessGet(url, name, statusList, cert, skipTLSVerify)
- if err1 == nil {
- return statusCode, nil
- }
- statusCode, err2 = httpProcessGet(url, name, statusList, cert, skipTLSVerify)
- if err2 == nil {
- return statusCode, nil
- }
- statusCode, err3 = httpProcessGet(url, name, statusList, cert, skipTLSVerify)
- if err3 == nil {
- return statusCode, nil
- }
- // 去除重复
- var errMap = make(map[string]bool, 3)
- errMap[err1.Error()] = true
- errMap[err2.Error()] = true
- errMap[err3.Error()] = true
- var errStrBuilder strings.Builder
- var n = 0
- for err, _ := range errMap {
- n += 1
- errStrBuilder.WriteString(fmt.Sprintf("检查 %s 错误[%d]: %s; ", name, n, err))
- }
- err := fmt.Errorf("%s", strings.TrimSpace(errStrBuilder.String()))
- return -1, err
- }
- func httpProcessGet(url string, name string, statusList []string, cert *tls.Certificate, skipTLSVerify bool) (int, error) {
- // 创建一个自定义的Transport,这样我们可以访问TLS连接状态
- tc := &tls.Config{InsecureSkipVerify: skipTLSVerify}
- if cert != nil {
- tc.Certificates = []tls.Certificate{*cert}
- }
- tr := &http.Transport{
- TLSClientConfig: tc, // 忽略服务器证书验证
- }
- // 使用自定义的Transport创建一个HTTP客户端
- client := &http.Client{Transport: tr}
- // 发送请求
- fmt.Printf("请求URL:%s\n", url)
- resp, err := client.Get(url)
- if err != nil {
- return 0, fmt.Errorf("获取 GET %s 请求错误:%s", name, err.Error())
- }
- defer func() {
- _ = resp.Body.Close()
- }()
- statusCode := resp.StatusCode
- data, err := io.ReadAll(resp.Body)
- if err != nil {
- return statusCode, err
- }
- fmt.Printf("statusCode: %d\n%s\n", statusCode, string(data))
- for _, s := range statusList {
- switch s {
- case "xxx":
- return statusCode, nil
- case "1xx":
- if statusCode >= 100 && statusCode <= 199 {
- return statusCode, nil
- }
- case "2xx":
- if statusCode >= 200 && statusCode <= 299 {
- return statusCode, nil
- }
- case "3xx":
- if statusCode >= 300 && statusCode <= 399 {
- return statusCode, nil
- }
- case "4xx":
- if statusCode >= 400 && statusCode <= 499 {
- return statusCode, nil
- }
- case "5xx":
- if statusCode >= 500 && statusCode <= 599 {
- return statusCode, nil
- }
- default:
- status := fmt.Sprintf("%d", statusCode)
- if status == s {
- return statusCode, nil
- }
- }
- }
- return statusCode, fmt.Errorf("检查 GET %s 状态码错误: %d", name, statusCode)
- }
|