pymessaging: Add irpc_servers_byname() and irpc_all_servers()
authorAndrew Bartlett <abartlet@samba.org>
Mon, 29 Oct 2012 04:34:41 +0000 (15:34 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 30 Oct 2012 21:13:56 +0000 (08:13 +1100)
This will allow python scripts to inspect the process list.

Andrew Bartlett

source4/lib/messaging/pymessaging.c
source4/scripting/python/samba/tests/messaging.py

index fb74f3e1dbec3c6de590be1376725a043d721199..fca46e674956b90fe22a555c993b8b0758f43db3 100644 (file)
@@ -221,6 +221,101 @@ static PyObject *py_imessaging_deregister(PyObject *self, PyObject *args, PyObje
        Py_RETURN_NONE;
 }
 
+static PyObject *py_irpc_servers_byname(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+       imessaging_Object *iface = (imessaging_Object *)self;
+       char *server_name;
+       struct server_id *ids;
+       PyObject *pylist;
+       int i;
+       TALLOC_CTX *mem_ctx = talloc_new(NULL);
+       if (!mem_ctx) {
+               PyErr_NoMemory();
+               return NULL;
+       }
+
+       if (!PyArg_ParseTuple(args, "s", &server_name)) {
+               TALLOC_FREE(mem_ctx);
+               return NULL;
+       }
+
+       ids = irpc_servers_byname(iface->msg_ctx, mem_ctx, server_name);
+
+       if (ids == NULL) {
+               TALLOC_FREE(mem_ctx);
+               PyErr_SetString(PyExc_KeyError, "No such name");
+               return NULL;
+       }
+
+       for (i = 0; ids[i].pid != 0; i++) {
+               /* Do nothing */
+       }
+
+       pylist = PyList_New(i);
+       if (pylist == NULL) {
+               TALLOC_FREE(mem_ctx);
+               PyErr_NoMemory();
+               return NULL;
+       }
+       for (i = 0; ids[i].pid; i++) {
+               PyObject *py_server_id;
+               struct server_id *p_server_id = talloc(NULL, struct server_id);
+               if (!p_server_id) {
+                       PyErr_NoMemory();
+                       return NULL;
+               }
+               *p_server_id = ids[i];
+
+               py_server_id = py_return_ndr_struct("samba.dcerpc.server_id", "server_id", p_server_id, p_server_id);
+               if (!py_server_id) {
+                       return NULL;
+               }
+               PyList_SetItem(pylist, i, py_server_id);
+               talloc_unlink(NULL, p_server_id);
+       }
+       TALLOC_FREE(mem_ctx);
+       return pylist;
+}
+
+static PyObject *py_irpc_all_servers(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+       imessaging_Object *iface = (imessaging_Object *)self;
+       PyObject *pylist;
+       int i;
+       struct irpc_name_records *records;
+       TALLOC_CTX *mem_ctx = talloc_new(NULL);
+       if (!mem_ctx) {
+               PyErr_NoMemory();
+               return NULL;
+       }
+
+       records = irpc_all_servers(iface->msg_ctx, mem_ctx);
+       if (records == NULL) {
+               return NULL;
+       }
+
+       pylist = PyList_New(records->num_records);
+       if (pylist == NULL) {
+               TALLOC_FREE(mem_ctx);
+               PyErr_NoMemory();
+               return NULL;
+       }
+       for (i = 0; i < records->num_records; i++) {
+               PyObject *py_name_record
+                       = py_return_ndr_struct("samba.dcerpc.irpc",
+                                              "name_record",
+                                              records->names[i],
+                                              records->names[i]);
+               if (!py_name_record) {
+                       return NULL;
+               }
+               PyList_SetItem(pylist, i,
+                              py_name_record);
+       }
+       TALLOC_FREE(mem_ctx);
+       return pylist;
+}
+
 static PyMethodDef py_imessaging_methods[] = {
        { "send", (PyCFunction)py_imessaging_send, METH_VARARGS|METH_KEYWORDS,
                "S.send(target, msg_type, data) -> None\nSend a message" },
@@ -228,6 +323,10 @@ static PyMethodDef py_imessaging_methods[] = {
                "S.register(callback, msg_type=None) -> msg_type\nRegister a message handler" },
        { "deregister", (PyCFunction)py_imessaging_deregister, METH_VARARGS|METH_KEYWORDS,
                "S.deregister(callback, msg_type) -> None\nDeregister a message handler" },
+       { "irpc_servers_byname", (PyCFunction)py_irpc_servers_byname, METH_VARARGS,
+               "S.irpc_servers_byname(name) -> list\nGet list of server_id values that are registered for a particular name" },
+       { "irpc_all_servers", (PyCFunction)py_irpc_all_servers, METH_NOARGS,
+               "S.irpc_servers_byname() -> list\nGet list of all registered names and the associated server_id values" },
        { NULL, NULL, 0, NULL }
 };
 
index 3348ff8deb21c453e81654f8f223f484921e530f..f0cd368195f81f5c3957d83807adb396460427c6 100644 (file)
@@ -35,6 +35,15 @@ class MessagingTests(TestCase):
         msg_type = x.register(callback)
         x.deregister(callback, msg_type)
 
+    def test_all_servers(self):
+        x = self.get_context()
+        self.assertTrue(isinstance(x.irpc_all_servers(), list))
+
+    def test_by_name(self):
+        x = self.get_context()
+        for name in x.irpc_all_servers():
+            self.assertTrue(isinstance(x.irpc_servers_byname(name.name), list))
+
     def test_assign_server_id(self):
         x = self.get_context()
         self.assertTrue(isinstance(x.server_id, server_id))