cosmic/bin/cosmic-log

202 lines
4.3 KiB
Bash
Executable File

#!/bin/sh
# TODO: create new messages for ship using templates
# TODO: better isolate listings.gophermap from accidental clobbering
version="0.1.0"
user=$(whoami)
ships=$(find /var/gopher -user "$user" -type d -exec basename {} \;)
numships=$(echo "${ships}" | wc -l)
tmp=$(mktemp -t "$(basename "$0").tmp.XXXXXXX") || die "Failed to create temporary file" 1
flag_help=0
flag_version=0
flag_debug=0
flag_shortlist=0
arg_options="hvds:z"
arg_log=1
arg_ship=""
die () {
msg="$1"
code="$2"
# exit code defaults to 1
if printf "%s" "$code" | grep -q '^[0-9]+$'; then
code=1
fi
# output message to stdout or stderr based on code
if [ -n "$msg" ]; then
if [ "$code" -eq 0 ]; then
printf "%s\\n" "$msg"
else
printf "%s\\n" "$msg" >&2
fi
fi
exit "$code"
}
finish () {
rm -f "$tmp"
}
trap finish EXIT
parse_input () {
if ! parsed=$(getopt $arg_options "$@"); then
die "Invalid input" 2
fi
eval set -- "$parsed"
while true; do
case "$1" in
-h)
flag_help=1
arg_log=0
shift
;;
-v)
flag_version=1
arg_log=0
shift
;;
-d)
flag_debug=1
arg_log=0
shift
;;
-s)
shift
arg_ship="$1"
shift
;;
-z)
flag_shortlist=1
shift
;;
--)
shift
break
;;
*)
die "Internal error: $1" 3
;;
esac
done
}
show_help () {
printf "%s [-hvd] [-s shipname]\\n\\n" "$(basename "$0")"
printf " -h Show this help\\n"
printf " -v Show current version info\\n"
printf " -d Debug mode\\n"
printf " -s [shipname] Only log messages for ship named\\n"
printf "\\n"
printf "Passing no options will enter interactive mode.\\n\\n"
printf "\\n"
}
read_key () {
_key=
if [ -t 0 ]; then
if [ -z "$_stty" ]; then
_stty=$(stty -g)
fi
stty -echo -icanon min 1
_key=$(dd bs=1 count=1 2>/dev/null)
stty "$_stty"
fi
}
yesno () {
read_key
case $_key in
y ) result=0 ;;
* ) result=1 ;;
esac
return $result
}
check_log () {
ship="$*"
printf ">> %s" "${ship}"
# look at log entries in gophermap
# compare against files in ship directory
# store list of unpublished logs
logs=$(grep "^0${ship}" "/var/gopher/listing.gophermap" | awk -F'\t' '{print $2}')
files=$(find "/var/gopher/$ship" -name "*.txt" -not -path '*/\.*' -type f | sed 's|/var/gopher||')
uniq=$(printf "%s\\n%s" "$logs" "$files" | sort | uniq -u)
if [ -z "$uniq" ]; then
printf " .... No messages.\\n"
else
# check each unpublished message for sending
IFS='
'
for u in $uniq
do
printf "\\n Send message %s? " "$(basename "$u" | sed 's/\.[^.]*$//')"
if yesno; then
# prompt for title and prepare output
printf "Title for message %s? " "$(basename "$u" | sed 's/\.[^.]*$//')"
read -r title
printf "0%s - %s\\t%s\\n" "$ship" "$title" "$u" | cat - /var/gopher/listing.gophermap > "$tmp" && cat "$tmp" > /var/gopher/listing.gophermap && rm "$tmp"
printf " %s .... Sent.\\n" "$(basename "$u" | sed 's/\.[^.]*$//')"
else
printf " %s .... Skipped.\\n" "$(basename "$u" | sed 's/\.[^.]*$//')"
fi
done
unset IFS
fi
}
main() {
parse_input "$@"
# debug
if [ $flag_debug -gt 0 ]; then
set -x
fi
# shortlist for bash completion
if [ $flag_shortlist -gt 0 ]; then
out="$ships"
die "${out}" 0
fi
# version
if [ $flag_version -gt 0 ]; then
printf "%s\\n" "$version"
fi
# print help
if [ $flag_help -gt 0 ]; then
show_help
fi
# standard log if no params
if [ $arg_log -gt 0 ]; then
printf "INITIALIZING QEC...\\n"
printf "Ready to transmit for [%s]\\n" "${user}"
if [ "$numships" -eq 0 ]; then
printf "No registered ships found in system.\\n"
elif [ "$numships" -eq 1 ]; then
if [ -z "$arg_ship" ] || [ "$ships" = "$arg_ship" ]; then
check_log "$ships"
fi
else
IFS='
'
for f in $ships
do
if [ -z "$arg_ship" ] || [ "$f" = "$arg_ship" ]; then
check_log "$(basename "$f")"
fi
done
unset IFS
fi
fi
}
main "$@"