From: Matthias Kruk Date: Fri, 23 Jul 2021 01:59:49 +0000 (+0900) Subject: smelter: Add build system management script X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=83f4bbc14d2d26c00f806e2c0162a7e197b531d3;p=foundry smelter: Add build system management script This commit adds smelter, a script for managing the individual components of the foundry build system. Once complete, smelter will act as a process watchdog and monitor the state of the various IPC endpoints and pubsub topics that are used by the buildsystem. --- diff --git a/smelter.sh b/smelter.sh new file mode 100644 index 0000000..6ea9063 --- /dev/null +++ b/smelter.sh @@ -0,0 +1,154 @@ +#!/bin/bash + +topics=("commits") +endpoints=() +processes=() + +monitor_endpoints() { + local endpoints=("$@") + + while inst_running; do + sleep 5 + done + + return 0 +} + +watch_endpoints() { + local endpoints=("$@") + + local endpoint + + # This function starts the monitor that watches all endpoints in the + # build system. Because this function is executed before the other + # components of the build system are started, endpoints are likely not + # to exist. Hence, we also make sure to create all endpoints here. + + for endpoint in "${endpoints[@]}"; do + if ! ipc_endpoint_open "$endpoint" > /dev/null; then + log_error "Could not open endpoint $endpoint" + return 1 + fi + done + + if ! monitor_endpoints "${endpoints[@]}" &; then + return 1 + fi + + return 0 +} + +process_is_running() { + local process="$1" + + return 0 +} + +process_start() { + local process="$1" + + return 0 +} + +process_watchdog() { + local processes=("$@") + + local process + + while inst_running; do + for process in "${processes[@]}"; do + if process_is_running "$process"; then + continue + fi + + if ! process_start "$process"; then + log_error "Could not start $process" + fi + done + + sleep 5 + done + + return 0 +} + +watch_processes() { + local processes=("$@") + + if ! process_watchdog "${processes[@]}" &; then + return 1 + fi + + return 0 +} + +handle_message() { + local endpoint="$1" + local msg="$2" + + return 1 +} + +smelter_run() { + local endpoint + local topic + + if ! endpoint=$(ipc_endpoint_open "pub/foundry"); then + log_error "Could not listen on pub/foundry" + return 1 + fi + + for topic in "${topics[@]}"; do + if ! ipc_endpoint_subscribe "$endpoint" "$topic"; then + log_error "Could not subscribe to $topic" + return 1 + fi + done + + if ! watch_endpoints "${endpoints[@]}"; then + log_error "Couldn't start endpoint monitor" + return 1 + fi + + if ! watch_processes "${processes[@]}"; then + log_error "Couldn't start process monitor" + return 1 + fi + + while inst_running; do + local msg + + if ! msg=$(ipc_endpoint_recv "$endpoint" 5); then + continue + fi + + handle_message "$endpoint" "$msg" + done + + return 0 +} + +main() { + if ! opt_parse "$@"; then + return 1 + fi + + if ! inst_singleton smelter_run; then + return 1 + fi + + return 0 +} + +{ + if ! . toolbox.sh; then + exit 1 + fi + + if ! include "log" "opt" "inst" "ipc" "foundry/msg"; then + exit 1 + fi + + main "$@" + exit "$?" +}