sys-admin 1.4.2 → 1.4.3

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.
data/CHANGES CHANGED
@@ -1,3 +1,11 @@
1
+ == 1.4.3 - 2-Mar-2008
2
+ * The block form of Admin.users now properly ensures that endpwent() is
3
+ called. Likewise, the block form of Admin.groups now properly ensures
4
+ that endgrent() is called. This would only have been an issue if you
5
+ broke out of the block before it terminated.
6
+ * The AdminError class is now Admin::Error.
7
+ * Some internal directory layout changes.
8
+
1
9
  == 1.4.2 - 26-Jun-2007
2
10
  * Fixed a bug in the Admin.get_login method where it would return junk
3
11
  if the underlying getlogin() function failed (Unix). Thanks go to Gonzalo
data/README CHANGED
@@ -131,7 +131,7 @@ Admin.users(host=localhost, local=true){ |user| ... }
131
131
  * passwd
132
132
 
133
133
  == Error Classes
134
- AdminError < StandardError
134
+ Admin::Error < StandardError
135
135
  Raised if anything goes wrong with any of the above methods.
136
136
 
137
137
  == Developer's Notes
@@ -166,6 +166,8 @@ AdminError < StandardError
166
166
  * Admin.config_global_group
167
167
  * Admin.delete_global_group
168
168
 
169
+ Make the User and Group objects comparable.
170
+
169
171
  == Known Bugs
170
172
  None that I'm aware of. If you find any, please log them on the project
171
173
  page at http://www.rubyforge.org/projects/sysutils.
@@ -174,7 +176,7 @@ AdminError < StandardError
174
176
  Ruby's
175
177
 
176
178
  == Copyright
177
- (C) 2005-2007, Daniel J. Berger
179
+ (C) 2005-2008, Daniel J. Berger
178
180
  All Rights Reserved
179
181
 
180
182
  == Author
data/Rakefile CHANGED
@@ -8,9 +8,9 @@ desc "Clean the build files for the sys-admin source for UNIX systems"
8
8
  task :clean do
9
9
  Dir.chdir('ext') do
10
10
  unless RUBY_PLATFORM.match('mswin')
11
- FileUtils.rm_rf('sys') if File.exists?('sys')
12
11
  build_file = 'admin.' + Config::CONFIG['DLEXT']
13
12
  sh 'make distclean' if File.exists?(build_file)
13
+ File.delete("sys/#{build_file}") if File.exists?("sys/#{build_file}")
14
14
  end
15
15
  end
16
16
  end
@@ -22,7 +22,6 @@ task :build => [:clean] do
22
22
  ruby 'extconf.rb'
23
23
  sh 'make'
24
24
  build_file = 'admin.' + Config::CONFIG['DLEXT']
25
- Dir.mkdir('sys') unless File.exists?('sys')
26
25
  FileUtils.cp(build_file, 'sys')
27
26
  end
28
27
  end
