Re: move_obstructions behavior

Ron Peters <[email protected]> Thu, 13 Jul 2023 08:55:54 -0700 (PDT)
Newsgroups gmane.comp.sysutils.cfengine.general
Message-ID <[email protected]>
Hi Nick,

Yes, that's very helpful. I briefly scanned this yesterday and felt silly 
for asking when I realized I could simply qualify when the link was 
created. Thanks for a very useful and detailed writeup.

On Wednesday, July 12, 2023 at 3:27:29 PM UTC-7 [email protected] 
wrote:

> Hi Ron, 
>
> It's very helpful if you provide a small standalone policy that 
> demonstrates the behavior. I think this does it: 
>
> bundle agent __main__{
>   files:
>     "/tmp/move-obstructions.txt"
>       content => "I am a plain file";
>
>     "/tmp/move-obstructions.txt"
>       move_obstructions => "false",
>       link_from => default:ln_s( "$(this.promise_filename)" );}
>
>
>  info: Created file '/tmp/move-obstructions.txt', mode 0600
>  info: Updated file '/tmp/move-obstructions.txt' with content 'I am a plain file'
> error: Object '/tmp/move-obstructions.txt' is obstructing promise
> error: Unable to create link '/tmp/move-obstructions.txt' -> '/home/nickanderson/org/roam/daily/work/cfengine3-0cVlsi', failed to move obstruction
> error: Errors encountered when actuating files promise '/tmp/move-obstructions.txt'
>
> Based on your description alone, I can see the sense in *not* emitting an 
> *error* when move_obstructions is false. Indeed, if you are explicit 
> about not wanting to move something out of the way it seems a bit silly to 
> emit an error. However it also seems like this might be better expressed in 
> the policy to simply avoid making a promise in that case. 
>
> This policy will create the link because there is no file there. 
>
> bundle agent __main__{
>   files:
>
>     "/tmp/move-obstructions.txt"
>       delete => default:tidy;
>
>     "/tmp/move-obstructions.txt"
>       link_from => default:ln_s( "$(this.promise_filename)" ),
>       if => not( fileexists( "/tmp/move-obstructions.txt" ) ),
>       comment =>  "If there is nothing there, we want to have a symlink";
> }
>
>
> info: Deleted file '/tmp/move-obstructions.txt'
> info: Linked files '/tmp/move-obstructions.txt' -> '/home/nickanderson/org/roam/daily/work/cfengine3-gp5E8s'
>
> But what if there is a symlink, but it's pointing elsewhere? With move_obstructions 
> => "false" (the default) the symlink target won't be fixed: 
>
> bundle agent __main__{
>   files:
>
>       "/tmp/move-obstructions.txt"
>         delete => default:tidy;
>
>       "/tmp/move-obstructions.txt"
>         link_from => default:ln_s( "/etc/hosts" ),
>         if => not( fileexists( "/tmp/move-obstructions.txt" ) ),
>         comment =>  "If there is nothing there, we link the file to /etc/hosts";
>
>       "/tmp/move-obstructions.txt"
>         link_from => default:ln_s( "/etc/issue" ),
>         if => islink( "/tmp/move-obstructions.txt" ),
>         comment =>  "If it's a symlink, we fix the link";
>
>       "/tmp/move-obstructions.txt"
>         link_from => default:ln_s( "/etc/motd" ),
>         if => islink( "/tmp/move-obstructions.txt" ),
>         move_obstructions => "true",
>         comment =>  "If it's a symlink, we fix the link";
> }
>
>
>  info: Deleted file '/tmp/move-obstructions.txt'
>  info: Linked files '/tmp/move-obstructions.txt' -> '/etc/hosts'
> error: Link '/tmp/move-obstructions.txt' points to '/etc/hosts' not '/etc/issue', but not moving obstructions
> error: Errors encountered when actuating files promise '/tmp/move-obstructions.txt'
>  info: Overrode incorrect link '/tmp/move-obstructions.txt'
>  info: Linked files '/tmp/move-obstructions.txt' -> '/etc/motd'
>
> So, what do you think? Do you still think that explicitly setting move_obstructions 
> => "false" should suppress the error about not moving things out of the 
> way? 
>
> Actually, looking at this and reviewing the docs, I think the link should 
> have been updated since that was already the same type of file. Still, I 
> think it's a bit better to be more explicit about the conditions under 
> which you want to actually make the promise. Based on your description not 
> wanting to replace a file or directory with a link, but presumably wanting 
> to fix a link that is pointing to the wrong place I would probably write it 
> like this: 
>
> bundle agent __main__{
>   files:
>     "/tmp/move-obstructions.txt"
>       content => "I am a plain file";
>
>     "/tmp/move-obstructions.txt"
>       move_obstructions => "true",
>       link_from => default:ln_s( "/etc/motd" ),
>       if => islink( "$(this.promiser)" ),
>       comment => concat( "If the file is a symlink, be sure to make sure it",
>                          " points to the correct place, if the file is a plain",
>                          " file or directory or socket etc ... then just leave it alone." );}
>
>

-- 
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/5e688c8e-e921-43be-b624-b9cf8e4d8170n%40googlegroups.com.