#!/bin/sh # Admin notes: # # Each note is just a file. Stored under /var/spool/admin/notes/[open|ack]// # # note: list notes # note ack - moves note to "acknowledged" spool # note list [package] show notes for a given package, or all notes # note delete - delete a note from the system # note edit [file] - edit or create a note # TODO # discard unchanged new note file # quiet options to suppress new note name echo # semi-quiet to just output the number # renumber? to renumber all notes/reset sequence # lock the temp files # clean up unlocked temp files SPOOL=/var/lib/admin/notes OPEN=$SPOOL/open set -e umask 007 #cd $SPOOL || { echo "can't chdir to $SPOOL" ; exit 1; } [ -z "$1" ] && set list quiet= cmd=$1 shift findnote() { file=$(find $SPOOL -type f -name "$1") if [ -z "$file" ] ; then [ -z "$quiet" ] || printf "no such note $1\n" 1>&2 exit 1 fi echo $file } findopen() { file=$(find $SPOOL/open -type f -name "$1") if [ -z "$file" ] ; then [ -z "$quiet" ] || printf "no such open note $1\n" 1>&2 exit 1 fi echo $file } case $cmd in category) notefile=$(findnote $1) printf "%s\n" $(basename $(dirname $notefile)) ;; list) case $1 in -a) find $SPOOL/ack -type f -printf '%P\n' | sort -n ;; *) find $SPOOL/open -type f -printf '%P\n' | sort -n ;; esac ;; detail) len=$(find $SPOOL/open -type f -printf "%P\n" | awk ' { if ( length > x ) { x = length } }END{ print x }') find $SPOOL/open -type f -printf "%P\n" | sort -n | while read note ; do subject=$(head -1 $SPOOL/open/$note) date=$(stat -c '%y' $SPOOL/open/$note | cut -f1 -d' ') owner=$(stat -c '%U' $SPOOL/open/$note) printf '%*s %8s %s %s\n' $len $note $owner "$date" "$subject" done ;; ack) file=$(findopen $1) subfile=$(echo $file | sed -e "s|$SPOOL/open/||") filedir=$(dirname $subfile) mkdir -p $SPOOL/ack/$filedir mv $file $SPOOL/ack/$filedir ;; new) # new -- edit a new file for package general (or ZPMNOTEPACKAGE) # new package -- edit a new note for package # new package file -- use file for new package note if [ $# -eq 0 ]; then set ${ZPMNOTEPACKAGE:-general}; fi # edit a new file for the note if [ $# -eq 1 ]; then tmp=$(mktemp -p $SPOOL/open) pkg=$1 [ -f $SPOOL/.template ] && cp $SPOOL/.template $tmp ${EDITOR:-vi} $tmp file=$(zpm sequence notes) mv $tmp $SPOOL/open/$pkg/$file || { rm -f $tmp; exit 1; } echo "$pkg/$file" exit 0 fi # take note from file or stdin pkg=$1 ; shift mkdir -p $SPOOL/open/$pkg case $1 in '-') tmp=$(mktemp -p $SPOOL/open) cat - > $tmp file=$(zpm sequence notes) mv $tmp $SPOOL/open/$pkg/$file || { rm -f $tmp ; exit 1; } echo $file ;; *) tmp=$(mktemp -p $SPOOL/open) cp $1 $tmp #flock -n -E3 $tmp vim $tmp #if [ $? -eq 3 ]; then echo already editing $1; exit 1; fi file=$(zpm sequence notes) mv $tmp $SPOOL/open/$pkg/$file || { rm -f $tmp; exit 1; } echo $file ;; esac ;; edit) file=$(findnote $1) flock -n -E3 $file vim $file if [ $? -eq 3 ]; then echo already editing $1; exit 1; fi ;; resolve) file=$(findnote $1) echo $file ;; remove) file=$(findnote $1) rm $file ;; show) file=$(findnote $1) ${PAGER:-less} $file ;; *) echo '$0: unknown command ' $cmd 1>&2 exit 1 esac