runtime: publish GITEA-READER-LAN-BIND-290
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"channel": "homelab-runtime",
|
||||
"command_id": "GITEA-READER-LAN-BIND-290",
|
||||
"status": "FAIL",
|
||||
"rc": 7,
|
||||
"host": "pve01",
|
||||
"mode": "change",
|
||||
"component": "cluster-audit",
|
||||
"started_at_utc": "2026-07-22T21:26:06Z",
|
||||
"finished_at_utc": "2026-07-22T21:26:06Z",
|
||||
"reference_register_checked": true,
|
||||
"reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e",
|
||||
"error_register_checked": true,
|
||||
"error_register_sha256": "08b3a769b8e38eaa1acec915352fb328180d70caa7ff6cd9d1ec0da426262752",
|
||||
"command_sha256": "e5009582d1686f1b95e6deb9aa32a84bda61a54b2d8f91ac6c99615de642c579",
|
||||
"duplicate_failed_command_blocked": false,
|
||||
"block_reason": null,
|
||||
"execution_started": true,
|
||||
"changes_made": true,
|
||||
"sanitized": true,
|
||||
"secrets_included": false,
|
||||
"private_addresses_included": false,
|
||||
"raw_evidence_retained_locally": true,
|
||||
"raw_evidence_sha256": "66f054e4ae3cc3399d1b9ad7a843066a3b1fc6e36ce812372418c4b8a6f2fa82",
|
||||
"sanitized_output_sha256": "ab940a12ce1fd656cdc00b6b10f684a877690ae7f5d2ec76a42690cc38c91c81",
|
||||
"output_truncated_in_json": false,
|
||||
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
|
||||
"output": "DETAIL=SOURCE_SHA256=86019c63091dbe7ce16beab24012ed779e496a7010798502cde37921b6551f62\ncurl: (7) Failed to connect to [PRIVATE_IP] port 18788 after 0 ms: Could not connect to server\nDETAIL=ROLLBACK=APPLIED\n"
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
CHAT_OUTPUT_BEGIN
|
||||
COMMAND_ID=GITEA-READER-LAN-BIND-290
|
||||
STATUS=FAIL
|
||||
RC=7
|
||||
HOST=pve01
|
||||
MODE=change
|
||||
COMPONENT=cluster-audit
|
||||
REFERENCE_REGISTER_CHECK=OK
|
||||
REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e
|
||||
ERROR_REGISTER_CHECK=OK
|
||||
ERROR_REGISTER_SHA256=08b3a769b8e38eaa1acec915352fb328180d70caa7ff6cd9d1ec0da426262752
|
||||
COMMAND_SHA256=e5009582d1686f1b95e6deb9aa32a84bda61a54b2d8f91ac6c99615de642c579
|
||||
DUPLICATE_FAILED_COMMAND_BLOCKED=false
|
||||
EXECUTION_STARTED=true
|
||||
CHANGES_MADE=true
|
||||
SANITIZED=yes
|
||||
SECRETS_INCLUDED=no
|
||||
PRIVATE_ADDRESSES_INCLUDED=no
|
||||
RAW_EVIDENCE_SHA256=66f054e4ae3cc3399d1b9ad7a843066a3b1fc6e36ce812372418c4b8a6f2fa82
|
||||
SANITIZED_OUTPUT_SHA256=ab940a12ce1fd656cdc00b6b10f684a877690ae7f5d2ec76a42690cc38c91c81
|
||||
OUTPUT_BEGIN
|
||||
DETAIL=SOURCE_SHA256=86019c63091dbe7ce16beab24012ed779e496a7010798502cde37921b6551f62
|
||||
curl: (7) Failed to connect to [PRIVATE_IP] port 18788 after 0 ms: Could not connect to server
|
||||
DETAIL=ROLLBACK=APPLIED
|
||||
|
||||
OUTPUT_END
|
||||
CHAT_OUTPUT_END
|
||||
+11
-11
File diff suppressed because one or more lines are too long
+11
-100
@@ -1,116 +1,27 @@
|
||||
CHAT_OUTPUT_BEGIN
|
||||
COMMAND_ID=GITEA-READER-ROUTES-AUDIT-289
|
||||
STATUS=OK
|
||||
RC=0
|
||||
COMMAND_ID=GITEA-READER-LAN-BIND-290
|
||||
STATUS=FAIL
|
||||
RC=7
|
||||
HOST=pve01
|
||||
MODE=read-only
|
||||
MODE=change
|
||||
COMPONENT=cluster-audit
|
||||
REFERENCE_REGISTER_CHECK=OK
|
||||
REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e
|
||||
ERROR_REGISTER_CHECK=OK
|
||||
ERROR_REGISTER_SHA256=08b3a769b8e38eaa1acec915352fb328180d70caa7ff6cd9d1ec0da426262752
|
||||
COMMAND_SHA256=ca1499ccd79985134e654f663bd829da73f07f8aa2af0a227387a97e6c32c66d
|
||||
COMMAND_SHA256=e5009582d1686f1b95e6deb9aa32a84bda61a54b2d8f91ac6c99615de642c579
|
||||
DUPLICATE_FAILED_COMMAND_BLOCKED=false
|
||||
EXECUTION_STARTED=true
|
||||
CHANGES_MADE=false
|
||||
CHANGES_MADE=true
|
||||
SANITIZED=yes
|
||||
SECRETS_INCLUDED=no
|
||||
PRIVATE_ADDRESSES_INCLUDED=no
|
||||
RAW_EVIDENCE_SHA256=8077c2ba090c3c446ffa120fd830682af6b005d086e4263b67ad67eb043d3a9b
|
||||
SANITIZED_OUTPUT_SHA256=8077c2ba090c3c446ffa120fd830682af6b005d086e4263b67ad67eb043d3a9b
|
||||
RAW_EVIDENCE_SHA256=66f054e4ae3cc3399d1b9ad7a843066a3b1fc6e36ce812372418c4b8a6f2fa82
|
||||
SANITIZED_OUTPUT_SHA256=ab940a12ce1fd656cdc00b6b10f684a877690ae7f5d2ec76a42690cc38c91c81
|
||||
OUTPUT_BEGIN
|
||||
PREVIOUS_COMMAND_ID=GITEA-READER-BIND-AUDIT-288
|
||||
DETAIL= 1 #!/usr/bin/python3
|
||||
DETAIL= 2 import hashlib
|
||||
DETAIL= 3 import http.server
|
||||
DETAIL= 4 import json
|
||||
DETAIL= 5 import os
|
||||
DETAIL= 6 import pathlib
|
||||
DETAIL= 7 import re
|
||||
DETAIL= 8 import sys
|
||||
DETAIL= 9
|
||||
DETAIL= 10 ROOT=pathlib.Path("/var/lib/homelab-reader-v3")
|
||||
DETAIL= 11 MANIFEST=ROOT/"manifest.json"
|
||||
DETAIL= 12 RESULTS=ROOT/"results"
|
||||
DETAIL= 13 CAPABILITY=os.environ["HOMELAB_READER_CAPABILITY"]
|
||||
DETAIL= 14 PORT=int(os.environ.get("HOMELAB_READER_PORT","18788"))
|
||||
DETAIL= 15 RESULT_RE=re.compile(r"^[A-Za-z0-9][A-Za-z0-9._-]{0,127}-[0-9a-f]{64}\.txt$")
|
||||
DETAIL= 16
|
||||
DETAIL= 17 class Handler(http.server.BaseHTTPRequestHandler):
|
||||
DETAIL= 18 server_version="HomelabReader/3"
|
||||
DETAIL= 19
|
||||
DETAIL= 20 def log_message(self,fmt,*args):
|
||||
DETAIL= 21 sys.stderr.write("%s - %s\n"%(self.address_string(),fmt%args))
|
||||
DETAIL= 22
|
||||
DETAIL= 23 def reply(self,status,content_type,payload,etag="",include_body=True):
|
||||
DETAIL= 24 self.send_response(status)
|
||||
DETAIL= 25 self.send_header("Content-Type",content_type)
|
||||
DETAIL= 26 self.send_header("Content-Length",str(len(payload)))
|
||||
DETAIL= 27 self.send_header("Cache-Control","no-store, no-cache, must-revalidate, max-age=0")
|
||||
DETAIL= 28 self.send_header("Surrogate-Control","no-store")
|
||||
DETAIL= 29 self.send_header("Pragma","no-cache")
|
||||
DETAIL= 30 self.send_header("Expires","0")
|
||||
DETAIL= 31 self.send_header("X-Robots-Tag","noindex, nofollow, noarchive")
|
||||
DETAIL= 32 if etag:
|
||||
DETAIL= 33 self.send_header("ETag",chr(34)+etag+chr(34))
|
||||
DETAIL= 34 self.send_header("X-Homelab-Generation",etag)
|
||||
DETAIL= 35 self.end_headers()
|
||||
DETAIL= 36 if include_body:
|
||||
DETAIL= 37 self.wfile.write(payload)
|
||||
DETAIL= 38
|
||||
DETAIL= 39 def do_HEAD(self):
|
||||
DETAIL= 40 self.handle_reader(False)
|
||||
DETAIL= 41
|
||||
DETAIL= 42 def do_GET(self):
|
||||
DETAIL= 43 self.handle_reader(True)
|
||||
DETAIL= 44
|
||||
DETAIL= 45 def handle_reader(self,include_body):
|
||||
DETAIL= 46 request_path=self.path.split("?",1)[0]
|
||||
DETAIL= 47 prefix="/"+CAPABILITY+"/"
|
||||
DETAIL= 48 if not request_path.startswith(prefix):
|
||||
DETAIL= 49 self.reply(404,"text/plain; charset=utf-8",b"not found\n",include_body=include_body)
|
||||
DETAIL= 50 return
|
||||
DETAIL= 51
|
||||
DETAIL= 52 relative=request_path[len(prefix):]
|
||||
DETAIL= 53
|
||||
DETAIL= 54 if relative=="health":
|
||||
DETAIL= 55 self.reply(200,"application/json; charset=utf-8",b"{\"status\":\"ok\",\"version\":3}\n","health-v3",include_body)
|
||||
DETAIL= 56 return
|
||||
DETAIL= 57
|
||||
DETAIL= 58 if relative=="feed":
|
||||
DETAIL= 59 try:
|
||||
DETAIL= 60 payload=MANIFEST.read_bytes()
|
||||
DETAIL= 61 document=json.loads(payload.decode("utf-8"))
|
||||
DETAIL= 62 generation=str(document.get("generation","0"))
|
||||
DETAIL= 63 self.reply(200,"application/json; charset=utf-8",payload,generation,include_body)
|
||||
DETAIL= 64 except Exception:
|
||||
DETAIL= 65 self.reply(500,"text/plain; charset=utf-8",b"reader error\n",include_body=include_body)
|
||||
DETAIL= 66 return
|
||||
DETAIL= 67
|
||||
DETAIL= 68 if relative.startswith("results/"):
|
||||
DETAIL= 69 name=relative[len("results/"):]
|
||||
DETAIL= 70 target=RESULTS/name
|
||||
DETAIL= 71 if not RESULT_RE.fullmatch(name) or not target.is_file():
|
||||
DETAIL= 72 self.reply(404,"text/plain; charset=utf-8",b"not found\n",include_body=include_body)
|
||||
DETAIL= 73 return
|
||||
DETAIL= 74 try:
|
||||
DETAIL= 75 payload=target.read_bytes()
|
||||
DETAIL= 76 digest=name.rsplit("-",1)[1][:-4]
|
||||
DETAIL= 77 if hashlib.sha256(payload).hexdigest()!=digest:
|
||||
DETAIL= 78 self.reply(500,"text/plain; charset=utf-8",b"integrity error\n",include_body=include_body)
|
||||
DETAIL= 79 return
|
||||
DETAIL= 80 self.reply(200,"text/plain; charset=utf-8",payload,digest,include_body)
|
||||
DETAIL= 81 except Exception:
|
||||
DETAIL= 82 self.reply(500,"text/plain; charset=utf-8",b"reader error\n",include_body=include_body)
|
||||
DETAIL= 83 return
|
||||
DETAIL= 84
|
||||
DETAIL= 85 self.reply(404,"text/plain; charset=utf-8",b"not found\n",include_body=include_body)
|
||||
DETAIL= 86
|
||||
DETAIL= 87 class Server(http.server.ThreadingHTTPServer):
|
||||
DETAIL= 88 allow_reuse_address=True
|
||||
DETAIL= 89
|
||||
DETAIL= 90 Server(("127.0.0.1",PORT),Handler).serve_forever()
|
||||
CHANGES_MADE=NO
|
||||
DETAIL=SOURCE_SHA256=86019c63091dbe7ce16beab24012ed779e496a7010798502cde37921b6551f62
|
||||
curl: (7) Failed to connect to [PRIVATE_IP] port 18788 after 0 ms: Could not connect to server
|
||||
DETAIL=ROLLBACK=APPLIED
|
||||
|
||||
OUTPUT_END
|
||||
CHAT_OUTPUT_END
|
||||
|
||||
Reference in New Issue
Block a user