62: Определение подходящего сетевого интервейса по имеющемуся ipv4
This commit is contained in:
parent
ee5314fec9
commit
241d737f9a
5 changed files with 72 additions and 5 deletions
48
SWSCloudNode/network.py
Normal file
48
SWSCloudNode/network.py
Normal 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']
|
|
@ -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()
|
||||
|
|
|
@ -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
11
extra/supervisor.conf
Normal 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
|
2
setup.py
2
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=[
|
||||
|
|
Loading…
Add table
Reference in a new issue