@@ -0,0 +1,164 @@
1
+ = Description
2
+ A unified, cross-platform replacement for the Etc module that allows you to
3
+ get information about users and groups.
4
+
5
+ = Synopsis
6
+ require 'sys/admin'
7
+ include Sys
8
+
9
+ Admin.get_login # -> 'djberge'
10
+ Admin.get_user('djberge') # -> Admin::User object
11
+ Admin.get_group(501) # -> Admin::Group object
12
+
13
+ # Iterate over all users
14
+ Admin.users do |usr|
15
+ p usr
16
+ end
17
+
18
+ # Iterate over all groups
19
+ Admin.groups do |grp|
20
+ p grp
21
+ end
22
+
23
+ = Constants
24
+
25
+ = Class Methods
26
+ == Sys::Admin
27
+ Admin.get_group(name)
28
+ Admin.get_group(gid)
29
+ Returns a Group object for the given name or gid. Raises an Admin::Error
30
+ if a group cannot be found for that name or GID.
31
+
32
+ Admin.get_login
33
+ Returns the login for the process. If this is called from a process that
34
+ has no controlling terminal, then it resorts to returning the "LOGNAME"
35
+ or "USER" environment variable. If neither of those is defined, then nil
36
+ is returned.
37
+
38
+ Note that this method will probably return the real user login, but may
39
+ return the effective user login. YMMV depending on your platform and how
40
+ the program is run.
41
+
42
+ Admin.get_user(name)
43
+ Admin.get_user(uid)
44
+ Returns a User object for the given name or uid. Raises an Admin::Error if
45
+ a user cannot be found for that name or user ID.
46
+
47
+ Admin.groups
48
+ Admin.groups{ |grp| ... }
49
+ In block form, yields a Group object for each group on the system. In
50
+ non-block form, returns an Array of Group objects.
51
+
52
+ Admin.users
53
+ Admin.users{ |grp| ... }
54
+ In block form, yields a User object for each group on the system. In
55
+ non-block form, returns an Array of User objects.
56
+
57
+ == Sys::Admin::Group
58
+ Group.new
59
+ Group.new{ |grp| ... }
60
+ Creates and returns a Group object, which encapsulates the information
61
+ typically found within an /etc/group entry, i.e. a struct group. If a
62
+ block is provided, yields the object back to the block.
63
+
64
+ At the moment this is only useful for MS Windows.
65
+
66
+ == Sys::Admin::User
67
+ User.new
68
+ User.new{ |usr| ... }
69
+ Creates and returns a User object, which encapsulates the information
70
+ typically found within an /etc/passwd entry, i.e. a struct passwd. If a
71
+ block is provided, yields the object back to the block.
72
+
73
+ At the moment this is only useful for MS Windows.
74
+
75
+ = Instance Methods
76
+ == Sys::Admin::Group
77
+ Group#gid
78
+ The group id.
79
+
80
+ Group#members
81
+ An array of users that are members of the group.
82
+
83
+ Group#name
84
+ The name of the group.
85
+
86
+ Group#passwd
87
+ The group password, if any.
88
+
89
+ == Sys::Admin::User
90
+ User#age
91
+ Used in the past for password aging. Deprecated in favor of /etc/shadow.
92
+
93
+ User#change
94
+ Next date a password change will be needed.
95
+
96
+ User#class
97
+ The user's access class.
98
+
99
+ User#comment
100
+ Another comment field. Rarely used.
101
+
102
+ User#dir
103
+ The absolute pathname of the user's home directory.
104
+
105
+ User#expire
106
+ Account expiration date.
107
+
108
+ User#gecos
109
+ A comment field. Rarely used.
110
+
111
+ User#gid
112
+ The user's primary group id.
113
+
114
+ User#login_device
115
+ The name of the terminal device the user last logged on with.
116
+
117
+ User#login_host
118
+ The hostname from which the user last logged in.
119
+
120
+ User#login_time
121
+ The last time the user logged in.
122
+
123
+ User#name
124
+ The user name associated with the account.
125
+
126
+ User#passwd
127
+ The user's encrypted password. Deprecated in favor of /etc/shadow.
128
+
129
+ User#quota
130
+ The user's alloted amount of disk space.
131
+
132
+ User#shell
133
+ The user's login shell.
134
+
135
+ User#uid
136
+ The user's user id.
137
+
138
+ == Notes
139
+ Not all platforms support all of the User members. The only ones that are
140
+ supported on all platforms are name, uid, gid, dir and shell. The rest
141
+ will simply return nil if they aren't supported.
142
+
143
+ == Known Bugs
144
+ None that I am aware of. Please log any bugs you find on the project
145
+ website at http://www.rubyforge.org/projects/sysutils.
146
+
147
+ == License
148
+ Ruby's
149
+
150
+ == Copyright
151
+ Copyright 2002-2007, Daniel J. Berger
152
+
153
+ All Rights Reserved. This module is free software. It may be used,
154
+ redistributed and/or modified under the same terms as Ruby itself.
155
+
156
+ == Warranty
157
+ This package is provided "as is" and without any express or
158
+ implied warranties, including, without limitation, the implied
159
+ warranties of merchantability and fitness for a particular purpose.
160
+
161
+ == Author
162
+ Daniel J. Berger
163
+ djberg96 at nospam at gmail dot com
164
+ imperator on IRC (Freenode)
@@ -0,0 +1,330 @@
1
+ = Description
2
+ A unified, cross-platform replacement for the Etc module that allows you to
3
+ get information about users and groups.
4
+
5
+ = Synopsis
6
+ require 'sys/admin'
7
+ include Sys
8
+
9
+ Admin.get_login # -> 'djberge'
10
+ Admin.get_user('djberge') # -> Admin::User object
11
+ Admin.get_group(501) # -> Admin::Group object
12
+
13
+ # Iterate over all users
14
+ Admin.users do |usr|
15
+ p usr
16
+ end
17
+
18
+ # Iterate over all groups
19
+ Admin.groups do |grp|
20
+ p grp
21
+ end
22
+
23
+ = Constants
24
+ == Sys::Admin
25
+ VERSION
26
+ The version of this package, returned as a String.
27
+
28
+ == Sys::Admin::User
29
+ TEMP_DUPLICATE
30
+ An account for users whose primary account is in another domain.
31
+
32
+ NORMAL
33
+ Default account type that represents a typical user.
34
+
35
+ INTERDOMAIN_TRUST
36
+ A permit to trust account for a domain that trusts other domains.
37
+
38
+ WORKSTATION_TRUST
39
+ An account for a Windows NT/2000 workstation or server that is a member
40
+ member of this domain.
41
+
42
+ SERVER_TRUST
43
+ A computer account for a backup domain controller that is a member of this
44
+ domain.
45
+
46
+ = Class Methods
47
+ == Sys::Admin
48
+ Admin.add_global_group(group, domain)
49
+ Adds the global +group+ on +domain+.
50
+
51
+ Admin.add_global_user(user, domain)
52
+ Adds the global +user+ on +domain+.
53
+
54
+ Admin.add_local_group(group, host=localhost)
55
+ Adds the local +group+ on +host+, or the localhost if no host is specified.
56
+
57
+ Admin.add_local_user(user, host=localhost)
58
+ Adds the local +user+ on +host+, or the localhost if no host is specified.
59
+
60
+ Admin.config_global_group(user, option, domain)
61
+ Configures +group+ on +domain+ using +options+. There are too many options
62
+ to list here.
63
+
64
+ See http://tinyurl.com/cjkzl for a list of valid options.
65
+
66
+ Admin.config_local_group(user, option, host=localhost)
67
+ Configures +group+ on +host+ using +options+. There are too many options
68
+ to list here.
69
+
70
+ See http://tinyurl.com/cjkzl for a list of valid options.
71
+
72
+ Admin.config_global_user(user, option, domain)
73
+ Configures +user+ on +domain+ using +options+. There are too many options
74
+ to list here.
75
+
76
+ See http://tinyurl.com/3hjv9 for a list of valid options.
77
+
78
+ Admin.config_local_user(user, options, host=localhost)
79
+ Configures the local +user+ on +host+ using +options+. If no host is
80
+ specified, the default is localhost.
81
+
82
+ See http://tinyurl.com/3hjv9 for a list of valid options.
83
+
84
+ Admin.delete_global_group(group, domain)
85
+ Deletes the global +group+ from +domain+.
86
+
87
+ Admin.delete_global_user(user, domain)
88
+ Deletes the global +user+ from +domain+.
89
+
90
+ Admin.delete_local_group(group, host=localhost)
91
+ Deletes the local +group+ from +host+, or localhost if no host is specified.
92
+
93
+ Admin.delete_local_user(user, host=localhost)
94
+ Deletes the local +user+ from +host+, or localhost if no host is specified.
95
+
96
+ Admin.get_group(name, host=localhost, local=true)
97
+ Admin.get_group(gid, host=localhost, local=true)
98
+ Returns a Group object for the given name or gid. Raises an Admin::Error
99
+ if a group cannot be found for that name or GID.
100
+
101
+ You may specify a host from which information is retrieved.
102
+ The default is the local machine. You can retrieve either a global or
103
+ local group, depending on the value of the +local+ argument.
104
+
105
+ Admin.get_login
106
+ Returns the user name of the current login.
107
+
108
+ Admin.get_user(name, host=localhost, local=true)
109
+ Admin.get_user(uid, host=localhost, local=true)
110
+ Returns a User object for the given name or uid. Raises an Admin::Error if
111
+ a user cannot be found for that name or user ID.
112
+
113
+ You may specify a +host+ from which information is retrieved. The
114
+ default is the local machine. You may also specify whether to
115
+ retrieve a local or global account. The default is local.
116
+
117
+ Admin.groups(host=localhost, local=true)
118
+ Admin.groups(host=localhost, local=true){ |grp| ... }
119
+ In block form, yields a Group object for each group on the system. In
120
+ non-block form, returns an Array of Group objects.
121
+
122
+ You may specify a +host+ from which information is retrieved. The default
123
+ is the local machine. You can retrieve either a global or local groups,
124
+ depending on the value of the +local+ argument. The default is local.
125
+
126
+ Admin.users(host=localhost, local=true)
127
+ Admin.users(host=localhost, local=true){ |grp| ... }
128
+ In block form, yields a User object for each group on the system. In
129
+ non-block form, returns an Array of User objects.
130
+
131
+ You may specify a +host+ from which information is retrieved. The default
132
+ is the local machine. You can retrieve either a global or local users,
133
+ depending on the value of the +local+ argument. The default is local.
134
+
135
+ == Sys::Admin::Group
136
+ Group.new
137
+ Group.new{ |grp| ... }
138
+ Creates and returns a Group object, which encapsulates the information
139
+ typically found within an /etc/group entry, i.e. a struct group. If a
140
+ block is provided, yields the object back to the block.
141
+
142
+ == Sys::Admin::User
143
+ User.new
144
+ User.new{ |usr| ... }
145
+ Creates and returns a User object, which encapsulates the information
146
+ typically found within an /etc/passwd entry, i.e. a struct passwd. If a
147
+ block is provided, yields the object back to the block.
148
+
149
+ = Instance Methods
150
+ == Sys::Admin::Group
151
+ Group#caption
152
+ Short description of the group.
153
+
154
+ Group#caption=
155
+ Sets the caption for the group. Use only when creating a new group.
156
+
157
+ Group#description
158
+ Description of the group.
159
+
160
+ Group#description=
161
+ Sets the description of the group. Use only when creating a new group.
162
+
163
+ Group#domain
164
+ The name of the Windows domain to which the group account belongs.
165
+
166
+ Group#domain=
167
+ Sets the name of the Windows domain to which the group account belongs.
168
+ Use only when creating a new group.
169
+
170
+ Group#install_date
171
+ The date the group was added.
172
+
173
+ Group#gid
174
+ The group id.
175
+
176
+ Group#local?
177
+ Returns whether or not the group is local (vs global).
178
+
179
+ Group#local=
180
+ Sets whether or not the group is local (vs global).
181
+
182
+ Group#name
183
+ The name of the Windows group account on the given domain.
184
+
185
+ Group#name=
186
+ Sets the name of the Windows group account on the given domain.
187
+ Use only when creating a new group.
188
+
189
+ Group#sid
190
+ The security identifer for the group.
191
+
192
+ Group#sid=
193
+ Sets the security identifer for the group.
194
+
195
+ Group#sid_type
196
+ The type of security identifier as a stringified value.
197
+
198
+ Group#sid_type=
199
+ Sets the type of security identifier as a stringified value. Use only when
200
+ creating a new group.
201
+
202
+ See the +constants+ section for a list of valid sid types.
203
+
204
+ Group#status
205
+ Current status for the group, such as "ok", "error", etc.
206
+
207
+ Group#status=
208
+ Sets the status for the group.
209
+
210
+ == Sys::Admin::User
211
+ User#account_type
212
+ Returns the account type as a human readable string.
213
+
214
+ User#account_type=
215
+ Sets the account type. See the +constants+ section for a list of valid
216
+ values you can set this to.
217
+
218
+ User#caption
219
+ Domain and username of the account.
220
+
221
+ User#caption=
222
+ Sets the domain and username of the account.
223
+
224
+ User#description
225
+ Description of the account.
226
+
227
+ User#description=
228
+ Sets the description of the account.
229
+
230
+ User#disabled?
231
+ Returns whether or not the account is disabled.
232
+
233
+ User#disabled=
234
+ Sets whether or not the account is disabled.
235
+
236
+ User#domain
237
+ Name of the Windows domain to which a user account belongs.
238
+
239
+ User#domain=
240
+ Sets the name of the Windows domain to which a user account belongs.
241
+
242
+ User#full_name
243
+ Full name of a local user.
244
+
245
+ User#full_name=
246
+ Sets the full name of a local user.
247
+
248
+ User#install_date
249
+ Date the user account was created.
250
+
251
+ User#local?
252
+ Returns whether or not the account is defined on the local computer.
253
+
254
+ User#local=
255
+ Sets whether or not the account is defined on the local computer.
256
+
257
+ User#lockout?
258
+ Returns whether or not the account is locked out of the OS.
259
+
260
+ User#lockout=
261
+ Sets whether or not the account is locked out of the OS.
262
+
263
+ User#name
264
+ Name of the Windows user account on the domain that the User#domain
265
+ property specifies.
266
+
267
+ User#name=
268
+ Sets the name of the Windows user account on the domain that the User#domain
269
+ property specifies.
270
+
271
+ User#password
272
+ The user's password.
273
+
274
+ User#password=
275
+ Sets the user's password.
276
+
277
+ User#password_changeable?
278
+ Returns whether or not the password for the account can be changed.
279
+
280
+ User#password_changeable=
281
+ Sets whether or not the password for the account can be changed.
282
+
283
+ User#password_expires?
284
+ Returns whether or not the password for the account expires.
285
+
286
+ User#password_expires=
287
+ Sets whether or not the password for the account expires.
288
+
289
+ User#password_required?
290
+ Returns whether or not a password is required for the account.
291
+
292
+ User#password_required=
293
+ Sets whether or not a password is required for the account.
294
+
295
+ User#sid
296
+ The user's security identifier.
297
+
298
+ User#sid=
299
+ Sets the user's security identifier.
300
+
301
+ User#status
302
+ Current status for the user, such as "ok", "error", etc.
303
+
304
+ == Notes
305
+ Not all platforms support all of the User members. The only ones that are
306
+ supported on all platforms are name, uid, gid, dir and shell. The rest
307
+ will simply return nil if they aren't supported.
308
+
309
+ == Known Bugs
310
+ None that I am aware of. Please log any bugs you find on the project
311
+ website at http://www.rubyforge.org/projects/sysutils.
312
+
313
+ == License
314
+ Ruby's
315
+
316
+ == Copyright
317
+ Copyright 2002-2007, Daniel J. Berger
318
+
319
+ All Rights Reserved. This module is free software. It may be used,
320
+ redistributed and/or modified under the same terms as Ruby itself.
321
+
322
+ == Warranty
323
+ This package is provided "as is" and without any express or
324
+ implied warranties, including, without limitation, the implied
325
+ warranties of merchantability and fitness for a particular purpose.
326
+
327
+ == Author
328
+ Daniel J. Berger
329
+ djberg96 at nospam at gmail dot com
330
+ imperator on IRC (Freenode)
data/ext/extconf.rb CHANGED
@@ -53,4 +53,4 @@ else
53
53
  end
