From 7d2b6ded634ef926cd6baf25dd8e89db7e45c7c2 Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Sat, 16 Nov 2024 02:32:11 +0100 Subject: Add script block --- src/blocks/script.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/blocks/script.c (limited to 'src/blocks/script.c') diff --git a/src/blocks/script.c b/src/blocks/script.c new file mode 100644 index 0000000..fa3a9d9 --- /dev/null +++ b/src/blocks/script.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include + +#include "../block.h" + +#include "../any_log.h" + +typedef struct { + block_text_t block; + char *script; +} block_script_t; + +static const struct timespec block_script_interval = { + .tv_sec = 30, + .tv_nsec = 0, +}; + +static void block_script_update(block_t *block) +{ + block_script_t *script = (block_script_t *)block; + + FILE *output = popen(script->script, "r"); + if (output == NULL) { + log_value_debug("Failed to execute a script", + "s:label", block->label, + "s:script", script->script, + "i:errno", errno); + return; + } + + char buffer[128] = { 0 }; + fgets(buffer, sizeof(buffer), output); + pclose(output); + + log_value_debug("Executed a script", + "s:label", block->label, + "s:script", script->script); + + free(script->block.text); + script->block.text = strcopy(buffer); + assert(script->block.text != NULL); +} + +static block_t *block_script_alloc(const block_scheme_t *scheme) +{ + block_t *block = calloc(1, sizeof(block_script_t)); + block->type = BLOCK_TEXT; + block->update_interval = block_script_interval; + block->update_fn = block_script_update; + return block; +} + +static void block_script_clean(block_t *block) +{ + block_script_t *script = (block_script_t *)block; + free(script->script); + free(script->block.text); +} + +static bool block_script_validate(block_t *block, const block_scheme_t *scheme) +{ + block_script_t *script = (block_script_t *)block; + + if (script->block.text == NULL) { + log_error("Block '%s' requires key '%s'", block->label, "text"); + return false; + } + + script->script = script->block.text; + script->block.text = NULL; + return true; +} + +static const config_entry_t block_script_entries[] = { + { 0 }, +}; + +const block_scheme_t block_script_scheme = { + .name = "script", + .entries = block_script_entries, + .alloc_fn = block_script_alloc, + .clean_fn = block_script_clean, + .validate_fn = block_script_validate, + .resolve_fn = NULL, +}; -- cgit v1.2.3