-
Notifications
You must be signed in to change notification settings - Fork 0
/
mx_add.go
99 lines (81 loc) · 3.09 KB
/
mx_add.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 (
"strconv"
"strings"
. "github.com/dirtman/sitepkg"
)
// Implement the "add" command.
func addMX(invokedAs []string) error {
var input *UserInput
var states = make(StatesMX)
var err error
duo := true
invokedString := strings.Join(invokedAs, ":")
var preference string
SetStringOpt("view", "V", true, "default", "Specify the the view for the record")
SetStringOpt("preference", "p", true, "10", "Specify the preference value.")
SetStringOpt("comment", "c", true, invokedString, "Specify the comment for the record")
SetBoolOpt("disable", "D", true, false, "Disable the new record")
SetUintOpt("ttl", "", true, 0, "Specify the TTL for the record")
SetStringOpt("fields", "F", true, "", "Specify additional fields for the record")
SetStringOpt("filename", "f", true, "", "Specify a name/data input file")
if input, err = subCommandInit(invokedAs[1], invokedAs[2], duo); err != nil {
return Error("failure initializing program and getting user input: %v", err)
} else if preference, err = GetStringOpt("preference"); err != nil {
return Error("failure getting preference option: %v", err)
} else if _, err = strconv.Atoi(preference); err != nil {
return Error("preference value must be a positive integer")
}
// Append preference to the list of field/values
input.fields = append(input.fields, "preference="+preference)
// Check if any of the requested records already exist or conflict with existing
// records in our view.
ndList := input.ndList
f := []string{"view=" + input.view}
f = append(f, "preference="+preference)
if err = getStates(states, ndList, f, nil, true, true); err != nil {
return Error("failure getting states: %v", err)
}
// Check if any errors occurred getting the above records. If so, abort.
if errors := checkStateErrors(states, false, true); len(errors) != 0 {
return Error("Aborting process; no records added.")
}
// Loop through the user provided input (name/data) list.
space := input.maxNameLength + 8
nKey, dKey := states.GetNDKeys()
object := states.GetObjectType()
var numConflicts uint
for nameData, state := range states {
var name, data, conflict string
name, data, _ = splitND(nameData)
sep := "Conflicts found: "
if len(states[nameData].records) != 0 {
if state.records[0].Fqdn == name && state.records[0].MX == data {
conflict += sep + "MX record with same name and Mail Exchanger"
}
sep = ", "
}
if conflict != "" {
Print("%-*s NOT added: %s\n", space, "MX("+nameData+")", conflict)
numConflicts++
continue
}
if _, err := addRecord(object, nKey, dKey, name, data, input.fields); err != nil {
return Error("aborting! failure adding MX record %s: %v", nameData, err)
} else {
Print("%-*s: Added\n", space, "MX("+nameData+"/"+preference+")")
}
}
if numConflicts > 0 {
if len(states) > 1 {
return Error("One or more records not added due to conflict.")
} else {
return Error("Record not added due to conflict.")
}
} else if input.restartServices {
if err = gridRestartServices(Verbose); err != nil {
return Error("failure restarting services: %s", err)
}
}
return nil
}