-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtxt_delete.go
92 lines (78 loc) · 2.73 KB
/
txt_delete.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
package main
import (
"strings"
. "github.com/dirtman/sitepkg"
)
// Implement the "delete" command.
func deleteTXT(invokedAs []string) error {
var fields []string
var input *UserInput
var states StatesTXT = make(StatesTXT)
var record *RecordTXT
var err error
var duo, multiple bool
SetStringOpt("view", "V", true, "default", "Specify the view to which the record belongs")
SetStringOpt("filename", "f", true, "", "Specify an input file")
SetBoolOpt("multiple", "", true, false, "Allow multiple records to be deleted")
if input, err = subCommandInit(invokedAs[1], invokedAs[2], duo); err != nil {
return Error("failure initializing program and getting user input: %v", err)
}
if err = getStates(states, input.ndList, input.fields, nil, false, false); err != nil {
return Error("failure getting states: %v", err)
}
if multiple, err = GetBoolOpt("multiple"); err != nil {
return Error("failure getting multiple option: %v", err)
}
// First check if any errors occurred getting the host records. If so, abort.
if errors := checkStateErrors(states, duo, true); len(errors) != 0 {
return Error("Aborting process; no records deleted.")
}
// 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
name, _, _ := splitND(nameData)
request := name + nameDataSep + input.txtData[nameData]
request = strings.TrimLeft(request, nameDataSep)
request = strings.TrimRight(request, nameDataSep)
if len(records) == 0 {
Print("%-*s NOTFOUND\n", space, "TXT("+request+")")
numNotFound++
continue
}
for _, record = range records {
ref := record.Ref
_, err := deleteRecord(record.Ref, fields)
if err != nil {
Print("%-*s FAILED to delete: %v\n", space, "TXT("+request+")", err)
numFailed++
} else if ref != record.Ref {
Print("%-*s FAILED to delete: ref mismatch\n", space, "TXT("+request+")")
numFailed++
} else {
Print("%-*s Deleted %s %s\n", space, "TXT("+request+")",
record.Name, record.Text)
}
}
}
if numFailed != 0 {
return Error("One or more deletes 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
}