127 lines
3 KiB
Go
127 lines
3 KiB
Go
|
package lib
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"net/url"
|
||
|
"sort"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// StartupScript on Vultr account
|
||
|
type StartupScript struct {
|
||
|
ID string `json:"SCRIPTID"`
|
||
|
Name string `json:"name"`
|
||
|
Type string `json:"type"`
|
||
|
Content string `json:"script"`
|
||
|
}
|
||
|
|
||
|
type startupscripts []StartupScript
|
||
|
|
||
|
func (s startupscripts) Len() int { return len(s) }
|
||
|
func (s startupscripts) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||
|
func (s startupscripts) Less(i, j int) bool {
|
||
|
return strings.ToLower(s[i].Name) < strings.ToLower(s[j].Name)
|
||
|
}
|
||
|
|
||
|
// UnmarshalJSON implements json.Unmarshaller on StartupScript.
|
||
|
// Necessary because the SCRIPTID field has inconsistent types.
|
||
|
func (s *StartupScript) UnmarshalJSON(data []byte) (err error) {
|
||
|
if s == nil {
|
||
|
*s = StartupScript{}
|
||
|
}
|
||
|
|
||
|
var fields map[string]interface{}
|
||
|
if err := json.Unmarshal(data, &fields); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
s.ID = fmt.Sprintf("%v", fields["SCRIPTID"])
|
||
|
s.Name = fmt.Sprintf("%v", fields["name"])
|
||
|
s.Type = fmt.Sprintf("%v", fields["type"])
|
||
|
s.Content = fmt.Sprintf("%v", fields["script"])
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// GetStartupScripts returns a list of all startup scripts on the current Vultr account
|
||
|
func (c *Client) GetStartupScripts() (scripts []StartupScript, err error) {
|
||
|
var scriptMap map[string]StartupScript
|
||
|
if err := c.get(`startupscript/list`, &scriptMap); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
for _, script := range scriptMap {
|
||
|
if script.Type == "" {
|
||
|
script.Type = "boot" // set default script type
|
||
|
}
|
||
|
scripts = append(scripts, script)
|
||
|
}
|
||
|
sort.Sort(startupscripts(scripts))
|
||
|
return scripts, nil
|
||
|
}
|
||
|
|
||
|
// GetStartupScript returns the startup script with the given ID
|
||
|
func (c *Client) GetStartupScript(id string) (StartupScript, error) {
|
||
|
scripts, err := c.GetStartupScripts()
|
||
|
if err != nil {
|
||
|
return StartupScript{}, err
|
||
|
}
|
||
|
|
||
|
for _, s := range scripts {
|
||
|
if s.ID == id {
|
||
|
return s, nil
|
||
|
}
|
||
|
}
|
||
|
return StartupScript{}, nil
|
||
|
}
|
||
|
|
||
|
// CreateStartupScript creates a new startup script
|
||
|
func (c *Client) CreateStartupScript(name, content, scriptType string) (StartupScript, error) {
|
||
|
values := url.Values{
|
||
|
"name": {name},
|
||
|
"script": {content},
|
||
|
"type": {scriptType},
|
||
|
}
|
||
|
|
||
|
var script StartupScript
|
||
|
if err := c.post(`startupscript/create`, values, &script); err != nil {
|
||
|
return StartupScript{}, err
|
||
|
}
|
||
|
script.Name = name
|
||
|
script.Content = content
|
||
|
script.Type = scriptType
|
||
|
|
||
|
return script, nil
|
||
|
}
|
||
|
|
||
|
// UpdateStartupScript updates an existing startup script
|
||
|
func (c *Client) UpdateStartupScript(script StartupScript) error {
|
||
|
values := url.Values{
|
||
|
"SCRIPTID": {script.ID},
|
||
|
}
|
||
|
if script.Name != "" {
|
||
|
values.Add("name", script.Name)
|
||
|
}
|
||
|
if script.Content != "" {
|
||
|
values.Add("script", script.Content)
|
||
|
}
|
||
|
|
||
|
if err := c.post(`startupscript/update`, values, nil); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// DeleteStartupScript deletes an existing startup script from Vultr account
|
||
|
func (c *Client) DeleteStartupScript(id string) error {
|
||
|
values := url.Values{
|
||
|
"SCRIPTID": {id},
|
||
|
}
|
||
|
|
||
|
if err := c.post(`startupscript/destroy`, values, nil); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|