1515 value . is_a? Integer
1616 end
1717
18- optional_commands :localadd => "lgroupadd" , :localdelete => "lgroupdel" , :localmodify => "lgroupmod"
19-
20- has_feature :manages_local_users_and_groups , :manages_members if Puppet . features . libuser?
21-
22- options :members , :flag => '-M' , :method => :mem
18+ optional_commands :localadd => "lgroupadd" , :localdelete => "lgroupdel" , :localmodify => "lgroupmod" , :purgemember => "usermod"
19+
20+ has_feature :manages_local_users_and_groups if Puppet . features . libuser?
21+ has_feature :manages_members if Puppet . features . libuser? ||
22+ ( Puppet . runtime [ :facter ] . value ( 'os.name' ) == "Fedora" &&
23+ Puppet . runtime [ :facter ] . value ( 'os.release.major' ) . to_i >= 40 )
24+
25+ # Libuser's modify command 'lgroupmod' requires '-M' flag for member additions.
26+ # 'groupmod' command requires the '-aU' flags for it.
27+ if Puppet . features . libuser?
28+ options :members , :flag => '-M' , :method => :mem
29+ else
30+ options :members , :flag => '-aU' , :method => :mem
31+ end
2332
2433 def exists?
2534 return !!localgid if @resource . forcelocal?
@@ -58,7 +67,8 @@ def create
5867 end
5968
6069 def addcmd
61- if @resource . forcelocal?
70+ # The localadd command (lgroupadd) must only be called when libuser is supported.
71+ if Puppet . features . libuser? && @resource . forcelocal?
6272 cmd = [ command ( :localadd ) ]
6373 @custom_environment = Puppet ::Util ::Libuser . getenv
6474 else
@@ -86,7 +96,8 @@ def validate_members(members)
8696 end
8797
8898 def modifycmd ( param , value )
89- if @resource . forcelocal? || @resource [ :members ]
99+ # The localmodify command (lgroupmod) must only be called when libuser is supported.
100+ if Puppet . features . libuser? && ( @resource . forcelocal? || @resource [ :members ] )
90101 cmd = [ command ( :localmodify ) ]
91102 @custom_environment = Puppet ::Util ::Libuser . getenv
92103 else
@@ -109,7 +120,8 @@ def modifycmd(param, value)
109120 end
110121
111122 def deletecmd
112- if @resource . forcelocal?
123+ # The localdelete command (lgroupdel) must only be called when libuser is supported.
124+ if Puppet . features . libuser? && @resource . forcelocal?
113125 @custom_environment = Puppet ::Util ::Libuser . getenv
114126 [ command ( :localdelete ) , @resource [ :name ] ]
115127 else
@@ -127,7 +139,16 @@ def members_to_s(current)
127139 end
128140
129141 def purge_members
130- localmodify ( '-m' , members_to_s ( members ) , @resource . name )
142+ # The groupadd provider doesn't have the ability currently to remove members from a group, libuser does.
143+ # Use libuser's lgroupmod command to achieve purging members if libuser is supported.
144+ # Otherwise use the 'usermod' command.
145+ if Puppet . features . libuser?
146+ localmodify ( '-m' , members_to_s ( members ) , @resource . name )
147+ else
148+ members . each do |member |
149+ purgemember ( '-rG' , @resource . name , member )
150+ end
151+ end
131152 end
132153
133154 private
0 commit comments