diff --git a/docker-compose.yml b/docker-compose.yml index a4c2073..25c905e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -108,7 +108,7 @@ services: ipv4_address: $DASHBOARD_IP manager: container_name: manager - image: ghcr.io/runcitadel/manager:v0.0.12@sha256:de97eeb6e8caae5d1a8aeb045213621cf8e6e928177236bb0b3c25e76f6cd041 + image: ghcr.io/runcitadel/manager:feat-karen-v2@sha256:61dfc6a23bb6603096673e517ec058730ca7e1fbe251df38760c2860d03b1dd0 depends_on: - tor - redis @@ -121,6 +121,7 @@ services: - ${PWD}/info.json:/info.json - ${PWD}/db:/db - ${PWD}/events/signals:/signals + - ${PWD}/events:/events - ${PWD}/apps:/apps - ${PWD}/lnd:/lnd:ro - ${PWD}/statuses:/statuses diff --git a/events/triggers/app b/events/triggers/app index b1c987f..dee8381 100755 --- a/events/triggers/app +++ b/events/triggers/app @@ -6,8 +6,4 @@ CITADEL_ROOT="$(readlink -f $(dirname "${BASH_SOURCE[0]}")/../..)" -signal="${1}" -command=${signal%%"-"*} -app=${signal#*"-"} - -"${CITADEL_ROOT}/scripts/app" "${command}" "${app}" +"${CITADEL_ROOT}/scripts/app" "$@" diff --git a/karen b/karen index 28022a3..df99ea5 100755 --- a/karen +++ b/karen @@ -1,83 +1,27 @@ -#!/usr/bin/env bash +#!/usr/bin/env python3 -# SPDX-FileCopyrightText: 2020 Umbrel. https://getumbrel.com -# SPDX-FileCopyrightText: 2021-2022 Citadel and contributors. -# -# SPDX-License-Identifier: GPL-3.0-or-later +import socket +import os -# karen watches for signals and executes triggers in the events dir -# karen gets triggered a lot +rootDir = os.path.dirname(os.path.abspath(__file__)) +os.chdir(rootDir) -check_root () { - if [[ $UID != 0 ]]; then - echo "Error: This script must be run as root." - echo "Can I speak to a manager please?" - exit 1 - fi -} +if os.path.exists("events/karen"): + os.remove("events/karen") -check_if_not_already_running() { - if ps ax | grep $0 | grep -v $$ | grep bash | grep -v grep - then - echo "karen is already running" - exit 1 - fi -} +server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) +server.bind("events/karen") -check_dependencies () { - for cmd in "$@"; do - if ! command -v $cmd >/dev/null 2>&1; then - echo "This script requires \"${cmd}\" to be installed" - exit 1 - fi - done -} - -check_root - -check_if_not_already_running - -check_dependencies fswatch readlink dirname - -if [[ -n "$1" ]]; then - root_dir="$(readlink -f $1)" -else - root_dir="$(dirname $(readlink -f ${BASH_SOURCE[0]}))/events" -fi -signal_dir="$root_dir/signals" -trigger_dir="$root_dir/triggers" - -if [[ ! -d "$root_dir" ]]; then - echo "Root dir does not exist '$root_dir'" - exit 1 -fi - -echo "karen will start in 30 seconds" -sleep 30 -echo "karen is running in $root_dir" -fswatch -0 --event=PlatformSpecific $signal_dir | while read -d "" event; do - signal="${event#"$signal_dir"}" - signal="${signal#"/"}" - trigger="$trigger_dir/$signal" - args="" - - # If signal isn't an empty string, then it's a signal - if [[ -n "$signal" ]]; then - echo "Got signal: $signal" - - # If the signal starts wih app-, the trigger is "$trigger_dir/app" - # and the args are the rest of the signal - if [[ "$signal" =~ ^app- ]] && [[ "$signal" != "app-update" ]]; then - trigger="$trigger_dir/app" - args="${signal#"app-"}" - fi - if test -x "$trigger"; then - echo "karen is getting triggered!" - if [[ ! -f "statuses/update-in-progress" ]]; then - "$trigger" $args & - fi - else - echo "No trigger found" - fi - fi -done +while True: + server.listen(1) + conn, addr = server.accept() + datagram = conn.recv(1024) + if datagram: + instructions = datagram.decode("utf-8").strip().split() + cmd = instructions[0] + if(cmd == "trigger"): + trigger = instructions[1] + instructions.pop(0) + instructions.pop(0) + os.system("events/triggers/{} {}".format(trigger, " ".join(instructions))) + conn.close()