aboutsummaryrefslogtreecommitdiff
path: root/rwa/support/sessionservice
diff options
context:
space:
mode:
authorJonathan Weth <git@jonathanweth.de>2021-06-28 11:01:45 +0200
committerJonathan Weth <git@jonathanweth.de>2021-06-28 11:01:45 +0200
commit9ec08cbc84b01ce82f58892556637d8934ede0a5 (patch)
treee0b3642801305d60f45359b5c9364f5a5318ba18 /rwa/support/sessionservice
parent3526def9614ac5275f176a42938d11736233f108 (diff)
downloadRWA.Support.SessionService-9ec08cbc84b01ce82f58892556637d8934ede0a5.tar.gz
RWA.Support.SessionService-9ec08cbc84b01ce82f58892556637d8934ede0a5.tar.bz2
RWA.Support.SessionService-9ec08cbc84b01ce82f58892556637d8934ede0a5.zip
Support multiple hosts
Diffstat (limited to 'rwa/support/sessionservice')
-rw-r--r--rwa/support/sessionservice/config.py5
-rwxr-xr-xrwa/support/sessionservice/service.py74
-rw-r--r--rwa/support/sessionservice/session.py28
3 files changed, 90 insertions, 17 deletions
diff --git a/rwa/support/sessionservice/config.py b/rwa/support/sessionservice/config.py
index f0f8369..4f39a4e 100644
--- a/rwa/support/sessionservice/config.py
+++ b/rwa/support/sessionservice/config.py
@@ -23,8 +23,13 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
+import usersettings
from dynaconf import Dynaconf
settings = Dynaconf(
envvar_prefix="RWA", settings_files=["/etc/rwa/support/sessionservice/settings.toml"]
)
+
+user_settings = usersettings.Settings("org.ArcticaProject.RWASupportSessionService")
+user_settings.add_setting("web_app_hosts", list, ["http://127.0.0.1:8000"])
+user_settings.load_settings()
diff --git a/rwa/support/sessionservice/service.py b/rwa/support/sessionservice/service.py
index c50da26..4798df6 100755
--- a/rwa/support/sessionservice/service.py
+++ b/rwa/support/sessionservice/service.py
@@ -38,6 +38,7 @@ import dbus.mainloop.glib
import dbus.service
from gi.repository import GLib
+from .config import user_settings
from .lock import is_locked, lock, unlock
from .session import Session
from .trigger import TriggerServerThread
@@ -76,10 +77,73 @@ class RWASupportSessionService(dbus.service.Object):
logging.info("D-Bus service has been started.")
+ def _get_web_app_hosts(self) -> str:
+ """Get all registered RWA.Support.WebApp hosts.
+
+ Helper function: No D-Bus API.
+ """
+ hosts = user_settings.web_app_hosts
+ return json.dumps(hosts)
+
@dbus.service.method("org.ArcticaProject.RWASupportSessionService", out_signature="s")
- def start(self) -> str:
+ def get_web_app_hosts(self) -> str:
+ """Get all registered RWA.Support.WebApp hosts.
+
+ :return: All registered hosts as JSON array (D-Bus string)
+
+ **Structure of returned JSON:**
+
+ ::
+
+ ["https://example.org", "http://127.0.0.1:8000"]
+ """
+ return self._get_web_app_hosts()
+
+ @dbus.service.method(
+ "org.ArcticaProject.RWASupportSessionService", in_signature="s", out_signature="s"
+ )
+ def add_web_app_host(self, host: str) -> str:
+ """Add a RWA.Support.WebApp host.
+
+ :param host: Exact hostname of the RWA.Support.WebApp host (D-Bus string)
+ :return: All registered hosts as JSON array (D-Bus string)
+
+ **Structure of returned JSON:**
+
+ ::
+
+ ["https://example.org", "http://127.0.0.1:8000"]
+ """
+ user_settings.web_app_hosts.append(host)
+ user_settings.save_settings()
+ return self._get_web_app_hosts()
+
+ @dbus.service.method(
+ "org.ArcticaProject.RWASupportSessionService", in_signature="i", out_signature="s"
+ )
+ def remove_web_app_host(self, idx: int) -> str:
+ """Remove a RWA.Support.WebApp host.
+
+ :param idx: Index of web app host (D-Bus integer)
+ :return: All registered hosts as JSON array (D-Bus string)
+
+ **Structure of returned JSON:**
+
+ ::
+
+ ["https://example.org", "http://127.0.0.1:8000"]
+ """
+ del user_settings.web_app_hosts[idx]
+ user_settings.save_settings()
+ return self._get_web_app_hosts()
+
+ @dbus.service.method(
+ "org.ArcticaProject.RWASupportSessionService", in_signature="i", out_signature="s"
+ )
+ def start(self, host_idx: int) -> str:
"""Start a new remote session and register it in RWA.Support.WebApp.
+ :param host_idx: Index of web app host (D-Bus integer)
:return: Result as JSON (D-Bus string)
**Structure of returned JSON (success):**
@@ -103,10 +167,16 @@ class RWASupportSessionService(dbus.service.Object):
"session, so this session won't be started."
)
return json.dumps({"status": "error", "type": "multiple"})
+ print(host_idx, user_settings.web_app_hosts)
+
+ try:
+ host = user_settings.web_app_hosts[host_idx]
+ except IndexError:
+ return json.dumps({"status": "error", "type": "host_not_found"})
# Start session
try:
- session = Session(self.trigger_service.port, self.mockup_mode)
+ session = Session(host, self.trigger_service.port, self.mockup_mode)
# Add session to sessions list
self.sessions[session.pid] = session
diff --git a/rwa/support/sessionservice/session.py b/rwa/support/sessionservice/session.py
index e603568..81584ea 100644
--- a/rwa/support/sessionservice/session.py
+++ b/rwa/support/sessionservice/session.py
@@ -35,20 +35,10 @@ import port_for
import psutil
import requests
-from .config import settings
from .lock import TEMP_DIR_PATH
from .log import logging
from .vnc import run_vnc, save_password
-API_SERVER = settings.get("api_url", "http://127.0.0.1")
-BASE_URL = API_SERVER + "/app/rwasupport/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/"
-
-logging.info(f"Load API config: {API_SERVER}")
-
def random_digits(length: int):
return "".join(secrets.choice(string.digits) for _ in range(length))
@@ -67,7 +57,15 @@ class Session:
#: Remote has joined the session
STATUS_JOINED = "active"
- def __init__(self, trigger_port: int, mockup_session: bool = False):
+ def __init__(self, host: str, trigger_port: int, mockup_session: bool = False):
+ self.host = host
+ self.BASE_URL = self.host + "/app/rwasupport/api/"
+ self.REGISTER_URL = self.BASE_URL + "register/"
+ self.STOP_URL = self.BASE_URL + "stop/"
+ self.STATUS_URL = self.BASE_URL + "status/"
+ self.MARK_JOB_AS_DONE_URL = self.BASE_URL + "jobs/mark_as_done/"
+ logging.info(f"Load API config: {self.host}")
+
self.trigger_token = secrets.token_urlsafe(20)
self.trigger_port = trigger_port
self.done_jobs = []
@@ -136,7 +134,7 @@ class Session:
if not self.mockup_session:
try:
r = requests.post(
- REGISTER_URL,
+ self.REGISTER_URL,
json={
"port": self.ws_port,
"pid": self.vnc_pid,
@@ -185,7 +183,7 @@ class Session:
if not self.mockup_session:
try:
r = requests.get(
- STATUS_URL, params={"id": self.session_id}, headers=self._api_headers
+ self.STATUS_URL, params={"id": self.session_id}, headers=self._api_headers
)
logging.info(
@@ -222,7 +220,7 @@ class Session:
self.done_jobs.append(job["job_id"])
try:
r = requests.post(
- MARK_JOB_AS_DONE_URL, params={"id": job["job_id"]}, headers=self._api_headers,
+ self.MARK_JOB_AS_DONE_URL, params={"id": job["job_id"]}, headers=self._api_headers,
)
logging.info(
f"The session has marked the job {job} as done in RWA.Support.WebApp "
@@ -266,7 +264,7 @@ class Session:
if not triggered:
try:
r = requests.post(
- STOP_URL, params={"id": self.session_id}, headers=self._api_headers
+ self.STOP_URL, params={"id": self.session_id}, headers=self._api_headers
)
logging.info(
"The stop action has been registered in RWA.Support.WebApp "