Commit 0f70eb27 by Bach Dániel

add change_ip task

parent dd9ed14c
...@@ -13,7 +13,7 @@ import platform ...@@ -13,7 +13,7 @@ import platform
import sys import sys
import tarfile import tarfile
from os.path import expanduser, join, exists from os.path import expanduser, join, exists
from os import mkdir, environ from os import mkdir, environ, chdir
from glob import glob from glob import glob
from inspect import getargspec, isfunction from inspect import getargspec, isfunction
from StringIO import StringIO from StringIO import StringIO
...@@ -24,6 +24,7 @@ from datetime import datetime ...@@ -24,6 +24,7 @@ from datetime import datetime
from utils import SerialLineReceiverBase from utils import SerialLineReceiverBase
from ssh import PubKey from ssh import PubKey
from network import change_ip_ubuntu, change_ip_rhel, change_ip_windows
logging.basicConfig() logging.basicConfig()
...@@ -91,24 +92,22 @@ class Context(object): ...@@ -91,24 +92,22 @@ class Context(object):
def restart_networking(): def restart_networking():
if system == 'Linux': if system == 'Linux':
if distro == 'debian': if distro == 'debian':
with open('/etc/network/interfaces', 'w') as f:
f.write('auto lo\n'
'iface lo inet loopback\n'
'auto eth0\n'
'iface eth0 inet dhcp\n')
subprocess.call(['/etc/init.d/networking', 'restart']) subprocess.call(['/etc/init.d/networking', 'restart'])
elif distro == 'rhel': elif distro == 'rhel':
with open('/etc/sysconfig/network-scripts/ifcfg-eth0', subprocess.call(['/bin/systemctl', 'restart', 'network'])
'w') as f: pass
f.write('DEVICE=eth0\n' elif system == 'Windows':
'BOOTPROTO=dhcp\n' pass
'ONBOOT=yes\n')
@staticmethod
def change_ip(interfaces, dns):
if system == 'Linux':
if distro == 'debian':
change_ip_ubuntu(interfaces, dns)
elif distro == 'rhel':
change_ip_rhel(interfaces, dns)
elif system == 'Windows': elif system == 'Windows':
import wmi change_ip_windows(interfaces, dns)
w = wmi.WMI()
nic = w.Win32_NetworkAdapterConfiguration(IPEnabled=True)[0]
assert nic.EnableDHCP()[0] == 0
@staticmethod @staticmethod
def set_time(time): def set_time(time):
...@@ -269,6 +268,8 @@ class Context(object): ...@@ -269,6 +268,8 @@ class Context(object):
rmtree(old_dir, ignore_errors=True) rmtree(old_dir, ignore_errors=True)
move(cur_dir, old_dir) move(cur_dir, old_dir)
move(new_dir, cur_dir) move(new_dir, cur_dir)
chdir(cur_dir)
subprocess.call(('pip', 'install', '-r', 'requirements.txt'))
logger.info('Updated') logger.info('Updated')
reactor.stop() reactor.stop()
......
import netifaces
from netaddr import IPNetwork, IPAddress
import fileinput
import logging
from subprocess import check_output, CalledProcessError
logger = logging.getLogger()
interfaces_file = '/etc/network/interfaces'
ifcfg_template = '/etc/sysconfig/network-scripts/ifcfg-%s'
def get_interfaces_linux(interfaces):
for ifname in netifaces.interfaces():
mac = netifaces.ifaddresses(ifname)[17][0]['addr']
conf = interfaces.get(mac.upper())
if conf:
yield ifname, conf
def remove_interfaces_ubuntu(devices):
delete_device = False
for line in fileinput.input(interfaces_file, inplace=True):
line = line.rstrip()
words = line.split()
if line.startswith('#') or line == '' or line.isspace() or not words:
# keep line
print line
continue
if (words[0] in ('auto', 'allow-hotplug') and
words[1].split(':')[0] in devices):
# remove line
continue
if words[0] == 'iface':
if words[1].split(':')[0] in devices:
# remove line
delete_device = True
continue
else:
delete_device = False
if line[0] in (' ', '\t') and delete_device:
# remove line
continue
# keep line
print line
def change_ip_ubuntu(interfaces, dns):
data = list(get_interfaces_linux(interfaces))
remove_interfaces_ubuntu(dict(data).keys())
with open(interfaces_file, 'a') as f:
for ifname, conf in data:
ipv4_alias_counter = ipv6_alias_counter = 0
f.write('auto %s\n' % ifname)
for i in conf['addresses']:
ip_with_prefix = IPNetwork(i)
prefixlen = ip_with_prefix.prefixlen
ip = ip_with_prefix.ip
alias = ifname
if ip.version == 6:
if ipv6_alias_counter > 0:
alias = '%s:%d' % (ifname, ipv6_alias_counter)
ipv6_alias_counter += 1
else:
if ipv4_alias_counter > 0:
alias = '%s:%d' % (ifname, ipv4_alias_counter)
ipv4_alias_counter += 1
f.write(
'iface %(ifname)s %(proto)s static\n'
' address %(ip)s\n'
' netmask %(prefixlen)d\n'
' gateway %(gw)s\n'
' dns-nameservers %(dns)s\n' % {
'ifname': alias,
'proto': 'inet6' if ip.version == 6 else 'inet',
'ip': ip,
'prefixlen': prefixlen,
'gw': conf['gw6' if ip.version == 6 else 'gw4'],
'dns': dns})
# example:
# change_ip_ubuntu({
# u'02:00:00:02:A3:E8': {
# u'gw4': u'10.1.0.254', 'gw6': '2001::ffff',
# u'addresses': [u'10.1.0.84/24', '10.1.0.1/24', '2001::1/48']},
# u'02:00:00:02:A3:E9': {
# u'gw4': u'10.255.255.1', u'addresses': [u'10.255.255.9']}},
# '8.8.8.8')
def change_ip_rhel(interfaces, dns):
for ifname, conf in get_interfaces_linux(interfaces):
with open(ifcfg_template % ifname,
'w') as f:
f.write('DEVICE=%s\n'
'BOOTPROTO=none\n'
'USERCTL=no\n'
'ONBOOT=yes\n' % ifname)
for i in conf['addresses']:
ip_with_prefix = IPNetwork(i)
ip = ip_with_prefix.ip
if ip.version == 6:
f.write('IPV6INIT=yes\n'
'IPV6ADDR=%(ip)s/%(prefixlen)d\n'
'IPV6_DEFAULTGW=%(gw)s\n' % {
'ip': ip,
'prefixlen': ip_with_prefix.prefixlen,
'gw': conf['gw6']})
else:
f.write('NETMASK=%(netmask)s\n'
'IPADDR=%(ip)s\n'
'GATEWAY=%(gw)s\n' % {
'ip': ip,
'netmask': str(ip_with_prefix.netmask),
'gw': conf['gw4']})
def get_interfaces_windows(interfaces):
import wmi
nics = wmi.WMI().Win32_NetworkAdapterConfiguration(IPEnabled=True)
for nic in nics:
conf = interfaces.get(nic.MACAddress)
if conf:
yield nic, conf
def change_ip_windows(interfaces, dns):
for nic, conf in get_interfaces_windows(interfaces):
link_local = IPNetwork('fe80::/16')
new_addrs = [IPNetwork(ip) for ip in conf['addresses']]
new_addrs_str = set(str(ip) for ip in new_addrs)
old_addrs = [IPNetwork('%s/%s' % (ip, nic.IPSubnet[i]))
for i, ip in enumerate(nic.IPAddress)
if IPAddress(ip) not in link_local]
old_addrs_str = set(str(ip) for ip in old_addrs)
changed = (
new_addrs_str != old_addrs_str or
set(nic.DefaultIPGateway) != set([conf['gw4'], conf['gw6']]))
if changed or 1:
logger.info('new config for <%s(%s)>: %s', nic.Description,
nic.MACAddress, ', '.join(new_addrs_str))
# IPv4
ipv4_addrs = [str(ip.ip) for ip in new_addrs
if ip.version == 4]
ipv4_masks = [str(ip.netmask) for ip in new_addrs
if ip.version == 4]
logger.debug('<%s>.EnableStatic(%s, %s) called', nic.Description,
ipv4_addrs, ipv4_masks)
retval = nic.EnableStatic(
IPAddress=ipv4_addrs, SubnetMask=ipv4_masks)
assert retval == (0, )
nic.SetGateways(DefaultIPGateway=[conf['gw4']])
assert retval == (0, )
# IPv6
for ip in new_addrs:
if ip.version == 6 and str(ip) not in old_addrs_str:
logger.debug('add %s (%s)', ip, nic.Description)
check_output(
'netsh interface ipv6 add address '
'interface=%s address=%s'
% (nic.InterfaceIndex, ip), shell=True)
for ip in old_addrs:
if ip.version == 6 and str(ip) not in new_addrs_str:
logger.debug('delete %s (%s)', ip, nic.Description)
check_output(
'netsh interface ipv6 delete address '
'interface=%s address=%s'
% (nic.InterfaceIndex, ip.ip), shell=True)
try:
check_output('netsh interface ipv6 del route ::/0 interface=%s'
% nic.InterfaceIndex, shell=True)
except CalledProcessError:
pass
check_output('netsh interface ipv6 add route ::/0 interface=%s %s'
% (nic.InterfaceIndex, conf['gw6']), shell=True)
...@@ -2,3 +2,5 @@ Twisted==13.2.0 ...@@ -2,3 +2,5 @@ Twisted==13.2.0
pyserial==2.7 pyserial==2.7
psutil==1.2.1 psutil==1.2.1
uptime==3.0.1 uptime==3.0.1
netifaces==0.10.4
netaddr==0.7.12
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment