Blame SOURCES/0062-Mdmonitor-Split-alert-into-separate-functions.patch

2ad819
From 3698867194f27fdd7824b8bdd172d619a2c087cc Mon Sep 17 00:00:00 2001
2ad819
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
2ad819
Date: Wed, 7 Sep 2022 14:56:49 +0200
2ad819
Subject: [PATCH 62/83] Mdmonitor: Split alert() into separate functions
2ad819
2ad819
Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
2ad819
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
2ad819
---
2ad819
 Monitor.c | 186 ++++++++++++++++++++++++++++--------------------------
2ad819
 1 file changed, 95 insertions(+), 91 deletions(-)
2ad819
2ad819
diff --git a/Monitor.c b/Monitor.c
2ad819
index 7d7dc4d2..0036e8cd 100644
2ad819
--- a/Monitor.c
2ad819
+++ b/Monitor.c
2ad819
@@ -66,7 +66,7 @@ struct alert_info {
2ad819
 static int make_daemon(char *pidfile);
2ad819
 static int check_one_sharer(int scan);
2ad819
 static void write_autorebuild_pid(void);
2ad819
-static void alert(char *event, char *dev, char *disc, struct alert_info *info);
2ad819
+static void alert(const char *event, const char *dev, const char *disc, struct alert_info *info);
2ad819
 static int check_array(struct state *st, struct mdstat_ent *mdstat,
2ad819
 		       int test, struct alert_info *info,
2ad819
 		       int increments, char *prefer);
2ad819
@@ -407,111 +407,115 @@ static void write_autorebuild_pid()
2ad819
 	}
2ad819
 }
2ad819
 
