Compare commits

..
30 Commits
Author SHA1 Message Date
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
38 changed files with 336 additions and 123 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
from .server import server from .server import server
from .apirequest import executeRequest 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 import buildOperation, buildAction
from .execution.action import buildAction from .execution.action import buildAction
from .execution.operation import buildOperation from .execution.operation import buildOperation
+3 -1
View File
@@ -1,6 +1,7 @@
import requests import requests
import threading import threading
import os import os
import time
from .request import buildRequest from .request import buildRequest
#session = requests.Session() #session = requests.Session()
@@ -15,6 +16,7 @@ def getSession(reset=False):
if not hasattr(_thread_local, "session"): if not hasattr(_thread_local, "session"):
session = requests.Session() session = requests.Session()
session.name = threading.current_thread().name session.name = threading.current_thread().name
session.created_at = time.monotonic()
_thread_local.session = session _thread_local.session = session
return _thread_local.session return _thread_local.session
@@ -23,7 +25,7 @@ def getSession(reset=False):
def executeRequest(action, outputs, resolved): def executeRequest(action, outputs, resolved):
session = getSession() session = getSession()
session_log = bool(os.environ.get("LOGS_SESSION", False)) session_log = os.environ.get("LOGS_SESSION", "false").lower() == "true"
if session_log: if session_log:
print( print(
+5 -2
View File
@@ -18,12 +18,15 @@ def buildRequest(definition, outputs, resolved):
request["headers"] = buildHeaders(definition, request, outputs, resolved) request["headers"] = buildHeaders(definition, request, outputs, resolved)
if hasattr(definition, "requestdata"): 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( request["data"] = buildObject2(
definition.requestdata, definition.requestdata,
outputs, outputs,
resolved resolved
) )
# resolveddata = definition.requestdata # resolveddata = definition.requestdata
# #
# if isinstance(resolveddata, dict): # if isinstance(resolveddata, dict):
+11 -4
View File
@@ -1,11 +1,14 @@
import logging
from core.apirequest import executeRequest from core.apirequest import executeRequest
from core.runtime.runtimecontract import buildRuntimeAttr, buildPreRuntimeAttr from core.runtime.runtimecontract import buildRuntimeAttr, buildPreRuntimeAttr
from core.runtime.stopsignals import addStopSignal #from core.runtime.stopsignals import addStopSignal
def buildAction (action, outputs): def buildAction (action, outputs, process):
action_log = True
outputs, resolved, match, filter = buildPreRuntimeAttr(action, outputs) outputs, resolved, match, filter = buildPreRuntimeAttr(action, outputs, process)
if hasattr(action, "allowaction"): if hasattr(action, "allowaction"):
if not action.allowaction: if not action.allowaction:
@@ -19,6 +22,10 @@ def buildAction (action, outputs):
if response is None: if response is None:
return outputs, None return outputs, None
outputs, response = buildRuntimeAttr(action, outputs, resolved, response) #outputs["processes"][process.name][action.name]["response"] = response
outputs, response = buildRuntimeAttr(action, outputs, resolved, response, process)
if action_log:
logging.info(f"{action.name} completed")
return outputs, response return outputs, response
+4 -21
View File
@@ -1,32 +1,15 @@
import threading import threading
from .lifecyclemanager import registerLifecycle
from .lifecyclemanager import manageLifecycle from .lifecyclemanager import manageLifecycle
threadlist = [] def buildThread(module):
#threadnum = 0
def buildThread(module, lifecycles):
#global threadnum
#threadnum += 1
#threadname = f"thread.{threadnum}"
thread = threading.Thread( thread = threading.Thread(
target=manageLifecycle, target=manageLifecycle,
args=(module, lifecycles), args=(module,),
name=module.name name=module.name
) )
thread.start() thread.start()
registryname = thread.name return thread
registryvalue = thread
lifecycles = registerLifecycle (module, lifecycles, registryname, registryvalue)
threadlist.append(thread)
#print(threadlist)
#print(lifecycles)
return thread, lifecycles
+3 -3
View File
@@ -1,10 +1,10 @@
from core.execution.action import buildAction from core.execution.action import buildAction
from core.execution.operation import buildOperation from core.execution.operation import buildOperation
from core.execution.monitor import buildMonitor from core.execution.monitor import buildMonitor
from core.runtime import manageFailure #from core.runtime import manageFailure
from core.execution.recursive import buildRecursive from core.execution.recursive import buildRecursive
def executeContract(module, outputs): def executeContract(module, outputs, process):
#print("DEBUGGING") #print("DEBUGGING")
#print(module.name) #print(module.name)
if module.kind == "operation": if module.kind == "operation":
@@ -15,7 +15,7 @@ def executeContract(module, outputs):
elif module.kind == "action": elif module.kind == "action":
outputs, response = buildAction(module, outputs) outputs, response = buildAction(module, outputs, process)
return outputs, response return outputs, response
@@ -1,30 +1,42 @@
import time import time
import os import os
from core.execution.operation import buildOperation
from core.execution.action import buildAction
from core.execution.executioncontract import executeContract 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 = {}
def manageLifecycle(module, lifecycles): #lifecycles, state): def manageLifecycle(module):
lifecycle_log = os.environ.get("LOGS_LIFECYCLE", "false").lower() == "true"
outputs = {} outputs = {}
registerLifecycle (module, lifecycles)
if lifecycles[module.name]["mode"] == "continuous": if lifecycles[module.name]["mode"] == "continuous":
while lifecycles[module.name]["mode"] == "continuous": while lifecycles[module.name]["mode"] == "continuous":
lifecycles[module.name]["state"] = "active"
outputs, response = executeContract(module, outputs) outputs, response = executeContract(module, outputs, None)
lifecycle_log = bool(os.environ.get("LOGS_LIFECYCLE", False))
if lifecycle_log: if lifecycle_log:
print(f"{module.name} thread {lifecycles[module.name][module.name]} running in {lifecycles[module.name]['mode']} mode") 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": elif lifecycles[module.name]["mode"] == "oneshot":
print(lifecycles) lifecycles[module.name]["state"] = "active"
outputs, response = executeContract(module)
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, outputs, None)
lifecycles[module.name]["state"] = "stopped"
#print(lifecycles)
return return
@@ -1,8 +1,39 @@
def registerLifecycle(module, lifecycles, registryname, registryvalue): import threading
from core.apirequest.execute import getSession
def registerLifecycle(module, lifecycles):
if module.name not in lifecycles: if module.name not in lifecycles:
lifecycles[module.name] = {} lifecycles[module.name] = {}
thread = threading.current_thread()
lifecycles[module.name][thread.name] = thread
session = getSession()
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]:
mode = getattr(module, "mode")
lifecycles[module.name]["mode"] = mode
if lifecycles[module.name]["mode"] == "continuous":
lifecycles[module.name]["refresh_rate"] = module.sleeptime
if not lifecycles[module.name]["mode"]:
lifecycles[module.name]["mode"] = "oneshot"
#lifecycles[module.name][registryname] = registryvalue
lifecycles[module.name][registryname] = registryvalue
return lifecycles return lifecycles
+4 -2
View File
@@ -16,6 +16,9 @@ def buildMonitor(monitor, outputs):
response, outputs = executeRequest(monitor, outputs, resolved) response, outputs = executeRequest(monitor, outputs, resolved)
if response is None:
return outputs, None
responsedata = response.json() responsedata = response.json()
readitems = resolveItem(monitor, responsedata) readitems = resolveItem(monitor, responsedata)
@@ -24,12 +27,11 @@ def buildMonitor(monitor, outputs):
outputs = buildOutput(response, monitor, outputs) outputs = buildOutput(response, monitor, outputs)
if match: if match:
module = filter["execute"] module = filter["execute"]
if module.kind == "action": if module.kind == "action":
outputs, response = buildAction(module, outputs) outputs, response = buildAction(module, outputs, None)
if module.kind == "operation": if module.kind == "operation":
outputs, responses = buildOperation(module, outputs) outputs, responses = buildOperation(module, outputs)
response = responses response = responses
+50 -14
View File
@@ -1,33 +1,69 @@
import logging import logging
import pprint
from rich.progress import track
from core.runtime.managefailure import manageFailure from core.runtime.managefailure import manageFailure
from core.execution.action.action import buildAction
from core.runtime.stopsignals import checkDependency from core.runtime.stopsignals import checkDependency
#from core.runtime.skipstep import skipStep from core.execution.processregistry import registerProcess
#from core.runtime.recursive import recursiveSet
outputs = {} outputs = {}
def buildOperation(definition, outputs):
from core.execution.executioncontract import executeContract
actions = definition.actions
responses = []
outputs["stopsignals"] = []
for action in actions:
stop = checkDependency(action, outputs)
#print(f"STOP SIGNAL DEBUGGING during {action.name}") def buildOperation(definition, outputs):
#print(outputs["stopsignals"]) process_log = True
from core.execution.executioncontract import executeContract
actions = definition.actions
outputs = registerProcess(definition, outputs)
responses = []
if getattr(definition, "track", False):
actions = track(
actions,
#description=definition.name
description=f"[green]{definition.name}[/green]"
)
for action in actions:
#Check if dependencies are in stop signal registry
stop = checkDependency(action, outputs, definition)
if stop: if stop:
continue continue
outputs, response = executeContract(action, outputs) #Register action before its execution
if action.kind == "action":
outputs["processes"][definition.name][action.name] = {}
#if hasattr(action, recursive) #Pass the definition through to the action so it can be passed into buildPreRuntimeAttr
#Definition should be passed through in order to give access to addStopSignal so it can write directly to the definition during buildPreRuntimeAttr
#Stop signal can optionally be engaged by doing addStopSignal inside the action definition
outputs, response = executeContract(action, outputs, definition)
responses.append(response) responses.append(response)
#Register responses in process registry
if action.kind == "action":
outputs["processes"][definition.name][action.name]["response"] = response
##Append completed process to process registry
outputs["processes"][definition.name]["completed"].append(action.alias)
#Temporarily disabled manageFailure functions
#except Exception as error: #except Exception as error:
#outputs = manageFailure(error, action, outputs) #outputs = manageFailure(error, action, outputs)
#Print completion status after runtime processes
if process_log:
logging.info(f"{definition.name} completed")
#For debugging purposes only
process_registry_logs = False
if process_registry_logs:
pprint.pprint(outputs["processes"])
return outputs, responses return outputs, responses
+12
View File
@@ -0,0 +1,12 @@
def registerProcess(module, outputs):
if not "processes" in outputs:
outputs["processes"] = {}
if not module.name in outputs["processes"]:
outputs["processes"][module.name] = {}
#outputs["processes"][module.name] = {}
outputs["processes"][module.name]["stopsignals"] = []
outputs["processes"][module.name]["completed"] = []
return outputs
+42 -10
View File
@@ -1,10 +1,23 @@
from core.execution import action import logging
from core.execution.action.action import buildAction import os
from core.runtime.runtimecontract import buildPreRuntimeAttr, buildRuntimeAttr
from core.apirequest import executeRequest
from core.runtime.stopsignals import checkDependency from core.runtime.stopsignals import checkDependency
from core.execution.processregistry import registerProcess
from rich.progress import track
def buildRecursive(definition, outputs): def buildRecursive(definition, outputs):
process_log = True
recursive_log = os.environ.get("LOGS_RECURSIVE", "false").lower() == "true"
#print(outputs[definition.recursiveset["source"]])
source = outputs.get(definition.recursiveset["source"])
if source is None or source == []:
return outputs, []
outputs = registerProcess(definition, outputs)
responses = [] responses = []
from core.execution.executioncontract import executeContract from core.execution.executioncontract import executeContract
recursiveset = definition.recursiveset["actions"] recursiveset = definition.recursiveset["actions"]
@@ -15,9 +28,12 @@ def buildRecursive(definition, outputs):
#print(f"RECURSIVE DEBUG DURING {definition.name}") #print(f"RECURSIVE DEBUG DURING {definition.name}")
#print(items) #print(items)
if items is None: #if items is None:
print(f"No items available in {source} for {definition.name}")
return outputs, None # if recursive_log:
# print(f"No items available in {source} for {definition.name}")
#
# return outputs, None
reverse = definition.recursiveset.get("reverse", False) reverse = definition.recursiveset.get("reverse", False)
@@ -25,18 +41,25 @@ def buildRecursive(definition, outputs):
#print("reversing") #print("reversing")
items = reversed(items) items = reversed(items)
for item in items: for item in track(
items,
description=f"[green]{definition.name}[/green]"
):
#for item in items:
outputs[definition.recursiveset["outputlabel"]] = item outputs[definition.recursiveset["outputlabel"]] = item
outputs["stopsignals"] = [] outputs["stopsignals"] = []
for job in recursiveset: for job in recursiveset:
stop = checkDependency(job, outputs)
stop = checkDependency(job, outputs, definition)
#print(f"STOP SIGNAL DEBUGGING during {job.name}") #print(f"STOP SIGNAL DEBUGGING during {job.name}")
#print(outputs["stopsignals"]) #print(outputs["stopsignals"])
#print(stop) #print(stop)
if stop: if stop:
#outputs["processes"][definition.name]["stopsignals"].append(job.alias)
#print("STOP SIGNAL DETECTED") #print("STOP SIGNAL DETECTED")
#print(f"Stopping {job.name} due to stop signal") #print(f"Stopping {job.name} due to stop signal")
continue continue
@@ -44,9 +67,18 @@ def buildRecursive(definition, outputs):
#print(f"RECURSIVE DEBUG DURING {job.name}") #print(f"RECURSIVE DEBUG DURING {job.name}")
#print(item) #print(item)
#outputs, response = buildAction(job, outputs) #outputs, response = buildAction(job, outputs)
if job.kind == "action":
outputs["processes"][definition.name][job.name] = {}
outputs, response = executeContract(job, outputs) outputs, response = executeContract(job, outputs, definition)
responses.append(response) responses.append(response)
if job.kind == "action":
outputs["processes"][definition.name][job.name]["response"] = response
outputs["processes"][definition.name]["completed"].append(job.alias)
if process_log:
logging.info(f"{definition.name} completed")
retain = definition.recursiveset.get("retain", True) retain = definition.recursiveset.get("retain", True)
+1 -1
View File
@@ -7,5 +7,5 @@ from .outputs import buildOutput
from .savedata import buildSave, loadSave, saveRow, readRow from .savedata import buildSave, loadSave, saveRow, readRow
from .logs import buildLog from .logs import buildLog
#from . import managefailure #from . import managefailure
from .managefailure import manageFailure #from .managefailure import manageFailure
from .image import buildImage from .image import buildImage
+32
View File
@@ -0,0 +1,32 @@
import os
from core.runtime.applyconditions import applyConditions
def buildFirewall(listener, outputs):
firewall_log = os.environ.get("LOGS_FIREWALL", "false").lower() == "true"
status_code = 200
outputs["firewall_allowed"] = []
for item in outputs[listener.recursive["source"]]:
match, filter = applyConditions(listener, item, outputs)
if match:
status_code = filter.get("status_code", 200)
continue
#This needs to be moved into definitions but until logic is put in place it lives here.
if "com.loxthelion.rmass_message_id" in item.get("content", {}):
status_code = 200
print("Excluding previously imported items")
print(f"Returning status_code: {status_code}")
continue
outputs["firewall_allowed"].append(item)
if outputs["firewall_allowed"]:
return True, outputs, status_code
#Needs to be present to prevent TypeError
return False, outputs, status_code
+5 -1
View File
@@ -1,4 +1,5 @@
import logging import logging
import os
def buildLog (action, outputs, response): def buildLog (action, outputs, response):
if hasattr(action, "prints"): if hasattr(action, "prints"):
@@ -12,8 +13,11 @@ def buildLog (action, outputs, response):
except (KeyError, TypeError): except (KeyError, TypeError):
pass pass
response_log = os.environ.get("LOGS_SUCCESS_RESPONSE", "false").lower() == "true"
if action.showstatus is True and response.ok: 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: elif action.showstatus is True and not response.ok:
print(f"{action.name} failed with status code {response.status_code}") print(f"{action.name} failed with status code {response.status_code}")
+6 -1
View File
@@ -1,4 +1,8 @@
import os
def resolveItem(action, item): def resolveItem(action, item):
resolver_log = os.environ.get("LOGS_RESOLVER", "false").lower() == "true"
resolved = {} resolved = {}
if hasattr(action, "resolve"): if hasattr(action, "resolve"):
for label, keys in action.resolve["get"].items(): for label, keys in action.resolve["get"].items():
@@ -8,7 +12,8 @@ def resolveItem(action, item):
target = target[key] target = target[key]
except (KeyError, IndexError) as error: except (KeyError, IndexError) as error:
print(f"Resolver target key/index {error} not found during {action.name}") if resolver_log:
print(f"Resolver target key/index {error} not found during {action.name}")
target = None target = None
resolved[label] = target resolved[label] = target
+2 -2
View File
@@ -12,6 +12,6 @@ def responsePolicy(response, action, outputs, resolved):
response, outputs = executeRequest(policy["execute"], outputs, resolved) response, outputs = executeRequest(policy["execute"], outputs, resolved)
return outputs, resolved return outputs
return outputs, resolved return outputs
+8 -5
View File
@@ -7,7 +7,7 @@ from core.runtime.applyconditions import applyConditions
from core.runtime.responsepolicy import responsePolicy from core.runtime.responsepolicy import responsePolicy
from core.runtime.stopsignals import addStopSignal from core.runtime.stopsignals import addStopSignal
def buildPreRuntimeAttr(action, outputs): def buildPreRuntimeAttr(action, outputs, process):
outputs = loadSave(action, outputs) outputs = loadSave(action, outputs)
resolved = resolveItem(action, outputs) resolved = resolveItem(action, outputs)
@@ -17,18 +17,21 @@ def buildPreRuntimeAttr(action, outputs):
match, filter = applyConditions(action, resolved, outputs) match, filter = applyConditions(action, resolved, outputs)
if match: if match:
outputs = addStopSignal(action, outputs) outputs = addStopSignal(action, outputs, process)
return outputs, resolved, match, filter return outputs, resolved, match, filter
def buildRuntimeAttr(action, outputs, resolved, response): def buildRuntimeAttr(action, outputs, resolved, response, process):
outputs, resolved = responsePolicy(response, action, outputs, resolved) outputs = responsePolicy(response, action, outputs, resolved)
#print(f"Response status code: {response.status_code} during {action.name}")
#print(f"Response content: {response.content} during {action.name}")
outputs = buildOutput(response, action, outputs) outputs = buildOutput(response, action, outputs)
if not response.ok: if not response.ok:
outputs = addStopSignal(action, outputs) outputs = addStopSignal(action, outputs, process)
return outputs, response return outputs, response
resolved = extractItem(action, outputs, resolved) resolved = extractItem(action, outputs, resolved)
+8 -2
View File
@@ -2,6 +2,8 @@ import json
import os import os
def buildSave(action, outputs): def buildSave(action, outputs):
savedata_log = os.environ.get("LOGS_SAVE_DATA_ACCESS", "false").lower() == "true"
import tempfile import tempfile
if hasattr(action, "savedata"): if hasattr(action, "savedata"):
@@ -36,10 +38,13 @@ def buildSave(action, outputs):
except FileNotFoundError: except FileNotFoundError:
pass pass
#print(f"Data saved by {action.name} to {action.savepath}") if savedata_log:
print(f"Data saved by {action.name} to {action.savepath}")
return outputs return outputs
def loadSave(action, outputs): def loadSave(action, outputs):
savedata_log = os.environ.get("LOGS_SAVE_DATA_ACCESS", "false").lower() == "true"
if hasattr(action, "loaddata"): if hasattr(action, "loaddata"):
with open(f"{action.savepath}", "r") as save_file: with open(f"{action.savepath}", "r") as save_file:
load_data = json.load(save_file) load_data = json.load(save_file)
@@ -47,7 +52,8 @@ def loadSave(action, outputs):
for load_name in action.loaddata: for load_name in action.loaddata:
outputs[load_name] = load_data[load_name] outputs[load_name] = load_data[load_name]
#print(f"Data loaded by {action.name} from {action.savepath}") if savedata_log:
print(f"Data loaded by {action.name} from {action.savepath}")
return outputs return outputs
def saveRow(action, outputs, resolved): def saveRow(action, outputs, resolved):
+11 -2
View File
@@ -1,8 +1,14 @@
import os
def buildSelect(action, outputs): def buildSelect(action, outputs):
#***THIS IS THE CANONICAL BUILD*** #***THIS IS THE CANONICAL BUILD***
select_log = savedata_log = os.environ.get("LOGS_SELECT", "false").lower() == "true"
select_data = [] select_data = []
if hasattr(action, "select"): if hasattr(action, "select"):
#outputs[f"{action.alias}_select"] = []
try: try:
target = outputs[action.select["source"]] target = outputs[action.select["source"]]
includekey = action.select["include"]["key"] includekey = action.select["include"]["key"]
@@ -27,8 +33,11 @@ def buildSelect(action, outputs):
#outputs[{action.select["source"]}] = select_data #outputs[{action.select["source"]}] = select_data
outputs[f"{action.alias}_select"] = select_data outputs[f"{action.alias}_select"] = select_data
if select_data is None: #print(select_data)
print(f"No data selected during {action.name}")
if select_log:
if select_data is None:
print(f"No data selected during {action.name}")
return action, outputs return action, outputs
except KeyError as error: except KeyError as error:
+8 -5
View File
@@ -1,7 +1,9 @@
def checkDependency(action, outputs): #def checkDependency(action, outputs):
def checkDependency(action, outputs, operation):
if hasattr(action, "depends"): if hasattr(action, "depends"):
stop = any( stop = any(
dependency in outputs["stopsignals"] dependency in outputs["processes"][operation.name]["stopsignals"]
#dependency in outputs["stopsignals"]
for dependency in action.depends for dependency in action.depends
) )
@@ -10,8 +12,9 @@ def checkDependency(action, outputs):
return False return False
def addStopSignal(action, outputs): #def addStopSignal(action, outputs):
def addStopSignal(action, outputs, operation):
if hasattr(action, "depends"): if hasattr(action, "depends"):
outputs["stopsignals"].append(action.alias) outputs["processes"][operation.name]["stopsignals"].append(action.alias)
#outputs["stopsignals"].append(action.alias)
return outputs return outputs
+21 -14
View File
@@ -3,6 +3,8 @@ from core.runtime.outputs import buildOutput
from core.runtime.applyconditions import applyConditions from core.runtime.applyconditions import applyConditions
from core.execution.operation import buildOperation from core.execution.operation import buildOperation
from core.execution.executioncontract import executeContract from core.execution.executioncontract import executeContract
from core.runtime.firewall import buildFirewall
from core.execution.createthread import buildThread
def buildListener(listener, self): def buildListener(listener, self):
@@ -27,25 +29,30 @@ def buildListener(listener, self):
outputs = buildOutput(data, listener, outputs) outputs = buildOutput(data, listener, outputs)
for item in outputs[listener.recursive["source"]]: #for item in outputs[listener.recursive["source"]]:
match, filter = applyConditions(listener, item, outputs) #match, filter = applyConditions(listener, item, outputs)
if not match: #if not match:
if "com.loxthelion.rmass_message_id" in item.get("content", {}): # if "com.loxthelion.rmass_message_id" in item.get("content", {}):
print("Excluding previously imported items") # print("Excluding previously imported items")
#print(item) # #print(item)
continue # continue
print(item) allow, item, status_code = buildFirewall(listener, outputs)
#Process and forward to RMASS
outputs, responses = executeContract(listener.execute, outputs)
continue
self.send_response(200) if allow:
#Print allowed items for logging purposes
print(outputs["firewall_allowed"])
#Process and forward to RMASS
#thread, lifecycles = buildThread(listener.execute, lifecycles)
outputs, responses = executeContract(listener.execute, outputs, None)
self.send_response(status_code)
self.send_header("Content-Type", "application/json") self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", "2") self.send_header("Content-Length", "2")
self.end_headers() self.end_headers()
+2 -2
View File
@@ -17,7 +17,7 @@ port = int(os.environ.get("SERVER_PORT", 19001))
class RequestHandler(BaseHTTPRequestHandler): class RequestHandler(BaseHTTPRequestHandler):
def do_POST(self): def do_POST(self):
lifecycles = {} #lifecycles = {}
print("POST request received") print("POST request received")
max_request_size = 1024 max_request_size = 1024
@@ -97,7 +97,7 @@ class RequestHandler(BaseHTTPRequestHandler):
def do_PUT(self): def do_PUT(self):
print("PUT request received") #print("PUT request received")
outputs = buildListener(synapselistener, self) outputs = buildListener(synapselistener, self)
+12 -8
View File
@@ -1,23 +1,27 @@
import threading import threading
import logging
from core.server.server import startServer from core.server.server import startServer
#from core.execution.lifecyclemanager.lifecycleregistry import registerLifecycle
from core.execution.createthread import buildThread from core.execution.createthread import buildThread
from plugins.rmass.monitors import rmassmonitor from plugins.rmass.monitors import rmassmonitor
from plugins.rmass.actions import refresh_tokens from plugins.rmass.actions import refresh_tokens
logging.basicConfig(
level=logging.WARNING,
format="%(levelname)s: %(message)s"
)
import login import login
import synapsemessagepush import synapsemessagepush
lifecycles ={} rmassmonitor.mode = "continuous"
refresh_tokens.mode = "continuous"
thread = buildThread(rmassmonitor)
lifecycles[rmassmonitor.name] = {} thread = buildThread(refresh_tokens)
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( thread = threading.Thread(
target=startServer, target=startServer,
+3 -1
View File
@@ -2,7 +2,9 @@ name = "Get CSRF token"
kind = "action" kind = "action"
showstatus = True alias = "getcsrf"
showstatus = False
method = "GET" method = "GET"
+2
View File
@@ -2,6 +2,8 @@ import os
name = "Login" name = "Login"
alias = "login"
kind = "action" kind = "action"
showstatus = True showstatus = True
@@ -77,6 +77,7 @@ responsepolicy = [
"statuscode": 400, "statuscode": 400,
"print": "Message is too short. Notifying...", "print": "Message is too short. Notifying...",
"execute": synapsenotify, "execute": synapsenotify,
"response_update": False,
} }
] ]
@@ -7,8 +7,8 @@ alias = "synapseassigndmavatar"
depends = [ depends = [
"getrmassuseravatar", "getrmassuseravatar",
"rmassavatartosynapse", "rmassavatartosynapse",
"synapsegetroomid", #"synapsegetroomid",
"synapsecreatedmroom", #"synapsecreatedmroom",
] ]
kind = "action" kind = "action"
@@ -6,6 +6,8 @@ showstatus = True
alias = "synapsegetroomalias" alias = "synapsegetroomalias"
depends = []
## PRE-RUNTIME ACTIONS ## PRE-RUNTIME ACTIONS
resolve = { resolve = {
@@ -4,6 +4,8 @@ name = "Synapse Message Push"
kind = "action" kind = "action"
alias = "synapsepushmessagesaction"
showstatus = True showstatus = True
resolve = { resolve = {
@@ -24,18 +24,21 @@ filters = [
"operator": "in", "operator": "in",
"filtervalue": "state_key", "filtervalue": "state_key",
"print": "Excluding state.key event", "print": "Excluding state.key event",
"status_code": 200,
}, },
{ {
"filterkey": "sender", "filterkey": "sender",
"operator": "!=", "operator": "!=",
"filtervalue": "@lyncoln:loxthelion.com", "filtervalue": "@lyncoln:loxthelion.com",
"print": "Excluding message loop item", "print": "Excluding message loop item",
"status_code": 200,
}, },
{ {
"filterkey": "type", "filterkey": "type",
"operator": "!=", "operator": "!=",
"filtervalue": "m.room.message", "filtervalue": "m.room.message",
"print": "Excluding non-room message event", "print": "Excluding non-room message event",
"status_code": 200,
}, },
] ]
+1 -1
View File
@@ -6,7 +6,7 @@ name = "RMASS Message Push"
kind = "recursiveset" kind = "recursiveset"
recursiveset = { recursiveset = {
"source": "events", "source": "firewall_allowed",
#"retain": False, #"retain": False,
"outputlabel": "outmessageitem", "outputlabel": "outmessageitem",
"actions": [ "actions": [
@@ -2,10 +2,14 @@ from plugins.rmass.actions import pullmessagelist, refresh_tokens, getmessage, s
from plugins.rmass.operations import getrmassconversations, synapsepushmessageitems from plugins.rmass.operations import getrmassconversations, synapsepushmessageitems
name = "Get Message List" name = "Retrieve and Forward RMASS Messages"
kind = "operation" kind = "operation"
alias = "synapsemessagepushoperation"
track = True
actions = [ actions = [
#refresh_tokens, #refresh_tokens,
pullmessagelist, pullmessagelist,
@@ -4,6 +4,8 @@ kind = "recursiveset"
name = "Synapse Attachment Push Recursive Set" name = "Synapse Attachment Push Recursive Set"
alias = "synapsepushmessageattachments"
recursiveset = { recursiveset = {
"source": "attachment_list", "source": "attachment_list",
"reverse": False, "reverse": False,
@@ -5,6 +5,8 @@ kind = "recursiveset"
name = "Synapse Message Push Recursive Set" name = "Synapse Message Push Recursive Set"
alias = "synapserecursivemessagepush"
recursiveset = { recursiveset = {
"source": "getmessage_select", "source": "getmessage_select",
"reverse": True, "reverse": True,
+1
View File
@@ -1 +1,2 @@
requests requests
rich
-1
View File
@@ -1 +0,0 @@
{"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJleHAiOjE3OTMwNTE5ODUsIm5iZiI6MTc5MzA1MTgwNSwic3ViIjoiMjM4MzAyIiwidXNlcm5hbWUiOiJYeHhvdGlxIiwidXNlclR5cGUiOjEsInN0YWdlTmFtZSI6Ilh4eG90aXEiLCJhcHByb3ZlZCI6MSwibG9jYXRpb25JZCI6NDcyLCJzZWFyY2hDaXR5IjoiYXRsYW50YSIsImNvdW50cnlTaG9ydCI6IlVTIiwic2Vzc2lvbkNvdW50cnlDb250aW5lbnQiOiJOQSIsImlzRnJvemVuIjowLCJsb2NhdGlvbkxhYmVsIjoiQXRsYW50YSwgR0EiLCJpc3MiOiJodHRwczovL3JlbnRtYXNzZXVyLmNvbSIsImlhdCI6MTc5MzA1MTg2NX0.pMPPsvgYfsRhTj7NJFc0hj3N-8gP1Th3oX9NQce9e2-NJw7ANxFv-7sdmeDE71_B71He7cych-kW5RFuJpc2ZA", "refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJleHAiOjE3OTU2NDM4NjUsIm5iZiI6MTc5MzA1MTgwNSwianRpIjoiU1BJbnZpSXBmTE5WY1NVQ1ZOQ0VvRUdGUWEwOVIrN3dKOHJuNGZqYU5ZMD0iLCJpc3MiOiJodHRwczovL3JlbnRtYXNzZXVyLmNvbSIsImlhdCI6MTc5MzA1MTg2NSwic3ViIjoiMjM4MzAyIn0.2N1mzB9BYKgd5tMK10ZuBxW0zqNDDmhN8JtVoQAoeKHcm9JtNzdRa4LfsNPiJ1MOzkXBkTBuktmUI8AiDq78YQ"}
+2 -2
View File
@@ -11,7 +11,7 @@ def manageLifecycle(module, lifecycles): #lifecycles, state):
while lifecycles[module.name]["mode"] == "continuous": while lifecycles[module.name]["mode"] == "continuous":
print(lifecycles) print(lifecycles)
outputs = executeContract(module) outputs = executeContract(module, None, None)
#print(lifecycles) #print(lifecycles)
@@ -19,7 +19,7 @@ def manageLifecycle(module, lifecycles): #lifecycles, state):
elif lifecycles[module.name]["mode"] == "oneshot": elif lifecycles[module.name]["mode"] == "oneshot":
print(lifecycles) print(lifecycles)
outputs = executeContract(module) outputs = executeContract(module, None, None)
#print(lifecycles) #print(lifecycles)
return return