ActiveSambaLdap 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. data/NEWS.en +40 -0
  2. data/NEWS.ja +44 -0
  3. data/README.en +366 -0
  4. data/README.ja +361 -0
  5. data/Rakefile +168 -0
  6. data/bin/asl-groupadd +73 -0
  7. data/bin/asl-groupadd.help +1 -0
  8. data/bin/asl-groupdel +61 -0
  9. data/bin/asl-groupdel.help +1 -0
  10. data/bin/asl-groupmod +137 -0
  11. data/bin/asl-groupmod.help +1 -0
  12. data/bin/asl-groupshow +33 -0
  13. data/bin/asl-groupshow.help +1 -0
  14. data/bin/asl-passwd +90 -0
  15. data/bin/asl-passwd.help +1 -0
  16. data/bin/asl-populate +101 -0
  17. data/bin/asl-populate.help +1 -0
  18. data/bin/asl-purge +26 -0
  19. data/bin/asl-purge.help +1 -0
  20. data/bin/asl-samba-computeradd +96 -0
  21. data/bin/asl-samba-computeradd.help +1 -0
  22. data/bin/asl-samba-groupadd +57 -0
  23. data/bin/asl-samba-groupadd.help +1 -0
  24. data/bin/asl-samba-groupdel +55 -0
  25. data/bin/asl-samba-groupdel.help +1 -0
  26. data/bin/asl-samba-groupmod +99 -0
  27. data/bin/asl-samba-groupmod.help +1 -0
  28. data/bin/asl-samba-useradd +100 -0
  29. data/bin/asl-samba-useradd.help +1 -0
  30. data/bin/asl-samba-userdel +49 -0
  31. data/bin/asl-samba-userdel.help +1 -0
  32. data/bin/asl-samba-usermod +94 -0
  33. data/bin/asl-samba-usermod.help +1 -0
  34. data/bin/asl-useradd +264 -0
  35. data/bin/asl-useradd.help +1 -0
  36. data/bin/asl-userdel +84 -0
  37. data/bin/asl-userdel.help +1 -0
  38. data/bin/asl-usermod +335 -0
  39. data/bin/asl-usermod.help +1 -0
  40. data/bin/asl-usershow +33 -0
  41. data/bin/asl-usershow.help +1 -0
  42. data/lib/active_samba_ldap.rb +42 -0
  43. data/lib/active_samba_ldap/account_entry.rb +208 -0
  44. data/lib/active_samba_ldap/base.rb +137 -0
  45. data/lib/active_samba_ldap/command.rb +100 -0
  46. data/lib/active_samba_ldap/computer.rb +24 -0
  47. data/lib/active_samba_ldap/computer_account_entry.rb +34 -0
  48. data/lib/active_samba_ldap/configuration.rb +333 -0
  49. data/lib/active_samba_ldap/dc.rb +19 -0
  50. data/lib/active_samba_ldap/entry.rb +81 -0
  51. data/lib/active_samba_ldap/get_text_support.rb +12 -0
  52. data/lib/active_samba_ldap/group.rb +17 -0
  53. data/lib/active_samba_ldap/group_entry.rb +187 -0
  54. data/lib/active_samba_ldap/idmap.rb +19 -0
  55. data/lib/active_samba_ldap/ou.rb +20 -0
  56. data/lib/active_samba_ldap/populate.rb +257 -0
  57. data/lib/active_samba_ldap/reloadable.rb +15 -0
  58. data/lib/active_samba_ldap/samba_account_entry.rb +225 -0
  59. data/lib/active_samba_ldap/samba_entry.rb +26 -0
  60. data/lib/active_samba_ldap/samba_group_entry.rb +143 -0
  61. data/lib/active_samba_ldap/unix_id_pool.rb +43 -0
  62. data/lib/active_samba_ldap/user.rb +44 -0
  63. data/lib/active_samba_ldap/user_account_entry.rb +30 -0
  64. data/lib/active_samba_ldap/version.rb +3 -0
  65. data/lib/samba/encrypt.rb +86 -0
  66. data/misc/rd2html.rb +42 -0
  67. data/po/ja/active-samba-ldap.po +465 -0
  68. data/rails/README +30 -0
  69. data/rails/init.rb +33 -0
  70. data/rails_generators/scaffold_active_samba_ldap/scaffold_active_samba_ldap_generator.rb +27 -0
  71. data/rails_generators/scaffold_active_samba_ldap/templates/computer.rb +3 -0
  72. data/rails_generators/scaffold_active_samba_ldap/templates/dc.rb +3 -0
  73. data/rails_generators/scaffold_active_samba_ldap/templates/group.rb +3 -0
  74. data/rails_generators/scaffold_active_samba_ldap/templates/idmap.rb +3 -0
  75. data/rails_generators/scaffold_active_samba_ldap/templates/ldap.yml +24 -0
  76. data/rails_generators/scaffold_active_samba_ldap/templates/ou.rb +3 -0
  77. data/rails_generators/scaffold_active_samba_ldap/templates/samba_controller.rb +12 -0
  78. data/rails_generators/scaffold_active_samba_ldap/templates/samba_helper.rb +2 -0
  79. data/rails_generators/scaffold_active_samba_ldap/templates/samba_index.rhtml +17 -0
  80. data/rails_generators/scaffold_active_samba_ldap/templates/samba_populate.rhtml +15 -0
  81. data/rails_generators/scaffold_active_samba_ldap/templates/samba_purge.rhtml +10 -0
  82. data/rails_generators/scaffold_active_samba_ldap/templates/unix_id_pool.rb +3 -0
  83. data/rails_generators/scaffold_active_samba_ldap/templates/user.rb +3 -0
  84. data/setup.rb +1585 -0
  85. data/test-unit/History.txt +107 -0
  86. data/test-unit/README.txt +52 -0
  87. data/test-unit/Rakefile +40 -0
  88. data/test-unit/TODO +5 -0
  89. data/test-unit/bin/testrb +5 -0
  90. data/test-unit/lib/test/unit.rb +342 -0
  91. data/test-unit/lib/test/unit/assertionfailederror.rb +14 -0
  92. data/test-unit/lib/test/unit/assertions.rb +1149 -0
  93. data/test-unit/lib/test/unit/attribute.rb +125 -0
  94. data/test-unit/lib/test/unit/autorunner.rb +329 -0
  95. data/test-unit/lib/test/unit/collector.rb +43 -0
  96. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  97. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  98. data/test-unit/lib/test/unit/collector/load.rb +135 -0
  99. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  100. data/test-unit/lib/test/unit/color-scheme.rb +86 -0
  101. data/test-unit/lib/test/unit/color.rb +96 -0
  102. data/test-unit/lib/test/unit/diff.rb +538 -0
  103. data/test-unit/lib/test/unit/error.rb +124 -0
  104. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  105. data/test-unit/lib/test/unit/failure.rb +110 -0
  106. data/test-unit/lib/test/unit/fixture.rb +176 -0
  107. data/test-unit/lib/test/unit/notification.rb +125 -0
  108. data/test-unit/lib/test/unit/omission.rb +143 -0
  109. data/test-unit/lib/test/unit/pending.rb +146 -0
  110. data/test-unit/lib/test/unit/priority.rb +181 -0
  111. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  112. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  113. data/test-unit/lib/test/unit/testcase.rb +425 -0
  114. data/test-unit/lib/test/unit/testresult.rb +89 -0
  115. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  116. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  117. data/test-unit/lib/test/unit/ui/console/testrunner.rb +223 -0
  118. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +49 -0
  119. data/test-unit/lib/test/unit/ui/testrunner.rb +20 -0
  120. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  121. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  122. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  123. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  124. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  125. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  126. data/test-unit/lib/test/unit/version.rb +7 -0
  127. data/test-unit/sample/adder.rb +13 -0
  128. data/test-unit/sample/subtracter.rb +12 -0
  129. data/test-unit/sample/tc_adder.rb +18 -0
  130. data/test-unit/sample/tc_subtracter.rb +18 -0
  131. data/test-unit/sample/test_user.rb +22 -0
  132. data/test-unit/sample/ts_examples.rb +7 -0
  133. data/test-unit/test/collector/test-descendant.rb +135 -0
  134. data/test-unit/test/collector/test-load.rb +333 -0
  135. data/test-unit/test/collector/test_dir.rb +406 -0
  136. data/test-unit/test/collector/test_objectspace.rb +98 -0
  137. data/test-unit/test/run-test.rb +13 -0
  138. data/test-unit/test/test-attribute.rb +86 -0
  139. data/test-unit/test/test-color-scheme.rb +56 -0
  140. data/test-unit/test/test-color.rb +47 -0
  141. data/test-unit/test/test-diff.rb +477 -0
  142. data/test-unit/test/test-emacs-runner.rb +60 -0
  143. data/test-unit/test/test-fixture.rb +287 -0
  144. data/test-unit/test/test-notification.rb +33 -0
  145. data/test-unit/test/test-omission.rb +81 -0
  146. data/test-unit/test/test-pending.rb +70 -0
  147. data/test-unit/test/test-priority.rb +119 -0
  148. data/test-unit/test/test-testcase.rb +507 -0
  149. data/test-unit/test/test_assertions.rb +1082 -0
  150. data/test-unit/test/test_error.rb +26 -0
  151. data/test-unit/test/test_failure.rb +33 -0
  152. data/test-unit/test/test_testresult.rb +113 -0
  153. data/test-unit/test/test_testsuite.rb +129 -0
  154. data/test-unit/test/testunit-test-util.rb +14 -0
  155. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  156. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  157. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  158. data/test-unit/test/util/test_observable.rb +102 -0
  159. data/test-unit/test/util/test_procwrapper.rb +36 -0
  160. data/test/asl-test-utils.rb +276 -0
  161. data/test/command.rb +67 -0
  162. data/test/config.yaml.sample +17 -0
  163. data/test/run-test.rb +20 -0
  164. data/test/test_asl_groupadd.rb +69 -0
  165. data/test/test_asl_groupdel.rb +88 -0
  166. data/test/test_asl_groupmod.rb +259 -0
  167. data/test/test_asl_groupshow.rb +21 -0
  168. data/test/test_asl_passwd.rb +126 -0
  169. data/test/test_asl_populate.rb +92 -0
  170. data/test/test_asl_purge.rb +21 -0
  171. data/test/test_asl_useradd.rb +712 -0
  172. data/test/test_asl_userdel.rb +75 -0
  173. data/test/test_asl_usermod.rb +549 -0
  174. data/test/test_asl_usershow.rb +27 -0
  175. data/test/test_entry.rb +21 -0
  176. data/test/test_group.rb +21 -0
  177. data/test/test_password.rb +51 -0
  178. data/test/test_samba_encrypt.rb +35 -0
  179. data/test/test_user_home_directory.rb +43 -0
  180. metadata +314 -0
