72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
package service
|
|
|
|
import (
|
|
"backend/internal/model"
|
|
"bufio"
|
|
"log/slog"
|
|
"net/http"
|
|
"os"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func GetStatuses() model.StatusData {
|
|
data := model.StatusData{
|
|
Success: false,
|
|
Website: 0,
|
|
Api: 0,
|
|
Files: 0,
|
|
}
|
|
|
|
req, err := http.NewRequest("GET", os.Getenv("UPTIME_KUMA_URL"), nil)
|
|
if err != nil {
|
|
slog.Error("Error creating request for Uptime Kuma", slog.Any("error", err))
|
|
return data
|
|
}
|
|
req.SetBasicAuth("", os.Getenv("UPTIME_KUMA_API_KEY"))
|
|
|
|
client := &http.Client{}
|
|
res, err := client.Do(req)
|
|
if err != nil {
|
|
slog.Error("Error sending request for Uptime Kuma", slog.Any("error", err))
|
|
return data
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
regex := regexp.MustCompile(`monitor_name="([^"]+)"[^}]*} (\d+)`)
|
|
statusMap := map[string]*uint8{
|
|
"website": &data.Website,
|
|
"api": &data.Api,
|
|
"files": &data.Files,
|
|
}
|
|
|
|
scanner := bufio.NewScanner(res.Body)
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
|
|
if strings.HasPrefix(line, "monitor_status{") {
|
|
matches := regex.FindStringSubmatch(line)
|
|
monitorName := matches[1]
|
|
status := matches[2]
|
|
|
|
statusCode, err := strconv.Atoi(status)
|
|
if err != nil {
|
|
slog.Error("Error parsing bool for Uptime Kuma", slog.Any("error", err))
|
|
statusCode = 0
|
|
}
|
|
|
|
if field, exists := statusMap[monitorName]; exists {
|
|
*field = uint8(statusCode)
|
|
}
|
|
}
|
|
}
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
slog.Error("Error reading metrics for Uptime Kuma", slog.Any("error", err))
|
|
return data
|
|
}
|
|
|
|
data.Success = true
|
|
return data
|
|
}
|