mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
136 lines
4.2 KiB
Python
136 lines
4.2 KiB
Python
from utilities import bash
|
|
from cloudException import CloudRuntimeException, CloudInternalException
|
|
import logging
|
|
import os
|
|
import re
|
|
|
|
class networkConfig:
|
|
class devInfo:
|
|
def __init__(self, macAddr, ipAddr, netmask, gateway, type, name):
|
|
self.name = name
|
|
self.macAdrr = macAddr
|
|
self.ipAddr = ipAddr
|
|
self.netmask = netmask
|
|
self.gateway = gateway
|
|
self.type = type
|
|
self.name = name
|
|
#dhcp or static
|
|
self.method = None
|
|
|
|
@staticmethod
|
|
def getDefaultNetwork():
|
|
cmd = bash("route -n|awk \'/^0.0.0.0/ {print $2,$8}\'")
|
|
if not cmd.isSuccess():
|
|
logging.debug("Failed to get default route")
|
|
raise CloudRuntimeException("Failed to get default route")
|
|
|
|
result = cmd.getStdout().split(" ")
|
|
gateway = result[0]
|
|
dev = result[1]
|
|
|
|
pdi = networkConfig.getDevInfo(dev)
|
|
logging.debug("Found default network device:%s"%pdi.name)
|
|
pdi.gateway = gateway
|
|
return pdi
|
|
|
|
@staticmethod
|
|
def createBridge(dev, brName):
|
|
if not networkConfig.isBridgeSupported():
|
|
logging.debug("bridge is not supported")
|
|
return False
|
|
if networkConfig.isBridgeEnslavedWithDevices(brName):
|
|
logging.debug("bridge: %s has devices enslaved"%brName)
|
|
return False
|
|
|
|
cmds = ""
|
|
if not networkConfig.isBridge(brName):
|
|
cmds = "brctl addbr %s ;"%brName
|
|
|
|
cmds += "ifconfig %s up;"%brName
|
|
cmds += "brctl addif %s %s"%(brName, dev)
|
|
return bash(cmds).isSuccess()
|
|
|
|
@staticmethod
|
|
def isBridgeEnslavedWithDevices(brName):
|
|
if not networkConfig.isBridge(brName):
|
|
return False
|
|
|
|
if not os.listdir("/sys/class/net/%s/brif"%brName):
|
|
return False
|
|
|
|
return True
|
|
|
|
@staticmethod
|
|
def isBridgeSupported():
|
|
if os.path.exists("/proc/sys/net/bridge"):
|
|
return True
|
|
|
|
return bash("modprobe bridge").isSucess()
|
|
|
|
@staticmethod
|
|
def isNetworkDev(devName):
|
|
return os.path.exists("/sys/class/net/%s"%devName)
|
|
|
|
@staticmethod
|
|
def isBridgePort(devName):
|
|
return os.path.exists("/sys/class/net/%s/brport"%devName)
|
|
|
|
@staticmethod
|
|
def isBridge(devName):
|
|
return os.path.exists("/sys/class/net/%s/bridge"%devName)
|
|
|
|
@staticmethod
|
|
def getBridge(devName):
|
|
bridgeName = None
|
|
if os.path.exists("/sys/class/net/%s/brport/bridge"%devName):
|
|
realPath = os.path.realpath("/sys/class/net/%s/brport/bridge"%devName)
|
|
bridgeName = realPath.split("/")[-1]
|
|
return bridgeName
|
|
|
|
@staticmethod
|
|
def getEnslavedDev(br, brPort):
|
|
if not networkConfig.isBridgeEnslavedWithDevices(br):
|
|
return None
|
|
|
|
for dev in os.listdir("/sys/class/net/%s/brif"%br):
|
|
br_port = int(file("/sys/class/net/%s/brif/%s/port_no"%(br,dev)).readline().strip("\n"), 16)
|
|
if br_port == brPort:
|
|
return dev
|
|
|
|
return None
|
|
|
|
@staticmethod
|
|
def getDevInfo(dev):
|
|
if not networkConfig.isNetworkDev(dev):
|
|
logging.debug("dev: " + dev + " is not a network device")
|
|
raise CloudInternalException("dev: " + dev + " is not a network device")
|
|
|
|
netmask = None
|
|
ipAddr = None
|
|
macAddr = None
|
|
|
|
cmd = bash("ifconfig " + dev)
|
|
if not cmd.isSuccess():
|
|
logging.debug("Failed to get address from ifconfig")
|
|
raise CloudInternalException("Failed to get network info by ifconfig %s"%dev)
|
|
|
|
for line in cmd.getLines():
|
|
if line.find("HWaddr") != -1:
|
|
macAddr = line.split("HWaddr ")[1].strip(" ")
|
|
elif line.find("inet ") != -1:
|
|
m = re.search("addr:(.*)\ *Bcast:(.*)\ *Mask:(.*)", line)
|
|
if m is not None:
|
|
ipAddr = m.group(1).rstrip(" ")
|
|
netmask = m.group(3).rstrip(" ")
|
|
|
|
if networkConfig.isBridgePort(dev):
|
|
type = "brport"
|
|
elif networkConfig.isBridge(dev):
|
|
type = "bridge"
|
|
else:
|
|
type = "dev"
|
|
|
|
return networkConfig.devInfo(macAddr, ipAddr, netmask, None, type, dev)
|
|
|
|
|