cmd/gondole-cli/config.go
author Mikael Berthe <mikael@lilotux.net>
Sat, 15 Apr 2017 00:39:43 +0200
changeset 119 22c8c58ad61b
parent 81 ba90955d2d56
permissions -rw-r--r--
LoginBasic: Remove useless header
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     1
// config.go
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     2
//
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     3
// This file implements the configuration part for when you need the API
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     4
// key to modify things in the Mastodon configuration and manage measurements.
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     5
73
d601c957d789 We are in package "main" now.
Ollivier Robert <roberto@keltia.net>
parents: 69
diff changeset
     6
package main
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     7
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     8
import (
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
     9
	"fmt"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    10
	"io/ioutil"
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    11
	"log"
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    12
	"os"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    13
	"path/filepath"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    14
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    15
	"github.com/naoina/toml"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    16
)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    17
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    18
/*
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    19
Assume the application is registered if $HOME/.config/<gondole>/config.toml already exist
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    20
We will store the per-instance token into $HOME/.config/<gondole>/<site>.token
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    21
*/
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    22
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    23
const (
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    24
	DefaultName = "config.toml"
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    25
)
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    26
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    27
var (
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    28
	baseDir = filepath.Join(os.Getenv("HOME"),
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    29
		".config",
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    30
		"gondole",
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    31
	)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    32
)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    33
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    34
func loadGlobal(file string) (c *Config, err error) {
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    35
	log.Printf("file=%s", file)
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    36
	// Check if there is any config file
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    37
	_, err = os.Stat(file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    38
	if err != nil {
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    39
		return
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    40
	}
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    41
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    42
	log.Printf("file=%s, found it", file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    43
	// Read it
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    44
	buf, err := ioutil.ReadFile(file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    45
	if err != nil {
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    46
		return c, fmt.Errorf("Can not read %s", file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    47
	}
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    48
44
f676c2646270 Actually allocate storage before Unmarshall().
Ollivier Robert <roberto@keltia.net>
parents: 42
diff changeset
    49
	cnf := Config{}
f676c2646270 Actually allocate storage before Unmarshall().
Ollivier Robert <roberto@keltia.net>
parents: 42
diff changeset
    50
	err = toml.Unmarshal(buf, &cnf)
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    51
	if err != nil {
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    52
		return c, fmt.Errorf("Error parsing toml %s: %v", file, err)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    53
	}
44
f676c2646270 Actually allocate storage before Unmarshall().
Ollivier Robert <roberto@keltia.net>
parents: 42
diff changeset
    54
	c = &cnf
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    55
	return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    56
}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    57
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    58
func loadInstance(name string) (s *Server, err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    59
	// Load instance-specific file
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    60
	file := filepath.Join(baseDir, name+".token")
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    61
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    62
	log.Printf("instance is %s", file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    63
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    64
	// Check if there is any config file
49
b48dafc1fd4f Unshadow variable, fix test.
Ollivier Robert <roberto@keltia.net>
parents: 44
diff changeset
    65
	if _, err = os.Stat(file); err == nil {
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    66
		// Read it
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    67
		buf, err := ioutil.ReadFile(file)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    68
		if err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    69
			return s, fmt.Errorf("Can not read %s", file)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    70
		}
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    71
51
4a0533d00053 Allocate stuff the same way everywhere.
Ollivier Robert <roberto@keltia.net>
parents: 50
diff changeset
    72
		sc := Server{}
50
80a09cf62225 Again, fix allocation.
Ollivier Robert <roberto@keltia.net>
parents: 49
diff changeset
    73
		err = toml.Unmarshal(buf, &sc)
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    74
		if err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    75
			return s, fmt.Errorf("Error parsing toml %s: %v", file, err)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    76
		}
50
80a09cf62225 Again, fix allocation.
Ollivier Robert <roberto@keltia.net>
parents: 49
diff changeset
    77
		s = &sc
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    78
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    79
	return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    80
}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    81
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    82
func GetInstanceList() (list []string) {
56
e25d0d0dc8ed Repeat after me, filepath.Join uses "," to separate args, not "+"
Ollivier Robert <roberto@keltia.net>
parents: 51
diff changeset
    83
	list, err := filepath.Glob(filepath.Join(baseDir, "*.token"))
e25d0d0dc8ed Repeat after me, filepath.Join uses "," to separate args, not "+"
Ollivier Robert <roberto@keltia.net>
parents: 51
diff changeset
    84
	log.Printf("basedir=%s", filepath.Join(baseDir, "*.token"))
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    85
	if err != nil {
59
dd2e302b56d9 Display location.
Ollivier Robert <roberto@keltia.net>
parents: 56
diff changeset
    86
		log.Printf("warning, no *.token files in %s", baseDir)
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    87
		list = nil
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    88
	}
56
e25d0d0dc8ed Repeat after me, filepath.Join uses "," to separate args, not "+"
Ollivier Robert <roberto@keltia.net>
parents: 51
diff changeset
    89
	log.Printf("list=%v", list)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    90
	return
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    91
}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    92
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    93
// LoadConfig reads a file as a TOML document and return the structure
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    94
func LoadConfig(name string) (s *Server, err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    95
	// Load global file
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    96
	gFile := filepath.Join(baseDir, DefaultName)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    97
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    98
	log.Printf("global is %s", gFile)
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    99
	c, err := loadGlobal(gFile)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   100
	if err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   101
		return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   102
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   103
	if name == "" {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   104
		s, err = loadInstance(c.Default)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   105
	} else {
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   106
		s, err = loadInstance(name)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   107
	}
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   108
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   109
	return s, err
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   110
}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   111
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   112
func (c *Config) Write() (err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   113
	if err = os.MkdirAll(baseDir, 0700); err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   114
		log.Fatalf("error creating configuration directory: %s", baseDir)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   115
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   116
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   117
	var sc []byte
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   118
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
   119
	if sc, err = toml.Marshal(*c); err != nil {
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   120
		log.Fatalf("error saving configuration")
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   121
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   122
	err = ioutil.WriteFile(filepath.Join(baseDir, DefaultName), sc, 0600)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   123
	return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   124
}
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   125
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   126
func (s *Server) WriteToken(instance string) (err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   127
	if err = os.MkdirAll(baseDir, 0700); err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   128
		log.Fatalf("error creating configuration directory: %s", baseDir)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   129
	}
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   130
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   131
	var sc []byte
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   132
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   133
	if sc, err = toml.Marshal(s); err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   134
		log.Fatalf("error saving configuration")
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   135
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   136
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   137
	full := instance + ".token"
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   138
	err = ioutil.WriteFile(filepath.Join(baseDir, full), sc, 0600)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   139
	return
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   140
}