| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 | #!/usr/bin/env python3import argparseimport osimport shleximport subprocessimport sysimport threadingimport yamlsys.path.insert(0, os.getcwd())import mkconfig# The default manifest fileMANIFEST = "manifest.yaml"# The default pubkeys filePUBKEYS = "pubkeys.yaml"# The TEEMS binaryTEEMS = "./teems"def launch(node, manifest, config, cmd, log_folder, epoch_time, num_epochs, num_WN):    manifestdata = manifest[node]    cmdline = ''    if 'launchprefix' in manifestdata:        cmdline = manifestdata['launchprefix'] + ' '    cmdline += TEEMS + " -k %s -n %s" % (manifestdata['sprvfile'], node)    if epoch_time:        cmdline+= ' -d ' + str(epoch_time)    if num_epochs:        cmdline+= ' -e ' + str(num_epochs)    if num_WN:        cmdline+= ' -w ' + str(num_WN)    if 'args' in manifestdata:        cmdline += ' ' + manifestdata['args']    log_name = None    stdout_file = subprocess.PIPE    if log_folder:        log_name = log_folder + node + ".log"        stdout_file = open(log_name, "a+")    print(cmdline)    proc = subprocess.Popen(shlex.split(cmdline) + cmd,        stdin=subprocess.PIPE, stdout=stdout_file,        stderr=subprocess.STDOUT, bufsize=0)    proc.stdin.write(config.encode('utf-8'))    if log_folder is None:        while True:            line = proc.stdout.readline()            if not line:                break            print(node + ": " + line.decode('utf-8'), end='', flush=True)    else:        stdout_file.close()if __name__ == "__main__":    aparse = argparse.ArgumentParser(        description='Launch TEEMS nodes'    )    aparse.add_argument('-m', default=MANIFEST,        help='manifest.yaml file')    aparse.add_argument('-p', default=PUBKEYS,        help='pubkeys.yaml file')    aparse.add_argument('-z', default=None,        help='override message size')    aparse.add_argument('-u', default=None,        help='override max number of users')    aparse.add_argument('-B', default=None,        help='override max number of outgoing private messages per user per epoch')    aparse.add_argument('-b', default=None,        help='override max number of incoming private messages per user per epoch')    aparse.add_argument('-C', default=None,        help='override max number of outgoing public messages per user per epoch')    aparse.add_argument('-c', default=None,        help='override max number of incoming public messages per user per epoch')    aparse.add_argument('-l', default=None,        help='log folder to store logs of each server in an experiment')    aparse.add_argument('-d', default=None,        help='Set epoch wait time in seconds')    aparse.add_argument('-e', default=None,        help='Set number of epochs')    aparse.add_argument('-w', default=None,        help='Set number of Waksman Networks to precompute before starting epochs')    aparse.add_argument('-r', default=None,        help='override if routing private channel messages (or public)')    aparse.add_argument('-n', nargs='*', help='nodes to include')    aparse.add_argument('cmd', nargs='*', help='experiment to run')    args = aparse.parse_args()    with open(args.m) as mf:        manifest = yaml.safe_load(mf)    params_overrides = {        'msg_size': args.z,        'user_count': args.u,        'priv_out': args.B,        'priv_in': args.b,        'pub_out': args.C,        'pub_in': args.c,        'private_routing': args.r    }    config = mkconfig.create_json(args.m, args.p, args.n, params_overrides)    # There must not be any newlines in the config json string    if "\n" in config:        print("Error: config.json must not contain embedded newlines")        sys.exit(1)    # Now add a trailing newline    config += "\n"    nodelist = args.n    if nodelist is None or len(nodelist) == 0:        nodelist = manifest.keys()    threadlist = []    for node in nodelist:        if node == "params":            continue        thread = threading.Thread(target=launch,            args=(node, manifest, config, args.cmd, args.l, args.d, args.e, args.w))        thread.start()        threadlist.append(thread)    for thread in threadlist:        thread.join()
 |