blocky/cmd/blocking.go

134 lines
3.2 KiB
Go

package cmd
import (
"context"
"fmt"
"net/http"
"strings"
"github.com/0xERR0R/blocky/api"
"github.com/0xERR0R/blocky/log"
"github.com/spf13/cobra"
)
func newBlockingCommand() *cobra.Command {
c := &cobra.Command{
Use: "blocking",
Aliases: []string{"block"},
Short: "Control status of blocking resolver",
}
c.AddCommand(&cobra.Command{
Use: "enable",
Args: cobra.NoArgs,
Aliases: []string{"on"},
Short: "Enable blocking",
RunE: enableBlocking,
})
disableCommand := &cobra.Command{
Use: "disable",
Aliases: []string{"off"},
Args: cobra.NoArgs,
Short: "Disable blocking for certain duration",
RunE: disableBlocking,
}
disableCommand.Flags().DurationP("duration", "d", 0, "duration in min")
disableCommand.Flags().StringArrayP("groups", "g", []string{}, "blocking groups to disable")
c.AddCommand(disableCommand)
c.AddCommand(&cobra.Command{
Use: "status",
Args: cobra.NoArgs,
Short: "Print the status of blocking resolver",
RunE: statusBlocking,
})
return c
}
func enableBlocking(_ *cobra.Command, _ []string) error {
client, err := api.NewClientWithResponses(apiURL())
if err != nil {
return fmt.Errorf("can't create client: %w", err)
}
resp, err := client.EnableBlockingWithResponse(context.Background())
if err != nil {
return fmt.Errorf("can't execute %w", err)
}
if resp.StatusCode() == http.StatusOK {
log.Log().Info("OK")
} else {
return fmt.Errorf("response NOK, Status: %s", resp.Status())
}
return nil
}
func disableBlocking(cmd *cobra.Command, _ []string) error {
duration, _ := cmd.Flags().GetDuration("duration")
groups, _ := cmd.Flags().GetStringArray("groups")
durationString := duration.String()
groupsString := strings.Join(groups, ",")
client, err := api.NewClientWithResponses(apiURL())
if err != nil {
return fmt.Errorf("can't create client: %w", err)
}
resp, err := client.DisableBlockingWithResponse(context.Background(), &api.DisableBlockingParams{
Duration: &durationString,
Groups: &groupsString,
})
if err != nil {
return fmt.Errorf("can't execute %w", err)
}
if resp.StatusCode() == http.StatusOK {
log.Log().Info("OK")
} else {
return fmt.Errorf("response NOK, Status: %s", resp.Status())
}
return nil
}
func statusBlocking(_ *cobra.Command, _ []string) error {
client, err := api.NewClientWithResponses(apiURL())
if err != nil {
return fmt.Errorf("can't create client: %w", err)
}
resp, err := client.BlockingStatusWithResponse(context.Background())
if err != nil {
return fmt.Errorf("can't execute %w", err)
}
if resp.StatusCode() != http.StatusOK {
return fmt.Errorf("response NOK, Status: %s", resp.Status())
}
if err != nil {
return fmt.Errorf("can't parse response %w", err)
}
if resp.JSON200.Enabled {
log.Log().Info("blocking enabled")
} else {
var groupNames string
if resp.JSON200.DisabledGroups != nil {
groupNames = strings.Join(*resp.JSON200.DisabledGroups, "; ")
}
if resp.JSON200.AutoEnableInSec == nil || *resp.JSON200.AutoEnableInSec == 0 {
log.Log().Infof("blocking disabled for groups: %s", groupNames)
} else {
log.Log().Infof("blocking disabled for groups: '%s', for %d seconds",
groupNames, *resp.JSON200.AutoEnableInSec)
}
}
return nil
}