54
54
  end
55
55
 
56
- create_makefile("sys/admin")
56
+ create_makefile('sys/admin', 'sys')
@@ -49,8 +49,6 @@ static VALUE group_init(VALUE self){
49
49
  * the program is run.
50
50
  */
51
51
  static VALUE admin_get_login(VALUE klass){
52
- VALUE v_login = Qnil;
53
-
54
52
  #ifdef HAVE_GETLOGIN_R
55
53
  char login[_POSIX_LOGIN_NAME_MAX];
56
54
 
@@ -103,7 +101,7 @@ static VALUE admin_get_login(VALUE klass){
103
101
  * Admin.get_user(name)
104
102
  * Admin.get_user(uid)
105
103
  *
106
- * Returns a User object for the given +name+ or +uid+. Raises an AdminError
104
+ * Returns a User object for the given +name+ or +uid+. Raises an Admin::Error
107
105
  * if a user cannot be found for that name or user ID.
108
106
  */
109
107
  static VALUE admin_get_user(VALUE klass, VALUE v_value){
@@ -121,7 +119,7 @@ static VALUE admin_get_user(VALUE klass, VALUE v_value){
121
119
  * Admin.get_group(name)
122
120
  * Admin.get_group(gid)
123
121
  *
124
- * Returns a Group object for the given +name+ or +gid+. Raises an AdminError
122
+ * Returns a Group object for the given +name+ or +gid+. Raises an Admin::Error
125
123
  * if a group cannot be found for that name or GID.
126
124
  *
127
125
  *--
@@ -142,14 +140,13 @@ static VALUE admin_get_group(VALUE klass, VALUE v_value){
142
140
  return v_group;
143
141
  }
144
142
 
145
- /* call-seq:
146
- * Admin.groups
147
- * Admin.groups{ |group| ... }
143
+ /*
144
+ * :no-doc:
148
145
  *
149
- * In block form, yields a Group object for each group on the system. In
150
- * non-block form, returns an Array of Group objects.
146
+ * This is the main body of the Admin.groups method. It is wrapped separately
147
+ * for the sake of an rb_ensure() call.
151
148
  */
152
- static VALUE admin_groups(VALUE klass){
149
+ static VALUE admin_groups_body(VALUE klass){
153
150
  VALUE v_array = Qnil;
154
151
 
155
152
  if(!rb_block_given_p())
@@ -188,19 +185,29 @@ static VALUE admin_groups(VALUE klass){
188
185
  rb_raise(rb_eNotImpError, "groups method not supported on this platform");
189
186
  #endif
190
187
 
191
- endgrent();
192
-
193
- return v_array;
188
+ return v_array; /* Nil or an array */
194
189
  }
195
190
 
196
191
  /* call-seq:
197
- * Admin.users
198
- * Admin.users{ |user| ... }
192
+ * Admin.groups
193
+ * Admin.groups{ |group| ... }
199
194
  *
200
- * In block form, yields a User object for each user on the system. In
201
- * non-block form, returns an Array of User objects.
195
+ * In block form, yields a Group object for each group on the system. In
196
+ * non-block form, returns an Array of Group objects.
202
197
  */
203
- static VALUE admin_users(VALUE klass){
198
+ static VALUE admin_groups(VALUE klass){
199
+ return rb_ensure(admin_groups_body, rb_ary_new3(1, klass),
200
+ admin_groups_cleanup, Qnil
201
+ );
202
+ }
203
+
204
+ /*
205
+ * :no-doc:
206
+ *
207
+ * This is the main body of the Admin.users method. It is wrapped separately
208
+ * for the sake of an rb_ensure() call.
209
+ */
210
+ static VALUE admin_users_body(VALUE klass){
204
211
  VALUE v_array = Qnil;
205
212
 
206
213
  if(!rb_block_given_p())
@@ -241,14 +248,27 @@ static VALUE admin_users(VALUE klass){
241
248
  rb_raise(rb_eNotImpError, "users method not supported on this platform");
242
249
  #endif
243
250
 
244
- endpwent();
251
+ return v_array; /* Nil or an array */
252
+ }
245
253
 
246
- if(rb_block_given_p())
247
- return Qnil;
248
254
 
249
- return v_array;
255
+ /* call-seq:
256
+ * Admin.users
257
+ * Admin.users{ |user| ... }
258
+ *
259
+ * In block form, yields a User object for each user on the system. In
260
+ * non-block form, returns an Array of User objects.
261
+ */
262
+ static VALUE admin_users(VALUE klass){
263
+ return rb_ensure(admin_users_body, rb_ary_new3(1, klass),
264
+ admin_users_cleanup, Qnil
265
+ );
250
266
  }
251
267
 
268
+ /*
269
+ * The Sys::Admin class encapsulates typical operations surrounding the query
270
+ * of user and group information.
271
+ */
252
272
  void Init_admin(){
253
273
  VALUE mSys, cAdmin;
254
274
 
@@ -265,7 +285,7 @@ void Init_admin(){
265
285
  cGroup = rb_define_class_under(mSys, "Group", rb_cObject);
266
286
 
267
287
  /* Error raised if any of the Sys::Admin methods fail */
268
- cAdminError = rb_define_class_under(mSys, "AdminError", rb_eStandardError);
288
+ cAdminError = rb_define_class_under(cAdmin, "Error", rb_eStandardError);
269
289
 
270
290
  /* Class Methods */
271
291
  rb_define_singleton_method(cAdmin, "get_login", admin_get_login, 0);
@@ -344,6 +364,6 @@ void Init_admin(){
344
364
 
345
365
  /* Constants */
346
366
 
347
- /* 1.4.1: The version of this package */
367
+ /* 1.4.3: The version of this library */
348
368
  rb_define_const(cAdmin, "VERSION", rb_str_new2(SYS_ADMIN_VERSION));
349
369
  }
@@ -8,7 +8,7 @@
8
8
  #include <errno.h>
9
9
  #include <string.h>
10
10
 
11
- #define SYS_ADMIN_VERSION "1.4.2"
11
+ #define SYS_ADMIN_VERSION "1.4.3"
12
12
 
13
13
  #ifdef HAVE_LASTLOG_H
14
14
  #include <lastlog.h>
@@ -47,6 +47,8 @@
47
47
  #endif
48
48
 
49
49
  /* Function prototypes */
50
+ static VALUE admin_users_cleanup();
51
+ static VALUE admin_groups_cleanup();
50
52
  static VALUE get_user(struct passwd* p);
51
53
  static VALUE get_group(struct group* g);
52
54
  int get_lastlog_info(struct passwd* p, VALUE v_value);
@@ -437,3 +439,25 @@ int get_lastlog_info(struct passwd* pwd, VALUE v_user){
437
439
 
438
440
  return 0;
439
441
  }
442
+
443
+ /*
444
+ * :no-doc:
445
+ *
446
+ * This function is used for an rb_ensure() call where we need to make sure
447
+ * that endpwent() is called in the block form of Admin.groups.
448
+ */
449
+ static VALUE admin_groups_cleanup(){
450
+ endgrent();
451
+ return Qnil;
452
+ }
453
+
454
+ /*
455
+ * :no-doc:
456
+ *
457
+ * This function is used for an rb_ensure() call where we need to make sure
458
+ * that endpwent() is called in the block form of Admin.users.
459
+ */
460
+ static VALUE admin_users_cleanup(){
461
+ endpwent();
462
+ return Qnil;
463
+ }
data/test/tc_unix.rb CHANGED
@@ -17,7 +17,7 @@ class TC_Sys_Admin_Unix < Test::Unit::TestCase
17
17
  end
18
18
 
19
19
  def test_version
20
- assert_equal("1.4.2", Admin::VERSION)
20
+ assert_equal('1.4.3', Admin::VERSION)
21
21
  end
22
22
 
23
23
  def test_get_login
@@ -32,34 +32,46 @@ class TC_Sys_Admin_Unix < Test::Unit::TestCase
32
32
  assert_nothing_raised{ Admin.get_user(@userid) }
33
33
  assert_kind_of(User, Admin.get_user(@user))
34
34
  assert_kind_of(User, Admin.get_user(@userid))
35
- assert_raises(AdminError){ Admin.get_user("foofoo") }
35
+ assert_raises(Admin::Error){ Admin.get_user("foofoo") }
36
36
  end
37
37
 
38
38
  def test_users
39
39
  assert_respond_to(Admin, :users)
40
40
  assert_nothing_raised{ Admin.users }
41
- assert_nothing_raised{ Admin.users{ |g| } }
42
41
  assert_kind_of(Array, Admin.users)
43
42
  assert_kind_of(User, Admin.users.first)
44
43
  end
45
44
 
45
+ def test_users_block_form
46
+ array = []
47
+ assert_nothing_raised{ Admin.users{ |g| array << g } }
48
+ assert_equal(true, Admin.users.length == array.length)
49
+ assert_nothing_raised{ Admin.users{ |g| break } }
50
+ end
51
+
46
52
  def test_get_group
47
53
  assert_respond_to(Admin, :get_group)
48
54
  assert_nothing_raised{ Admin.get_group(@group) }
49
55
  assert_nothing_raised{ Admin.get_group(@groupid) }
50
56
  assert_kind_of(Group, Admin.get_group(@group))
51
57
  assert_kind_of(Group, Admin.get_group(@groupid))
52
- assert_raises(AdminError){ Admin.get_group("foofoo") }
58
+ assert_raises(Admin::Error){ Admin.get_group("foofoo") }
53
59
  end
54
60
 
55
61
  def test_groups
56
62
  assert_respond_to(Admin, :groups)
57
63
  assert_nothing_raised{ Admin.groups }
58
- assert_nothing_raised{ Admin.groups{ |g| } }
59
64
  assert_kind_of(Array, Admin.groups)
60
65
  assert_kind_of(Group, Admin.groups.first)
61
66
  end
62
67
 
68
+ def test_groups_block_form
69
+ array = []
70
+ assert_nothing_raised{ Admin.groups{ |g| array << g } }
71
+ assert_equal(true, Admin.groups.length == array.length)
72
+ assert_nothing_raised{ Admin.groups{ |g| break } }
73
+ end
74
+
63
75
  def teardown
64
76
  @user = nil
65
77
  @userid = nil
data/test/tc_windows.rb CHANGED
@@ -24,7 +24,7 @@ class TC_Sys_Admin_Win32 < Test::Unit::TestCase
24
24
  end
25
25
 
26
26
  def test_version
27
- assert_equal("1.4.2", Admin::VERSION)
27
+ assert_equal('1.4.3', Admin::VERSION)
28
28
  end
29
29
 
30
30
  def test_01_add_local_user
metadata CHANGED
@@ -1,34 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: sys-admin
5
3
  version: !ruby/object:Gem::Version
6
- version: 1.4.2
7
- date: 2007-06-26 00:00:00 -06:00
8
- summary: A unified, cross platform replacement for the "etc" package.
9
- require_paths:
10
- - lib
11
- email: djberg96@gmail.com
12
- homepage: http://www.rubyforge.org/projects/sysutils
13
- rubyforge_project: sysutils
14
- description: A unified, cross platform replacement for the "etc" package.
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 1.8.0
24
- version:
4
+ version: 1.4.3
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Daniel J. Berger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-03-02 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: A unified, cross platform replacement for the "etc" package.
17
+ email: djberg96@gmail.com
18
+ executables: []
19
+
20
+ extensions:
21
+ - ext/extconf.rb
22
+ extra_rdoc_files:
23
+ - CHANGES
24
+ - README
25
+ - MANIFEST
26
+ - ext/sys/admin.c
31
27
  files:
28
+ - doc/sys-admin-unix.txt
29
+ - doc/sys-admin-windows.txt
32
30
  - examples/groups.rb
33
31
  - examples/users.rb
34
32
  - test/tc_admin.rb
@@ -36,25 +34,37 @@ files:
36
34
  - test/tc_windows.rb
37
35
  - CHANGES
38
36
  - MANIFEST
39
- - README
40
37
  - Rakefile
41
- - ext/admin.c
42
- - ext/admin.h
38
+ - README
43
39
  - ext/extconf.rb
44
- test_files:
45
- - test/tc_admin.rb
40
+ - ext/sys
41
+ - ext/sys/admin.c
42
+ - ext/sys/admin.h
43
+ has_rdoc: true
44
+ homepage: http://www.rubyforge.org/projects/sysutils
45
+ post_install_message:
46
46
  rdoc_options: []
47
47
 
48
- extra_rdoc_files:
49
- - CHANGES
50
- - README
51
- - MANIFEST
52
- - ext/admin.c
53
- executables: []
54
-
55
- extensions:
56
- - ext/extconf.rb
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.8.0
55
+ version:
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ version:
57
62
  requirements: []
58
63
 
59
- dependencies: []
60
-
64
+ rubyforge_project: sysutils
65
+ rubygems_version: 1.0.1
66
+ signing_key:
67
+ specification_version: 2
68
+ summary: A unified, cross platform replacement for the "etc" package.
69
+ test_files:
70
+ - test/tc_admin.rb