/
x_userdata.go
123 lines (115 loc) · 2.72 KB
/
x_userdata.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Copyright (C) 2015 Scaleway. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE.md file.
package cli
import (
"fmt"
"io/ioutil"
"strings"
"github.com/scaleway/scaleway-cli/pkg/api"
"github.com/scaleway/scaleway-cli/pkg/config"
"github.com/scaleway/scaleway-cli/pkg/scwversion"
)
var cmdUserdata = &Command{
Exec: runUserdata,
UsageLine: "_userdata [OPTIONS] SERVER [FIELD[=VALUE]]",
Description: "",
Hidden: true,
Help: "List, read and write and delete server's userdata",
Examples: `
$ scw _userdata myserver
$ scw _userdata myserver key
$ scw _userdata myserver key=value
$ scw _userdata myserver key=""
`,
}
func init() {
cmdUserdata.Flag.BoolVar(&userdataHelp, []string{"h", "-help"}, false, "Print usage")
}
// Flags
var userdataHelp bool // -h, --help flag
func runUserdata(cmd *Command, args []string) error {
if userdataHelp {
return cmd.PrintUsage()
}
if len(args) < 1 {
return cmd.PrintShortUsage()
}
metadata := false
ctx := cmd.GetContext(args)
var API *api.ScalewayAPI
var err error
var serverID string
if args[0] == "local" {
API, err = api.NewScalewayAPI("", "", scwversion.UserAgent(), *flRegion)
if err != nil {
return err
}
metadata = true
} else {
if ctx.API == nil {
return fmt.Errorf("You need to login first: 'scw login'")
}
serverID, err = ctx.API.GetServerID(args[0])
if err != nil {
return err
}
API = ctx.API
}
switch len(args) {
case 1:
// List userdata
res, errGetUserdata := API.GetUserdatas(serverID, metadata)
if errGetUserdata != nil {
return errGetUserdata
}
for _, key := range res.UserData {
fmt.Fprintln(ctx.Stdout, key)
}
default:
parts := strings.Split(args[1], "=")
key := parts[0]
switch len(parts) {
case 1:
// Get userdatas
res, errGetUserdata := API.GetUserdata(serverID, key, metadata)
if errGetUserdata != nil {
return errGetUserdata
}
fmt.Fprintf(ctx.Stdout, "%s\n", res.String())
default:
value := args[1][len(parts[0])+1:]
if value != "" {
var data []byte
// Set userdata
if value[0] == '@' {
if len(value) > 1 && value[1] == '~' {
home, err := config.GetHomeDir()
if err != nil {
return err
}
value = "@" + home + value[2:]
}
data, err = ioutil.ReadFile(value[1:])
if err != nil {
return err
}
} else {
data = []byte(value)
}
err := API.PatchUserdata(serverID, key, data, metadata)
if err != nil {
return err
}
fmt.Fprintln(ctx.Stdout, key)
} else {
// Delete userdata
err := API.DeleteUserdata(serverID, key, metadata)
if err != nil {
return err
}
}
}
}
return nil
}