Files
cell/probe.cm
2026-02-24 21:04:03 -06:00

125 lines
2.8 KiB
Plaintext

var http = use('http')
var json = use('json')
var registry = {}
var server_fd = null
var port = 9000
function handle_request(req) {
var result = null
var _try = null
if (req.method == "GET" && req.path == "/discover") {
result = discover()
http.respond(req._conn, 200, {"content-type": "application/json"},
json.encode(result))
return
}
if (req.method == "POST" && req.path == "/probe") {
_try = function() {
result = handle_probe(req)
} disruption {
result = {ok: false, error: "probe failed"}
}
_try()
http.respond(req._conn, 200, {"content-type": "application/json"},
json.encode(result))
return
}
if (req.method == "POST" && req.path == "/snapshot") {
_try = function() {
result = handle_snapshot(req)
} disruption {
result = {ok: false, error: "snapshot failed"}
}
_try()
http.respond(req._conn, 200, {"content-type": "application/json"},
json.encode(result))
return
}
http.respond(req._conn, 404, {"content-type": "application/json"},
json.encode({ok: false, error: "not found"}))
}
function discover() {
var targets = {}
var target_keys = array(registry)
var i = 0
while (i < length(target_keys)) {
targets[target_keys[i]] = array(registry[target_keys[i]])
i = i + 1
}
return {ok: true, targets: targets}
}
function handle_probe(req) {
var body = json.decode(req.body)
var target = body.target
var name = body.name
var args = body.args
if (target == null || name == null) {
return {ok: false, error: "missing target or name"}
}
var target_probes = registry[target]
if (target_probes == null) {
return {ok: false, error: "unknown target: " + target}
}
var probe_fn = target_probes[name]
if (probe_fn == null) {
return {ok: false, error: "unknown probe: " + target + "/" + name}
}
if (args == null) args = {}
var result = probe_fn(args)
return {ok: true, result: result}
}
function handle_snapshot(req) {
var body = json.decode(req.body)
var probes = body.probes
if (probes == null) {
return {ok: false, error: "missing probes array"}
}
var results = {}
var i = 0
var p = null
var target_probes = null
var probe_fn = null
var key = null
while (i < length(probes)) {
p = probes[i]
key = p.target + "/" + p.name
target_probes = registry[p.target]
if (target_probes != null) {
probe_fn = target_probes[p.name]
if (probe_fn != null) {
results[key] = probe_fn(p.args != null ? p.args : {})
}
}
i = i + 1
}
return {ok: true, results: results}
}
function start_server() {
server_fd = http.serve(port)
http.on_request(server_fd, handle_request)
}
function register(target, probes) {
registry[target] = probes
if (server_fd == null) start_server()
}
return {
register: register,
port: port
}