[PATCHES] more clusapi testing
Günther Deschner
gd at samba.org
Wed Jul 27 15:20:36 UTC 2016
Hi,
attached some more patches for the cluster management protocol testing.
Please review & push,
Thanks,
Guenther
--
Günther Deschner GPG-ID: 8EE11688
Red Hat gdeschner at redhat.com
Samba Team gd at samba.org
-------------- next part --------------
From 5dc7b13558b25e352c0be4dd21a339dea3bf8b38 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Mon, 2 May 2016 14:53:13 +0200
Subject: [PATCH 01/13] s4-torture: test multiple different cluster control
codes.
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
source4/torture/rpc/clusapi.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index d59f24f..986f263 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2217,7 +2217,8 @@ static bool test_SetServiceAccountPassword(struct torture_context *tctx,
static bool test_ClusterControl_int(struct torture_context *tctx,
struct dcerpc_pipe *p,
- struct policy_handle *Cluster)
+ struct policy_handle *Cluster,
+ enum clusapi_ClusterControlCode dwControlCode)
{
struct dcerpc_binding_handle *b = p->binding_handle;
struct clusapi_ClusterControl r;
@@ -2243,7 +2244,7 @@ static bool test_ClusterControl_int(struct torture_context *tctx,
WERR_INVALID_FUNCTION,
"ClusterControl failed");
- r.in.dwControlCode = CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES;
+ r.in.dwControlCode = dwControlCode;
torture_assert_ntstatus_ok(tctx,
dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
@@ -2263,7 +2264,7 @@ static bool test_ClusterControl_int(struct torture_context *tctx,
/* now try what happens when we query with a buffer large enough to hold
* the entire packet */
- r.in.nOutBufferSize = 0x400;
+ r.in.nOutBufferSize = 0xffff;
r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize);
torture_assert_ntstatus_ok(tctx,
@@ -2285,13 +2286,27 @@ static bool test_ClusterControl(struct torture_context *tctx,
talloc_get_type_abort(data, struct torture_clusapi_context);
struct policy_handle Cluster;
bool ret;
+ uint32_t control_codes[] = {
+ CLUSCTL_CLUSTER_GET_COMMON_PROPERTIES,
+ CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES,
+ CLUSCTL_CLUSTER_GET_FQDN,
+ CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTIES
+ };
+ int i;
if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
return false;
}
- ret = test_ClusterControl_int(tctx, t->p, &Cluster);
+ for (i=0; i < ARRAY_SIZE(control_codes); i++) {
+ ret = test_ClusterControl_int(tctx, t->p, &Cluster,
+ control_codes[i]);
+ if (!ret) {
+ goto done;
+ }
+ }
+ done:
test_CloseCluster_int(tctx, t->p, &Cluster);
return ret;
--
2.7.4
From 7b0df3793a817809126b35210f2329ed9f6cd095 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Mon, 2 May 2016 17:07:04 +0200
Subject: [PATCH 02/13] librpc: add clusapi_ResourceTypeControlCode enum.
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
librpc/idl/clusapi.idl | 44 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 43 insertions(+), 1 deletion(-)
diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl
index 8c4a227..38552c4 100644
--- a/librpc/idl/clusapi.idl
+++ b/librpc/idl/clusapi.idl
@@ -1078,11 +1078,53 @@ import "winreg.idl", "misc.idl";
/*****************/
/* Function 0x4B */
+ typedef [v1_enum] enum {
+ CLUSCTL_RESOURCE_TYPE_UNKNOWN = 0x02000000,
+ CLUSCTL_RESOURCE_TYPE_GET_CHARACTERISTICS = 0x02000005,
+ CLUSCTL_RESOURCE_TYPE_GET_FLAGS = 0x02000009,
+ CLUSCTL_RESOURCE_TYPE_GET_CLASS_INFO = 0x0200000D,
+ CLUSCTL_RESOURCE_TYPE_GET_REQUIRED_DEPENDENCIES = 0x02000011,
+ CLUSCTL_RESOURCE_TYPE_GET_ARB_TIMEOUT = 0x02000015,
+ CLUSCTL_RESOURCE_TYPE_ENUM_COMMON_PROPERTIES = 0x02000051,
+ CLUSCTL_RESOURCE_TYPE_GET_RO_COMMON_PROPERTIES = 0x02000055,
+ CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTIES = 0x02000059,
+ CLUSCTL_RESOURCE_TYPE_SET_COMMON_PROPERTIES = 0x0240005E,
+ CLUSCTL_RESOURCE_TYPE_VALIDATE_COMMON_PROPERTIES = 0x02000061,
+ CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTY_FMTS = 0x02000065,
+ CLUSCTL_RESOURCE_TYPE_GET_COMMON_RESOURCE_PROPERTY_FMTS = 0x02000069,
+ CLUSCTL_RESOURCE_TYPE_ENUM_PRIVATE_PROPERTIES = 0x02000079,
+ CLUSCTL_RESOURCE_TYPE_GET_RO_PRIVATE_PROPERTIES = 0x0200007D,
+ CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTIES = 0x02000081,
+ CLUSCTL_RESOURCE_TYPE_SET_PRIVATE_PROPERTIES = 0x02400086,
+ CLUSCTL_RESOURCE_TYPE_VALIDATE_PRIVATE_PROPERTIES = 0x02000089,
+ CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTY_FMTS = 0x0200008D,
+ CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_RESOURCE_PROPERTY_FMTS= 0x02000091,
+ CLUSCTL_RESOURCE_TYPE_STORAGE_GET_AVAILABLE_DISKS = 0x02000195,
+ CLUSCTL_RESOURCE_TYPE_NETNAME_VALIDATE_NETNAME = 0x02000235,
+ CLUSCTL_RESOURCE_TYPE_VALIDATE_PATH = 0x02000231,
+ CLUSCTL_RESOURCE_TYPE_GEN_APP_VALIDATE_DIRECTORY = 0x02000239,
+ CLUSCTL_RESOURCE_TYPE_STORAGE_GET_DRIVELETTERS = 0x020001ED,
+ CLUSCTL_RESOURCE_TYPE_STORAGE_GET_AVAILABLE_DISKS_EX = 0x020001F5,
+ CLUSCTL_RESOURCE_TYPE_STORAGE_REMAP_DRIVELETTER = 0x02000201,
+ CLUSCTL_RESOURCE_TYPE_STORAGE_GET_DISKID = 0x02000205,
+ CLUSCTL_RESOURCE_TYPE_STORAGE_IS_CLUSTERABLE = 0x02000209,
+ CLUSCTL_RESOURCE_TYPE_STORAGE_RELEASE_OWNERSHIP = 0x0240020E,
+ CLUSCTL_RESOURCE_TYPE_STORAGE_IS_CSV_FILE = 0x1000229,
+ CLUSCTL_RESOURCE_TYPE_CLOUD_WITNESS_VALIDATE_CREDENTIALS= 0x020020e1,
+ CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_ELIGIBLE_LOGDISKS = 0x02002149,
+ CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_ELIGIBLE_TARGET_DATADISKS = 0x0200214D,
+ CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_ELIGIBLE_SOURCE_DATADISKS = 0x02002151,
+ CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_REPLICA_VOLUMES = 0x02002159,
+ CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_LOG_VOLUME = 0x0200215D,
+ CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_REPLICATED_DISKS = 0x02002155,
+ CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_RESOURCE_GROUP = 0x02002161
+ } clusapi_ResourceTypeControlCode;
+
WERROR
clusapi_ResourceTypeControl(
[ in ] HCLUSTER_RPC hCluster,
[ in, string ] [charset(UTF16)] uint16 *lpszResourceTypeName,
- [ in ] uint32 dwControlCode,
+ [ in ] clusapi_ResourceTypeControlCode dwControlCode,
[ in, unique, size_is(nInBufferSize) ] uint8 *lpInBuffer,
[ in ] uint32 nInBufferSize,
[ out, size_is(nOutBufferSize),
--
2.7.4
From 4125ed2e76d2da309ab70eed2edb0d65b662b162 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Mon, 2 May 2016 17:53:38 +0200
Subject: [PATCH 03/13] s4-torture: Fix logic errors in node and group control
clusapi tests.
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
source4/torture/rpc/clusapi.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index 986f263..7b7e06a 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -1522,12 +1522,12 @@ static bool test_NodeControl(struct torture_context *tctx,
}
ret = test_NodeControl_int(tctx, t->p, &hNode, CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES);
- if (ret) {
+ if (!ret) {
return false;
}
ret = test_NodeControl_int(tctx, t->p, &hNode, CLUSCTL_NODE_GET_ID);
- if (ret) {
+ if (!ret) {
return false;
}
@@ -2006,12 +2006,12 @@ static bool test_GroupControl(struct torture_context *tctx,
}
ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_CHARACTERISTICS);
- if (ret) {
+ if (!ret) {
return false;
}
ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_RO_COMMON_PROPERTIES);
- if (ret) {
+ if (!ret) {
return false;
}
--
2.7.4
From 0f92e22ded9b9f8c0cba94992e0c12575fe0cdfa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Tue, 3 May 2016 11:19:38 +0200
Subject: [PATCH 04/13] s4-torture: add new tests for clusapi resourcetypes.
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
source4/torture/rpc/clusapi.c | 176 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 176 insertions(+)
diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index 7b7e06a..73fb4a6 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -1148,6 +1148,129 @@ static bool test_GetResourceNetworkName(struct torture_context *tctx,
return ret;
}
+static bool test_ResourceTypeControl_int(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ struct policy_handle *Cluster,
+ const char *resource_type,
+ enum clusapi_ClusterControlCode dwControlCode)
+{
+ struct dcerpc_binding_handle *b = p->binding_handle;
+ struct clusapi_ResourceTypeControl r;
+ uint32_t lpBytesReturned;
+ uint32_t lpcbRequired;
+ WERROR rpc_status;
+
+ r.in.hCluster = *Cluster;
+ r.in.lpszResourceTypeName = resource_type;
+ r.in.dwControlCode = 0;
+ r.in.lpInBuffer = NULL;
+ r.in.nInBufferSize = 0;
+ r.in.nOutBufferSize = 0;
+ r.out.lpOutBuffer = NULL;
+ r.out.lpBytesReturned = &lpBytesReturned;
+ r.out.lpcbRequired = &lpcbRequired;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
+ "ResourceTypeControl failed");
+
+ if (strequal(r.in.lpszResourceTypeName, "MSMQ") ||
+ strequal(r.in.lpszResourceTypeName, "MSMQTriggers")) {
+ torture_assert_werr_equal(tctx,
+ r.out.result,
+ WERR_CLUSTER_RESTYPE_NOT_SUPPORTED,
+ "ResourceTypeControl failed");
+ return true;
+ }
+
+ torture_assert_werr_equal(tctx,
+ r.out.result,
+ WERR_INVALID_FUNCTION,
+ "ResourceTypeControl failed");
+
+ r.in.dwControlCode = dwControlCode;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
+ "ResourceTypeControl failed");
+
+ if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
+ r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired);
+ r.in.nOutBufferSize = *r.out.lpcbRequired;
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
+ "ResourceTypeControl failed");
+ }
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "ResourceTypeControl failed");
+
+ /* now try what happens when we query with a buffer large enough to hold
+ * the entire packet */
+
+ r.in.nOutBufferSize = 0x400;
+ r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize);
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
+ "ResourceTypeControl failed");
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "ResourceTypeControl failed");
+ torture_assert(tctx, *r.out.lpBytesReturned < r.in.nOutBufferSize,
+ "lpBytesReturned expected to be smaller than input size nOutBufferSize");
+
+ return true;
+}
+
+static bool test_ResourceTypeControl(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ const char *resourcetype_name)
+{
+ struct policy_handle Cluster;
+ bool ret;
+ uint32_t control_codes[] = {
+ CLUSCTL_RESOURCE_TYPE_GET_CLASS_INFO,
+ CLUSCTL_RESOURCE_TYPE_GET_CHARACTERISTICS,
+ CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTIES,
+ CLUSCTL_RESOURCE_TYPE_GET_RO_COMMON_PROPERTIES,
+ CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTIES
+ };
+ int i;
+
+ if (!test_OpenCluster_int(tctx, p, &Cluster)) {
+ return false;
+ }
+
+ for (i=0; i < ARRAY_SIZE(control_codes); i++) {
+ ret = test_ResourceTypeControl_int(tctx, p, &Cluster,
+ resourcetype_name,
+ control_codes[i]);
+ if (!ret) {
+ goto done;
+ }
+ }
+
+ done:
+ test_CloseCluster_int(tctx, p, &Cluster);
+
+ return ret;
+}
+
+
+
+static bool test_one_resourcetype(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ const char *resourcetype_name)
+{
+ torture_assert(tctx,
+ test_ResourceTypeControl(tctx, p, resourcetype_name),
+ "failed to query ResourceTypeControl");
+
+ return true;
+}
+
static bool test_one_resource(struct torture_context *tctx,
struct dcerpc_pipe *p,
const char *resource_name)
@@ -1224,6 +1347,44 @@ static bool test_all_resources(struct torture_context *tctx,
return true;
}
+static bool test_all_resourcetypes(struct torture_context *tctx,
+ void *data)
+{
+ struct torture_clusapi_context *t =
+ talloc_get_type_abort(data, struct torture_clusapi_context);
+ struct dcerpc_binding_handle *b = t->p->binding_handle;
+ struct clusapi_CreateEnum r;
+ uint32_t dwType = CLUSTER_ENUM_RESTYPE;
+ struct ENUM_LIST *ReturnEnum;
+ WERROR rpc_status;
+ int i;
+
+ r.in.dwType = dwType;
+ r.out.ReturnEnum = &ReturnEnum;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
+ "CreateEnum failed");
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "CreateEnum failed");
+
+ for (i=0; i < ReturnEnum->EntryCount; i++) {
+
+ struct ENUM_ENTRY e = ReturnEnum->Entry[i];
+
+ torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_RESTYPE, "type mismatch");
+
+ torture_assert(tctx,
+ test_one_resourcetype(tctx, t->p, e.Name),
+ "failed to test one resourcetype");
+ }
+
+ return true;
+}
+
+
static bool test_OpenNode_int(struct torture_context *tctx,
struct dcerpc_pipe *p,
const char *lpszNodeName,
@@ -3375,6 +3536,12 @@ void torture_tcase_resource(struct torture_tcase *tcase)
test_all_resources);
}
+void torture_tcase_resourcetype(struct torture_tcase *tcase)
+{
+ torture_tcase_add_simple_test(tcase, "all_resourcetypes",
+ test_all_resourcetypes);
+}
+
void torture_tcase_node(struct torture_tcase *tcase)
{
struct torture_test *test;
@@ -3495,6 +3662,15 @@ struct torture_suite *torture_rpc_clusapi(TALLOC_CTX *mem_ctx)
torture_tcase_resource(tcase);
+ tcase = torture_suite_add_tcase(suite, "resourcetype");
+
+ torture_tcase_set_fixture(tcase,
+ torture_rpc_clusapi_setup,
+ torture_rpc_clusapi_teardown);
+
+ torture_tcase_resourcetype(tcase);
+
+
tcase = torture_suite_add_tcase(suite, "node");
torture_tcase_set_fixture(tcase,
--
2.7.4
From 1fcdab7c34a2ce4f6c41ccb9cf75242bcc667bf4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Tue, 3 May 2016 12:58:07 +0200
Subject: [PATCH 05/13] librpc: add ClusterGroupEnumType enum to IDL.
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
librpc/idl/clusapi.idl | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl
index 38552c4..c172aaa 100644
--- a/librpc/idl/clusapi.idl
+++ b/librpc/idl/clusapi.idl
@@ -791,10 +791,15 @@ import "winreg.idl", "misc.idl";
/*****************/
/* Function 0x35 */
+ typedef [bitmap32bit] bitmap {
+ CLUSTER_GROUP_ENUM_CONTAINS = 0x00000001,
+ CLUSTER_GROUP_ENUM_NODES = 0x00000002
+ } ClusterGroupEnumType;
+
WERROR
clusapi_CreateGroupResourceEnum(
[ in ] HGROUP_RPC hGroup,
- [ in ] uint32 dwType,
+ [ in ] ClusterGroupEnumType dwType,
[ out ] ENUM_LIST **ReturnEnum,
[ out ] WERROR *rpc_status
);
--
2.7.4
From 91eb4da9cf8f2dd1d6552d6fd7ea01bda60c5173 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Tue, 3 May 2016 12:59:24 +0200
Subject: [PATCH 06/13] s4-torture: add test for
clusapi_CreateGroupResourceEnum
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
source4/torture/rpc/clusapi.c | 58 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index 73fb4a6..3d5ba62 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2154,6 +2154,60 @@ static bool test_GroupControl_int(struct torture_context *tctx,
return true;
}
+static bool test_CreateGroupResourceEnum_int(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ struct policy_handle *hGroup)
+{
+ struct dcerpc_binding_handle *b = p->binding_handle;
+ struct clusapi_CreateGroupResourceEnum r;
+ uint32_t dwType[] = {
+ CLUSTER_GROUP_ENUM_CONTAINS,
+ CLUSTER_GROUP_ENUM_NODES
+ };
+ uint32_t dwType_invalid[] = {
+ 0x00000040,
+ 0x00000080,
+ 0x00000100 /* and many more ... */
+ };
+ struct ENUM_LIST *ReturnEnum;
+ WERROR rpc_status;
+ int i;
+
+ r.in.hGroup = *hGroup;
+
+ for (i=0; i < ARRAY_SIZE(dwType); i++) {
+
+ r.in.hGroup = *hGroup;
+ r.in.dwType = dwType[i];
+ r.out.ReturnEnum = &ReturnEnum;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_CreateGroupResourceEnum_r(b, tctx, &r),
+ "CreateGroupResourceEnum failed");
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "CreateGroupResourceEnum failed");
+ }
+
+ for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
+
+ r.in.dwType = dwType_invalid[i];
+ r.out.ReturnEnum = &ReturnEnum;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_CreateGroupResourceEnum_r(b, tctx, &r),
+ "CreateGroupResourceEnum failed");
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "CreateGroupResourceEnum failed");
+ }
+
+ return true;
+}
+
+
static bool test_GroupControl(struct torture_context *tctx,
void *data)
{
@@ -2283,6 +2337,10 @@ static bool test_one_group(struct torture_context *tctx,
test_GetGroupState_int(tctx, p, &hGroup),
"failed to query group id");
+ torture_assert(tctx,
+ test_CreateGroupResourceEnum_int(tctx, p, &hGroup),
+ "failed to query resource enum");
+
test_CloseGroup_int(tctx, p, &hGroup);
return true;
--
2.7.4
From 568955d9821bfca39f34d5f36a362f328080b5d9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Tue, 3 May 2016 17:18:40 +0200
Subject: [PATCH 07/13] librpc: add CLUS_RESOURCE_CLASS_INFO to IDL
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
librpc/idl/clusapi.idl | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl
index c172aaa..4988a38 100644
--- a/librpc/idl/clusapi.idl
+++ b/librpc/idl/clusapi.idl
@@ -1047,6 +1047,17 @@ import "winreg.idl", "misc.idl";
/*****************/
/* Function 0x49 */
+ typedef [v1_enum] enum {
+ CLUS_RESCLASS_UNKNOWN = 0x00000000,
+ CLUS_RESCLASS_STORAGE = 0x00000001,
+ CLUS_RESCLASS_NETWORK = 0x00000002
+ } clusapi_ResourceClass;
+
+ typedef [public] struct {
+ clusapi_ResourceClass Class;
+ uint32 SubClass;
+ } CLUS_RESOURCE_CLASS_INFO;
+
WERROR
clusapi_ResourceControl(
[ in ] HRES_RPC hResource,
--
2.7.4
From 30ddf4a628674cf642b14d6a418082213c9abc18 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Tue, 3 May 2016 17:38:29 +0200
Subject: [PATCH 08/13] s4-torture: test CLUSCTL_GROUP_GET_FLAGS GroupControl.
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
source4/torture/rpc/clusapi.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index 3d5ba62..d806dfb 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2230,6 +2230,11 @@ static bool test_GroupControl(struct torture_context *tctx,
return false;
}
+ ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_FLAGS);
+ if (!ret) {
+ return false;
+ }
+
test_CloseGroup_int(tctx, t->p, &hGroup);
return ret;
@@ -2338,6 +2343,10 @@ static bool test_one_group(struct torture_context *tctx,
"failed to query group id");
torture_assert(tctx,
+ test_GroupControl_int(tctx, p, &hGroup, CLUSCTL_GROUP_GET_FLAGS),
+ "failed to query group control");
+
+ torture_assert(tctx,
test_CreateGroupResourceEnum_int(tctx, p, &hGroup),
"failed to query resource enum");
--
2.7.4
From 316f1d3c1d9806223f5ff72ce59e1504bfcf9a26 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Wed, 4 May 2016 00:39:48 +0200
Subject: [PATCH 09/13] s4-torture: add test for CreateResTypeEnum().
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
source4/torture/rpc/clusapi.c | 101 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 101 insertions(+)
diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index d806dfb..f8779f3 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2540,6 +2540,105 @@ static bool test_ClusterControl(struct torture_context *tctx,
return ret;
}
+static bool test_CreateResTypeEnum(struct torture_context *tctx,
+ void *data)
+{
+ struct torture_clusapi_context *t =
+ talloc_get_type_abort(data, struct torture_clusapi_context);
+ struct dcerpc_binding_handle *b = t->p->binding_handle;
+ struct clusapi_CreateResTypeEnum r;
+ uint32_t dwType[] = {
+ CLUSTER_RESOURCE_TYPE_ENUM_NODES,
+ CLUSTER_RESOURCE_TYPE_ENUM_RESOURCES
+ };
+ uint32_t dwType_invalid[] = {
+ 0x00000040,
+ 0x00000080,
+ 0x00000100 /* and many more ... */
+ };
+ const char *valid_names[] = {
+ "Physical Disk",
+ "Storage Pool"
+ };
+ const char *invalid_names[] = {
+ "INVALID_TYPE_XXXX"
+ };
+ struct ENUM_LIST *ReturnEnum;
+ WERROR rpc_status;
+ int i, s;
+
+ for (s = 0; s < ARRAY_SIZE(valid_names); s++) {
+
+ r.in.lpszTypeName = valid_names[s];
+
+ for (i=0; i < ARRAY_SIZE(dwType); i++) {
+
+ r.in.dwType = dwType[i];
+ r.out.ReturnEnum = &ReturnEnum;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
+ "CreateResTypeEnum failed");
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "CreateResTypeEnum failed");
+ }
+
+ for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
+
+ r.in.dwType = dwType_invalid[i];
+ r.out.ReturnEnum = &ReturnEnum;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
+ "CreateResTypeEnum failed");
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "CreateResTypeEnum failed");
+ }
+ }
+
+ for (s = 0; s < ARRAY_SIZE(invalid_names); s++) {
+
+ r.in.lpszTypeName = invalid_names[s];
+
+ for (i=0; i < ARRAY_SIZE(dwType); i++) {
+
+ r.in.dwType = dwType[i];
+ r.out.ReturnEnum = &ReturnEnum;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
+ "CreateResTypeEnum failed");
+ torture_assert_werr_equal(tctx,
+ r.out.result,
+ WERR_CLUSTER_RESOURCE_TYPE_NOT_FOUND,
+ "CreateResTypeEnum failed");
+ }
+
+ for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
+
+ r.in.dwType = dwType_invalid[i];
+ r.out.ReturnEnum = &ReturnEnum;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
+ "CreateResTypeEnum failed");
+ torture_assert_werr_equal(tctx,
+ r.out.result,
+ WERR_CLUSTER_RESOURCE_TYPE_NOT_FOUND,
+ "CreateResTypeEnum failed");
+ }
+ }
+
+
+ return true;
+}
+
static bool test_OpenNetwork_int(struct torture_context *tctx,
struct dcerpc_pipe *p,
const char *lpszNetworkName,
@@ -3556,6 +3655,8 @@ void torture_tcase_cluster(struct torture_tcase *tcase)
test_SetServiceAccountPassword);
torture_tcase_add_simple_test(tcase, "ClusterControl",
test_ClusterControl);
+ torture_tcase_add_simple_test(tcase, "CreateResTypeEnum",
+ test_CreateResTypeEnum);
}
--
2.7.4
From b814a3a1302b505ed057de7dd580e02054839709 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Wed, 4 May 2016 00:40:10 +0200
Subject: [PATCH 10/13] librpc: add ClusterResTypeEnumType to IDL.
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
librpc/idl/clusapi.idl | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl
index 4988a38..f4448d6 100644
--- a/librpc/idl/clusapi.idl
+++ b/librpc/idl/clusapi.idl
@@ -1565,10 +1565,15 @@ import "winreg.idl", "misc.idl";
/*****************/
/* Function 0x67 */
+ typedef [bitmap32bit] bitmap {
+ CLUSTER_RESOURCE_TYPE_ENUM_NODES = 0x00000001,
+ CLUSTER_RESOURCE_TYPE_ENUM_RESOURCES = 0x00000002
+ } ClusterResTypeEnumType;
+
WERROR
clusapi_CreateResTypeEnum(
[ in, string ] [charset(UTF16)] uint16 *lpszTypeName,
- [ in ] uint32 dwType,
+ [ in ] ClusterResTypeEnumType dwType,
[ out ] ENUM_LIST **ReturnEnum,
[ out ] WERROR *rpc_status
);
--
2.7.4
From 73bf03f605c4d5f0232fbfa8be1cdccb27e0c612 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Wed, 4 May 2016 01:34:20 +0200
Subject: [PATCH 11/13] s4-torture: add test for CreateGroupEnum.
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
source4/torture/rpc/clusapi.c | 114 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 114 insertions(+)
diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index f8779f3..a3acb64 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2639,6 +2639,118 @@ static bool test_CreateResTypeEnum(struct torture_context *tctx,
return true;
}
+static bool test_CreateGroupEnum_int(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ struct policy_handle *Cluster,
+ const char **multi_sz,
+ const char **multi_sz_ro)
+{
+ struct dcerpc_binding_handle *b = p->binding_handle;
+ struct clusapi_CreateGroupEnum r;
+ struct GROUP_ENUM_LIST *pResultList;
+ WERROR rpc_status;
+ DATA_BLOB blob = data_blob_null;
+ DATA_BLOB blob_ro = data_blob_null;
+
+ r.in.hCluster = *Cluster;
+ r.in.pProperties = blob.data;
+ r.in.cbProperties = blob.length;
+ r.in.pRoProperties = blob_ro.data;
+ r.in.cbRoProperties = blob_ro.length;
+ r.out.ppResultList = &pResultList;
+ r.out.rpc_status = &rpc_status;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_CreateGroupEnum_r(b, tctx, &r),
+ "CreateGroupEnum failed");
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "CreateGroupEnum failed");
+
+ if (!push_reg_multi_sz(tctx, &blob, multi_sz)) {
+ return false;
+ }
+
+ if (!push_reg_multi_sz(tctx, &blob_ro, multi_sz_ro)) {
+ return false;
+ }
+
+ r.in.pProperties = blob.data;
+ r.in.cbProperties = blob.length;
+
+ r.in.pRoProperties = blob_ro.data;
+ r.in.cbRoProperties = blob_ro.length;
+
+ torture_assert_ntstatus_ok(tctx,
+ dcerpc_clusapi_CreateGroupEnum_r(b, tctx, &r),
+ "CreateGroupEnum failed");
+ torture_assert_werr_ok(tctx,
+ r.out.result,
+ "CreateGroupEnum failed");
+
+#if 0
+ {
+ int i;
+ enum ndr_err_code ndr_err;
+
+ for (i=0; i < pResultList->EntryCount; i++) {
+ struct clusapi_PROPERTY_LIST list;
+ torture_comment(tctx, "entry #%d\n", i);
+
+ blob = data_blob_const(pResultList->Entry[i].Properties,
+ pResultList->Entry[i].cbProperties);
+
+ ndr_err = ndr_pull_struct_blob(&blob, tctx, &list,
+ (ndr_pull_flags_fn_t)ndr_pull_clusapi_PROPERTY_LIST);
+ if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ NDR_PRINT_DEBUG(clusapi_PROPERTY_LIST, &list);
+ }
+
+ blob_ro = data_blob_const(pResultList->Entry[i].RoProperties,
+ pResultList->Entry[i].cbRoProperties);
+
+ ndr_err = ndr_pull_struct_blob(&blob_ro, tctx, &list,
+ (ndr_pull_flags_fn_t)ndr_pull_clusapi_PROPERTY_LIST);
+ if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ NDR_PRINT_DEBUG(clusapi_PROPERTY_LIST, &list);
+ }
+ }
+ }
+#endif
+
+ return true;
+}
+
+static bool test_CreateGroupEnum(struct torture_context *tctx,
+ void *data)
+{
+ struct torture_clusapi_context *t =
+ talloc_get_type_abort(data, struct torture_clusapi_context);
+ struct policy_handle Cluster;
+ bool ret;
+ const char *multi_sz[] = {
+ "Priority", NULL,
+ };
+ const char *multi_sz_ro[] = {
+ "GroupType", NULL,
+ };
+
+ if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
+ return false;
+ }
+
+ ret = test_CreateGroupEnum_int(tctx, t->p, &Cluster,
+ multi_sz, multi_sz_ro);
+ if (!ret) {
+ goto done;
+ }
+
+ done:
+ test_CloseCluster_int(tctx, t->p, &Cluster);
+
+ return ret;
+}
+
static bool test_OpenNetwork_int(struct torture_context *tctx,
struct dcerpc_pipe *p,
const char *lpszNetworkName,
@@ -3657,6 +3769,8 @@ void torture_tcase_cluster(struct torture_tcase *tcase)
test_ClusterControl);
torture_tcase_add_simple_test(tcase, "CreateResTypeEnum",
test_CreateResTypeEnum);
+ torture_tcase_add_simple_test(tcase, "CreateGroupEnum",
+ test_CreateGroupEnum);
}
--
2.7.4
From c95c84eca9e083b8872b493bc598cf7091957b83 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Sat, 7 May 2016 01:24:28 +0200
Subject: [PATCH 12/13] s4-torture: also test CLUSCTL_CLUSTER_CHECK_VOTER_DOWN.
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
source4/torture/rpc/clusapi.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index a3acb64..eebfa38 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2518,7 +2518,8 @@ static bool test_ClusterControl(struct torture_context *tctx,
CLUSCTL_CLUSTER_GET_COMMON_PROPERTIES,
CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES,
CLUSCTL_CLUSTER_GET_FQDN,
- CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTIES
+ CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTIES,
+ CLUSCTL_CLUSTER_CHECK_VOTER_DOWN
};
int i;
--
2.7.4
From fdbf559b12f21eea28d8c7270d20e82cb64f7b55 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Wed, 11 May 2016 14:18:02 +0200
Subject: [PATCH 13/13] librpc: add clusapi_ResourceControlCode to IDL.
Guenther
Signed-off-by: Guenther Deschner <gd at samba.org>
---
librpc/idl/clusapi.idl | 64 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 63 insertions(+), 1 deletion(-)
diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl
index f4448d6..6c86f10 100644
--- a/librpc/idl/clusapi.idl
+++ b/librpc/idl/clusapi.idl
@@ -1058,10 +1058,72 @@ import "winreg.idl", "misc.idl";
uint32 SubClass;
} CLUS_RESOURCE_CLASS_INFO;
+ typedef [v1_enum] enum {
+ CLUSCTL_RESOURCE_UNKNOWN = 0x01000000,
+ CLUSCTL_RESOURCE_GET_CHARACTERISTICS = 0x01000005,
+ CLUSCTL_RESOURCE_GET_FLAGS = 0x01000009,
+ CLUSCTL_RESOURCE_GET_CLASS_INFO = 0x0100000D,
+ CLUSCTL_RESOURCE_GET_REQUIRED_DEPENDENCIES = 0x01000011,
+ CLUSCTL_RESOURCE_GET_NAME = 0x01000029,
+ CLUSCTL_RESOURCE_GET_RESOURCE_TYPE = 0x0100002D,
+ CLUSCTL_RESOURCE_GET_ID = 0x01000039,
+ CLUSCTL_RESOURCE_ENUM_COMMON_PROPERTIES = 0x01000051,
+ CLUSCTL_RESOURCE_GET_RO_COMMON_PROPERTIES = 0x01000055,
+ CLUSCTL_RESOURCE_GET_COMMON_PROPERTIES = 0x01000059,
+ CLUSCTL_RESOURCE_SET_COMMON_PROPERTIES = 0x0140005E,
+ CLUSCTL_RESOURCE_VALIDATE_COMMON_PROPERTIES = 0x01000061,
+ CLUSCTL_RESOURCE_GET_COMMON_PROPERTY_FMTS = 0x01000065,
+ CLUSCTL_RESOURCE_ENUM_PRIVATE_PROPERTIES = 0x01000079,
+ CLUSCTL_RESOURCE_GET_RO_PRIVATE_PROPERTIES = 0x0100007D,
+ CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTIES = 0x01000081,
+ CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES = 0x01400086,
+ CLUSCTL_RESOURCE_VALIDATE_PRIVATE_PROPERTIES = 0x01000089,
+ CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTY_FMTS = 0x0100008D,
+ CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT = 0x014000A2,
+ CLUSCTL_RESOURCE_DELETE_REGISTRY_CHECKPOINT = 0x014000A6,
+ CLUSCTL_RESOURCE_GET_REGISTRY_CHECKPOINTS = 0x010000A9,
+ CLUSCTL_RESOURCE_ADD_CRYPTO_CHECKPOINT = 0x014000AE,
+ CLUSCTL_RESOURCE_DELETE_CRYPTO_CHECKPOINT = 0x014000B2,
+ CLUSCTL_RESOURCE_GET_CRYPTO_CHECKPOINTS = 0x010000B5,
+ CLUSCTL_RESOURCE_UPGRADE_DLL = 0x014000BA,
+ CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT_64BIT = 0x014000BE,
+ CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT_32BIT = 0x014000C2,
+ CLUSCTL_RESOURCE_GET_NETWORK_NAME = 0x01000169,
+ CLUSCTL_RESOURCE_NETNAME_REGISTER_DNS_RECORDS = 0x01000172,
+ CLUSCTL_RESOURCE_GET_DNS_NAME = 0x01000175,
+ CLUSCTL_RESOURCE_NETNAME_SET_PWD_INFO = 0x0100017A,
+ CLUSCTL_RESOURCE_NETNAME_DELETE_CO = 0x0100017E,
+ CLUSCTL_RESOURCE_NETNAME_VALIDATE_VCO = 0x01000181,
+ CLUSCTL_RESOURCE_NETNAME_RESET_VCO = 0x01000185,
+ CLUSCTL_RESOURCE_NETNAME_CREDS_UPDATED = 0x01c0018a,
+ CLUSCTL_RESOURCE_STORAGE_GET_DISK_INFO = 0x01000191,
+ CLUSCTL_RESOURCE_STORAGE_IS_PATH_VALID = 0x01000199,
+ CLUSCTL_RESOURCE_IPADDRESS_RENEW_LEASE = 0x014001BE,
+ CLUSCTL_RESOURCE_IPADDRESS_RELEASE_LEASE = 0x014001C2,
+ CLUSCTL_RESOURCE_QUERY_MAINTENANCE_MODE = 0x010001E1,
+ CLUSCTL_RESOURCE_SET_MAINTENANCE_MODE = 0x014001E6,
+ CLUSCTL_RESOURCE_STORAGE_SET_DRIVELETTER = 0x014001EA,
+ CLUSCTL_RESOURCE_STORAGE_GET_DISK_INFO_EX = 0x010001F1,
+ CLUSCTL_RESOURCE_STORAGE_GET_DIRTY = 0x01000219,
+ CLUSCTL_RESOURCE_STORAGE_GET_MOUNTPOINTS = 0x01000211,
+ CLUSCTL_RESOURCE_STORAGE_GET_SHARED_VOLUME_INFO = 0x01000225,
+ CLUSCTL_RESOURCE_VM_START_MIGRATION = 0x01600004,
+ CLUSCTL_RESOURCE_VM_CANCEL_MIGRATION = 0x01600008,
+ CLUSCTL_RESOURCE_SET_CSV_MAINTENANCE_MODE = 0x01400296,
+ CLUSCTL_RESOURCE_ENABLE_SHARED_VOLUME_DIRECTIO = 0x0140028a,
+ CLUSCTL_RESOURCE_DISABLE_SHARED_VOLUME_DIRECTIO = 0x0140028e,
+ CLUSCTL_RESOURCE_SET_SHARED_VOLUME_BACKUP_MODE = 0x0140029a,
+ CLUSCTL_RESOURCE_GET_RELATED_RESOURCE_NAMES = 0x01001fad,
+ CLUSCTL_RESOURCE_POOL_GET_DRIVE_INFO = 0x010002b5,
+ CLUSCTL_RESOURCE_CLOUD_WITNESS_UPDATE_TOKEN = 0x014020e6,
+ CLUSCTL_RESOURCE_NETNAME_CHECK_OU_PERMISSIONS = 0x07002121,
+ CLUSCTL_RESOURCE_NETNAME_CHECK_AD_STATE = 0x07002125
+ } clusapi_ResourceControlCode;
+
WERROR
clusapi_ResourceControl(
[ in ] HRES_RPC hResource,
- [ in ] uint32 dwControlCode,
+ [ in ] clusapi_ResourceControlCode dwControlCode,
[ in, unique, size_is(nInBufferSize) ] uint8 *lpInBuffer,
[ in ] uint32 nInBufferSize,
[ out, size_is(nOutBufferSize),
--
2.7.4
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20160727/559172ba/signature.sig>
More information about the samba-technical
mailing list