This repository has been archived by the owner on Mar 6, 2023. It is now read-only.
/
config.go
123 lines (98 loc) · 4.42 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* Copyright © 2020 Camilo Hernández <me@camiloh.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package beekeeper
import (
"github.com/spf13/viper"
"time"
)
const (
// DefaultPort is the default port for Beekeeper servers
DefaultPort = 2020
// DefaultScanTime is the scan time to be used by scan functions
DefaultScanTime = time.Second * 2
)
// WatchdogSleep is the time between node pings for the watchdog
var WatchdogSleep = time.Second * 15
// Config holds the configurations for a node or a primary node.
type Config struct {
// Name of the node. It defaults to the system's hostname.
Name string `mapstructure:"name,omitempty"`
// Debug toggles between verbosity for debugging.
Debug bool `mapstructure:"debug,omitempty"`
// Token is a passphrase used to restrict usage of the node. Must match on the receiving node.
Token string `mapstructure:"token,omitempty"`
// InboundPort is the port to be used for receiving connections. Defaults to 2020.
InboundPort int `mapstructure:"inbound_port,omitempty"`
// OutboundPort is the port assumed to be used by a remote node. It's only used to establish a connection, and
// afterwards a port is negotiated with the remote node. Defaults to 2020.
OutboundPort int `mapstructure:"outbound_port,omitempty"`
// TLSCertificate is used for TLS connections between nodes. If none is given a certificate is created on the first
// run and reused as needed.
TLSCertificate []byte
// TLSPrivateKey is used for TLS connections between nodes. If none is given a key is created on the first
// run and reused as needed.
TLSPrivateKey []byte
// AllowExternal sets whether non-local connections should be accepted. It's heavily encouraged that a whitelist
// and token is set with this featured turn on. Defaults to false.
AllowExternal bool `mapstructure:"allow_external,omitempty"`
// Whitelist contains a list of allowed hosts. If none is provided it's understood that the whitelist is disabled.
// A wildcard sign (*) can be used.
Whitelist []string `mapstructure:"whitelist,omitempty"`
// MaxMessageSize is the size limit in bytes for incoming messages. It defaults to 1.024 MB
MaxMessageSize uint64 `mapstructure:"max_message_size,omitempty"`
// DisableCleanup turns off the post-build cleanup
DisableCleanup bool `mapstructure:"disable_cleanup,omitempty"`
// DisableConnectionWatchdog disables the connection watchdog, and stops disconnection notifications.
DisableConnectionWatchdog bool `mapstructure:"disable_connection_watchdog,omitempty"`
}
// NewDefaultConfig returns a new Config with sensible defaults. It's recommended that NewDefaultConfig be used.
// for the creation of Config structs.
func NewDefaultConfig() (c Config) {
name, err := getHostname()
if err != nil {
logger.Errorln("Unable to fetch hostname:", err.Error())
} else {
c.Name = name
}
c.InboundPort = DefaultPort
c.OutboundPort = DefaultPort
c.DisableCleanup = false
c.AllowExternal = false
c.MaxMessageSize = (1 << 20) * 1000 // 1.048 MB
return c
}
// NewConfigFromFile parses a file on the provided path as a Config object. If a field is not set, the default value
// is assigned.
func NewConfigFromFile(path string) (c Config, err error) {
if path != "" {
viper.SetConfigFile(path)
}
if err := viper.ReadInConfig(); err != nil {
return Config{}, err
}
config := NewDefaultConfig()
err = viper.Unmarshal(&config)
if err != nil {
return Config{}, err
}
return config, err
}