aboutsummaryrefslogtreecommitdiff
path: root/rwa
diff options
context:
space:
mode:
authorJonathan Weth <mail@jonathanweth.de>2021-06-29 14:31:01 +0000
committerJonathan Weth <mail@jonathanweth.de>2021-06-29 14:31:01 +0000
commit4c5b30bd253dd0230afffb29c6daa6c338c2749c (patch)
tree9d51d6e01de7743a5d1c71e9542d47126d4e2aff /rwa
parentd8146354959fb352f9709ae0d2a674c361dbec17 (diff)
parentad5ebc3197b7fbd6ffffda969d5a81d939057bc7 (diff)
downloadRWA.Support.SessionService-4c5b30bd253dd0230afffb29c6daa6c338c2749c.tar.gz
RWA.Support.SessionService-4c5b30bd253dd0230afffb29c6daa6c338c2749c.tar.bz2
RWA.Support.SessionService-4c5b30bd253dd0230afffb29c6daa6c338c2749c.zip
Merge branch 'feature/multiple-hosts' into 'master'
Support multiple hosts See merge request remotewebapp/rwa.support.sessionservice!7
Diffstat (limited to 'rwa')
-rw-r--r--rwa/support/sessionservice/config.py8
-rwxr-xr-xrwa/support/sessionservice/service.py76
-rw-r--r--rwa/support/sessionservice/session.py28
3 files changed, 90 insertions, 22 deletions
diff --git a/rwa/support/sessionservice/config.py b/rwa/support/sessionservice/config.py
index f0f8369..de5518d 100644
--- a/rwa/support/sessionservice/config.py
+++ b/rwa/support/sessionservice/config.py
@@ -23,8 +23,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
-from dynaconf import Dynaconf
+import usersettings
-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 c69c049..52bf627 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
@@ -251,7 +321,7 @@ class RWASupportSessionService(dbus.service.Object):
return False
def _stop_all(self):
- """Stop all sessions"""
+ """Stop all sessions."""
logging.info("Stop all sessions.")
for session in list(self.sessions.values()):
session.stop()
diff --git a/rwa/support/sessionservice/session.py b/rwa/support/sessionservice/session.py
index d3a6fd8..0126800 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,
@@ -187,7 +185,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(
@@ -224,7 +222,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 "
@@ -268,7 +266,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 "