From 8864a4018c9b9088f330c3ef24ed7b5313ec36a2 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Mon, 8 Apr 2013 13:25:44 -0400 Subject: Added -j option to send jabber update messages. --- run/experiment.py | 2 +- run/jabber.py | 40 ++++++++++++++++++++++++++++++++++++++++ run_exps.py | 26 ++++++++++++++++++++++++-- 3 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 run/jabber.py diff --git a/run/experiment.py b/run/experiment.py index ecb0241..03d6ab6 100644 --- a/run/experiment.py +++ b/run/experiment.py @@ -52,7 +52,7 @@ class Experiment(object): self.log("Enabling sched_trace") self.tracers.append( SchedTracer(working_dir) ) if LinuxTracer.enabled(): - self.log("Enabling trace-cmd / ftrace / kernelshark") + self.log("Enabling trace-cmd") self.tracers.append( LinuxTracer(working_dir) ) if LogTracer.enabled(): self.log("Enabling logging") diff --git a/run/jabber.py b/run/jabber.py new file mode 100644 index 0000000..c9dd097 --- /dev/null +++ b/run/jabber.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +import os +import sys +import xmpp + +class Jabber(object): + def __init__(self, target): + self.target = target + self.client = self.__create_client() + + def __create_client(self): + params = {} + conf_file = os.environ['HOME'] + '/.xsend' + + if os.access(conf_file, os.R_OK): + for line in open(conf_file, 'r').readlines(): + key, val = line.strip().split('=', 1) + params[key.lower()] = val + + for field in ['login', 'password']: + if field not in params.keys(): + with open(conf_file, 'wc') as f: + f.write('#LOGIN=romeo@montague.net\n#PASSWORD=juliet\n') + raise IOError("Please ensure the ~/.xsend file has valid "+\ + "credentials for sending messages.") + + jid = xmpp.protocol.JID(params['login']) + client = xmpp.Client(jid.getDomain(), debug=[]) + + client.connect(server=(jid.getDomain(), 5223)) + client.auth(jid.getNode(), params['password']) + + sys.stderr.write(("Jabber client loaded. Add '%s' to your friends " + \ + "or Jabber messages will not send") % params['login']) + + return client + + def send(self, text): + message = xmpp.protocol.Message(to=self.target, body=text, typ='chat') + self.client.send(message) diff --git a/run_exps.py b/run_exps.py index dd75999..c51f4c6 100755 --- a/run_exps.py +++ b/run_exps.py @@ -6,6 +6,7 @@ import config.config as conf import os import re import shutil +import sys import traceback from collections import namedtuple @@ -56,6 +57,9 @@ def parse_args(): default=conf.DEFAULTS['sched_file']) parser.add_option('-f', '--force', action='store_true', default=False, dest='force', help='overwrite existing data') + parser.add_option('-j', '--jabber', metavar='username@domain', + dest='jabber', default=None, + help='send a jabber message when an experiment completes') return parser.parse_args() @@ -120,7 +124,7 @@ def verify_environment(kernel, copts): raise InvalidConfig(results) def load_experiment(sched_file, scheduler, duration, - param_file, out_dir, ignore): + param_file, out_dir, ignore, jabber): if not os.path.isfile(sched_file): raise IOError("Cannot find schedule file: %s" % sched_file) @@ -161,6 +165,9 @@ def load_experiment(sched_file, scheduler, duration, run_exp(exp_name, schedule, scheduler, kernel, duration, work_dir, out_dir) + if jabber: + jabber.send("Completed '%s'" % exp_name) + # Save parameters used to run experiment in out_dir out_params = dict(params.items() + [(conf.PARAMS['sched'], scheduler), @@ -228,6 +235,16 @@ def run_exp(name, schedule, scheduler, kernel, duration, work_dir, out_dir): exp.run_exp() +def setup_jabber(target): + try: + from run.jabber import Jabber + + return Jabber(target) + except ImportError: + sys.stderr.write("Failed to import jabber. Is python-xmpppy "+\ + "installed?\nDisabling Jabber messaging.\n") + return None + def main(): opts, args = parse_args() @@ -248,6 +265,11 @@ def main(): failed = 0 invalid = 0 + if opts.jabber: + jabber = setup_jabber(opts.jabber) + else: + jabber = None + for exp in args: path = "%s/%s" % (os.getcwd(), exp) out_dir = "%s/%s" % (out_base, os.path.split(exp.strip('/'))[1]) @@ -263,7 +285,7 @@ def main(): try: load_experiment(path, scheduler, duration, param_file, - out_dir, opts.ignore) + out_dir, opts.ignore, jabber) succ += 1 except ExperimentDone: done += 1 -- cgit v1.2.2