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  }