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 }