Files
worker/checks/cssl/cssl.go
Gleb Tv 2c884c5612
Некоторые проверки не удались
CI / test (push) Successful in 2m5s
Docker / Build and publish worker image (push) Failing after 31s
refactor: adopt worker module path
2026-07-13 17:56:12 +03:00

80 строки
1.6 KiB
Go

// Package cssl provides functionality.
package cssl
import (
"log"
"net/http"
"net/url"
"time"
"github.com/pkg/errors"
"rocketgit.ru/rsmon/worker/app/models"
)
var client *http.Client
func init() {
client = &http.Client{
Timeout: time.Second * 60,
CheckRedirect: func(_ *http.Request, _ []*http.Request) error {
return http.ErrUseLastResponse
},
}
}
// Perform provides functionality.
func Perform(c *models.Check) *Result {
result := &Result{}
result.State = "OK"
var ur string
if c.URL != nil && *c.URL != "" {
ur = *c.URL
u, err := url.Parse(ur)
if err != nil {
result.State = "FAIL"
result.Error = errors.Wrap(err, "bad url")
return result
}
u.Scheme = "https"
ur = u.String()
} else {
ur = "https://" + c.Monitor.Host
}
log.Println("URL:", ur)
reqest, err := http.NewRequest("GET", ur, http.NoBody)
if err != nil {
result.State = "FAIL"
result.Error = err
return result
}
reqest.Header.Set("Cache-Control", "max-age=0")
reqest.Header.Set("Connection", "close")
resp, err := client.Do(reqest)
if err != nil {
result.State = "ERR"
result.Error = errors.Wrap(err, "https request error")
return result
}
defer resp.Body.Close() //nolint:errcheck
if resp.TLS == nil {
result.State = "ERR"
result.Error = errors.New("bad SSL cert CN")
} else {
cert := resp.TLS.VerifiedChains[0][0]
result.Expires = &cert.NotAfter
exp := time.Until(*result.Expires).Hours() / 24
if exp < 2 {
result.State = "WARN"
result.Warnings = append(result.Warnings, "Certificate expires soon")
}
}
return result
}