2014-08-02 21:59:53 +02:00
|
|
|
package util
|
|
|
|
|
|
|
|
|
|
import (
|
2014-08-03 22:35:53 +02:00
|
|
|
"errors"
|
2014-08-02 21:59:53 +02:00
|
|
|
"fmt"
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
"os"
|
2014-08-03 22:35:53 +02:00
|
|
|
"path"
|
|
|
|
|
"path/filepath"
|
2014-08-02 21:59:53 +02:00
|
|
|
|
2015-03-05 15:57:12 +01:00
|
|
|
"github.com/asciinema/asciinema/Godeps/_workspace/src/code.google.com/p/gcfg"
|
2014-08-02 21:59:53 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
2015-03-12 12:22:42 +01:00
|
|
|
DefaultAPIURL = "https://asciinema.org"
|
|
|
|
|
DefaultCommand = "/bin/sh"
|
2014-08-02 21:59:53 +02:00
|
|
|
)
|
|
|
|
|
|
2015-03-12 12:22:42 +01:00
|
|
|
type ConfigAPI struct {
|
|
|
|
|
Token string
|
|
|
|
|
URL string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ConfigRecord struct {
|
|
|
|
|
Command string
|
2016-05-15 20:18:00 +02:00
|
|
|
MaxWait float64
|
2015-03-12 12:22:42 +01:00
|
|
|
Yes bool
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-10 13:50:43 +02:00
|
|
|
type ConfigPlay struct {
|
2016-05-15 20:18:00 +02:00
|
|
|
MaxWait float64
|
2015-05-06 07:48:27 -07:00
|
|
|
}
|
|
|
|
|
|
2015-03-12 12:22:42 +01:00
|
|
|
type ConfigUser struct {
|
|
|
|
|
Token string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ConfigFile struct {
|
2015-05-10 13:50:43 +02:00
|
|
|
API ConfigAPI
|
|
|
|
|
Record ConfigRecord
|
|
|
|
|
Play ConfigPlay
|
|
|
|
|
User ConfigUser // old location of token
|
2015-03-12 12:22:42 +01:00
|
|
|
}
|
|
|
|
|
|
2014-08-02 21:59:53 +02:00
|
|
|
type Config struct {
|
2015-03-12 12:49:26 +01:00
|
|
|
File *ConfigFile
|
|
|
|
|
Env map[string]string
|
2015-03-12 12:22:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Config) ApiUrl() string {
|
2015-03-12 12:49:26 +01:00
|
|
|
return FirstNonBlank(c.Env["ASCIINEMA_API_URL"], c.File.API.URL, DefaultAPIURL)
|
2015-03-12 12:22:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Config) ApiToken() string {
|
2015-03-12 12:49:26 +01:00
|
|
|
return FirstNonBlank(c.File.API.Token, c.File.User.Token)
|
2015-03-12 12:22:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Config) RecordCommand() string {
|
2015-03-12 12:49:26 +01:00
|
|
|
return FirstNonBlank(c.File.Record.Command, c.Env["SHELL"], DefaultCommand)
|
2015-03-12 12:22:42 +01:00
|
|
|
}
|
|
|
|
|
|
2016-05-15 20:18:00 +02:00
|
|
|
func (c *Config) RecordMaxWait() float64 {
|
2015-03-12 12:49:26 +01:00
|
|
|
return c.File.Record.MaxWait
|
2015-03-12 12:22:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Config) RecordYes() bool {
|
2015-03-12 12:49:26 +01:00
|
|
|
return c.File.Record.Yes
|
2014-08-02 21:59:53 +02:00
|
|
|
}
|
|
|
|
|
|
2016-05-15 20:18:00 +02:00
|
|
|
func (c *Config) PlayMaxWait() float64 {
|
2015-05-10 13:50:43 +02:00
|
|
|
return c.File.Play.MaxWait
|
2015-05-06 07:48:27 -07:00
|
|
|
}
|
|
|
|
|
|
2015-03-12 12:49:26 +01:00
|
|
|
func GetConfig(env map[string]string) (*Config, error) {
|
|
|
|
|
cfg, err := loadConfigFile(env)
|
2015-03-12 12:22:42 +01:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &Config{cfg, env}, nil
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-12 12:49:26 +01:00
|
|
|
func loadConfigFile(env map[string]string) (*ConfigFile, error) {
|
2015-05-23 01:36:36 -07:00
|
|
|
pathsToCheck := make([]string, 0, 4)
|
|
|
|
|
if env["ASCIINEMA_CONFIG_HOME"] != "" {
|
|
|
|
|
pathsToCheck = append(pathsToCheck,
|
|
|
|
|
filepath.Join(env["ASCIINEMA_CONFIG_HOME"], "config"))
|
|
|
|
|
}
|
|
|
|
|
if env["XDG_CONFIG_HOME"] != "" {
|
|
|
|
|
pathsToCheck = append(pathsToCheck,
|
2015-05-23 18:30:43 +02:00
|
|
|
filepath.Join(env["XDG_CONFIG_HOME"], "asciinema", "config"))
|
2015-05-23 01:36:36 -07:00
|
|
|
}
|
|
|
|
|
if env["HOME"] != "" {
|
|
|
|
|
pathsToCheck = append(pathsToCheck,
|
|
|
|
|
filepath.Join(env["HOME"], ".config", "asciinema", "config"))
|
|
|
|
|
pathsToCheck = append(pathsToCheck,
|
|
|
|
|
filepath.Join(env["HOME"], ".asciinema", "config"))
|
2014-08-03 22:35:53 +02:00
|
|
|
}
|
|
|
|
|
|
2015-05-23 01:36:36 -07:00
|
|
|
cfgPath := ""
|
|
|
|
|
for _, pathToCheck := range pathsToCheck {
|
|
|
|
|
if _, err := os.Stat(pathToCheck); err == nil {
|
|
|
|
|
cfgPath = pathToCheck
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-08-02 21:59:53 +02:00
|
|
|
|
2015-05-23 01:36:36 -07:00
|
|
|
if cfgPath == "" {
|
|
|
|
|
if len(pathsToCheck) == 0 {
|
|
|
|
|
return nil, errors.New("Need $HOME")
|
|
|
|
|
}
|
|
|
|
|
cfgPath = pathsToCheck[0]
|
|
|
|
|
if err := createConfigFile(cfgPath); err != nil {
|
2014-08-02 21:59:53 +02:00
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-12 12:49:26 +01:00
|
|
|
return readConfigFile(cfgPath)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func readConfigFile(cfgPath string) (*ConfigFile, error) {
|
2015-03-12 12:22:42 +01:00
|
|
|
var cfg ConfigFile
|
2014-08-03 22:37:06 +02:00
|
|
|
if err := gcfg.ReadFileInto(&cfg, cfgPath); err != nil {
|
2014-08-02 21:59:53 +02:00
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &cfg, nil
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-03 22:37:06 +02:00
|
|
|
func createConfigFile(cfgPath string) error {
|
2014-08-02 21:59:53 +02:00
|
|
|
apiToken := NewUUID().String()
|
|
|
|
|
contents := fmt.Sprintf("[api]\ntoken = %v\n", apiToken)
|
2014-08-03 22:37:06 +02:00
|
|
|
os.MkdirAll(path.Dir(cfgPath), 0755)
|
|
|
|
|
return ioutil.WriteFile(cfgPath, []byte(contents), 0644)
|
2014-08-02 21:59:53 +02:00
|
|
|
}
|