Hi Simon,
The n-liner is:
import subprocess
import logging
import mitogen.utils
def main(router):
# http://mitogen.readthedocs.io/en/latest/api.html#context-factories
remote_host = router.ssh(hostname='myvps.mycorp.com')
root = router.sudo(via=remote_host, username='root', password='god')
rc = root.call(subprocess.check_call, 'ifconfig lo', shell=True)
print 'Command return code was:', rc
logging.basicConfig(level=logging.INFO)
mitogen.utils.run_with_router(main)
Which gives me:
INFO:mitogen.ctx.local.22050:stdout: lo Link encap:Local Loopback
INFO:mitogen.ctx.local.22050:stdout: inet addr:127.0.0.1 Mask:255.0.0.0
INFO:mitogen.ctx.local.22050:stdout: inet6 addr: ::1/128 Scope:Host
INFO:mitogen.ctx.local.22050:stdout: UP LOOPBACK RUNNING MTU:65536 Metric:1
INFO:mitogen.ctx.local.22050:stdout: RX packets:323421007 errors:0 dropped:0 overruns:0 frame:0
INFO:mitogen.ctx.local.22050:stdout: TX packets:323421007 errors:0 dropped:0 overruns:0 carrier:0
INFO:mitogen.ctx.local.22050:stdout: collisions:0 txqueuelen:1
INFO:mitogen.ctx.local.22050:stdout: RX bytes:109087018382 (101.5 GiB) TX bytes:109087018382 (101.5 GiB)
INFO:mitogen.ctx.local.22050:stdout:
Command return code was: 0
Seems context name generation has broken :/ But it's running on the remote machine, you get the idea.
I'm working on a "mitop" example utility that implements a multi-host top replacement, with hierarchical statistical roll-ups, and documenting the implementation of that will be the basis for the Getting Started guide, but it depends on a bunch of stuff I'm not ready to work on (async connect), while there are still critical issues where hangs may still occur due due to an exception, and basic stuff like module preloading being incomplete (currently day 13 of working on that).
It will come eventually, but it will likely encourage many more bug reports than my hands can respond to once it is written, so it is kind of a feature that it is missing right now. :)