diff --git a/multiaddr/multiaddr.go b/multiaddr/multiaddr.go new file mode 100644 index 0000000..3262ad5 --- /dev/null +++ b/multiaddr/multiaddr.go @@ -0,0 +1,96 @@ +package main + +import ( + "encoding/hex" + "flag" + "fmt" + "os" + + ma "github.com/jbenet/go-multiaddr" + manet "github.com/jbenet/go-multiaddr/net" +) + +// flags +var formats = []string{"string", "bytes", "hex", "slice"} +var format string +var hideLoopback bool + +func init() { + flag.Usage = func() { + fmt.Fprintf(os.Stderr, "usage: %s []\n\nFlags:\n", os.Args[0]) + flag.PrintDefaults() + } + + usage := fmt.Sprintf("output format, one of: %v", formats) + flag.StringVar(&format, "format", "string", usage) + flag.StringVar(&format, "f", "string", usage+" (shorthand)") + flag.BoolVar(&hideLoopback, "hide-loopback", false, "do not display loopback addresses") +} + +func main() { + flag.Parse() + args := flag.Args() + if len(args) == 0 { + output(localAddresses()...) + } else { + output(address(args[0])) + } +} + +func localAddresses() []ma.Multiaddr { + maddrs, err := manet.InterfaceMultiaddrs() + if err != nil { + die(err) + } + + if !hideLoopback { + return maddrs + } + + var maddrs2 []ma.Multiaddr + for _, a := range maddrs { + if !manet.IsIPLoopback(a) { + maddrs2 = append(maddrs2, a) + } + } + + return maddrs2 +} + +func address(addr string) ma.Multiaddr { + m, err := ma.NewMultiaddr(addr) + if err != nil { + die(err) + } + + return m +} + +func output(ms ...ma.Multiaddr) { + for _, m := range ms { + fmt.Println(outfmt(m)) + } +} + +func outfmt(m ma.Multiaddr) string { + switch format { + case "string": + return m.String() + case "slice": + return fmt.Sprintf("%v", m.Bytes()) + case "bytes": + return string(m.Bytes()) + case "hex": + return "0x" + hex.EncodeToString(m.Bytes()) + } + + die("error: invalid format", format) + return "" +} + +func die(v ...interface{}) { + fmt.Fprint(os.Stderr, v...) + fmt.Fprint(os.Stderr, "\n") + flag.Usage() + os.Exit(-1) +}