summaryrefslogtreecommitdiffstats
path: root/exim_monitor/em_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'exim_monitor/em_init.c')
-rw-r--r--exim_monitor/em_init.c238
1 files changed, 238 insertions, 0 deletions
diff --git a/exim_monitor/em_init.c b/exim_monitor/em_init.c
new file mode 100644
index 0000000..e0bc3b0
--- /dev/null
+++ b/exim_monitor/em_init.c
@@ -0,0 +1,238 @@
+/*************************************************
+* Exim monitor *
+*************************************************/
+
+/* Copyright (c) University of Cambridge 1995 - 2009 */
+/* Copyright (c) The Exim Maintainers 2020 - 2021 */
+/* See the file NOTICE for conditions of use and distribution. */
+
+/* This module contains code to initialize things from the
+environment and the arguments. */
+
+
+#include "em_hdr.h"
+
+
+
+/*************************************************
+* Decode stripchart config *
+*************************************************/
+
+/* First determine how many are requested, then compile the
+regular expressions and save the title strings. Note that
+stripchart_number is initialized to 1 or 2 to count the always-
+present queue stripchart, and the optional size-monitoring
+stripchart. */
+
+static void decode_stripchart_config(uschar *s)
+{
+int i;
+
+/* Loop: first time just counts, second time does the
+work. */
+
+for (i = 0; i <= 1; i++)
+ {
+ int first = 1;
+ int count = 0;
+ uschar *p = s;
+
+ if (*p == '/') p++; /* allow optional / at start */
+
+ /* This loops for all the substrings, using the first flag
+ to determine whether each is the first or second of the pairs. */
+
+ while (*p)
+ {
+ uschar *pp;
+ /* Handle continuations */
+ if (*p == '\n')
+ {
+ while (*(++p) == ' ' || *p == '\t');
+ if (*p == '/') p++;
+ }
+
+ /* Find the end of the string and count if first string */
+
+ pp = p;
+ while (*p && *p != '/') p++;
+ if (first) count++;
+
+ /* Take action on the second time round. */
+
+ if (i != 0)
+ {
+ uschar buffer[256];
+ int indx = count + stripchart_varstart - 1;
+ Ustrncpy(buffer, pp, p-pp);
+ buffer[p-pp] = 0;
+ if (first)
+ {
+ size_t offset;
+ int err;
+
+ if (!(stripchart_regex[indx] =
+ pcre2_compile((PCRE2_SPTR)buffer,
+ PCRE2_ZERO_TERMINATED, PCRE_COPT,
+ &err, &offset, NULL)))
+ {
+ uschar errbuf[128];
+ pcre2_get_error_message(err, errbuf, sizeof(errbuf));
+ printf("regular expression error: %s at offset %ld "
+ "while compiling %s\n", errbuf, (long)offset, buffer);
+ exit(99);
+ }
+ }
+ else stripchart_title[indx] = string_copy(buffer);
+ }
+
+ /* Advance past the delimiter and flip the first/second flag */
+
+ p++;
+ first = !first;
+ }
+
+ /* On the first pass, we now know the number of stripcharts. Get
+ store for holding the pointers to the regular expressions and
+ title strings. */
+
+ if (i == 0)
+ {
+ stripchart_number += count;
+ stripchart_regex = (pcre2_code **)store_malloc(stripchart_number * sizeof(pcre2_code *));
+ stripchart_title = (uschar **)store_malloc(stripchart_number * sizeof(uschar *));
+ }
+ }
+}
+
+
+/*************************************************
+* Initialize *
+*************************************************/
+
+void init(int argc, uschar **argv)
+{
+int x;
+size_t erroroffset;
+uschar *s;
+
+argc = argc; /* These are currently unused. */
+argv = argv;
+
+/* Deal with simple values in the environment. */
+
+if ((s = US getenv("ACTION_OUTPUT")))
+ {
+ if (Ustrcmp(s, "no") == 0) action_output = FALSE;
+ if (Ustrcmp(s, "yes") == 0) action_output = TRUE;
+ }
+
+if ((s = US getenv("ACTION_QUEUE_UPDATE")))
+ {
+ if (Ustrcmp(s, "no") == 0) action_queue_update = FALSE;
+ if (Ustrcmp(s, "yes") == 0) action_queue_update = TRUE;
+ }
+
+s = US getenv("BODY_MAX");
+if (s && (x = Uatoi(s)) != 0) body_max = x;
+
+if ((s = US getenv("EXIM_PATH")))
+ exim_path = string_copy(s);
+
+if ((s = US getenv("EXIMON_EXIM_CONFIG")))
+ alternate_config = string_copy(s);
+
+if ((s = US getenv("LOG_BUFFER")))
+ {
+ uschar c[1];
+ if (sscanf(CS s, "%d%c", &x, c) > 0)
+ {
+ if (c[0] == 'K' || c[0] == 'k') x *= 1024;
+ if (x < 1024) x = 1024;
+ log_buffer_size = x;
+ }
+ }
+
+s = US getenv("LOG_DEPTH");
+if (s && (x = Uatoi(s)) != 0) log_depth = x;
+
+if ((s = US getenv("LOG_FILE_NAME")))
+ log_file = string_copy(s);
+
+if ((s = US getenv("LOG_FONT")))
+ log_font = string_copy(s);
+
+s = US getenv("LOG_WIDTH");
+if (s && (x = Uatoi(s)) != 0) log_width = x;
+
+if ((s = US getenv("MENU_EVENT")))
+ menu_event = string_copy(s);
+
+s = US getenv("MIN_HEIGHT");
+if (s && (x = Uatoi(s)) > 0) min_height = x;
+
+s = US getenv("MIN_WIDTH");
+if (s && (x = Uatoi(s)) > 0) min_width = x;
+
+if ((s = US getenv("QUALIFY_DOMAIN")))
+ qualify_domain = string_copy(s);
+else
+ qualify_domain = US""; /* Don't want NULL */
+
+s = US getenv("QUEUE_DEPTH");
+if (s && (x = Uatoi(s)) != 0) queue_depth = x;
+
+if ((s = US getenv("QUEUE_FONT")))
+ queue_font = string_copy(s);
+
+s = US getenv("QUEUE_INTERVAL");
+if (s && (x = Uatoi(s)) != 0) queue_update = x;
+
+s = US getenv("QUEUE_MAX_ADDRESSES");
+if (s && (x = Uatoi(s)) != 0) queue_max_addresses = x;
+
+s = US getenv("QUEUE_WIDTH");
+if (s && (x = Uatoi(s)) != 0) queue_width = x;
+
+if ((s = US getenv("SPOOL_DIRECTORY")))
+ spool_directory = string_copy(s);
+
+s = US getenv("START_SMALL");
+if (s && Ustrcmp(s, "yes") == 0) start_small = 1;
+
+s = US getenv("TEXT_DEPTH");
+if (s && (x = Uatoi(s)) != 0) text_depth = x;
+
+if ((s = US getenv("WINDOW_TITLE")))
+ window_title = string_copy(s);
+
+/* Deal with stripchart configuration. First see if we are monitoring
+the size of a partition, then deal with log stripcharts in a separate
+function */
+
+s = US getenv("SIZE_STRIPCHART");
+if (s && *s)
+ {
+ stripchart_number++;
+ stripchart_varstart++;
+ size_stripchart = string_copy(s);
+ s = US getenv("SIZE_STRIPCHART_NAME");
+ if (s != NULL && *s != 0) size_stripchart_name = string_copy(s);
+ }
+
+if ((s = US getenv("LOG_STRIPCHARTS")))
+ decode_stripchart_config(s);
+
+s = US getenv("STRIPCHART_INTERVAL");
+if (s && (x = Uatoi(s)) != 0) stripchart_update = x;
+
+s = US getenv("QUEUE_STRIPCHART_NAME");
+queue_stripchart_name = s ? string_copy(s) : US"queue";
+
+/* Compile the regex for matching yyyy-mm-dd at the start of a string. */
+
+yyyymmdd_regex = pcre2_compile((PCRE2_SPTR)"^\\d{4}-\\d\\d-\\d\\d\\s",
+ PCRE2_ZERO_TERMINATED, PCRE_COPT, &x, &erroroffset, NULL);
+}
+
+/* End of em_init.c */