bitbucket.org/Aishee/synsec@v0.0.0-20210414005726-236fc01a153d/cmd/synsec-cli/bouncers.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"os"
     7  	"time"
     8  
     9  	middlewares "bitbucket.org/Aishee/synsec/pkg/apiserver/middlewares/v1"
    10  	"bitbucket.org/Aishee/synsec/pkg/database"
    11  	"github.com/enescakir/emoji"
    12  	"github.com/olekukonko/tablewriter"
    13  	log "github.com/sirupsen/logrus"
    14  	"github.com/spf13/cobra"
    15  )
    16  
    17  var keyName string
    18  var keyIP string
    19  var keyLength int
    20  
    21  func NewBouncersCmd() *cobra.Command {
    22  	/* ---- DECISIONS COMMAND */
    23  	var cmdBouncers = &cobra.Command{
    24  		Use:   "bouncers [action]",
    25  		Short: "Manage bouncers",
    26  		Long: `
    27  Bouncers Management.
    28  
    29  To list/add/delete bouncers
    30  `,
    31  		Args: cobra.MinimumNArgs(1),
    32  		PersistentPreRun: func(cmd *cobra.Command, args []string) {
    33  			var err error
    34  			if err := csConfig.LoadDBConfig(); err != nil {
    35  				log.Fatalf(err.Error())
    36  			}
    37  			dbClient, err = database.NewClient(csConfig.DbConfig)
    38  			if err != nil {
    39  				log.Fatalf("unable to create new database client: %s", err)
    40  			}
    41  		},
    42  	}
    43  
    44  	var cmdBouncersList = &cobra.Command{
    45  		Use:     "list",
    46  		Short:   "List bouncers",
    47  		Long:    `List bouncers`,
    48  		Example: `ccscli bouncers list`,
    49  		Args:    cobra.ExactArgs(0),
    50  		Run: func(cmd *cobra.Command, arg []string) {
    51  			blockers, err := dbClient.ListBouncers()
    52  			if err != nil {
    53  				log.Errorf("unable to list blockers: %s", err)
    54  			}
    55  			if csConfig.Cscli.Output == "human" {
    56  
    57  				table := tablewriter.NewWriter(os.Stdout)
    58  				table.SetCenterSeparator("")
    59  				table.SetColumnSeparator("")
    60  
    61  				table.SetHeaderAlignment(tablewriter.ALIGN_LEFT)
    62  				table.SetAlignment(tablewriter.ALIGN_LEFT)
    63  				table.SetHeader([]string{"Name", "IP Address", "Valid", "Last API pull", "Type", "Version"})
    64  				for _, b := range blockers {
    65  					var revoked string
    66  					if !b.Revoked {
    67  						revoked = fmt.Sprintf("%s", emoji.CheckMark)
    68  					} else {
    69  						revoked = fmt.Sprintf("%s", emoji.Prohibited)
    70  					}
    71  					table.Append([]string{b.Name, b.IPAddress, revoked, b.LastPull.Format(time.RFC3339), b.Type, b.Version})
    72  				}
    73  				table.Render()
    74  			} else if csConfig.Cscli.Output == "json" {
    75  				x, err := json.MarshalIndent(blockers, "", " ")
    76  				if err != nil {
    77  					log.Fatalf("failed to unmarshal")
    78  				}
    79  				fmt.Printf("%s", string(x))
    80  			} else if csConfig.Cscli.Output == "raw" {
    81  				for _, b := range blockers {
    82  					var revoked string
    83  					if !b.Revoked {
    84  						revoked = "validated"
    85  					} else {
    86  						revoked = "pending"
    87  					}
    88  					fmt.Printf("%s,%s,%s,%s,%s\n", b.Name, b.IPAddress, revoked, b.LastPull.Format(time.RFC3339), b.Version)
    89  				}
    90  			}
    91  		},
    92  	}
    93  	cmdBouncers.AddCommand(cmdBouncersList)
    94  
    95  	var cmdBouncersAdd = &cobra.Command{
    96  		Use:   "add MyBouncerName [--length 16]",
    97  		Short: "add bouncer",
    98  		Long:  `add bouncer`,
    99  		Example: `ccscli bouncers add MyBouncerName
   100  ccscli bouncers add MyBouncerName -l 24`,
   101  		Args: cobra.ExactArgs(1),
   102  		Run: func(cmd *cobra.Command, arg []string) {
   103  			keyName := arg[0]
   104  			if keyName == "" {
   105  				log.Errorf("Please provide a name for the api key")
   106  				return
   107  			}
   108  			apiKey, err := middlewares.GenerateAPIKey(keyLength)
   109  			if err != nil {
   110  				log.Errorf("unable to generate api key: %s", err)
   111  				return
   112  			}
   113  			err = dbClient.CreateBouncer(keyName, keyIP, middlewares.HashSHA512(apiKey))
   114  			if err != nil {
   115  				log.Errorf("unable to create bouncer: %s", err)
   116  				return
   117  			}
   118  
   119  			if csConfig.Cscli.Output == "human" {
   120  				fmt.Printf("Api key for '%s':\n\n", keyName)
   121  				fmt.Printf("   %s\n\n", apiKey)
   122  				fmt.Print("Please keep this key since you will not be able to retrive it!\n")
   123  			} else if csConfig.Cscli.Output == "raw" {
   124  				fmt.Printf("%s", apiKey)
   125  			} else if csConfig.Cscli.Output == "json" {
   126  				j, err := json.Marshal(apiKey)
   127  				if err != nil {
   128  					log.Fatalf("unable to marshal api key")
   129  				}
   130  				fmt.Printf("%s", string(j))
   131  			}
   132  		},
   133  	}
   134  	cmdBouncersAdd.Flags().IntVarP(&keyLength, "length", "l", 16, "length of the api key")
   135  	cmdBouncers.AddCommand(cmdBouncersAdd)
   136  
   137  	var cmdBouncersDelete = &cobra.Command{
   138  		Use:   "delete MyBouncerName",
   139  		Short: "delete bouncer",
   140  		Args:  cobra.ExactArgs(1),
   141  		Run: func(cmd *cobra.Command, arg []string) {
   142  			keyName := arg[0]
   143  			if keyName == "" {
   144  				log.Errorf("Please provide a bouncer name")
   145  				return
   146  			}
   147  			err := dbClient.DeleteBouncer(keyName)
   148  			if err != nil {
   149  				log.Errorf("unable to delete bouncer: %s", err)
   150  				return
   151  			}
   152  		},
   153  	}
   154  	cmdBouncers.AddCommand(cmdBouncersDelete)
   155  	return cmdBouncers
   156  }