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

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