[mod.sources] v07i062: Nag reminder service, Part01/02

sources-request@mirror.TMC.COM (11/10/86)

Submitted by: daveb@rtech.uucp (Dave Brower)
Mod.sources: Volume 7, Issue 62
Archive-name: nag/Part01

This is a program I use to warn me about upcoming meetings and other
events I need to be forcefully provoked to attend.  It has been used on
CCI Power6-BSD, CCI-Power 6-SV and the AT&T Unix-PC.

[  The comparison with other programs, given in the README, is interesting.
   --r$  ]

#!/bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #!/bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	README
#	nag.1
#	Makefile
# This archive created: Fri Sep 12 16:16:27 1986
export PATH; PATH=/bin:$PATH
echo shar: extracting "'README'" '(1410 characters)'
if test -f 'README'
then
	echo shar: over-writing existing file "'README'"
fi
sed 's/^X//' << \SHAR_EOF > 'README'
XDescription
X-----------
X
XNag and okok are provide a reminder service for people who need
Xa *lot* of provocation before doing something.
X
XThe system lets you run arbitrary commands at intervals around
Xspecified events.  For instance, you can echo a message 15, 10,
Xand 5 minutes before a meeting.  The configuration is kept in a
X~/.nag file.  You add and alter events with your favorite
Xeditor.
X
XOkok (which is just a link to nag) provides a simple way of
Xshutting up messages once you've gotten the point.
X
XYou start a nag daemon in your .login or .profile.  It puts
Xitself in the background and exits after you log off.
X
XThe system works correctly if you are logged into multiple
Xterminals. Each login gets it's own daemon issuing messages on
Xeach terminal. Running okok on one will silence output on all
Xthe others.
X
XComparisons with existing facilities
X------------------------------------
X
Xat:
X	* Makes you post the events.
X	* No intervals
X	* Not available to all users.  Even on SV.2 with user cron tables,
X	  you need special permission in cron.allow.
X	* Doesn't know when you log out.
X
Xcron:
X	* No intervals.
X	* Not available to all users.  Even on SV.2 with user cron tables,
X	  you need special permission in cron.allow.
X	* Doesn't know when you log out.
X	* Hard to turn off.
X
Xcalendar:
X	* One mail message only (too easy to ignore).
X	* No subject line in the mail.
X
Xleave:
X	* Inadequate flexibility.
SHAR_EOF
if test 1410 -ne "`wc -c 'README'`"
then
	echo shar: error transmitting "'README'" '(should have been 1410 characters)'
fi
echo shar: extracting "'nag.1'" '(3319 characters)'
if test -f 'nag.1'
then
	echo shar: over-writing existing file "'nag.1'"
