Beispiel #1
0
static void set_features(const char* name, PyObject *PyFeatures)
{
	Py_ssize_t l, i;
	PyObject *PyStr;

	if (!PyFeatures) {
		/* not specified -> enable all */
		ncds_features_enableall(name);
	} else if ((l = PyList_Size(PyFeatures)) == 0) {
		/* empty list -> disable all */
		ncds_features_disableall(name);
	} else {
		/* enable specified */
		for (i = 0; i < l; i++) {
			PyObject *PyUni = PyList_GetItem(PyFeatures, i);
			Py_INCREF(PyUni);
			if (!PyUnicode_Check(PyUni)) {
				Py_DECREF(PyUni);
				continue;
			}
			PyStr = PyUnicode_AsEncodedString(PyUni, "UTF-8", NULL);
			Py_DECREF(PyUni);
			if (PyStr == NULL) {
				continue;
			}
			ncds_feature_enable(name, PyBytes_AsString(PyStr));
			Py_DECREF(PyStr);
		}
	}
}
Beispiel #2
0
int cmd_add_model(const char* arg) {
	char* argv, *ptr, *ptr2, *model;
	struct data_model* mdl;

	argv = strdupa(arg + strlen("add-model "));

	if ((ptr = strtok(argv, " ")) == NULL) {
		cmd_add_model_help();
		return 1;
	}

	/* add .yin if not specified */
	ptr2 = strstr(ptr, ".yin");
	if (ptr2 == NULL) {
		asprintf(&ptr2, "%s.yin", ptr);
		model = ptr2;
	} else {
		ptr2 = NULL;
		model = ptr;
	}

	mdl = read_model(model);
	free(ptr2);
	if (mdl == NULL) {
		return 1;
	}

	add_hint(mdl->name);

	ptr = strtok(NULL, " ");
	if (ptr != NULL) {
		if (strcmp(ptr, "*") == 0) {
			ncds_features_enableall(mdl->name);
			return 0;
		} else {
			ncds_feature_enable(mdl->name, ptr);
		}
	}
	while ((ptr = strtok(NULL, " ")) != NULL) {
		ncds_feature_enable(mdl->name, ptr);
	}

	return 0;
}
Beispiel #3
0
int cmd_add_datastore(const char* arg) {
	char* argv, *ptr, *ptr2;
	struct ncds_ds* new_ds;

	argv = strdupa(arg + strlen("add-datastore "));

	if ((ptr = strtok(argv, " ")) == NULL) {
		cmd_add_datastore_help();
		return 1;
	}

	/* remove .yin if specified */
	ptr2 = strstr(ptr, ".yin");
	if (ptr2 != NULL) {
		*ptr2 = '\0';
	}

	if ((new_ds = ncds_new_internal(NCDS_TYPE_EMPTY, ptr)) == NULL) {
		return 1;
	}

	ncds_init(new_ds);

	add_hint(new_ds->data_model->name);

	ptr = strtok(NULL, " ");
	if (ptr != NULL) {
		if (strcmp(ptr, "*") == 0) {
			ncds_features_enableall(new_ds->data_model->name);
			return 0;
		} else {
			ncds_feature_enable(new_ds->data_model->name, ptr);
		}
	}
	while ((ptr = strtok(NULL, " ")) != NULL) {
		ncds_feature_enable(new_ds->data_model->name, ptr);
	}

	return 0;
}
/*
 * if repo_type is -1, then we are working with augment models specifications
 */
static int parse_model_cfg(struct np_module* module, xmlNodePtr node, NCDS_TYPE repo_type) {
	char *transapi_path = NULL, *model_path = NULL, *feature, *name, *aux;
	struct transapi *st = NULL;
	xmlNodePtr aux_node;

	if (strcmp(module->name, NETOPEER_MODULE_NAME) == 0) {
		st = &netopeer_transapi;
	} else if (strcmp(module->name, NCSERVER_MODULE_NAME) == 0) {
		st = &server_transapi;
	}

	for (aux_node = node->children; aux_node != NULL; aux_node = aux_node->next) {
		if (xmlStrcmp(aux_node->name, BAD_CAST "path") == 0) {
			model_path = (char*)xmlNodeGetContent(aux_node);
		}
		if (xmlStrcmp(aux_node->name, BAD_CAST "transapi") == 0) {
			transapi_path = (char*)xmlNodeGetContent(aux_node);
		}
		if (model_path && transapi_path) {
			break;
		}
	}
	/* Netopeer module is something extra */
	if (st != NULL && model_path) {
		/* internal static server (Netopeer) module */
		if (repo_type == -1 && transapi_path) {
			/* augment transapi module */
			nc_verb_verbose("Adding augment transapi \"%s\"", model_path);
			ncds_add_augment_transapi(model_path, transapi_path);
		} else if (repo_type == -1) {
			/* augment model */
			nc_verb_verbose("Adding augment model \"%s\"", model_path);
			ncds_add_model(model_path);
		} else {
			nc_verb_verbose("Adding static transapi \"%s\"", model_path);
			if ((module->ds = ncds_new_transapi_static(repo_type, model_path, st)) == NULL) {
				free(model_path);
				free(transapi_path);
				return (EXIT_FAILURE);
			}
		}
	} else if (model_path && transapi_path) {
		if (repo_type == -1) {
			/* augment transapi module */
			nc_verb_verbose("Adding augment transapi \"%s\"", model_path);
			ncds_add_augment_transapi(model_path, transapi_path);
		} else {
			/* base transapi module for datastore */
			nc_verb_verbose("Adding transapi \"%s\"", model_path);
			if ((module->ds = ncds_new_transapi(repo_type, model_path, transapi_path)) == NULL) {
				free(model_path);
				free(transapi_path);
				return (EXIT_FAILURE);
			}
		}
	} else if (model_path) {
		if (repo_type == -1) {
			/* augment model */
			nc_verb_verbose("Adding augment model \"%s\"", model_path);
			ncds_add_model(model_path);
		} else {
			/* base model for datastore */
			nc_verb_verbose("Adding base model \"%s\"", model_path);
			if ((module->ds = ncds_new2(repo_type, model_path, NULL)) == NULL) {
				free(model_path);
				return (EXIT_FAILURE);
			}
		}
	} else {
		nc_verb_error("Configuration mismatch: missing model path in %s config.", module->name);
	}
	name = strdup(basename(model_path));
	/* cut off the .yin suffix */
	aux = strrchr(name, '.');
	if (aux) { *aux = '\0';}

	free(model_path);
	free(transapi_path);

	/* set features */
	for (aux_node = node->children; aux_node != NULL; aux_node = aux_node->next) {
		if (xmlStrcmp(aux_node->name, BAD_CAST "feature") == 0) {
			feature = (char*)xmlNodeGetContent(aux_node);
			if (strcmp(feature, "*") == 0) {
				ncds_features_enableall(name);
			} else {
				ncds_feature_enable(name, feature);
			}
			free(feature);
		}
	}
	free(name);

	return (EXIT_SUCCESS);
}