github.com/engineyard/workflow-cli@v2.21.6+incompatible/settings/settings.go (about)

     1  package settings
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	deis "github.com/teamhephy/controller-sdk-go"
    11  	"github.com/teamhephy/workflow-cli/version"
    12  )
    13  
    14  // DefaultResponseLimit is the default number of responses to return on requests that can
    15  // be limited.
    16  const DefaultResponseLimit = 100
    17  
    18  // UserAgent is the user agent used by the CLI
    19  var UserAgent = "Deis Client " + version.Version
    20  
    21  type settingsFile struct {
    22  	Username   string `json:"username"`
    23  	VerifySSL  bool   `json:"ssl_verify"`
    24  	Controller string `json:"controller"`
    25  	Token      string `json:"token"`
    26  	Limit      int    `json:"response_limit"`
    27  }
    28  
    29  // Settings is the settings object created from the settings file.
    30  type Settings struct {
    31  	Username string
    32  	Limit    int
    33  	Client   *deis.Client
    34  }
    35  
    36  // Load loads a new client from a settings file.
    37  func Load(cf string) (*Settings, error) {
    38  	filename := locateSettingsFile(cf)
    39  
    40  	if _, err := os.Stat(filename); err != nil {
    41  		if os.IsNotExist(err) {
    42  			return nil, fmt.Errorf(`Client configuration file not found at: %s
    43  Are you logged in? Use 'deis login' or 'deis register' to get started.`, filename)
    44  		}
    45  
    46  		return nil, err
    47  	}
    48  
    49  	contents, err := ioutil.ReadFile(filename)
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  
    54  	sF := settingsFile{}
    55  	if err = json.Unmarshal(contents, &sF); err != nil {
    56  		return nil, err
    57  	}
    58  
    59  	c, err := deis.New(sF.VerifySSL, sF.Controller, sF.Token)
    60  
    61  	if err != nil {
    62  		return nil, err
    63  	}
    64  
    65  	// Set a custom user agent
    66  	c.UserAgent = UserAgent
    67  
    68  	settings := Settings{}
    69  	settings.Username = sF.Username
    70  	settings.Client = c
    71  
    72  	// If users have defined a custom response limit, respect it.
    73  	if sF.Limit > 0 {
    74  		settings.Limit = sF.Limit
    75  	} else {
    76  		settings.Limit = DefaultResponseLimit
    77  	}
    78  
    79  	return &settings, nil
    80  }
    81  
    82  // Save settings to a file
    83  func (s *Settings) Save(cf string) (string, error) {
    84  	settings := settingsFile{Username: s.Username, VerifySSL: s.Client.VerifySSL,
    85  		Controller: s.Client.ControllerURL.String(), Token: s.Client.Token, Limit: s.Limit}
    86  
    87  	settingsContents, err := json.Marshal(settings)
    88  
    89  	if err != nil {
    90  		return "", err
    91  	}
    92  
    93  	if err = os.MkdirAll(filepath.Join(FindHome(), "/.deis/"), 0700); err != nil {
    94  		return "", err
    95  	}
    96  
    97  	filename := locateSettingsFile(cf)
    98  
    99  	return filename, ioutil.WriteFile(filename, settingsContents, 0600)
   100  }
   101  
   102  // Delete user's settings file.
   103  func Delete(cf string) error {
   104  	filename := locateSettingsFile(cf)
   105  
   106  	if _, err := os.Stat(filename); err != nil {
   107  		if os.IsNotExist(err) {
   108  			return nil
   109  		}
   110  
   111  		return err
   112  	}
   113  
   114  	if err := os.Remove(filename); err != nil {
   115  		return err
   116  	}
   117  
   118  	return nil
   119  }