#!/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 : ${ZPMSPOOL:=/var/lib/admin/notes} OPEN=$ZPMSPOOL/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 $ZPMSPOOL -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 $ZPMSPOOL/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 $ZPMSPOOL/ack -type f -printf '%P\n' | sort -n ;; ?*) if [ -d $ZPMSPOOL/open/$1 ] ; then find $ZPMSPOOL/open/$1 -type f -printf '%P\n' | sort -n else exit 1 fi ;; *) find $ZPMSPOOL/open -type f -printf '%P\n' | sort -n ;; esac ;; detail) len=$(find $ZPMSPOOL/open -type f -printf "%P\n" | awk ' { if ( length > x ) { x = length } }END{ print x }') find $ZPMSPOOL/open -type f -printf "%P\n" | sort -n | while read note ; do subject=$(head -1 $ZPMSPOOL/open/$note) date=$(stat -c '%y' $ZPMSPOOL/open/$note | cut -f1 -d' ') owner=$(stat -c '%U' $ZPMSPOOL/open/$note) printf '%*s %8s %s %s\n' $len $note $owner "$date" "$subject" done ;; ack) file=$(findopen $1) subfile=$(echo $file | sed -e "s|$ZPMSPOOL/open/||") filedir=$(dirname $subfile) mkdir -p $ZPMSPOOL/ack/$filedir mv $file $ZPMSPOOL/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 $ZPMSPOOL/open) pkg=$1 [ -f $ZPMSPOOL/.template ] && cp $ZPMSPOOL/.template $tmp #flock -n -E3 $tmp vim $tmp #if [ $? -eq 3 ]; then echo already editing $1; exit 1; fi ${EDITOR:-vi} $tmp else # take note from file or stdin pkg=$1 ; shift mkdir -p $ZPMSPOOL/open/$pkg case $1 in '-') tmp=$(mktemp -p $ZPMSPOOL/open) cat - > $tmp ;; *) tmp=$(mktemp -p $ZPMSPOOL/open) cp $1 $tmp ;; esac fi file=$(zpm sequence notes) mkdir -p $ZPMSPOOL/open/$pkg mv $tmp $ZPMSPOOL/open/$pkg/$file || { rm -f $tmp; exit 1; } # TODO run newhooks in $ZPMSPOOL/.hook/newnote echo "$pkg/$file" exit 0 ;; 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