62: Определение подходящего сетевого интервейса по имеющемуся ipv4

This commit is contained in:
Vyacheslav Anzhiganov 2016-06-02 03:29:36 +03:00
parent ee5314fec9
commit 241d737f9a
5 changed files with 72 additions and 5 deletions

48
SWSCloudNode/network.py Normal file
View file

@ -0,0 +1,48 @@
# coding: utf-8
import re
import os
from netaddr import *
class Detect(object):
def __init__(self):
self.iplist = list()
def list_bridges(self):
return os.popen('ifconfig').read()
def detect(self, ip_for_vm):
ip4vm = IPAddress(ip_for_vm)
c = list()
for paragraph in self.list_bridges().split('\n\n'):
# ma = re.compile("(br\d+).*HWaddr ([^ ]+).*addr:([^ ]+).*Mask:([^ ]+)", re.MULTILINE | re.DOTALL)
ma = re.compile("(virbr\d+|br\d+|br\d:\d+) .*HWaddr ([^ ]+).*addr:([^ ]+).*Mask:([^ ]+)", re.MULTILINE | re.DOTALL)
result = ma.match(paragraph)
if result:
vlan = result.group(1).rstrip()
mac = result.group(2).rstrip()
ip = result.group(3).rstrip()
mask = result.group(4).rstrip()
# inrange
ip.split('.')
m = mac.split(':')
mac = m[0] + m[1] + "." + m[2] + m[3] + "." + m[4] + m[5]
# print "vlan:", vlan
# print "ip:",ip
# print "mac:", mac
ipn = IPNetwork(ip, mask)
c.append(dict(interface=vlan, ip=ip, mask=mask, mac=mac, valid=True if ip4vm in ipn else False))
return c
def get_suitable_interface(self, ip):
for interface in self.detect(ip):
if interface['valid']:
return interface['interface']

View file

@ -26,8 +26,8 @@ if os.path.exists(settings_file):
sys.exit()
else:
if settings.get('node', 'interface') not in os.listdir('/sys/class/net/'):
logging.error('Interface not found: %s' % settings.get('node', 'interface'))
sys.exit()
logging.warning('Interface not found: %s' % settings.get('node', 'interface'))
# sys.exit()
if not settings.has_option('node', 'sleep'):
logging.error("No option 'sleep' in section: 'node'")
sys.exit()

View file

@ -4,6 +4,7 @@
import time
from SWSCloudNode.settings import settings
from SWSCloudNode.logger import logging
from SWSCloudNode.network import Detect
from SWSCloudNode import Node
from SWSCloudNode import Tasks
from SWSCloudNode import lxc, qemu
@ -55,7 +56,10 @@ while True:
ipv6['ipv6'] = task['plain']['ipv6']
ipv6['ipv6_gateway'] = task['plain']['ipv6_gateway']
nodeclient.container_config_create(container_id, settings.get('node', 'interface'), ipv4, ipv6)
# автоматически определяем подходящий сетевой интерфейс исходя из имеющегося ipv4
interface = Detect().get_suitable_interface(ipv4)
# interface = settings.get('node', 'interface')
nodeclient.container_config_create(container_id, interface, ipv4, ipv6)
container_config_file = '/var/lib/gocloud/node/configs/%s.config' % container_id
@ -137,10 +141,14 @@ while True:
# TODO: if container doesn't exists then complete task and report about this fact
p = task['plain']
try:
# автоматически определяем подходящий сетевой интерфейс исходя из имеющегося ipv4
interface = Detect().get_suitable_interface(p['ipv4'])
# interface = settings.get('node', 'interface')
qemu.QEMU().create(
p['cores'], p['memory'], p['storage'], p['swap'], p['hostname'],
p['ipv4'], p['ipv4_gateway'], p['dns1'], p['dns2'], p['password'],
p['os_name'], p['os_suite'], settings.get('node', 'interface'),
p['os_name'], p['os_suite'], interface,
p['vm_id'],
p['ssh_key'],
)

11
extra/supervisor.conf Normal file
View file

@ -0,0 +1,11 @@
[program:cloudnode]
user=root
group=root
command=/usr/local/bin/cloud_node_agent.py
autostart=true
autorestart=true
startsecs=1
startretries=777
exitcodes=0,2
stopsignal=TERM
stopwaitsecs=1

View file

@ -4,7 +4,7 @@ from setuptools import setup
setup(
name='SWSCloudNode',
version='3.1.0',
version='3.1.1',
author='Vyacheslav Anzhiganov',
author_email='vanzhiganov@ya.ru',
packages=[