--- /dev/null
+import contextlib
+import logging
+import os
+import re
+import subprocess
+
+from teuthology import misc as teuthology
+from ..orchestra import run
+
+log = logging.getLogger(__name__)
+
+@contextlib.contextmanager
+def task(ctx, config):
+ if config is None:
+ config = {}
+ for _, roles_for_host in ctx.cluster.remotes.iteritems():
+ config[roles_for_host[0]] = {}
+ assert isinstance(config, dict)
+
+ log.info('Console config is %s', config)
+
+ procs = {}
+ if ctx.archive is not None:
+ path = os.path.join(ctx.archive, 'console')
+ os.makedirs(path)
+
+ for role in config.iterkeys():
+ # figure out ipmi host
+ (rem, ) = ctx.cluster.only(role).remotes.keys()
+ log.info(' role %s remote %s', role, rem)
+ match = re.search('@((plana|burnupi)\d\d)\.', rem.name);
+ if match:
+ host = match.group(1) + '.ipmi.sepia.ceph.com'
+ htype = match.group(2)
+ log.info('Attaching to console on %s', host)
+ subprocess.call([
+ 'ipmitool',
+ '-I', 'lanplus',
+ '-U', htype + 'temp',
+ '-P', htype + 'temp',
+ '-H', host,
+ 'sol', 'deactivate'
+ ])
+ procs[rem] = subprocess.Popen(
+ args=[
+ 'ipmitool',
+ '-I', 'lanplus',
+ '-U', htype + 'temp',
+ '-P', htype + 'temp',
+ '-H', host,
+ 'sol', 'activate'
+ ],
+ stdout=open(os.path.join(path, host), 'w'),
+ stderr=open(os.devnull, 'w'),
+ stdin=subprocess.PIPE,
+ )
+
+ try:
+ yield
+ finally:
+ for rem, proc in procs.iteritems():
+ log.info('Terminating %s console', rem.name)
+ proc.stdin.write('~.\n')
+ proc.wait()