diff --git a/SWSCloudNode/network.py b/SWSCloudNode/network.py new file mode 100644 index 0000000..d179002 --- /dev/null +++ b/SWSCloudNode/network.py @@ -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'] diff --git a/SWSCloudNode/settings.py b/SWSCloudNode/settings.py index 0c97eaa..91edf2e 100644 --- a/SWSCloudNode/settings.py +++ b/SWSCloudNode/settings.py @@ -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() diff --git a/cloud_node_agent.py b/cloud_node_agent.py index a02879f..e1bd4fa 100644 --- a/cloud_node_agent.py +++ b/cloud_node_agent.py @@ -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'], ) diff --git a/extra/supervisor.conf b/extra/supervisor.conf new file mode 100644 index 0000000..41406b5 --- /dev/null +++ b/extra/supervisor.conf @@ -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 diff --git a/setup.py b/setup.py index 169569a..757fd7a 100644 --- a/setup.py +++ b/setup.py @@ -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=[