Re: "commands: arglist" mismatch between behaviour and documentation?
"'Lars Erik Wik' via help-cfengine" <[email protected]> Wed, 20 Sep 2023 03:39:22 -0700 (PDT)
| Newsgroups | gmane.comp.sysutils.cfengine.general |
|---|---|
| Message-ID | <[email protected]> |
Glad to hear! Thanks for sharing your solution with the clever use of maplist. On Wednesday, September 20, 2023 at 12:08:10 PM UTC+2 [email protected] wrote: > Lars and Mike, > > Thanks for your replies on this. Appreciated and useful! > > Given an incoming, pre-existing "@(lines)" slist that includes elements > which potentially contain embedded spaces, and following Lars' useful > suggestion, I have inserted: > > vars: > any:: > "lines_q" slist => maplist("'$(this)'", "@(lines)"); > > which simply puts additional quotes around each. I then use that new > "@(lines_q)" from that point onwards. > > (As Mike hints, this isn't a full, general-purpose solution. But for the > present it looks sufficient in this particular, relatively simple, > instance.) > > > -- David Lee > > On Friday, 15 September 2023 at 17:06:31 UTC+1 [email protected] wrote: > >> Thanks, Lars! >> >> Side note about nested quoting, probably the cleanest and most flexible >> syntax I've seen for nested quoting when it would otherwise get really >> hairy, is that used by Postgres: >> https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING >> >> --Mike Weilgart >> >> On Fri, Sep 15, 2023 at 2:28 AM 'Lars Erik Wik' via help-cfengine < >> [email protected]> wrote: >> >>> Hi all >>> >>> Thanks for shedding a light on this issue again. I've linked the issues >>> and pushed the CFE-2724 ticket to the top of the backlog. As a temporary >>> workaround you can use nested quoting, e.g.: >>> >>> ``` >>> $ cat ~/test.cf >>> bundle agent __main__ >>> { >>> files: >>> "/tmp/test.py" >>> content => "import sys; print(*(arg for arg in sys.argv), >>> sep='\n')"; >>> commands: >>> "/usr/bin/python3 /tmp/test.py" >>> args => "two `three four`", >>> arglist => { "five", "'six seven'" }; >>> } >>> $ /var/cfengine/bin/cf-agent -Kf ~/test.cf >>> notice: Q: "...in/python3 /tmp": /tmp/test.py >>> Q: "...in/python3 /tmp": two >>> Q: "...in/python3 /tmp": three four >>> Q: "...in/python3 /tmp": five >>> Q: "...in/python3 /tmp": six seven >>> ``` >>> >>> On Friday, September 15, 2023 at 6:01:50 AM UTC+2 [email protected] >>> wrote: >>> >>>> Hi David, >>>> >>>> I thought this sounded familiar, and indeed, I reported the same bug >>>> five years ago! https://northerntech.atlassian.net/browse/CFE-2869 >>>> >>>> And it was reported a year before that as well: >>>> https://northerntech.atlassian.net/browse/CFE-2724 >>>> >>>> And David, I see that you've now successfully reported the issue as >>>> https://northerntech.atlassian.net/browse/CFE-4253, also. >>>> >>>> To Northern Tech: I suggest that the code should be fixed for a future >>>> CFEngine version, AND that the documentation should be fixed for all >>>> existing CFEngine versions. Should be modified to better describe what the >>>> code actually does, and then a note should be inserted in a little text box >>>> for the benefit of those rereading the docs who've read it before, saying >>>> something like, "NOTE: This documentation previously implied that the >>>> elements of arglist were each treated as separate arguments and could >>>> contain spaces or quotes; however the behavior of the code did not match >>>> this documentation, so the documentation has been updated. A future >>>> CFEngine version may modify this behavior; see (link) for the bug tracking >>>> info." >>>> >>>> Or just quietly update the doc to be more precisely descriptive, since >>>> it doesn't actually *say* how the arglist is currently processed, it just >>>> implies it with the "particularly useful" statement. >>>> >>>> The documentation fix should be fairly trivial and I submit there's >>>> really no good reason to leave inaccurate documentation there to trip >>>> people up, even if the coding fix takes a while to prioritize and >>>> accomplish. >>>> >>>> ...Hmm, interesting, I think there is currently no way to have explicit >>>> control over how CFEngine handles the whitespace splitting in a commands >>>> promise...maybe an attribute for this could be added, with the default set >>>> to be the current behavior, for backward compatibility. Maybe call it >>>> "argsplitting" and default it to "whitespace" (IF that is an accurate >>>> description of current code behavior; I think it is), and have another >>>> option "none" which would result in *args* being treated as one single >>>> argument; and *arglist* being treated as exactly as many arguments as >>>> appear as elements in that list. >>>> >>>> Best, >>>> --Mike Weilgart >>>> On Thursday, September 14, 2023 at 7:26:03 AM UTC-7 >>>> [email protected] wrote: >>>> >>>>> I appear no longer to have login access to be able to report issues. >>>>> (Previous issues with my involvement include CFE-3020, CFE-1655, CFE-2908, >>>>> etc.) I'm trying to regain that access, but it is not proving easy! If >>>>> that can be restored then I can report the issue. >>>>> >>>>> Otherwise, could you log the issue for me? >>>>> >>>>> Thanks. >>>>> >>>>> -- David Lee >>>>> On Wednesday, 13 September 2023 at 14:55:30 UTC+1 >>>>> [email protected] wrote: >>>>> >>>>>> On Wed, 2023-09-13 at 06:38 -0700, [email protected] wrote: >>>>>> > Using 3.18.5 community edition on RHEL9; also 3.15 on RHEL7 and >>>>>> RHEL8 >>>>>> > >>>>>> > Documentation >>>>>> https://docs.cfengine.com/docs/3.18/reference-promise-types-commands.html >>>>>> gives the example: >>>>>> > ------------------------------------------------- >>>>>> > commands: "/bin/echo one" args => "two three", arglist => { "four", >>>>>> "five" }; >>>>>> > So in the example above the command would be: >>>>>> > /bin/echo one two three four five >>>>>> > ------------------------------------------------- >>>>>> > >>>>>> > It also states:------------------------------------------------- >>>>>> > That's particularly useful when there are embedded spaces and >>>>>> quotes in your arguments... >>>>>> > ------------------------------------------------- >>>>>> > >>>>>> > So I'm trying to build something, specifically requiring that >>>>>> "embedded spaces" claim. But I hit a problem, so strip it down to a >>>>>> proof-of-concept script: >>>>>> > ------------------------------------------------- >>>>>> > #! /bin/bash >>>>>> > echo "argcount: $#" >>>>>> > for (( i=1 ; i<=$#; i++)) >>>>>> > do >>>>>> > echo "${i}:${!i}" >>>>>> > done >>>>>> > ------------------------------------------------- >>>>>> > >>>>>> > At the command line I verify the script: >>>>>> > ------------------------------------------------- >>>>>> > $ ./modules/printargs A B "C with spaces" D >>>>>> > argcount: 4 >>>>>> > 1:A >>>>>> > 2:B >>>>>> > 3:C with spaces >>>>>> > 4:D >>>>>> > $ >>>>>> > ------------------------------------------------- >>>>>> > (Four arguments, the third being three words with embedded spaces.) >>>>>> > >>>>>> > I then run it from within our CFEngine framework: >>>>>> > ------------------------------------------------- >>>>>> > commands: >>>>>> > any:: >>>>>> > "$(gcom.modulesdir)/printargs" >>>>>> > arglist => { "A", "B", "C with spaces", "D" }; >>>>>> > ------------------------------------------------- >>>>>> > >>>>>> > But instead of receiving four arguments, it receives six: here's >>>>>> the CFE "inform" output: >>>>>> > ------------------------------------------------- >>>>>> > info: Executing 'no timeout' ... '[...]/modules/printargs A B C >>>>>> with spaces D' >>>>>> > notice: Q: ".../printargs A B ": argcount: 6 >>>>>> > Q: ".../printargs A B ": 1:A >>>>>> > Q: ".../printargs A B ": 2:B >>>>>> > Q: ".../printargs A B ": 3:C >>>>>> > Q: ".../printargs A B ": 4:with >>>>>> > Q: ".../printargs A B ": 5:spaces >>>>>> > Q: ".../printargs A B ": 6:D >>>>>> > info: Last 7 quoted lines were generated by promiser >>>>>> > ------------------------------------------------- >>>>>> > That useful "embedded spaces" claim in the documentation seems to >>>>>> be being ignored. >>>>>> > >>>>>> > Is the bug/problem: >>>>>> > * in the code >>>>>> > * or in the documentation >>>>>> > * or in my interpretation of the documentation >>>>>> > Help appreciated >>>>>> Definitely looks like a bug in the CFEngine code to me. I'm just >>>>>> surprised there's no failing test >>>>>> for this. Please report the issue at >>>>>> https://northerntech.atlassian.net/browse/CFE >>>>>> >>>>>> Thanks! >>>>>> >>>>>> -- >>>>>> Vratislav >>>>>> >>>>> -- >>> You received this message because you are subscribed to a topic in the >>> Google Groups "help-cfengine" group. >>> To unsubscribe from this topic, visit >>> https://groups.google.com/d/topic/help-cfengine/70qc5E83BMA/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> [email protected]. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/help-cfengine/7f369e0e-4b13-460a-a613-5538835a628dn%40googlegroups.com >>> <https://groups.google.com/d/msgid/help-cfengine/7f369e0e-4b13-460a-a613-5538835a628dn%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- You received this message because you are subscribed to the Google Groups "help-cfengine" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/help-cfengine/2b699151-889d-4533-925f-9369ca04e11cn%40googlegroups.com.