-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmx_update.go
113 lines (98 loc) · 4.08 KB
/
mx_update.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
package main
import (
"strings"
. "github.com/dirtman/sitepkg"
)
// Implement the "update" command.
func upateMX(invokedAs []string) error {
var input *UserInput
var name, mx, preference, currentPref, message string
var err error
var duo, multiple bool
SetStringOpt("view", "V", true, "default", "Specify the view of the record to update")
SetStringOpt("name", "n", false, "", "Update the record's name")
SetStringOpt("comment", "c", true, "", "Update the record's comment")
SetStringOpt("disable", "D", true, "", "Disable the specified record")
SetStringOpt("mx", "m", false, "", "Update the record's mail exchanger (MX)")
SetStringOpt("preference", "p", false, "", "Update the record's preference value")
SetStringOpt("currentPref", "P", false, "", "Specify the preference of the record to update")
SetStringOpt("fields", "F", false, "", "Additional fields to be updated")
SetStringOpt("filename", "f", true, "", "Specify a name/data input file")
SetBoolOpt("multiple", "", true, false, "Allow multiple records to be updated")
if input, err = subCommandInit(invokedAs[1], invokedAs[2], duo); err != nil {
return Error("failure initializing program and getting user input: %v", err)
} else if mx, err = GetStringOpt("mx"); err != nil {
return Error("failure getting MX option: %v", err)
} else if preference, err = GetStringOpt("preference"); err != nil {
return Error("failure getting preference option: %v", err)
} else if currentPref, err = GetStringOpt("currentPref"); err != nil {
return Error("failure getting currentPref option: %v", err)
} else if name, err = GetStringOpt("name"); err != nil {
return Error("failure getting name option: %v", err)
} else if multiple, err = GetBoolOpt("multiple"); err != nil {
return Error("failure getting multiple option: %v", err)
}
if name != "" { // Append it to the list of field/values to be updated.
input.fields = append(input.fields, "name="+name)
}
if mx != "" { // Append it to the list of field/values to be updated.
input.fields = append(input.fields, "mail_exchanger="+mx)
}
if preference != "" { // Append it to the list of field/values to be updated.
input.fields = append(input.fields, "preference="+preference)
}
// Query the record being updated, and check for errors.
states := make(StatesMX)
f := []string{"view=" + input.view}
if currentPref != "" {
f = append(f, "preference="+currentPref)
}
if err = getStates(states, input.ndList, f, nil, false, false); err != nil {
return Error("failure getting states: %v", err)
} else if errors := checkStateErrors(states, duo, true); len(errors) != 0 {
return Error("Aborting process; no records updated.")
}
// Unless the --multiple option was specified, let's verify that only
// a single record was found per input request.
if ! multiple {
for _, nameData := range input.ndList {
if len(states[nameData].records) > 1 {
return Error("Multiple records found for \"%s\"; see the --multiple option", nameData)
}
}
}
// Loop through the user provided input (name/data) list.
space := input.maxNameLength + 8
var numNotFound, numFailed uint
for _, nameData := range input.ndList {
records := states[nameData].records
request := strings.TrimLeft(nameData, nameDataSep)
request = strings.TrimRight(request, nameDataSep)
if len(records) == 0 {
Print("%-*s NOTFOUND\n", space, "MX("+request+")")
numNotFound++
continue
}
for _, record := range records {
_, err = updateRecord(record.Ref, input.fields)
message = "(fields: " + strings.Join(input.fields, ",") + ")"
if err != nil {
Print("%-*s FAILED to update: %v\n", space, "MX("+request+")", err)
numFailed++
continue
} else {
Print("%-*s Updated %s\n", space, "MX("+request+")", message)
}
}
}
if numFailed != 0 {
return Error("One or more updates failed")
} else if numNotFound != 0 {
return Error("One or more records not found")
} else if input.restartServices {
if err := gridRestartServices(Verbose); err != nil {
return Error("failure restarting services: %s", err)
}
}
return nil
}