fleet/server/webhooks/host_status.go

61 lines
1.6 KiB
Go

package webhooks
import (
"context"
"fmt"
"github.com/fleetdm/fleet/v4/server"
"github.com/fleetdm/fleet/v4/server/contexts/ctxerr"
"github.com/fleetdm/fleet/v4/server/fleet"
kitlog "github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"
)
func TriggerHostStatusWebhook(
ctx context.Context,
ds fleet.Datastore,
logger kitlog.Logger,
) error {
appConfig, err := ds.AppConfig(ctx)
if err != nil {
return ctxerr.Wrap(ctx, err, "getting app config")
}
if !appConfig.WebhookSettings.HostStatusWebhook.Enable {
return nil
}
level.Debug(logger).Log("enabled", "true")
total, unseen, err := ds.TotalAndUnseenHostsSince(ctx, appConfig.WebhookSettings.HostStatusWebhook.DaysCount)
if err != nil {
return ctxerr.Wrap(ctx, err, "getting total and unseen hosts")
}
percentUnseen := float64(unseen) * 100.0 / float64(total)
if percentUnseen >= appConfig.WebhookSettings.HostStatusWebhook.HostPercentage {
url := appConfig.WebhookSettings.HostStatusWebhook.DestinationURL
message := fmt.Sprintf(
"More than %.2f%% of your hosts have not checked into Fleet for more than %d days. "+
"You've been sent this message because the Host status webhook is enabled in your Fleet instance.",
percentUnseen, appConfig.WebhookSettings.HostStatusWebhook.DaysCount,
)
payload := map[string]interface{}{
"text": message,
"data": map[string]interface{}{
"unseen_hosts": unseen,
"total_hosts": total,
"days_unseen": appConfig.WebhookSettings.HostStatusWebhook.DaysCount,
},
}
err = server.PostJSONWithTimeout(ctx, url, &payload)
if err != nil {
return ctxerr.Wrapf(ctx, err, "posting to %s", url)
}
}
return nil
}