From c62c11341dd879e54289e239d1249ff8e4bc9040 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Mon, 22 Sep 2025 18:54:37 -0500 Subject: [PATCH] GetDomainname() --- common.go | 4 ++-- domainname.go | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ whois.go | 47 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 domainname.go create mode 100644 whois.go diff --git a/common.go b/common.go index ae4b7ff..b22d738 100644 --- a/common.go +++ b/common.go @@ -11,7 +11,7 @@ var ErrorEmptyDomainName error = errors.New("domain name is empty") var ErrorDomainNameMisconfigured error = errors.New("your OS domain name is not configured correctly") // returns 'hostname', 'domainname' -func Split(s string) (string, string) { +func SplitOld(s string) (string, string) { parts := strings.Fields(s) if len(parts) == 0 { return "", "" @@ -24,7 +24,7 @@ func Split(s string) (string, string) { // checks to make sure there is a domainname func ValidDomainname(s string) error { - _, domainname := Split(s) + _, domainname := SplitOld(s) if domainname == "" { return ErrorEmptyDomainName } diff --git a/domainname.go b/domainname.go new file mode 100644 index 0000000..ae49670 --- /dev/null +++ b/domainname.go @@ -0,0 +1,62 @@ +package hostname + +import ( + "fmt" + "strings" +) + +// for www.corp.wit.com retuns: +// "www", "corp.wit.com", nil +func GetDomainname() (string, string, error) { + hname, err := osGetHostname() + if err != nil { + return hname, "", err + } + hname = strings.TrimSpace(hname) + hname = strings.Trim(hname, ".") + parts := strings.Split(hname, ".") + if len(parts) == 0 { + return "", "", fmt.Errorf("domainname not set") + } + + if len(parts) == 1 { + return parts[0], "", fmt.Errorf("domainname not set") + } + + dname := strings.Join(parts[1:], ".") + + return hname, dname, nil +} + +// splits hostname into first and last part +// for www.corp.wit.com retuns: +// "www", "corp.wit.com", nil +func Split(hname string) (string, string, error) { + hname = strings.TrimSpace(hname) + hname = strings.Trim(hname, ".") + parts := strings.Split(hname, ".") + if len(parts) == 0 { + return "", "", fmt.Errorf("domainname not set") + } + + if len(parts) == 1 { + return parts[0], "", fmt.Errorf("domainname not set") + } + + dname := strings.Join(parts[1:], ".") + + return hname, dname, nil +} + +func Join(hname string, dname string) string { + hname = strings.TrimSpace(hname) + hname = strings.Trim(hname, ".") + dname = strings.TrimSpace(dname) + dname = strings.Trim(dname, ".") + + fullname := strings.Join([]string{hname, dname}, ".") + fullname = strings.TrimSpace(fullname) + fullname = strings.Trim(fullname, ".") + + return fullname +} diff --git a/whois.go b/whois.go new file mode 100644 index 0000000..5299057 --- /dev/null +++ b/whois.go @@ -0,0 +1,47 @@ +package hostname + +import ( + "io" + "net" +) + +// GetWhois performs a raw whois query for a given domain. +// Note: This does not recursively find the right server; it uses a known one. +func GetWhois(domain, server string) (string, error) { + // Connect to the whois server on port 43 + conn, err := net.Dial("tcp", net.JoinHostPort(server, "43")) + if err != nil { + return "", err + } + defer conn.Close() + + // Send the domain query + _, err = conn.Write([]byte(domain + "\r\n")) + if err != nil { + return "", err + } + + // Read the entire response + result, err := io.ReadAll(conn) + if err != nil { + return "", err + } + + return string(result), nil +} + +/* +func main() { +// We have to know the server for .com domains +const whoisServer = "whois.verisign-grs.com" + domain :="google.com" + + whoisData, err := GetWhois(domain, whoisServer) +if err != nil { + log.Fatal"Error getting whois info: %v", err) + } + + fmt.Println(whoisData) +} + +*/