syndesizer: add file-system-usage

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

View File

@ -28,6 +28,23 @@ Example configuration:
$cap <cache { dataspace: $nixspace lifetime: 3600.0 }> ] $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 ### 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 lifetime: float
}>. }>.
FileSystemUsageArguments = <file-system-usage {
dataspace: #!any
}>.
JsonTranslatorArguments = <json-stdio-translator { JsonTranslatorArguments = <json-stdio-translator {
argv: [string ...] argv: [string ...]
dataspace: #!any dataspace: #!any

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

@ -0,0 +1,14 @@
import
preserves
type
FileSystemUsage* {.preservesRecord: "file-system-usage".} = object
`path`*: string
`size`*: BiggestInt
proc `$`*(x: FileSystemUsage): string =
`$`(toPreserves(x))
proc encode*(x: FileSystemUsage): seq[byte] =
encode(toPreserves(x))

View File

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

View File

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