[PATCH v2] libgpo: port samba.gpo to python3
David Mulder
dmulder at suse.com
Mon Feb 12 19:27:56 UTC 2018
This version adds a python test (run in py2 and py3).
libgpo/pygpo.c | 30 +++++++++++++++++++++---------
libgpo/wscript_build | 9 +++++----
python/samba/tests/gpo.py | 54
++++++++++++++++++++++++++++++++++++++++++++++++++++++
source4/selftest/tests.py | 1 +
4 files changed, 81 insertions(+), 13 deletions(-)
--
David Mulder
SUSE Labs Software Engineer - Samba
dmulder at suse.com
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg)
-------------- next part --------------
From afd92c5d57c2df523c0a922c51d7cf12d481ad29 Mon Sep 17 00:00:00 2001
From: David Mulder <dmulder at suse.com>
Date: Tue, 30 Jan 2018 12:31:42 -0700
Subject: [PATCH 1/2] libgpo: port samba.gpo to python3
Signed-off-by: David Mulder <dmulder at suse.com>
---
libgpo/pygpo.c | 30 +++++++++++++++++++++---------
libgpo/wscript_build | 9 +++++----
2 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/libgpo/pygpo.c b/libgpo/pygpo.c
index 7a02a0dc2aa..ba12305cf33 100644
--- a/libgpo/pygpo.c
+++ b/libgpo/pygpo.c
@@ -27,6 +27,7 @@
#include "librpc/rpc/pyrpc_util.h"
#include "auth/credentials/pycredentials.h"
#include "libcli/util/pyerrors.h"
+#include "python/py3compat.h"
/* A Python C API module to use LIBGPO */
@@ -37,7 +38,7 @@ static PyObject* GPO_get_##ATTR(PyObject *self, void *closure) \
= pytalloc_get_ptr(self); \
\
if (gpo_ptr->ATTR) \
- return PyString_FromString(gpo_ptr->ATTR); \
+ return PyStr_FromString(gpo_ptr->ATTR); \
else \
return Py_None; \
}
@@ -110,7 +111,7 @@ static PyObject *py_gpo_get_unix_path(PyObject *self, PyObject *args,
goto out;
}
- ret = PyString_FromString(unix_path);
+ ret = PyStr_FromString(unix_path);
out:
return ret;
@@ -471,7 +472,7 @@ out:
static PyMethodDef ADS_methods[] = {
{ "connect", (PyCFunction)py_ads_connect, METH_NOARGS,
"Connect to the LDAP server" },
- { "get_gpo_list", (PyCFunction)py_ads_get_gpo_list, METH_KEYWORDS,
+ { "get_gpo_list", (PyCFunction)py_ads_get_gpo_list, METH_VARARGS | METH_KEYWORDS,
NULL },
{ NULL }
};
@@ -494,34 +495,45 @@ static PyMethodDef py_gpo_methods[] = {
{NULL}
};
+static struct PyModuleDef moduledef = {
+ PyModuleDef_HEAD_INIT,
+ .m_name = "gpo",
+ .m_doc = "libgpo python bindings",
+ .m_size = -1,
+ .m_methods = py_gpo_methods,
+};
+
/* Will be called by python when loading this module */
-void initgpo(void)
+void initgpo(void);
+
+MODULE_INIT_FUNC(gpo)
{
PyObject *m;
debug_setup_talloc_log();
/* Instantiate the types */
- m = Py_InitModule3("gpo", py_gpo_methods, "libgpo python bindings");
+ m = PyModule_Create(&moduledef);
if (m == NULL) {
- return;
+ return m;
}
PyModule_AddObject(m, "version",
- PyString_FromString(SAMBA_VERSION_STRING));
+ PyStr_FromString(SAMBA_VERSION_STRING));
if (PyType_Ready(&ads_ADSType) < 0) {
- return;
+ return m;
}
PyModule_AddObject(m, "ADS_STRUCT", (PyObject *)&ads_ADSType);
if (pytalloc_BaseObject_PyType_Ready(&GPOType) < 0) {
- return;
+ return m;
}
Py_INCREF((PyObject *)(void *)&GPOType);
PyModule_AddObject(m, "GROUP_POLICY_OBJECT",
(PyObject *)&GPOType);
+ return m;
}
diff --git a/libgpo/wscript_build b/libgpo/wscript_build
index 2ef66f7fa9d..f456d417d8a 100644
--- a/libgpo/wscript_build
+++ b/libgpo/wscript_build
@@ -7,7 +7,8 @@ bld.SAMBA3_LIBRARY('gpext',
deps='talloc ads TOKEN_UTIL auth',
private_library=True)
-bld.SAMBA3_PYTHON('python_samba_libgpo', 'pygpo.c',
- deps='''pyparam_util gpext talloc ads TOKEN_UTIL
- auth pyrpc_util''',
- realname='samba/gpo.so')
+for env in bld.gen_python_environments():
+ bld.SAMBA3_PYTHON('python_samba_libgpo', 'pygpo.c',
+ deps='''pyparam_util gpext talloc ads TOKEN_UTIL
+ auth pyrpc_util''',
+ realname='samba/gpo.so')
--
2.13.6
From f158e652759281f0f2db39d0d1d7b48f3a3d66b9 Mon Sep 17 00:00:00 2001
From: David Mulder <dmulder at suse.com>
Date: Mon, 12 Feb 2018 12:21:42 -0700
Subject: [PATCH 2/2] Add python tests for samba.gpo module
Signed-off-by: David Mulder <dmulder at suse.com>
---
python/samba/tests/gpo.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++
source4/selftest/tests.py | 1 +
2 files changed, 55 insertions(+)
create mode 100644 python/samba/tests/gpo.py
diff --git a/python/samba/tests/gpo.py b/python/samba/tests/gpo.py
new file mode 100644
index 00000000000..814d63eb40a
--- /dev/null
+++ b/python/samba/tests/gpo.py
@@ -0,0 +1,54 @@
+import os
+from samba import gpo, tests
+from samba.param import LoadParm
+
+poldir = r'\\addom.samba.example.com\sysvol\addom.samba.example.com\Policies'
+dspath = 'CN=Policies,CN=System,DC=addom,DC=samba,DC=example,DC=com'
+gpt_data = '[General]\nVersion=%d'
+
+class GPOTests(tests.TestCase):
+ def setUp(self):
+ super(GPOTests, self).setUp()
+ self.server = os.environ["SERVER"]
+ self.lp = LoadParm()
+ self.lp.load_default()
+ self.creds = self.insta_creds(template=self.get_credentials())
+
+ def tearDown(self):
+ super(GPOTests, self).tearDown()
+
+ def test_gpo_list(self):
+ global poldir, dspath
+ ads = gpo.ADS_STRUCT(self.server, self.lp, self.creds)
+ if ads.connect():
+ gpos = ads.get_gpo_list(self.creds.get_username())
+ guid = '{31B2F340-016D-11D2-945F-00C04FB984F9}'
+ names = ['Local Policy', guid]
+ file_sys_paths = [None, '%s\\%s' % (poldir, guid)]
+ ds_paths = [None, 'CN=%s,%s' % (guid, dspath)]
+ for i in range(0, len(gpos)):
+ assert gpos[i].name == names[i], \
+ 'The gpo name did not match expected name %s' % gpos[i].name
+ assert gpos[i].file_sys_path == file_sys_paths[i], \
+ 'file_sys_path did not match expected %s' % gpos[i].file_sys_path
+ assert gpos[i].ds_path == ds_paths[i], \
+ 'ds_path did not match expected %s' % gpos[i].ds_path
+
+ def test_gpt_version(self):
+ global gpt_data
+ local_path = self.lp.get("path", "sysvol")
+ policies = 'addom.samba.example.com/Policies'
+ guid = '{31B2F340-016D-11D2-945F-00C04FB984F9}'
+ gpo_path = os.path.join(local_path, policies, guid)
+ old_vers = gpo.gpo_get_sysvol_gpt_version(gpo_path)[1]
+
+ with open(os.path.join(gpo_path, 'GPT.INI'), 'w') as gpt:
+ gpt.write(gpt_data % 42)
+ assert gpo.gpo_get_sysvol_gpt_version(gpo_path)[1] == 42, \
+ 'gpo_get_sysvol_gpt_version() did not return the expected version'
+
+ with open(os.path.join(gpo_path, 'GPT.INI'), 'w') as gpt:
+ gpt.write(gpt_data % old_vers)
+ assert gpo.gpo_get_sysvol_gpt_version(gpo_path)[1] == old_vers, \
+ 'gpo_get_sysvol_gpt_version() did not return the expected version'
+
diff --git a/source4/selftest/tests.py b/source4/selftest/tests.py
index ed232a02d03..5a4a5ccde86 100755
--- a/source4/selftest/tests.py
+++ b/source4/selftest/tests.py
@@ -619,6 +619,7 @@ planpythontestsuite("ad_dc:local", "samba.tests.samba_tool.dnscmd")
planpythontestsuite("ad_dc_ntvfs:local", "samba.tests.dcerpc.rpcecho")
planoldpythontestsuite("ad_dc:local", "samba.tests.smb", extra_args=['-U"$USERNAME%$PASSWORD"'], py3_compatible=True)
+planoldpythontestsuite("ad_dc:local", "samba.tests.gpo", extra_args=['-U"$USERNAME%$PASSWORD"'], py3_compatible=True)
planoldpythontestsuite("ad_dc_ntvfs:local", "samba.tests.dcerpc.registry", extra_args=['-U"$USERNAME%$PASSWORD"'])
planoldpythontestsuite("ad_dc_ntvfs", "samba.tests.dcerpc.dnsserver", extra_args=['-U"$USERNAME%$PASSWORD"'])
--
2.13.6
More information about the samba-technical
mailing list