Ejemplo n.º 1
0
static PyObject *setCapabilities(PyObject *self, PyObject *args, PyObject *keywds)
{
	PyObject *PyCpblts;
	Py_ssize_t l, i;
	int ret;
	char *item;
	static char *kwlist[] = {"list", NULL};
	PyObject *PyStr;

	if (! PyArg_ParseTupleAndKeywords(args, keywds, "O!", kwlist, &PyList_Type, &PyCpblts)) {
		return (NULL);
	}

	if ((l = PyList_Size(PyCpblts)) < 1) {
		PyErr_SetString(PyExc_ValueError, "The capabilities list must not be empty.");
		return (NULL);
	}

	nc_cpblts_free(global_cpblts);
	global_cpblts = nc_cpblts_new(NULL);
	for (i = 0; i < l; i++) {
		PyObject *PyUni = PyList_GetItem(PyCpblts, i);
		Py_INCREF(PyUni);
		if (!PyUnicode_Check(PyUni)) {
			PyErr_SetString(PyExc_TypeError, "Capabilities list must contain strings.");
			nc_cpblts_free(global_cpblts);
			global_cpblts = NULL;
			Py_DECREF(PyUni);
			return (NULL);
		}
		PyStr = PyUnicode_AsEncodedString(PyUni, "UTF-8", NULL);
		Py_DECREF(PyUni);
		if (PyStr == NULL) {
			nc_cpblts_free(global_cpblts);
			global_cpblts = NULL;
			return (NULL);
		}
		item = PyBytes_AsString(PyStr);
		if (item == NULL) {
			nc_cpblts_free(global_cpblts);
			global_cpblts = NULL;
			Py_DECREF(PyStr);
			return (NULL);
		}
		ret = nc_cpblts_add(global_cpblts, item);
		Py_DECREF(PyStr);
		if (ret != EXIT_SUCCESS) {
			nc_cpblts_free(global_cpblts);
			global_cpblts = NULL;
			return (NULL);
		}
	}

	Py_RETURN_NONE;
}
Ejemplo n.º 2
0
static int ncSessionInit(ncSessionObject *self, PyObject *args, PyObject *keywords)
{
	const char *host = NULL, *user = NULL, *transport_s = NULL;
	unsigned short port = 830;
	PyObject *PyCpblts = NULL;
	PyObject *PyStr;
	struct nc_session *session;
	struct nc_cpblts *cpblts = NULL;
	char cpblts_free_flag = 0;
	char* item = NULL;
	Py_ssize_t l, i;
	int ret;
	int fd_in = -1, fd_out = -1;
	NC_TRANSPORT transport = NC_TRANSPORT_UNKNOWN;

	char *kwlist[] = {"host", "port", "user", "transport", "capabilities", "fd_in", "fd_out", NULL};

	/* Get input parameters */
	if (! PyArg_ParseTupleAndKeywords(args, keywords, "|zHzzOii", kwlist, &host, &port, &user, &transport_s, &PyCpblts, &fd_in, &fd_out)) {
		return -1;
	}

	if ((fd_in >= 0 && fd_out < 0) || (fd_in < 0 && fd_out >= 0)) {
		PyErr_SetString(PyExc_ValueError, "Both or none of fd_in and fd_out arguments must be set.");
		return -1;
	}

	if (host != NULL) {
		/* Client side */
		if (transport_s && strcasecmp(transport_s, NETCONF_TRANSPORT_TLS) == 0) {
			ret = nc_session_transport(NC_TRANSPORT_TLS);
			transport = NC_TRANSPORT_TLS;
		} else {
			ret = nc_session_transport(NC_TRANSPORT_SSH);
			transport = NC_TRANSPORT_SSH;
		}
		if (ret != EXIT_SUCCESS) {
			return -1;
		}
	}

	if (PyCpblts != NULL && PyCpblts != Py_None) {
		cpblts = nc_cpblts_new(NULL);
		cpblts_free_flag = 1;
		if (PyList_Check(PyCpblts)) {
			if ((l = PyList_Size(PyCpblts)) > 0) {
				for (i = 0; i < l; i++) {
					PyObject *PyUni = PyList_GetItem(PyCpblts, i);
					Py_INCREF(PyUni);
					if (!PyUnicode_Check(PyUni)) {
						PyErr_SetString(PyExc_TypeError, "Capabilities list must contain strings.");
						nc_cpblts_free(cpblts);
						Py_DECREF(PyUni);
						return -1;
					}
					PyStr = PyUnicode_AsEncodedString(PyUni, "UTF-8", NULL);
					Py_DECREF(PyUni);
					if (PyStr == NULL) {
						nc_cpblts_free(cpblts);
						return -1;
					}
					item = PyBytes_AsString(PyStr);
					if (item == NULL) {
						nc_cpblts_free(cpblts);
						Py_DECREF(PyStr);
						return -1;
					}
					ret = nc_cpblts_add(cpblts, item);
					Py_DECREF(PyStr);
					if (ret != EXIT_SUCCESS) {
						nc_cpblts_free(cpblts);
						return -1;
					}
				}
			}
		} else {
			PyErr_SetString(PyExc_TypeError, "Capabilities argument is expected to be a list of strings.");
			return -1;
		}
	}

	if (cpblts == NULL) {
		/* use global capabilities, that are, by default, same as libnetconf's
		 * default capabilities
		 */
		cpblts = global_cpblts;
	}

	if (host != NULL) {
		/* Client side */
		if (fd_in != -1 && fd_out != -1) {
			session = nc_session_connect_inout(fd_in, fd_out, cpblts,
					host, NULL, user, transport);
		} else {
			session = nc_session_connect(host, port, user, cpblts);
		}
	} else {
		/* Server side */
		session = nc_session_accept_inout(cpblts, user,
				fd_in != -1 ? fd_in : STDIN_FILENO,
				fd_out != -1 ? fd_out : STDOUT_FILENO);

		/* add to the list of monitored sessions */
		nc_session_monitor(session);
	}

	if (cpblts_free_flag) {
		nc_cpblts_free(cpblts);
	}

	if (session == NULL) {
		return -1;
	}

	nc_session_free(self->session);
	self->session = session;

	return 0;
}