[netfilter-cvslog] r7319 - branches/ulog/ulogd2/src

pablo at netfilter.org pablo at netfilter.org
Sun Feb 3 12:30:34 CET 2008


Author: pablo at netfilter.org
Date: 2008-02-03 12:30:34 +0100 (Sun, 03 Feb 2008)
New Revision: 7319

Modified:
   branches/ulog/ulogd2/src/ulogd.c
Log:
From: Eric leblond <eric at inl.fr>
It is difficult to find how to configure a plugin. This patch adds an info
option which can be used to display:
* Name
* Configuration variables
* Input keys
* Output keys

Output example:
/opt/ulogd2/sbin/ulogd --info /opt/ulogd2/lib/ulogd/ulogd_filter_IFINDEX.so
Name: IFINDEX
Input keys:
Key: oob.ifindex_in (unsigned int 32)
Key: oob.ifindex_out (unsigned int 32)
Output keys:
Key: oob.in (string)
Key: oob.out (string)


Modified: branches/ulog/ulogd2/src/ulogd.c
===================================================================
--- branches/ulog/ulogd2/src/ulogd.c	2008-02-03 11:27:14 UTC (rev 7318)
+++ branches/ulog/ulogd2/src/ulogd.c	2008-02-03 11:30:34 UTC (rev 7319)
@@ -78,6 +78,8 @@
 static char *ulogd_logfile = ULOGD_LOGFILE_DEFAULT;
 static FILE syslog_dummy;
 
+static int info_mode = 0;
+
 /* linked list for all registered plugins */
 static LLIST_HEAD(ulogd_plugins);
 static LLIST_HEAD(ulogd_pi_stacks);
@@ -231,21 +233,144 @@
 	return NULL;
 }
 
