Skip to content

Commit 8421e6d

Browse files
committed
Add whitespace checks to audit analyze
Whitespace in a leafnode server name, JetStream domain, etc. could cause issues. As discussed in nats-io/nats-server#5676. Signed-off-by: reubenninan <reuben@nats.io>
1 parent 0a248c4 commit 8421e6d

File tree

3 files changed

+106
-2
lines changed

3 files changed

+106
-2
lines changed

internal/audit/checks.go

+15
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,21 @@ func GetDefaultChecks() []Check {
156156
Description: "Verify that all nodes part of the meta group agree on the meta cluster leader",
157157
fun: checkMetaClusterLeader,
158158
},
159+
{
160+
Name: "Whitespace in leafnode server names",
161+
Description: "Verify that no leafnode contains whitespace in its name",
162+
fun: checkLeafnodeServerNamesForWhitespace,
163+
},
164+
{
165+
Name: "Whitespace in JetStream domains",
166+
Description: "Verify that no JetStream server is configured with whitespace in its domain",
167+
fun: checkJetStreamDomainsForWhitespace,
168+
},
169+
{
170+
Name: "Whitespace in cluster name",
171+
Description: "Verify that no cluster name contains whitespace",
172+
fun: checkClusterNamesForWhitespace,
173+
},
159174
}
160175
}
161176

internal/audit/cluster_checks.go

+59-2
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@ package audit
1616
import (
1717
"errors"
1818
"fmt"
19+
"reflect"
20+
"sort"
21+
"strings"
22+
1923
"github.com/dustin/go-humanize"
2024
"github.com/nats-io/nats-server/v2/server"
2125
"github.com/nats-io/natscli/internal/archive"
22-
"reflect"
23-
"sort"
26+
"golang.org/x/exp/maps"
2427
)
2528

2629
// checkClusterMemoryUsageOutliers creates a parametrized check to verify the memory usage of any given node in a
@@ -214,3 +217,57 @@ func makeCheckClusterHighHAAssets(haAssetsThreshold int) checkFunc {
214217
return Pass, nil
215218
}
216219
}
220+
221+
func checkClusterNamesForWhitespace(reader *archive.Reader, examples *ExamplesCollection) (Outcome, error) {
222+
223+
for _, clusterName := range reader.GetClusterNames() {
224+
if strings.Contains(clusterName, " ") {
225+
examples.add("Cluster: %s", clusterName)
226+
}
227+
}
228+
229+
if examples.Count() > 0 {
230+
logCritical("Found %d clusters with names containing whitespace", examples.Count())
231+
return Fail, nil
232+
}
233+
234+
return Pass, nil
235+
}
236+
237+
func checkLeafnodeServerNamesForWhitespace(r *archive.Reader, examples *ExamplesCollection) (Outcome, error) {
238+
239+
for _, clusterName := range r.GetClusterNames() {
240+
clusterTag := archive.TagCluster(clusterName)
241+
242+
leafnodesWithWhitespace := map[string]struct{}{}
243+
244+
for _, serverName := range r.GetClusterServerNames(clusterName) {
245+
serverTag := archive.TagServer(serverName)
246+
247+
var serverLeafz server.Leafz
248+
err := r.Load(&serverLeafz, clusterTag, serverTag, archive.TagServerLeafs())
249+
if err != nil {
250+
logWarning("Artifact 'LEAFZ' is missing for server %s", serverName)
251+
continue
252+
}
253+
254+
for _, leaf := range serverLeafz.Leafs {
255+
// check if leafnode name contains whitespace
256+
if strings.Contains(leaf.Name, " ") {
257+
leafnodesWithWhitespace[leaf.Name] = struct{}{}
258+
}
259+
}
260+
}
261+
262+
if len(leafnodesWithWhitespace) > 0 {
263+
examples.add("Cluster %s: %v", clusterName, maps.Keys(leafnodesWithWhitespace))
264+
}
265+
}
266+
267+
if examples.Count() > 0 {
268+
logCritical("Found %d clusters with leafnode names containing whitespace", examples.Count())
269+
return Fail, nil
270+
}
271+
272+
return Pass, nil
273+
}

internal/audit/server_checks.go

+32
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ package audit
1616
import (
1717
"errors"
1818
"fmt"
19+
"strings"
20+
1921
"github.com/dustin/go-humanize"
2022
"github.com/nats-io/nats-server/v2/server"
2123
"github.com/nats-io/natscli/internal/archive"
@@ -230,3 +232,33 @@ func makeCheckServerResourceLimits(memoryUsageThreshold, storeUsageThreshold flo
230232
return Pass, nil
231233
}
232234
}
235+
236+
func checkJetStreamDomainsForWhitespace(r *archive.Reader, examples *ExamplesCollection) (Outcome, error) {
237+
238+
for _, clusterName := range r.GetClusterNames() {
239+
clusterTag := archive.TagCluster(clusterName)
240+
241+
for _, serverName := range r.GetClusterServerNames(clusterName) {
242+
serverTag := archive.TagServer(serverName)
243+
244+
var serverJsz server.JSInfo
245+
err := r.Load(&serverJsz, clusterTag, serverTag, archive.TagServerJetStream())
246+
if err != nil {
247+
logWarning("Artifact 'JSZ' is missing for server %s", serverName)
248+
continue
249+
}
250+
251+
// check if jetstream domain contains whitespace
252+
if strings.Contains(serverJsz.Config.Domain, " ") {
253+
examples.add("Cluster %s Server %s Domain %s", clusterName, serverName, serverJsz.Config.Domain)
254+
}
255+
}
256+
}
257+
258+
if examples.Count() > 0 {
259+
logCritical("Found %d servers with JetStream domains containing whitespace", examples.Count())
260+
return Fail, nil
261+
}
262+
263+
return Pass, nil
264+
}

0 commit comments

Comments
 (0)