Hi Neil, While adding the text message mode, I saw a FIXME asking for syslog support in monitor mode. This patch adds exactly that. -- Ross Vandegrift ross@xxxxxxxxxxxx "The good Christian should beware of mathematicians, and all those who make empty prophecies. The danger already exists that the mathematicians have made a covenant with the devil to darken the spirit and to confine man in the bonds of Hell." --St. Augustine, De Genesi ad Litteram, Book II, xviii, 37 diff -ur mdadm-2.0-ross/Monitor.c mdadm-2.0-syslog/Monitor.c --- mdadm-2.0-ross/Monitor.c 2005-11-12 17:49:53.000000000 -0500 +++ mdadm-2.0-syslog/Monitor.c 2005-11-14 01:47:52.000000000 -0500 @@ -33,9 +33,10 @@ #include <sys/wait.h> #include <sys/signal.h> #include <values.h> +#include <syslog.h> static void alert(char *event, char *dev, char *disc, char *mailaddr, char *cmd, - int textmsg); + int textmsg, int dosyslog); static char *percentalerts[] = { "RebuildStarted", @@ -48,7 +49,7 @@ int Monitor(mddev_dev_t devlist, char *mailaddr, char *alert_cmd, int period, int daemonise, int scan, int oneshot, int textmsg, - char *config, int test, char* pidfile) + int dosyslog, char *config, int test, char* pidfile) { /* * Every few seconds, scan every md device looking for changes @@ -214,12 +215,12 @@ if (test) alert("TestMessage", dev, NULL, mailaddr, - alert_cmd, textmsg); + alert_cmd, textmsg, dosyslog); fd = open(dev, O_RDONLY); if (fd < 0) { if (!st->err) alert("DeviceDisappeared", dev, NULL, - mailaddr, alert_cmd, textmsg); + mailaddr, alert_cmd, textmsg, dosyslog); /* fprintf(stderr, Name ": cannot open %s: %s\n", dev, strerror(errno)); */ st->err=1; @@ -228,7 +229,7 @@ if (ioctl(fd, GET_ARRAY_INFO, &array)<0) { if (!st->err) alert("DeviceDisappeared", dev, NULL, - mailaddr, alert_cmd, textmsg); + mailaddr, alert_cmd, textmsg, dosyslog); /* fprintf(stderr, Name ": cannot get array info for %s: %s\n", dev, strerror(errno)); */ st->err=1; @@ -239,7 +240,7 @@ array.level != 6 && array.level != 10) { if (!st->err) alert("DeviceDisappeared", dev, "Wrong-Level", - mailaddr, alert_cmd, textmsg); + mailaddr, alert_cmd, textmsg, dosyslog); st->err = 1; close(fd); continue; @@ -277,30 +278,30 @@ mse->pattern && strchr(mse->pattern, '_') /* degraded */ ) alert("DegradedArray", dev, NULL, mailaddr, - alert_cmd, textmsg); + alert_cmd, textmsg, dosyslog); if (st->utime == 0 && /* new array */ st->expected_spares > 0 && array.spare_disks < st->expected_spares) alert("SparesMissing", dev, NULL, mailaddr, - alert_cmd, textmsg); + alert_cmd, textmsg, dosyslog); if (mse && st->percent == -1 && mse->percent >= 0) alert("RebuildStarted", dev, NULL, mailaddr, - alert_cmd, textmsg); + alert_cmd, textmsg, 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, textmsg); + dev, NULL, mailaddr, alert_cmd, textmsg, dosyslog); if (mse && mse->percent == -1 && st->percent >= 0) alert("RebuildFinished", dev, NULL, mailaddr, - alert_cmd, textmsg); + alert_cmd, textmsg, dosyslog); if (mse) st->percent = mse->percent; @@ -326,19 +327,19 @@ ((st->devstate[i]&change)&(1<<MD_DISK_ACTIVE)) || ((st->devstate[i]&change)&(1<<MD_DISK_SYNC))) ) - alert("Fail", dev, dv, mailaddr, alert_cmd, textmsg); + alert("Fail", dev, dv, mailaddr, alert_cmd, textmsg, 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, textmsg); + alert("FailSpare", dev, dv, mailaddr, alert_cmd, textmsg, 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, textmsg); + alert("SpareActive", dev, dv, mailaddr, alert_cmd, textmsg, dosyslog); } st->devstate[i] = disc.state; st->devid[i] = makedev(disc.major, disc.minor); @@ -385,7 +386,7 @@ st->expected_spares = -1; statelist = st; alert("NewArray", st->devname, NULL, - mailaddr, alert_cmd, textmsg); + mailaddr, alert_cmd, textmsg, dosyslog); new_found = 1; } } @@ -426,7 +427,7 @@ (unsigned long)dev) == 0) { if (ioctl(fd1, HOT_ADD_DISK, (unsigned long)dev) == 0) { - alert("MoveSpare", st->devname, st2->devname, mailaddr, alert_cmd, textmsg); + alert("MoveSpare", st->devname, st2->devname, mailaddr, alert_cmd, textmsg, dosyslog); close(fd1); close(fd2); break; @@ -453,8 +454,10 @@ static void alert(char *event, char *dev, char *disc, char *mailaddr, char *cmd, - int textmsg) + int textmsg, int dosyslog) { + int priority; + if (!cmd && !mailaddr) { time_t now = time(0); @@ -507,5 +510,27 @@ } } - /* FIXME log the event to syslog maybe */ + + /* log the event to syslog maybe */ + if (dosyslog) { + /* Log at a different severity depending on the event. + * + * These are the critical events: */ + if (strncmp(event, "Fail", 4)==0 || + strncmp(event, "Degrade", 7)==0 || + strncmp(event, "DeviceDisappeared", 17)==0) + priority = LOG_CRIT; + /* Good to know about, but are not failures: */ + else if (strncmp(event, "Rebuild", 7)==0 || + strncmp(event, "MoveSpare", 9)==0) + priority = LOG_WARNING; + /* Everything else: */ + else + priority = LOG_INFO; + + if (disc) + syslog(priority, "%s event detected on md device %s, component device %s", event, dev, disc); + else + syslog(priority, "%s event detected on md device %s", event, dev); + } } Only in mdadm-2.0-syslog/: Monitor.c~ diff -ur mdadm-2.0-ross/ReadMe.c mdadm-2.0-syslog/ReadMe.c --- mdadm-2.0-ross/ReadMe.c 2005-11-12 17:51:49.000000000 -0500 +++ mdadm-2.0-syslog/ReadMe.c 2005-11-14 01:47:14.000000000 -0500 @@ -91,7 +91,7 @@ * At the time if writing, there is only minimal support. */ -char short_options[]="-ABCDEFGQhVXvqb::c:i:l:p:m:n:x:u:c:d:z:U:sa::rfRSow1tTe:"; +char short_options[]="-ABCDEFGQhVXvqb::c:i:l:p:m:n:x:u:c:d:z:U:sa::rfRSow1tTye:"; struct option long_options[] = { {"manage", 0, 0, '@'}, {"misc", 0, 0, '#'}, @@ -170,6 +170,7 @@ {"oneshot", 0, 0, '1'}, {"pid-file", 1, 0, 'i'}, {"textmsg", 0, 0, 'T'}, + {"syslog", 0, 0, 'y'}, {0, 0, 0, 0} }; @@ -455,6 +456,7 @@ " --oneshot -1 : Check for degraded arrays, then exit\n" " --test -t : Generate a TestMessage event against each array at startup\n" " --textmsg -T : Keep emails terse, for text messaging mobile devices\n" +" --syslog -y : Log all events to syslog\n" ; char Help_grow[] = diff -ur mdadm-2.0-ross/mdadm.c mdadm-2.0-syslog/mdadm.c --- mdadm-2.0-ross/mdadm.c 2005-11-12 17:31:42.000000000 -0500 +++ mdadm-2.0-syslog/mdadm.c 2005-11-14 01:45:11.000000000 -0500 @@ -94,6 +94,7 @@ int writemostly = 0; int re_add = 0; int textmsg = 0; + int dosyslog = 0; int copies; @@ -668,6 +669,10 @@ case O(MONITOR,'T'): /* text message mode for mobile devices */ textmsg = 1; continue; + case O(MONITOR,'y'): /* log messages to syslog */ + openlog("mdadm", 0, SYSLOG_FACILITY); + dosyslog = 1; + continue; /* now the general management options. Some are applicable * to other modes. None have arguments. @@ -1109,7 +1114,7 @@ } rv= Monitor(devlist, mailaddr, program, delay?delay:60, daemonise, scan, oneshot, textmsg, - configfile, test, pidfile); + dosyslog, configfile, test, pidfile); break; case GROW: diff -ur mdadm-2.0-ross/mdadm.h mdadm-2.0-syslog/mdadm.h --- mdadm-2.0-ross/mdadm.h 2005-11-12 17:31:25.000000000 -0500 +++ mdadm-2.0-syslog/mdadm.h 2005-11-12 18:54:03.000000000 -0500 @@ -43,6 +43,7 @@ #include <stdio.h> #include <errno.h> #include <string.h> +#include <syslog.h> #ifdef __dietlibc__NONO int strncmp(const char *s1, const char *s2, size_t n) __THROW __pure__; char *strncpy(char *dest, const char *src, size_t n) __THROW; @@ -166,6 +167,8 @@ #define Sendmail "/usr/lib/sendmail -t" #endif +#define SYSLOG_FACILITY LOG_DAEMON + extern char *map_num(mapping_t *map, int num); extern int map_name(mapping_t *map, char *name); extern mapping_t r5layout[], pers[], modes[], faultylayout[]; @@ -258,7 +261,7 @@ extern int Monitor(mddev_dev_t devlist, char *mailaddr, char *alert_cmd, int period, int daemonise, int scan, int oneshot, int textmsg, - char *config, int test, char *pidfile); + int dosyslog, char *config, int test, char *pidfile); extern int Kill(char *dev, int force); - To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html