| #!/usr/bin/python |
| |
| """ |
| Create a network and start sshd(8) on each host. |
| |
| While something like rshd(8) would be lighter and faster, |
| (and perfectly adequate on an in-machine network) |
| the advantage of running sshd is that scripts can work |
| unchanged on mininet and hardware. |
| |
| In addition to providing ssh access to hosts, this example |
| demonstrates: |
| |
| - creating a convenience function to construct networks |
| - connecting the host network to the root namespace |
| - running server processes (sshd in this case) on hosts |
| """ |
| |
| from mininet.net import Mininet |
| from mininet.cli import CLI |
| from mininet.log import lg |
| from mininet.node import Node, OVSKernelSwitch |
| from mininet.topolib import TreeTopo |
| from mininet.link import Link |
| |
| def TreeNet( depth=1, fanout=2, **kwargs ): |
| "Convenience function for creating tree networks." |
| topo = TreeTopo( depth, fanout ) |
| return Mininet( topo, **kwargs ) |
| |
| def connectToRootNS( network, switch, ip, prefixLen, routes ): |
| """Connect hosts to root namespace via switch. Starts network. |
| network: Mininet() network object |
| switch: switch to connect to root namespace |
| ip: IP address for root namespace node |
| prefixLen: IP address prefix length (e.g. 8, 16, 24) |
| routes: host networks to route to""" |
| # Create a node in root namespace and link to switch 0 |
| root = Node( 'root', inNamespace=False ) |
| intf = Link( root, switch ).intf1 |
| root.setIP( ip, prefixLen, intf ) |
| # Start network that now includes link to root namespace |
| network.start() |
| # Add routes from root ns to hosts |
| for route in routes: |
| root.cmd( 'route add -net ' + route + ' dev ' + str( intf ) ) |
| |
| def sshd( network, cmd='/usr/sbin/sshd', opts='-D' ): |
| "Start a network, connect it to root ns, and run sshd on all hosts." |
| switch = network.switches[ 0 ] # switch to use |
| ip = '10.123.123.1' # our IP address on host network |
| routes = [ '10.0.0.0/8' ] # host networks to route to |
| connectToRootNS( network, switch, ip, 8, routes ) |
| for host in network.hosts: |
| host.cmd( cmd + ' ' + opts + '&' ) |
| print |
| print "*** Hosts are running sshd at the following addresses:" |
| print |
| for host in network.hosts: |
| print host.name, host.IP() |
| print |
| print "*** Type 'exit' or control-D to shut down network" |
| CLI( network ) |
| for host in network.hosts: |
| host.cmd( 'kill %' + cmd ) |
| network.stop() |
| |
| if __name__ == '__main__': |
| lg.setLogLevel( 'info') |
| net = TreeNet( depth=1, fanout=4, switch=OVSKernelSwitch ) |
| sshd( net ) |