config/controllerconfig/controllerconfig/controllerconfig/config_management.py

160 lines
5.3 KiB
Python

"""
Copyright (c) 2017 Wind River Systems, Inc.
SPDX-License-Identifier: Apache-2.0
"""
import json
import netaddr
import os
import subprocess
import sys
import time
import configutilities.common.exceptions as cexeptions
import configutilities.common.utils as cutils
def is_valid_management_address(ip_address, management_subnet):
"""Determine whether a management address is valid."""
if ip_address == management_subnet.network:
print "Cannot use network address"
return False
elif ip_address == management_subnet.broadcast:
print "Cannot use broadcast address"
return False
elif ip_address.is_multicast():
print "Invalid address - multicast address not allowed"
return False
elif ip_address.is_loopback():
print "Invalid address - loopback address not allowed"
return False
elif ip_address not in management_subnet:
print "Address must be in the management subnet"
return False
else:
return True
def configure_management():
interface_list = list()
lldp_interface_list = list()
print "Enabling interfaces... ",
ip_link_output = subprocess.check_output(['ip', '-o', 'link'])
for line in ip_link_output.splitlines():
interface = line.split()[1].rstrip(':')
if interface != 'lo':
interface_list.append(interface)
subprocess.call(['ip', 'link', 'set', interface, 'up'])
print 'DONE'
wait_seconds = 120
delay_seconds = 5
print "Waiting %d seconds for LLDP neighbor discovery" % wait_seconds,
while wait_seconds > 0:
sys.stdout.write('.')
sys.stdout.flush()
time.sleep(delay_seconds)
wait_seconds -= delay_seconds
print ' DONE'
print "Retrieving neighbor details... ",
lldpcli_show_output = subprocess.check_output(
['sudo', 'lldpcli', 'show', 'neighbors', 'summary', '-f', 'json'])
lldp_interfaces = json.loads(lldpcli_show_output)['lldp'][0]['interface']
print "DONE"
print "\nAvailable interfaces:"
print "%-20s %s" % ("local interface", "remote port")
print "%-20s %s" % ("---------------", "-----------")
for interface in lldp_interfaces:
print "%-20s %s" % (interface['name'],
interface['port'][0]['id'][0]['value'])
lldp_interface_list.append(interface['name'])
for interface in interface_list:
if interface not in lldp_interface_list:
print "%-20s %s" % (interface, 'unknown')
print
while True:
user_input = raw_input("Enter management interface name: ")
if user_input in interface_list:
management_interface = user_input
break
else:
print "Invalid interface name"
continue
while True:
user_input = raw_input("Enter management address CIDR: ")
try:
management_cidr = netaddr.IPNetwork(user_input)
management_ip = management_cidr.ip
management_network = netaddr.IPNetwork(
"%s/%s" % (str(management_cidr.network),
str(management_cidr.prefixlen)))
if not is_valid_management_address(management_ip,
management_network):
continue
break
except (netaddr.AddrFormatError, ValueError):
print ("Invalid CIDR - "
"please enter a valid management address CIDR")
while True:
user_input = raw_input("Enter management gateway address [" +
str(management_network[1]) + "]: ")
if user_input == "":
user_input = management_network[1]
try:
ip_input = netaddr.IPAddress(user_input)
if not is_valid_management_address(ip_input,
management_network):
continue
management_gateway_address = ip_input
break
except (netaddr.AddrFormatError, ValueError):
print ("Invalid address - "
"please enter a valid management gateway address")
min_addresses = 8
while True:
user_input = raw_input("Enter System Controller subnet: ")
try:
system_controller_subnet = cutils.validate_network_str(
user_input, min_addresses)
break
except cexeptions.ValidateFail as e:
print "{}".format(e)
print "Disabling non-management interfaces... ",
for interface in interface_list:
if interface != management_interface:
subprocess.call(['ip', 'link', 'set', interface, 'down'])
print 'DONE'
print "Configuring management interface... ",
subprocess.call(['ip', 'addr', 'add', str(management_cidr), 'dev',
management_interface])
print "DONE"
print "Adding route to System Controller... ",
subprocess.call(['ip', 'route', 'add', str(system_controller_subnet),
'dev', management_interface, 'via',
str(management_gateway_address)])
print "DONE"
def main():
if not os.geteuid() == 0:
print "%s must be run with root privileges" % sys.argv[0]
exit(1)
try:
configure_management()
except KeyboardInterrupt:
print "\nAborted"