config.go
author Ollivier Robert <roberto@keltia.net>
Tue, 11 Apr 2017 17:04:40 +0200
changeset 67 1ff7afce37fe
parent 66 965586c1e3ed
child 68 6252b7eea308
permissions -rw-r--r--
Add a baseURL parameter to NewApp(). This allow for overriding the URL of the instance you are going to talk to during the first call to NewApp(). We have a chicken-and-egg issue otherwise. We need to register before doing anything.
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
8
6d89be3dd966 Placeholders.
Ollivier Robert <roberto@keltia.net>
parents:
diff changeset
     6
package gondole
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
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    34
// Config holds our parameters
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    35
type Server struct {
66
965586c1e3ed Change all ID into string, I guess this was to avoir overflow.
Ollivier Robert <roberto@keltia.net>
parents: 59
diff changeset
    36
	ID          string
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    37
	Name        string
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    38
	BearerToken string
67
1ff7afce37fe Add a baseURL parameter to NewApp().
Ollivier Robert <roberto@keltia.net>
parents: 66
diff changeset
    39
	BaseURL     string		// This allow for overriding the APIEndpoint on registration
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    40
}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    41
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    42
type Config struct {
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    43
	Default string
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    44
}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    45
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    46
func loadGlobal(file string) (c *Config, err error) {
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    47
	log.Printf("file=%s", file)
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    48
	// Check if there is any config file
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    49
	_, err = os.Stat(file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    50
	if err != nil {
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    51
		return
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    52
	}
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    53
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    54
	log.Printf("file=%s, found it", file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    55
	// Read it
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    56
	buf, err := ioutil.ReadFile(file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    57
	if err != nil {
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    58
		return c, fmt.Errorf("Can not read %s", file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    59
	}
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    60
44
f676c2646270 Actually allocate storage before Unmarshall().
Ollivier Robert <roberto@keltia.net>
parents: 42
diff changeset
    61
	cnf := Config{}
f676c2646270 Actually allocate storage before Unmarshall().
Ollivier Robert <roberto@keltia.net>
parents: 42
diff changeset
    62
	err = toml.Unmarshal(buf, &cnf)
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    63
	if err != nil {
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    64
		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
    65
	}
44
f676c2646270 Actually allocate storage before Unmarshall().
Ollivier Robert <roberto@keltia.net>
parents: 42
diff changeset
    66
	c = &cnf
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    67
	return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    68
}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    69
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    70
func loadInstance(name string) (s *Server, err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    71
	// Load instance-specific file
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    72
	file := filepath.Join(baseDir, name+".token")
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    73
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    74
	log.Printf("instance is %s", file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    75
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    76
	// Check if there is any config file
49
b48dafc1fd4f Unshadow variable, fix test.
Ollivier Robert <roberto@keltia.net>
parents: 44
diff changeset
    77
	if _, err = os.Stat(file); err == nil {
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    78
		// Read it
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    79
		buf, err := ioutil.ReadFile(file)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    80
		if err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    81
			return s, fmt.Errorf("Can not read %s", file)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    82
		}
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    83
51
4a0533d00053 Allocate stuff the same way everywhere.
Ollivier Robert <roberto@keltia.net>
parents: 50
diff changeset
    84
		sc := Server{}
50
80a09cf62225 Again, fix allocation.
Ollivier Robert <roberto@keltia.net>
parents: 49
diff changeset
    85
		err = toml.Unmarshal(buf, &sc)
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    86
		if err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    87
			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
    88
		}
50
80a09cf62225 Again, fix allocation.
Ollivier Robert <roberto@keltia.net>
parents: 49
diff changeset
    89
		s = &sc
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    90
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    91
	return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    92
}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    93
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    94
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
    95
	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
    96
	log.Printf("basedir=%s", filepath.Join(baseDir, "*.token"))
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    97
	if err != nil {
59
dd2e302b56d9 Display location.
Ollivier Robert <roberto@keltia.net>
parents: 56
diff changeset
    98
		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
    99
		list = nil
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   100
	}
56
e25d0d0dc8ed Repeat after me, filepath.Join uses "," to separate args, not "+"
Ollivier Robert <roberto@keltia.net>
parents: 51
diff changeset
   101
	log.Printf("list=%v", list)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   102
	return
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   103
}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   104
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   105
// 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
   106
func LoadConfig(name string) (s *Server, err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   107
	// Load global file
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   108
	gFile := filepath.Join(baseDir, DefaultName)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   109
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
   110
	log.Printf("global is %s", gFile)
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   111
	c, err := loadGlobal(gFile)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   112
	if err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   113
		return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   114
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   115
	if name == "" {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   116
		s, err = loadInstance(c.Default)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   117
	} else {
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   118
		s, err = loadInstance(name)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   119
	}
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   120
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   121
	return s, err
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   122
}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   123
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   124
func (c *Config) Write() (err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   125
	if err = os.MkdirAll(baseDir, 0700); err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   126
		log.Fatalf("error creating configuration directory: %s", baseDir)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   127
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   128
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   129
	var sc []byte
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   130
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
   131
	if sc, err = toml.Marshal(*c); err != nil {
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   132
		log.Fatalf("error saving configuration")
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   133
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   134
	err = ioutil.WriteFile(filepath.Join(baseDir, DefaultName), sc, 0600)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   135
	return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   136
}
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   137
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   138
func (s *Server) WriteToken(instance string) (err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   139
	if err = os.MkdirAll(baseDir, 0700); err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   140
		log.Fatalf("error creating configuration directory: %s", baseDir)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   141
	}
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   142
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   143
	var sc []byte
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   144
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   145
	if sc, err = toml.Marshal(s); err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   146
		log.Fatalf("error saving configuration")
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   147
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   148
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   149
	full := instance + ".token"
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   150
	err = ioutil.WriteFile(filepath.Join(baseDir, full), sc, 0600)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   151
	return
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   152
}