Вы можете увидеть, если есть интерфейс с определенным именем с помощью этой функции:
package main
import (
"log"
"net"
"strings"
)
func trace(fmt string, args ...interface{}) {
log.Printf(fmt, args...)
}
func HasAddrWithName(name string) (bool, error) {
ifaces, err := net.Interfaces()
if err != nil {
return false, err
}
for _, iface := range ifaces {
addrs, err := iface.Addrs()
if err != nil {
trace("%s", err)
continue
}
for _, addr := range addrs {
ipaddr, _, err := net.ParseCIDR(addr.String())
if err != nil {
trace("%s", err)
continue
}
hosts, err := net.LookupAddr(ipaddr.String())
if err != nil {
trace("%s", err)
continue
}
for idx, h := range hosts {
trace("%d: %s\n", idx, h)
if strings.Contains(h, name) {
return true, nil
}
}
}
}
return false, nil
}
func main() {
hasAddr, err := HasAddrWithName(".ec2.internal")
if err != nil {
log.Fatal(err)
}
if hasAddr {
log.Println("inside ec2")
return
}
log.Println("Not inside ec2")
}
Функции попытается найти все интерфейс разрешить IP к имя dns. если имя содержит определенную строку, возвращает true.
Можете ли вы объяснить, почему вы это делаете? –
Некоторые из вещей, которые я могу себе представить, что вы делаете с этим (например, переключатели режима «dev mode» и «prod mode»), могут быть лучше выполнены с конфигурацией, которую вы передаете в переменные файла или среды или флаги командной строки при запуске программы , а не путем обнаружения того, где он запускается. – twotwotwo