1
0
mirror of https://github.com/CumulusNetworks/ifupdown2.git synced 2024-05-06 15:54:50 +00:00
anuradhak de1ee6b022 Changes to replace clagid setting in the bonding driver with -
1. clag_enable flag in the bonding driver
2. And clagid in clagd

Ticket: CM-4091
Reviewed By:
Testing Done: yes

1. Two new commands have been introduced in clagctl - setclagid and showclagid.
These commands will be used by ifupdown2 to set and read/check the clagid.
2. In addition a bit will be maintained per-bond in the bonding driver to
indicate if a bond is a CLAG bond.
(cherry picked from commit cb160bad45d330fe5f544d0d9a40c1c77b9b563f)
2014-12-29 12:33:14 -08:00

352 lines
11 KiB
Python
Executable File

#!/usr/bin/python
import sys
import os
import re
import argparse
from collections import OrderedDict
lockfile="/run/network/.lock"
modules_configfile='/var/lib/ifupdownaddons/addons.conf'
modules_dir='/usr/share/ifupdownaddons'
addon_config = OrderedDict([('pre-up', []),
('up', []),
('post-up', []),
('pre-down', []),
('down', []),
('post-down', [])])
def read_modules_config():
with open(modules_configfile, 'r') as f:
lines = f.readlines()
for l in lines:
litems = l.rstrip(' \n').split(',')
operation = litems[0]
mname = litems[1]
addon_config[operation].append(mname)
def man_rst_header():
print '=========================='
print 'ifupdown-addons-interfaces'
print '=========================='
print '---------------------------------------------------------'
print 'ifupdown2 addon modules interface configuration'
print '---------------------------------------------------------'
print ':Author: roopa@cumulusnetworks.com'
print ':Date: 2013-09-25'
print ':Copyright: Copyright 2013 Cumulus Networks, Inc. All rights reserved.'
print ':Version: 0.1'
print ':Manual section: 5'
print '\n'
def man_rst_body():
print 'DESCRIPTION'
print '==========='
print (''' ifupdown2 addon modules add incremental functionality to
core ifupdown2 tool.
All installed addon modules are executed on every interface
listed in the interfaces file. Addon modules are installed under
/usr/share/ifupdownaddons. To see the list of active addon
modules, see ifaddon(8).
Addon modules add new attributes to the interfaces(5) file.
Below is a list of attribute options provided by each module.
These can be listed under each iface section in the interfaces(5)
file. ''')
print '\n'
def get_addon_modinfo(modules_dir):
""" load python modules from modules_dir
Default modules_dir is /usr/share/ifupdownmodules
"""
if not modules_dir in sys.path:
sys.path.append(modules_dir)
read_modules_config()
modinfo = {}
try:
for op, mlist in addon_config.items():
for mname in mlist:
if mname in modinfo.keys(): continue
mpath = modules_dir + '/' + mname + '.py'
if os.path.exists(mpath):
try:
m = __import__(mname)
mclass = getattr(m, mname)
except:
pass
continue
minstance = mclass()
if hasattr(minstance, 'get_modinfo'):
modinfo[mname] = minstance.get_modinfo()
except:
raise
return modinfo
def print_long_string(indent, strarg):
slen = 70 - len(indent)
tmphelpstr = strarg
l = len(strarg)
while l > 0:
rem = slen if l >= slen else l
print('%s%s' %(indent, tmphelpstr[:rem]))
tmphelpstr = tmphelpstr[rem:].strip()
l -= rem
def man_rst_examples():
print 'EXAMPLES'
print '========'
print ''' Listed below are addon modules and their supported attributes.
The attributes if applicable go under the iface section in the
interfaces(5) file.\n'''
indent = ' '
modinfo = get_addon_modinfo(modules_dir)
for m, mdict in modinfo.items():
aindent = indent + ' '
aindentplus = aindent + ' '
if not mdict:
continue
print_long_string(indent, '**%s**: %s' %(m, mdict.get('mhelp', '')))
attrdict = mdict.get('attrs')
if not attrdict:
continue
print '\n'
try:
for attrname, attrvaldict in attrdict.items():
if attrvaldict.get('compat', False):
continue
print('%s**%s**\n' %(aindent, attrname))
print_long_string(aindentplus, '**help**: %s'
%(attrvaldict.get('help', '')))
print '\n'
print('%s**required**: %s\n' %(aindentplus,
attrvaldict.get('required', False)))
default = attrvaldict.get('default')
if default:
print('%s**default**: %s\n' %(aindentplus, default))
validrange = attrvaldict.get('validrange')
if validrange:
print('%svalidrange: %s\n'
%(aindentplus, '-'.join(validrange)))
validvals = attrvaldict.get('validvals')
if validvals:
print('%s**validvals**: %s\n'
%(aindentplus, ','.join(validvals)))
examples = attrvaldict.get('example')
if not examples:
continue
print '%s**example**:' %(aindentplus)
for e in examples:
print '%s%s\n' %(aindentplus + indent, e)
print ''
except Exception, e:
print "Roopa: m = %s, str(e) = %s\n" %(m, str(e))
pass
print ''
def man_rst_see_also():
print 'SEE ALSO'
print '========'
print ''' interfaces(5),
ifup(8),
ip(8),
mstpctl(8),
brctl(8),
ethtool(8),
clagctl(8)'''
def show_man_rst():
man_rst_header()
man_rst_body()
man_rst_examples()
man_rst_see_also()
def show():
for operation, mlist in addon_config.items():
postion = 1
for m in mlist:
print '%d. %s' %(postion, m)
postion += 1
def write_modules_config():
with open(modules_configfile, 'w') as f:
for op, mlist in addon_config.items():
[f.write('%s,%s\n' %(op, m)) for m in mlist]
def process_add_cmd(args):
op = args.operation
module = args.module
position = args.position
if not op:
for k, vlist in addon_config.items():
if module not in vlist:
addon_config[k].append(module)
else:
print '%s: module %s already present' %(k, module)
return
if module in addon_config.get(op):
print 'module already present'
return
if position:
try:
addon_config[op].insert(position, module)
except Exception, e:
print ('error inserting module %s at postion %s (%s)'
%(module, position, str(e)))
raise
else:
addon_config[op].append(module)
def process_del_cmd(args):
op = args.operation
module = args.module
if op:
del addon_config[op]
else:
try:
[addon_config[op].remove(module) for op in addon_config.keys()]
except ValueError:
pass
def process_move_cmd(args):
op = args.operation
module = args.module
pos = 0
try:
pos = int(args.position)
if pos < 0 or pos > len(addon_config.get(op)):
raise Exception('invalid value for position')
except:
raise
if addon_config[op].index(module) == pos:
print '%s module %s already at location %d' %(op, module, pos)
return
addon_config[op].remove(module)
addon_config[op].insert(pos, module)
def print_mlist(mlist, indent):
for idx, val in enumerate(mlist):
print '%s%d. %s' %(indent, idx, val)
def process_show_cmd(args):
indent = ' '
op = args.operation
if args.man:
show_man_rst()
return
if op:
mlist = addon_config[op]
print '%s:' %op
print_mlist(mlist, indent)
else:
for op, mlist in addon_config.items():
print '%s:' %op
print_mlist(mlist, indent)
print ''
cmdhandlers = {'add' : process_add_cmd,
'del' : process_del_cmd,
'move' : process_move_cmd,
'show' : process_show_cmd}
def update_subparser_add(subparser):
subparser.add_argument('module', metavar='MODULE', help='module name')
subparser.add_argument('operation', metavar='OPERATION',
choices=['pre-up', 'up', 'post-up',
'pre-down', 'down', 'post-down'],
help='operations', nargs='?')
subparser.add_argument('position', metavar='POSITION', nargs='?',
help='position')
subparser.set_defaults(func=process_add_cmd)
def update_subparser_del(subparser):
subparser.add_argument('module', metavar='MODULE', help='module name')
subparser.add_argument('operation', metavar='OPERATION',
choices=['pre-up', 'up', 'post-up',
'pre-down', 'down', 'post-down'],
help='operations', nargs='?')
subparser.add_argument('position', metavar='POSITION', nargs='?',
help='position')
subparser.set_defaults(func=process_del_cmd)
def update_subparser_move(subparser):
subparser.add_argument('module', metavar='MODULE', help='module name')
subparser.add_argument('operation', metavar='OPERATION',
choices=['pre-up', 'up', 'post-up',
'pre-down', 'down', 'post-down'],
help='operations')
subparser.add_argument('position', metavar='POSITION',
help='position')
subparser.set_defaults(func=process_move_cmd)
def update_subparser_show(subparser):
subparser.add_argument('--man', action='store_true',
help=argparse.SUPPRESS)
subparser.add_argument('operation', metavar='OPERATION',
choices=addon_config.keys(),
help='operations %s' %str(addon_config.keys()),
nargs='?')
subparser.set_defaults(func=process_show_cmd)
def update_argparser(argparser):
subparsers = argparser.add_subparsers(help='sub-command help')
parser_add = subparsers.add_parser('add')
update_subparser_add(parser_add)
parser_del = subparsers.add_parser('del', help='del help')
update_subparser_del(parser_del)
parser_move = subparsers.add_parser('move', help='move help')
update_subparser_move(parser_move)
parser_show = subparsers.add_parser('show', help='show help')
update_subparser_show(parser_show)
def parse_args(argsv):
descr = 'ifupdown addon modules management command.\n \
This command helps add/del/display/reorder modules \n \
in all ifupdown module categories'
argparser = argparse.ArgumentParser(description=descr)
update_argparser(argparser)
args = argparser.parse_args(argsv)
return args
def main(argv):
""" main function """
try:
# Command line arg parser
args = parse_args(argv[1:])
read_modules_config()
args.func(args)
write_modules_config()
except Exception, e:
print 'error processing command (%s)' %str(e)
if __name__ == "__main__":
if not os.geteuid() == 0:
print 'Error: Must be root to run this command'
exit(1)
main(sys.argv)