From 3ce312e3ffa1325ce61b32df8e6480b25134d839 Mon Sep 17 00:00:00 2001 From: Michael Woods Date: Sat, 15 Feb 2025 17:10:40 -0500 Subject: [PATCH] jobsession convenience class --- src/packetserver/__init__.py | 2 +- src/packetserver/client/jobs.py | 51 +++++++++++++++++++++++++---- src/packetserver/server/__init__.py | 2 ++ 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/packetserver/__init__.py b/src/packetserver/__init__.py index bc58dac..3881f00 100644 --- a/src/packetserver/__init__.py +++ b/src/packetserver/__init__.py @@ -1 +1 @@ -VERSION="0.2-alpha" \ No newline at end of file +VERSION="0.3.0-alpha" \ No newline at end of file diff --git a/src/packetserver/client/jobs.py b/src/packetserver/client/jobs.py index a7a46da..45ce421 100644 --- a/src/packetserver/client/jobs.py +++ b/src/packetserver/client/jobs.py @@ -1,7 +1,8 @@ from packetserver.client import Client -from packetserver.common import Request, Response +from packetserver.common import Request, Response, PacketServerConnection from typing import Union, Optional import datetime +import time class JobWrapper: def __init__(self, data: dict): @@ -50,19 +51,29 @@ class JobWrapper: return datetime.datetime.fromisoformat(self.data['created_at']) @property - def started(self) -> datetime.datetime: - return datetime.datetime.fromisoformat(self.data['started_at']) + def started(self) -> Optional[datetime.datetime]: + if not self.data['created_at']: + return None + return datetime.datetime.fromisoformat(self.data['created_at']) @property - def finished(self) -> datetime.datetime: + def finished(self) -> Optional[datetime.datetime]: + if not self.data['finished_at']: + return None return datetime.datetime.fromisoformat(self.data['finished_at']) + @property + def is_finished(self) -> bool: + if self.finished is not None: + return True + return False + @property def id(self) -> int: return self.data['id'] - - + def __repr__(self): + return f"" def send_job(client: Client, bbs_callsign: str, cmd: Union[str, list]) -> int: """Send a job using client to bbs_callsign with args cmd. Return remote job_id.""" @@ -83,3 +94,31 @@ def get_job_id(client: Client, bbs_callsign: str, job_id: int, get_data=True) -> if response.status_code != 200: raise RuntimeError(f"Sending job failed: {response.status_code}: {response.payload}") return JobWrapper(response.payload) + +class JobSession: + def __init__(self, client: Client, bbs_callsign: str, default_timeout: int = 300, stutter: int = 3): + self.client = client + self.bbs = bbs_callsign + self.timeout = default_timeout + self.stutter = stutter + + def connect(self) -> PacketServerConnection: + return self.client.new_connection(self.bbs) + + def send(self, cmd: Union[str, list]) -> int: + return send_job(self.client, self.bbs, cmd) + + def get_id(self, jid: int) -> JobWrapper: + return get_job_id(self.client, self.bbs, jid) + + def run_job(self, cmd: Union[str, list]) -> JobWrapper: + jid = self.send(cmd) + time.sleep(self.stutter) + j = self.get_id(jid) + while not j.is_finished: + time.sleep(self.stutter) + j = self.get_id(jid) + return j + + + diff --git a/src/packetserver/server/__init__.py b/src/packetserver/server/__init__.py index 32e597e..1c8800b 100644 --- a/src/packetserver/server/__init__.py +++ b/src/packetserver/server/__init__.py @@ -25,6 +25,8 @@ from threading import Thread from packetserver.server.jobs import get_orchestrator_from_config, Job, JobStatus from packetserver.runner import RunnerStatus, RunnerFile, Orchestrator, Runner +VERSION="0.2.0-alpha" + def init_bulletins(root: PersistentMapping): if 'bulletins' not in root: root['bulletins'] = PersistentList()