opnsense-exporter/opnsense/cron.go

90 lines
2 KiB
Go
Raw Permalink Normal View History

package opnsense
import (
"fmt"
"strings"
"github.com/go-kit/log/level"
)
type cronSearchResponse struct {
Rows []struct {
UUID string `json:"uuid"`
Enabled string `json:"enabled"`
Minutes string `json:"minutes"`
Hours string `json:"hours"`
Days string `json:"days"`
Months string `json:"months"`
Weekdays string `json:"weekdays"`
Description string `json:"description"`
Command string `json:"command"`
Origin string `json:"origin"`
} `json:"rows"`
RowCount int `json:"rowCount"`
Total int `json:"total"`
Current int `json:"current"`
}
type CronStatus int
const (
CronStatusDisabled CronStatus = iota
CronStatusEnabled
)
type Cron struct {
UUID string
Status CronStatus
Schedule string
Description string
Command string
Origin string
}
type CronTable struct {
TotalEntries int
Cron []Cron
}
const fetchCronPayload = `{"current":1,"rowCount":-1,"sort":{},"searchPhrase":"","resolve":"no"}`
func (c *Client) FetchCronTable() (CronTable, *APICallError) {
var resp cronSearchResponse
var cronTable CronTable
path, ok := c.endpoints["cronJobs"]
if !ok {
return cronTable, &APICallError{
Endpoint: "cron",
Message: "endpoint not found",
StatusCode: 0,
}
}
if err := c.do("POST", path, strings.NewReader(fetchCronPayload), &resp); err != nil {
return cronTable, err
}
for _, cron := range resp.Rows {
cronTable.TotalEntries++
intStatus, err := parseStringToInt(cron.Enabled, path)
if err != nil {
level.Warn(c.log).
Log("msg", "unable to parse cron entry status", "err", err)
continue
}
cronTable.Cron = append(cronTable.Cron, Cron{
UUID: cron.UUID,
Status: CronStatus(intStatus),
Description: cron.Description,
Schedule: fmt.Sprintf("%s %s %s %s %s", cron.Minutes, cron.Hours, cron.Days, cron.Months, cron.Weekdays),
Command: cron.Command,
Origin: cron.Origin,
})
}
return cronTable, nil
}