Re: How to best NOT run a command

"'Nick Anderson' via help-cfengine" <[email protected]> Tue, 13 Feb 2024 09:03:55 -0800 (PST)
Newsgroups gmane.comp.sysutils.cfengine.general
Message-ID <[email protected]>
Couldn't resist looking a bit closer ...

seems authselect current -r lists profile with enabled features space 
separated.

```
[root@hub ~]# authselect current -r 
sssd 
[root@hub ~]# authselect current 
Profile ID: sssd 
Enabled features: None 
[root@hub ~]# authselect enable-feature without-nullok 
Make sure that SSSD service is configured and enabled. See SSSD 
documentation for more information. 

[root@hub ~]# authselect current 
Profile ID: sssd 
Enabled features: 
- without-nullok 
[root@hub ~]# authselect current -r 
sssd without-nullok 
[root@hub ~]# 
```

On Tuesday, February 13, 2024 at 10:53:40 AM UTC-6 Nick Anderson wrote:

> oh, it seems that authselect list-features profile_id doesn't list enabled 
> features, it lists features that could be enabled. So, seems you would need 
> to parse the currently enabled features out from `authselect current` 
> instead.
>
> On Tuesday, February 13, 2024 at 10:46:11 AM UTC-6 Nick Anderson wrote:
>
>> Nick: 
>>
>> This is very helpful. I watched that Agent-is-In episode three times this 
>> weekend and worked on setting up my own cfengine installation. I've been 
>> working with Org-Mode since we talked about it a couple of months ago. 
>>
>> Great, org-mode is fantastic, and paired with ob-cfengine3 at least I 
>> find it super great for prototyping small policy. 
>>
>> My real question that I wanted to ask was about the structure of the `if` 
>> statement since I wanted to do something like this: 
>>
>> bundle agent main { vars: "el_authselect_features" slist => { 
>> "with-custom-group", "with-custom-passwd", "with-mkhomedir", "with-sudo", 
>> "with-files-domain", "without-nullok" }; 
>>
>> commands: "/usr/bin/authselect select sssd –force" AND 
>> "/usr/bin/authselect enable-feature $(el_authselect_features)" if => not( 
>> returnzero( "/usr/bin/authselect current -r | grep sssd > /dev/null 2>&1", 
>> "useshell" ) ); } 
>>
>> I was thinking how to use `canonify`, but I'm not sure that works in this 
>> case. Is what I'm trying to do possible? 
>>
>> It's not clear to me what you are looking for here. 
>>
>> Is it that you want to run authselect select sssd --force && authselect 
>> enable-feature with-custom-group with-custom-password with-mkhomedir 
>> with-sudo with-files-domain without-nullok or you want to run authselect 
>> select sssd --force && authselect enable-feature with-custom-group && 
>> authselect enable-feature with-custom-password && authselect enable-feature 
>> with-mkhomedir && authselect enable-feature with-sudo && authselect 
>> enable-feature with-files-domain && authselect enable-feature without-nullok? 
>>
>>
>> There are few ways to run *multiple* commands in a single promise. If 
>> that is what you want generally you put the multiple commands into a script 
>> and run the script as a commands promise. If you need to communicate more 
>> back to the agent then that script could output in the variables and 
>> classes module protocol format 
>> <https://docs.cfengine.com/docs/3.23/reference-language-concepts-modules.html#variables-and-classes-modules>. 
>> Alternatively if you execute the commands promise in a shell you can use 
>> && or ; to separate the individual commands within the single statement. 
>>
>> Also, what happens if after you get into your desired state an intern fed 
>> Gizmo after midnight, then Spike comes along and runs authselect 
>> disable-feature with-custom-group? Your condition (authselect current -r 
>> | grep sssd) will pass, and no commands will be run. Just glancing here 
>> <https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_authentication_and_authorization_in_rhel/configuring-user-authentication-using-authselect_configuring-authentication-and-authorization-in-rhel> 
>> at some random doc result on authselect I see that authselect current 
>> returns a list of enabled features: 
>>
>>
>> $ authselect current
>> Profile ID: sssd
>> Enabled features:
>> - with-sudo
>> - with-mkhomedir
>> - with-smartcard
>>
>> It seems you can also get enabled features for a given profile with authselect 
>> list-features profile_id. 
>>
>>
>> # authselect list-features sssd
>> with-custom-automount
>> with-custom-group
>> with-custom-netgroup
>> with-custom-passwd
>> with-custom-services
>> with-faillock
>> with-files-access-provider
>> with-fingerprint
>> with-mkhomedir
>> with-pam-u2f
>> with-pam-u2f-2fa
>> with-pamaccess
>> with-silent-lastlog
>> with-smartcard
>> with-smartcard-lock-on-removal
>> with-smartcard-required
>> with-sudo
>> without-nullok
>> without-pam-u2f-nouserok
>>
>> You could use difference() to figure out which desired features are not 
>> enabled so that you can enable the proper ones, you could also use 
>> difference() to figure out which enabled features are not explicitly 
>> desired (maybe you want to disable those). 
>>
>> bundle agent __main__{
>>  vars:
>>      "current_features_enabled"
>>        # slist => string_split( "/usr/bin/authselect list-features", "\n", inf );
>>        slist => { "with-sudo",
>>                   "with-mkhomedir",
>>                   "with-smartcard"
>>        };
>>
>>      "desired_features_enabled"
>>
>>
>>        slist => {  "with-custom-group",
>>                    "with-custom-passwd",
>>                    "with-mkhomedir",
>>                    "with-sudo",
>>                    "with-files-domain"
>>
>> ,
>>                    "without-nullok",
>>        };
>>
>>      "desired_features_missing"
>>        slist => difference( "desired_features_enabled", "current_features_enabled" );
>>
>>      "enabled_features_not_explicitly_desired"
>>        slist => difference( "current_features_enabled","desired_features_enabled" );
>>
>>
>>       reports:
>>       "Missing desired feature: $(desired_features_missing)";
>>       "/usr/bin/authselect enable-feature $(desired_features_missing)";
>>       "Extra features enabled: $(with)"
>>         with => join( ", ", enabled_features_not_explicitly_desired );
>>       "/usr/bin/authselect disable-feature $(enabled_features_not_explicitly_desired)?";}
>>
>>
>> R: Missing desired feature: with-custom-group
>> R: Missing desired feature: with-custom-passwd
>> R: Missing desired feature: with-files-domain
>> R: Missing desired feature: without-nullok
>> R: /usr/bin/authselect enable-feature with-custom-group
>> R: /usr/bin/authselect enable-feature with-custom-passwd
>> R: /usr/bin/authselect enable-feature with-files-domain
>> R: /usr/bin/authselect enable-feature without-nullok
>> R: Extra features enabled: with-smartcard
>> R: /usr/bin/authselect disable-feature with-smartcard?
>>
>> So, that might result in some policy like this (no warranty, untested!): 
>>
>> bundle agent authselect_sssd{
>>     methods:
>>     "authselect_profile";
>>     "authselect_features";}bundle agent authselect_profile{
>>
>>
>>     commands:
>>       "/usr/bin/authselect select sssd --force"
>>
>>
>>         if => not( returnszero( "/usr/bin/authselect current -r | grep sssd > /dev/null 2>&1", "useshell" ) );}bundle agent authselect_features{
>>   vars:
>>       "current_profile"
>>         string => execresult( "/usr/bin/authselect current -r", noshell);
>>
>>       "current_features_enabled"
>>         slist => string_split( "/usr/bin/authselect list-features", "\n", inf );
>>
>>       "desired_features_enabled"
>>
>>
>>         slist => {  "with-custom-group",
>>                     "with-custom-passwd",
>>                     "with-mkhomedir",
>>                     "with-sudo",
>>                     "with-files-domain"
>>
>> ,
>>                     "without-nullok",
>>         };
>>
>>       "desired_features_missing"
>>         slist => difference( "desired_features_enabled", "current_features_enabled" );
>>
>>      "enabled_features_not_explicitly_desired"
>>        slist => difference( "current_features_enabled","desired_features_enabled" );
>>
>>   commands:
>>       # Run authselect enable-feature for each feature that is not currently enabled if the current profile is sssd
>>       "/usr/bin/authselect enable-feature $(desired_features_enabled)"
>>         if => and( strcmp( "$(current_profile)", "sssd" ),
>>                    isgreaterthan( length( desired_features_missing ), 0 ) ); # Alternatively I think you could use some() matching .*
>>
>>        "/usr/bin/authselect disable-feature $(enabled_features_not_explicitly_desired)"
>>         if => and( strcmp( "$(current_profile)", "sssd" ),
>>                    isgreaterthan( length( enabled_features_not_explicitly_desired ), 0 ) );
>> }
>>
>> This will result in a fair number of commands being executed during each 
>> policy execution, if that turns out to be more overhead than desired for 
>> some reason then you could consider caching the result of the probing 
>> commands. 
>>
>

-- 
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/13b7a5f2-86bb-4f85-8840-5745b40836b2n%40googlegroups.com.