On 12/09/19 09:27 +0200, Ulrich Windl wrote:
>>>> Jan Pokorný <jpoko...@redhat.com> schrieb am 10.09.2019 um 17:38
>>>> in Nachricht <20190910153832.gj29...@redhat.com>:
>> 
>> Just looking at how to provisionally satisfy the needs here, I can
>> suggest this "one-liner" as a filter to let the to-archive-copies
>> through (depending on the aposteriori diff):
>> 
>>   { xsltproc - <(cibadmin -Q) | cat; } <<EOF
>>   <xsl:stylesheet version="1.0" 
>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>>     <xsl:template match="@*|node()">
>>       <xsl:copy>
>>         <xsl:apply-templates select="@*|node()"/>
>>       </xsl:copy>
>>     </xsl:template>
>>     <xsl:template match="status|nvpair[@name='last-lrm-refresh']
>>                          |text()[preceding-sibling::*[
>>                            name() = 'status'
>>                            or
>>                            name() = 'nvpair' and @name='last-lrm-refresh'
>>                          ]]"/>
>>   </xsl:stylesheet>
>>   EOF
>> 
> 
> [...]
>> plain POSIX shell.  The additional complexity stems from the desire
>> so as not to keep blank lines where anything got filtered out.
> 
> Actually it "eats up" the line break and identation before
> </cluster_property_set> also, like here:
> 
>        <nvpair name="stonith-enabled" value="true"
> id="cib-bootstrap-options-stonith-enabled"/>
>        <nvpair name="placement-strategy" value="utilization"
> id="cib-bootstrap-options-placement-strategy"/>
> -      <nvpair id="cib-bootstrap-options-last-lrm-refresh"
> name="last-lrm-refresh" value="1567945827"/>
> -      <nvpair name="maintenance-mode" value="false"
> id="cib-bootstrap-options-maintenance-mode"/>
> -    </cluster_property_set>
> +      <nvpair name="maintenance-mode" value="false"
> id="cib-bootstrap-options-maintenance-mode"/></cluster_property_set>
>    </crm_config>
>    <nodes>

Good spot :-)

Untested fix (you'll get the idea, check just the first match element
on the preceding-sibling axis):

  { xsltproc - <(cibadmin -Q) | cat; } <<EOF
  <xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
    <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:template>
    <xsl:template match="status|nvpair[@name='last-lrm-refresh']
                         |text()[preceding-sibling::*[1][
                           name() = 'status'
                           or
                           name() = 'nvpair' and @name='last-lrm-refresh'
                         ]]"/>
  </xsl:stylesheet>
  EOF

Some wiggling around this idea would certainly lead to desired results.
OTOH, if you backfeed that output back to crm (to get the reinstating
sequence), whitespaces are pretty irrelevant, allowing for vast
simplification.

And when you are after the actual XML diff, text-based diff is
a *bad choice* in general anyway.  An identical XML content can be
expressed with a countless number of variations in the serialized
form (plain text projection), and you are really interested in the
semantical identity only.  That text-based diff more or less work
is rather an implementation detail not to be relied upon across
SW updates, etc. (libxml2-specific environment variables could affect
the output as well!).  There are multiple "XML diff" tools, perhaps
even crm_diff would do (but specialities like comments, processing
instructions etc. may not work well with it, admittedly they probably
won't be present to begin with).

-- 
Poki

Attachment: pgptzqob81yLk.pgp
Description: PGP signature

_______________________________________________
Manage your subscription:
https://lists.clusterlabs.org/mailman/listinfo/users

ClusterLabs home: https://www.clusterlabs.org/

Reply via email to