meshname/meshname.go
2020-01-19 08:01:31 -05:00

76 lines
1.4 KiB
Go

package main
import (
"encoding/base32"
"fmt"
"net"
"strings"
"os"
"errors"
)
var domainZone = ".mesh.arpa"
func reverse_lookup(target string) (string, error) {
ip := net.ParseIP(target)
if ip == nil {
return "", errors.New("Invalid IP address")
}
str := base32.StdEncoding.EncodeToString(ip)[0:26]
return strings.ToLower(str) + domainZone, nil
}
func lookup(target string) (string, error) {
labels := strings.Split(target, ".")
if len(labels) < 3 || strings.HasSuffix(domainZone, target) {
return "", errors.New("Invalid domain")
}
subDomain := labels[len(labels) - 3]
if len(subDomain) != 26 {
return "", errors.New("Invalid subdomain length")
}
name := strings.ToUpper(subDomain) + "======"
data, err := base32.StdEncoding.DecodeString(name)
if err != nil {
return "", err
}
s := net.IP(data)
if s == nil {
return "", errors.New("Invalid IP address")
}
return s.String(), nil
}
func main() {
usage := "Usage:\n\nmeshname lookup DOMAIN\nmeshname reverse_lookup IP"
if len(os.Args) != 3 {
fmt.Println(usage)
return
}
action := os.Args[1]
target := os.Args[2]
switch action {
case "lookup":
result, err := lookup(target)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(result)
return
case "reverse_lookup":
result, err := reverse_lookup(target)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(result)
return
default:
fmt.Println(usage)
return
}
}