github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/hyper-control/showNetworkConfiguration.go (about) 1 package main 2 3 import ( 4 "errors" 5 "fmt" 6 "net" 7 "os" 8 "strings" 9 10 "github.com/Cloud-Foundations/Dominator/lib/json" 11 "github.com/Cloud-Foundations/Dominator/lib/log" 12 libnet "github.com/Cloud-Foundations/Dominator/lib/net" 13 "github.com/Cloud-Foundations/Dominator/lib/net/configurator" 14 "github.com/Cloud-Foundations/Dominator/lib/srpc" 15 fm_proto "github.com/Cloud-Foundations/Dominator/proto/fleetmanager" 16 ) 17 18 type networkInterface struct { 19 HardwareAddr string 20 Name string 21 Up bool 22 } 23 24 func showNetworkConfigurationSubcommand(args []string, 25 logger log.DebugLogger) error { 26 err := showNetworkConfiguration(logger) 27 if err != nil { 28 return fmt.Errorf("error showing network configuration: %s", err) 29 } 30 return nil 31 } 32 33 func getInfoForhost(hostname string, 34 logger log.DebugLogger) (fm_proto.GetMachineInfoResponse, error) { 35 fmCR := srpc.NewClientResource("tcp", 36 fmt.Sprintf("%s:%d", *fleetManagerHostname, *fleetManagerPortNum)) 37 defer fmCR.ScheduleClose() 38 if hostname != "" && hostname != "localhost" { 39 return getInfoForMachine(fmCR, hostname, logger) 40 } 41 if hostname, err := os.Hostname(); err != nil { 42 return fm_proto.GetMachineInfoResponse{}, err 43 } else if info, e := getInfoForMachine(fmCR, hostname, logger); e == nil { 44 return info, nil 45 } else if !strings.Contains(err.Error(), "unknown machine") { 46 return fm_proto.GetMachineInfoResponse{}, err 47 } else if hostname, err := getHostname(); err != nil { 48 return fm_proto.GetMachineInfoResponse{}, err 49 } else { 50 return getInfoForMachine(fmCR, hostname, logger) 51 } 52 } 53 54 func getNetworkConfiguration(hostname string, logger log.DebugLogger) ( 55 *configurator.NetworkConfig, error) { 56 info, err := getInfoForhost(hostname, logger) 57 if err != nil { 58 return nil, err 59 } 60 var interfacesMap map[string]net.Interface 61 if *networkInterfacesFile == "" { 62 if hostname != "" && hostname != "localhost" { 63 return nil, errors.New("no networkInterfacesFile specified") 64 } 65 _, interfacesMap, err = getUpInterfaces(logger) 66 if err != nil { 67 return nil, err 68 } 69 } else { 70 var networkInterfaces []networkInterface 71 err := json.ReadFromFile(*networkInterfacesFile, &networkInterfaces) 72 if err != nil { 73 return nil, err 74 } 75 interfacesMap = make(map[string]net.Interface, len(networkInterfaces)) 76 for _, netInterface := range networkInterfaces { 77 macAddress, err := net.ParseMAC(netInterface.HardwareAddr) 78 if err != nil { 79 return nil, err 80 } 81 netIf := net.Interface{ 82 Name: netInterface.Name, 83 HardwareAddr: macAddress, 84 } 85 if netInterface.Up { 86 netIf.Flags = net.FlagUp 87 } 88 interfacesMap[netInterface.Name] = netIf 89 } 90 } 91 return configurator.Compute(info, interfacesMap, logger) 92 } 93 94 func getUpInterfaces(logger log.DebugLogger) ( 95 []net.Interface, map[string]net.Interface, error) { 96 interfaceList, interfaceMap, err := libnet.ListBroadcastInterfaces( 97 libnet.InterfaceTypeEtherNet, logger) 98 if err != nil { 99 return nil, nil, err 100 } 101 newList := make([]net.Interface, 0, len(interfaceList)) 102 for _, iface := range interfaceList { 103 if libnet.TestCarrier(iface.Name) { 104 newList = append(newList, iface) 105 logger.Debugf(1, "will generate configuration including: %s\n", 106 iface.Name) 107 } else { 108 delete(interfaceMap, iface.Name) 109 } 110 } 111 return newList, interfaceMap, nil 112 } 113 114 func showNetworkConfiguration(logger log.DebugLogger) error { 115 netconf, err := getNetworkConfiguration(*hypervisorHostname, logger) 116 if err != nil { 117 return err 118 } 119 if netconf.DefaultSubnet == nil { 120 return errors.New("no default subnet found") 121 } 122 fmt.Println("=============================================================") 123 fmt.Println("Network configuration:") 124 if err := netconf.PrintDebian(os.Stdout); err != nil { 125 return err 126 } 127 fmt.Println("=============================================================") 128 fmt.Println("DNS configuration:") 129 return configurator.PrintResolvConf(os.Stdout, netconf.DefaultSubnet) 130 }