Add Windows support
This commit is contained in:
parent
b888054b05
commit
3fbf6b1474
@ -8,6 +8,7 @@
|
|||||||
- Deduplication
|
- Deduplication
|
||||||
- Format check
|
- Format check
|
||||||
- `SUID` safe!
|
- `SUID` safe!
|
||||||
|
- Supports *NIX (Linux & macOS) and Windows
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
|||||||
29
main.go
29
main.go
@ -5,14 +5,16 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
targetIP, domains := parseArgs()
|
targetIP, domains := parseArgs()
|
||||||
|
targetFile := getHostsPath()
|
||||||
motd()
|
motd()
|
||||||
process(targetIP, domains)
|
process(targetFile, targetIP, domains)
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseArgs() (net.IP, []string) {
|
func parseArgs() (net.IP, []string) {
|
||||||
@ -45,12 +47,23 @@ func parseArgs() (net.IP, []string) {
|
|||||||
return ip, os.Args[2:]
|
return ip, os.Args[2:]
|
||||||
}
|
}
|
||||||
|
|
||||||
// process goes over the /etc/hosts and tries to best-fit the domain names for the IP
|
// getHostsPath returns the path to the hosts file depending on the current operating system:
|
||||||
func process(ip net.IP, domains []string) {
|
// /etc/hosts on *NIX,
|
||||||
|
// C:\Windows\system32\drivers\etc\hosts on WIN*.
|
||||||
|
func getHostsPath() (string) {
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
return "C:\\Windows\\system32\\drivers\\etc\\hosts"
|
||||||
|
} else {
|
||||||
|
return "/etc/hosts"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// process goes over the targetFile and tries to best-fit the domain names for the IP
|
||||||
|
func process(targetFile string, ip net.IP, domains []string) {
|
||||||
// Read file
|
// Read file
|
||||||
bytesEtcHosts, readErr := os.ReadFile("/etc/hosts")
|
bytesEtcHosts, readErr := os.ReadFile(targetFile)
|
||||||
if readErr != nil {
|
if readErr != nil {
|
||||||
fmt.Fprintf(os.Stderr, "Failed to read /etc/hosts: %s\n", readErr.Error())
|
fmt.Fprintf(os.Stderr, "Failed to read %s: %s\n", targetFile, readErr.Error())
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
etcHosts := string(bytesEtcHosts)
|
etcHosts := string(bytesEtcHosts)
|
||||||
@ -108,9 +121,9 @@ func process(ip net.IP, domains []string) {
|
|||||||
|
|
||||||
// Write out again
|
// Write out again
|
||||||
newHosts := strings.Join(lines, "\n")
|
newHosts := strings.Join(lines, "\n")
|
||||||
writeErr := os.WriteFile("/etc/hosts", []byte(newHosts), 0o644)
|
writeErr := os.WriteFile(targetFile, []byte(newHosts), 0o644)
|
||||||
if writeErr != nil {
|
if writeErr != nil {
|
||||||
fmt.Fprintf(os.Stderr, "Failed to write /etc/hosts: %s\n", writeErr.Error())
|
fmt.Fprintf(os.Stderr, "Failed to write %s: %s\n", targetFile, writeErr.Error())
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -131,6 +144,6 @@ func motd() {
|
|||||||
fmt.Println(" G H O S T ")
|
fmt.Println(" G H O S T ")
|
||||||
fmt.Println(" your friendly helper with ")
|
fmt.Println(" your friendly helper with ")
|
||||||
}
|
}
|
||||||
fmt.Println(" /etc/hosts, written in Go!")
|
fmt.Printf(" %cetc%chosts, written in Go!\n", os.PathSeparator, os.PathSeparator) // technically not fully correct, but the MOTD can only be *that* wide, right?
|
||||||
fmt.Println("+-------------------------+")
|
fmt.Println("+-------------------------+")
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user