Re: How to best NOT run a command
"'Nick Anderson' via help-cfengine" <[email protected]> Tue, 13 Feb 2024 08:53:40 -0800 (PST)
| Newsgroups | gmane.comp.sysutils.cfengine.general |
|---|---|
| Message-ID | <[email protected]> |
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/e8920dcc-035a-4a11-9506-74a090d4cc18n%40googlegroups.com.