forked from ahmetozer/iptables-ddns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconfig.go
99 lines (81 loc) · 2.3 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
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"strings"
cap "kernel.org/pub/linux/libs/security/libcap/cap"
)
type Defaults struct {
Qtype string `json:"type"`
Ns string `json:"ns"`
Interval int `json:"interval"`
}
type configStruct struct {
Defaults `json:"defaults"`
Domains Domains `json:"domains"`
}
func LoadConfig() (configStruct, error) {
defaultConf := configStruct{
Defaults: Defaults{
Qtype: "ip",
Ns: "1.1.1.1",
Interval: 300,
},
}
configFileData, err := ioutil.ReadFile(configFile)
if err != nil {
return defaultConf, fmt.Errorf(fmt.Sprintf("Err while reading the config.json file: %s", err))
}
err = json.Unmarshal([]byte(configFileData), &defaultConf)
if err != nil {
return defaultConf, fmt.Errorf(fmt.Sprintf("Err while parsing the config: %s", err))
}
if err = defaultConf.CheckDefaults(); err != nil {
return defaultConf, err
}
return defaultConf, nil
}
func (obj configStruct) GetDefaults() []string {
return []string{obj.Defaults.Qtype, obj.Defaults.Ns, fmt.Sprint(obj.Defaults.Interval)}
}
func (obj configStruct) PrintDefaults() string {
defaults := obj.GetDefaults()
return fmt.Sprintf("Defaults\ttype:%s \tns:%s\tinterval:%v\n", defaults[0], defaults[1], defaults[2])
}
func (obj configStruct) DuplicatedHostsCheck() []string {
host_count := make(map[string]int)
var duplicatedHosts []string
for i := range obj.Domains {
host_count[obj.Domains[i].Name]++
if host_count[obj.Domains[i].Name] == 2 {
duplicatedHosts = append(duplicatedHosts, obj.Domains[i].Name)
}
}
return duplicatedHosts
}
func (obj configStruct) CheckDefaults() error {
var errors []string
if !(obj.Defaults.Qtype == "ip" || obj.Defaults.Qtype == "ip6") {
errors = append(errors, "Type is not IP or IPv6: "+obj.Qtype)
}
if obj.Defaults.Interval < 300 {
errors = append(errors, "Interval is too low: "+fmt.Sprint(obj.Interval))
}
if !(IsIPv4(obj.Defaults.Ns) || IsIPv6(obj.Defaults.Ns)) {
errors = append(errors, "Name server is not valid IP address: "+obj.Ns)
}
if errors != nil {
return fmt.Errorf(fmt.Sprintf("Defaults has a error: %s", errors))
}
return nil
}
func checkCap(capName string) bool {
s := strings.Split(fmt.Sprintf("%s", cap.GetProc()), ",")
for i := range s {
if s[i] == capName {
return true
}
}
return false
}