]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Support 'mailfrom' line in mdadm.conf so the From: line in alert emails can be explic...
authorNeil Brown <neilb@suse.de>
Mon, 15 May 2006 01:27:04 +0000 (01:27 +0000)
committerNeil Brown <neilb@suse.de>
Mon, 15 May 2006 01:27:04 +0000 (01:27 +0000)
Signed-off-by: Neil Brown <neilb@suse.de>
ChangeLog
Monitor.c
config.c
mdadm.conf.5
mdadm.h

index ebf7f6e02fc808bf8869b1a3711a3c5ee4bc52c6..2529fe13db918c0360a776bb7e86f2ba549a2bb2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Changes Prior to this release
+    -   Support 'mailfrom' line in mdadm.conf so the From: line in alert
+       emails can be explicitly set.
+
 Changes Prior to 2.4.1 release
     -   Honour --write-mostly when adding to an array without persistent
         superblocks.
index 55f5c967307e06edda29fd8fc7bb00c5f6b823ae..d52b418293e34212191322243653bdb25e734201 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -35,8 +35,8 @@
 #include       <values.h>
 #include       <syslog.h>
 
-static void alert(char *event, char *dev, char *disc, char *mailaddr, char *cmd,
-                 int dosyslog);
+static void alert(char *event, char *dev, char *disc, char *mailaddr, char *mailfrom,
+                 char *cmd, int dosyslog);
 
 static char *percentalerts[] = { 
        "RebuildStarted",
@@ -113,6 +113,7 @@ int Monitor(mddev_dev_t devlist,
        } *statelist = NULL;
        int finished = 0;
        struct mdstat_ent *mdstat = NULL;
+       char *mailfrom = NULL;
 
        if (!mailaddr) {
                mailaddr = conf_get_mailaddr(config);
@@ -120,6 +121,8 @@ int Monitor(mddev_dev_t devlist,
                        fprintf(stderr, Name ": Monitor using email address \"%s\" from config file\n",
                               mailaddr);
        }
+       mailfrom = conf_get_mailfrom(config);
+
        if (!alert_cmd) {
                alert_cmd = conf_get_program(config);
                if (alert_cmd && ! scan)
@@ -219,12 +222,12 @@ int Monitor(mddev_dev_t devlist,
                        unsigned int i;
 
                        if (test)
-                               alert("TestMessage", dev, NULL, mailaddr, alert_cmd, dosyslog);
+                               alert("TestMessage", dev, NULL, mailaddr, mailfrom, alert_cmd, dosyslog);
                        fd = open(dev, O_RDONLY);
                        if (fd < 0) {
                                if (!st->err)
                                        alert("DeviceDisappeared", dev, NULL,
-                                             mailaddr, alert_cmd, dosyslog);
+                                             mailaddr, mailfrom, alert_cmd, dosyslog);
 /*                                     fprintf(stderr, Name ": cannot open %s: %s\n",
                                                dev, strerror(errno));
 */                             st->err=1;
@@ -233,7 +236,7 @@ int Monitor(mddev_dev_t devlist,
                        if (ioctl(fd, GET_ARRAY_INFO, &array)<0) {
                                if (!st->err)
                                        alert("DeviceDisappeared", dev, NULL,
-                                             mailaddr, alert_cmd, dosyslog);
+                                             mailaddr, mailfrom, alert_cmd, dosyslog);
 /*                                     fprintf(stderr, Name ": cannot get array info for %s: %s\n",
                                                dev, strerror(errno));
 */                             st->err=1;
@@ -244,7 +247,7 @@ int Monitor(mddev_dev_t devlist,
                                array.level != 6 && array.level != 10) {
                                if (!st->err)
                                        alert("DeviceDisappeared", dev, "Wrong-Level",
-                                             mailaddr, alert_cmd, dosyslog);
+                                             mailaddr, mailfrom, alert_cmd, dosyslog);
                                st->err = 1;
                                close(fd);
                                continue;
@@ -281,27 +284,27 @@ int Monitor(mddev_dev_t devlist,
                            mse &&      /* is in /proc/mdstat */
                            mse->pattern && strchr(mse->pattern, '_') /* degraded */
                                )
-                               alert("DegradedArray", dev, NULL, mailaddr, alert_cmd, dosyslog);
+                               alert("DegradedArray", dev, NULL, mailaddr, mailfrom, alert_cmd, dosyslog);
 
                        if (st->utime == 0 && /* new array */
                            st->expected_spares > 0 && 
                            array.spare_disks < st->expected_spares) 
-                               alert("SparesMissing", dev, NULL, mailaddr, alert_cmd, dosyslog);
+                               alert("SparesMissing", dev, NULL, mailaddr, mailfrom, alert_cmd, dosyslog);
                        if (mse &&
                            st->percent == -1 && 
                            mse->percent >= 0)
-                               alert("RebuildStarted", dev, NULL, mailaddr, alert_cmd, dosyslog);
+                               alert("RebuildStarted", dev, NULL, mailaddr, mailfrom, alert_cmd, dosyslog);
                        if (mse &&
                            st->percent >= 0 &&
                            mse->percent >= 0 &&
                            (mse->percent / 20) > (st->percent / 20))
                                alert(percentalerts[mse->percent/20],
-                                     dev, NULL, mailaddr, alert_cmd, dosyslog);
+                                     dev, NULL, mailaddr, mailfrom, alert_cmd, dosyslog);
 
                        if (mse &&
                            mse->percent == -1 &&
                            st->percent >= 0)
-                               alert("RebuildFinished", dev, NULL, mailaddr, alert_cmd, dosyslog);
+                               alert("RebuildFinished", dev, NULL, mailaddr, mailfrom, alert_cmd, dosyslog);
 
                        if (mse)
                                st->percent = mse->percent;
@@ -335,19 +338,19 @@ int Monitor(mddev_dev_t devlist,
                                             ((st->devstate[i]&change)&(1<<MD_DISK_ACTIVE)) ||
                                             ((st->devstate[i]&change)&(1<<MD_DISK_SYNC)))
                                                )
-                                               alert("Fail", dev, dv, mailaddr, alert_cmd, dosyslog);
+                                               alert("Fail", dev, dv, mailaddr, mailfrom, alert_cmd, dosyslog);
                                        else if (i >= (unsigned)array.raid_disks &&
                                                 (disc.major || disc.minor) &&
                                                 st->devid[i] == makedev(disc.major, disc.minor) &&
                                                 ((newstate&change)&(1<<MD_DISK_FAULTY))
                                                )
-                                               alert("FailSpare", dev, dv, mailaddr, alert_cmd, dosyslog);
+                                               alert("FailSpare", dev, dv, mailaddr, mailfrom, alert_cmd, dosyslog);
                                        else if (i < (unsigned)array.raid_disks &&
                                                 (((st->devstate[i]&change)&(1<<MD_DISK_FAULTY)) ||
                                                  ((newstate&change)&(1<<MD_DISK_ACTIVE)) ||
                                                  ((newstate&change)&(1<<MD_DISK_SYNC)))
                                                )
-                                               alert("SpareActive", dev, dv, mailaddr, alert_cmd, dosyslog);
+                                               alert("SpareActive", dev, dv, mailaddr, mailfrom, alert_cmd, dosyslog);
                                }
                                st->devstate[i] = disc.state;
                                st->devid[i] = makedev(disc.major, disc.minor);
@@ -393,7 +396,7 @@ int Monitor(mddev_dev_t devlist,
                                        st->spare_group = NULL;
                                        st->expected_spares = -1;
                                        statelist = st;
-                                       alert("NewArray", st->devname, NULL, mailaddr, alert_cmd, dosyslog);
+                                       alert("NewArray", st->devname, NULL, mailaddr, mailfrom, alert_cmd, dosyslog);
                                        new_found = 1;
                                }
                }
@@ -434,7 +437,7 @@ int Monitor(mddev_dev_t devlist,
                                                                  (unsigned long)dev) == 0) {
                                                                if (ioctl(fd1, HOT_ADD_DISK,
                                                                          (unsigned long)dev) == 0) {
-                                                                       alert("MoveSpare", st->devname, st2->devname, mailaddr, alert_cmd, dosyslog);
+                                                                       alert("MoveSpare", st->devname, st2->devname, mailaddr, mailfrom, alert_cmd, dosyslog);
                                                                        close(fd1);
                                                                        close(fd2);
                                                                        break;
@@ -460,7 +463,7 @@ int Monitor(mddev_dev_t devlist,
 }
 
 
-static void alert(char *event, char *dev, char *disc, char *mailaddr, char *cmd,
+static void alert(char *event, char *dev, char *disc, char *mailaddr, char *mailfrom, char *cmd,
                  int dosyslog)
 {
        int priority;
@@ -492,7 +495,10 @@ static void alert(char *event, char *dev, char *disc, char *mailaddr, char *cmd,
                        char hname[256];
                        gethostname(hname, sizeof(hname));
                        signal(SIGPIPE, SIG_IGN);
-                       fprintf(mp, "From: " Name " monitoring <root>\n");
+                       if (mailfrom)
+                               fprintf(mp, "From: %s\n", mailfrom);
+                       else
+                               fprintf(mp, "From: " Name " monitoring <root>\n");
                        fprintf(mp, "To: %s\n", mailaddr);
                        fprintf(mp, "Subject: %s event on %s:%s\n\n", event, dev, hname);
 
index 70b798eb86535c5127f9d205b82ab7bfcfe23b54..b1f51d9003d6636e05c05e6b9c5d59408dd0e98d 100644 (file)
--- a/config.c
+++ b/config.c
@@ -77,7 +77,7 @@
 char DefaultConfFile[] = CONFFILE;
 char DefaultAltConfFile[] = CONFFILE2;
 
-char *keywords[] = { "device", "array", "mailaddr", "program", NULL };
+char *keywords[] = { "device", "array", "mailaddr", "program", "mailfrom", NULL };
 
 /*
  * match_keyword returns an index into the keywords array, or -1 for no match
@@ -423,6 +423,23 @@ void mailline(char *line)
        }
 }
 
+static char *alert_mail_from = NULL;
+void mailfromline(char *line)
+{
+       char *w;
+
+       for (w=dl_next(line); w != line ; w=dl_next(w)) {
+               if (alert_mail_from == NULL)
+                       alert_mail_from = strdup(w);
+               else {
+                       char *t= NULL;
+                       asprintf(&t, "%s %s", alert_mail_from, w);
+                       free(alert_mail_from);
+                       alert_mail_from = t;
+               }
+       }
+}
+
 
 static char *alert_program = NULL;
 void programline(char *line)
@@ -493,6 +510,9 @@ void load_conffile(char *conffile)
                case 3: /* PROGRAM */
                        programline(line);
                        break;
+               case 4: /* MAILFROM */
+                       mailfromline(line);
+                       break;
                default:
                        fprintf(stderr, Name ": Unknown keyword %s\n", line);
                }
@@ -510,6 +530,12 @@ char *conf_get_mailaddr(char *conffile)
        return alert_email;
 }
 
+char *conf_get_mailfrom(char *conffile)
+{
+       load_conffile(conffile);
+       return alert_mail_from;
+}
+
 char *conf_get_program(char *conffile)
 {
        load_conffile(conffile);
index 91814650792cde5b6f40e6539a4ac476d40c7dd1..f96476c43924745dcbe82371b79c6fbf1ddc1f4f 100644 (file)
@@ -181,6 +181,20 @@ option).  There should only be one
 line and it should have only one address.
 
 
+.TP
+.B MAILFROM
+The
+.B mailfrom
+line (which can only be abbreviate at leat 5 characters) gives an
+address to appear in the "From" address for alert mails.  This can be
+useful if you want to explicitly set a domain, as the default from
+address is "root" with no domain.  All words on this line are
+catenated with spaces to form the address.
+
+Note that this value cannot be set via the
+.I mdadm
+commandline.  It is only settable via the config file.
+
 .TP
 .B PROGRAM
 The
diff --git a/mdadm.h b/mdadm.h
index 4ad4f9300ab0bd1d153e466e344d8fd0747d67cf..cd5b185adfd2d0187f4e6374a2d50f02daeb3261 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -370,6 +370,7 @@ extern int is_standard(char *dev, int *nump);
 extern mddev_ident_t conf_get_ident(char *conffile, char *dev);
 extern mddev_dev_t conf_get_devs(char *conffile);
 extern char *conf_get_mailaddr(char *conffile);
+extern char *conf_get_mailfrom(char *conffile);
 extern char *conf_get_program(char *conffile);
 extern char *conf_line(FILE *file);
 extern char *conf_word(FILE *file, int allow_key);