hostname/hostname.go

196 lines
4.5 KiB
Go

// figures out if your hostname is valid
// then checks if your DNS is setup correctly
package linuxstatus
import (
"fmt"
"io/ioutil"
"strings"
"go.wit.com/lib/gui/shell"
"go.wit.com/log"
// will try to get this hosts FQDN
"github.com/Showmax/go-fqdn"
)
func (ls *LinuxStatus) GetDomainName() string {
if !me.Ready() {
return ""
}
return me.domainname.String()
}
func (ls *LinuxStatus) setDomainName() {
if !me.Ready() {
return
}
dn := run("domainname")
if me.domainname.String() != dn {
log.Log(CHANGE, "domainname has changed from", me.GetDomainName(), "to", dn)
me.domainname.SetText(dn)
me.changed = true
}
}
func (ls *LinuxStatus) GetHostname() string {
if !me.Ready() {
return ""
}
return me.hostname.String()
}
func (ls *LinuxStatus) ValidHostname() bool {
if !me.Ready() {
log.Info("ValidHostname() not ready")
return false
}
if me.hostnameStatus.String() == "WORKING" {
return true
}
return false
}
func (ls *LinuxStatus) setHostname(newname string) {
if !me.Ready() {
return
}
if newname == me.hostname.String() {
return
}
log.Log(CHANGE, "hostname has changed from", me.GetHostname(), "to", newname)
me.hostname.SetText(newname)
me.changed = true
}
func (ls *LinuxStatus) GetHostShort() string {
if !me.Ready() {
return ""
}
return me.hostshort.String()
}
func (ls *LinuxStatus) setHostShort() {
if !me.Ready() {
return
}
hshort := run("hostname -s")
if me.hostshort.String() != hshort {
log.Log(CHANGE, "hostname -s has changed from", me.hostshort.String(), "to", hshort)
me.hostshort.SetText(hshort)
me.changed = true
}
}
// getDomainName extracts the domain name from a given hostname
func getDomainName(hostname string) (string, error) {
parts := strings.Split(hostname, ".")
if len(parts) < 3 {
return "", fmt.Errorf("hostname '%s' is too short to extract a domain name", hostname)
}
// Join all parts except the first one, which is assumed to be a subdomain
domain := strings.Join(parts[1:], ".")
return domain, nil
}
func lookupHostname() {
if !me.Ready() {
return
}
var err error
var hostfqdn string = "broken"
hostfqdn, err = fqdn.FqdnHostname()
if err != nil {
log.Error(err, "FQDN hostname error")
return
}
log.Log(NET, "full hostname should be: ", hostfqdn)
me.setDomainName()
me.setHostShort()
// these are authoritative
// if they work wrong, your linux configuration is wrong.
// Do not complain.
// Fix your distro if your box is otherwise not working this way
hshort := me.GetHostShort() // from `hostname -s`
dn := me.GetDomainName() // from `domanname`
hostname := me.GetHostname() // from `hostname -f`
if hostfqdn != hostname {
log.Log(WARN, "hostname", hostname, "does not equal fqdn.FqdnHostname()", hostfqdn)
// TODO: figure out what is wrong
if dn == "(none)" {
realdn, err := getDomainName(hostfqdn)
if err == nil {
log.Log(WARN, "need to run: 'domainname", realdn, "' here")
me.changed = true
me.hostnameStatus.SetText("FIXING")
shell.RunPath("", []string{"domainname", realdn})
return
} else {
log.Log(WARN, "getDomainName() err =", err)
log.Log(WARN, "/etc/hostname is too short. let the user set the name here.")
// me.changed = true
me.hostnameStatus.SetText("INVALID DOMAIN NAME")
// return
}
}
log.Log(WARN, "don't know what to do here with domainname")
log.Log(WARN, "check that /etc/hostname is valid?")
// me.changed = true
me.hostnameStatus.SetText("UNKNOWN")
// return
}
var test string
test = hshort + "." + dn
me.setHostname(test)
if hostname != test {
log.Log(CHANGE, "hostname", hostname, "does not equal", test)
if me.hostnameStatus.String() != "BROKEN" {
log.Log(CHANGE, "hostname", hostname, "does not equal", test)
me.changed = true
me.hostnameStatus.SetText("BROKEN")
}
} else {
if me.hostnameStatus.String() != "WORKING" {
log.Log(CHANGE, "hostname", hostname, "is valid")
me.hostnameStatus.SetText("WORKING")
me.changed = true
}
}
}
// returns true if the hostname is good
// check that all the OS settings are correct here
// On Linux, /etc/hosts, /etc/hostname
//
// and domainname and hostname
func goodHostname() bool {
content, err := ioutil.ReadFile("/etc/hostname")
if err != nil {
// this needs to be a fixWindow() error
log.Error(err)
}
hostname := string(content)
log.Log(NOW, "hostname =", hostname)
hs := run("hostname -s")
dn := run("domainname")
log.Log(NOW, "hostname short =", hs, "domainname =", dn)
tmp := hs + "." + dn
if hostname == tmp {
log.Log(NOW, "hostname seems to be good", hostname)
return true
}
return false
}