config.go
author Ollivier Robert <roberto@keltia.net>
Mon, 10 Apr 2017 19:57:45 +0200
changeset 46 d25fab59ded9
parent 44 f676c2646270
child 49 b48dafc1fd4f
permissions -rw-r--r--
Add files to test with.
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 {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    36
	ID          int64
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
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    39
}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    40
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    41
type Config struct {
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    42
	Default string
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    43
}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    44
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    45
func loadGlobal(file string) (c *Config, err error) {
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    46
	log.Printf("file=%s", file)
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    47
	// Check if there is any config file
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    48
	_, err = os.Stat(file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    49
	if err != nil {
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    50
		return
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    51
	}
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    52
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    53
	log.Printf("file=%s, found it", file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    54
	// Read it
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    55
	buf, err := ioutil.ReadFile(file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    56
	if err != nil {
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    57
		return c, fmt.Errorf("Can not read %s", file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    58
	}
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    59
44
f676c2646270 Actually allocate storage before Unmarshall().
Ollivier Robert <roberto@keltia.net>
parents: 42
diff changeset
    60
	cnf := Config{}
f676c2646270 Actually allocate storage before Unmarshall().
Ollivier Robert <roberto@keltia.net>
parents: 42
diff changeset
    61
	err = toml.Unmarshal(buf, &cnf)
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    62
	if err != nil {
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    63
		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
    64
	}
44
f676c2646270 Actually allocate storage before Unmarshall().
Ollivier Robert <roberto@keltia.net>
parents: 42
diff changeset
    65
	c = &cnf
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    66
	return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    67
}
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
func loadInstance(name string) (s *Server, err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    70
	// Load instance-specific file
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    71
	file := filepath.Join(baseDir, name+".token")
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    72
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    73
	log.Printf("instance is %s", file)
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
    74
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    75
	// Check if there is any config file
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    76
	if _, err := os.Stat(file); err == nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    77
		// Read it
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    78
		buf, err := ioutil.ReadFile(file)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    79
		if err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    80
			return s, fmt.Errorf("Can not read %s", file)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    81
		}
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    82
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    83
		err = toml.Unmarshal(buf, s)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    84
		if err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    85
			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
    86
		}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    87
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    88
	return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    89
}
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
func GetInstanceList() (list []string) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    92
	list, err := filepath.Glob(filepath.Join(baseDir + "*.token"))
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    93
	if err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    94
		log.Printf("warning, no *.token files")
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
    95
		list = nil
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    96
	}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    97
	return
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    98
}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
    99
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   100
// 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
   101
func LoadConfig(name string) (s *Server, err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   102
	// Load global file
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   103
	gFile := filepath.Join(baseDir, DefaultName)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   104
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
   105
	log.Printf("global is %s", gFile)
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   106
	c, err := loadGlobal(gFile)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   107
	if err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   108
		return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   109
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   110
	if name == "" {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   111
		s, err = loadInstance(c.Default)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   112
	} else {
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   113
		s, err = loadInstance(name)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   114
	}
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   115
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   116
	return s, err
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   117
}
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   118
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   119
func (c *Config) Write() (err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   120
	if err = os.MkdirAll(baseDir, 0700); err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   121
		log.Fatalf("error creating configuration directory: %s", baseDir)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   122
	}
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   123
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   124
	var sc []byte
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   125
42
2bebcae94ce1 Add a few checks & logging.
Ollivier Robert <roberto@keltia.net>
parents: 36
diff changeset
   126
	if sc, err = toml.Marshal(*c); err != nil {
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   127
		log.Fatalf("error saving configuration")
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
	err = ioutil.WriteFile(filepath.Join(baseDir, DefaultName), sc, 0600)
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   130
	return
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   131
}
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   132
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   133
func (s *Server) WriteToken(instance string) (err error) {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   134
	if err = os.MkdirAll(baseDir, 0700); err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   135
		log.Fatalf("error creating configuration directory: %s", baseDir)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   136
	}
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   137
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   138
	var sc []byte
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   139
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   140
	if sc, err = toml.Marshal(s); err != nil {
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   141
		log.Fatalf("error saving configuration")
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
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   144
	full := instance + ".token"
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   145
	err = ioutil.WriteFile(filepath.Join(baseDir, full), sc, 0600)
23
512f1bfaed0c Start a config module.
Ollivier Robert <roberto@keltia.net>
parents: 21
diff changeset
   146
	return
36
b3c341207b30 Properly load/write configuration files.
Ollivier Robert <roberto@keltia.net>
parents: 23
diff changeset
   147
}