Looking at trying to minimize code changes for Python 3. For now we are keeping byte str() in py2 and unicode str() in py3. It's a pain to rewrite all string code to usee u'' for py2 compatibility. However we may need to revisit this for pexpect(). Created compatibility wrappers in util.py: BaseString (replacement for basestring) decode() (optionally decode utf-8 for py3) encode() (optionally encode utf-8 for py3) Also we've switched from the .iter*() flavors to their static alternatives for py2 (note they are iterators in py3!) Changed util.errRun and clean.sh to call decode()
69 lines
2.4 KiB
Python
69 lines
2.4 KiB
Python
"Module dependency utility functions for Mininet."
|
|
|
|
from mininet.util import quietRun, BaseString
|
|
from mininet.log import info, error, debug
|
|
from os import environ
|
|
|
|
def lsmod():
|
|
"Return output of lsmod."
|
|
return quietRun( 'lsmod' )
|
|
|
|
def rmmod( mod ):
|
|
"""Return output of lsmod.
|
|
mod: module string"""
|
|
return quietRun( [ 'rmmod', mod ] )
|
|
|
|
def modprobe( mod ):
|
|
"""Return output of modprobe
|
|
mod: module string"""
|
|
return quietRun( [ 'modprobe', mod ] )
|
|
|
|
OF_KMOD = 'ofdatapath'
|
|
OVS_KMOD = 'openvswitch_mod' # Renamed 'openvswitch' in OVS 1.7+/Linux 3.5+
|
|
TUN = 'tun'
|
|
|
|
def moduleDeps( subtract=None, add=None ):
|
|
"""Handle module dependencies.
|
|
subtract: string or list of module names to remove, if already loaded
|
|
add: string or list of module names to add, if not already loaded"""
|
|
subtract = subtract if subtract is not None else []
|
|
add = add if add is not None else []
|
|
if isinstance( subtract, BaseString ):
|
|
subtract = [ subtract ]
|
|
if isinstance( add, BaseString ):
|
|
add = [ add ]
|
|
for mod in subtract:
|
|
if mod in lsmod():
|
|
info( '*** Removing ' + mod + '\n' )
|
|
rmmodOutput = rmmod( mod )
|
|
if rmmodOutput:
|
|
error( 'Error removing ' + mod + ': "%s">\n' % rmmodOutput )
|
|
exit( 1 )
|
|
if mod in lsmod():
|
|
error( 'Failed to remove ' + mod + '; still there!\n' )
|
|
exit( 1 )
|
|
for mod in add:
|
|
if mod not in lsmod():
|
|
info( '*** Loading ' + mod + '\n' )
|
|
modprobeOutput = modprobe( mod )
|
|
if modprobeOutput:
|
|
error( 'Error inserting ' + mod +
|
|
' - is it installed and available via modprobe?\n' +
|
|
'Error was: "%s"\n' % modprobeOutput )
|
|
if mod not in lsmod():
|
|
error( 'Failed to insert ' + mod + ' - quitting.\n' )
|
|
exit( 1 )
|
|
else:
|
|
debug( '*** ' + mod + ' already loaded\n' )
|
|
|
|
|
|
def pathCheck( *args, **kwargs ):
|
|
"Make sure each program in *args can be found in $PATH."
|
|
moduleName = kwargs.get( 'moduleName', 'it' )
|
|
for arg in args:
|
|
if not quietRun( 'which ' + arg ):
|
|
error( 'Cannot find required executable %s.\n' % arg +
|
|
'Please make sure that %s is installed ' % moduleName +
|
|
'and available in your $PATH:\n(%s)\n' % environ[ 'PATH' ] )
|
|
exit( 1 )
|