61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
"""
|
|
Terminal creation and cleanup.
|
|
Utility functions to run a term (connected via screen(1)) on each host.
|
|
|
|
Requires GNU screen(1) and xterm(1).
|
|
Optionally uses gnome-terminal.
|
|
"""
|
|
|
|
import re
|
|
from subprocess import Popen
|
|
|
|
from mininet.log import error
|
|
from mininet.util import quietRun
|
|
|
|
def quoteArg( arg ):
|
|
"Quote an argument if it contains spaces."
|
|
return repr( arg ) if ' ' in arg else arg
|
|
|
|
def makeTerm( node, title='Node', term='xterm' ):
|
|
"""Run screen on a node, and hook up a terminal.
|
|
node: Node object
|
|
title: base title
|
|
term: 'xterm' or 'gterm'
|
|
returns: process created"""
|
|
title += ': ' + node.name
|
|
if not node.inNamespace:
|
|
title += ' (root)'
|
|
cmds = {
|
|
'xterm': [ 'xterm', '-title', title, '-e' ],
|
|
'gterm': [ 'gnome-terminal', '--title', title, '-e' ]
|
|
}
|
|
if term not in cmds:
|
|
error( 'invalid terminal type: %s' % term )
|
|
return
|
|
if not node.execed:
|
|
node.cmd( 'screen -dmS ' + 'mininet.' + node.name)
|
|
args = [ 'screen', '-D', '-RR', '-S', 'mininet.' + node.name ]
|
|
else:
|
|
args = [ 'sh', '-c', 'exec tail -f /tmp/' + node.name + '*.log' ]
|
|
if term == 'gterm':
|
|
# Compress these for gnome-terminal, which expects one token
|
|
# to follow the -e option
|
|
args = [ ' '.join( [ quoteArg( arg ) for arg in args ] ) ]
|
|
return Popen( cmds[ term ] + args )
|
|
|
|
def cleanUpScreens():
|
|
"Remove moldy old screen sessions."
|
|
r = r'(\d+\.mininet\.[hsc]\d+)'
|
|
output = quietRun( 'screen -ls' ).split( '\n' )
|
|
for line in output:
|
|
m = re.search( r, line )
|
|
if m:
|
|
quietRun( 'screen -S ' + m.group( 1 ) + ' -X quit' )
|
|
|
|
def makeTerms( nodes, title='Node', term='xterm' ):
|
|
"""Create terminals.
|
|
nodes: list of Node objects
|
|
title: base title for each
|
|
returns: list of created terminal processes"""
|
|
return [ makeTerm( node, title, term ) for node in nodes ]
|