Re: [PATCH v3 2/8] Mdmonitor: Pass events to alert() using enums instead of strings

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Feb 02, 2023 at 12:27:00PM +0100, Mateusz Grzonka wrote:
> Add events enum, and mapping_t struct, that maps them to strings, so
> that enums are passed around instead of strings.
> 
> Signed-off-by: Mateusz Grzonka <mateusz.grzonka@xxxxxxxxx>

Acked-by: Coly Li <colyli@xxxxxxx>

> ---
> Monitor.c | 136 +++++++++++++++++++++++++++++++++---------------------
> 1 file changed, 83 insertions(+), 53 deletions(-)
> 
> diff --git a/Monitor.c b/Monitor.c
> index 9ef4dab8..029e9efd 100644
> --- a/Monitor.c
> +++ b/Monitor.c
> @@ -32,6 +32,8 @@
> #include	<libudev.h>
> #endif
> 
> +#define EVENT_NAME_MAX 32
> +
> struct state {
> 	char devname[MD_NAME_MAX + sizeof("/dev/md/")];	/* length of "/dev/md/" + device name + terminating byte*/
> 	char devnm[MD_NAME_MAX];	/* to sync with mdstat info */
> @@ -65,10 +67,43 @@ struct alert_info {
> 	int dosyslog;
> 	int test;
> } info;
> +
> +enum event {
> +	EVENT_SPARE_ACTIVE = 0,
> +	EVENT_NEW_ARRAY,
> +	EVENT_MOVE_SPARE,
> +	EVENT_TEST_MESSAGE,
> +	EVENT_REBUILD_STARTED,
> +	EVENT_REBUILD,
> +	EVENT_REBUILD_FINISHED,
> +	EVENT_SPARES_MISSING,
> +	EVENT_DEVICE_DISAPPEARED,
> +	EVENT_FAIL,
> +	EVENT_FAIL_SPARE,
> +	EVENT_DEGRADED_ARRAY,
> +	EVENT_UNKNOWN
> +};
> +
> +mapping_t events_map[] = {
> +	{"SpareActive", EVENT_SPARE_ACTIVE},
> +	{"NewArray", EVENT_NEW_ARRAY},
> +	{"MoveSpare", EVENT_MOVE_SPARE},
> +	{"TestMessage", EVENT_TEST_MESSAGE},
> +	{"RebuildStarted", EVENT_REBUILD_STARTED},
> +	{"Rebuild", EVENT_REBUILD},
> +	{"RebuildFinished", EVENT_REBUILD_FINISHED},
> +	{"SparesMissing", EVENT_SPARES_MISSING},
> +	{"DeviceDisappeared", EVENT_DEVICE_DISAPPEARED},
> +	{"Fail", EVENT_FAIL},
> +	{"FailSpare", EVENT_FAIL_SPARE},
> +	{"DegradedArray", EVENT_DEGRADED_ARRAY},
> +	{NULL, EVENT_UNKNOWN}
> +};
> +
> static int make_daemon(char *pidfile);
> static int check_one_sharer(int scan);
> static void write_autorebuild_pid(void);
> -static void alert(const char *event, const char *dev, const char *disc);
> +static void alert(const enum event event_enum, const unsigned int progress, const char *dev, const char *disc);
> static int check_array(struct state *st, struct mdstat_ent *mdstat, int increments, char *prefer);
> static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist);
> static void try_spare_migration(struct state *statelist);
> @@ -415,7 +450,7 @@ static void write_autorebuild_pid()
> 	}
> }
> 
> -static void execute_alert_cmd(const char *event, const char *dev, const char *disc)
> +static void execute_alert_cmd(const char *event_name, const char *dev, const char *disc)
> {
> 	int pid = fork();
> 
> @@ -427,12 +462,12 @@ static void execute_alert_cmd(const char *event, const char *dev, const char *di
> 		pr_err("Cannot fork to execute alert command");
> 		break;
> 	case 0:
> -		execl(info.alert_cmd, info.alert_cmd, event, dev, disc, NULL);
> +		execl(info.alert_cmd, info.alert_cmd, event_name, dev, disc, NULL);
> 		exit(2);
> 	}
> }
> 
> -static void send_event_email(const char *event, const char *dev, const char *disc)
> +static void send_event_email(const char *event_name, const char *dev, const char *disc)
> {
> 	FILE *mp, *mdstat;
> 	char buf[BUFSIZ];
> @@ -450,9 +485,9 @@ static void send_event_email(const char *event, const char *dev, const char *dis
> 	else
> 		fprintf(mp, "From: %s monitoring <root>\n", Name);
> 	fprintf(mp, "To: %s\n", info.mailaddr);
> -	fprintf(mp, "Subject: %s event on %s:%s\n\n", event, dev, info.hostname);
> +	fprintf(mp, "Subject: %s event on %s:%s\n\n", event_name, dev, info.hostname);
> 	fprintf(mp, "This is an automatically generated mail message. \n");
> -	fprintf(mp, "A %s event had been detected on md device %s.\n\n", event, dev);
> +	fprintf(mp, "A %s event had been detected on md device %s.\n\n", event_name, dev);
> 
> 	if (disc && disc[0] != ' ')
> 		fprintf(mp,
> @@ -474,20 +509,20 @@ static void send_event_email(const char *event, const char *dev, const char *dis
> 	pclose(mp);
> }
> 
> -static void log_event_to_syslog(const char *event, const char *dev, const char *disc)
> +static void log_event_to_syslog(const enum event event_enum, const char *event_name, const char *dev, const char *disc)
> {
> 	int priority;
> 	/* 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)
> +	if (event_enum == EVENT_FAIL ||
> +	    event_enum == EVENT_DEGRADED_ARRAY ||
> +	    event_enum == EVENT_DEVICE_DISAPPEARED)
> 		priority = LOG_CRIT;
> 	/* Good to know about, but are not failures: */
> -	else if (strncmp(event, "Rebuild", 7) == 0 ||
> -			strncmp(event, "MoveSpare", 9) == 0 ||
> -			strncmp(event, "Spares", 6) != 0)
> +	else if (event_enum == EVENT_REBUILD ||
> +		 event_enum == EVENT_MOVE_SPARE ||
> +		 event_enum == EVENT_SPARES_MISSING)
> 		priority = LOG_WARNING;
> 	/* Everything else: */
> 	else
> @@ -495,33 +530,37 @@ static void log_event_to_syslog(const char *event, const char *dev, const char *
> 
> 	if (disc && disc[0] != ' ')
> 		syslog(priority,
> -			"%s event detected on md device %s, component device %s", event, dev, disc);
> +		       "%s event detected on md device %s, component device %s",
> +		       event_name, dev, disc);
> 	else if (disc)
> -		syslog(priority, "%s event detected on md device %s: %s", event, dev, disc);
> +		syslog(priority, "%s event detected on md device %s: %s", event_name, dev, disc);
> 	else
> -		syslog(priority, "%s event detected on md device %s", event, dev);
> +		syslog(priority, "%s event detected on md device %s", event_name, dev);
> }
> 
> -static void alert(const char *event, const char *dev, const char *disc)
> +static void alert(const enum event event_enum, const unsigned int progress, const char *dev, const char *disc)
> {
> -	if (!info.alert_cmd && !info.mailaddr && !info.dosyslog) {
> -		time_t now = time(0);
> +	char event_name[EVENT_NAME_MAX];
> 
> -		printf("%1.15s: %s on %s %s\n", ctime(&now) + 4,
> -		       event, dev, disc?disc:"unknown device");
> +	if (event_enum == EVENT_REBUILD) {
> +		snprintf(event_name, sizeof(event_name), "%s%02d",
> +			 map_num_s(events_map, EVENT_REBUILD), progress);
> +	} else {
> +		snprintf(event_name, sizeof(event_name), "%s", map_num_s(events_map, event_enum));
> 	}
> +
> 	if (info.alert_cmd)
> -		execute_alert_cmd(event, dev, disc);
> +		execute_alert_cmd(event_name, dev, disc);
> 
> -	if (info.mailaddr && (strncmp(event, "Fail", 4) == 0 ||
> -			       strncmp(event, "Test", 4) == 0 ||
> -			       strncmp(event, "Spares", 6) == 0 ||
> -			       strncmp(event, "Degrade", 7) == 0)) {
> -		send_event_email(event, dev, disc);
> +	if (info.mailaddr && (event_enum == EVENT_FAIL ||
> +			      event_enum == EVENT_TEST_MESSAGE ||
> +			      event_enum == EVENT_SPARES_MISSING ||
> +			      event_enum == EVENT_DEGRADED_ARRAY)) {
> +		send_event_email(event_name, dev, disc);
> 	}
> 
> 	if (info.dosyslog)
> -		log_event_to_syslog(event, dev, disc);
> +		log_event_to_syslog(event_enum, event_name, dev, disc);
> }
> 
> static int check_array(struct state *st, struct mdstat_ent *mdstat,
> @@ -546,7 +585,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
> 	unsigned long redundancy_only_flags = 0;
> 
> 	if (info.test)
> -		alert("TestMessage", dev, NULL);
> +		alert(EVENT_TEST_MESSAGE, 0, dev, NULL);
> 
> 	retval = 0;
> 
> @@ -595,7 +634,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
> 	 */
> 	if (sra->array.level == 0 || sra->array.level == -1) {
> 		if (!st->err && !st->from_config)
> -			alert("DeviceDisappeared", dev, " Wrong-Level");
> +			alert(EVENT_DEVICE_DISAPPEARED, 0, dev, " Wrong-Level");
> 		st->err++;
> 		goto out;
> 	}
> @@ -612,7 +651,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
> 		st->percent = RESYNC_NONE;
> 		new_array = 1;
> 		if (!is_container)
> -			alert("NewArray", st->devname, NULL);
> +			alert(EVENT_NEW_ARRAY, 0, st->devname, NULL);
> 	}
> 
> 	if (st->utime == array.utime && st->failed == sra->array.failed_disks &&
> @@ -625,29 +664,20 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
> 	}
> 	if (st->utime == 0 && /* new array */
> 	    mse->pattern && strchr(mse->pattern, '_') /* degraded */)
> -		alert("DegradedArray", dev, NULL);
> +		alert(EVENT_DEGRADED_ARRAY, 0, dev, NULL);
> 
> 	if (st->utime == 0 && /* new array */ st->expected_spares > 0 &&
> 	    sra->array.spare_disks < st->expected_spares)
> -		alert("SparesMissing", dev, NULL);
> +		alert(EVENT_SPARES_MISSING, 0, dev, NULL);
> 	if (st->percent < 0 && st->percent != RESYNC_UNKNOWN &&
> 	    mse->percent >= 0)
> -		alert("RebuildStarted", dev, NULL);
> +		alert(EVENT_REBUILD_STARTED, 0, dev, NULL);
> 	if (st->percent >= 0 && mse->percent >= 0 &&
> 	    (mse->percent / increments) > (st->percent / increments)) {
> -		char percentalert[18];
> -		/*
> -		 * "RebuildNN" (10 chars) or "RebuildStarted" (15 chars)
> -		 */
> -
> 		if((mse->percent / increments) == 0)
> -			snprintf(percentalert, sizeof(percentalert),
> -				 "RebuildStarted");
> +			alert(EVENT_REBUILD_STARTED, 0, dev, NULL);
> 		else
> -			snprintf(percentalert, sizeof(percentalert),
> -				 "Rebuild%02d", mse->percent);
> -
> -		alert(percentalert, dev, NULL);
> +			alert(EVENT_REBUILD, mse->percent, dev, NULL);
> 	}
> 
> 	if (mse->percent == RESYNC_NONE && st->percent >= 0) {
> @@ -660,9 +690,9 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
> 			snprintf(cnt, sizeof(cnt),
> 				 " mismatches found: %d (on raid level %d)",
> 				 sra->mismatch_cnt, sra->array.level);
> -			alert("RebuildFinished", dev, cnt);
> +			alert(EVENT_REBUILD_FINISHED, 0, dev, cnt);
> 		} else
> -			alert("RebuildFinished", dev, NULL);
> +			alert(EVENT_REBUILD_FINISHED, 0, dev, NULL);
> 	}
> 	st->percent = mse->percent;
> 
> @@ -716,14 +746,14 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
> 		change = newstate ^ st->devstate[i];
> 		if (st->utime && change && !st->err && !new_array) {
> 			if ((st->devstate[i]&change) & (1 << MD_DISK_SYNC))
> -				alert("Fail", dev, dv);
> +				alert(EVENT_FAIL, 0, dev, dv);
> 			else if ((newstate & (1 << MD_DISK_FAULTY)) &&
> 				 (disc.major || disc.minor) &&
> 				 st->devid[i] == makedev(disc.major,
> 							 disc.minor))
> -				alert("FailSpare", dev, dv);
> +				alert(EVENT_FAIL_SPARE, 0, dev, dv);
> 			else if ((newstate&change) & (1 << MD_DISK_SYNC))
> -				alert("SpareActive", dev, dv);
> +				alert(EVENT_SPARE_ACTIVE, 0, dev, dv);
> 		}
> 		st->devstate[i] = newstate;
> 		st->devid[i] = makedev(disc.major, disc.minor);
> @@ -747,7 +777,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
> 
>  disappeared:
> 	if (!st->err && !is_container)
> -		alert("DeviceDisappeared", dev, NULL);
> +		alert(EVENT_DEVICE_DISAPPEARED, 0, dev, NULL);
> 	st->err++;
> 	goto out;
> }
> @@ -806,7 +836,7 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist)
> 				st->parent_devnm[0] = 0;
> 			*statelist = st;
> 			if (info.test)
> -				alert("TestMessage", st->devname, NULL);
> +				alert(EVENT_TEST_MESSAGE, 0, st->devname, NULL);
> 			new_found = 1;
> 		}
> 	return new_found;
> @@ -1029,7 +1059,7 @@ static void try_spare_migration(struct state *statelist)
> 				if (devid > 0 &&
> 				    move_spare(from->devname, to->devname,
> 					       devid)) {
> -					alert("MoveSpare", to->devname, from->devname);
> +					alert(EVENT_MOVE_SPARE, 0, to->devname, from->devname);
> 					break;
> 				}
> 			}
> -- 
> 2.26.2
> 

-- 
Coly Li




[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux