syndesizer: add file-system-usage

This commit is contained in:
Emery Hemingway 2024-01-09 20:49:54 +02:00
parent 9d0246bb1b
commit 651efc1e6b
6 changed files with 61 additions and 0 deletions

View File

@ -28,6 +28,23 @@ Example configuration:
$cap <cache { dataspace: $nixspace lifetime: 3600.0 }> ]
]
```
### File System Usage
Summarize the size of file-system directory. Equivalent to `du -s -b`.
Query the size of a directory in bytes by observing `<file-system-usage "/SOME/PATH" ?size>`.
```
# Configuration example
? <exposed-dataspace ?ds> [
<require-service <daemon syndesizer>>
? <service-object <daemon syndesizer> ?cap> [
$cap <file-system-usage { dataspace: $ds }>
]
]
```
### JSON Socket Translator

3
assertions.prs Normal file
View File

@ -0,0 +1,3 @@
version 1.
FileSystemUsage = <file-system-usage @path string @size int>.

View File

@ -6,6 +6,10 @@ CacheArguments = <cache {
lifetime: float
}>.
FileSystemUsageArguments = <file-system-usage {
dataspace: #!any
}>.
JsonTranslatorArguments = <json-stdio-translator {
argv: [string ...]
dataspace: #!any

View File

@ -34,6 +34,12 @@ type
WebhooksArguments* {.preservesRecord: "webhooks".} = object
`field0`*: WebhooksArgumentsField0
FileSystemUsageArgumentsField0* {.preservesDictionary.} = object
`dataspace`* {.preservesEmbedded.}: EmbeddedRef
FileSystemUsageArguments* {.preservesRecord: "file-system-usage".} = object
`field0`*: FileSystemUsageArgumentsField0
SqliteArgumentsField0* {.preservesDictionary.} = object
`database`*: string
`dataspace`* {.preservesEmbedded.}: EmbeddedRef
@ -56,6 +62,7 @@ proc `$`*(x: WebsocketArguments | JsonTranslatorArguments |
JsonTranslatorConnected |
JsonSocketTranslatorArguments |
WebhooksArguments |
FileSystemUsageArguments |
SqliteArguments |
CacheArguments |
Tcp): string =
@ -65,6 +72,7 @@ proc encode*(x: WebsocketArguments | JsonTranslatorArguments |
JsonTranslatorConnected |
JsonSocketTranslatorArguments |
WebhooksArguments |
FileSystemUsageArguments |
SqliteArguments |
CacheArguments |
Tcp): seq[byte] =

View File

@ -7,6 +7,7 @@ import syndicate, syndicate/relays, syndicate/actors/timers
import ./syndesizer/[
cache_actor,
file_system_usage,
json_socket_translator,
json_translator,
sqlite_actor,
@ -17,6 +18,7 @@ runActor("syndesizer") do (turn: var Turn; root: Cap):
connectStdio(turn, root)
discard spawnTimers(turn, root)
discard spawnCacheActor(turn, root)
discard spawnFileSystemUsageActor(turn, root)
discard spawnJsonSocketTranslator(turn, root)
discard spawnJsonStdioTranslator(turn, root)
discard spawnWebhookActor(turn, root)

View File

@ -0,0 +1,27 @@
# SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import std/[dirs, os, paths]
import preserves
import syndicate, syndicate/relays
import ../schema/[assertions, config]
proc spawnFileSystemUsageActor*(turn: var Turn; root: Cap): Actor {.discardable.} =
spawn("file-system-usage", turn) do (turn: var Turn):
during(turn, root, ?:FileSystemUsageArguments) do (ds: Cap):
var pat = ?Observe(pattern: !FileSystemUsage) ?? { 0: grab() }
during(turn, ds, pat) do (lit: Literal[string]):
var ass = FileSystemUsage(path: lit.value)
if fileExists(ass.path): ass.size = getFileSize(ass.path)
else:
for fp in walkDirRec(paths.Path(lit.value), yieldFilter={pcFile}):
var fs = getFileSize(string fp)
inc(ass.size, fs)
discard publish(turn, ds, ass)
# TODO: updates?
when isMainModule:
runActor("main") do (turn: var Turn; root: Cap):
connectStdio(turn, root)
discard spawnFileSystemUsageActor(turn, root)