+char *type_to_string(int type)
+{
+	switch (type) {
+		case ULOGD_RET_INT8:
+			return strdup("int 8");
+			break;
+		case ULOGD_RET_INT16:
+			return strdup("int 16");
+			break;
+		case ULOGD_RET_INT32:
+			return strdup("int 32");
+			break;
+		case ULOGD_RET_INT64:
+			return strdup("int 64");
+			break;
+		case ULOGD_RET_UINT8:
+			return strdup("unsigned int 8");
+			break;
+		case ULOGD_RET_UINT16:
+			return strdup("unsigned int 16");
+			break;
+		case ULOGD_RET_UINT32:
+			return strdup("unsigned int 32");
+			break;
+		case ULOGD_RET_UINT64:
+			return strdup("unsigned int 64");
+			break;
+		case ULOGD_RET_BOOL:
+			return strdup("boolean");
+			break;
+		case ULOGD_RET_IPADDR:
+			return strdup("IPv4 addr");
+			break;
+		case ULOGD_RET_IP6ADDR:
+			return strdup("IPv6 addr");
+			break;
+		case ULOGD_RET_STRING:
+			return strdup("string");
+			break;
+		case ULOGD_RET_RAW:
+			return strdup("raw data");
+			break;
+		default:
+			return strdup("Unknown type");
+	}
+}
+
+
+void get_plugin_infos(struct ulogd_plugin *me)
+{
+	int i;
+	printf("Name: %s\n", me->name);
+	if (me->config_kset) {
+		printf("Config options:\n");
+		for(i = 0; i < me->config_kset->num_ces; i++) {
+			printf("\tVar: %s (", me->config_kset->ces[i].key);
+			switch (me->config_kset->ces[i].type) {
+				case CONFIG_TYPE_STRING:
+					printf("String");
+					printf(", Default: %s", 
+					       me->config_kset->ces[i].u.value);
+					break;
+				case CONFIG_TYPE_INT:
+					printf("Integer");
+					printf(", Default: %d",
+					       me->config_kset->ces[i].u.value);
+					break;
+				case CONFIG_TYPE_CALLBACK:
+					printf("Callback");
+					break;
+				default:
+					printf("Unknown");
+					break;
+			}
+			if (me->config_kset->ces[i].options == 
+						CONFIG_OPT_MANDATORY) {
+				printf(", Mandatory");
+			}
+			printf(")\n");
+		}
+	}
+	printf("Input keys:\n");
+	if (me->input.type != ULOGD_DTYPE_SOURCE) {
+		if (me->input.num_keys == 0) {
+			printf("\tNo statically defined keys\n");
+		} else {
+			for(i = 0; i < me->input.num_keys; i++) {
+				char *tstring = 
+					type_to_string(me->input.keys[i].type);
+				printf("\tKey: %s (%s)\n",
+				       me->input.keys[i].name,
+				       tstring);
+				free(tstring);
+			}
+		}
+	} else {
+		printf("\tInput plugin, No keys\n");
+	}
+	printf("Output keys:\n");
+	if (me->output.type != ULOGD_DTYPE_SINK) {
+		if (me->output.num_keys == 0) {
+			printf("\tNo statically defined keys\n");
+		} else {
+			for(i = 0; i < me->output.num_keys; i++) {
+				char *tstring =
+					type_to_string(me->output.keys[i].type);
+				printf("\tKey: %s (%s)\n",
+				       me->output.keys[i].name,
+				       tstring);
+				free(tstring);
+			}
+		}
+	} else {
+		printf("\tOutput plugin, No keys\n");
+	}
+}
+
 /* the function called by all plugins for registering themselves */
 void ulogd_register_plugin(struct ulogd_plugin *me)
 {
 	if (strcmp(me->version, ULOGD_VERSION)) { 
-		ulogd_log(ULOGD_NOTICE, "plugin `%s' has incompatible version %s\n",
+		ulogd_log(ULOGD_NOTICE, 
+			  "plugin `%s' has incompatible version %s\n",
 			  me->version);
 		return;
 	}
-	if (find_plugin(me->name)) {
-		ulogd_log(ULOGD_NOTICE, "plugin `%s' already registered\n",
-				me->name);
-		exit(EXIT_FAILURE);
+	if (info_mode == 0) {
+		if (find_plugin(me->name)) {
+			ulogd_log(ULOGD_NOTICE,
+				  "plugin `%s' already registered\n",
+				  me->name);
+			exit(EXIT_FAILURE);
+		}
+		ulogd_log(ULOGD_NOTICE, "registering plugin `%s'\n", me->name);
+		llist_add(&me->list, &ulogd_plugins);
+	} else {
+		get_plugin_infos(me);
 	}
-	ulogd_log(ULOGD_NOTICE, "registering plugin `%s'\n", me->name);
-	llist_add(&me->list, &ulogd_plugins);
 }
 
 /***********************************************************************
@@ -853,6 +978,7 @@
 	printf("\t-d --daemon\tDaemonize (fork into background)\n");
 	printf("\t-c --configfile\tUse alternative Configfile\n");
 	printf("\t-u --uid\tChange UID/GID\n");
+	printf("\t-i --info\tDisplay infos about plugin\n");
 }
 
 static struct option opts[] = {
@@ -861,6 +987,7 @@
 	{ "help", 0, NULL, 'h' },
 	{ "configfile", 1, NULL, 'c'},
 	{ "uid", 1, NULL, 'u' },
+	{ "info", 1, NULL, 'i'},
 	{ 0 }
 };
 
@@ -875,7 +1002,7 @@
 	gid_t gid = 0;
 
 
-	while ((argch = getopt_long(argc, argv, "c:dh::Vu:", opts, NULL)) != -1) {
+	while ((argch = getopt_long(argc, argv, "c:dh::Vu:i:", opts, NULL)) != -1) {
 		switch (argch) {
 		default:
 		case '?':
@@ -916,6 +1043,11 @@
 			uid = pw->pw_uid;
 			gid = pw->pw_gid;
 			break;
+		case 'i':
+			info_mode = 1;
+			load_plugin(optarg);
+			exit(0);
+			break;
 		}
 	}
 




More information about the netfilter-cvslog mailing list