diff options
author | Malfurious <m@lfurio.us> | 2023-10-25 01:49:42 -0400 |
---|---|---|
committer | Malfurious <m@lfurio.us> | 2023-10-26 20:41:40 -0400 |
commit | 618d4dac812c2d0ff46e4925cae4950f59bb02bf (patch) | |
tree | 3a346a634fe0a4ba23bc140805b6f4d1120afb1e /acid | |
parent | 73994d9858a4d69747731f29f8093a4db441606f (diff) | |
download | cychedelic-618d4dac812c2d0ff46e4925cae4950f59bb02bf.tar.gz cychedelic-618d4dac812c2d0ff46e4925cae4950f59bb02bf.zip |
acid: Manage persistent build logs
The output from build jobs are now stored in dedicated log files instead
of being dumped to stdout. Files are saved in the new volume at /logs
and intended to be accessed by the web interface for auditing there.
Files are named like "X_Y_Z.log" where X = a unique build number, Y = a
timestamp in UNIX epoch seconds, and Z = the corresponding service name.
Log files are simply closed when the job is finished, so the UI can
check for the existence of a file "/logs/active" which indicates that
the highest-numbered job is still in progress. This file is removed
afterward.
Failed jobs have a "JOB FAILED" message appended at the end of their
log. Successful jobs simply lack this message. One reason this is the
case is due to the build for cychedelic (--self) losing execution before
success can be affirmatively determined.
Signed-off-by: Malfurious <m@lfurio.us>
Diffstat (limited to 'acid')
-rwxr-xr-x | acid/acid | 49 |
1 files changed, 43 insertions, 6 deletions
@@ -16,20 +16,51 @@ should_restart() { [ $runtime -gt $CYCHE_MAINT_TIME ] } +log_filename() { + latest=$(find /logs -type f | sort -rn | sed 's/^\/logs\/0*//;s/_.*$//;1q') + [ -z "$latest" ] && number="1" || number=$((latest+1)) + printf '/logs/%010i_%s_%s.log\n' "$number" "$(now)" "$1" +} + +do_job() { + hash=$(acid-source "$1" "$2" "$3") + res=$? + + if [ $res -eq 2 ]; then + echo -e "\n\nJOB FAILED" + return 1 + fi + + if [ $res -eq 1 ] || [ "$5" == "--force" ]; then + if ! acid-build "$1" "$4" "$hash" "$6"; then + echo -e "\n\nJOB FAILED" + fi + return 1 + fi + + return 0 +} + update() { forceopt="--force-self" selfopt="--self" for line in "${CYCHE_SERVICES[@]}"; do read -r -a arr <<< "$line" - hash=$(acid-source ${arr[@]:0:3}) + + log=$(log_filename "${arr[0]}") + [ "$1" == "$forceopt" ] && f="--force" || f="" + + touch /logs/active + do_job $line "$f" "$selfopt" >"$log" 2>&1 res=$? + rm -f /logs/active - if [ $res -ne 2 ]; then - if [ $res -eq 1 ] || [ "$1" == "$forceopt" ]; then - acid-build "${arr[0]}" "${arr[3]}" "$hash" $selfopt - sleep "$CYCHE_JOB_TIME" - fi + if [ $res -ne 0 ]; then + echo "Updated ${arr[0]}" + sleep "$CYCHE_JOB_TIME" + else + rm -f "$log" fi forceopt="--force" @@ -44,6 +75,7 @@ remove() { for name in $removed; do acid-remove "$name" + echo "Removed $name" sleep "$CYCHE_JOB_TIME" done } @@ -52,7 +84,11 @@ remove() { # $CYCHE_MAINT_TIME period, so rebuild services and perform cleanup now. We # sleep briefly at the beginning to allow the previous cychedelic instance time # to die. +echo "cychedelic ACID kicking in ..." +rm -f /logs/active + sleep "$CYCHE_STARTUP_TIME" + remove update --force docker system prune --force --all @@ -65,4 +101,5 @@ while ! should_restart; do done # force self-upgrade to trigger maintenance activities +echo "Forcing daemon restart" update --force-self |