-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsettings.go
214 lines (182 loc) · 5.59 KB
/
settings.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
package main
import (
"flag"
"fmt"
"os"
"strconv"
"strings"
utilities "github.com/stefannilsson/solaredgedc/common"
)
const (
DEFAULT_MQTT_QOS = 1
DEFAULT_POLL_INTERVAL = 15000
DEFAULT_MODBUS_PORT = 502
)
const (
LOG_LEVEL_ERROR = iota
LOG_LEVEL_WARNING
LOG_LEVEL_INFO
LOG_LEVEL_DEBUG
)
type LogFlags struct {
logLevel int
}
type ModbusFlags struct {
hostname string // hostname and/or IP address to Modbus server.
port int // default to : '502'
slaveId int // normally '1' in case of
pollInterval int64 // number of 'ms' between polls
}
type MqttFlags struct {
uri string // e.g. 'tcp://127.0.0.1:1883'
clientId string
username string
password string
qos int
topic string
}
/*
Parse application arguments/flags, and read optional ENVironment variables.
App flags override ENVironment variables, which in turns overrides the default settings.
*/
func ParseArgumentsConfig() (*LogFlags, *ModbusFlags, *MqttFlags) {
// init long-living app config variables w/ default settings.
logging := LogFlags{logLevel: LOG_LEVEL_INFO}
modbus := ModbusFlags{port: DEFAULT_MODBUS_PORT}
mqtt := MqttFlags{}
// Modbus config parsing
envModbusHostname := os.Getenv("MODBUS_HOSTNAME")
flagModbusHostname := flag.String("modbus_hostname", "", "Modbus TCP hostname/IP address")
envModbusPort := os.Getenv("MODBUS_PORT")
flagModbusPort := flag.Int("modbus_port", 0, "Modbus TCP port")
envModbusSlaveId := os.Getenv("MODBUS_SLAVEID")
flagModbusSlaveId := flag.Int("modbus_slaveid", 0, "Modbus TCP SlaveID")
envModbusPollInterval := os.Getenv("MODBUS_POLLINTERVAL")
flagModbusPollInterval := flag.Int64("modbus_pollinterval", -1, "Modbus Poll interval (number of 'ms' between registers polls)")
// MQTT config parsing
envMqttUri := os.Getenv("MQTT_URI")
flagMqttUri := flag.String("mqtt_uri", "", "The broker URI. ex: tcp://10.10.1.1:1883")
envMqttClientId := os.Getenv("MQTT_CLIENTID")
flagMqttClientId := flag.String("mqtt_clientid", "", "The ClientID (optional)")
envMqttUsername := os.Getenv("MQTT_USERNAME")
flagMqttUsername := flag.String("mqtt_username", "", "The User (optional)")
envMqttPassword := os.Getenv("MQTT_PASSWORD")
flagMqttPassword := flag.String("mqtt_password", "", "The password")
envMqttQos := os.Getenv("MQTT_QOS")
flagMqttQos := flag.Int("mqtt_qos", -1, "The Quality of Service {0,1,2} (default 1)")
envMqttTopic := os.Getenv("MQTT_TOPIC")
flagMqttTopic := flag.String("mqtt_topic", "", "The topic name to/from which to publish/subscribe")
// Log config parsing
envLogLevel := os.Getenv("LOG_LEVEL") // {DEBUG, INFO, WARNING, ERROR}
flagLog := flag.String("log_level", "", "Log level - {DEBUG, INFO, WARNING, ERROR}")
flag.Parse()
// Modbus :: Hostname selection
if *flagModbusHostname != "" {
modbus.hostname = *flagModbusHostname
} else if envModbusHostname != "" {
modbus.hostname = envModbusHostname
} else {
panic("No Modbus TCP hostname provided.")
}
// Modbus :: Port selection
if *flagModbusPort != 0 {
modbus.port = *flagModbusPort
} else if envModbusPort != "" {
modbus.port, _ = strconv.Atoi(envModbusPort)
}
// Modbus :: Slave id selection
if *flagModbusSlaveId != 0 {
modbus.slaveId = *flagModbusSlaveId
} else if envModbusSlaveId != "" {
modbus.slaveId, _ = strconv.Atoi(envModbusSlaveId)
}
// Modbus :: Slave id selection
if *flagModbusPollInterval != -1 {
modbus.pollInterval = *flagModbusPollInterval
} else if envModbusPollInterval != "" {
envModbusPollIntervalInt64, _ := strconv.Atoi(envModbusPollInterval)
modbus.pollInterval = int64(envModbusPollIntervalInt64)
} else {
modbus.pollInterval = DEFAULT_POLL_INTERVAL // default is to poll every 15 second.
}
// Log level selection
switch strings.ToUpper(*flagLog) {
case "DEBUG":
logging.logLevel = LOG_LEVEL_DEBUG
case "INFO":
logging.logLevel = LOG_LEVEL_INFO
case "WARNING":
logging.logLevel = LOG_LEVEL_WARNING
case "ERROR":
logging.logLevel = LOG_LEVEL_ERROR
default:
switch envLogLevel {
case "DEBUG":
logging.logLevel = LOG_LEVEL_DEBUG
case "INFO":
logging.logLevel = LOG_LEVEL_INFO
case "WARNING":
logging.logLevel = LOG_LEVEL_WARNING
case "ERROR":
logging.logLevel = LOG_LEVEL_ERROR
default:
logging.logLevel = LOG_LEVEL_WARNING
}
}
// MQTT :: URI select
if *flagMqttUri != "" {
mqtt.uri = *flagMqttUri
} else if envMqttUri != "" {
mqtt.uri = envMqttUri
} else {
panic("No MQTT hostname provided.")
}
// MQTT :: ClientId select
if *flagMqttClientId != "" {
mqtt.clientId = *flagMqttClientId
} else if envMqttClientId != "" {
mqtt.clientId = envMqttClientId
} else {
mqtt.clientId = fmt.Sprintf("auto-%s", utilities.RandomString(12)) // Default to random /[a-z0-9]{12}/
}
// MQTT :: Username select.
if *flagMqttUsername != "" {
mqtt.username = *flagMqttUsername
} else if envMqttUsername != "" {
mqtt.username = envMqttUsername
}
// MQTT :: Password select
if *flagMqttPassword != "" {
mqtt.password = *flagMqttPassword
} else if envMqttPassword != "" {
mqtt.password = envMqttPassword
}
// MQTT :: QoS select
if *flagMqttQos != -1 {
switch *flagMqttQos {
case 0, 1, 2:
mqtt.qos = *flagMqttQos
default:
panic("Unknown QoS specified.")
}
} else if envMqttQos != "" {
qos, _ := strconv.Atoi(envMqttQos)
switch qos {
case 0, 1, 2:
mqtt.qos = qos
default:
panic("Unknown QoS specified.")
}
} else {
mqtt.qos = DEFAULT_MQTT_QOS
}
// MQTT :: Topic select
if *flagMqttTopic != "" {
mqtt.topic = *flagMqttTopic
} else if envMqttTopic != "" {
mqtt.topic = envMqttTopic
} else {
panic("No MQTT topic provided.")
}
return &logging, &modbus, &mqtt
}