github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/command/license_put.go (about) 1 package command 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "io/ioutil" 8 "os" 9 "strings" 10 11 "github.com/pkg/errors" 12 ) 13 14 type LicensePutCommand struct { 15 Meta 16 17 testStdin io.Reader 18 } 19 20 func (c *LicensePutCommand) Help() string { 21 helpText := ` 22 Usage: nomad license put [options] 23 24 Puts a new license in Servers and Clients 25 26 When ACLs are enabled, this command requires a token with the 27 'operator:write' capability. 28 29 General Options: 30 31 ` + generalOptionsUsage(usageOptsDefault|usageOptsNoNamespace) + ` 32 33 Install a new license from a file: 34 35 $ nomad license put <path> 36 37 Install a new license from stdin: 38 39 $ nomad license put - 40 41 ` 42 return strings.TrimSpace(helpText) 43 } 44 45 func (c *LicensePutCommand) Synopsis() string { 46 return "Install a new Nomad Enterprise License" 47 } 48 49 func (c *LicensePutCommand) Name() string { return "license put" } 50 51 func (c *LicensePutCommand) Run(args []string) int { 52 flags := c.Meta.FlagSet(c.Name(), FlagSetClient) 53 flags.Usage = func() { c.Ui.Output(c.Help()) } 54 55 if err := flags.Parse(args); err != nil { 56 c.Ui.Error(fmt.Sprintf("Error parsing flags: %s", err)) 57 return 1 58 } 59 60 args = flags.Args() 61 data, err := c.dataFromArgs(args) 62 if err != nil { 63 c.Ui.Error(errors.Wrap(err, "Error parsing arguments").Error()) 64 return 1 65 } 66 67 client, err := c.Meta.Client() 68 if err != nil { 69 c.Ui.Error(fmt.Sprintf("Error initializing client: %s", err)) 70 return 1 71 } 72 73 _, err = client.Operator().LicensePut(data, nil) 74 if err != nil { 75 c.Ui.Error(fmt.Sprintf("Error putting license: %v", err)) 76 return 1 77 } 78 79 c.Ui.Output("Successfully applied license") 80 return 0 81 } 82 83 func (c *LicensePutCommand) dataFromArgs(args []string) (string, error) { 84 switch len(args) { 85 case 0: 86 return "", fmt.Errorf("Missing LICENSE argument") 87 case 1: 88 return LoadDataSource(args[0], c.testStdin) 89 default: 90 return "", fmt.Errorf("Too many arguments, exptected 1, got %d", len(args)) 91 } 92 } 93 94 func loadFromFile(path string) (string, error) { 95 data, err := ioutil.ReadFile(path) 96 if err != nil { 97 return "", fmt.Errorf("Failed to read file: %v", err) 98 } 99 return string(data), nil 100 } 101 102 func loadFromStdin(testStdin io.Reader) (string, error) { 103 var stdin io.Reader = os.Stdin 104 if testStdin != nil { 105 stdin = testStdin 106 } 107 108 var b bytes.Buffer 109 if _, err := io.Copy(&b, stdin); err != nil { 110 return "", fmt.Errorf("Failed to read stdin: %v", err) 111 } 112 return b.String(), nil 113 } 114 115 func LoadDataSource(file string, testStdin io.Reader) (string, error) { 116 // Handle empty quoted shell parameters 117 if len(file) == 0 { 118 return "", nil 119 } 120 121 if file == "-" { 122 if len(file) > 1 { 123 return file, nil 124 } 125 return loadFromStdin(testStdin) 126 } 127 128 return loadFromFile(file) 129 }