Files
dnshelper/main.go
T
2026-03-03 13:58:06 -05:00

95 lines
2.7 KiB
Go

package main
import (
"flag"
"fmt"
"os"
"path/filepath"
"strings"
)
var fileName = filepath.Base(os.Args[0])
func init() {
fmt.Println("DNSHelper v1.0")
fmt.Println("Copyright (c) 2024 Emberkom LLC")
fmt.Println("")
if len(os.Args) < 2 {
printUsage()
defer os.Exit(1)
}
}
func printUsage() {
fmt.Println("This utility will update the local hosts file with DNS entries obtained by the specified DNS server.")
fmt.Println("Usage: " + fileName + " [add|delete] -host hostname [-server dns.example.com]")
fmt.Println("Example:")
fmt.Println(" " + fileName + " add -host xyz.acme.com -server dns.example.com")
fmt.Println(" This will use dns.example.com to find and add all IP addresses for xyz.acme.com to the local hosts file.")
fmt.Println(" " + fileName + " delete -host hostname.example.com")
fmt.Println(" This will delete all entries for hostname.example.com from the local hosts file.")
fmt.Println(" " + fileName + " delete all")
fmt.Println(" This will delete all entries from the local hosts file that were added by this utility.")
fmt.Println("Note: Adding a hostname will first remove all entries in the hosts file that match the same hostname.")
fmt.Println(" This utility will only remove entries from the hosts file that it added.")
}
func term(err error) {
fmt.Println("Error: " + err.Error())
defer os.Exit(1)
}
func main() {
modePing := flag.NewFlagSet("ping", flag.ExitOnError)
modeAdd := flag.NewFlagSet("add", flag.ExitOnError)
hostToAdd := modeAdd.String("host", "", "Comma separated list of hostnames to add")
dnsResolver := modeAdd.String("server", "", "DNS resolver to use")
modeDelete := flag.NewFlagSet("delete", flag.ExitOnError)
hostToDelete := modeDelete.String("host", "", "Comma separated list of hostnames to delete")
data := new(workingData)
var err error
data.HostsFileLocation, err = getHostsFileLocation()
if err != nil {
term(err)
}
data.DefaultContent, err = getFileContentLines(data.HostsFileLocation)
if err != nil {
term(err)
}
if err = extractLinesToEdit(data); err != nil {
term(err)
}
switch strings.ToLower(os.Args[1]) {
case "a", "add":
err = modeAdd.Parse(os.Args[2:])
if err != nil {
term(err)
}
addHostsToWorkingData(data, hostToAdd)
addResolversToWorkingData(data, dnsResolver)
removeHostsFromExistingContent(data)
addNameToIPMappingsToNewContent(data)
case "d", "del", "delete":
err = modeDelete.Parse(os.Args[2:])
if err != nil {
term(err)
}
if strings.ToLower(*hostToDelete) != "all" && strings.ToLower(*hostToDelete) != "a" {
addHostsToWorkingData(data, hostToDelete)
removeHostsFromExistingContent(data)
}
default:
printUsage()
}
err = writeHostsFile(data)
if err != nil {
term(err)
}
}