Well, of course. It's lovely ;-)
Paul Krizak wrote:
> > an arcane shell expression
>
> Hey now, I happen to think that the $() syntax is much more elegant than
> those awkward backticks ;-)
>
>
> Paul Krizak 7171 Southwest Pkwy MS B200.3A
> Senior Systems Engineer Austin, TX 78735
> Advanced Micro Devices Desk: (512) 602-8775
> Linux/Unix Systems Engineering Cell: (512) 791-0686
> Silicon Design Division Fax: (512) 602-0468
>
> On 12/11/09 12:33, Mark Burgess wrote:
>> Ok, I have examined this further and you are correct that there is a problem
>> in mistaking
>> an arcane shell expression for an unexpanded variable. This is nothing to do
>> with the
>> parser, it occurs in validation, but I've fixed this at least for new class
>> of cases
>>
>> You may confirm that the current svn works with this code:
>>
>> body common control
>> {
>> bundlesequence => {"configurePhase"};
>> }
>>
>> bundle agent configurePhase
>> {
>> classes:
>>
>> "defs" expression => returnszero("/bin/echo $(const.dollar)(/bin/cat
>> /etc/passwd)>
>> /dev/null","useshell");
>>
>> #commands:
>> # "/bin/echo $(const.dollar)(/bin/cat /etc/passwd)"
>> # contain => shell;
>>
>> reports:
>>
>> defs::
>>
>> "returned zero";
>>
>> !defs::
>>
>> "no shell";
>> }
>>
>> body contain shell
>> {
>> useshell => "true";
>> }
>>
>> Jean-Noël Rivasseau wrote:
>>> Mark,
>>>
>>> this is indeed a bug. Read carefully my example and try it. It fails
>>> because of the ${const.dollar}(cat /etc/hosts), eg
>>> only because ${const.dollar} is followed by ( ... ). In your example you
>>> don't have that, $(const.dollar)y works fine
>>> because it does not reproduce the bug at all. With my example, cf-engine
>>> will *refuse* to run the command and launch the
>>> shell.
>>>
>>> Please try with my example and see for yourself.
>>>
>>>> This is not a bug in cfengine, it is the shell that is turning the $ into
>>>> nothing.
>>>> Cfengine interprets the string correctly and passes it to the shell as
>>>> this shows.
>>>>
>>>> "MyClass" expression = "MyClass" expression => returnszero("/bin/echo
>>>> x
>>>> $(const.dollar)y", "useshell");
>>>>
>>>> x
>>>>
>>>>> returnszero("/bin/echo x $(const.dollar)y", "noshell");
>>>> x $y
>>>>
>>>>
>>>> Jean-Noël Rivasseau wrote:
>>>>> Hello, I discussed this issue in the help ML before but it really
>>>>> appears like it is a bug.
>>>>>
>>>>> Basically, cf-engine chokes on ${const.dollar}( ... ) in command strings
>>>>> passed to returnszero function. However $() in a shell (Bash) can be
>>>>> very useful as it triggers a subshell. There is a bug in the parser
>>>>> somewhere as this example demonstrates:
>>>>>
>>>>> body common control
>>>>> {
>>>>> bundlesequence => {"configurePhase"};
>>>>> }
>>>>>
>>>>> bundle agent configurePhase
>>>>> {
>>>>> classes:
>>>>> "MyClass" expression => returnszero("/bin/echo
>>>>> ${const.dollar}(cat /etc/hosts)", "useshell");
>>>>> "MyClass2" expression => returnszero("/bin/echo `cat
>>>>> /etc/hosts`", "useshell");
>>>>> reports:
>>>>> MyClass::
>>>>> "Hi World";
>>>>> MyClass2::
>>>>> "Hello World";
>>>>> }
>>>>>
>>>>>
>>>>> MyClass2 will correctly be defined, but not MyClass as cf-engine will
>>>>> refuse to run the first command - the parser gets confused and attempts
>>>>> to solve 'cat /etc/hosts' as a variable it seems. I checked this on
>>>>> today's SVN and the problem is still present. Please correct it :)
>>>>>
>>>>> Cheers
>>>>> Jean-Noel
>
> _______________________________________________
> Bug-cfengine mailing list
> [email protected]
> https://cfengine.org/mailman/listinfo/bug-cfengine
--
Mark Burgess
-------------------------------------------------
Professor of Network and System Administration
Oslo University College, Norway
Personal Web: http://www.iu.hio.no/~mark
Office Telf : +47 22453272
-------------------------------------------------
_______________________________________________
Bug-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/bug-cfengine