2ad819
-static void alert(char *event, char *dev, char *disc, struct alert_info *info)
2ad819
+static void execute_alert_cmd(const char *event, const char *dev, const char *disc, struct alert_info *info)
2ad819
+{
2ad819
+	int pid = fork();
2ad819
+
2ad819
+	switch (pid) {
2ad819
+	default:
2ad819
+		waitpid(pid, NULL, 0);
2ad819
+		break;
2ad819
+	case -1:
2ad819
+		pr_err("Cannot fork to execute alert command");
2ad819
+		break;
2ad819
+	case 0:
2ad819
+		execl(info->alert_cmd, info->alert_cmd, event, dev, disc, NULL);
2ad819
+		exit(2);
2ad819
+	}
2ad819
+}
2ad819
+
2ad819
+static void send_event_email(const char *event, const char *dev, const char *disc, struct alert_info *info)
2ad819
+{
2ad819
+	FILE *mp, *mdstat;
2ad819
+	char hname[256];
2ad819
+	char buf[BUFSIZ];
2ad819
+	int n;
2ad819
+
2ad819
+	mp = popen(Sendmail, "w");
2ad819
+	if (!mp) {
2ad819
+		pr_err("Cannot open pipe stream for sendmail.\n");
2ad819
+		return;
2ad819
+	}
2ad819
+
2ad819
+	gethostname(hname, sizeof(hname));
2ad819
+	signal(SIGPIPE, SIG_IGN);
2ad819
+	if (info->mailfrom)
2ad819
+		fprintf(mp, "From: %s\n", info->mailfrom);
2ad819
+	else
2ad819
+		fprintf(mp, "From: %s monitoring <root>\n", Name);
2ad819
+	fprintf(mp, "To: %s\n", info->mailaddr);
2ad819
+	fprintf(mp, "Subject: %s event on %s:%s\n\n", event, dev, hname);
2ad819
+	fprintf(mp, "This is an automatically generated mail message. \n");
2ad819
+	fprintf(mp, "A %s event had been detected on md device %s.\n\n", event, dev);
2ad819
+
2ad819
+	if (disc && disc[0] != ' ')
2ad819
+		fprintf(mp,
2ad819
+			"It could be related to component device %s.\n\n", disc);
2ad819
+	if (disc && disc[0] == ' ')
2ad819
+		fprintf(mp, "Extra information:%s.\n\n", disc);
2ad819
+
2ad819
+	mdstat = fopen("/proc/mdstat", "r");
2ad819
+	if (!mdstat) {
2ad819
+		pr_err("Cannot open /proc/mdstat\n");
2ad819
+		pclose(mp);
2ad819
+		return;
2ad819
+	}
2ad819
+
2ad819
+	fprintf(mp, "The /proc/mdstat file currently contains the following:\n\n");
2ad819
+	while ((n = fread(buf, 1, sizeof(buf), mdstat)) > 0)
2ad819
+		n = fwrite(buf, 1, n, mp);
2ad819
+	fclose(mdstat);
2ad819
+	pclose(mp);
2ad819
+}
2ad819
+
2ad819
+static void log_event_to_syslog(const char *event, const char *dev, const char *disc)
2ad819
 {
2ad819
 	int priority;
2ad819
+	/* Log at a different severity depending on the event.
2ad819
+	 *
2ad819
+	 * These are the critical events:  */
2ad819
+	if (strncmp(event, "Fail", 4) == 0 ||
2ad819
+		strncmp(event, "Degrade", 7) == 0 ||
2ad819
+		strncmp(event, "DeviceDisappeared", 17) == 0)
2ad819
+		priority = LOG_CRIT;
2ad819
+	/* Good to know about, but are not failures: */
2ad819
+	else if (strncmp(event, "Rebuild", 7) == 0 ||
2ad819
+			strncmp(event, "MoveSpare", 9) == 0 ||
2ad819
+			strncmp(event, "Spares", 6) != 0)
2ad819
+		priority = LOG_WARNING;
2ad819
+	/* Everything else: */
2ad819
+	else
2ad819
+		priority = LOG_INFO;
2ad819
 
2ad819
+	if (disc && disc[0] != ' ')
2ad819
+		syslog(priority,
2ad819
+			"%s event detected on md device %s, component device %s", event, dev, disc);
2ad819
+	else if (disc)
2ad819
+		syslog(priority, "%s event detected on md device %s: %s", event, dev, disc);
2ad819
+	else
2ad819
+		syslog(priority, "%s event detected on md device %s", event, dev);
2ad819
+}
2ad819
+
2ad819
+static void alert(const char *event, const char *dev, const char *disc, struct alert_info *info)
2ad819
+{
2ad819
 	if (!info->alert_cmd && !info->mailaddr && !info->dosyslog) {
2ad819
 		time_t now = time(0);
2ad819
 
2ad819
 		printf("%1.15s: %s on %s %s\n", ctime(&now) + 4,
2ad819
 		       event, dev, disc?disc:"unknown device");
2ad819
 	}
2ad819
-	if (info->alert_cmd) {
2ad819
-		int pid = fork();
2ad819
-		switch(pid) {
2ad819
-		default:
2ad819
-			waitpid(pid, NULL, 0);
2ad819
-			break;
2ad819
-		case -1:
2ad819
-			break;
2ad819
-		case 0:
2ad819
-			execl(info->alert_cmd, info->alert_cmd,
2ad819
-			      event, dev, disc, NULL);
2ad819
-			exit(2);
2ad819
-		}
2ad819
-	}
2ad819
+	if (info->alert_cmd)
2ad819
+		execute_alert_cmd(event, dev, disc, info);
2ad819
+
2ad819
 	if (info->mailaddr && (strncmp(event, "Fail", 4) == 0 ||
2ad819
 			       strncmp(event, "Test", 4) == 0 ||
2ad819
 			       strncmp(event, "Spares", 6) == 0 ||
2ad819
 			       strncmp(event, "Degrade", 7) == 0)) {
2ad819
-		FILE *mp = popen(Sendmail, "w");
2ad819
-		if (mp) {
2ad819
-			FILE *mdstat;
2ad819
-			char hname[256];
2ad819
-
2ad819
-			gethostname(hname, sizeof(hname));
2ad819
-			signal_s(SIGPIPE, SIG_IGN);
2ad819
-
2ad819
-			if (info->mailfrom)
2ad819
-				fprintf(mp, "From: %s\n", info->mailfrom);
2ad819
-			else
2ad819
-				fprintf(mp, "From: %s monitoring <root>\n",
2ad819
-					Name);
2ad819
-			fprintf(mp, "To: %s\n", info->mailaddr);
2ad819
-			fprintf(mp, "Subject: %s event on %s:%s\n\n",
2ad819
-				event, dev, hname);
2ad819
-
2ad819
-			fprintf(mp,
2ad819
-				"This is an automatically generated mail message from %s\n", Name);
2ad819
-			fprintf(mp, "running on %s\n\n", hname);
2ad819
-
2ad819
-			fprintf(mp,
2ad819
-				"A %s event had been detected on md device %s.\n\n", event, dev);
2ad819
-
2ad819
-			if (disc && disc[0] != ' ')
2ad819
-				fprintf(mp,
2ad819
-					"It could be related to component device %s.\n\n", disc);
2ad819
-			if (disc && disc[0] == ' ')
2ad819
-				fprintf(mp, "Extra information:%s.\n\n", disc);
2ad819
-
2ad819
-			fprintf(mp, "Faithfully yours, etc.\n");
2ad819
-
2ad819
-			mdstat = fopen("/proc/mdstat", "r");
2ad819
-			if (mdstat) {
2ad819
-				char buf[8192];
2ad819
-				int n;
2ad819
-				fprintf(mp,
2ad819
-					"\nP.S. The /proc/mdstat file currently contains the following:\n\n");
2ad819
-				while ((n = fread(buf, 1, sizeof(buf),
2ad819
-						  mdstat)) > 0)
2ad819
-					n = fwrite(buf, 1, n, mp);
2ad819
-				fclose(mdstat);
2ad819
-			}
2ad819
-			pclose(mp);
2ad819
-		}
2ad819
+		send_event_email(event, dev, disc, info);
2ad819
 	}
2ad819
 
2ad819
-	/* log the event to syslog maybe */
2ad819
-	if (info->dosyslog) {
2ad819
-		/* Log at a different severity depending on the event.
2ad819
-		 *
2ad819
-		 * These are the critical events:  */
2ad819
-		if (strncmp(event, "Fail", 4) == 0 ||
2ad819
-		    strncmp(event, "Degrade", 7) == 0 ||
2ad819
-		    strncmp(event, "DeviceDisappeared", 17) == 0)
2ad819
-			priority = LOG_CRIT;
2ad819
-		/* Good to know about, but are not failures: */
2ad819
-		else if (strncmp(event, "Rebuild", 7) == 0 ||
2ad819
-			 strncmp(event, "MoveSpare", 9) == 0 ||
2ad819
-			 strncmp(event, "Spares", 6) != 0)
2ad819
-			priority = LOG_WARNING;
2ad819
-		/* Everything else: */
2ad819
-		else
2ad819
-			priority = LOG_INFO;
2ad819
-
2ad819
-		if (disc && disc[0] != ' ')
2ad819
-			syslog(priority,
2ad819
-			       "%s event detected on md device %s, component device %s", event, dev, disc);
2ad819
-		else if (disc)
2ad819
-			syslog(priority,
2ad819
-			       "%s event detected on md device %s: %s",
2ad819
-			       event, dev, disc);
2ad819
-		else
2ad819
-			syslog(priority,
2ad819
-			       "%s event detected on md device %s",
2ad819
-			       event, dev);
2ad819
-	}
2ad819
+	if (info->dosyslog)
2ad819
+		log_event_to_syslog(event, dev, disc);
2ad819
 }
2ad819
 
2ad819
 static int check_array(struct state *st, struct mdstat_ent *mdstat,
2ad819
-- 
2ad819
2.38.1
2ad819