github.com/scaleway/scaleway-cli@v1.11.1/pkg/cli/x_userdata.go (about)

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