From 81feed3662f63a32836fb305ace3858425b04279 Mon Sep 17 00:00:00 2001 From: Botspot Date: Sat, 3 Jul 2021 11:19:19 -0500 Subject: [PATCH] Add logging to pi-apps --- etc/logviewer | 71 ++++++++++++++++++++++++++++++++++++++ etc/viewlog | 26 ++++++++++++++ icons/install-short.png | Bin 0 -> 6728 bytes icons/log-file.png | Bin 0 -> 340 bytes icons/uninstall-short.png | Bin 0 -> 6214 bytes manage | 70 ++++++++++++++++++++++++++++++++----- settings | 1 + 7 files changed, 160 insertions(+), 8 deletions(-) create mode 100755 etc/logviewer create mode 100755 etc/viewlog create mode 100644 icons/install-short.png create mode 100644 icons/log-file.png create mode 100644 icons/uninstall-short.png diff --git a/etc/logviewer b/etc/logviewer new file mode 100755 index 0000000..92a52f9 --- /dev/null +++ b/etc/logviewer @@ -0,0 +1,71 @@ +#!/bin/bash + +DIRECTORY="$(readlink -f "$(dirname "$(dirname "$0")")")" + +function error { + echo -e "\e[91m$1\e[39m" + exit 1 +} + +#remove week-old logfiles +find "$DIRECTORY/logs" -type f -mtime +7 -exec rm -f {} \; + +#list of all files within "$DIRECTORY/logs", newest first +logfiles="$(ls "$DIRECTORY/logs"/* -t)" + +if [ ! -z "$(date +%p)" ];then + #system locale uses AM and PM in time/dates + ampm=1 +else + #date command didn't output anything - system locale uses 24-hour clock + ampm=0 +fi + +IFS=$'\n' +for file in $logfiles;do + #Parse various tidbits based on the filename + #$app: the name of the app for this logfile + app="$(echo "$(basename "$file")" | sed 's/^install-//g' | sed 's/^uninstall-//g' | sed 's/^incomplete-//g' | sed 's/^fail-//g' | sed 's/^success-//g' | sed 's/.log.*$//g')" + #$action: will be 'install' or 'uninstall' + action="$(echo "$(basename "$file")" | sed 's/-fail-//g' | sed 's/-success-//g' | sed 's/-incomplete-//g' | sed 's/'"$app"'.*$//g')" + #$result: will be 'success' or 'fail' + result="$(echo "$(basename "$file")" | sed 's/^install-//g' | sed 's/^uninstall-//g' | sed 's/-'"$app"'.*$//g')" + #$date: human-readable timestamp. + if [ $ampm == 1 ];then + #AM/PM timestamp: 'Friday 6:21 PM' + date="$(date -r "$file" '+%A %l:%M %p' | sed 's/ / /g' | sed "s/$(date +%A)/Today/g" | sed "s/$(date +%A --date=' 1 days ago')/Yesterday/g")" + else + #24h timestamp: 'Friday 18:21' + date="$(date -r "$file" '+%A %k:%M' | sed 's/ / /g' | sed "s/$(date +%A)/Today/g" | sed "s/$(date +%A --date=' 1 days ago')/Yesterday/g")" + fi + + #echo "$app\n $action\n $result\n" + + #add lines to the yad list + LIST="$LIST +$date +${DIRECTORY}/apps/${app}/icon-24.png +$(echo $action | sed "s+^uninstall$+${DIRECTORY}/icons/uninstall-short.png+g" | sed "s+^install$+${DIRECTORY}/icons/install-short.png+g") +$(echo $result | sed "s+^success$+${DIRECTORY}/icons/${action}ed.png+g" | sed "s+^fail$+${DIRECTORY}/icons/corrupted.png+g" | sed "s+^incomplete$+${DIRECTORY}/icons/corrupted.png+g") +$(echo $action | sed 's/^uninstall$/Uninstalling/g' | sed 's/^install$/Installing/g') $app $(echo $result | sed 's/success/succeeded./g' | sed 's/fail/failed./g' | sed 's/incomplete/was interrupted./g') +$file" + +done + +LIST="$(echo "$LIST" | grep .)" +echo "$LIST" +output="$(echo -e "$LIST" | yad --center --title='Log file viewer' --width=500 --height=400 \ + --text="Review the errors from installing or uninstalling apps."$'\n'"Week-old log files will be deleted." \ + --list --separator='\n' --window-icon="${DIRECTORY}/icons/logo.png" \ + --column=Day --column=I:IMG --column=A:IMG --column=R:IMG --column=Description --column=tooltip:HD \ + --print-column=6 --tooltip-column=6 --select-action="$(dirname "$0")/viewlog" \ + --button='Delete all'!"${DIRECTORY}/icons/trash.png"!"Delete all log files from $DIRECTORY/logs":0 \ + --button=Close!"${DIRECTORY}/icons/exit.png":1 +)" +button=$? + +if [ $button == 0 ];then + rm -rf "$DIRECTORY/logs" + mkdir "$DIRECTORY/logs" + echo "Deleted everything inside of $DIRECTORY/logs" +fi diff --git a/etc/viewlog b/etc/viewlog new file mode 100755 index 0000000..0f11311 --- /dev/null +++ b/etc/viewlog @@ -0,0 +1,26 @@ +#!/bin/bash + +DIRECTORY="$(readlink -f "$(dirname "$(dirname "$0")")")" + +file="$6" +echo "$file" > "$DIRECTORY/data/current-viewed-logfile" + +if command -v mousepad ;then + mousepad "$file" & + pid=$! +elif command -v leafpad ;then + leafpad "$file" & + pid=$! +else + #for text_editor function + source "${DIRECTORY}/api" + text_editor "$file" & + pid=$! +fi + +while [ "$(cat "$DIRECTORY/data/current-viewed-logfile")" == "$file" ];do + sleep 1 +done +kill $pid 2>/dev/null + + diff --git a/icons/install-short.png b/icons/install-short.png new file mode 100644 index 0000000000000000000000000000000000000000..55f0de4e5f51099926172fc5e86d746227d630c2 GIT binary patch literal 6728 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 literal 0 HcmV?d00001 diff --git a/manage b/manage index 2e73d45..0cb3322 100755 --- a/manage +++ b/manage @@ -14,6 +14,14 @@ if [ -z "$1" ];then error "You need to specify an operation, and in most cases, which app to operate on." fi +rm_esc() { #remove ANSI escape sequences from a given file + [ -z "$1" ] && error "rm_esc: no filename given!" + [ ! -f "$1" ] && error "rm_esc: given filename ($1) does not exist or is not a file!" + + sed -i 's/\x1b\[[0-9;]*m//g' "$1" + +} + source "${DIRECTORY}/api" || error "failed to source ${DIRECTORY}/api" mkdir -p "${DIRECTORY}/data/status" "${DIRECTORY}/data/update-status" @@ -139,21 +147,45 @@ elif [ "$1" == 'install' ];then installscript="${DIRECTORY}/apps/${app}/${scriptname}" [ -z "$scriptname" ] && error "It appears $app does not have an install-${arch} script suitable for your ${arch}-bit OS." - echo -e "\e[96mInstalling $app with $scriptname script\e[39m" + #determine path for log file to be created + logfile="${DIRECTORY}/logs/install-incomplete-${app}.log" + if [ -f "$logfile" ] || [ -f "$(echo "$logfile" | sed 's+/-incomplete-+/-success-+g')" ] || [ -f "$(echo "$logfile" | sed 's+/-incomplete-+/-fail-+g')" ];then + #append a number to logfile's file-extension if the original filename already exists + i=1 + while true;do + #if variable $i is 2, then example newlogfile value: /path/to/install-Discord.log2 + newlogfile="$logfile$i" + if [ ! -f "$newlogfile" ] && [ ! -f "$(echo "$newlogfile" | sed 's+/-incomplete-+/-success-+g')" ] && [ ! -f "$(echo "$newlogfile" | sed 's+/-incomplete-+/-fail-+g')" ];then + logfile="${newlogfile}" + break + fi + i=$((i+1)) + done + fi + #for piping to tee, the install script's exit code is preserved by enabling the pipefail bash builtin + set -o pipefail + + echo -e "\e[96mInstalling $app with $scriptname script\e[39m" | tee -a "$logfile" cd $HOME echo 'corrupted' > "${DIRECTORY}/data/status/${app}" - if nice "$installscript" ; then + if nice "$installscript" 2>&1 | tee -a "$logfile" ; then echo 'installed' > "${DIRECTORY}/data/status/${app}" - echo -e "\n\e[42m\e[30mInstalled ${app} successfully.\e[39m\e[49m" + echo -e "\n\e[42m\e[30mInstalled ${app} successfully.\e[39m\e[49m" | tee -a "$logfile" + + rm_esc "$logfile" #remove escape sequences from logfile + mv "$logfile" "$(echo "$logfile" | sed 's+-incomplete-+-success-+g')" # exit 0 else echo -e "\n\e[41m\e[30mFailed to install ${app} with $scriptname script"\!"\e[39m\e[49m \e[40m\e[93m\e[5m▲\e[25m\e[39m \e[49m\e[93mNeed help? Copy the above error output or take a screenshot. Please ask on Github: \e[94m\e[4mhttps://github.com/Botspot/pi-apps/issues/new/choose\e[24m\e[93m -Or on Discord: \e[94m\e[4mhttps://discord.gg/RXSTvaUvuu\e[24m\e[39m" +Or on Discord: \e[94m\e[4mhttps://discord.gg/RXSTvaUvuu\e[24m\e[39m" | tee -a "$logfile" + rm_esc "$logfile" #remove escape sequences from logfile + mv "$logfile" "$(echo "$logfile" | sed 's+-incomplete-+-fail-+g')" exit 1 fi + elif [ "$1" == 'uninstall' ];then #UNINSTALL #for this operation, a program name must be specified. @@ -174,15 +206,37 @@ elif [ "$1" == 'uninstall' ];then #analytics "${DIRECTORY}/etc/bitlylink" "$app" uninstall - echo -e "\e[96mUninstalling $app\e[39m" + #determine path for log file to be created + logfile="${DIRECTORY}/logs/uninstall-incomplete-${app}.log" + if [ -f "$logfile" ] || [ -f "$(echo "$logfile" | sed 's+/-incomplete-+/-success-+g')" ] || [ -f "$(echo "$logfile" | sed 's+/-incomplete-+/-fail-+g')" ];then + #append a number to logfile's file-extension if the original filename already exists + i=1 + while true;do + #if variable $i is 2, then example newlogfile value: /path/to/install-Discord.log2 + newlogfile="$logfile$i" + if [ ! -f "$newlogfile" ] && [ ! -f "$(echo "$newlogfile" | sed 's+/-incomplete-+/-success-+g')" ] && [ ! -f "$(echo "$newlogfile" | sed 's+/-incomplete-+/-fail-+g')" ];then + logfile="${newlogfile}" + break + fi + i=$((i+1)) + done + fi + #for piping to tee, the install script's exit code is preserved by enabling the pipefail bash builtin + set -o pipefail + + echo -e "\e[96mUninstalling $app\e[39m" | tee -a "$logfile" cd $HOME echo 'corrupted' > "${DIRECTORY}/data/status/${app}" - if "${DIRECTORY}/apps/${app}/uninstall" ; then + if nice "${DIRECTORY}/apps/${app}/uninstall" 2>&1 | tee -a "$logfile"; then echo 'uninstalled' > "${DIRECTORY}/data/status/${app}" - echo -e "\n\e[42m\e[30mUninstalled ${app} successfully.\e[39m\e[49m" + echo -e "\n\e[42m\e[30mUninstalled ${app} successfully.\e[39m\e[49m" | tee -a "$logfile" + rm_esc "$logfile" #remove escape sequences from logfile + mv "$logfile" "$(echo "$logfile" | sed 's+-incomplete-+-success-+g')" exit 0 else - echo -e "\n\e[41m\e[30mFailed to uninstall ${app}!\e[39m\e[49m" + echo -e "\n\e[41m\e[30mFailed to uninstall ${app}!\e[39m\e[49m" | tee -a "$logfile" + rm_esc "$logfile" #remove escape sequences from logfile + mv "$logfile" "$(echo "$logfile" | sed 's+-incomplete-+-fail-+g')" exit 1 fi elif [ "$1" == 'update' ];then diff --git a/settings b/settings index 5ebe19d..7bf49f7 100755 --- a/settings +++ b/settings @@ -105,6 +105,7 @@ ${params}" --form --separator='\n' --window-icon="${DIRECTORY}/icons/logo.png" --columns=2 \ $tooltips \ --field='Categories...'!"${DIRECTORY}/icons/categories.png":FBTN "bash -c '${DIRECTORY}/etc/categoryedit &>/dev/null'" \ + --field='Log files...'!"${DIRECTORY}/icons/log-file.png":FBTN "bash -c '${DIRECTORY}/etc/logviewer &>/dev/null'" \ $yadparams \ --field='New App...'!"${DIRECTORY}/icons/create.png":FBTN "bash -c '${DIRECTORY}/createapp &>/dev/null'" \ --button='Reset'!"${DIRECTORY}/icons/backup.png"!'Reset all settings to their defaults':2 \