Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do not lower-case FQDN #231

Merged
merged 6 commits into from
Jul 25, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .changelog/231.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
```release-note:breaking-change
The FQDN is returned as is, it isn't lowercased anymore. This reverts https://github.com/elastic/go-sysinfo/pull/180.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please specify the affected parts of the library. As a library consumer I would want to know that the value in types.HostInfo#Hostname and the response from FQDN()/FQDNWithContext() are affected. It makes it easier to audit if you are affected.

IMO we could entirely omit mentions of ECS. It would suffice to say that if you want to retain the old behavior that it is your responsibility to lowercase the values.

Complying with ECS for `host.name` and `host.hostname` (https://www.elastic.co/guide/en/ecs/current/ecs-host.html#field-host-name) should not be handled by go-sysinfo. The users of go-sysinfo should ensure compliance with ECS if necessary.
```
3 changes: 1 addition & 2 deletions providers/aix/host_aix_ppc64.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ import (
"errors"
"fmt"
"os"
"strings"
"time"

"github.com/elastic/go-sysinfo/internal/registry"
Expand Down Expand Up @@ -191,7 +190,7 @@ func (r *reader) hostname(h *host) {
if r.addErr(err) {
return
}
h.info.Hostname = strings.ToLower(v)
h.info.Hostname = v
}

func (r *reader) network(h *host) {
Expand Down
3 changes: 1 addition & 2 deletions providers/darwin/host_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import (
"errors"
"fmt"
"os"
"strings"
"time"

"github.com/elastic/go-sysinfo/internal/registry"
Expand Down Expand Up @@ -226,7 +225,7 @@ func (r *reader) hostname(h *host) {
if r.addErr(err) {
return
}
h.info.Hostname = strings.ToLower(v)
h.info.Hostname = v
}

func (r *reader) network(h *host) {
Expand Down
3 changes: 1 addition & 2 deletions providers/linux/host_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import (
"fmt"
"os"
"path/filepath"
"strings"
"time"

"github.com/prometheus/procfs"
Expand Down Expand Up @@ -234,7 +233,7 @@ func (r *reader) hostname(h *host) {
if r.addErr(err) {
return
}
h.info.Hostname = strings.ToLower(v)
h.info.Hostname = v
}

func (r *reader) network(h *host) {
Expand Down
15 changes: 13 additions & 2 deletions providers/shared/fqdn.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ func FQDNWithContext(ctx context.Context) (string, error) {
}

// FQDN just calls FQDNWithContext with a background context.
// Deprecated.
func FQDN() (string, error) {
return FQDNWithContext(context.Background())
}
Expand All @@ -62,8 +63,18 @@ func fqdn(ctx context.Context, hostname string) (string, error) {
errs = fmt.Errorf("could not get FQDN, all methods failed: failed looking up CNAME: %w",
err)
}

if cname != "" {
return strings.ToLower(strings.TrimSuffix(cname, ".")), nil
cname = strings.TrimSuffix(cname, ".")

// Go might lowercase the cname "for convenience". Therefore, if cname
// is the same as hostname, return hostname as is.
// See https://github.com/golang/go/blob/go1.22.5/src/net/hosts.go#L38
if strings.ToLower(cname) == strings.ToLower(hostname) {
return hostname, nil
}

return cname, nil
}

ips, err := net.DefaultResolver.LookupIP(ctx, "ip", hostname)
Expand All @@ -76,7 +87,7 @@ func fqdn(ctx context.Context, hostname string) (string, error) {
if err != nil || len(names) == 0 {
continue
}
return strings.ToLower(strings.TrimSuffix(names[0], ".")), nil
return strings.TrimSuffix(names[0], "."), nil
}

return "", errs
Expand Down
4 changes: 2 additions & 2 deletions providers/shared/fqdn_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func TestFQDN(t *testing.T) {
timeout time.Duration
}{
// This test case depends on network, particularly DNS,
// being available. If it starts to fail often enough
// being available. If it starts to fail often enough
// due to occasional network/DNS unavailability, we should
// probably just delete this test case.
"long_real_hostname": {
Expand All @@ -56,7 +56,7 @@ func TestFQDN(t *testing.T) {
},
"long_mixed_case_hostname": {
osHostname: "eLaSTic.co",
expectedFQDN: "elastic.co",
expectedFQDN: "eLaSTic.co",
expectedErrRegex: "",
},
"nonexistent_timeout": {
Expand Down
4 changes: 2 additions & 2 deletions providers/windows/host_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func (h *host) FQDNWithContext(_ context.Context) (string, error) {
return "", fmt.Errorf("could not get windows FQDN: %s", err)
}

return strings.ToLower(strings.TrimSuffix(fqdn, ".")), nil
return strings.TrimSuffix(fqdn, "."), nil
}

func (h *host) FQDN() (string, error) {
Expand Down Expand Up @@ -161,7 +161,7 @@ func (r *reader) hostname(h *host) {
if r.addErr(err) {
return
}
h.info.Hostname = strings.ToLower(v)
h.info.Hostname = v
}

func getComputerNameEx(name uint32) (string, error) {
Expand Down
4 changes: 2 additions & 2 deletions types/host.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ type Host interface {
Info() HostInfo
Memory() (*HostMemoryInfo, error)

// FQDNWithContext returns the fully-qualified domain name of the host, lowercased.
// FQDNWithContext returns the fully-qualified domain name of the host.
FQDNWithContext(ctx context.Context) (string, error)

// FQDN calls FQDNWithContext with a background context.
Expand Down Expand Up @@ -77,7 +77,7 @@ type HostInfo struct {
NativeArchitecture string `json:"native_architecture"` // Native OS hardware architecture (e.g. x86_64, arm, ppc, mips).
BootTime time.Time `json:"boot_time"` // Host boot time.
Containerized *bool `json:"containerized,omitempty"` // Is the process containerized.
Hostname string `json:"name"` // Hostname, lowercased.
Hostname string `json:"name"` // Hostname.
IPs []string `json:"ip,omitempty"` // List of all IPs.
KernelVersion string `json:"kernel_version"` // Kernel version.
MACs []string `json:"mac"` // List of MAC addresses.
Expand Down
Loading