From 308de544f4dd1e23197d3b6d3be85cef1f5f9ded Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 16 Jun 2009 02:24:43 +0200 Subject: python: Provide way to iterate over available shares. --- source4/bin/python/samba/tests/shares.py | 34 +++++++++++++++++++++++++++++++- source4/param/pyparam.c | 16 +++++++++++++++ source4/scripting/python/samba/shares.py | 5 ++++- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/source4/bin/python/samba/tests/shares.py b/source4/bin/python/samba/tests/shares.py index 0a771b1754..9130c36780 100644 --- a/source4/bin/python/samba/tests/shares.py +++ b/source4/bin/python/samba/tests/shares.py @@ -20,15 +20,47 @@ from samba.shares import SharesContainer from unittest import TestCase +class MockService(object): + + def __init__(self, data): + self.data = data + + def __getitem__(self, name): + return self.data[name] + + +class MockLoadParm(object): + + def __init__(self, data): + self.data = data + + def __getitem__(self, name): + return MockService(self.data[name]) + + def __contains__(self, name): + return name in self.data + + def __len__(self): + return len(self.data) + + def services(self): + return self.data.keys() + + class ShareTests(TestCase): def _get_shares(self, conf): - return SharesContainer(conf) + return SharesContainer(MockLoadParm(conf)) def test_len_no_global(self): shares = self._get_shares({}) self.assertEquals(0, len(shares)) + def test_iter(self): + self.assertEquals([], list(self._get_shares({}))) + self.assertEquals([], list(self._get_shares({"global":{}}))) + self.assertEquals(["bla"], list(self._get_shares({"global":{}, "bla":{}}))) + def test_len(self): shares = self._get_shares({"global": {}}) self.assertEquals(0, len(shares)) diff --git a/source4/param/pyparam.c b/source4/param/pyparam.c index d8dabe3458..4f6e2fff49 100644 --- a/source4/param/pyparam.c +++ b/source4/param/pyparam.c @@ -232,6 +232,20 @@ static PyObject *py_lp_ctx_private_path(py_talloc_Object *self, PyObject *args) return ret; } +static PyObject *py_lp_ctx_services(py_talloc_Object *self) +{ + struct loadparm_context *lp_ctx = PyLoadparmContext_AsLoadparmContext(self); + const char **names; + PyObject *ret; + int i; + names = lp_server_services(lp_ctx); + ret = PyList_New(str_list_length(names)); + for (i = 0; names[i]; i++) { + PyList_SetItem(ret, i, PyString_FromString(names[i])); + } + return ret; +} + static PyMethodDef py_lp_ctx_methods[] = { { "load", (PyCFunction)py_lp_ctx_load, METH_VARARGS, "S.load(filename) -> None\n" @@ -253,6 +267,8 @@ static PyMethodDef py_lp_ctx_methods[] = { "Change a parameter." }, { "private_path", (PyCFunction)py_lp_ctx_private_path, METH_VARARGS, "S.private_path(name) -> path\n" }, + { "services", (PyCFunction)py_lp_ctx_services, METH_NOARGS, + "S.services() -> list" }, { NULL } }; diff --git a/source4/scripting/python/samba/shares.py b/source4/scripting/python/samba/shares.py index 622c3b6486..89a312e855 100644 --- a/source4/scripting/python/samba/shares.py +++ b/source4/scripting/python/samba/shares.py @@ -41,8 +41,11 @@ class SharesContainer(object): return len(self._lp)-1 return len(self._lp) + def keys(self): + return [name for name in self._lp.services() if name != "global"] + def __iter__(self): - return self.lp.services() + return iter(self.keys()) class Share(object): -- cgit