From: Joel Rosario <[email protected]>
Signed-off-by: James Turnbull <[email protected]> --- Local-branch: tickets/master/6693 lib/puppet/provider/group/groupadd_win.rb | 36 ++-- lib/puppet/provider/user/useradd_win.rb | 52 ++-- lib/puppet/util/windows_system.rb | 388 +++++++++++++++-------------- test/ral/providers/user/useradd_win.rb | 3 +- test/ral/providers/windowstest.rb | 100 ++++---- 5 files changed, 298 insertions(+), 281 deletions(-) diff --git a/lib/puppet/provider/group/groupadd_win.rb b/lib/puppet/provider/group/groupadd_win.rb index a2ce88d..dcefd2f 100644 --- a/lib/puppet/provider/group/groupadd_win.rb +++ b/lib/puppet/provider/group/groupadd_win.rb @@ -3,28 +3,28 @@ require 'puppet/util/windows_system' Puppet::Type.type(:group).provide :groupadd_win do desc "Group management for windows" - defaultfor :operatingsystem => :windows + confine :operatingsystem => :windows - has_features :manages_members + has_features :manages_members - def members - Windows::Group.new(@resource[:name]).members - end + def members + Puppet::Util::Windows::Group.new(@resource[:name]).members + end - def members=(members) - Windows::Group.new(@resource[:name]).set_members(members) - end + def members=(members) + Puppet::Util::Windows::Group.new(@resource[:name]).set_members(members) + end - def create - group = Windows::Group.create(@resource[:name]) - group.set_members(@resource[:members]) - end + def create + group = Puppet::Util::Windows::Group.create(@resource[:name]) + group.set_members(@resource[:members]) + end - def exists? - Windows::Group.exists?(@resource[:name]) - end + def exists? + Puppet::Util::Windows::Group.exists?(@resource[:name]) + end - def delete - Windows::Group.delete(@resource[:name]) - end + def delete + Puppet::Util::Windows::Group.delete(@resource[:name]) + end end diff --git a/lib/puppet/provider/user/useradd_win.rb b/lib/puppet/provider/user/useradd_win.rb index 5f9b969..0fdd8c6 100644 --- a/lib/puppet/provider/user/useradd_win.rb +++ b/lib/puppet/provider/user/useradd_win.rb @@ -4,39 +4,39 @@ require 'puppet/util/windows_system' raise "ERROR: A windowsuser resource can only be configured on Windows. This OS is is #{Facter['kernel'].value}" if Facter['kernel'].value != 'windows' Puppet::Type.type(:user).provide :useradd_win do - desc "User management for windows" + desc "User management for windows" - defaultfor :operatingsystem => :windows + confine :operatingsystem => :windows - has_features :manages_passwords + has_features :manages_passwords - def password - name, password = @resource[:name], @resource[:password] - Windows::User.new(name).password_is?(password) ?password :"" rescue :absent - end + def password + name, password = @resource[:name], @resource[:password] + Puppet::Util::Windows::User.new(name).password_is?(password) ?password :"" rescue :absent + end - def password=(pwd) - Windows::User.new(@resource[:name]).password = @resource[:password] - end + def password=(pwd) + Puppet::Util::Windows::User.new(@resource[:name]).password = @resource[:password] + end - def groups - Windows::User.new(@resource[:name]).groups.join(',') rescue :absent - end + def groups + Puppet::Util::Windows::User.new(@resource[:name]).groups.join(',') rescue :absent + end - def groups=(groups) - Windows::User.new(@resource[:name]).set_groups(groups) - end + def groups=(groups) + Puppet::Util::Windows::User.new(@resource[:name]).set_groups(groups) + end - def create - user = Windows::User.create(@resource[:name], @resource[:password]) - user.set_groups(@resource[:groups], @resource[:membership] == :minimum) - end + def create + user = Puppet::Util::Windows::User.create(@resource[:name], @resource[:password]) + user.set_groups(@resource[:groups], @resource[:membership] == :minimum) + end - def exists? - return Windows::User.exists?(@resource[:name]) - end + def exists? + return Puppet::Util::Windows::User.exists?(@resource[:name]) + end - def delete - Windows::User.delete(@resource[:name]) - end + def delete + Puppet::Util::Windows::User.delete(@resource[:name]) + end end diff --git a/lib/puppet/util/windows_system.rb b/lib/puppet/util/windows_system.rb index 83bc52e..14bb80c 100644 --- a/lib/puppet/util/windows_system.rb +++ b/lib/puppet/util/windows_system.rb @@ -3,8 +3,8 @@ if Facter.operatingsystem == "windows" require 'Win32API' end -module ADSI - def ADSI.connectable?(uri) +module Puppet::Util::ADSI + def self.connectable?(uri) begin adsi_obj = WIN32OLE.connect(uri) return adsi_obj != nil; @@ -15,191 +15,201 @@ module ADSI end end -module Windows - class Resource - def Resource.uri(resource_name) - "#{Computer.resource_uri}/#{resource_name}" - end - end - - class User - def initialize(username, native_adsi_obj = nil) - @username = username - @user = native_adsi_obj - end - - def user - @user = WIN32OLE.connect(User.resource_uri(@username)) if @user == nil - return @user - end - - def password_is?(password) - fLOGON32_LOGON_NETWORK_CLEARTEXT = 8 - fLOGON32_PROVIDER_DEFAULT = 0 - - logon_user = Win32API.new("advapi32", "LogonUser", ['P', 'P', 'P', 'L', 'L', 'P'], 'L') - close_handle = Win32API.new("kernel32", "CloseHandle", ['P'], 'V') - - token = ' ' * 4 - if logon_user.call(@username, "", password, fLOGON32_LOGON_NETWORK_CLEARTEXT, fLOGON32_PROVIDER_DEFAULT, token) == 1 - close_handle.call(token.unpack('L')[0]) - return true - end - - return false - end - - def add_flag(flag_name, value) - flag = 0 - - begin - flag = user.Get(flag_name) - rescue - end - - user.Put(flag_name, flag | value) - user.SetInfo - end - - def password=(password) - user.SetPassword(password) - user.SetInfo - - fADS_UF_DONT_EXPIRE_PASSWD = 0x10000 - add_flag("UserFlags", fADS_UF_DONT_EXPIRE_PASSWD) - end - - def groups - groups = [] - user.Groups.each {|group| groups << group.name } - return groups - end - - def add_to_groups(group_names) - group_names.each {|name| Group.new(name).add_user(@username) } if group_names.length > 0 - end - - def remove_from_groups(group_names) - group_names.each {|name| Group.new(name).remove_user(@username) } if group_names.length > 0 - end - - def set_groups(names, minimal = true) - return if names == nil || names.strip.length == 0 - - names = names.strip.split(',') - current_groups = groups - - names.find_all {|name| !current_groups.include?(name) }.tap {|names_to_add| add_to_groups(names_to_add) } - current_groups.find_all {|name| !names.include?(name) }.tap {|names_to_remove| remove_from_groups(names_to_remove) } if minimal == false - end - - def User.resource_uri(username) - return "#{Resource.uri(username)},user" - end - - def User.exists?(username) - return ADSI::connectable?(User.resource_uri(username)) - end - - def User.create(username, password) - User.new(username, Computer.create("user", username)).tap {|user| user.password = password; yield user if block_given? } - end - - def User.delete(username) - Computer.delete("user", username) - end - end - - class Group - def initialize(groupname, native_adsi_obj = nil) - @groupname = groupname - @group = native_adsi_obj - end - - def resource_uri - Group.resource_uri(@groupname) - end - - def Group.resource_uri(name) - "#{Resource.uri(name)},group" - end - - def group - @group = WIN32OLE.connect(resource_uri) if @group == nil - return @group - end - - def add_user(username) - group.Add(User.resource_uri(username)) - group.SetInfo - end - - def remove_user(username) - group.Remove(User.resource_uri(username)) - group.SetInfo - end - - def add_member(name) - group.Add(Resource.uri(name)) - group.SetInfo - end - - def remove_member(name) - group.Remove(Resource.uri(name)) - group.SetInfo - end - - def members - list = [] - group.Members.each {|member| list << member.Name } - list - end - - def set_members(members) - return nil if members == nil || members.length == 0 - - current_members = self.members - - members.inject([]) {|members_to_add, member| current_members.include?(member) ? members_to_add : members_to_add << member }.each {|member| add_member(member) } - current_members.inject([]) {|members_to_remove, member| members.include?(member) ? members_to_remove : members_to_remove << member }.each {|member| remove_member(member) } - end - - def Group.create(name) - Windows::Group.new(name, Computer.create("group", name)).tap {|group| yield group if block_given? } - end - - def Group.exists?(name) - return ADSI::connectable?(Group.resource_uri(name)) - end - - def Group.delete(name) - Computer.delete("group", name) - end - end - - class Computer - def Computer.name - name = " " * 128 - size = "128" - Win32API.new('kernel32','GetComputerName',['P','P'],'I').call(name,size) - return name.unpack("A*") - end - - def Computer.resource_uri - computer_name = Computer.name - return "WinNT://#{computer_name}" - end - - def Computer.api - return WIN32OLE.connect(Computer.resource_uri) - end - - def Computer.create(resource_type, name) - Computer.api.create(resource_type, name).SetInfo - end - - def Computer.delete(resource_type, name) - Computer.api.Delete(resource_type, name) - end - end +module Puppet::Util::Windows + include Puppet::Util::ADSI + + class Resource + def Resource.uri(resource_name) + "#{Computer.resource_uri}/#{resource_name}" + end + end + + class User + def initialize(username, native_adsi_obj = nil) + @username = username + @user = native_adsi_obj + end + + def user + @user = WIN32OLE.connect(User.resource_uri(@username)) if @user == nil + return @user + end + + def password_is?(password) + fLOGON32_LOGON_NETWORK_CLEARTEXT = 8 + fLOGON32_PROVIDER_DEFAULT = 0 + + logon_user = Win32API.new("advapi32", "LogonUser", ['P', 'P', 'P', 'L', 'L', 'P'], 'L') + close_handle = Win32API.new("kernel32", "CloseHandle", ['P'], 'V') + + token = ' ' * 4 + if logon_user.call(@username, "", password, fLOGON32_LOGON_NETWORK_CLEARTEXT, fLOGON32_PROVIDER_DEFAULT, token) == 1 + close_handle.call(token.unpack('L')[0]) + return true + end + + return false + end + + def add_flag(flag_name, value) + flag = 0 + + begin + flag = user.Get(flag_name) + rescue + end + + user.Put(flag_name, flag | value) + user.SetInfo + end + + def password=(password) + user.SetPassword(password) + user.SetInfo + + fADS_UF_DONT_EXPIRE_PASSWD = 0x10000 + add_flag("UserFlags", fADS_UF_DONT_EXPIRE_PASSWD) + end + + def groups + groups = [] + user.Groups.each {|group| groups << group.name } + return groups + end + + def add_to_groups(group_names) + group_names.each {|name| Group.new(name).add_user(@username) } if group_names.length > 0 + end + + def remove_from_groups(group_names) + group_names.each {|name| Group.new(name).remove_user(@username) } if group_names.length > 0 + end + + def set_groups(names, minimal = true) + return if names == nil || names.strip.length == 0 + + names = names.strip.split(',') + current_groups = groups + + names_to_add = names.find_all {|name| !current_groups.include?(name) } + add_to_groups(names_to_add) + + names_to_remove = current_groups.find_all {|name| !names.include?(name) } + remove_from_groups(names_to_remove) if minimal == false + end + + def User.resource_uri(username) + return "#{Resource.uri(username)},user" + end + + def User.exists?(username) + return Puppet::Util::ADSI::connectable?(User.resource_uri(username)) + end + + def User.create(username, password) + newuser = new(username, Computer.create("user", username)) + newuser.password = password + yield newuser if block_given? + return newuser + end + + def User.delete(username) + Computer.delete("user", username) + end + end + + class Group + def initialize(groupname, native_adsi_obj = nil) + @groupname = groupname + @group = native_adsi_obj + end + + def resource_uri + Group.resource_uri(@groupname) + end + + def Group.resource_uri(name) + "#{Resource.uri(name)},group" + end + + def group + @group = WIN32OLE.connect(resource_uri) if @group == nil + return @group + end + + def add_user(username) + group.Add(User.resource_uri(username)) + group.SetInfo + end + + def remove_user(username) + group.Remove(User.resource_uri(username)) + group.SetInfo + end + + def add_member(name) + group.Add(Resource.uri(name)) + group.SetInfo + end + + def remove_member(name) + group.Remove(Resource.uri(name)) + group.SetInfo + end + + def members + list = [] + group.Members.each {|member| list << member.Name } + list + end + + def set_members(members) + return nil if members == nil || members.length == 0 + + current_members = self.members + + members.inject([]) {|members_to_add, member| current_members.include?(member) ? members_to_add : members_to_add << member }.each {|member| add_member(member) } + current_members.inject([]) {|members_to_remove, member| members.include?(member) ? members_to_remove : members_to_remove << member }.each {|member| remove_member(member) } + end + + def Group.create(name) + newgroup = new(name, Computer.create("group", name)) + yield newgroup if block_given? + return newgroup + end + + def Group.exists?(name) + return Puppet::Util::ADSI::connectable?(Group.resource_uri(name)) + end + + def Group.delete(name) + Computer.delete("group", name) + end + end + + class Computer + def Computer.name + name = " " * 128 + size = "128" + Win32API.new('kernel32','GetComputerName',['P','P'],'I').call(name,size) + return name.unpack("A*") + end + + def Computer.resource_uri + computer_name = Computer.name + return "WinNT://#{computer_name}" + end + + def Computer.api + return WIN32OLE.connect(Computer.resource_uri) + end + + def Computer.create(resource_type, name) + Computer.api.create(resource_type, name).SetInfo + end + + def Computer.delete(resource_type, name) + Computer.api.Delete(resource_type, name) + end + end end diff --git a/test/ral/providers/user/useradd_win.rb b/test/ral/providers/user/useradd_win.rb index 11d31e7..662efc8 100644 --- a/test/ral/providers/user/useradd_win.rb +++ b/test/ral/providers/user/useradd_win.rb @@ -7,6 +7,7 @@ require File.dirname(__FILE__) + '/../../../../lib/puppet/provider/user/useradd_ class TestUserProvider < Test::Unit::TestCase include WindowsTest + include Puppet::Util::Windows def user_provider(resource_configuration) Puppet::Type::User::ProviderUseradd_win.new.tap {|provider| provider.resource = resource_configuration } @@ -25,7 +26,7 @@ class TestUserProvider < Test::Unit::TestCase assert_nothing_raised { provider.create } - user = Windows::User.new(username) + user = User.new(username) assert(user.password_is?(password), "Password of user #{username} should be #{password}") user.groups.tap {|groups| expected_groups.each {|expected_group| assert(groups.include?(expected_group), "User should be a member of #{expected_group}") } diff --git a/test/ral/providers/windowstest.rb b/test/ral/providers/windowstest.rb index b9ed1e5..6e30bdc 100644 --- a/test/ral/providers/windowstest.rb +++ b/test/ral/providers/windowstest.rb @@ -1,95 +1,101 @@ require File.dirname(__FILE__) + '/../../../lib/puppet/util/windows_system.rb' module WindowsTest + include Puppet::Util::Windows + class List - def initialize - @list = [] - end - - def clear - destroy - @list = [] - end - - def register(item) - @list << item - end + def initialize + @list = [] + end + + def clear + destroy + @list = [] + end + + def register(item) + @list << item + end end class Groups < List - def destroy - @list.each {|group| - begin - Windows::Group.delete(group) - rescue - puts "Group #{group} not found" - end - } - end + include Puppet::Util::Windows + + def destroy + @list.each {|group| + begin + Group.delete(group) + rescue + puts "Group #{group} not found" + end + } + end end class Users < List - def destroy - @list.each {|user| - begin - Windows::User.delete(user) - rescue - puts "User #{user} not found" - end - } - end + include Puppet::Util::Windows + + def destroy + @list.each {|user| + begin + User.delete(user) + rescue + puts "User #{user} not found" + end + } + end end def helper_users - @users = Users.new if @users == nil - @users + @users = Users.new if @users == nil + @users end def helper_groups - @groups = Groups.new if @groups == nil - @groups + @groups = Groups.new if @groups == nil + @groups end def clear - helper_groups.clear - helper_users.clear + helper_groups.clear + helper_users.clear end def register_group(name) - helper_groups.register name + helper_groups.register name end def register_user(name) - helper_users.register name + helper_users.register name end def mkuser(name, password = "1234567") - Windows::User.create(name, password) { register_user name } + User.create(name, password) { register_user name } end def mkgroup(name) - Windows::Group.create(name) { register_group name } + Group.create(name) { register_group name } end def mkusers(names) - names.collect {|name| mkuser name } + names.collect {|name| mkuser name } end def mkgroups(names) - names.collect {|name| mkgroup name } + names.collect {|name| mkgroup name } end def group(name) - Windows::Group.new(name) + Group.new(name) end def assert_no_missing_member(group, expected_members) - group.members.tap {|members| - expected_members.each {|member| assert(members.include?(member), "#{member} should be a member") } - } + group.members.tap {|members| + expected_members.each {|member| assert(members.include?(member), "#{member} should be a member") } + } end def teardown - clear + clear end end -- 1.7.1 -- You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
