Skip to content

Commit

Permalink
Add whitespace checks to audit analyze
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
ReubenMathew committed Jul 26, 2024
1 parent 80dfaa1 commit c54c197
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 2 deletions.
15 changes: 15 additions & 0 deletions internal/audit/checks.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,21 @@ func GetDefaultChecks() []Check {
Description: "Verify that all nodes part of the meta group agree on the meta cluster leader",
fun: checkMetaClusterLeader,
},
{
Name: "Whitespace in leafnode server names",
Description: "Verify that no leafnode contains whitespace in its name",
fun: checkLeafnodeServerNamesForWhitespace,
},
{
Name: "Whitespace in JetStream domains",
Description: "Verify that no JetStream server is configured with whitespace in its domain",
fun: checkJetStreamDomainsForWhitespace,
},
{
Name: "Whitespace in cluster name",
Description: "Verify that no cluster name contains whitespace",
fun: checkClusterNamesForWhitespace,
},
}
}

Expand Down
61 changes: 59 additions & 2 deletions internal/audit/cluster_checks.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,14 @@ package audit
import (
"errors"
"fmt"
"reflect"
"sort"
"strings"

"github.com/dustin/go-humanize"
"github.com/nats-io/nats-server/v2/server"
"github.com/nats-io/natscli/internal/archive"
"reflect"
"sort"
"golang.org/x/exp/maps"
)

// checkClusterMemoryUsageOutliers creates a parametrized check to verify the memory usage of any given node in a
Expand Down Expand Up @@ -214,3 +217,57 @@ func makeCheckClusterHighHAAssets(haAssetsThreshold int) checkFunc {
return Pass, nil
}
}

func checkClusterNamesForWhitespace(reader *archive.Reader, examples *ExamplesCollection) (Outcome, error) {

for _, clusterName := range reader.GetClusterNames() {
if strings.Contains(clusterName, " ") {
examples.add("Cluster: %s", clusterName)
}
}

if examples.Count() > 0 {
logCritical("Found %d clusters with names containing whitespace", examples.Count())
return Fail, nil
}

return Pass, nil
}

func checkLeafnodeServerNamesForWhitespace(r *archive.Reader, examples *ExamplesCollection) (Outcome, error) {

for _, clusterName := range r.GetClusterNames() {
clusterTag := archive.TagCluster(clusterName)

leafnodesWithWhitespace := map[string]struct{}{}

for _, serverName := range r.GetClusterServerNames(clusterName) {
serverTag := archive.TagServer(serverName)

var serverLeafz server.Leafz
err := r.Load(&serverLeafz, clusterTag, serverTag, archive.TagServerLeafs())
if err != nil {
logWarning("Artifact 'LEAFZ' is missing for server %s", serverName)
continue
}

for _, leaf := range serverLeafz.Leafs {
// check if leafnode name contains whitespace
if strings.Contains(leaf.Name, " ") {
leafnodesWithWhitespace[leaf.Name] = struct{}{}
}
}
}

if len(leafnodesWithWhitespace) > 0 {
examples.add("Cluster %s: %v", clusterName, maps.Keys(leafnodesWithWhitespace))
}
}

if examples.Count() > 0 {
logCritical("Found %d clusters with leafnode names containing whitespace", examples.Count())
return Fail, nil
}

return Pass, nil
}
32 changes: 32 additions & 0 deletions internal/audit/server_checks.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ package audit
import (
"errors"
"fmt"
"strings"

"github.com/dustin/go-humanize"
"github.com/nats-io/nats-server/v2/server"
"github.com/nats-io/natscli/internal/archive"
Expand Down Expand Up @@ -230,3 +232,33 @@ func makeCheckServerResourceLimits(memoryUsageThreshold, storeUsageThreshold flo
return Pass, nil
}
}

func checkJetStreamDomainsForWhitespace(r *archive.Reader, examples *ExamplesCollection) (Outcome, error) {

for _, clusterName := range r.GetClusterNames() {
clusterTag := archive.TagCluster(clusterName)

for _, serverName := range r.GetClusterServerNames(clusterName) {
serverTag := archive.TagServer(serverName)

var serverJsz server.JSInfo
err := r.Load(&serverJsz, clusterTag, serverTag, archive.TagServerJetStream())
if err != nil {
logWarning("Artifact 'JSZ' is missing for server %s", serverName)
continue
}

// check if jetstream domain contains whitespace
if strings.Contains(serverJsz.Config.Domain, " ") {
examples.add("Cluster %s Server %s Domain %s", clusterName, serverName, serverJsz.Config.Domain)
}
}
}

if examples.Count() > 0 {
logCritical("Found %d servers with JetStream domains containing whitespace", examples.Count())
return Fail, nil
}

return Pass, nil
}

0 comments on commit c54c197

Please sign in to comment.