Project

General

Profile

User story #3378 ยป 0001-Added-groupManagement-version-2.0,-makes-creating-the-group-optional.patch

Michael Gliwinski, 2013-03-27 17:15

View differences:

techniques/systemSettings/userManagement/groupManagement/2.0/groupManagement.st
#####################################################################################
# Copyright 2011 Normation SAS
#####################################################################################
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#####################################################################################
##########################################################################
# Group management PT #
# #
# Objective : Apply group policies on the target host #
##########################################################################
# I was forced to truncate brutally the name, as on CF3 3.1.4 more than 32 chars on the bundle name leads to arrays corruption
bundle agent check_usergroup_grp_parameters {
vars:
&USERGROUP_GROUP_NAME:{name |"usergroup_group_name[&i&]" string => "&name&";
}&
&USERGROUP_GROUP_CREATE:{create |"usergroup_group_create[&i&]" string => "&create&";
}&
&USERGROUP_GROUP_CONTENT:{content |"usergroup_group_content[&i&]" string => "&content&";
}&
&TRACKINGKEY:{directiveId |"usergroup_group_directive_id[&i&]" string => "&directiveId&";
}&
"usergroup_group_index" slist => getindices("usergroup_group_name");
methods:
"any"
usebundle => check_usergroup_group_parameters_grouphandle("$(usergroup_group_name[$(usergroup_group_index)])", "$(usergroup_group_create[$(usergroup_group_index)])", "$(usergroup_group_content[$(usergroup_group_index)])", "$(usergroup_group_index)", "$(usergroup_group_directive_id[$(usergroup_group_index)])");
}
bundle agent check_usergroup_group_parameters_grouphandle(name, create, content, index, directiveId) {
classes:
"groupmanagement_group_$(index)_absent" not => groupexists("$(name)");
"groupmanagement_group_$(index)_create" expression => strcmp("$(create)", "true");
vars:
"userlist" slist => splitstring("$(content)",",","16");
commands:
"/usr/sbin/groupadd"
args => "-f \"$(name)\"",
classes => if_else("groupmanagement_group_add_$(index)_repaired", "groupmanagement_group_add_$(index)_error"),
ifvarclass => "groupmanagement_group_$(index)_absent.groupmanagement_group_$(index)_create",
comment => "Add the group $(name) if it doesn't exists";
files:
"/etc/group"
edit_line => groups_file_append("$(name)", "@(check_usergroup_group_parameters_grouphandle.userlist)"),
classes => kept_if_else("groupmanagement_group_add_$(index)_kept", "groupmanagement_group_add_$(index)_repaired", "groupmanagement_group_add_$(index)_error"),
ifvarclass => "!groupmanagement_group_$(index)_absent|groupmanagement_group_add_$(index)_repaired",
comment => "Set users on the group $(name) only if the group is already present";
reports:
linux::
"@@groupManagement@@result_success@@$(directiveId)@@Groups@@$(name)@@$(g.execRun)##$(g.uuid)@#The group $(name) is already present and compliant with the policy"
ifvarclass => "groupmanagement_group_add_$(index)_kept.!(groupmanagement_group_add_$(index)_repaired|groupmanagement_group_add_$(index)_error)";
"@@groupManagement@@result_repaired@@$(directiveId)@@Groups@@$(name)@@$(g.execRun)##$(g.uuid)@#The group $(name) has been updated"
ifvarclass => "groupmanagement_group_add_$(index)_repaired.!(groupmanagement_group_add_$(index)_kept|groupmanagement_group_add_$(index)_error)";
"@@groupManagement@@result_error@@$(directiveId)@@Groups@@$(name)@@$(g.execRun)##$(g.uuid)@#The group $(name) could not be created or updated"
ifvarclass => "groupmanagement_group_add_$(index)_error";
}
bundle edit_line groups_file_append(group,userlist)
{
vars:
"finalgroup" string => join(",","userlist");
field_edits:
"$(group):.*"
# Set field of the file to parameter
# /etc/group entry is: groupname:x:gid:users
edit_field => col(":","4","$(finalgroup)","set");
}
techniques/systemSettings/userManagement/groupManagement/2.0/metadata.xml
<!--
Copyright 2011 Normation SAS
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, Version 3.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<!--
This is the groupManagement PT.
Compatibility : Linux like, Windows like
It is intended to check the group parameters on the target host.
-->
<TECHNIQUE name="Group management">
<DESCRIPTION>This technique manages the target host(s) groups.
It will optionally ensure that the defined groups are present on the system,
and that all specified users are members of the group.
</DESCRIPTION>
<MULTIINSTANCE>true</MULTIINSTANCE>
<BUNDLES>
<NAME>check_usergroup_grp_parameters</NAME>
</BUNDLES>
<TMLS>
<TML name="groupManagement"/>
</TMLS>
<TRACKINGVARIABLE>
<SAMESIZEAS>USERGROUP_GROUP_NAME</SAMESIZEAS>
</TRACKINGVARIABLE>
<SECTIONS>
<!-- groups section , index 1 -->
<SECTION name="Groups" multivalued="true" component="true" componentKey="USERGROUP_GROUP_NAME">
<INPUT>
<NAME>USERGROUP_GROUP_NAME</NAME>
<DESCRIPTION>Name</DESCRIPTION>
<CONSTRAINT>
<MAYBEEMPTY>true</MAYBEEMPTY>
</CONSTRAINT>
</INPUT>
<INPUT>
<NAME>USERGROUP_GROUP_CREATE</NAME>
<DESCRIPTION>Create the group if it doesn't exist</DESCRIPTION>
<CONSTRAINT>
<TYPE>boolean</TYPE>
<DEFAULT>true</DEFAULT>
</CONSTRAINT>
</INPUT>
<INPUT>
<NAME>USERGROUP_GROUP_CONTENT</NAME>
<DESCRIPTION>Users included in the group</DESCRIPTION>
<LONGDESCRIPTION>This should be input as a comma separated list</LONGDESCRIPTION>
<CONSTRAINT>
<MAYBEEMPTY>true</MAYBEEMPTY>
</CONSTRAINT>
</INPUT>
</SECTION>
</SECTIONS>
</TECHNIQUE>
-
    (1-1/1)