Date: Wed, 14 Nov 2001 17:21:37 GMT From: Jon Wilson <jon@netcraft.com> To: FreeBSD-gnats-submit@freebsd.org Subject: bin/31987: patch to allow dump(1) to notify operators by mail(1) Message-ID: <200111141721.fAEHLb063982@beta.netcraft.com>
next in thread | raw e-mail | index | archive | help
>Number: 31987
>Category: bin
>Synopsis: patch to allow dump(1) to notify operators by mail(1)
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Nov 14 09:30:01 PST 2001
>Closed-Date:
>Last-Modified:
>Originator: Jon Wilson
>Release: FreeBSD 4.3-STABLE i386
>Organization:
Netcraft
>Environment:
System: FreeBSD beta.netcraft.com 4.3-STABLE FreeBSD 4.3-STABLE #4: Tue Jul 10 17:40:16 BST 2001 jez@beta.netcraft.com:/usr/obj/usr/src/sys/BETA i386
>Description:
This is a patch to dump(1) to allow it to use mail(1) to notify operators of
events, including when it is time to change the tape
>How-To-Repeat:
Apply the patch!
>Fix:
Here's a patch:
Common subdirectories: /usr/src/sbin/dump/CVS and ./jon/src/sbin/dump/CVS
diff -c -b /usr/src/sbin/dump/dump.8 ./jon/src/sbin/dump/dump.8
*** /usr/src/sbin/dump/dump.8 Sat Aug 18 22:33:40 2001
--- ./jon/src/sbin/dump/dump.8 Wed Nov 14 16:09:24 2001
***************
*** 42,48 ****
.Nd filesystem backup
.Sh SYNOPSIS
.Nm
! .Op Fl 0123456789acknu
.Op Fl B Ar records
.Op Fl b Ar blocksize
.Op Fl D Ar dumpdates
--- 42,48 ----
.Nd filesystem backup
.Sh SYNOPSIS
.Nm
! .Op Fl 0123456789ackmnu
.Op Fl B Ar records
.Op Fl b Ar blocksize
.Op Fl D Ar dumpdates
***************
*** 178,190 ****
available if this option was enabled when
.Nm
was compiled.)
.It Fl n
Whenever
.Nm
requires operator attention,
notify all operators in the group
.Dq operator
! by means similar to a
.Xr wall 1 .
.It Fl s Ar feet
Attempt to calculate the amount of tape needed
--- 178,198 ----
available if this option was enabled when
.Nm
was compiled.)
+ .It Fl m
+ Whenever
+ .Nm
+ requires operator attention,
+ notify the mail alias
+ .Dq operator
+ by use of
+ .Xr mail 1 .
.It Fl n
Whenever
.Nm
requires operator attention,
notify all operators in the group
.Dq operator
! by use of
.Xr wall 1 .
.It Fl s Ar feet
Attempt to calculate the amount of tape needed
diff -c -b /usr/src/sbin/dump/dump.h ./jon/src/sbin/dump/dump.h
*** /usr/src/sbin/dump/dump.h Sat Oct 6 22:35:23 2001
--- ./jon/src/sbin/dump/dump.h Wed Nov 14 16:49:49 2001
***************
*** 79,84 ****
--- 79,86 ----
int unlimited; /* if set, write to end of medium */
int notify; /* notify operator flag */
+ int mail; /* mail ops flag */
+ int wall; /* wall ops flag */
int blockswritten; /* number of blocks written on current tape */
int tapeno; /* current tape number */
time_t tstart_writing; /* when started writing the first tape block */
***************
*** 95,100 ****
--- 97,104 ----
/* operator interface functions */
void broadcast __P((char *message));
+ void mailcast __P((char *message));
+ void wallcast __P((char *message));
void lastdump __P((int arg)); /* int should be char */
void msg __P((const char *fmt, ...)) __printflike(1, 2);
void msgtail __P((const char *fmt, ...)) __printflike(1, 2);
***************
*** 150,156 ****
#define X_ABORT 3 /* abort dump; don't attempt checkpointing */
#define OPGRENT "operator" /* group entry to notify */
!
struct fstab *fstabsearch __P((char *key)); /* search fs_file and fs_spec */
#ifndef NAME_MAX
--- 154,161 ----
#define X_ABORT 3 /* abort dump; don't attempt checkpointing */
#define OPGRENT "operator" /* group entry to notify */
! #define OPMAIL "operator" /* mail alias to notify */
! #define OPSUBJECT "dump requires attention" /* subject to use in mail */
struct fstab *fstabsearch __P((char *key)); /* search fs_file and fs_spec */
#ifndef NAME_MAX
diff -c -b /usr/src/sbin/dump/main.c ./jon/src/sbin/dump/main.c
*** /usr/src/sbin/dump/main.c Sat Oct 6 22:35:23 2001
--- ./jon/src/sbin/dump/main.c Wed Nov 14 16:18:43 2001
***************
*** 78,83 ****
--- 78,85 ----
#endif
int notify = 0; /* notify operator flag */
+ int wall = 0; /* wall ops flag */
+ int mail = 0; /* mail ops flag */
int blockswritten = 0; /* number of blocks written on current tape */
int tapeno = 0; /* current tape number */
int density = 0; /* density in bytes/0.1" " <- this is for hilit19 */
***************
*** 123,131 ****
obsolete(&argc, &argv);
#ifdef KERBEROS
! #define optstring "0123456789aB:b:cd:f:h:kns:T:uWwD:"
#else
! #define optstring "0123456789aB:b:cd:f:h:ns:T:uWwD:"
#endif
while ((ch = getopt(argc, argv, optstring)) != -1)
#undef optstring
--- 125,133 ----
obsolete(&argc, &argv);
#ifdef KERBEROS
! #define optstring "0123456789aB:b:cd:f:h:kmns:T:uWwD:"
#else
! #define optstring "0123456789aB:b:cd:f:h:mns:T:uWwD:"
#endif
while ((ch = getopt(argc, argv, optstring)) != -1)
#undef optstring
***************
*** 178,185 ****
break;
#endif
! case 'n': /* notify operators */
! notify = 1;
break;
case 's': /* tape size, feet */
--- 180,191 ----
break;
#endif
! case 'm': /* notify ops by mail(1) */
! mail = 1;
! break;
!
! case 'n': /* notify operators by wall(1) */
! wall = 1;
break;
case 's': /* tape size, feet */
***************
*** 212,217 ****
--- 218,226 ----
argc -= optind;
argv += optind;
+ if (mail || wall)
+ notify = 1;
+
if (argc < 1) {
(void)fprintf(stderr, "Must specify disk or filesystem\n");
exit(X_STARTUP);
***************
*** 492,498 ****
#ifdef KERBEROS
"k"
#endif
! "nu] [-B records] [-b blocksize] [-D dumpdates]\n"
" [-d density] [-f file ] [-h level] [-s feet] "
"[-T date] filesystem\n"
" dump [-W | -w]\n");
--- 501,507 ----
#ifdef KERBEROS
"k"
#endif
! "mnu] [-B records] [-b blocksize] [-D dumpdates]\n"
" [-d density] [-f file ] [-h level] [-s feet] "
"[-T date] filesystem\n"
" dump [-W | -w]\n");
diff -c -b /usr/src/sbin/dump/optr.c ./jon/src/sbin/dump/optr.c
*** /usr/src/sbin/dump/optr.c Sat Nov 3 22:44:51 2001
--- ./jon/src/sbin/dump/optr.c Wed Nov 14 16:43:34 2001
***************
*** 125,141 ****
void
alarmcatch()
{
! if (notify == 0) {
! if (timeout == 0)
(void) fprintf(stderr,
" DUMP: %s: (\"yes\" or \"no\") ",
attnmessage);
! else
msgtail("\a\a");
} else {
if (timeout) {
msgtail("\n");
! broadcast(""); /* just print last msg */
}
(void) fprintf(stderr," DUMP: %s: (\"yes\" or \"no\") ",
attnmessage);
--- 125,143 ----
void
alarmcatch()
{
! if (wall == 0) {
! if (timeout == 0) {
! if (mail) mailcast(""); /* mail warnings only get sent out once */
(void) fprintf(stderr,
" DUMP: %s: (\"yes\" or \"no\") ",
attnmessage);
! } else
msgtail("\a\a");
+
} else {
if (timeout) {
msgtail("\n");
! wallcast(""); /* just print last msg */
}
(void) fprintf(stderr," DUMP: %s: (\"yes\" or \"no\") ",
attnmessage);
***************
*** 158,173 ****
}
/*
! * We now use wall(1) to do the actual broadcasting.
*/
void
broadcast(message)
char *message;
{
FILE *fp;
char buf[sizeof(_PATH_WALL) + sizeof(OPGRENT) + 3];
! if (!notify)
return;
snprintf(buf, sizeof(buf), "%s -g %s", _PATH_WALL, OPGRENT);
--- 160,197 ----
}
/*
! * Generic function to warn operators in various ways
! *
! * Need to distiguish between wall(1) and mail(1) for
! * different usage when called from (e.g.) alarmcatch()
*/
void
broadcast(message)
char *message;
{
+ if (!notify)
+ return;
+
+ if (wall)
+ wallcast(message);
+
+ if (mail)
+ mailcast(message);
+ }
+
+
+ /*
+ * Use wall(1) to do the broadcasting
+ */
+ void
+ wallcast(message)
+ char *message;
+ {
+
FILE *fp;
char buf[sizeof(_PATH_WALL) + sizeof(OPGRENT) + 3];
! if (!wall)
return;
snprintf(buf, sizeof(buf), "%s -g %s", _PATH_WALL, OPGRENT);
***************
*** 181,186 ****
--- 205,240 ----
(void) fputs(message, fp);
(void) pclose(fp);
+
+ }
+
+ /*
+ * Use mail(1) to do the "broadcasting"
+ */
+ void
+ mailcast(message)
+ char *message;
+ {
+
+ FILE *fp;
+ char buf[sizeof(_PATH_MAIL) + sizeof(OPSUBJECT) + sizeof(OPMAIL) + 5];
+
+ if (!mail)
+ return;
+
+ snprintf(buf, sizeof(buf), "%s -s '%s' %s",
+ _PATH_MAIL, OPSUBJECT, OPMAIL);
+ if ((fp = popen(buf, "w")) == NULL)
+ return;
+
+ (void) fputs("Message from the dump program to all operators\n\nDUMP: NEEDS ATTENTION: ", fp);
+ if (lastmsg[0])
+ (void) fputs(lastmsg, fp);
+ if (message[0])
+ (void) fputs(message, fp);
+
+ (void) pclose(fp);
+
}
/*
diff -c -b /usr/src/sbin/dump/pathnames.h ./jon/src/sbin/dump/pathnames.h
*** /usr/src/sbin/dump/pathnames.h Sat Oct 6 22:35:23 2001
--- ./jon/src/sbin/dump/pathnames.h Wed Nov 14 16:47:31 2001
***************
*** 42,44 ****
--- 42,45 ----
#define _PATH_LOCK "/tmp/dumplockXXXXXX"
#define _PATH_RMT "/etc/rmt" /* path on remote host */
#define _PATH_WALL "/usr/bin/wall"
+ #define _PATH_MAIL "/usr/bin/mail"
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200111141721.fAEHLb063982>
