diff --git a/config.prs b/config.prs index 3793d4b..8b354ed 100644 --- a/config.prs +++ b/config.prs @@ -22,6 +22,8 @@ JsonSocketTranslatorArguments = . +RrdArguments = . + SqliteArguments = . diff --git a/shell.nix b/shell.nix index ea5fd1a..3b9815f 100644 --- a/shell.nix +++ b/shell.nix @@ -3,5 +3,5 @@ pkgs.buildNimPackage { name = "dummy"; propagatedNativeBuildInputs = [ pkgs.pkg-config ]; - propagatedBuildInputs = [ pkgs.sqlite ]; + propagatedBuildInputs = [ pkgs.rrdtool pkgs.sqlite ]; } diff --git a/src/schema/config.nim b/src/schema/config.nim index 7f1ac5e..277349a 100644 --- a/src/schema/config.nim +++ b/src/schema/config.nim @@ -27,6 +27,12 @@ type JsonSocketTranslatorArguments* {.preservesRecord: "json-socket-translator".} = object `field0`*: JsonSocketTranslatorArgumentsField0 + RrdArgumentsField0* {.preservesDictionary.} = object + `dataspace`* {.preservesEmbedded.}: EmbeddedRef + + RrdArguments* {.preservesRecord: "rrd".} = object + `field0`*: RrdArgumentsField0 + WebhooksArgumentsField0* {.preservesDictionary.} = object `endpoints`*: Table[seq[string], EmbeddedRef] `listen`*: Tcp @@ -61,6 +67,7 @@ type proc `$`*(x: WebsocketArguments | JsonTranslatorArguments | JsonTranslatorConnected | JsonSocketTranslatorArguments | + RrdArguments | WebhooksArguments | FileSystemUsageArguments | SqliteArguments | @@ -71,6 +78,7 @@ proc `$`*(x: WebsocketArguments | JsonTranslatorArguments | proc encode*(x: WebsocketArguments | JsonTranslatorArguments | JsonTranslatorConnected | JsonSocketTranslatorArguments | + RrdArguments | WebhooksArguments | FileSystemUsageArguments | SqliteArguments | diff --git a/src/schema/rrd.nim b/src/schema/rrd.nim new file mode 100644 index 0000000..db1d097 --- /dev/null +++ b/src/schema/rrd.nim @@ -0,0 +1,14 @@ + +import + preserves + +type + RRDaction* {.preservesRecord: "rrd".} = object + `verb`*: Symbol + `args`*: seq[string] + +proc `$`*(x: RRDaction): string = + `$`(toPreserves(x)) + +proc encode*(x: RRDaction): seq[byte] = + encode(toPreserves(x)) diff --git a/src/syndesizer.nim b/src/syndesizer.nim index 2c83606..162b1e7 100644 --- a/src/syndesizer.nim +++ b/src/syndesizer.nim @@ -10,6 +10,7 @@ import ./syndesizer/[ file_system_usage, json_socket_translator, json_translator, + rrd, sqlite_actor, webhooks, websockets] @@ -23,5 +24,7 @@ runActor("syndesizer") do (turn: var Turn; root: Cap): discard spawnJsonStdioTranslator(turn, root) discard spawnWebhookActor(turn, root) discard spawnWebsocketActor(turn, root) + when withLibrrd: + discard spawnRrdActor(turn, root) when withSqlite: discard spawnSqliteActor(turn, root) diff --git a/src/syndesizer/rrd.nim b/src/syndesizer/rrd.nim new file mode 100644 index 0000000..ff81468 --- /dev/null +++ b/src/syndesizer/rrd.nim @@ -0,0 +1,33 @@ +# SPDX-FileCopyrightText: ☭ Emery Hemingway +# SPDX-License-Identifier: Unlicense + +const withLibrrd* {.booldefine.}: bool = true + +when withLibrrd: + import preserves, syndicate, syndicate/relays + import ../schema/[config, rrd] + + {.passC: staticExec("pkg-config --cflags librrd").} + {.passL: staticExec("pkg-config --libs librrd").} + + {.pragma: librrd, header: "rrd.h", importc.} + + proc rrd_update(a1: cint; a2: cstringArray): cint {.librrd.} + proc rrd_get_error(): cstring {.librrd.} + proc rrd_clear_error() {.librrd.} + + proc spawnRrdActor*(turn: var Turn; root: Cap): Actor {.discardable.} = + spawn("rrd-actor", turn) do (turn: var Turn): + during(turn, root, ?:RrdArguments) do (ds: Cap): + let updatePattern = RRDaction ?: {0: ?Symbol"update", 1: grab()} + onMessage(turn, ds, updatePattern) do (args: seq[string]): + var argv = allocCStringArray(args) + if rrd_update(args.len.cint, argv) != 0: + stderr.writeLine(rrd_get_error()) + rrd_clear_error() + deallocCStringArray(argv) + + when isMainModule: + runActor("main") do (turn: var Turn; root: Cap): + connectStdio(turn, root) + spawnRrdActor(turn, root)