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

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