Compare commits

...
91 Commits
Author SHA1 Message Date
Lyncoln 75b4cc92da Repaired build workflow
Build and Publish RMManager Image / build (push) Successful in 46s
2026-10-30 23:41:42 -04:00
Lyncoln f90c3b1424 Added gitea workflow build
Build and Publish RMManager Image / build (push) Failing after 1m31s
2026-10-30 23:37:45 -04:00
Lyncoln 12b28f037a Updated Server to used buildListener for pings and updated the listener and firewall to handle definitions accordingly 2026-10-30 22:50:36 -04:00
Lyncoln 4ccd44937f Added dockerignore to gitignore 2026-10-30 17:28:03 -04:00
Lyncoln 53021d381e Commented out global registeredOp 2026-10-30 17:26:27 -04:00
Lyncoln 433c1e4b77 Updated response policy to use registered op and redo the request where indicated 2026-10-30 17:26:08 -04:00
Lyncoln c230939b45 Updated prints and naming conventions 2026-10-30 17:23:08 -04:00
Lyncoln 2c2a41fafb Implemented Synapse Ping as heartbeat for connection between synapse and RMASS Bridge. Also implemented set online action to update RMASS presence 2026-10-30 17:19:03 -04:00
Lyncoln b3094f75a9 Moved token refresh into its worn operation for process registry compatibility 2026-10-30 10:29:32 -04:00
Lyncoln b5591ade62 Updated resolver to use logging 2026-10-30 02:52:06 -04:00
Lyncoln fe2a54ca00 General housekeeping 2026-10-30 02:51:47 -04:00
Lyncoln f2df751294 Stopped passing outputs into executeContract and treating it as the beginning of the execution boundary 2026-10-30 02:51:11 -04:00
Lyncoln 50cb0e0924 General housekeeping 2026-10-30 02:49:29 -04:00
Lyncoln dafde0a805 Shifted to importing executeContract after filter checks to prevent excessive importing 2026-10-30 02:48:18 -04:00
Lyncoln f10ab522c9 Updated to use logging 2026-10-30 02:46:34 -04:00
Lyncoln 476ef608f3 Updated firewall to use buildThread 2026-10-30 02:18:58 -04:00
Lyncoln 63330c9ecd Imported outputs from external module to facilitate thread building and consistent runtime operation from various entrypoints 2026-10-30 02:18:24 -04:00
Lyncoln b59401c64f Migrated Monitor to create a new thread for subroutines 2026-10-30 00:44:04 -04:00
Lyncoln 4189812957 Update tracked files to respect .gitignore 2026-10-29 15:48:08 -04:00
Lyncoln 1a3caa1022 Udated runtime contract to stop doing unnecessary imports and introduced dedicated process registry. Confirmed working. 2026-10-29 15:44:45 -04:00
Lyncoln c66d139cca Stopped passing process into execution contract and action 2026-10-29 15:30:58 -04:00
Lyncoln 9b5feffe93 Added lifecycle based debugging 2026-10-29 12:15:31 -04:00
Lyncoln 1956b9bed4 Stopped returning lifecycles on lifecycleregistry 2026-10-29 02:56:11 -04:00
Lyncoln af2817cc12 Stopped returning outputs on buildRequest and executeRequest and switched to usinf executeContract in monitor 2026-10-29 02:55:28 -04:00
Lyncoln dd4abbd81a Stopped returning outputs on executeRequest 2026-10-29 02:24:17 -04:00
Lyncoln afbe0e1add Corrected commented filter for future implementation 2026-10-28 22:01:56 -04:00
Lyncoln 8fc85db44a Refined firewall by adding resolved. Added dictionary vs list handling in resolved. 2026-10-28 22:01:35 -04:00
Lyncoln a6bd89bb7e Updated apply conditions to handle more firewall rules 2026-10-28 21:23:02 -04:00
Lyncoln babd77b1ef Stopped returning outputs unnecessarily 2026-10-28 20:59:56 -04:00
Lyncoln 27d7030963 Initialized outputs outside of manageLifecycle 2026-10-28 20:58:56 -04:00
Lyncoln ad2296610c Removed old prints 2026-10-28 20:58:36 -04:00
Lyncoln d26f3a88af Removed synapse notify import 2026-10-28 20:58:19 -04:00
Lyncoln 14b5727923 Added synapse notify to preexeccution filtering at the action level. Expanded filter metadata 2026-10-28 20:57:45 -04:00
Lyncoln cdf35a9e68 Stopped returning outputs from executeContract 2026-10-28 18:12:10 -04:00
Lyncoln d5fd468498 Stopped returning outputs on buildRecursive 2026-10-28 18:04:58 -04:00
Lyncoln 24ea9a7a14 Stopped returning outputs on buildMonitor 2026-10-28 17:58:15 -04:00
Lyncoln 4b92e82ea6 Stopped returning outputs in buildOperation 2026-10-28 17:51:36 -04:00
Lyncoln 950707386a Stopped returning outputs for registerProcess 2026-10-28 17:44:09 -04:00
Lyncoln d492d78a70 Stopped returning outputs on buildAction in monitor 2026-10-28 17:37:49 -04:00
Lyncoln a574a595dc Stopped returning outputs in buildAction. Confirmed working 2026-10-28 17:37:20 -04:00
Lyncoln 717988c53b Added env variable controlled log levels 2026-10-28 17:07:55 -04:00
Lyncoln 0ca65c7c6d Added third positional variable to buildAction 2026-10-28 16:47:37 -04:00
Lyncoln 25c5d642b3 Added logging and stopped output return with buildFirewall 2026-10-28 16:46:48 -04:00
Lyncoln 8a784cdaec Changed monitor interval to every 15 seconds 2026-10-28 16:46:18 -04:00
Lyncoln 71f27e27e0 Housekeeping and migrated prints to logging 2026-10-28 16:45:54 -04:00
Lyncoln e456902a1d Updated bypassed defnition 2026-10-28 16:42:59 -04:00
Lyncoln 925e35f38e Added loging definitions and rich log handling. Operation and Recursive now define bypassed status based on completed count. 2026-10-28 16:36:49 -04:00
Lyncoln fafbabd9e8 Updated extractItem to stop returning resolved 2026-10-28 16:33:57 -04:00
Lyncoln 0322eca845 Added logging based on applyConditions returned filter. Stopped accepting returned outputs where its modified in place 2026-10-28 16:33:12 -04:00
Lyncoln a48e761622 Updated name to distinguish from corresponding core action 2026-10-28 16:31:48 -04:00
Lyncoln a42c5446d8 Stopped returning outputs where it is modified in place 2026-10-28 16:30:26 -04:00
Lyncoln 80c43578f3 Improved logs and module level housekeeping 2026-10-28 11:22:06 -04:00
Lyncoln 902d79c00a Disabled managefailure imports to fix circular import bugs 2026-10-28 11:21:13 -04:00
Lyncoln d63a54ebd0 Stopped importing lifecycle registration during initialize 2026-10-28 11:20:21 -04:00
Lyncoln 5d56595463 Improved lifecycle handling during initialization and added log level declaration 2026-10-28 11:19:29 -04:00
Lyncoln 5da12a10bb Added rich progress bars 2026-10-28 11:18:23 -04:00
Lyncoln ff940e4771 Cleaned process registry and added process to post runtime processing for post runtime stop signal registration 2026-10-28 11:17:10 -04:00
Lyncoln 3582c7b621 Upgraded lifecycles by putting session and thread registration inside the registry and handling initialization at the manageLifecycle level 2026-10-28 11:15:52 -04:00
Lyncoln 9d4e9d38ad Added os env conrolled logging 2026-10-28 11:14:15 -04:00
Lyncoln cb3a2d90b0 Extended positional variables to allow operation information to pass through to signal registry and dependency check at the action level for the new process registry (Working). Introduced track for operation 2026-10-28 01:24:33 -04:00
Lyncoln 148cd55c82 Gated response.ok logging behind a boolean leaving only failed messages reporting 2026-10-28 01:20:21 -04:00
Lyncoln 5ef08fc94f Introduced track as an attribute to determine the use of progress bars 2026-10-28 01:19:20 -04:00
Lyncoln 41495d3ed6 Gated recursive logging behind a boolean. Included none type handling for source so the buildRecursive returns early. Introduced track for progress tracking 2026-10-28 01:18:14 -04:00
Lyncoln fbacfa72c8 Gated select log printing behind a boolean 2026-10-28 01:15:33 -04:00
Lyncoln 3dfc70db45 Added the ability to update responses after responsePolicy handling 2026-10-27 21:32:15 -04:00
Lyncoln fd200d5ece Added status code provisioning to filters 2026-10-27 21:29:28 -04:00
Lyncoln e61fa2c80d Made assign DM avatar depend on getting avatars instead of room creation so its not bypassed for existing rooms 2026-10-27 21:28:57 -04:00
Lyncoln 7ba41cdf67 Added buildFirewall to listener 2026-10-27 21:27:24 -04:00
Lyncoln e693a4fb25 Added aliases 2026-10-27 19:10:33 -04:00
Lyncoln 469586fefb responsePolicy only returns outputs 2026-10-27 19:02:26 -04:00
Lyncoln 75a9ce1b66 Added alias to login and getcsrf 2026-10-27 19:01:48 -04:00
Lyncoln f46ce89142 Response policy now only returns outputs 2026-10-27 19:00:55 -04:00
Lyncoln c8edaa65d6 Created firewall and prepared RMASS Message Push operation to use firewall_allowed 2026-10-27 18:59:19 -04:00
Lyncoln 480a49ced9 Created process registry and introduced preparatory code 2026-10-27 18:58:18 -04:00
Lyncoln 90a18805f0 Removed old token file 2026-10-27 18:46:49 -04:00
Lyncoln 5d17c74eaf Extended lifecycle registry to register threads inside registry 2026-10-27 10:21:04 -04:00
Lyncoln 5a805ec9b7 Used lifecycle registration to register initialization mode 2026-10-27 08:39:55 -04:00
Lyncoln 30c001fe0e Added None handling to monitor to prevent TypeError execeptions and post processing crashes 2026-10-27 08:34:59 -04:00
Lyncoln 924b49c6b5 Added created_at to session metadata 2026-10-27 08:31:37 -04:00
Lyncoln 90135afce7 Moved lifecycle registry out of createThread and into lifecycle manager since so that the registry is created INSIDE the thread. 2026-10-27 08:30:25 -04:00
Lyncoln 75f42753a0 Added string handling for requestdata as outputs entries 2026-10-27 08:28:32 -04:00
Lyncoln 3db6a5ae17 Added request timeout handling 2026-10-26 21:34:10 -04:00
Lyncoln fb2ca01806 Added stopsignal module with checkDependency and addStopSignal definitions 2026-10-26 18:04:22 -04:00
Lyncoln cd3c292fdc Added post runtime stop signals 2026-10-26 16:46:52 -04:00
Lyncoln 71c43c66a2 Code cleanup 2026-10-26 16:46:13 -04:00
Lyncoln f6db674d07 Removed unnecessary imports from RMASS attachment push flow 2026-10-26 15:29:16 -04:00
Lyncoln 2b7435527a Added stop signals to RMASS incoming message flows. Nested attachment handling in its own operation for Synapse outgoing message flows 2026-10-26 15:17:45 -04:00
Lyncoln b9f36eff0a Corrected action returning outputs None inside loop for match 2026-10-26 15:15:24 -04:00
Lyncoln 8b73083e4c Renamed module to savermassmessageid 2026-10-26 15:14:12 -04:00
Lyncoln d4a9fc6455 Stopped returning select_data (not necessary) 2026-10-26 13:13:10 -04:00
Lyncoln 5960e81bfd Introduced stop signals and dependency gating for operations. Added mechanism to RMASS message sending protocol (Confirmed Working) 2026-10-26 13:12:42 -04:00
88 changed files with 1204 additions and 607 deletions
-8
View File
@@ -1,8 +0,0 @@
.git
.gitignore
__pycache__/
*.pyc
*.pyo
*.pyd
.venv/
venv/
+182
View File
@@ -0,0 +1,182 @@
name: Build and Publish RMManager Image
on:
push:
branches: [main]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
# ---------------------------------------------
# Checkout repository (no external actions)
# ---------------------------------------------
- name: Checkout repository
env:
GITEA_TOKEN: ${{ secrets.TEA_TOKEN }}
run: |
set -euo pipefail
BASE="${GITHUB_SERVER_URL%/}"
REPO="${GITHUB_REPOSITORY}"
git init .
git remote add origin "$BASE/$REPO.git"
if [ -n "${GITEA_TOKEN:-}" ]; then
AUTH="$(printf 'oauth2:%s' "$GITEA_TOKEN" | base64 -w0)"
git -c "http.extraHeader=Authorization: Basic $AUTH" \
fetch --depth 1 origin "$GITHUB_SHA"
else
git fetch --depth 1 origin "$GITHUB_SHA"
fi
git checkout --detach FETCH_HEAD
git config --global --add safe.directory "$PWD"
# ---------------------------------------------
# Determine image version and commit SHA
# ---------------------------------------------
- name: Determine version
id: version
run: |
set -euo pipefail
SHORT_SHA="$(git rev-parse --short=7 HEAD)"
echo "sha=$SHORT_SHA" >> "$GITHUB_OUTPUT"
if [ -f VERSION ]; then
VERSION="$(tr -d '[:space:]' < VERSION)"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
else
echo "version=" >> "$GITHUB_OUTPUT"
fi
# ---------------------------------------------
# Login to Gitea container registry
# ---------------------------------------------
- name: Docker login
env:
REGISTRY: ${{ vars.REGISTRY }}
REGISTRY_USER: ${{ secrets.REGISTRY_USER }}
REGISTRY_TOKEN: ${{ secrets.TEA_TOKEN }}
run: |
set -euo pipefail
echo "$REGISTRY_TOKEN" | docker login "$REGISTRY" \
-u "$REGISTRY_USER" \
--password-stdin
# ---------------------------------------------
# Build and export container image
# ---------------------------------------------
- name: Build RMManager image
env:
REGISTRY: ${{ vars.REGISTRY }}
VERSION: ${{ steps.version.outputs.version }}
SHORT_SHA: ${{ steps.version.outputs.sha }}
run: |
set -euo pipefail
FULL_IMAGE="$REGISTRY/david/rmmanager"
docker build \
-f Containerfile \
-t "$FULL_IMAGE:latest" \
-t "$FULL_IMAGE:sha-$SHORT_SHA" \
--output "type=docker,dest=$RUNNER_TEMP/rmmanager-built.tar" \
.
# ---------------------------------------------
# Load exported image into Docker
# ---------------------------------------------
- name: Load RMManager image
run: |
set -euo pipefail
docker load \
--input "$RUNNER_TEMP/rmmanager-built.tar"
# ---------------------------------------------
# Add optional version tag
# ---------------------------------------------
- name: Tag RMManager image
env:
REGISTRY: ${{ vars.REGISTRY }}
VERSION: ${{ steps.version.outputs.version }}
run: |
set -euo pipefail
FULL_IMAGE="$REGISTRY/david/rmmanager"
if [ -n "$VERSION" ]; then
docker tag \
"$FULL_IMAGE:latest" \
"$FULL_IMAGE:v$VERSION"
fi
# ---------------------------------------------
# Verify local image and tags
# ---------------------------------------------
- name: Verify RMManager image
env:
REGISTRY: ${{ vars.REGISTRY }}
VERSION: ${{ steps.version.outputs.version }}
SHORT_SHA: ${{ steps.version.outputs.sha }}
run: |
set -euo pipefail
FULL_IMAGE="$REGISTRY/david/rmmanager"
docker version
docker image ls
docker image inspect "$FULL_IMAGE:latest"
docker image inspect "$FULL_IMAGE:sha-$SHORT_SHA"
if [ -n "$VERSION" ]; then
docker image inspect "$FULL_IMAGE:v$VERSION"
fi
# ---------------------------------------------
# Publish image to Gitea registry
# ---------------------------------------------
- name: Push RMManager image
env:
REGISTRY: ${{ vars.REGISTRY }}
VERSION: ${{ steps.version.outputs.version }}
SHORT_SHA: ${{ steps.version.outputs.sha }}
run: |
set -euo pipefail
FULL_IMAGE="$REGISTRY/david/rmmanager"
docker push "$FULL_IMAGE:latest"
docker push "$FULL_IMAGE:sha-$SHORT_SHA"
if [ -n "$VERSION" ]; then
docker push "$FULL_IMAGE:v$VERSION"
fi
# ---------------------------------------------
# Report successful build
# ---------------------------------------------
- name: Report build
env:
REGISTRY: ${{ vars.REGISTRY }}
VERSION: ${{ steps.version.outputs.version }}
SHORT_SHA: ${{ steps.version.outputs.sha }}
run: |
set -euo pipefail
echo "RMManager build and publish completed"
echo "Image: $REGISTRY/david/rmmanager"
echo "Latest tag: latest"
echo "Commit tag: sha-$SHORT_SHA"
if [ -n "$VERSION" ]; then
echo "Version tag: v$VERSION"
fi
+6
View File
@@ -24,3 +24,9 @@ savedata/
# Logs
*.log
#Trash and unused files
trash/
#Docker files
.dockerignore
+1 -1
View File
@@ -1,5 +1,5 @@
from plugins import rmass
from core import buildOperation
outputs = buildOperation(rmass.operations.checkavailable)
responses = buildOperation(rmass.operations.checkavailable)
+1 -1
View File
@@ -1,6 +1,6 @@
from .server import server
from .apirequest import executeRequest
from .runtime import buildSave, loadSave, buildLog, manageFailure, buildOutput
from .runtime import buildSave, loadSave, buildLog, buildOutput
#from .execution import buildOperation, buildAction
from .execution.action import buildAction
from .execution.operation import buildOperation
+30 -43
View File
@@ -1,8 +1,12 @@
import requests
import threading
import os
import time
import logging
from .request import buildRequest
#session = requests.Session()
_thread_local = threading.local()
@@ -15,15 +19,17 @@ def getSession(reset=False):
if not hasattr(_thread_local, "session"):
session = requests.Session()
session.name = threading.current_thread().name
session.created_at = time.monotonic()
_thread_local.session = session
return _thread_local.session
def executeRequest(action, outputs, resolved):
from core.execution.lifecyclemanager.lifecyclemanager import lifecycles
session = getSession()
session_log = bool(os.environ.get("LOGS_SESSION", False))
session_log = os.environ.get("LOGS_SESSION", "false").lower() == "true"
if session_log:
print(
@@ -32,8 +38,15 @@ def executeRequest(action, outputs, resolved):
)
for attempt in range(2):
request, outputs = buildRequest(action, outputs, resolved)
request = buildRequest(action, outputs, resolved)
try:
if action.name in lifecycles:
request_info = {"Started at": time.monotonic()}
lifecycles[action.name]["Request Information"] = request_info
snapshot = lifecycles.copy()
response = session.request(
method=request["method"],
url=request["path"],
@@ -43,49 +56,23 @@ def executeRequest(action, outputs, resolved):
files=request.get("files"),
timeout=(10, 30)
)
return response, outputs
except (requests.ConnectTimeout, requests.ConnectionError) as error:
print(f"{type(error).__name__} during {action.name}: {error}")
logging.debug(snapshot)
return response
except (requests.Timeout, requests.ConnectionError) as error:
#print(f"{type(error).__name__} during {action.name}: {error}")
logging.warning(f"{type(error).__name__} during {action.name}: {error}")
logging.debug("LIFECYCLE STATE BEFORE REQUEST")
logging.debug(snapshot)
logging.debug("LIFECYCLE STATE AFTER REQUEST")
logging.debug(lifecycles)
session = getSession(reset=True)
if attempt == 0:
print(f"Retrying {action.name}")
logging.warning(f"Retrying {action.name}")
# try:
# request, outputs = buildRequest(action, outputs, resolved)
#
# response = session.request(
# method=request["method"],
# url=request["path"],
# json=request.get("object"),
# headers=request.get("headers"),
# data=request.get("data"),
# files=request.get("files"),
# timeout=(10, 30)
# )
#
# except requests.ConnectionError as error:
# print(f"Request failed due to {error} during {action.name}")
#
# session = getSession(reset=True)
#
# print(f"Retrying {action.name}")
#
# response = session.request(
# method=request["method"],
# url=request["path"],
# json=request.get("object"),
# headers=request.get("headers"),
# data=request.get("data"),
# files=request.get("files"),
# timeout=(10, 30)
# )
#
# return response, outputs
#
# except requests.Timeout as error:
# print(f"Request timed out during {action.name}: {error}")
# session = getSession(reset=True)
return response, outputs
return None
+5 -2
View File
@@ -18,7 +18,10 @@ def buildRequest(definition, outputs, resolved):
request["headers"] = buildHeaders(definition, request, outputs, resolved)
if hasattr(definition, "requestdata"):
if hasattr(definition, "requestdata"):
###To potentially test moving requestdata to an outputs dict instead of a string
if isinstance(definition.requestdata, str):
request["data"] = outputs[definition.requestdata]
else:
request["data"] = buildObject2(
definition.requestdata,
outputs,
@@ -43,4 +46,4 @@ def buildRequest(definition, outputs, resolved):
"image/jpeg",
),
}
return request, outputs
return request
+3
View File
@@ -0,0 +1,3 @@
from rich.console import Console
console = Console(stderr=True)
+19 -7
View File
@@ -1,19 +1,31 @@
import logging
from core.apirequest import executeRequest
from core.runtime.runtimecontract import buildRuntimeAttr, buildPreRuntimeAttr
def buildAction (action, outputs):
action_log = True
outputs, resolved, match, filter = buildPreRuntimeAttr(action, outputs)
resolved, match, filter = buildPreRuntimeAttr(action, outputs)
if hasattr(action, "allowaction"):
if not action.allowaction:
return outputs, resolved
return None
if match:
return outputs, resolved
if filter.get("execute", False):
response = executeRequest(filter["execute"], outputs, resolved)
response, outputs = executeRequest(action, outputs, resolved)
outputs, response = buildRuntimeAttr(action, outputs, resolved, response)
return None
return outputs, response
response = executeRequest(action, outputs, resolved)
if response is None:
return outputs, None
response = buildRuntimeAttr(action, outputs, resolved, response)
if action_log:
logging.info(f"{action.name} completed")
return response
+6 -20
View File
@@ -1,32 +1,18 @@
import threading
from .lifecyclemanager import registerLifecycle
import logging
from .lifecyclemanager import manageLifecycle
threadlist = []
#threadnum = 0
def buildThread(module, lifecycles):
#global threadnum
#threadnum += 1
#threadname = f"thread.{threadnum}"
def buildThread(module):
thread = threading.Thread(
target=manageLifecycle,
args=(module, lifecycles),
args=(module,),
name=module.name
)
thread.start()
registryname = thread.name
registryvalue = thread
logging.info(f"THREAD STARTED, {thread}")
lifecycles = registerLifecycle (module, lifecycles, registryname, registryvalue)
threadlist.append(thread)
#print(threadlist)
#print(lifecycles)
return thread, lifecycles
return thread
+12 -14
View File
@@ -1,33 +1,31 @@
from core.execution.action import buildAction
from core.execution.operation import buildOperation
from core.execution.monitor import buildMonitor
from core.runtime import manageFailure
#from core.runtime import manageFailure
from core.execution.recursive import buildRecursive
from core.runtime.createruntime import outputs
def executeContract(module):
def executeContract(module, outputs):
#print("DEBUGGING")
#print(module.name)
if module.kind == "operation":
responses = buildOperation(module, outputs)
outputs, responses = buildOperation(module, outputs)
return outputs, responses
return responses
elif module.kind == "action":
response = buildAction(module, outputs)
outputs, response = buildAction(module, outputs)
return outputs, response
return response
elif module.kind == "monitor":
outputs, response= buildMonitor(module, outputs)
response = buildMonitor(module, outputs)
return outputs, response
return response
elif module.kind == "recursiveset":
outputs, response = buildRecursive(module, outputs)
response = buildRecursive(module, outputs)
return outputs, response
return response
#except Exception as error:
#outputs = manageFailure(error, module)
@@ -1,30 +1,42 @@
import time
import os
from core.execution.operation import buildOperation
from core.execution.action import buildAction
from core.execution.executioncontract import executeContract
from core.apirequest.execute import getSession
from core.execution.lifecyclemanager.lifecycleregistry import registerLifecycle
#sleeptime = int(os.environ.get("REFRESH_INTERVAL", 180))
lifecycles = {}
#outputs = {}
def manageLifecycle(module, lifecycles): #lifecycles, state):
def manageLifecycle(module):
from core.runtime.createruntime import outputs
lifecycle_log = os.environ.get("LOGS_LIFECYCLE", "false").lower() == "true"
outputs = {}
registerLifecycle (module, lifecycles)
if lifecycles[module.name]["mode"] == "continuous":
while lifecycles[module.name]["mode"] == "continuous":
lifecycles[module.name]["state"] = "active"
outputs, response = executeContract(module, outputs)
executeContract(module)
lifecycle_log = bool(os.environ.get("LOGS_LIFECYCLE", False))
if lifecycle_log:
print(f"{module.name} thread {lifecycles[module.name][module.name]} running in {lifecycles[module.name]['mode']} mode")
print(lifecycles)
time.sleep(module.sleeptime)
lifecycles[module.name]["state"] = "sleep"
time.sleep(lifecycles[module.name]["refresh_rate"])
lifecycles[module.name]["state"] = "stopped"
elif lifecycles[module.name]["mode"] == "oneshot":
lifecycles[module.name]["state"] = "active"
if lifecycle_log:
print(f"{module.name} thread {lifecycles[module.name][module.name]} running in {lifecycles[module.name]['mode']} mode")
print(lifecycles)
outputs, response = executeContract(module)
response = executeContract(module)
lifecycles[module.name]["state"] = "stopped"
#print(lifecycles)
return
@@ -1,8 +1,42 @@
def registerLifecycle(module, lifecycles, registryname, registryvalue):
import threading
from core.apirequest.execute import getSession
def registerLifecycle(module, lifecycles):
if module.name not in lifecycles:
lifecycles[module.name] = {}
thread = threading.current_thread()
lifecycles[module.name][thread.name] = thread
lifecycles[module.name][registryname] = registryvalue
session = getSession()
return lifecycles
session_data = {
"created_at": session.created_at,
"lifetime": 1800,
"valid": True
}
session.name = f"{module.name} Session"
lifecycles[module.name][session.name] = session_data
#print(lifecycles)
if "mode" not in lifecycles[module.name]:
if hasattr(module, "mode"):
mode = getattr(module, "mode")
lifecycles[module.name]["mode"] = mode
else:
lifecycles[module.name]["mode"] = "oneshot"
if lifecycles[module.name]["mode"] == "continuous":
lifecycles[module.name]["refresh_rate"] = module.sleeptime
#if lifecycles[module.name]["mode"] == {}:
# lifecycles[module.name]["mode"] = "oneshot"
#lifecycles[module.name][registryname] = registryvalue
return
+22 -15
View File
@@ -1,10 +1,8 @@
#from core.execution.executioncontract import executeContract
from core.execution.action import buildAction
from core.execution.operation import buildOperation
import logging
from core.apirequest import executeRequest
from core.runtime.resolver import resolveItem
from core.runtime.applyconditions import applyConditions
#from plugins.rmass.actions import login, refresh_tokens
from core.runtime import buildOutput
from core.runtime.savedata import loadSave
@@ -12,9 +10,17 @@ outputs = {}
resolved = {}
def buildMonitor(monitor, outputs):
outputs = loadSave(monitor, outputs)
loadSave(monitor, outputs)
response, outputs = executeRequest(monitor, outputs, resolved)
response = executeRequest(monitor, outputs, resolved)
##Potentially replace response processing with responsePolicy
if response is None:
return None
if not response.ok:
logging.warning(f"Response with status code {response.status_code} during {monitor.name}")
return response
responsedata = response.json()
@@ -22,16 +28,17 @@ def buildMonitor(monitor, outputs):
match, filter = applyConditions(monitor, readitems, outputs)
outputs = buildOutput(response, monitor, outputs)
buildOutput(response, monitor, outputs)
if match:
module = filter["execute"]
from core.execution.createthread import buildThread
#from core.execution.executioncontract import executeContract
if module.kind == "action":
outputs, response = buildAction(module, outputs)
if module.kind == "operation":
outputs, responses = buildOperation(module, outputs)
response = responses
logging.info(filter.get("print"))
#module = filter["execute"]
return outputs, response
#response = executeContract(filter["execute"], outputs)
thread = buildThread(filter["execute"])
return response
+55 -14
View File
@@ -1,32 +1,73 @@
import logging
import pprint
from rich.progress import track
from rich.console import Console
from core.runtime.managefailure import manageFailure
from core.execution.action.action import buildAction
#from core.runtime.skipstep import skipStep
#from core.runtime.recursive import recursiveSet
from core.runtime.stopsignals import checkDependency
from core.execution import processregistry
from core.console import console
#outputs = {}
outputs = {}
def buildOperation(definition, outputs):
from core.execution.executioncontract import executeContract
process_log = True
actions = definition.actions
responses = []
currentOp = processregistry.registerProcess(definition)
if getattr(definition, "track", False):
actions = track(
actions,
description=f"[green]{definition.name}[/green]",
console=console
)
for action in actions:
processregistry.registeredOp = currentOp
#if action == "recursiveset":
#if hasattr(action, "recursiveset"):
# from core.runtime.recursive import recursiveSet
# outputs, responses = recursiveSet(action, outputs, responses)
stop = checkDependency(action)
#else:
#outputs, response = buildAction(action, outputs)
outputs, response = executeContract(action, outputs)
if stop:
continue
#if hasattr(action, recursive)
if action.kind == "action":
currentOp[action.name] = {}
from core.execution.executioncontract import executeContract
response = executeContract(action)
responses.append(response)
if action.kind == "action":
currentOp[action.name]["response"] = response
if action.alias in currentOp["stopsignals"]:
continue
currentOp["completed"].append(action.alias)
#Temporarily disabled manageFailure functions
#except Exception as error:
#outputs = manageFailure(error, action, outputs)
return outputs, responses
if process_log:
completed_count = len(currentOp["completed"])
if completed_count == 0:
logging.info(f"{definition.name} bypassed")
else:
logging.info(f"{definition.name} completed")
process_registry_logs = False
if process_registry_logs:
import pprint
pprint.pprint(processregistry.processes)
return responses
+14
View File
@@ -0,0 +1,14 @@
processes = {}
registeredOp = {}
def registerProcess(module):
#global registeredOp
processes[module.name] = {}
registeredOp = processes[module.name]
processes[module.name]["stopsignals"] = []
processes[module.name]["completed"] = []
return registeredOp
+63 -17
View File
@@ -1,41 +1,87 @@
from core.execution.action.action import buildAction
from core.runtime.runtimecontract import buildPreRuntimeAttr, buildRuntimeAttr
from core.apirequest import executeRequest
import logging
import os
from core.runtime.stopsignals import checkDependency
from core.execution import processregistry
from rich.progress import track
from core.console import console
def buildRecursive(definition, outputs):
process_log = True
recursive_log = os.environ.get("LOGS_RECURSIVE", "false").lower() == "true"
source = outputs.get(definition.recursiveset["source"])
if source is None or source == []:
if recursive_log:
logging.debug(f"No items available in {source} for {definition.name}")
return outputs, []
currentOp = processregistry.registerProcess(definition)
responses = []
from core.execution.executioncontract import executeContract
recursiveset = definition.recursiveset["actions"]
source = definition.recursiveset["source"]
items = outputs.get(source)
#print(f"RECURSIVE DEBUG DURING {definition.name}")
#print(items)
if items is None:
print(f"No items available in {source} for {definition.name}")
return outputs, None
reverse = definition.recursiveset.get("reverse", False)
if reverse:
#print("reversing")
items = reversed(items)
for item in items:
for item in track(
items,
description=f"[green]{definition.name}[/green]",
console=console
):
#for item in items:
outputs[definition.recursiveset["outputlabel"]] = item
outputs["stopsignals"] = []
for job in recursiveset:
#print(f"RECURSIVE DEBUG DURING {job.name}")
#print(item)
#outputs, response = buildAction(job, outputs)
outputs, response = executeContract(job, outputs)
processregistry.registeredOp = currentOp
stop = checkDependency(job)
if stop:
continue
if job.kind == "action":
currentOp[job.name] = {}
from core.execution.executioncontract import executeContract
response = executeContract(job)
responses.append(response)
if job.kind == "action":
currentOp[job.name]["response"] = response
currentOp["completed"].append(job.alias)
if process_log:
completed_count = len(currentOp["completed"])
if completed_count == 0:
logging.info(f"{definition.name} bypassed")
else:
logging.info(f"{definition.name} completed")
retain = definition.recursiveset.get("retain", True)
if not retain:
outputs.pop(source, None)
return outputs, responses
outputs.pop("stopsignals", None)
process_registry_logs = False
if process_registry_logs:
import pprint
pprint.pprint(processregistry.processes)
return responses
+1 -1
View File
@@ -7,5 +7,5 @@ from .outputs import buildOutput
from .savedata import buildSave, loadSave, saveRow, readRow
from .logs import buildLog
#from . import managefailure
from .managefailure import manageFailure
#from .managefailure import manageFailure
from .image import buildImage
+9 -11
View File
@@ -17,58 +17,56 @@ def applyConditions(definition, dictionary, outputs):
if filtervalue is None:
continue
if filter.get("filterkey_format", None):
if filter["filterkey_format"] == "length":
resolvedvalue = len(dictionary.get(filter["filterkey"]))
else:
resolvedvalue = dictionary.get(filter["filterkey"])
if filter["operator"] == ">=":
if int(resolvedvalue or 0) >= int(filtervalue):
print(filter["print"])
return True, filter
if filter["operator"] == "<=":
if int(resolvedvalue or 0) <= int(filtervalue):
print(filter["print"])
return True, filter
if filter["operator"] == "==":
if resolvedvalue == filtervalue:
print(filter["print"])
return True, filter
if filter["operator"] == "!=":
if resolvedvalue != filtervalue:
print(filter["print"])
return True, filter
if filter["operator"] == ">":
if int(resolvedvalue or 0) > int(filtervalue):
print(filter["print"])
return True, filter
if filter["operator"] == "<":
if int(resolvedvalue or 0) < int(filtervalue):
print(filter["print"])
return True, filter
if filter["operator"] == "in":
if filter["filterkey"] == "called_dictionary":
if filtervalue in dictionary:
print(filter["print"])
return True, filter
else:
if filtervalue in dictionary.get(filter["filterkey"], {}):
return True, filter
if filter["operator"] == "is":
if resolvedvalue is filtervalue:
print(filter["print"])
return True, filter
if filter["operator"] == "is not":
if resolvedvalue is not filtervalue:
print(filter["print"])
return True, filter
except KeyError:
print(f"Value not present in runtime for filtering during {definition.name}")
#print(filter)
return True, filter
#continue
#except TypeError:
# print("TypeError")
+4
View File
@@ -0,0 +1,4 @@
outputs = {}
def getOuputs():
return outputs
+39
View File
@@ -0,0 +1,39 @@
import os
import logging
from core.runtime.applyconditions import applyConditions
from core.runtime.resolver import resolveItem
def buildFirewall(listener, outputs):
if hasattr(listener, "filters"):
#firewall_log = os.environ.get("LOGS_FIREWALL", "false").lower() == "true"
firewall_log = True
status_code = 200
outputs["firewall_allowed"] = []
for item in outputs[listener.recursive["source"]]:
resolved = resolveItem(listener, item)
match, filter = applyConditions(listener, resolved, outputs)
if match:
status_code = filter.get("status_code", 200)
if filter.get("execute", False):
from core.execution.createthread import buildThread
thread = buildThread(filter["execute"])
if firewall_log:
logging.info(filter.get("print"))
logging.info(f"Returning status_code: {status_code}")
continue
outputs["firewall_allowed"].append(item)
if outputs["firewall_allowed"] != []:
return True, status_code
#Needs to be present to prevent TypeError
return False, status_code
+1 -1
View File
@@ -12,4 +12,4 @@ def buildImage(response, action, outputs):
else:
print("No response received"),
return outputs
return
+5 -1
View File
@@ -1,4 +1,5 @@
import logging
import os
def buildLog (action, outputs, response):
if hasattr(action, "prints"):
@@ -12,8 +13,11 @@ def buildLog (action, outputs, response):
except (KeyError, TypeError):
pass
response_log = os.environ.get("LOGS_SUCCESS_RESPONSE", "false").lower() == "true"
if action.showstatus is True and response.ok:
print(f"{action.name} successful")
if response_log:
print(f"{action.name} request successful with response {response.status_code}")
elif action.showstatus is True and not response.ok:
print(f"{action.name} failed with status code {response.status_code}")
+2 -2
View File
@@ -1,4 +1,4 @@
from core.runtime.outputs import buildOutput
#from core.runtime.outputs import buildOutput
from core.execution.action.action import buildAction
#from core.runtime.outputs import buildOutput
@@ -22,7 +22,7 @@ def manageFailure(error, action, outputs):
else:
print(f"{type(error).__name__} detected during {action.name}. Applying recovery policy.")
outputs, response = buildAction(repair, outputs)
response = buildAction(repair, outputs)
return outputs
print(f"{error}")
+1 -1
View File
@@ -53,6 +53,6 @@ def buildOutput(response, action, outputs):
#else:
# print("No response received"),
return outputs
return
+13 -2
View File
@@ -1,14 +1,24 @@
import os
import logging
def resolveItem(action, item):
#resolver_log = os.environ.get("LOGS_RESOLVER", "false").lower() == "true"
resolver_log = True
resolved = {}
if hasattr(action, "resolve"):
for label, keys in action.resolve["get"].items():
target = item
try:
for key in keys:
if isinstance(target, dict):
target = target.get(key)
else:
target = target[key]
except (KeyError, IndexError) as error:
print(f"Resolver target key/index {error} not found during {action.name}")
if resolver_log:
logging.info(f"Resolver target key/index {error} not found during {action.name}")
target = None
resolved[label] = target
@@ -88,6 +98,7 @@ def resolveItem2(action, item):
return resolved
def extractItem(action, item, resolved):
#UNDER RUNTIME CONTRACT ITEM IS OUTPUTS
if hasattr(action, "extract"):
for label, keys in action.extract["get"].items():
#resolved[label] = {}
@@ -130,4 +141,4 @@ def extractItem(action, item, resolved):
resolved[source] = deconstructed
return resolved
return
+26 -6
View File
@@ -1,17 +1,37 @@
#from core.execution.action import buildAction
import logging
from core.apirequest import executeRequest
from core.execution import processregistry
def responsePolicy(response, action, outputs, resolved):
if hasattr(action, "responsepolicy"):
#if processregistry.registeredOp:
#currentOp = processregistry.registeredOp
#print(registeredOp[action.name]["response"])
#print(currentOp)
if not response.ok:
print(response)
logging.warning(f"{response} during {action.name}")
for policy in action.responsepolicy:
if policy["statuscode"] == response.status_code:
print(policy["print"])
logging.warning(policy["print"])
response, outputs = executeRequest(policy["execute"], outputs, resolved)
from core.execution.executioncontract import executeContract
executeContract(policy["execute"])
return outputs, resolved
#newresponse = executeRequest(action, outputs, resolved)
return outputs, resolved
if policy["response_update"]:
logging.info("Updating response")
newresponse = executeRequest(action, outputs, resolved)
#response = newresponse
if processregistry.registeredOp:
response = processregistry.registeredOp[action.name]["response"]
else:
response = newresponse
break
return response
+29 -15
View File
@@ -1,32 +1,46 @@
from core.runtime import buildSelect, buildOutput, buildSave, loadSave, saveRow, readRow, buildLog
from core.runtime.image import buildImage
#from core.runtime.select import buildSelect3
from core.runtime.resolver import resolveItem, extractItem
from core.runtime.applyconditions import applyConditions
from core.runtime.responsepolicy import responsePolicy
import logging
from core.runtime.stopsignals import addStopSignal
def buildPreRuntimeAttr(action, outputs):
outputs = loadSave(action, outputs)
from core.runtime import loadSave, readRow
from core.runtime.applyconditions import applyConditions
from core.runtime.resolver import resolveItem
loadSave(action, outputs)
resolved = resolveItem(action, outputs)
resolved, outputs = readRow(action, resolved, outputs)
readRow(action, resolved, outputs)
match, filter = applyConditions(action, resolved, outputs)
return outputs, resolved, match, filter
if match:
logging.info(filter.get("print"))
addStopSignal(action)
return resolved, match, filter
def buildRuntimeAttr(action, outputs, resolved, response):
outputs, resolved = responsePolicy(response, action, outputs, resolved)
from core.runtime.resolver import extractItem
from core.runtime.responsepolicy import responsePolicy
from core.runtime.image import buildImage
from core.runtime import buildSelect, buildOutput, buildSave, saveRow, buildLog
outputs = buildOutput(response, action, outputs)
response = responsePolicy(response, action, outputs, resolved)
resolved = extractItem(action, outputs, resolved)
buildOutput(response, action, outputs)
outputs = buildImage(response, action, outputs)
if not response.ok:
addStopSignal(action)
return outputs, response
select_data, action, outputs = buildSelect(action, outputs)
extractItem(action, outputs, resolved)
buildImage(response, action, outputs)
buildSelect(action, outputs)
buildSave(action, outputs)
@@ -34,4 +48,4 @@ def buildRuntimeAttr(action, outputs, resolved, response):
buildLog(action, outputs, response)
return outputs, response
return response
+25 -20
View File
@@ -1,7 +1,10 @@
import json
import os
import logging
def buildSave(action, outputs):
savedata_log = os.environ.get("LOGS_SAVE_DATA_ACCESS", "false").lower() == "true"
import tempfile
if hasattr(action, "savedata"):
@@ -36,10 +39,13 @@ def buildSave(action, outputs):
except FileNotFoundError:
pass
#print(f"Data saved by {action.name} to {action.savepath}")
return outputs
if savedata_log:
logging.info(f"Data saved by {action.name} to {action.savepath}")
return
def loadSave(action, outputs):
savedata_log = os.environ.get("LOGS_SAVE_DATA_ACCESS", "false").lower() == "true"
if hasattr(action, "loaddata"):
with open(f"{action.savepath}", "r") as save_file:
load_data = json.load(save_file)
@@ -47,8 +53,9 @@ def loadSave(action, outputs):
for load_name in action.loaddata:
outputs[load_name] = load_data[load_name]
#print(f"Data loaded by {action.name} from {action.savepath}")
return outputs
if savedata_log:
logging.info(f"Data loaded by {action.name} from {action.savepath}")
return
def saveRow(action, outputs, resolved):
import sqlite3
@@ -81,8 +88,8 @@ def saveRow(action, outputs, resolved):
elif "resolved" in item:
value = resolved[item["resolved"]]
except KeyError as error:
print(f"The save data for {error} was not located in its respective dictionary during {action.name}")
print("Bypassing database save")
logging.error(f"The save data for {error} was not located in its respective dictionary during {action.name}")
logging.error("Bypassing database save")
return False
values.append(value)
@@ -131,7 +138,7 @@ def saveRow(action, outputs, resolved):
database.execute(query, tuple(values))
except sqlite3.IntegrityError as error:
print(f"Unable to complete database write during {action.name}: {error}")
logging.error(f"Unable to complete database write during {action.name}: {error}")
return False
#database.execute(
@@ -142,9 +149,9 @@ def saveRow(action, outputs, resolved):
#database.commit()
#database.close()
print(f"Successfully saved data to {table} during {action.name}")
logging.info(f"Successfully saved data to {table} during {action.name}")
return True
return
def readRow(action, resolved, outputs):
@@ -200,8 +207,8 @@ def readRow(action, resolved, outputs):
""",
(value,)
)
#print("DEBUG READROW TARGET ITEM")
#print(value)
logging.debug("DEBUG READROW TARGET ITEM")
logging.debug(value)
result = cursor.fetchone()
@@ -210,15 +217,13 @@ def readRow(action, resolved, outputs):
for column_index, output_name in exports.items():
dbtarget = result[column_index]
outputs[output_name] = dbtarget# result[column_index]
#print("DEBUGGING DATABASE LINE EXTRACTION IN READROW")
#print(outputs[output_name])
#print(dbtarget)
logging.debug("DEBUGGING DATABASE LINE EXTRACTION IN READROW")
logging.debug(outputs[output_name])
logging.debug(dbtarget)
return resolved, outputs
return
else:
print(f"Search target {value} not found in database table {table}")
return resolved, outputs
logging.info(f"Search target {value} not found in database table {table}")
return
#print("READROW SEARCH RESULT")
#print(target)
return resolved, outputs
return
+11 -2
View File
@@ -1,8 +1,14 @@
import os
def buildSelect(action, outputs):
#***THIS IS THE CANONICAL BUILD***
select_log = savedata_log = os.environ.get("LOGS_SELECT", "false").lower() == "true"
select_data = []
if hasattr(action, "select"):
#outputs[f"{action.alias}_select"] = []
try:
target = outputs[action.select["source"]]
includekey = action.select["include"]["key"]
@@ -27,15 +33,18 @@ def buildSelect(action, outputs):
#outputs[{action.select["source"]}] = select_data
outputs[f"{action.alias}_select"] = select_data
#print(select_data)
if select_log:
if select_data is None:
print(f"No data selected during {action.name}")
return select_data, action, outputs
return
except KeyError as error:
print(f"Error in selection of {error} during {action.name}")
except TypeError as error:
print(f"TypeError during select: {error} during {action.name}")
return select_data, action, outputs
return
+22
View File
@@ -0,0 +1,22 @@
#from core.execution.processregistry import registeredOp
def checkDependency(action):
from core.execution.processregistry import registeredOp
if hasattr(action, "depends"):
stop = any(
dependency in registeredOp["stopsignals"]
for dependency in action.depends
)
if stop:
return True
return False
def addStopSignal(action):
from core.execution.processregistry import registeredOp
if hasattr(action, "depends"):
registeredOp["stopsignals"].append(action.alias)
return
+33 -31
View File
@@ -1,51 +1,53 @@
import json
import logging
from core.runtime.outputs import buildOutput
from core.runtime.applyconditions import applyConditions
from core.execution.operation import buildOperation
from core.execution.executioncontract import executeContract
from core.runtime.firewall import buildFirewall
from core.runtime.createruntime import outputs
from core.execution.processregistry import processes
def buildListener(listener, self):
if self.path == "/_matrix/app/v1/ping":
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(b"{}")
return
if self.path.startswith(listener.acceptpath):
#Prints can used buildlog for listener runtime
print("Matrix transaction received")
if hasattr(listener, "print"):
logging.info(listener.print)
content_length = int(self.headers["Content-Length"])
data = self.rfile.read(content_length)
request = json.loads(data)
bytes = self.rfile.read(content_length)
outputs = {}
#request = json.loads(data)
outputs = buildOutput(data, listener, outputs)
buildOutput(bytes, listener, outputs)
for item in outputs[listener.recursive["source"]]:
if hasattr(listener, "filters"):
allow, status_code = buildFirewall(listener, outputs)
match, filter = applyConditions(listener, item, outputs)
if allow:
logging.info(outputs["firewall_allowed"])
if not match:
if "com.loxthelion.rmass_message_id" in item.get("content", {}):
print("Excluding previously imported items")
#print(item)
continue
if hasattr(listener, "execute"):
if listener.execute["engine"] == "thread":
from core.execution.createthread import buildThread
buildThread(listener.execute["module"])
print(item)
#Process and forward to RMASS
elif listener.execute["engine"] == "contract":
from core.execution.executioncontract import executeContract
executeContract(listener.execute["module"])
outputs, responses = executeContract(listener.execute, outputs)
else:
if hasattr(listener, "execute"):
if listener.execute["engine"] == "thread":
from core.execution.createthread import buildThread
buildThread(listener.execute["module"])
continue
elif listener.execute["engine"] == "contract":
from core.execution.executioncontract import executeContract
executeContract(listener.execute["module"])
status_code = listener.status_code["success"]
self.send_response(200)
self.send_response(status_code)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", "2")
self.end_headers()
@@ -54,4 +56,4 @@ def buildListener(listener, self):
else:
self.send_error(404)
return outputs
return
+88 -75
View File
@@ -1,111 +1,124 @@
import os
import json
import logging
from http.server import HTTPServer, BaseHTTPRequestHandler
from .dispatcher import dispatchRequest
from .createresponse import buildResponse
from core.runtime.outputs import buildOutput
from core.runtime.resolver import resolveItem
from plugins.rmass.listeners import synapselistener
from plugins.rmass.operations import rmassmessagepush
from core.execution.action import buildAction
#from .dispatcher import dispatchRequest
#from .createresponse import buildResponse
from plugins.rmass.listeners import synapselistener, matrixpinglistener
from core.server.createlistener import buildListener
from plugins.rmass.actions import pingsynapse
#from plugins.rmass.actions import synapsesetbridgeonline
port = int(os.environ.get("SERVER_PORT", 19001))
class RequestHandler(BaseHTTPRequestHandler):
def do_POST(self):
lifecycles = {}
print("POST request received")
logging.debug("POST request received")
max_request_size = 1024
buildListener(matrixpinglistener, self)
content_length = self.headers.get("Content-Length")
# if self.path == "/_matrix/app/v1/ping":
# Check whether Content-Length exists
if content_length is None:
response = {
"status": "error",
"message": "Content length required"
}
status = 411
# from core.execution.createthread import buildThread
# thread = buildThread(synapsesetbridgeonline)
else:
# Attempt to convert the header into an integer
try:
length = int(content_length)
except ValueError:
length = None
# self.send_response(200)
# self.send_header("Content-Type", "application/json")
# self.send_header("Content-Length", "2")
# self.end_headers()
# self.wfile.write(b"{}")
# return
# Validate the converted length
if length is None:
response = {
"status": "error",
"message": "Invalid Content-Length"
}
status = 400
# else:
# print("POST request received")
elif length < 0:
response = {
"status": "error",
"message": "Bad Request"
}
status = 400
# max_request_size = 1024
elif length > max_request_size:
response = {
"status": "error",
"message": "Content exceeds maximum request size"
}
status = 413
# content_length = self.headers.get("Content-Length")
else:
# Content-Length is valid, so read the body
data = self.rfile.read(length)
# # Check whether Content-Length exists
# if content_length is None:
# response = {
# "status": "error",
# "message": "Content length required"
# }
# status = 411
try:
request = json.loads(data)
# else:
# # Attempt to convert the header into an integer
# try:
# length = int(content_length)
# except ValueError:
# length = None
except json.JSONDecodeError:
response = {
"status": "error",
"message": "Invalid JSON received"
}
status = 400
# # Validate the converted length
# if length is None:
# response = {
# "status": "error",
# "message": "Invalid Content-Length"
# }
# status = 400
else:
# Only valid JSON reaches the dispatcher
thread, lifecycles, module, mode = dispatchRequest(
request, lifecycles
)
# elif length < 0:
# response = {
# "status": "error",
# "message": "Bad Request"
# }
# status = 400
response = buildResponse(module, thread, mode)
status = 200
# elif length > max_request_size:
# response = {
# "status": "error",
# "message": "Content exceeds maximum request size"
# }
# status = 413
# Serialize the response
responsebytes = json.dumps(response).encode("utf-8")
# else:
# # Content-Length is valid, so read the body
# data = self.rfile.read(length)
# Send one HTTP response
self.send_response(status)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(responsebytes)))
self.end_headers()
# try:
# request = json.loads(data)
self.wfile.write(responsebytes)
# except json.JSONDecodeError:
# response = {
# "status": "error",
# "message": "Invalid JSON received"
# }
# status = 400
# else:
# # Only valid JSON reaches the dispatcher
# thread, lifecycles, module, mode = dispatchRequest(
# request, lifecycles
# )
# response = buildResponse(module, thread, mode)
# status = 200
# # Serialize the response
# responsebytes = json.dumps(response).encode("utf-8")
# # Send one HTTP response
# self.send_response(status)
# self.send_header("Content-Type", "application/json")
# self.send_header("Content-Length", str(len(responsebytes)))
# self.end_headers()
# self.wfile.write(responsebytes)
def do_PUT(self):
print("PUT request received")
logging.debug("PUT request received")
outputs = buildListener(synapselistener, self)
buildListener(synapselistener, self)
def startServer():
server = HTTPServer(("0.0.0.0", port), RequestHandler)
print(f"Server listening on port {port}")
#outputs = {}
#outputs, response = buildAction(pingsynapse, outputs)
logging.info(f"Server listening on port {port}")
server.serve_forever()
+34 -13
View File
@@ -1,27 +1,48 @@
import threading
import logging
import os
from core.server.server import startServer
from core.execution.createthread import buildThread
from plugins.rmass.monitors import rmassmonitor
from plugins.rmass.actions import refresh_tokens
from plugins.rmass.operations import token_update
from plugins.rmass.actions import pingsynapse
from core.console import console
from rich.logging import RichHandler
logging.basicConfig(
level=os.environ.get("LOG_LEVEL", "WARNING").upper(),
format="%(message)s",
handlers=[
RichHandler(
console=console,
show_time=False,
show_path=False
)
],
force=True
)
import login
import synapsemessagepush
lifecycles ={}
lifecycles[rmassmonitor.name] = {}
lifecycles[rmassmonitor.name]["mode"] = "continuous"
thread, lifecycles = buildThread(rmassmonitor, lifecycles)
lifecycles[refresh_tokens.name] = {}
lifecycles[refresh_tokens.name]["mode"] = "continuous"
thread, lifecycles = buildThread(refresh_tokens, lifecycles)
thread = threading.Thread(
target=startServer,
#args=(module, lifecycles)
name="RMASS Bridge Server"
)
thread.start()
pingsynapse.mode = "continuous"
rmassmonitor.mode = "continuous"
token_update.mode = "continuous"
#refresh_tokens.mode = "continuous"
thread = buildThread(rmassmonitor)
#thread = buildThread(refresh_tokens)
thread = buildThread(token_update)
thread = buildThread(pingsynapse)
+1 -1
View File
@@ -3,5 +3,5 @@ from core.execution.operation import buildOperation
outputs = {}
outputs = buildOperation(rmass.operations.login, outputs)
responses = buildOperation(rmass.operations.login, outputs)
+1 -1
View File
@@ -7,6 +7,6 @@ definition = rmassmonitor
outputs = {}
resolved = {}
while True:
outputs = buildMonitor(definition, outputs)
response = buildMonitor(definition, outputs)
time.sleep(definition.refreshrate)
+1 -1
View File
@@ -2,5 +2,5 @@ from plugins import rmass
from core import buildAction
outputs = {}
outputs = buildAction(rmass.actions.pingsynapse, outputs)
response = buildAction(rmass.actions.pingsynapse, outputs)
+3 -1
View File
@@ -2,7 +2,9 @@ name = "Get CSRF token"
kind = "action"
showstatus = True
alias = "getcsrf"
showstatus = False
method = "GET"
@@ -4,6 +4,12 @@ kind = "action"
alias = "getrmassattachmentid"
depends = [
"synapsegetattachment",
"getrmassattachmenturl",
"synapseattachmenttormass",
]
showstatus = True
resolve = {
@@ -4,6 +4,11 @@ kind = "action"
alias = "getrmassattachmenturl"
depends = [
"synapsegetroomalias",
"synapsegetattachment",
]
showstatus = True
resolve = {
@@ -47,4 +52,10 @@ filters = [
"filtervalue": "m.text",
"print": f"No image detected. Bypassing attachment push",
},
{
"filterkey": "event_id",
"operator": "==",
"filtervalue": {"outputs": "db_event_id"},
"print": f"Message already delivered. Bypassing {name}",
},
]
+3 -1
View File
@@ -4,7 +4,9 @@ name = "Get User Avatar"
kind = "action"
alias = "getavatar"
alias = "getrmassuseravatar"
depends = []
allowaction = bool(os.environ.get("UPDATE_AVATARS", True))
+2
View File
@@ -2,6 +2,8 @@ import os
name = "Login"
alias = "login"
kind = "action"
showstatus = True
+4 -2
View File
@@ -1,11 +1,13 @@
name = "Synapse Wake"
name = "Synapse Ping"
kind = "action"
alias = "synapseping"
alias = "pingsynapse"
showstatus = True
sleeptime = 15
isrequest = True
method = "POST"
+1 -1
View File
@@ -4,7 +4,7 @@ name = "Get message list"
kind = "action"
alias = "pullmessages"
alias = "pullmessagelist"
showstatus = True
+11
View File
@@ -5,6 +5,8 @@ name = "Token refresh"
kind = "action"
alias = "refresh_tokens"
showstatus = True
method = "GET"
@@ -44,6 +46,15 @@ outputs = {
"refresh_token": "refreshToken",
}
responsepolicy = [
{
"statuscode": 403,
"print": "Refreshing stale tokens...",
"execute": login,
"response_update": False,
}
]
recoverPolicy = {
FileNotFoundError: [
getcsrf,
+17 -7
View File
@@ -4,6 +4,16 @@ from . import synapsenotify
name = "RMASS Attachment Push"
alias = "rmassattachmentpush"
depends = [
"synapsegetroomalias",
"synapsegetattachment",
"getrmassattachmenturl",
"synapseattachmenttormass",
"getrmassattachmentid",
]
kind = "action"
showstatus = True
@@ -38,16 +48,16 @@ resolve = {
}
keys = [
#{
# "keytitle": "message",
# "keyvalue": {
# "resolved": "message_body",
# },
#},
{
"keytitle": "message",
"keyvalue": "Here's a photo!",
"keyvalue": {
"resolved": "message_body",
},
},
#{
# "keytitle": "message",
# "keyvalue": "Here's a photo!",
#},
#{
# "keytitle": "profileId",
# "keyvalue": {
@@ -2,7 +2,11 @@ name = "Upload Attachments to Synapse"
kind = "action"
alias = "uploadattachment"
alias = "rmassuploadattachmenttosynapse"
depends = [
"getrmassattachments",
]
showstatus = True
@@ -4,7 +4,11 @@ name = "Upload Avatar to Synapse"
kind = "action"
alias = "uploadavatar"
alias = "rmassavatartosynapse"
depends = [
"getrmassuseravatar",
]
allowaction = os.environ.get("UPDATE_AVATARS", True)
+23
View File
@@ -4,6 +4,13 @@ from . import synapsenotify
name = "RMASS Message Push"
alias = "rmassmessagepush"
depends = [
"synapsegetroomalias",
"synapsegetlastmessage",
]
kind = "action"
showstatus = True
@@ -70,6 +77,7 @@ responsepolicy = [
"statuscode": 400,
"print": "Message is too short. Notifying...",
"execute": synapsenotify,
"response_update": False,
}
]
@@ -80,12 +88,27 @@ outputs = {
##Filter test against recursiveset
filters = [
{
"filterkey": "message_body",
#"filterkey_lib": "resolved",
"filterkey_format": "length",
"execute": synapsenotify,
"operator": "<",
"filtervalue": 5,
"print": f"Message body is less than 5 characters. Notifying with {synapsenotify.name}...",
},
{
"filterkey": "msgtype",
"operator": "==",
"filtervalue": "m.image",
"print": f"Image detected. Pushing attachment",
},
{
"filterkey": "event_id",
"operator": "==",
"filtervalue": {"outputs": "db_event_id"},
"print": f"Message already delivered. Bypassing {name}",
},
# {
# "filterkey": "matrix_sender",
# "operator": "!=",
@@ -2,7 +2,13 @@ name = "Save RMASS Message ID"
kind = "action"
alias = "getmessage"
alias = "savermassmessageid"
depends = [
"synapsegetroomalias",
"rmassmessagepush",
"rmassattachmentpush",
]
showstatus = True
@@ -2,6 +2,13 @@ import os
name = "Synapse Assign Avatar"
alias = "synapseassignavatar"
depends = [
"getrmassuseravatar",
"rmassavatartosynapse",
]
kind = "action"
showstatus = True
@@ -2,6 +2,15 @@ import os
name = "Synapse Assign DM Room Avatar"
alias = "synapseassigndmavatar"
depends = [
"getrmassuseravatar",
"rmassavatartosynapse",
#"synapsegetroomid",
#"synapsecreatedmroom",
]
kind = "action"
showstatus = True
@@ -6,6 +6,10 @@ kind = "action"
showstatus = True
alias = "synapseassignusername"
#depends = []
#astoken = os.environ["AS_TOKEN"]
resolve = {
@@ -2,7 +2,12 @@ name = "Upload Attachments to RMASS"
kind = "action"
alias = "uploadrmassattachment"
alias = "synapseattachmenttormass"
depends = [
"synapsegetattachment",
"getrmassattachmenturl",
]
showstatus = True
@@ -6,6 +6,10 @@ kind = "action"
showstatus = True
alias = "synapsecreatedmroom"
depends = []
resolve = {
"get": {
"sender": ["messageheaders", "userCard", "id"],
+12 -1
View File
@@ -4,7 +4,12 @@ kind = "action"
showstatus = True
alias = "getsynapseattachment"
alias = "synapsegetattachment"
depends = [
"synapsegetroomalias",
"synapsegetlastmessage",
]
## PRE-RUNTIME ACTIONS
@@ -56,4 +61,10 @@ filters = [
"filtervalue": "m.text",
"print": f"No image detected. Bypassing attachment push",
},
{
"filterkey": "event_id",
"operator": "==",
"filtervalue": {"outputs": "db_event_id"},
"print": f"Message already delivered. Bypassing {name}",
},
]
+22 -10
View File
@@ -1,7 +1,13 @@
name = "Get Last Synapse Message"
alias = "synapsegetlastmessage"
kind = "action"
depends = [
"synapsegetroomalias",
]
showstatus = True
isrequest = True
@@ -11,7 +17,7 @@ method = "GET"
resolve = {
"get": {
#"sender": ["room_name"],
#"event_id": ["outmessageitem", "event_id"],
"event_id": ["outmessageitem", "event_id"],
#"message_body": ["outmessageitem", "content", "body"],
"room_id": ["outmessageitem", "room_id"],
#"timestamp": ["outmessageitem", "origin_server_ts"],
@@ -41,16 +47,22 @@ outputs = {
}
filters = [
# {
# "filterkey": "rmass_sent_status",
# "operator": "==",
# "filtervalue": "fail",
# "print": f"Failed to send message to RMASS. Bypassing {name}...",
# },
# {
# "filterkey": "rmass_sent_status",
# "operator": "==",
# "filtervalue": "error",
# "print": f"Failed to send message to RMASS. Bypassing {name}...",
# },
{
"filterkey": "rmass_sent_status",
"filterkey": "event_id",
"operator": "==",
"filtervalue": "fail",
"print": f"Failed to send message to RMASS. Bypassing save during {name}...",
},
{
"filterkey": "rmass_sent_status",
"operator": "==",
"filtervalue": "error",
"print": f"Failed to send message to RMASS. Bypassing save during {name}...",
"filtervalue": {"outputs": "db_event_id"},
"print": f"Message already delivered. Bypassing {name}",
},
]
+28 -9
View File
@@ -4,6 +4,10 @@ kind = "action"
showstatus = True
alias = "synapsegetroomalias"
depends = []
## PRE-RUNTIME ACTIONS
resolve = {
@@ -11,7 +15,7 @@ resolve = {
"room_id": ["outmessageitem", "room_id"],
# "matrix_sender": ["outmessageitem", "sender"],
# "msg_type": ["outmessageitem", "type"],
# "echo_tag": ["outmessageitem", "content", "com.loxthelion.rmass_message_id"],
"event_id": ["outmessageitem", "event_id"],
},
}
@@ -42,13 +46,28 @@ outputs = {
"room_alias": "alias"
}
#filters = [
# {
# "filterkey": "outmessageitem",
# "operator": "in",
# "filtervalue": "state_key",
# "print": f"Excluding state.key event during {name}",
# },
readrow = {
"table": "message_mapping",
"columns": [
{"rmass_message_id": "INTEGER PRIMARY KEY"},
{"matrix_event_id": "TEXT NOT NULL UNIQUE"},
],
"searchcolumn": "matrix_event_id",
"rowsearchvalue": [
{"resolved": "event_id"},
],
"export": {
1: "db_event_id",
}
}
filters = [
{
"filterkey": "event_id",
"operator": "==",
"filtervalue": {"outputs": "db_event_id"},
"print": f"Message already delivered. Bypassing {name}",
},
# {
# "filterkey": "matrix_sender",
# "operator": "!=",
@@ -67,4 +86,4 @@ outputs = {
# "filtervalue": None,
# "print": f"Excluding imported message event during {name}",
# },
#]
]
@@ -4,6 +4,12 @@ name = "Synapse Get Room ID"
kind = "action"
alias = "synapsegetroomid"
#depends = [
# "synapsecreatedmroom",
#]
showstatus = True
resolve = {
+2 -9
View File
@@ -10,15 +10,8 @@ showstatus = True
resolve = {
"get": {
"sender": ["room_name"],
"event_id": ["outmessageitem", "event_id"],
"room_id": ["outmessageitem", "room_id"],
},
"deconstruct": {
"sender" : [
"#rmass_dm_",
":loxthelion.com",
],
"event_id": ["events", 0, "event_id"],
"room_id": ["events", 0, "room_id"],
},
}
@@ -2,6 +2,13 @@ from . import synapsenotify
name = "Synapse Attachment Push"
alias = "synapsepushattachments"
depends = [
"getrmassattachments",
"rmassattachmenttosynapse",
]
kind = "action"
showstatus = True
+2 -2
View File
@@ -1,9 +1,9 @@
from . import synapsenotify
name = "Synapse Message Push"
kind = "action"
alias = "synapsepushmessagesaction"
showstatus = True
resolve = {
+4
View File
@@ -6,6 +6,10 @@ kind = "action"
showstatus = True
alias = "synapseregister"
#depends = []
resolve = {
"get": {
"sender": ["messageheaders", "userCard", "id"],
@@ -0,0 +1,36 @@
name = "Set RMASS Bridge Online"
kind = "action"
alias = "setrmassbridgeonline"
showstatus = True
#sleeptime = 15
isrequest = True
method = "PUT"
path = [
"https://loxthelion.com/_matrix/client/v3/presence/@rmass_bridge:loxthelion.com/status",
]
headers = {
"Authorization": {
"os": "AS_TOKEN",
"prefix": "Bearer ",
},
"Content-Type": "application/json",
}
keys = [
{
"keytitle": "presence",
"keyvalue": "online",
},
{
"keytitle": "status_msg",
"keyvalue": "RMASS Bridge Connected",
},
]
@@ -0,0 +1,16 @@
from plugins.rmass.actions import synapsesetbridgeonline
name = "Matrix Ping Listener"
kind = "listener"
acceptpath = "/_matrix/app/v1/ping"
execute = {
"module": synapsesetbridgeonline,
"engine": "thread",
}
status_code = {
"success": 200
}
+40 -2
View File
@@ -1,4 +1,5 @@
from plugins.rmass.operations import rmassmessagepush
from plugins.rmass.actions import synapsenotify
name = "Synapse Listener"
@@ -8,6 +9,19 @@ outputs = {
"events": "events",
}
resolve = {
"get": {
"sender": ["sender"],
"event_id": ["event_id"],
"message_body": ["content", "body"],
"content": ["content"],
"type": ["type"],
"room_id": ["room_id"],
"timestamp": ["origin_server_ts"],
"filter_item": []
}
}
recursive = {
"source": "events",
"reverse": False,
@@ -16,27 +30,51 @@ recursive = {
acceptpath = "/_matrix/app/v1/transactions/"
execute = rmassmessagepush
execute = {
"module": rmassmessagepush,
"engine": "contract",
}
filters = [
{
"filterkey": "event",
"filterkey": "filter_item",
"operator": "in",
"filtervalue": "state_key",
"print": "Excluding state.key event",
"status_code": 200,
},
{
"filterkey": "sender",
"operator": "!=",
"filtervalue": "@lyncoln:loxthelion.com",
"print": "Excluding message loop item",
"status_code": 200,
},
{
"filterkey": "type",
"operator": "!=",
"filtervalue": "m.room.message",
"print": "Excluding non-room message event",
"status_code": 200,
},
{
"filterkey": "content",
"operator": "in",
"filtervalue": "com.loxthelion.rmass_message_id",
"print": "Excluding imported message loop item",
"status_code": 200,
},
{
"filterkey": "message_body",
#"filterkey_lib": "resolved",
"filterkey_format": "length",
"execute": synapsenotify,
"operator": "<",
"filtervalue": 5,
"print": f"Message body is less than 5 characters. Notifying with {synapsenotify.name}...",
"status_code":200
},
]
print = "Matrix transaction received"
+1 -1
View File
@@ -59,7 +59,7 @@ filters = [
},
]
sleeptime = 30
sleeptime = 15
#prints = {
# "Status": "message",
@@ -3,10 +3,16 @@ from plugins.rmass.operations import synapsepushmessageitems
name = "Get RMASS Conversations and Synapse Provisioning"
alias = "getrmassconversations"
depends = [
"pullmessagelist",
]
kind = "recursiveset"
recursiveset = {
"source": "pullmessages_select",
"source": "pullmessagelist_select",
"outputlabel": "messageheaders",
"actions": [
synapseregister,
+1 -1
View File
@@ -1,6 +1,6 @@
from plugins.rmass.actions import getcsrf, login
name = "Login"
name = "Login Operation"
kind = "operation"
@@ -0,0 +1,20 @@
from plugins.rmass.actions import synapsegetattachment, getrmassattachmenturl, synapseattachmenttormass, getrmassattachmentid, rmassattachmentpush
name = "RMASS Attachment Push"
alias = "rmassattachmentpushflow"
depends = [
"synapsegetroomalias",
"synapsegetlastmessage",
]
kind = "operation"
actions = [
synapsegetattachment,
getrmassattachmenturl,
synapseattachmenttormass,
getrmassattachmentid,
rmassattachmentpush,
]
+7 -12
View File
@@ -1,25 +1,20 @@
from plugins.rmass.actions import rmassmessagepush, synapsegetroomalias, refresh_tokens, synapsegetlastmessage, getrmassconversation, synapsegetattachment, getrmassattachmenturl, synapseattachmenttormass, getrmassattachmentid, rmassattachmentpush
from plugins.rmass.actions import rmassmessagepush, savermassmessageid, synapsegetroomalias, synapsegetlastmessage
from plugins.rmass.operations import rmassattachmentpushflow
name = "RMASS Message Push"
name = "Message Forwarding to RMASS"
kind = "recursiveset"
recursiveset = {
"source": "events",
"source": "firewall_allowed",
#"retain": False,
"outputlabel": "outmessageitem",
"actions": [
#refresh_tokens,
synapsegetroomalias,
synapsegetlastmessage,
rmassmessagepush,
synapsegetlastmessage,
synapsegetattachment,
getrmassattachmenturl,
synapseattachmenttormass,
getrmassattachmentid,
rmassattachmentpush,
synapsegetlastmessage,
getrmassconversation,
rmassattachmentpushflow,
savermassmessageid,
],
}
@@ -2,10 +2,14 @@ from plugins.rmass.actions import pullmessagelist, refresh_tokens, getmessage, s
from plugins.rmass.operations import getrmassconversations, synapsepushmessageitems
name = "Get Message List"
name = "Retrieve and Forward RMASS Messages"
kind = "operation"
alias = "synapsemessagepushoperation"
track = True
actions = [
#refresh_tokens,
pullmessagelist,
@@ -4,6 +4,8 @@ kind = "recursiveset"
name = "Synapse Attachment Push Recursive Set"
alias = "synapsepushmessageattachments"
recursiveset = {
"source": "attachment_list",
"reverse": False,
@@ -5,6 +5,8 @@ kind = "recursiveset"
name = "Synapse Message Push Recursive Set"
alias = "synapserecursivemessagepush"
recursiveset = {
"source": "getmessage_select",
"reverse": True,
+13
View File
@@ -0,0 +1,13 @@
import os
from plugins.rmass.actions import refresh_tokens
name = "Token Refresh Operation"
kind = "operation"
actions = [
refresh_tokens,
]
sleeptime = os.environ.get("TOKEN_REFRESH_RATE", 105)
+1
View File
@@ -1 +1,2 @@
requests
rich
+1 -1
View File
@@ -5,6 +5,6 @@ from core.execution.operation import buildOperation
outputs ={}
while True:
outputs = buildOperation(rmass.operations.setavailable, outputs)
responses = buildOperation(rmass.operations.setavailable, outputs)
time.sleep(rmass.operations.setavailable.sleeptime)
+1 -1
View File
@@ -3,5 +3,5 @@ from core.execution.operation import buildOperation
outputs = {}
outputs = buildOperation(rmass.operations.synapsemessagepush, outputs)
responses = buildOperation(rmass.operations.synapsemessagepush, outputs)
-5
View File
@@ -1,5 +0,0 @@
from plugins import rmass
from core.operation.operation import buildOperation
outputs = buildOperation(rmass.checkavailableoperation)
-17
View File
@@ -1,17 +0,0 @@
import importlib
from lifecyclemanager import manageLifecycle
from dispatchstate import buildState
def buildDispatch(request):
dispatch = []
for key in request["module"]:
dispatch.append(request["module"][key])
resolveddispatch = "plugins."+ ".".join(dispatch)
module = importlib.import_module(resolveddispatch)
mode = request.get("mode", "oneshot")
return module, mode
-30
View File
@@ -1,30 +0,0 @@
import threading
from lifecycleregistry import registerLifecycle
from lifecyclemanager import manageLifecycle
threadlist = []
threadnum = 0
def buildThread(module, lifecycles):
global threadnum
threadnum += 1
threadname = f"thread.{threadnum}"
thread = threading.Thread(
target=manageLifecycle,
args=(module, lifecycles)
)
thread.start()
registryname = threadname
registryvalue = thread
lifecycles = registerLifecycle (module, lifecycles, registryname, registryvalue)
threadlist.append(thread)
print(threadlist)
print(lifecycles)
return threadnum, threadname, lifecycles, threadlist
-22
View File
@@ -1,22 +0,0 @@
from createdispatch import buildDispatch
from createthread import buildThread
from dispatchstate import buildState
import threading
def dispatchRequest(request, lifecycles):
module, mode = buildDispatch(request)
mode, lifecycles = buildState(module, mode, lifecycles)
if mode == "stop":
return lifecycles
else:
threadnum, threadname, lifecycles, threadlist = buildThread(module, lifecycles)
#print("Active Threads")
#print(threadlist)
return threadnum, threadname, lifecycles, threadlist
-41
View File
@@ -1,41 +0,0 @@
import requests
from lifecycleregistry import registerLifecycle
def filterMode(mode):
if mode in ("continuous", "oneshot", "stop"):
state = mode
return state
else: raise ValueError(f"Unsupported lifecycle mode: {mode}")
def buildState(module, mode, lifecycles):
state = filterMode(mode)
registryvalue = state
registryname = "mode"
if state != "stop":
lifecycles = registerLifecycle(module, lifecycles, registryname, registryvalue)
elif state == "stop":
if not module.name in lifecycles:
print(f"No registered lifecycle: {module.name}")
return None
elif "mode" in lifecycles[module.name] != "stop":
lifecycles = registerLifecycle(module, lifecycles, registryname, registryvalue)
print(f"Stopping lifecycle: {module.name}")
#elif mode == "oneshot":
#registryvalue = {"mode": "oneshot"}
#lifecycles = registerLifecycle(module, lifecycles, registryname, registryvalue)
# else:
#raise ValueError(f"Unsupported lifecycle mode: {mode}")
#state = registryvalue
return state, lifecycles
-25
View File
@@ -1,25 +0,0 @@
import time
from core.execution.operation import buildOperation
from core.execution.action import buildAction
from core import executeContract
def manageLifecycle(module, lifecycles): #lifecycles, state):
#print(lifecycles[module.name]["mode"])
if lifecycles[module.name]["mode"] == "continuous":
while lifecycles[module.name]["mode"] == "continuous":
print(lifecycles)
outputs = executeContract(module)
#print(lifecycles)
time.sleep(module.sleeptime)
elif lifecycles[module.name]["mode"] == "oneshot":
print(lifecycles)
outputs = executeContract(module)
#print(lifecycles)
return
-8
View File
@@ -1,8 +0,0 @@
def registerLifecycle(module, lifecycles, registryname, registryvalue):
if module.name not in lifecycles:
lifecycles[module.name] = {}
lifecycles[module.name][registryname] = registryvalue
return lifecycles
-4
View File
@@ -1,4 +0,0 @@
from plugins import rmass
from operation import buildOperation
outputs = buildOperation(rmass.checkavailableoperation)
-4
View File
@@ -1,4 +0,0 @@
from core.manager.manager import buildManager
from plugins import rmass
outputs = buildManager(rmass.manager)
-29
View File
@@ -1,29 +0,0 @@
import socket
import json
from dispatcher import dispatchRequest
#from createthread import buildThread
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("127.0.0.1", 19002))
lifecycles = {}
server.listen()
while True:
connection, address = server.accept()
while True:
data = connection.recv(4096)
request = json.loads(data)
# if not data:
# break
dispatch = dispatchRequest(request, lifecycles)
connection.close()
# server.close()