PublicFiles/Artian-Apps/etc/logviewer

127 lines
4.1 KiB
Bash

#!/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 +6 -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
#determine which day of the week it is. (used for text replacement)
today="$(date +%A)"
#determine which day of the week yesterday was. (used for text replacement)
yesterday=$(date +%A --date='yesterday')
#create a named pipe to send list to yad on-the-fly
pipe="$(mktemp -u)" #get a random filename to work with
mkfifo $pipe #make the named pipe
trap "rm $pipe" EXIT #remove this named pipe on exit
echo pipe is $pipe
#generate the yad list in a subprocess and send the output to the pipe as it's being generated
(
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/$today/Today/g" | sed "s/$yesterday/Yesterday/g")"
else
#24h timestamp: 'Friday 18:21'
date="$(date -r "$file" '+%A %k:%M' | sed 's/ / /g' | sed "s/$today/Today/g" | sed "s/$yesterday/Yesterday/g")"
fi
#echo "$app\n $action\n $result\n"
#determine app icon
if [ -f "${DIRECTORY}/apps/${app}/icon-24.png" ];then
app_icon="${DIRECTORY}/apps/${app}/icon-24.png"
else
app_icon="${DIRECTORY}/icons/none-24.png"
fi
#determine action icon
if [ "$action" == uninstall ];then
action_icon="${DIRECTORY}/icons/uninstall.png"
elif [ "$action" == install ];then
action_icon="${DIRECTORY}/icons/install.png"
else
action_icon="${DIRECTORY}/icons/none-24.png"
fi
#determine result icon
if [ "$result" == success ];then
result_icon="${DIRECTORY}/icons/success.png"
elif [ "$result" == fail ];then
result_icon="${DIRECTORY}/icons/failure.png"
else #incomplete
result_icon="${DIRECTORY}/icons/interrupted.png"
fi
#determine caption - "Installing Zoom succeeded."
if [ "$action" == uninstall ];then
caption="Uninstalling $app"
elif [ "$action" == install ];then
caption="Installing $app"
fi
if [ "$result" == success ];then
caption+=" succeeded."
elif [ "$result" == fail ];then
caption+=" failed."
else #incomplete
caption+=" was interrupted."
fi
#add lines to the yad list
echo "$date
$action_icon
$app_icon
$result_icon
$caption
$file" > "$pipe"
done
) &
echo
echo ready
yad --center --title='Log file viewer' --width=500 --height=400 --on-top \
--text="Review the errors from installing or uninstalling apps."$'\n'"Week-old log files will be deleted." \
--list --separator='\n' --window-icon="${DIRECTORY}/icons/settings.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" --dclick-action='true' \
--button='Delete all'!"${DIRECTORY}/icons/trash.png"!"Delete all log files from $DIRECTORY/logs":2 \
--button=Close!"${DIRECTORY}/icons/exit.png":1 < <(tail -f --retry "$pipe")
button=$? #get exit code of yad
#delete all logfiles if user requested
if [ $button == 2 ];then
rm -rf "$DIRECTORY/logs"
mkdir "$DIRECTORY/logs"
echo "Deleted everything inside of $DIRECTORY/logs"
fi