#!/usr/bin/env python # -*- coding: utf-8 vi:noet import sys, io, os, subprocess, multiprocessing import logging import multiprocessing.pool import random import hashlib import datetime import syslog logger = logging.getLogger(__name__) def random_name(): return datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f") def random_host(): hosts = os.environ["HOSTS"].split() return random.choice(hosts) def run_bad(name, host): cmd = f"""rsync --rsh=/usr/bin/ssh -Parisxz --copy-links xml_grammar.ii {host}:tmp/{name}.ii && /usr/bin/ssh {host} x86_64-pc-linux-gnu-g++ -c -o tmp/{name}.o tmp/{name}.ii""" #print(cmd) cmd = ["bash", "-c", cmd] env = os.environ.copy() env.update(LC_ALL="C") proc = subprocess.Popen(cmd, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = proc.communicate() res = proc.wait() logger.debug("bad: %s %s %s", res, out, err) if res != 0 and b"smashing" in err: return 0, (name, host, err) return 1, "" def run_good(): return 0, "" def main(): import argparse parser = argparse.ArgumentParser( description="Test script", ) parser.add_argument("--log-level", default="INFO", help="Logging level (eg. INFO, see Python logging docs)", ) args = parser.parse_args() logging.basicConfig( datefmt="%Y%m%dT%H%M%S", level=getattr(logging, args.log_level), format="%(asctime)-15s %(name)s %(levelname)s %(message)s" ) jobs = [] nb_attempts = 100 pool = multiprocessing.pool.Pool() for i in range(nb_attempts): p = pool.apply_async(run_good) jobs.append(p) name = random_name() host = random_host() p = pool.apply_async(run_bad, args=(name, host)) jobs.append(p) for i in range(nb_attempts): logger.info("Attempt %s", i) p, pc = jobs[2*i+0].get() if p == 1: pool.terminate() logger.info("Good failed") return 1 q, qc = jobs[2*i+1].get() if p == 0 and q == 0: pool.terminate() name, host, err = qc logger.info("Interesting: %s on %s", name, host) syslog.syslog("Interesting: %s on %s" % (name, host)) return 0 return 1 if __name__ == '__main__': ret = main() raise SystemExit(ret)