#!/usr/bin/env python3 """ simple client for que.run """ import argparse import urllib.request as request import urllib.parse import time import subprocess import sys # set to something ridiculously high so we don't run into timeouts while polling # or waiting for a message MAX_TIMEOUT = 100000000 def main(argv=None): cli = argparse.ArgumentParser(description=__doc__) cli.add_argument( "--host", default="https://que.run", help="where que-server is running" ) cli.add_argument( "--poll", default=False, action="store_true", help="stream data from the que" ) cli.add_argument( "--then", help="when polling, run this shell command after each response, replacing '\que' with the target and '\msg' with the body of the response", ) cli.add_argument( "--serve", default=False, action="store_true", help="when posting to the que, do so continuously in a loop. this can be used for serving a webpage or other file continuously", ) cli.add_argument( "target", help="namespace and path of the que, like 'ns/path/subpath'" ) cli.add_argument( "infile", nargs="?", type=argparse.FileType("r"), help="data to put on the que. Use '-' for stdin, otherwise should be a readable file", ) if argv is None: args = cli.parse_args() else: args = cli.parse_args(argv) if args.infile: # send input data data = args.infile.read().encode("utf-8").strip() if args.serve: # loop until ^C while not time.sleep(1): with request.urlopen( f"{args.host}/{args.target}", data=data, timeout=MAX_TIMEOUT, headers={"User-Agent": "Que/Client"}, ) as req: pass else: with request.urlopen( f"{args.host}/{args.target}", data=data, timeout=MAX_TIMEOUT, headers={"User-Agent": "Que/Client"}, ) as req: pass else: # no input data, do a read instead params = urllib.parse.urlencode({"poll": args.poll}) url = f"{args.host}/{args.target}?{params}" with request.urlopen(url, headers={"User-Agent": "Que/Client"}) as req: if args.poll: while not time.sleep(1): msg = req.readline().decode("utf-8").strip() print(msg) if args.then: subprocess.run( args.then.replace("\msg", msg).replace("\que", args.target), shell=True, ) else: msg = req.read().decode("utf-8").strip() print(msg) if args.then: subprocess.run( args.then.replace("\msg", msg).replace("\que", args.target), shell=True, ) if __name__ == "__main__": try: main() except KeyboardInterrupt: print("Interrupted") sys.exit(0) except urllib.error.HTTPError as e: print(e) sys.exit(1) except http.client.IncompleteRead as e: print(e) sys.exit(1)