diff options
author | Jonathan Weth <git@jonathanweth.de> | 2020-07-24 13:16:54 +0200 |
---|---|---|
committer | Jonathan Weth <git@jonathanweth.de> | 2020-07-24 13:16:54 +0200 |
commit | 1ab805a06575658d99954ef3f559a6788f9156a7 (patch) | |
tree | 1ec7c64d6f7ee98add9347087f4aea573c2fb90f | |
parent | 81e570931adc37054460e3f05d0325888050e386 (diff) | |
download | RWA.Support.SessionService-1ab805a06575658d99954ef3f559a6788f9156a7.tar.gz RWA.Support.SessionService-1ab805a06575658d99954ef3f559a6788f9156a7.tar.bz2 RWA.Support.SessionService-1ab805a06575658d99954ef3f559a6788f9156a7.zip |
Add system for handling jobs (like file upload/download etc.)
-rw-r--r-- | session.py | 38 |
1 files changed, 38 insertions, 0 deletions
@@ -3,6 +3,7 @@ import random import secrets import signal import string +import subprocess import threading import psutil @@ -18,12 +19,23 @@ BASE_URL = API_SERVER + "/app/rwa/api/" REGISTER_URL = BASE_URL + "register/" STOP_URL = BASE_URL + "stop/" STATUS_URL = BASE_URL + "status/" +MARK_JOB_AS_DONE_URL = BASE_URL + "jobs/mark_as_done/" def random_digits(length: int): return "".join(random.choice(string.digits) for _ in range(length)) +def get_desktop_dir(): + """Get desktop directory from xdg vars.""" + return ( + subprocess.check_output(["xdg-user-dir", "DESKTOP"]) + .decode() + .strip() + .replace("\n", "") + ) + + class ServerThread(threading.Thread): def __init__(self, app, port: int): super().__init__() @@ -46,7 +58,9 @@ class Session: STATUS_JOINED = "active" def __init__(self, mockup_session: bool): + self.done_jobs = [] self.mockup_session = mockup_session + self.desktop_dir = get_desktop_dir() self._generate_password() self._start_vnc() self._start_trigger_service() @@ -158,6 +172,30 @@ class Session: self.stop(triggered=True) else: self.status_text = r.json()["status"] + self.jobs = r.json()["jobs"] + self._do_jobs() + + def _do_jobs(self): + """Go through all jobs and execute undone ones.""" + for job in self.jobs: + if not job["done"] or job["job_id"] in self.done_jobs: + job_type = job["job_type"] + if job_type == "file": + self._do_file_job(job) + + def _do_file_job(self, job): + """Download a file from server to the user's desktop.""" + subprocess.Popen(["wget", job["file"], "-P", self.desktop_dir]) + self._mark_job_as_done(job) + + def _mark_job_as_done(self, job): + """Mark a job as done (in this service and on the server).""" + self.done_jobs.append(job["job_id"]) + requests.post( + MARK_JOB_AS_DONE_URL, + params={"id": job["job_id"]}, + headers=self._api_headers, + ) def push(self): """Update status: Push status to Django.""" |