summaryrefslogtreecommitdiff
path: root/Run/Que/client.py
diff options
context:
space:
mode:
Diffstat (limited to 'Run/Que/client.py')
-rwxr-xr-xRun/Que/client.py95
1 files changed, 95 insertions, 0 deletions
diff --git a/Run/Que/client.py b/Run/Que/client.py
new file mode 100755
index 0000000..8058a05
--- /dev/null
+++ b/Run/Que/client.py
@@ -0,0 +1,95 @@
+#!/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
+ ) as req:
+ pass
+ else:
+ with request.urlopen(
+ f"{args.host}/{args.target}", data=data, timeout=MAX_TIMEOUT
+ ) 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) 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)