WiP! RRD support

This commit is contained in:
Emery Hemingway 2024-01-10 07:55:33 +02:00
parent 651efc1e6b
commit 8b927b8ff7
7 changed files with 64 additions and 1 deletions

View File

@ -22,6 +22,8 @@ JsonSocketTranslatorArguments = <json-socket-translator {
socket: string socket: string
}>. }>.
RrdArguments = <rrd { dataspace: #!any }>.
SqliteArguments = <sqlite { SqliteArguments = <sqlite {
database: string database: string
dataspace: #!any dataspace: #!any

3
rrd.prs Normal file
View File

@ -0,0 +1,3 @@
version 1.
RRDaction = <rrd @verb symbol @args [string...]>.

View File

@ -3,5 +3,5 @@
pkgs.buildNimPackage { pkgs.buildNimPackage {
name = "dummy"; name = "dummy";
propagatedNativeBuildInputs = [ pkgs.pkg-config ]; propagatedNativeBuildInputs = [ pkgs.pkg-config ];
propagatedBuildInputs = [ pkgs.sqlite ]; propagatedBuildInputs = [ pkgs.rrdtool pkgs.sqlite ];
} }

View File

@ -27,6 +27,12 @@ type
JsonSocketTranslatorArguments* {.preservesRecord: "json-socket-translator".} = object JsonSocketTranslatorArguments* {.preservesRecord: "json-socket-translator".} = object
`field0`*: JsonSocketTranslatorArgumentsField0 `field0`*: JsonSocketTranslatorArgumentsField0
RrdArgumentsField0* {.preservesDictionary.} = object
`dataspace`* {.preservesEmbedded.}: EmbeddedRef
RrdArguments* {.preservesRecord: "rrd".} = object
`field0`*: RrdArgumentsField0
WebhooksArgumentsField0* {.preservesDictionary.} = object WebhooksArgumentsField0* {.preservesDictionary.} = object
`endpoints`*: Table[seq[string], EmbeddedRef] `endpoints`*: Table[seq[string], EmbeddedRef]
`listen`*: Tcp `listen`*: Tcp
@ -61,6 +67,7 @@ type
proc `$`*(x: WebsocketArguments | JsonTranslatorArguments | proc `$`*(x: WebsocketArguments | JsonTranslatorArguments |
JsonTranslatorConnected | JsonTranslatorConnected |
JsonSocketTranslatorArguments | JsonSocketTranslatorArguments |
RrdArguments |
WebhooksArguments | WebhooksArguments |
FileSystemUsageArguments | FileSystemUsageArguments |
SqliteArguments | SqliteArguments |
@ -71,6 +78,7 @@ proc `$`*(x: WebsocketArguments | JsonTranslatorArguments |
proc encode*(x: WebsocketArguments | JsonTranslatorArguments | proc encode*(x: WebsocketArguments | JsonTranslatorArguments |
JsonTranslatorConnected | JsonTranslatorConnected |
JsonSocketTranslatorArguments | JsonSocketTranslatorArguments |
RrdArguments |
WebhooksArguments | WebhooksArguments |
FileSystemUsageArguments | FileSystemUsageArguments |
SqliteArguments | SqliteArguments |

14
src/schema/rrd.nim Normal file
View File

@ -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))

View File

@ -10,6 +10,7 @@ import ./syndesizer/[
file_system_usage, file_system_usage,
json_socket_translator, json_socket_translator,
json_translator, json_translator,
rrd,
sqlite_actor, sqlite_actor,
webhooks, webhooks,
websockets] websockets]
@ -23,5 +24,7 @@ runActor("syndesizer") do (turn: var Turn; root: Cap):
discard spawnJsonStdioTranslator(turn, root) discard spawnJsonStdioTranslator(turn, root)
discard spawnWebhookActor(turn, root) discard spawnWebhookActor(turn, root)
discard spawnWebsocketActor(turn, root) discard spawnWebsocketActor(turn, root)
when withLibrrd:
discard spawnRrdActor(turn, root)
when withSqlite: when withSqlite:
discard spawnSqliteActor(turn, root) discard spawnSqliteActor(turn, root)

33
src/syndesizer/rrd.nim Normal file
View File

@ -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)