fi
sed 's/^X//' << \SHAR_EOF > 'nag.1'
X.TH NAG 1 "Thu Sep  4 11:48:01 PDT 1986"
X.SH NAME
Xnag \- annoying reminder service daemon.
X.SH SYNOPSIS
X.B nag
X.br
X.B okok
X.SH DESCRIPTION
X.I Nag
Xissues reminders from your ~/.nag file as specified.  You start
X.I nag
Xin your
X.I .profile
Xor
X.I .login,
Xwhere it lies around much like
X.I leave(1)
Xuntil you logout.  It reads the .nag file, and executes reminder
Xcommands at intervals before a time.  Reminders are silenced with
X.I okok.
XWhen you log off,
X.I nag
Xexits just before it would have executed a command on your behalf.
X.PP
X.I Nag
Xignores interrupts, quits and terminates.  To get rid of it, you can log
Xoff or use ``kill \-9.''
X.PP
XThe .nag file has the format:
X.nf
X
X	[ status ] day time interval command
X.fi
X.PP
X.I status
Xis either
X.br
X(1) '#', marking a comment line
X.br
X(2) ':', turning off execution of commands for the event.
X.PP
X.I day
Xis one of
X.br
X(1) A date such as mm/dd/yy, or reasonable alternatives.
X.br
X(2) `*' meaning every day.
X.br
X(3) A day of the week.
XDay names may be recognizably abbreviated.
X.PP
X.I time
Xis a standard time specification, like ``12:05'' or ``3AM''
X.PP
X.I interval
Xis a colon separated list of signed integer offsets from the
Xevent
X.I time
Xthe
X.I command
Xwill be executed.  Negative values are before the event, 0 at the event,
Xand positive values later.
X.PP
X.I command
Xis a string up to a newline that will be executed by
X.I system(3)
Xon your behalf at the specified
X.I interval
Xuntil you shut it up with
X.I okok.
X.PP
XSome shell variables are set for use by the command:
X.br
X.B pretime
Xis set to the -interval.
X.br
X.B posttime
Xis set to the interval.
X.br
X.B now
Xis set to an hh:mm string of the present time, in 24 hour format.
X.br
X.B then
Xis set to an hh:mm string of the event time.
X.PP
X.I okok
Xshuts up the the nagging.  It opens the terminal and prompts with the
Xcommand(s) nearing their times, like rm -i.  Answering `y' silences
Xfurther executions of the command.  It does this by editing the .nag
Xfile, which is noticed by any running
X.I nag
Xprocesses the next time they wake up.
X.PP
XWhen a silenced event is past it's last possible occurrance,
X.I nag
Xre\-enables it by writing the .nag file.  This makes `*' reminders
Xwork the next day.
X
X.SH EXAMPLES
XA .nag file might have the following entries:
X.PP
X.br
X 8/8/88 2PM -60:-30:-15:0 writebig "$pretime to Client call at $then"
X.br
X Mon 3PM -60:-30:-15:0 hey "Status report due in $pretime minutes"
X.br
X Wed 3:30PM -30:-15:-5:0 echo "Committee at $then in $pretime minutes"
X.br
X * 13:00 -45:-30:0 writebig "Lunch in $pretime minutes"
X.br
X * 7PM -5:-4:-3:-2:-1:0 echo "GO HOME!!! It's $now"
X.br
X * 10:30 -10:-5:0 echo "Donut truck in $pretime minutes"
X.SH FILES
X.ta 2i
X.B ~/.nag	file describing things to do.
X.SH ENVIRONMENT
X.br
X.B NAGFILE	a file to use as the nagfile instead of ~/.nag
X.SH "SEE ALSO"
Xat(1),
Xcalendar(1),
Xhey(1),
Xleave(1),
Xsleep(1),
Xcron(8)
X.SH DIAGNOSTICS
XComplains about various syntax errors and times out of range, and problems
Xaccessing .nag file
X.SH BUGS
X.PP
XProbably won't work with `stty nostop' set.
X.PP
XIntervals will be approximate because of sleep granularity and scheduling
Xcontention.
X.PP
XThere is no locking of the .nag file.  This could be trouble if a
X.I nag
Xand an
X.I okok
Xdecide to write at the same time.
X.SH AUTHOR
XDavid Brower
X.br
X{sun, cbosgd, amdahl, mtxinu}!rtech!gonzo!daveb
X
X
SHAR_EOF
if test 3319 -ne "`wc -c 'nag.1'`"
then
	echo shar: error transmitting "'nag.1'" '(should have been 3319 characters)'
fi
echo shar: extracting "'Makefile'" '(619 characters)'
if test -f 'Makefile'
then
	echo shar: over-writing existing file "'Makefile'"
fi
sed 's/^X//' << \SHAR_EOF > 'Makefile'
X#
X# Makefile for the nag/okok system.
X#
X
XSHAR1 =		README nag.1 Makefile 
XSHAR2 =		$(SRCS)
X
X# -DSYS5 for System V, nothing for BSD.
XDEFS =		# -DSYS5
XOPTDEB =	-O
XCFLAGS =	$(DEFS) $(OPTDEB)
XOBJS =		gdate.o nag.o
XSRCS =		gdate.c nag.c
X
Xall:		nag okok
X
Xclean:;		rm -f $(OBJS) nag okok gdate OUT LINT a.out core
X
Xnag:		$(OBJS)
X		cc -g -o nag $(OBJS)
X
Xokok:		nag
X		ln nag okok
X
Xgdate:		gdate.c
X		cc -DDEBUG $(CFLAGS) gdate.c -o gdate
X
Xlint:		LINT
X
XLINT:		$(SRCS)
X		lint $(DEFS) $(SRCS) > LINT
X
Xshar:		nag1.shar nag2.shar
X
Xnag1.shar:	$(SHAR1)
X		shar -a $(SHAR1) > nag1.shar
X
Xnag2.shar:	$(SHAR2)
X		shar -a $(SHAR2) > nag2.shar
X
SHAR_EOF
if test 619 -ne "`wc -c 'Makefile'`"
then
	echo shar: error transmitting "'Makefile'" '(should have been 619 characters)'
fi
#	End of shell archive
exit 0