From 1ecd6a9917b9d6fcda04ce045f9ba2fa094f8d93 Mon Sep 17 00:00:00 2001 From: bilalcaliskan Date: Sun, 11 Feb 2024 17:03:03 +0300 Subject: [PATCH] feat: implement purge subcommand --- cmd/cli/cli.go | 3 +++ cmd/cli/purge/purge.go | 50 ++++++++++++++++++++++++++++++++++++++++++ internal/ipc/ipc.go | 47 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 cmd/cli/purge/purge.go diff --git a/cmd/cli/cli.go b/cmd/cli/cli.go index 1fd7ed8..fd2f365 100644 --- a/cmd/cli/cli.go +++ b/cmd/cli/cli.go @@ -5,6 +5,8 @@ import ( "errors" "os" + "github.com/bilalcaliskan/split-the-tunnel/cmd/cli/purge" + "github.com/bilalcaliskan/split-the-tunnel/internal/constants" "github.com/bilalcaliskan/split-the-tunnel/internal/logging" @@ -64,4 +66,5 @@ func init() { cliCmd.AddCommand(add.AddCmd) cliCmd.AddCommand(list.ListCmd) cliCmd.AddCommand(remove.RemoveCmd) + cliCmd.AddCommand(purge.PurgeCmd) } diff --git a/cmd/cli/purge/purge.go b/cmd/cli/purge/purge.go new file mode 100644 index 0000000..ae288c4 --- /dev/null +++ b/cmd/cli/purge/purge.go @@ -0,0 +1,50 @@ +package purge + +import ( + "github.com/rs/zerolog" + + "github.com/bilalcaliskan/split-the-tunnel/internal/constants" + + "github.com/bilalcaliskan/split-the-tunnel/cmd/cli/utils" + "github.com/spf13/cobra" +) + +// PurgeCmd represents the purge command +var PurgeCmd = &cobra.Command{ + Use: "purge", + Short: "A brief description of your command", + Long: `A longer description that spans multiple lines and likely contains examples +and usage of using your command. For example: + +Cobra is a CLI library for Go that empowers applications. +This application is a tool to generate the needed files +to quickly create a Cobra application.`, + PreRunE: func(cmd *cobra.Command, args []string) error { + if len(args) > 0 { + return utils.ErrTooManyArgs + } + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + logger := cmd.Context().Value(constants.LoggerKey{}).(zerolog.Logger) + + logger.Info(). + Str("operation", cmd.Name()). + Msg(constants.ProcessCommand) + + res, err := utils.SendCommandToDaemon(utils.SocketPath, cmd.Name()) + if err != nil { + logger.Error().Str("command", cmd.Name()).Err(err).Msg(constants.FailedToProcessCommand) + + return &utils.CommandError{Err: err, Code: 10} + } + + logger.Info(). + Str("command", cmd.Name()). + Str("response", res). + Msg(constants.SuccessfullyProcessed) + + return nil + }, +} diff --git a/internal/ipc/ipc.go b/internal/ipc/ipc.go index 5bc4b92..1fab5e7 100644 --- a/internal/ipc/ipc.go +++ b/internal/ipc/ipc.go @@ -107,6 +107,10 @@ func processCommand(logger zerolog.Logger, command, gateway string, conn net.Con logger = logger.With().Str("operation", "list").Logger() handleListCommand(logger, conn, st) + case "purge": + logger = logger.With().Str("operation", "purge").Logger() + + handlePurgeCommand(logger, conn, st) } } @@ -185,6 +189,49 @@ func handleAddCommand(logger zerolog.Logger, gw string, domains []string, conn n } } +func handlePurgeCommand(logger zerolog.Logger, conn net.Conn, st *state.State) { + logger = logger.With().Str("operation", "purge").Logger() + + for _, entry := range st.Entries { + for _, ip := range entry.ResolvedIPs { + if err := utils.RemoveRoute(ip); err != nil { + logger.Error().Err(err).Str("domain", entry.Domain).Str("ip", ip).Msg("failed to remove route from routing table") + + if err := writeResponse(&DaemonResponse{ + Success: false, + Response: "", + Error: errors.Wrapf(err, "failed to remove route for domain %s from routing table", entry.Domain).Error(), + }, conn); err != nil { + logger.Error(). + Err(err). + Str("domain", entry.Domain). + Msg(constants.FailedToWriteToUnixDomainSocket) + } + + continue + } + } + + logger.Info().Str("domain", entry.Domain).Msg("successfully removed route from routing table") + } + + st.Entries = make([]*state.RouteEntry, 0) + + if err := st.Write(constants.StateFilePath); err != nil { + logger.Error().Err(err).Msg("failed to write state to file") + } + + if err := writeResponse(&DaemonResponse{ + Success: true, + Response: "purged all routes", + Error: "", + }, conn); err != nil { + logger.Error(). + Err(err). + Msg(constants.FailedToWriteToUnixDomainSocket) + } +} + // handleRemoveCommand removes the given domains from the routing table func handleRemoveCommand(logger zerolog.Logger, domains []string, conn net.Conn, st *state.State) { logger = logger.With().Str("operation", "remove").Logger()