Compare commits

..
2 Commits
Author SHA1 Message Date
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
6 changed files with 281 additions and 120 deletions
+124
View File
@@ -0,0 +1,124 @@
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
# ---------------------------------------------
# Determine image tags
# ---------------------------------------------
- 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"
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 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" \
.
if [ -n "$VERSION" ]; then
docker tag "$FULL_IMAGE:latest" "$FULL_IMAGE:v$VERSION"
fi
# ---------------------------------------------
# Publish image
# ---------------------------------------------
- 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
# ---------------------------------------------
# Summary
# ---------------------------------------------
- name: Report build
env:
REGISTRY: ${{ vars.REGISTRY }}
SHORT_SHA: ${{ steps.version.outputs.sha }}
run: |
echo "RMManager build completed"
echo "Image: $REGISTRY/david/rmmanager"
echo "Commit: $SHORT_SHA"
+22 -21
View File
@@ -6,33 +6,34 @@ from core.runtime.resolver import resolveItem
def buildFirewall(listener, outputs):
#firewall_log = os.environ.get("LOGS_FIREWALL", "false").lower() == "true"
firewall_log = True
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)
status_code = 200
outputs["firewall_allowed"] = []
for item in outputs[listener.recursive["source"]]:
resolved = resolveItem(listener, item)
match, filter = applyConditions(listener, resolved, outputs)
match, filter = applyConditions(listener, resolved, outputs)
if match:
status_code = filter.get("status_code", 200)
if match:
status_code = filter.get("status_code", 200)
if filter.get("execute", False):
from core.execution.createthread import buildThread
if filter.get("execute", False):
from core.execution.createthread import buildThread
thread = buildThread(filter["execute"])
thread = buildThread(filter["execute"])
if firewall_log:
logging.info(filter.get("print"))
logging.info(f"Returning status_code: {status_code}")
continue
if firewall_log:
logging.info(filter.get("print"))
logging.info(f"Returning status_code: {status_code}")
continue
outputs["firewall_allowed"].append(item)
outputs["firewall_allowed"].append(item)
if outputs["firewall_allowed"] != []:
return True, status_code
if outputs["firewall_allowed"] != []:
return True, status_code
#Needs to be present to prevent TypeError
return False, status_code
#Needs to be present to prevent TypeError
return False, status_code
+29 -15
View File
@@ -4,34 +4,48 @@ import logging
from core.runtime.outputs import buildOutput
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.startswith(listener.acceptpath):
#Prints can used buildlog for listener runtime
logging.info("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)
buildOutput(data, listener, outputs)
buildOutput(bytes, listener, outputs)
allow, status_code = buildFirewall(listener, outputs)
if hasattr(listener, "filters"):
allow, status_code = buildFirewall(listener, outputs)
if allow:
#from core.execution.createthread import buildThread
from core.execution.executioncontract import executeContract
if allow:
logging.info(outputs["firewall_allowed"])
logging.info(outputs["firewall_allowed"])
if hasattr(listener, "execute"):
if listener.execute["engine"] == "thread":
from core.execution.createthread import buildThread
buildThread(listener.execute["module"])
#thread = buildThread(listener.execute)
executeContract(listener.execute)
elif listener.execute["engine"] == "contract":
from core.execution.executioncontract import executeContract
executeContract(listener.execute["module"])
else:
if hasattr(listener, "execute"):
if listener.execute["engine"] == "thread":
from core.execution.createthread import buildThread
buildThread(listener.execute["module"])
elif listener.execute["engine"] == "contract":
from core.execution.executioncontract import executeContract
executeContract(listener.execute["module"])
status_code = listener.status_code["success"]
self.send_response(status_code)
self.send_header("Content-Type", "application/json")
@@ -42,4 +56,4 @@ def buildListener(listener, self):
else:
self.send_error(404)
return outputs
return
+82 -80
View File
@@ -4,119 +4,121 @@ import logging
from http.server import HTTPServer, BaseHTTPRequestHandler
from .dispatcher import dispatchRequest
from .createresponse import buildResponse
from plugins.rmass.listeners import synapselistener
#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 synapsesetbridgeonline
#from plugins.rmass.actions import synapsesetbridgeonline
port = int(os.environ.get("SERVER_PORT", 19001))
class RequestHandler(BaseHTTPRequestHandler):
def do_POST(self):
if self.path == "/_matrix/app/v1/ping":
logging.debug("POST request received")
from core.execution.createthread import buildThread
thread = buildThread(synapsesetbridgeonline)
buildListener(matrixpinglistener, self)
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
# if self.path == "/_matrix/app/v1/ping":
else:
#lifecycles = {}
print("POST request received")
# from core.execution.createthread import buildThread
# thread = buildThread(synapsesetbridgeonline)
max_request_size = 1024
# 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
content_length = self.headers.get("Content-Length")
# else:
# print("POST request received")
# Check whether Content-Length exists
if content_length is None:
response = {
"status": "error",
"message": "Content length required"
}
status = 411
# max_request_size = 1024
else:
# Attempt to convert the header into an integer
try:
length = int(content_length)
except ValueError:
length = None
# content_length = self.headers.get("Content-Length")
# Validate the converted length
if length is None:
response = {
"status": "error",
"message": "Invalid Content-Length"
}
status = 400
# # Check whether Content-Length exists
# if content_length is None:
# response = {
# "status": "error",
# "message": "Content length required"
# }
# status = 411
elif length < 0:
response = {
"status": "error",
"message": "Bad Request"
}
status = 400
# else:
# # Attempt to convert the header into an integer
# try:
# length = int(content_length)
# except ValueError:
# length = None
elif length > max_request_size:
response = {
"status": "error",
"message": "Content exceeds maximum request size"
}
status = 413
# # Validate the converted length
# if length is None:
# response = {
# "status": "error",
# "message": "Invalid Content-Length"
# }
# status = 400
else:
# Content-Length is valid, so read the body
data = self.rfile.read(length)
# elif length < 0:
# response = {
# "status": "error",
# "message": "Bad Request"
# }
# status = 400
try:
request = json.loads(data)
# elif length > max_request_size:
# response = {
# "status": "error",
# "message": "Content exceeds maximum request size"
# }
# status = 413
except json.JSONDecodeError:
response = {
"status": "error",
"message": "Invalid JSON received"
}
status = 400
# else:
# # Content-Length is valid, so read the body
# data = self.rfile.read(length)
else:
# Only valid JSON reaches the dispatcher
thread, lifecycles, module, mode = dispatchRequest(
request, lifecycles
)
# try:
# request = json.loads(data)
response = buildResponse(module, thread, mode)
status = 200
# except json.JSONDecodeError:
# response = {
# "status": "error",
# "message": "Invalid JSON received"
# }
# status = 400
# Serialize the response
responsebytes = json.dumps(response).encode("utf-8")
# else:
# # Only valid JSON reaches the dispatcher
# thread, lifecycles, module, mode = dispatchRequest(
# request, lifecycles
# )
# 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()
# response = buildResponse(module, thread, mode)
# status = 200
self.wfile.write(responsebytes)
# # 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)
logging.info(f"Server listening on port {port}")
#outputs = {}
#outputs, response = buildAction(pingsynapse, outputs)
server.serve_forever()
@@ -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
}
+5 -1
View File
@@ -30,7 +30,10 @@ recursive = {
acceptpath = "/_matrix/app/v1/transactions/"
execute = rmassmessagepush
execute = {
"module": rmassmessagepush,
"engine": "contract",
}
filters = [
{
@@ -74,3 +77,4 @@ filters = [
]
print = "Matrix transaction received"