new upstream release (3.3.0); modify package compatibility for Stretch
[ossec-hids.git] / src / util / ossec-regex-convert.c
diff --git a/src/util/ossec-regex-convert.c b/src/util/ossec-regex-convert.c
new file mode 100644 (file)
index 0000000..bdd7fd2
--- /dev/null
@@ -0,0 +1,184 @@
+/* Copyright (C) 2009 Trend Micro Inc.
+ * All right reserved.
+ *
+ * This program is a free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General Public
+ * License (version 2) as published by the FSF - Free Software
+ * Foundation
+ */
+
+#include <getopt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "shared.h"
+
+#undef ARGV0
+#define ARGV0 "ossec-regex-convert"
+
+typedef struct _OSConvertionMap {
+    const char *old_element;
+    const char *new_element;
+    int map;
+} OSConvertionMap;
+
+/* Prototypes */
+void helpmsg(void);
+void list_tags(void);
+
+/* Global variables */
+const OSConvertionMap conv_map[] = {
+    {.old_element = "regex", .new_element = "pcre2", .map = OS_CONVERT_REGEX},
+    {.old_element = "match", .new_element = "match_pcre2", .map = OS_CONVERT_MATCH},
+    {.old_element = "program_name", .new_element = "program_name_pcre2", .map = OS_CONVERT_MATCH},
+    {.old_element = "prematch", .new_element = "prematch_pcre2", .map = OS_CONVERT_REGEX},
+    {.old_element = "srcgeoip", .new_element = "srcgeoip_pcre2", .map = OS_CONVERT_MATCH},
+    {.old_element = "dstgeoip", .new_element = "dstgeoip_pcre2", .map = OS_CONVERT_MATCH},
+    {.old_element = "srcport", .new_element = "srcport_pcre2", .map = OS_CONVERT_MATCH},
+    {.old_element = "dstport", .new_element = "dstport_pcre2", .map = OS_CONVERT_MATCH},
+    {.old_element = "user", .new_element = "user_pcre2", .map = OS_CONVERT_MATCH},
+    {.old_element = "url", .new_element = "url_pcre2", .map = OS_CONVERT_MATCH},
+    {.old_element = "id", .new_element = "id_pcre2", .map = OS_CONVERT_MATCH},
+    {.old_element = "status", .new_element = "status_pcre2", .map = OS_CONVERT_MATCH},
+    {.old_element = "hostname", .new_element = "hostname_pcre2", .map = OS_CONVERT_MATCH},
+    {.old_element = "extra_data", .new_element = "extra_data_pcre2", .map = OS_CONVERT_MATCH},
+};
+const struct option getopt_options[] = {
+    {"help", no_argument, NULL, 'h'},
+    {"batch", no_argument, NULL, 'b'},
+    {"regex", no_argument, NULL, 'r'},
+    {"match", no_argument, NULL, 'm'},
+    {"tags", no_argument, NULL, 't'},
+    {NULL, 0, NULL, 0},
+};
+
+int main(int argc, char *const argv[])
+{
+    char *converted_pattern = NULL;
+    const OSConvertionMap *m = NULL;
+    int batch_mode = 0;
+    int regex_to_pcre2 = 1;
+    int match_to_pcre2 = 1;
+    int opt;
+    int i;
+    const char *pattern = NULL;
+    const char *type = NULL;
+    size_t idx;
+
+    OS_SetName(ARGV0);
+
+    while ((opt = getopt_long(argc, argv, "hbrmt", getopt_options, NULL)) != EOF) {
+        switch (opt) {
+            case 'h':
+                helpmsg();
+                return (EXIT_SUCCESS);
+            case 'b':
+                batch_mode = 1;
+                break;
+            case 'r':
+                regex_to_pcre2 = 1;
+                match_to_pcre2 = 0;
+                break;
+            case 'm':
+                regex_to_pcre2 = 0;
+                match_to_pcre2 = 1;
+                break;
+            case 't':
+                list_tags();
+                return (EXIT_SUCCESS);
+            default:
+                helpmsg();
+                return (EXIT_FAILURE);
+        }
+    }
+    argc -= optind;
+    argv += optind;
+
+    /* User arguments */
+    if (argc < 1) {
+        helpmsg();
+        return (EXIT_FAILURE);
+    }
+
+    if (batch_mode) {
+        for (i = 0; i < argc; i += 2) {
+            type = argv[i];
+            pattern = argv[i + 1];
+            m = NULL;
+            for (idx = 0; idx < sizeof(conv_map) / sizeof(OSConvertionMap); idx++) {
+                m = &conv_map[idx];
+                if (strcmp(m->old_element, type) == 0) {
+                    break;
+                }
+            }
+            if (!m) {
+                fprintf(stderr, "Invalid type \"%s\"\n", type);
+                goto fail;
+            }
+            if (OSRegex_Convert(pattern, &converted_pattern, m->map)) {
+                printf("%s %s\n", m->new_element, converted_pattern);
+                free(converted_pattern);
+            } else {
+                goto fail;
+            }
+        }
+    } else {
+        for (i = 0; i < argc; i++) {
+            pattern = argv[i];
+            if (i > 0) {
+                printf("\n");
+            }
+            printf("pattern = %s\n", pattern);
+            if (regex_to_pcre2) {
+                OSRegex_Convert(pattern, &converted_pattern, OS_CONVERT_REGEX);
+                printf("regex   = %s\n", converted_pattern);
+                if (converted_pattern) {
+                    free(converted_pattern);
+                }
+            }
+            if (match_to_pcre2) {
+                OSRegex_Convert(pattern, &converted_pattern, OS_CONVERT_MATCH);
+                printf("match   = %s\n", converted_pattern);
+                if (converted_pattern) {
+                    free(converted_pattern);
+                }
+            }
+        }
+    }
+
+    return (EXIT_SUCCESS);
+
+fail:
+    if (converted_pattern) {
+        free(converted_pattern);
+    }
+
+    return (EXIT_FAILURE);
+}
+
+void list_tags(void)
+{
+    size_t idx;
+
+    for (idx = 0; idx < sizeof(conv_map) / sizeof(OSConvertionMap); idx++) {
+        printf("%s\n", conv_map[idx].old_element);
+    }
+}
+
+void helpmsg(void)
+{
+    printf("\n"
+           "OSSEC HIDS %s: ossec-regex-convert -h\n"
+           "OSSEC HIDS %s: ossec-regex-convert -t\n"
+           "OSSEC HIDS %s: ossec-regex-convert [-mr] PATTERN [PATTERN...]\n"
+           "OSSEC HIDS %s: ossec-regex-convert -b TAG PATTERN [TAG PATTERN...]\n"
+           "    -h, --help  : displays this message and exits.\n"
+           "    -b, --batch : runs in batch mode.\n"
+           "    -r, --regex : only convert patterns from OSRegex to PCRE2 (default is both).\n"
+           "    -m, --match : only convert patterns from OSMatch to PCRE2 (default is both).\n"
+           "    -t, --tags  : list XML tags that can be converted.\n"
+           "    PATTERN     : pattern to convert.\n"
+           "    TAG         : a valid XML tag (list available with -t,--tags).\n",
+           ARGV0, ARGV0, ARGV0, ARGV0);
+}