Issue #12199 has been updated by Dominic Cleal.


David Schmitt wrote:
> Dominic Cleal wrote:
> > Looking through the results, the problem seems to come in whenever an 
> > ending quote or space exists, and there are more characters beyond it - is 
> > that it?
> 
> That's the obvious problem. The other problem is, that it's impossible to 
> create a value that contains both kinds of quotes.

Ah yes, that's what I'm working on upstream in the same branch.

> I'd prefer something like this
> 
>     "a 'b' \\c \"d\"'
> 
> which is still ugly as it needs even more back-slashing in a puppet manifest, 
> but it is much more aligned with what the rest of posix was doing the last 
> 30+ years. Also it would facilitate the augeas_quote function as it is easily 
> created by s/["\\]/\\&/ and adding quotes.

Yes, both methods will be valid with the changes in Augeas, but we'd need to 
reapply them to Puppet until the parser is removed.  The augeas_quote function 
could be added then too, which would be nice.

Daniel Pittman wrote:
> David Schmitt wrote:
> > 2. Improved datastructure
> > 
> >     command => [ set, $path, $arg ]
> > 
> > I'd prefer the second form (see execve(2) vs. system(3)), but I'm only 
> > starting with augeas, so you might want to get a second opinion.
> 
> I strongly lean to the second form, also, which is much saner: it avoids 
> having any sort of parsing, or escaping, in the system - which is really 
> something that we don't want, because it adds stupendous amounts of 
> complexity to the system.

That's a fair request, it's a simpler method.

I'd like to see the current method remain supported though, as it enables 
people to copy + paste commands between augtool and Puppet for testing without 
needing to convert between styles.  This is probably the biggest issue with the 
provider today, which is why I've been working to make augtool compatible with 
the Puppet provider's parsing, adding context support etc, removing the gap 
between the two tools.

My only worry then is compatibility, as the type's `changes` parameter takes a 
single string, or an array of strings for multiple commands.  Adding this would 
make an array of strings ambiguous - either it's an array of commands, or a 
single command split by arguments.  Perhaps a second parameter would be needed?

> Ultimately, if we can't invoke Augeas directly from the array, the type / 
> provider should be able to take the nicely separated strings, paste them 
> together, quote them, and pass them on - strictly internally, so that the 
> complexity of quoting is entirely hidden from the user in the Puppet DSL.

The commands should be present in ruby-augeas on the Augeas object, so it 
should just be a case of calling the method by the same name given in arg[0].  
The downsides remain the same as today though: you rely on ruby-augeas to be up 
to date and you need a list of known commands in the Puppet provider too, in 
order to process path contexts - or we make the provider rely on Augeas 0.10.0 
for the context feature.

(My plan for aug_srun to replace the parsing in the provider was to remove 
these two dependencies, so the parser that already exists for augtool is reused 
to parse these strings.)
----------------------------------------
Bug #12199: augeas type should use arrays, not parsed strings, to represent 
operations.
https://projects.puppetlabs.com/issues/12199

Author: David Schmitt
Status: Accepted
Priority: Normal
Assignee: 
Category: augeas
Target version: 
Affected Puppet version: 2.6.2
Keywords: 
Branch: 


A simple augeas { '...': changes => 'set ... xxx' } can fail to put the 
complete value into the target while wrongly reporting a successful application.

Example manifest:

        define puppet::conf ($ensure) {
                augeas {
                        "puppet.conf_${name}" :
                                changes => "set 
/files/etc/puppet/puppet.conf/${name} ${ensure}" ;
                        "puppet.conf_${name}_sq" :
                                changes => "set 
/files/etc/puppet/puppet.conf/${name}_sq '${ensure}'" ;
                        "puppet.conf_${name}_dq" :
                                changes => "set 
/files/etc/puppet/puppet.conf/${name}_dq \"${ensure}\"" ;
                }
        }

        puppet::conf {
                "agent/server" :
                        ensure => 'puppetmaster-dev.edvbus' ;

                "agent/pluginsync" :
                        ensure => 'true' ;

                "test/sq" :
                        ensure => "'" ;
                "test/sqsq" :
                        ensure => "''" ;
                "test/sqsqsq" :
                        ensure => "'''" ;
                "test/sqsqsqsq" :
                        ensure => "''''" ;
                "test/dq" :
                        ensure => '"' ;
                "test/dqdq" :
                        ensure => '""' ;
                "test/dqdqdq" :
                        ensure => '"""' ;
                "test/dqdqdqdq" :
                        ensure => '""""' ;
                "test/truncated_dq" :
                        ensure => '"s"bc"d"ef' ;
                "test/truncated_sq" :
                        ensure => "'s'bc'd'ef" ;
                "test/truncated_dq_mix" :
                        ensure => '"s"bc\'d\'ef' ;
                "test/truncated_sq_mix" :
                        ensure => "'s'bc\"d\"ef" ;
                "test/truncated_space" :
                        ensure => "before after" ;                      
                "test/mix" :
                        ensure => "a\"b'c\"d'e" ;                       
        }

Result in /etc/puppet/puppet.conf (sorted for convenience): 

    [test]
    dqdqdqdq_sq=""""
    dqdqdq_sq="""
    dqdq_sq=""
    dq_sq="
    mix=a"b'c"d'e
    mix_dq=a
    mix_sq=a"b
    sq_dq='
    sqsq_dq=''
    sqsqsq_dq='''
    sqsqsqsq_dq=''''
    truncated_dq_mix=s
    truncated_dq_mix_sq="s"bc
    truncated_dq=s
    truncated_dq_sq="s"bc"d"ef
    truncated_space=before
    truncated_space_dq=before after
    truncated_space_sq=before after
    truncated_sq_dq='s'bc'd'ef
    truncated_sq_mix_dq='s'bc
    truncated_sq_mix=s
    truncated_sq=s

    
As you can see, depending on the used quoting style, different parts of the 
values are silently truncated. Only values that cannot be written at all into 
the file cause an error.

I've tested this with 2.6. on squeeze and 2.7.10 on centos 6.2 with the same 
results.


-- 
You have received this notification because you have either subscribed to it, 
or are involved in it.
To change your notification preferences, please click here: 
http://projects.puppetlabs.com/my/account

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Bugs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-bugs?hl=en.

Reply via email to