|
|
356a11 |
From cef0ff51879e965c3b7d214a23b61e6bf61aa33d Mon Sep 17 00:00:00 2001
|
|
|
356a11 |
From: Ken Gaillot <kgaillot@redhat.com>
|
|
|
356a11 |
Date: Thu, 17 Aug 2017 15:53:27 -0500
|
|
|
356a11 |
Subject: [PATCH 1/3] Refactor: crmd,pengine: prefix internal node attributes
|
|
|
356a11 |
with '#'
|
|
|
356a11 |
|
|
|
356a11 |
so crm_mon will hide them. Also, define constants for them.
|
|
|
356a11 |
|
|
|
356a11 |
As a positive side effect, node_unfenced is no longer added as a
|
|
|
356a11 |
meta-attribute to stonith "on" operations.
|
|
|
356a11 |
---
|
|
|
356a11 |
crmd/te_callbacks.c | 14 +++++---------
|
|
|
356a11 |
include/crm/crm.h | 5 +++++
|
|
|
356a11 |
include/crm/msg_xml.h | 3 ++-
|
|
|
356a11 |
lib/pengine/utils.c | 12 ++++++++----
|
|
|
356a11 |
pengine/native.c | 4 ++--
|
|
|
356a11 |
pengine/test10/start-then-stop-with-unfence.xml | 2 +-
|
|
|
356a11 |
pengine/test10/unfence-definition.exp | 2 +-
|
|
|
356a11 |
pengine/test10/unfence-definition.xml | 4 ++--
|
|
|
356a11 |
pengine/test10/unfence-parameters.exp | 2 +-
|
|
|
356a11 |
pengine/test10/unfence-parameters.xml | 4 ++--
|
|
|
356a11 |
pengine/test10/unfence-startup.xml | 4 ++--
|
|
|
356a11 |
11 files changed, 31 insertions(+), 25 deletions(-)
|
|
|
356a11 |
|
|
|
356a11 |
diff --git a/crmd/te_callbacks.c b/crmd/te_callbacks.c
|
|
|
356a11 |
index 4476d4a..2273b86 100644
|
|
|
356a11 |
--- a/crmd/te_callbacks.c
|
|
|
356a11 |
+++ b/crmd/te_callbacks.c
|
|
|
356a11 |
@@ -798,21 +797,17 @@ tengine_stonith_callback(stonith_t * stonith, stonith_callback_data_t * data)
|
|
|
356a11 |
if (action->confirmed == FALSE) {
|
|
|
356a11 |
te_action_confirmed(action);
|
|
|
356a11 |
if (safe_str_eq("on", op)) {
|
|
|
356a11 |
- const char *key = NULL;
|
|
|
356a11 |
const char *value = NULL;
|
|
|
356a11 |
char *now = crm_itoa(time(NULL));
|
|
|
356a11 |
|
|
|
356a11 |
- key = XML_NODE_IS_UNFENCED;
|
|
|
356a11 |
- update_attrd(target, key, now, NULL, FALSE);
|
|
|
356a11 |
+ update_attrd(target, CRM_ATTR_UNFENCED, now, NULL, FALSE);
|
|
|
356a11 |
free(now);
|
|
|
356a11 |
|
|
|
356a11 |
- key = "digests-all";
|
|
|
356a11 |
- value = crm_meta_value(action->params, key);
|
|
|
356a11 |
- update_attrd(target, key, value, NULL, FALSE);
|
|
|
356a11 |
+ value = crm_meta_value(action->params, XML_OP_ATTR_DIGESTS_ALL);
|
|
|
356a11 |
+ update_attrd(target, CRM_ATTR_DIGESTS_ALL, value, NULL, FALSE);
|
|
|
356a11 |
|
|
|
356a11 |
- key = "digests-secure";
|
|
|
356a11 |
- value = crm_meta_value(action->params, key);
|
|
|
356a11 |
- update_attrd(target, key, value, NULL, FALSE);
|
|
|
356a11 |
+ value = crm_meta_value(action->params, XML_OP_ATTR_DIGESTS_SECURE);
|
|
|
356a11 |
+ update_attrd(target, CRM_ATTR_DIGESTS_SECURE, value, NULL, FALSE);
|
|
|
356a11 |
|
|
|
356a11 |
} else if (action->sent_update == FALSE) {
|
|
|
356a11 |
send_stonith_update(action, target, uuid);
|
|
|
356a11 |
diff --git a/include/crm/crm.h b/include/crm/crm.h
|
|
|
356a11 |
index 0da6bfe..35ab6ca 100644
|
|
|
356a11 |
--- a/include/crm/crm.h
|
|
|
356a11 |
+++ b/include/crm/crm.h
|
|
|
356a11 |
@@ -94,6 +94,11 @@ extern char *crm_system_name;
|
|
|
356a11 |
# define CRM_SYSTEM_STONITHD "stonithd"
|
|
|
356a11 |
# define CRM_SYSTEM_MCP "pacemakerd"
|
|
|
356a11 |
|
|
|
356a11 |
+// Names of internally generated node attributes
|
|
|
356a11 |
+# define CRM_ATTR_UNFENCED "#node-unfenced"
|
|
|
356a11 |
+# define CRM_ATTR_DIGESTS_ALL "#digests-all"
|
|
|
356a11 |
+# define CRM_ATTR_DIGESTS_SECURE "#digests-secure"
|
|
|
356a11 |
+
|
|
|
356a11 |
/* Valid operations */
|
|
|
356a11 |
# define CRM_OP_NOOP "noop"
|
|
|
356a11 |
|
|
|
356a11 |
diff --git a/include/crm/msg_xml.h b/include/crm/msg_xml.h
|
|
|
356a11 |
index 8cf22f3..38183b5 100644
|
|
|
356a11 |
--- a/include/crm/msg_xml.h
|
|
|
356a11 |
+++ b/include/crm/msg_xml.h
|
|
|
356a11 |
@@ -228,6 +234,8 @@
|
|
|
356a11 |
# define XML_OP_ATTR_DEPENDENT "dependent-on"
|
|
|
356a11 |
# define XML_OP_ATTR_ORIGIN "interval-origin"
|
|
|
356a11 |
# define XML_OP_ATTR_PENDING "record-pending"
|
|
|
356a11 |
+# define XML_OP_ATTR_DIGESTS_ALL "digests-all"
|
|
|
356a11 |
+# define XML_OP_ATTR_DIGESTS_SECURE "digests-secure"
|
|
|
356a11 |
|
|
|
356a11 |
# define XML_CIB_TAG_LRM "lrm"
|
|
|
356a11 |
# define XML_LRM_TAG_RESOURCES "lrm_resources"
|
|
|
356a11 |
@@ -254,7 +264,6 @@
|
|
|
356a11 |
# define XML_NODE_IS_PEER "crmd"
|
|
|
356a11 |
# define XML_NODE_IS_REMOTE "remote_node"
|
|
|
356a11 |
# define XML_NODE_IS_FENCED "node_fenced"
|
|
|
356a11 |
-# define XML_NODE_IS_UNFENCED "node_unfenced"
|
|
|
356a11 |
# define XML_NODE_IS_MAINTENANCE "node_in_maintenance"
|
|
|
356a11 |
|
|
|
356a11 |
# define XML_CIB_ATTR_SHUTDOWN "shutdown"
|
|
|
356a11 |
diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c
|
|
|
356a11 |
index cb1ed08..848b311 100644
|
|
|
356a11 |
--- a/lib/pengine/utils.c
|
|
|
356a11 |
+++ b/lib/pengine/utils.c
|
|
|
356a11 |
@@ -2115,8 +1987,10 @@ fencing_action_digest_cmp(resource_t * rsc, node_t * node, pe_working_set_t * da
|
|
|
356a11 |
char *key = generate_op_key(rsc->id, STONITH_DIGEST_TASK, 0);
|
|
|
356a11 |
op_digest_cache_t *data = rsc_action_digest(rsc, STONITH_DIGEST_TASK, key, node, NULL, data_set);
|
|
|
356a11 |
|
|
|
356a11 |
- const char *digest_all = g_hash_table_lookup(node->details->attrs, "digests-all");
|
|
|
356a11 |
- const char *digest_secure = g_hash_table_lookup(node->details->attrs, "digests-secure");
|
|
|
356a11 |
+ const char *digest_all = g_hash_table_lookup(node->details->attrs,
|
|
|
356a11 |
+ CRM_ATTR_DIGESTS_ALL);
|
|
|
356a11 |
+ const char *digest_secure = g_hash_table_lookup(node->details->attrs,
|
|
|
356a11 |
+ CRM_ATTR_DIGESTS_SECURE);
|
|
|
356a11 |
|
|
|
356a11 |
/* No 'reloads' for fencing device changes
|
|
|
356a11 |
*
|
|
|
356a11 |
@@ -2269,8 +2146,10 @@ pe_fence_op(node_t * node, const char *op, bool optional, const char *reason, pe
|
|
|
356a11 |
digests_secure+digests_secure_offset, max-digests_secure_offset,
|
|
|
356a11 |
"%s:%s:%s,", match->id, (const char*)g_hash_table_lookup(match->meta, XML_ATTR_TYPE), data->digest_secure_calc);
|
|
|
356a11 |
}
|
|
|
356a11 |
- add_hash_param(stonith_op->meta, strdup("digests-all"), digests_all);
|
|
|
356a11 |
- add_hash_param(stonith_op->meta, strdup("digests-secure"), digests_secure);
|
|
|
356a11 |
+ add_hash_param(stonith_op->meta, strdup(XML_OP_ATTR_DIGESTS_ALL),
|
|
|
356a11 |
+ digests_all);
|
|
|
356a11 |
+ add_hash_param(stonith_op->meta, strdup(XML_OP_ATTR_DIGESTS_SECURE),
|
|
|
356a11 |
+ digests_secure);
|
|
|
356a11 |
}
|
|
|
356a11 |
|
|
|
356a11 |
} else {
|
|
|
356a11 |
diff --git a/pengine/native.c b/pengine/native.c
|
|
|
356a11 |
index fdbbf0c..18efa1d 100644
|
|
|
356a11 |
--- a/pengine/native.c
|
|
|
356a11 |
+++ b/pengine/native.c
|
|
|
356a11 |
@@ -2490,7 +2501,7 @@ StopRsc(resource_t * rsc, node_t * next, gboolean optional, pe_working_set_t * d
|
|
|
356a11 |
|
|
|
356a11 |
if(is_set(rsc->flags, pe_rsc_needs_unfencing)) {
|
|
|
356a11 |
action_t *unfence = pe_fence_op(current, "on", TRUE, NULL, data_set);
|
|
|
356a11 |
- const char *unfenced = g_hash_table_lookup(current->details->attrs, XML_NODE_IS_UNFENCED);
|
|
|
356a11 |
+ const char *unfenced = g_hash_table_lookup(current->details->attrs, CRM_ATTR_UNFENCED);
|
|
|
356a11 |
|
|
|
356a11 |
order_actions(stop, unfence, pe_order_implies_first);
|
|
|
356a11 |
if (unfenced == NULL || safe_str_eq("0", unfenced)) {
|
|
|
356a11 |
@@ -2513,7 +2524,7 @@ StartRsc(resource_t * rsc, node_t * next, gboolean optional, pe_working_set_t *
|
|
|
356a11 |
|
|
|
356a11 |
if(is_set(rsc->flags, pe_rsc_needs_unfencing)) {
|
|
|
356a11 |
action_t *unfence = pe_fence_op(next, "on", TRUE, NULL, data_set);
|
|
|
356a11 |
- const char *unfenced = g_hash_table_lookup(next->details->attrs, XML_NODE_IS_UNFENCED);
|
|
|
356a11 |
+ const char *unfenced = g_hash_table_lookup(next->details->attrs, CRM_ATTR_UNFENCED);
|
|
|
356a11 |
|
|
|
356a11 |
order_actions(unfence, start, pe_order_implies_then);
|
|
|
356a11 |
|
|
|
356a11 |
diff --git a/pengine/test10/start-then-stop-with-unfence.xml b/pengine/test10/start-then-stop-with-unfence.xml
|
|
|
356a11 |
index b856250..587b05a 100644
|
|
|
356a11 |
--- a/pengine/test10/start-then-stop-with-unfence.xml
|
|
|
356a11 |
+++ b/pengine/test10/start-then-stop-with-unfence.xml
|
|
|
356a11 |
@@ -95,7 +95,7 @@
|
|
|
356a11 |
<instance_attributes id="status-2">
|
|
|
356a11 |
<nvpair id="status-2-shutdown" name="shutdown" value="0"/>
|
|
|
356a11 |
<nvpair id="status-2-probe_complete" name="probe_complete" value="true"/>
|
|
|
356a11 |
- <nvpair id="status-2-unfenced" name="node_unfenced" value="1234567"/>
|
|
|
356a11 |
+ <nvpair id="status-2-unfenced" name="#node-unfenced" value="1234567"/>
|
|
|
356a11 |
</instance_attributes>
|
|
|
356a11 |
</transient_attributes>
|
|
|
356a11 |
<lrm id="2">
|
|
|
356a11 |
diff --git a/pengine/test10/unfence-definition.exp b/pengine/test10/unfence-definition.exp
|
|
|
356a11 |
index f9ad4c1..4e619fe 100644
|
|
|
356a11 |
--- a/pengine/test10/unfence-definition.exp
|
|
|
356a11 |
+++ b/pengine/test10/unfence-definition.exp
|
|
|
356a11 |
@@ -389,7 +389,7 @@
|
|
|
356a11 |
<synapse id="25">
|
|
|
356a11 |
<action_set>
|
|
|
356a11 |
<crm_event id="2" operation="stonith" operation_key="stonith-virt-1-on" on_node="virt-1" on_node_uuid="1">
|
|
|
356a11 |
- <attributes CRM_meta_node_unfenced="1234567" CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
|
|
|
356a11 |
+ <attributes CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
|
|
|
356a11 |
</crm_event>
|
|
|
356a11 |
</action_set>
|
|
|
356a11 |
<inputs>
|
|
|
356a11 |
diff --git a/pengine/test10/unfence-definition.xml b/pengine/test10/unfence-definition.xml
|
|
|
356a11 |
index cb189cd..90aa3da 100644
|
|
|
356a11 |
--- a/pengine/test10/unfence-definition.xml
|
|
|
356a11 |
+++ b/pengine/test10/unfence-definition.xml
|
|
|
356a11 |
@@ -43,7 +43,7 @@
|
|
|
356a11 |
<node_state id="1" uname="virt-1" in_ccm="true" crmd="online" crm-debug-origin="do_state_transition" join="member" expected="member">
|
|
|
356a11 |
<transient_attributes id="virt-1">
|
|
|
356a11 |
<instance_attributes id="status-virt-1">
|
|
|
356a11 |
- <nvpair id="status-virt-1" name="node_unfenced" value="1234567"/>
|
|
|
356a11 |
+ <nvpair id="status-virt-1" name="#node-unfenced" value="1234567"/>
|
|
|
356a11 |
</instance_attributes>
|
|
|
356a11 |
</transient_attributes>
|
|
|
356a11 |
<lrm id="1">
|
|
|
356a11 |
@@ -63,7 +63,7 @@
|
|
|
356a11 |
<node_state id="2" uname="virt-2" in_ccm="true" crmd="online" crm-debug-origin="do_state_transition" join="member" expected="member">
|
|
|
356a11 |
<transient_attributes id="virt-2">
|
|
|
356a11 |
<instance_attributes id="status-virt-2">
|
|
|
356a11 |
- <nvpair id="unfenced-virt-2" name="node_unfenced" value="1234567"/>
|
|
|
356a11 |
+ <nvpair id="unfenced-virt-2" name="#node-unfenced" value="1234567"/>
|
|
|
356a11 |
</instance_attributes>
|
|
|
356a11 |
</transient_attributes>
|
|
|
356a11 |
<lrm id="2">
|
|
|
356a11 |
diff --git a/pengine/test10/unfence-parameters.exp b/pengine/test10/unfence-parameters.exp
|
|
|
356a11 |
index 64286a8..8022591 100644
|
|
|
356a11 |
--- a/pengine/test10/unfence-parameters.exp
|
|
|
356a11 |
+++ b/pengine/test10/unfence-parameters.exp
|
|
|
356a11 |
@@ -373,7 +373,7 @@
|
|
|
356a11 |
<synapse id="24">
|
|
|
356a11 |
<action_set>
|
|
|
356a11 |
<crm_event id="2" operation="stonith" operation_key="stonith-virt-1-on" on_node="virt-1" on_node_uuid="1">
|
|
|
356a11 |
- <attributes CRM_meta_node_unfenced="1234567" CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
|
|
|
356a11 |
+ <attributes CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
|
|
|
356a11 |
</crm_event>
|
|
|
356a11 |
</action_set>
|
|
|
356a11 |
<inputs>
|
|
|
356a11 |
diff --git a/pengine/test10/unfence-parameters.xml b/pengine/test10/unfence-parameters.xml
|
|
|
356a11 |
index 26588bf..e1975b9 100644
|
|
|
356a11 |
--- a/pengine/test10/unfence-parameters.xml
|
|
|
356a11 |
+++ b/pengine/test10/unfence-parameters.xml
|
|
|
356a11 |
@@ -43,7 +43,7 @@
|
|
|
356a11 |
<node_state id="1" uname="virt-1" in_ccm="true" crmd="online" crm-debug-origin="do_state_transition" join="member" expected="member">
|
|
|
356a11 |
<transient_attributes id="virt-1">
|
|
|
356a11 |
<instance_attributes id="status-virt-1">
|
|
|
356a11 |
- <nvpair id="status-virt-1" name="node_unfenced" value="1234567"/>
|
|
|
356a11 |
+ <nvpair id="status-virt-1" name="#node-unfenced" value="1234567"/>
|
|
|
356a11 |
</instance_attributes>
|
|
|
356a11 |
</transient_attributes>
|
|
|
356a11 |
<lrm id="1">
|
|
|
356a11 |
@@ -63,7 +63,7 @@
|
|
|
356a11 |
<node_state id="2" uname="virt-2" in_ccm="true" crmd="online" crm-debug-origin="do_state_transition" join="member" expected="member">
|
|
|
356a11 |
<transient_attributes id="virt-2">
|
|
|
356a11 |
<instance_attributes id="status-virt-2">
|
|
|
356a11 |
- <nvpair id="status-virt-2" name="node_unfenced" value="1234567"/>
|
|
|
356a11 |
+ <nvpair id="status-virt-2" name="#node-unfenced" value="1234567"/>
|
|
|
356a11 |
</instance_attributes>
|
|
|
356a11 |
</transient_attributes>
|
|
|
356a11 |
<lrm id="2">
|
|
|
356a11 |
diff --git a/pengine/test10/unfence-startup.xml b/pengine/test10/unfence-startup.xml
|
|
|
356a11 |
index 28637e3..69e2df7 100644
|
|
|
356a11 |
--- a/pengine/test10/unfence-startup.xml
|
|
|
356a11 |
+++ b/pengine/test10/unfence-startup.xml
|
|
|
356a11 |
@@ -43,7 +43,7 @@
|
|
|
356a11 |
<node_state id="1" uname="virt-1" in_ccm="true" crmd="online" crm-debug-origin="do_state_transition" join="member" expected="member">
|
|
|
356a11 |
<transient_attributes id="virt-1">
|
|
|
356a11 |
<instance_attributes id="status-virt-1">
|
|
|
356a11 |
- <nvpair id="status-virt-1" name="node_unfenced" value="1234567"/>
|
|
|
356a11 |
+ <nvpair id="status-virt-1" name="#node-unfenced" value="1234567"/>
|
|
|
356a11 |
</instance_attributes>
|
|
|
356a11 |
</transient_attributes>
|
|
|
356a11 |
<lrm id="1">
|
|
|
356a11 |
@@ -63,7 +63,7 @@
|
|
|
356a11 |
<node_state id="2" uname="virt-2" in_ccm="true" crmd="online" crm-debug-origin="do_state_transition" join="member" expected="member">
|
|
|
356a11 |
<transient_attributes id="virt-2">
|
|
|
356a11 |
<instance_attributes id="status-virt-2">
|
|
|
356a11 |
- <nvpair id="status-virt-2" name="node_unfenced" value="1234567"/>
|
|
|
356a11 |
+ <nvpair id="status-virt-2" name="#node-unfenced" value="1234567"/>
|
|
|
356a11 |
</instance_attributes>
|
|
|
356a11 |
</transient_attributes>
|
|
|
356a11 |
<lrm id="2">
|
|
|
356a11 |
--
|
|
|
356a11 |
1.8.3.1
|
|
|
356a11 |
|
|
|
356a11 |
|
|
|
356a11 |
From 8440151215e39a69eea55aae996329a11d7800a5 Mon Sep 17 00:00:00 2001
|
|
|
356a11 |
From: Ken Gaillot <kgaillot@redhat.com>
|
|
|
356a11 |
Date: Thu, 17 Aug 2017 17:38:30 -0500
|
|
|
356a11 |
Subject: [PATCH 2/3] Refactor: libpe_status: remove redundant constant
|
|
|
356a11 |
definition
|
|
|
356a11 |
|
|
|
356a11 |
---
|
|
|
356a11 |
lib/pengine/utils.c | 2 --
|
|
|
356a11 |
1 file changed, 2 deletions(-)
|
|
|
356a11 |
|
|
|
356a11 |
diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c
|
|
|
356a11 |
index 848b311..b5794fb 100644
|
|
|
356a11 |
--- a/lib/pengine/utils.c
|
|
|
356a11 |
+++ b/lib/pengine/utils.c
|
|
|
356a11 |
@@ -2211,8 +2083,6 @@ find_unfencing_devices(GListPtr candidates, GListPtr matches)
|
|
|
356a11 |
}
|
|
|
356a11 |
|
|
|
356a11 |
|
|
|
356a11 |
-#define STONITH_DIGEST_TASK "stonith-on"
|
|
|
356a11 |
-
|
|
|
356a11 |
action_t *
|
|
|
356a11 |
pe_fence_op(node_t * node, const char *op, bool optional, const char *reason, pe_working_set_t * data_set)
|
|
|
356a11 |
{
|
|
|
356a11 |
--
|
|
|
356a11 |
1.8.3.1
|
|
|
356a11 |
|
|
|
356a11 |
|
|
|
356a11 |
From 04656184bcd4598a9b9d83b344c6f9f9cafe4df7 Mon Sep 17 00:00:00 2001
|
|
|
356a11 |
From: Ken Gaillot <kgaillot@redhat.com>
|
|
|
356a11 |
Date: Thu, 17 Aug 2017 17:42:55 -0500
|
|
|
356a11 |
Subject: [PATCH 3/3] Refactor: libpe_status: preserve backward API
|
|
|
356a11 |
compatibility
|
|
|
356a11 |
|
|
|
356a11 |
There isn't a well-defined line in the pengine libraries as to what's part of
|
|
|
356a11 |
the public API, but be on the safe side ...
|
|
|
356a11 |
---
|
|
|
356a11 |
include/crm/pengine/status.h | 3 ++-
|
|
|
356a11 |
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
|
356a11 |
|
|
|
356a11 |
diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h
|
|
|
356a11 |
index fcd5226..b1f4d30 100644
|
|
|
356a11 |
--- a/include/crm/pengine/status.h
|
|
|
356a11 |
+++ b/include/crm/pengine/status.h
|
|
|
356a11 |
@@ -329,7 +329,6 @@ struct pe_action_s {
|
|
|
356a11 |
|
|
|
356a11 |
char *task;
|
|
|
356a11 |
char *uuid;
|
|
|
356a11 |
- char *reason;
|
|
|
356a11 |
char *cancel_task;
|
|
|
356a11 |
|
|
|
356a11 |
enum pe_action_flags flags;
|
|
|
356a11 |
@@ -374,6 +373,8 @@ struct pe_action_s {
|
|
|
356a11 |
|
|
|
356a11 |
GListPtr actions_before; /* action_wrapper_t* */
|
|
|
356a11 |
GListPtr actions_after; /* action_wrapper_t* */
|
|
|
356a11 |
+
|
|
|
356a11 |
+ char *reason;
|
|
|
356a11 |
};
|
|
|
356a11 |
|
|
|
356a11 |
struct ticket_s {
|
|
|
356a11 |
--
|
|
|
356a11 |
1.8.3.1
|
|
|
356a11 |
|