@@ -0,0 +1,19 @@
1
+ require 'active_samba_ldap/base'
2
+
3
+ module ActiveSambaLdap
4
+ class Dc < Base
5
+ include Reloadable
6
+
7
+ class << self
8
+ def ldap_mapping(options={})
9
+ default_options = {
10
+ :dn_attribute => "dc",
11
+ :prefix => "",
12
+ :classes => ["top", "dcObject", "organization"],
13
+ }
14
+ options = default_options.merge(options)
15
+ super(options)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,81 @@
1
+ module ActiveSambaLdap
2
+ module Entry
3
+ def self.included(base)
4
+ super
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+ module ClassMethods
9
+ def create(attributes=nil)
10
+ pool = nil
11
+ number_key = nil
12
+ attributes ||= {}
13
+ attributes = attributes.stringify_keys
14
+ ensure_ou(attributes[dn_attribute])
15
+ entry = super do |entry|
16
+ options, pool, number_key = prepare_create_options(entry, attributes)
17
+ entry.fill_default_values(options)
18
+ yield entry if block_given?
19
+ end
20
+ if entry.errors.empty? and pool
21
+ pool[number_key] = Integer(entry[number_key]).succ
22
+ unless pool.save
23
+ pool.each do |key, value|
24
+ entry.add("pool: #{key}", value)
25
+ end
26
+ end
27
+ end
28
+ entry
29
+ end
30
+
31
+ private
32
+ def ensure_ou(dn)
33
+ return if dn.nil?
34
+ dn_value, ou = dn.split(/,/, 2)
35
+ return if ou.nil?
36
+ prefixes = [prefix]
37
+ ou.split(/\s*,\s*/).reverse_each do |entry|
38
+ name, value = entry.split(/\s*=\s*/, 2).collect {|x| x.strip}
39
+ raise ArgumentError, _("%s must be only ou") % ou if name != "ou"
40
+ ou_class = Class.new(ActiveSambaLdap::Ou)
41
+ ou_class.ldap_mapping :prefix => prefixes.join(',')
42
+ prefixes.unshift(entry)
43
+ next if ou_class.exists?(value)
44
+ ou = ou_class.new(value)
45
+ ou.save!
46
+ end
47
+ end
48
+
49
+ def prepare_create_options_for_number(key, entry, options)
50
+ options = {key => entry[key]}.merge(options)
51
+ number, pool = ensure_number(key, options)
52
+ [options.merge(key => number), pool, key]
53
+ end
54
+
55
+ def ensure_number(key, options)
56
+ number = options[key]
57
+ pool = nil
58
+ unless number
59
+ pool = ensure_pool(options)
60
+ number = pool.send("find_available_#{key}", self)
61
+ end
62
+ [number, pool]
63
+ end
64
+
65
+ def ensure_pool(options)
66
+ pool = options[:pool]
67
+ unless pool
68
+ pool_class = options[:pool_class]
69
+ unless pool_class
70
+ pool_class = Class.new(UnixIdPool)
71
+ pool_class.ldap_mapping
72
+ end
73
+ samba_domain = options[:samba_domain]
74
+ samba_domain ||= pool_class.configuration[:samba_domain]
75
+ pool = options[:pool] = pool_class.find(samba_domain)
76
+ end
77
+ pool
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,12 @@
1
+ module ActiveSambaLdap
2
+ module GetTextSupport
3
+ class << self
4
+ def included(base)
5
+ base.class_eval do
6
+ include(ActiveLdap::GetText)
7
+ bindtextdomain("active-samba-ldap")
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ require 'active_samba_ldap/base'
2
+ require 'active_samba_ldap/entry'
3
+ require 'active_samba_ldap/samba_entry'
4
+ require 'active_samba_ldap/group_entry'
5
+ require 'active_samba_ldap/samba_group_entry'
6
+
7
+ module ActiveSambaLdap
8
+ class Group < Base
9
+ include Reloadable
10
+
11
+ include Entry
12
+ include SambaEntry
13
+
14
+ include GroupEntry
15
+ include SambaGroupEntry
16
+ end
17
+ end
@@ -0,0 +1,187 @@
1
+ require 'English'
2
+
3
+ require 'active_samba_ldap/entry'
4
+
5
+ module ActiveSambaLdap
6
+ module GroupEntry
7
+ def self.included(base)
8
+ super
9
+ base.extend(ClassMethods)
10
+ end
11
+
12
+ module ClassMethods
13
+ def ldap_mapping(options={})
14
+ options = default_options.merge(options)
15
+ super(extract_ldap_mapping_options(options))
16
+ init_associations(options)
17
+ end
18
+
19
+ def find_by_name_or_gid_number(key)
20
+ group = nil
21
+ begin
22
+ gid_number = Integer(key)
23
+ group = find_by_gid_number(gid_number)
24
+ raise GidNumberDoesNotExist.new(gid_number) if group.nil?
25
+ rescue ArgumentError
26
+ raise GroupDoesNotExist.new(key) unless exists?(key)
27
+ group = find(key)
28
+ end
29
+ group
30
+ end
31
+
32
+ def find_by_gid_number(number)
33
+ find(:first, :filter => ["gidNumber", Integer(number)])
34
+ end
35
+
36
+ private
37
+ def default_options
38
+ {
39
+ :dn_attribute => "cn",
40
+ :prefix => configuration[:groups_suffix],
41
+ :classes => default_classes,
42
+ :recommended_classes => default_recommended_classes,
43
+
44
+ :members_wrap => "memberUid",
45
+ :users_class => default_user_class,
46
+ :computers_class => default_computer_class,
47
+
48
+ :primary_members_foreign_key => "gidNumber",
49
+ :primary_members_primary_key => "gidNumber",
50
+ :primary_users_class => default_user_class,
51
+ :primary_computers_class => default_computer_class,
52
+ }
53
+ end
54
+
55
+ def default_classes
56
+ ["top", "posixGroup"]
57
+ end
58
+
59
+ def default_recommended_classes
60
+ []
61
+ end
62
+
63
+ def default_user_class
64
+ "User"
65
+ end
66
+
67
+ def default_computer_class
68
+ "Computer"
69
+ end
70
+
71
+ def init_associations(options)
72
+ association_options = {}
73
+ options.each do |key, value|
74
+ case key.to_s
75
+ when /^((?:primary_)?(?:(?:user|computer|member)s))_/
76
+ association_options[$1] ||= {}
77
+ association_options[$1][$POSTMATCH.to_sym] = value
78
+ end
79
+ end
80
+
81
+ members_opts = association_options["members"] || {}
82
+ user_members_opts = association_options["users"] || {}
83
+ computer_members_opts = association_options["computers"] || {}
84
+ has_many :users, members_opts.merge(user_members_opts)
85
+ has_many :computers, members_opts.merge(computer_members_opts)
86
+
87
+ primary_members_opts = association_options["primary_members"] || {}
88
+ primary_user_members_opts =
89
+ association_options["primary_users"] || {}
90
+ primary_computer_members_opts =
91
+ association_options["primary_computers"] || {}
92
+ has_many :primary_users,
93
+ primary_members_opts.merge(primary_user_members_opts)
94
+ has_many :primary_computers,
95
+ primary_members_opts.merge(primary_computer_members_opts)
96
+ end
97
+
98
+ def prepare_create_options(group, options)
99
+ prepare_create_options_for_number("gid_number", group, options)
100
+ end
101
+ end
102
+
103
+ def fill_default_values(options={})
104
+ options = options.stringify_keys
105
+ gid_number = options["gid_number"]
106
+ change_gid_number(gid_number) if gid_number
107
+ self.description ||= options["description"] || cn
108
+ end
109
+
110
+ def members
111
+ users.to_ary + computers.to_ary
112
+ end
113
+
114
+ def reload_members
115
+ users.reload
116
+ computers.reload
117
+ end
118
+
119
+ def primary_members
120
+ primary_users.to_ary + primary_computers.to_ary
121
+ end
122
+
123
+ def reload_primary_members
124
+ primary_users.reload
125
+ primary_computers.reload
126
+ end
127
+
128
+ def change_gid_number(gid, allow_non_unique=false)
129
+ check_unique_gid_number(gid) unless allow_non_unique
130
+ self.gid_number = gid
131
+ end
132
+
133
+ def destroy(options={})
134
+ if options[:remove_members]
135
+ if options[:force_change_primary_members]
136
+ change_primary_members(options)
137
+ end
138
+ reload_primary_members
139
+ unless primary_members.empty?
140
+ not_destroyed_members = primary_members.collect {|x| x.uid}
141
+ raise PrimaryGroupCanNotBeDestroyed.new(cn, not_destroyed_members)
142
+ end
143
+ self.users = []
144
+ self.computers = []
145
+ end
146
+ super()
147
+ end
148
+
149
+ private
150
+ def ensure_uid(member_or_uid)
151
+ if member_or_uid.is_a?(String)
152
+ member_or_uid
153
+ else
154
+ member_or_uid.uid
155
+ end
156
+ end
157
+
158
+ def check_unique_gid_number(gid_number)
159
+ ActiveSambaLdap::Base.restart_nscd do
160
+ if self.class.find_by_gid_number(gid_number)
161
+ raise GidNumberAlreadyExists.new(gid_number)
162
+ end
163
+ end
164
+ end
165
+
166
+ def change_primary_members(options={})
167
+ name = cn
168
+
169
+ pr_members = primary_members
170
+ cannot_removed_members = []
171
+ pr_members.each do |member|
172
+ if (member.groups.collect {|group| group.cn} - [name]).empty?
173
+ cannot_removed_members << member.uid
174
+ end
175
+ end
176
+ unless cannot_removed_members.empty?
177
+ raise CanNotChangePrimaryGroup.new(name, cannot_removed_members)
178
+ end
179
+
180
+ pr_members.each do |member|
181
+ new_group = member.groups.find {|gr| gr.cn != name}
182
+ member.primary_group = new_group
183
+ member.save!
184
+ end
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,19 @@
1
+ require 'active_samba_ldap/base'
2
+
3
+ module ActiveSambaLdap
4
+ class Idmap < Base
5
+ include Reloadable
6
+
7
+ class << self
8
+ def ldap_mapping(options={})
9
+ default_options = {
10
+ :dn_attribute => "sambaSID",
11
+ :prefix => configuration[:idmap_suffix],
12
+ :classes => ["top", "sambaIdmapEntry"],
13
+ }
14
+ options = default_options.merge(options)
15
+ super options
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ require 'active_samba_ldap/base'
2
+
3
+ module ActiveSambaLdap
4
+ class Ou < Base
5
+ include Reloadable
6
+
7
+ class << self
8
+ def ldap_mapping(options={})
9
+ default_options = {
10
+ :dn_attribute => "ou",
11
+ :prefix => "",
12
+ :classes => ["top", "organizationalUnit"],
13
+ :scope => :sub,
14
+ }
15
+ options = default_options.merge(options)
16
+ super(options)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,257 @@
1
+ module ActiveSambaLdap
2
+ module Populate
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+ def populate(options={})
9
+ Private.new(self, options).populate
10
+ end
11
+
12
+ def purge(options={})
13
+ self.delete_all(nil, {:scope => :sub}.merge(options))
14
+ end
15
+
16
+ class Private
17
+ def initialize(base, options)
18
+ @base = base
19
+ @options = options.dup
20
+ end
21
+
22
+ def populate
23
+ init_classes
24
+ init_options
25
+
26
+ entries = []
27
+ entries.concat(ensure_base)
28
+ entries.concat(ensure_group_base)
29
+ entries.concat(ensure_user_base)
30
+ entries.concat(ensure_computer_base)
31
+ entries.concat(ensure_idmap_base)
32
+ entries.concat(make_groups)
33
+ entries.concat(make_users)
34
+ entries.concat(make_pool)
35
+
36
+ [entries, @options]
37
+ end
38
+
39
+ def init_classes
40
+ @options[:user_class] = user_class = Class.new(User)
41
+ @options[:group_class] = group_class = Class.new(Group)
42
+ @options[:computer_class] = computer_class = Class.new(Computer)
43
+ @options[:idmap_class] = idmap_class = Class.new(Idmap)
44
+ @options[:unix_id_pool_class] = id_pool_class = Class.new(UnixIdPool)
45
+
46
+ user_class.ldap_mapping
47
+ group_class.ldap_mapping
48
+ computer_class.ldap_mapping
49
+ idmap_class.ldap_mapping
50
+ id_pool_class.ldap_mapping
51
+
52
+ user_class.set_associated_class(:primary_group, group_class)
53
+ computer_class.set_associated_class(:primary_group, group_class)
54
+ user_class.set_associated_class(:groups, group_class)
55
+ computer_class.set_associated_class(:groups, group_class)
56
+
57
+ group_class.set_associated_class(:users, user_class)
58
+ group_class.set_associated_class(:computers, computer_class)
59
+ group_class.set_associated_class(:primary_users, user_class)
60
+ group_class.set_associated_class(:primary_computers, computer_class)
61
+ end
62
+
63
+ def user_class
64
+ @options[:user_class]
65
+ end
66
+
67
+ def group_class
68
+ @options[:group_class]
69
+ end
70
+
71
+ def computer_class
72
+ @options[:computer_class]
73
+ end
74
+
75
+ def idmap_class
76
+ @options[:idmap_class]
77
+ end
78
+
79
+ def init_options
80
+ config = @base.configuration
81
+ @options[:start_uid] ||= Integer(config[:start_uid])
82
+ @options[:start_gid] ||= Integer(config[:start_gid])
83
+ @options[:administrator] ||= user_class::DOMAIN_ADMIN_NAME
84
+ @options[:administrator_uid] ||=
85
+ user_class.rid2uid(user_class::DOMAIN_ADMIN_RID)
86
+ @options[:administrator_gid] ||=
87
+ group_class.rid2gid(group_class::DOMAIN_ADMINS_RID)
88
+ @options[:guest] ||= user_class::DOMAIN_GUEST_NAME
89
+ @options[:guest_uid] ||=
90
+ user_class.rid2uid(user_class::DOMAIN_GUEST_RID)
91
+ @options[:guest_gid] ||=
92
+ group_class.rid2gid(group_class::DOMAIN_GUESTS_RID)
93
+ @options[:default_user_gid] ||= config[:default_user_gid]
94
+ @options[:default_computer_gid] ||= config[:default_computer_gid]
95
+ end
96
+
97
+ def ensure_container_base(dn, target_name, klass, ignore_base=false)
98
+ entries = []
99
+ suffixes = []
100
+ dn.split(/,/).reverse_each do |suffix|
101
+ name, value = suffix.split(/=/, 2)
102
+ next unless name == target_name
103
+ container_class = Class.new(klass)
104
+ prefix = suffixes.reverse.join(",")
105
+ suffixes << suffix
106
+ if ignore_base
107
+ container_class.ldap_mapping :prefix => "", :scope => :base
108
+ container_class.base = prefix
109
+ else
110
+ container_class.ldap_mapping :prefix => prefix, :scope => :base
111
+ end
112
+ next if container_class.exists?(value, :prefix => suffix)
113
+ container = container_class.new(value)
114
+ yield(container) if block_given?
115
+ begin
116
+ container.save!
117
+ rescue ActiveLdap::OperationNotPermitted
118
+ end
119
+ entries << container
120
+ end
121
+ entries
122
+ end
123
+
124
+ def ensure_base
125
+ ensure_container_base(@base.base, "dc", Dc, true) do |dc|
126
+ dc.o = dc.dc
127
+ end
128
+ end
129
+
130
+ def ensure_ou_base(dn)
131
+ ensure_container_base(dn, "ou", Ou)
132
+ end
133
+
134
+ def ensure_user_base
135
+ ensure_ou_base(user_class.prefix)
136
+ end
137
+
138
+ def ensure_group_base
139
+ ensure_ou_base(group_class.prefix)
140
+ end
141
+
142
+ def ensure_computer_base
143
+ ensure_ou_base(computer_class.prefix)
144
+ end
145
+
146
+ def ensure_idmap_base
147
+ ensure_ou_base(idmap_class.prefix)
148
+ end
149
+
150
+ def make_user(user_class, name, uid, group)
151
+ if user_class.exists?(name)
152
+ user = user_class.find(name)
153
+ group = nil
154
+ else
155
+ user = user_class.new(name)
156
+ user.fill_default_values("uid_number" => uid, "group" => group)
157
+ user.save!
158
+ group.users << user
159
+ end
160
+ [user, group]
161
+ end
162
+
163
+ def make_users
164
+ user_class = @options[:user_class]
165
+ group_class = @options[:group_class]
166
+ entries = []
167
+ [
168
+ [@options[:administrator], @options[:administrator_uid],
169
+ @options[:administrator_gid]],
170
+ [@options[:guest], @options[:guest_uid], @options[:guest_gid]],
171
+ ].each do |name, uid, gid|
172
+ user, group = make_user(user_class, name, uid,
173
+ group_class.find_by_gid_number(gid))
174
+ entries << user
175
+ if group
176
+ old_group = entries.find do |entry|
177
+ entry.is_a?(group_class) and entry.cn == group.cn
178
+ end
179
+ index = entries.index(old_group)
180
+ if index
181
+ entries[index] = group
182
+ else
183
+ entries << group
184
+ end
185
+ end
186
+ end
187
+ entries
188
+ end
189
+
190
+ def make_group(group_class, name, gid, description=nil, type=nil)
191
+ if group_class.exists?(name)
192
+ group = group_class.find(name)
193
+ else
194
+ group = group_class.new(name)
195
+ group.change_type(type || "domain")
196
+ group.display_name = name
197
+ group.description = name || description
198
+ group.change_gid_number(gid)
199
+
200
+ group.save!
201
+ end
202
+ group
203
+ end
204
+
205
+ def make_groups
206
+ entries = []
207
+ [
208
+ ["Domain Admins", @options[:administrator_gid],
209
+ "Netbios Domain Administrators"],
210
+ ["Domain Users", @options[:default_user_gid],
211
+ "Netbios Domain Users"],
212
+ ["Domain Guests", @options[:guest_gid],
213
+ "Netbios Domain Guest Users"],
214
+ ["Domain Computers", @options[:default_computer_gid],
215
+ "Netbios Domain Computers"],
216
+ ["Administrators", nil, nil, "builtin",
217
+ group_class::LOCAL_ADMINS_RID],
218
+ ["Users", nil, nil, "builtin", group_class::LOCAL_USERS_RID],
219
+ ["Guests", nil, nil, "builtin", group_class::LOCAL_GUESTS_RID],
220
+ ["Power Users", nil, nil, "builtin",
221
+ group_class::LOCAL_POWER_USERS_RID],
222
+ ["Account Operators", nil, nil, "builtin",
223
+ group_class::LOCAL_ACCOUNT_OPERATORS_RID],
224
+ ["System Operators", nil, nil, "builtin",
225
+ group_class::LOCAL_SYSTEM_OPERATORS_RID],
226
+ ["Print Operators", nil, nil, "builtin",
227
+ group_class::LOCAL_PRINT_OPERATORS_RID],
228
+ ["Backup Operators", nil, nil, "builtin",
229
+ group_class::LOCAL_BACKUP_OPERATORS_RID],
230
+ ["Replicators", nil, nil, "builtin",
231
+ group_class::LOCAL_REPLICATORS_RID],
232
+ ].each do |name, gid, description, type, rid|
233
+ gid ||= group_class.rid2gid(rid)
234
+ entries << make_group(group_class, name, gid, description, type)
235
+ end
236
+ entries
237
+ end
238
+
239
+ def make_pool
240
+ config = @base.configuration
241
+ klass = @options[:unix_id_pool_class]
242
+ name = config[:samba_domain]
243
+ if klass.exists?(name)
244
+ pool = klass.find(name)
245
+ else
246
+ pool = klass.new(name)
247
+ pool.samba_sid = config[:sid]
248
+ pool.uid_number = @options[:start_uid]
249
+ pool.gid_number = @options[:start_gid]
250
+ pool.save!
251
+ end
252
+ [pool]
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end