sys-admin 1.4.0 → 1.4.1

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,9 @@
1
+ == 1.4.1 - 21-Mar-2007
2
+ * Bug fix for OS X. Thanks go to an anonymous user for the spot.
3
+ * Added a Rakefile. Building, testing and installing should now use the
4
+ Rake tasks (for non-gem installs).
5
+ * Much more inline documentation, especially for User and Group attributes.
6
+
1
7
  == 1.4.0 - 20-Jan-2007
2
8
  * Added the following methods: add_local_user, config_local_user,
3
9
  delete_local_user, add_global_group, config_global_group, and
data/MANIFEST CHANGED
@@ -2,6 +2,7 @@
2
2
  * sys-admin.gemspec
3
3
  * CHANGES
4
4
  * MANIFEST
5
+ * Rakefile
5
6
  * README
6
7
 
7
8
  * examples/groups.rb
data/README CHANGED
@@ -3,15 +3,8 @@
3
3
  Etc module.
4
4
 
5
5
  == Installation
6
- === Windows
7
- ruby tc_admin.rb # optional (in the 'test' directory)
8
- ruby install.rb
9
-
10
- === Unix
11
- ruby extconf.rb (in the 'ext' directory)
12
- make
13
- ruby tc_admin.rb # optional (in the 'test' directory)
14
- make install
6
+ rake test (optional)
7
+ rake install
15
8
 
16
9
  == Synopsis
17
10
  require 'sys/admin'
data/Rakefile ADDED
@@ -0,0 +1,53 @@
1
+ require 'rake'
2
+ require 'rake/clean'
3
+ require 'rake/testtask'
4
+
5
+ desc "Clean the build files for the sys-admin source for UNIX systems"
6
+ task :clean do
7
+ Dir.chdir('ext') do
8
+ unless RUBY_PLATFORM.match('mswin')
9
+ FileUtils.rm_rf('sys') if File.exists?('sys')
10
+ build_file = 'admin.' + Config::CONFIG['DLEXT']
11
+ sh 'make distclean' if File.exists?(build_file)
12
+ end
13
+ end
14
+ end
15
+
16
+ desc "Build the sys-admin package on UNIX systems (but don't install it)"
17
+ task :build => [:clean] do
18
+ Dir.chdir('ext') do
19
+ unless RUBY_PLATFORM.match('mswin')
20
+ ruby 'extconf.rb'
21
+ sh 'make'
22
+ build_file = 'admin.' + Config::CONFIG['DLEXT']
23
+ Dir.mkdir('sys') unless File.exists?('sys')
24
+ FileUtils.cp(build_file, 'sys')
25
+ end
26
+ end
27
+ end
28
+
29
+ if RUBY_PLATFORM.match('mswin')
30
+ desc "Install the sys-admin package"
31
+ task :install do
32
+ sh 'ruby install.rb'
33
+ end
34
+ else
35
+ desc "Install the sys-admin package"
36
+ task :install => [:build] do
37
+ Dir.chdir('ext') do
38
+ sh 'make install'
39
+ end
40
+ end
41
+ end
42
+
43
+ desc "Run the test suite"
44
+ Rake::TestTask.new("test") do |t|
45
+ if RUBY_PLATFORM.match('mswin')
46
+ t.libs << 'lib'
47
+ else
48
+ task :test => :build
49
+ t.libs << 'ext'
50
+ t.libs.delete('lib')
51
+ end
52
+ t.test_files = FileList['test/tc_admin.rb']
53
+ end
data/ext/admin.c CHANGED
@@ -6,8 +6,10 @@
6
6
  * User.new
7
7
  * User.new{ |user| ... }
8
8
  *
9
- * Creates and returns a User object. If a block is provided, yields the
10
- * object back to the block.
9
+ * Creates and returns a User object, which encapsulates the information
10
+ * typically found within an /etc/passwd entry, i.e. a struct passwd.
11
+ *
12
+ * If a block is provided, yields the object back to the block.
11
13
  */
12
14
  static VALUE user_init(VALUE self){
13
15
  if(rb_block_given_p())
@@ -21,8 +23,10 @@ static VALUE user_init(VALUE self){
21
23
  * Group.new
22
24
  * Group.new{ |user| ... }
23
25
  *
24
- * Creates and returns a Group object. If a block is provided, yields the
25
- * object back to the block.
26
+ * Creates and returns a Group object, which encapsulates the information
27
+ * typically found within an /etc/group entry, i.e. a struct group.
28
+ *
29
+ * If a block is provided, yields the object back to the block.
26
30
  */
27
31
  static VALUE group_init(VALUE self){
28
32
  if(rb_block_given_p())
@@ -43,8 +47,8 @@ static VALUE group_init(VALUE self){
43
47
  * Developer's Note:
44
48
  *
45
49
  * Uses the (POSIX) reentrant version of getlogin_r() if supported. Otherwise
46
- * it resorts to the standard getlogin function. If that fails, it resorts to
47
- * cuserid(). If that fails, it resorts to getenv("USER"). If that fails,
50
+ * it resorts to the standard getlogin() function. If that fails, it resorts
51
+ * to cuserid(). If that fails, it resorts to getenv("USER"). If that fails,
48
52
  * then nil is returned.
49
53
  */
50
54
  static VALUE admin_get_login(VALUE klass){
@@ -77,7 +81,7 @@ static VALUE admin_get_login(VALUE klass){
77
81
  * Admin.get_user(name)
78
82
  * Admin.get_user(uid)
79
83
  *
80
- * Returns a User object for the given +name+ or +uid+. Raises an AdminError
84
+ * Returns a User object for the given +name+ or +uid+. Raises an AdminError
81
85
  * if a user cannot be found for that name or user ID.
82
86
  */
83
87
  static VALUE admin_get_user(VALUE klass, VALUE v_value){
@@ -95,7 +99,7 @@ static VALUE admin_get_user(VALUE klass, VALUE v_value){
95
99
  * Admin.get_group(name)
96
100
  * Admin.get_group(gid)
97
101
  *
98
- * Returns a Group object for the given +name+ or +gid+. Raises an AdminError
102
+ * Returns a Group object for the given +name+ or +gid+. Raises an AdminError
99
103
  * if a group cannot be found for that name or GID.
100
104
  *
101
105
  *--
@@ -120,7 +124,7 @@ static VALUE admin_get_group(VALUE klass, VALUE v_value){
120
124
  * Admin.groups
121
125
  * Admin.groups{ |group| ... }
122
126
  *
123
- * In block form, yields a Group object for each group on the system. In
127
+ * In block form, yields a Group object for each group on the system. In
124
128
  * non-block form, returns an Array of Group objects.
125
129
  */
126
130
  static VALUE admin_groups(VALUE klass){
@@ -171,7 +175,7 @@ static VALUE admin_groups(VALUE klass){
171
175
  * Admin.users
172
176
  * Admin.users{ |user| ... }
173
177
  *
174
- * In block form, yields a User object for each user on the system. In
178
+ * In block form, yields a User object for each user on the system. In
175
179
  * non-block form, returns an Array of User objects.
176
180
  */
177
181
  static VALUE admin_users(VALUE klass){
@@ -226,11 +230,19 @@ static VALUE admin_users(VALUE klass){
226
230
  void Init_admin(){
227
231
  VALUE mSys, cAdmin;
228
232
 
229
- /* Module and class definitions */
230
- mSys = rb_define_module("Sys");
233
+ /* The Sys module is used primarily as a namespace for Sys::Admin */
234
+ mSys = rb_define_module("Sys");
235
+
236
+ /* A unified, cross platform replacement for the Etc module. */
231
237
  cAdmin = rb_define_class_under(mSys, "Admin", rb_cObject);
232
- cUser = rb_define_class_under(mSys, "User", rb_cObject);
238
+
239
+ /* Encapsulates information typically found in /etc/passwd */
240
+ cUser = rb_define_class_under(mSys, "User", rb_cObject);
241
+
242
+ /* Encapsulates information typically found in /etc/group */
233
243
  cGroup = rb_define_class_under(mSys, "Group", rb_cObject);
244
+
245
+ /* Error raised if any of the Sys::Admin methods fail */
234
246
  cAdminError = rb_define_class_under(mSys, "AdminError", rb_eStandardError);
235
247
 
236
248
  /* Class Methods */
@@ -245,29 +257,71 @@ void Init_admin(){
245
257
  rb_define_method(cGroup,"initialize", group_init, 0);
246
258
 
247
259
  /* User Attributes */
260
+
261
+ /* The user name associated with the account */
248
262
  rb_define_attr(cUser, "name", 1, 1);
263
+
264
+ /* The user's encrypted password. Deprecated in favor of /etc/shadow */
249
265
  rb_define_attr(cUser, "passwd", 1, 1);
266
+
267
+ /* The user's user ID */
250
268
  rb_define_attr(cUser, "uid", 1, 1);
269
+
270
+ /* The user's primary group ID */
251
271
  rb_define_attr(cUser, "gid", 1, 1);
272
+
273
+ /* The absolute pathname of the user's home directory */
252
274
  rb_define_attr(cUser, "dir", 1, 1);
275
+
276
+ /* The user's login shell */
253
277
  rb_define_attr(cUser, "shell", 1, 1);
278
+
279
+ /* A comment field. Rarely used. */
254
280
  rb_define_attr(cUser, "gecos", 1, 1);
281
+
282
+ /* The user's alloted amount of disk space */
255
283
  rb_define_attr(cUser, "quota", 1, 1);
284
+
285
+ /* Used in the past for password aging. Deprecated in favor of /etc/shadow */
256
286
  rb_define_attr(cUser, "age", 1, 1);
287
+
288
+ /* The user's access class */
257
289
  rb_define_attr(cUser, "class", 1, 1);
290
+
291
+ /* Another comment field. Rarely used. */
258
292
  rb_define_attr(cUser, "comment", 1, 1);
293
+
294
+ /* Account expiration date */
259
295
  rb_define_attr(cUser, "expire", 1, 1);
296
+
297
+ /* Next data a password change will be needed */
260
298
  rb_define_attr(cUser, "change", 1, 1);
299
+
300
+ /* The last time the user logged in */
261
301
  rb_define_attr(cUser, "login_time", 1, 0);
302
+
303
+ /* The name of the terminal device the user last logged on with */
262
304
  rb_define_attr(cUser, "login_device", 1, 0);
305
+
306
+ /* The hostname from which the user last logged in */
263
307
  rb_define_attr(cUser, "login_host", 1, 0);
264
308
 
265
309
  /* Group Attributes */
310
+
311
+ /* The name of the group */
266
312
  rb_define_attr(cGroup, "name", 1, 1);
313
+
314
+ /* The group's group ID */
267
315
  rb_define_attr(cGroup, "gid", 1, 1);
316
+
317
+ /* An array of users that are members of the group */
268
318
  rb_define_attr(cGroup, "members", 1, 1);
319
+
320
+ /* The group password, if any. */
269
321
  rb_define_attr(cGroup, "passwd", 1, 1);
270
322
 
271
323
  /* Constants */
324
+
325
+ /* 1.4.1: The version of this package */
272
326
  rb_define_const(cAdmin, "VERSION", rb_str_new2(SYS_ADMIN_VERSION));
273
327
  }
data/ext/admin.h CHANGED
@@ -8,7 +8,7 @@
8
8
  #include <errno.h>
9
9
  #include <string.h>
10
10
 
11
- #define SYS_ADMIN_VERSION "1.4.0"
11
+ #define SYS_ADMIN_VERSION "1.4.1"
12
12
 
13
13
  #ifdef HAVE_LASTLOG_H
14
14
  #include <lastlog.h>
@@ -20,17 +20,27 @@
20
20
  #define _POSIX_LOGIN_NAME_MAX 9
21
21
  #endif
22
22
 
23
+ /* OS X returns -1 on this for some reason, so check for it */
24
+ #if defined(__MACH__) || defined(__APPLE__)
25
+ #define USER_BUF_SIZE 1024
26
+ #else
23
27
  #ifdef _SC_GETPW_R_SIZE_MAX
24
28
  #define USER_BUF_SIZE (sysconf(_SC_GETPW_R_SIZE_MAX))
25
29
  #else
26
30
  #define USER_BUF_SIZE 1024
27
31
  #endif
32
+ #endif
28
33
 
34
+ /* OS X returns -1 on this for some reason, so check for it */
35
+ #if defined(__MACH__) || defined(__APPLE__)
36
+ #define GROUP_BUF_SIZE 7296
37
+ #else
29
38
  #ifdef _SC_GETGR_R_SIZE_MAX
30
39
  #define GROUP_BUF_SIZE (sysconf(_SC_GETGR_R_SIZE_MAX))
31
40
  #else
32
41
  #define GROUP_BUF_SIZE 7296
33
42
  #endif
43
+ #endif
34
44
 
35
45
  #ifndef _PATH_LASTLOG
36
46
  #define _PATH_LASTLOG "/var/adm/lastlog"
@@ -126,7 +136,7 @@ static VALUE get_group_by_num(VALUE v_gid){
126
136
  struct group* grpbuf;
127
137
 
128
138
  if(getgrgid_r(gid, &grp, buf, sizeof(buf), &grpbuf) != 0)
129
- rb_raise(cAdminError, "%s", strerror(errno));
139
+ rb_raise(cAdminError, "getgrgid_r() failed: %s", strerror(errno));
130
140
 
131
141
  if(!grpbuf)
132
142
  rb_raise(cAdminError, "no group found for group ID: %i", gid);
@@ -172,7 +182,7 @@ static VALUE get_group_by_name(VALUE v_name){
172
182
 
173
183
  v_group = get_group(grp);
174
184
  #else
175
- rb_raise(rb_eNotImpError,"get_group is not supported on this platform");
185
+ rb_raise(rb_eNotImpError, "get_group is not supported on this platform");
176
186
  #endif
177
187
 
178
188
  return v_group;
@@ -332,11 +342,12 @@ void get_user_from_value(VALUE v_user, struct passwd* pwd){
332
342
  static VALUE get_group(struct group* g){
333
343
  VALUE v_group = rb_funcall(cGroup,rb_intern("new"),0,0);
334
344
  VALUE v_array = rb_ary_new();
345
+ char **my_gr_mem = g->gr_mem;
335
346
 
336
347
  /* Return the members as an Array of Strings */
337
- while(*g->gr_mem){
338
- rb_ary_push(v_array, rb_str_new2(*g->gr_mem));
339
- g->gr_mem++;
348
+ while(*my_gr_mem){
349
+ rb_ary_push(v_array, rb_str_new2(*my_gr_mem));
350
+ my_gr_mem++;
340
351
  }
341
352
 
342
353
  rb_iv_set(v_group, "@name", rb_str_new2(g->gr_name));
data/test/tc_unix.rb CHANGED
@@ -1,18 +1,9 @@
1
1
  ###############################################################################
2
2
  # tc_unix.rb
3
3
  #
4
- # Test suite for the Unix version of sys-admin.
4
+ # Test suite for the Unix version of sys-admin. This test should be run
5
+ # via the 'rake test' task.
5
6
  ###############################################################################
6
- base = File.basename(Dir.pwd)
7
-
8
- if base == "test" || base =~ /sys-admin.*/
9
- require "fileutils"
10
- Dir.chdir("..") if base == "test"
11
- Dir.mkdir("sys") unless File.exists?("sys")
12
- FileUtils.cp("ext/admin.so", "sys") if File.exists?("ext/admin.so")
13
- $LOAD_PATH.unshift(Dir.pwd)
14
- end
15
-
16
7
  require 'test/unit'
17
8
  require 'sys/admin'
18
9
  include Sys
@@ -26,7 +17,7 @@ class TC_Sys_Admin_Unix < Test::Unit::TestCase
26
17
  end
27
18
 
28
19
  def test_version
29
- assert_equal("1.4.0", Admin::VERSION)
20
+ assert_equal("1.4.1", Admin::VERSION)
30
21
  end
31
22
 
32
23
  def test_get_login
data/test/tc_windows.rb CHANGED
@@ -4,18 +4,9 @@
4
4
  # Test suite for the Win32 version of sys-admin. Note that some of the tests
5
5
  # are numbered to ensure a certain order. That way I can add test users
6
6
  # before configuring or deleting them.
7
+ #
8
+ # It is assumed that this test will be run via the 'rake test' task.
7
9
  ###############################################################################
8
- base = File.basename(Dir.pwd)
9
-
10
- if base == "test" || base =~ /sys-admin.*/
11
- require "ftools"
12
- Dir.chdir("..") if base == "test"
13
- Dir.mkdir("sys") unless File.exists?("sys")
14
- File.copy("lib/sys/admin.rb", "sys/admin.rb")
15
- $LOAD_PATH.unshift(Dir.pwd)
16
- Dir.chdir("test") rescue nil
17
- end
18
-
19
10
  require "test/unit"
20
11
  require "sys/admin"
21
12
  require "socket"
@@ -33,7 +24,7 @@ class TC_Sys_Admin_Win32 < Test::Unit::TestCase
33
24
  end
34
25
 
35
26
  def test_version
36
- assert_equal("1.4.0", Admin::VERSION)
27
+ assert_equal("1.4.1", Admin::VERSION)
37
28
  end
38
29
 
39
30
  def test_01_add_local_user
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
2
+ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: sys-admin
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.4.0
7
- date: 2007-01-20 00:00:00 -07:00
6
+ version: 1.4.1
7
+ date: 2007-03-22 00:00:00 -06:00
8
8
  summary: A unified, cross platform replacement for the "etc" package.
9
9
  require_paths:
10
10
  - lib
@@ -31,12 +31,13 @@ authors:
31
31
  files:
32
32
  - examples/groups.rb
33
33
  - examples/users.rb
34
+ - test/tc_admin.rb
34
35
  - test/tc_unix.rb
35
36
  - test/tc_windows.rb
36
- - test/tc_admin.rb
37
- - README
38
37
  - CHANGES
39
38
  - MANIFEST
39
+ - README
40
+ - Rakefile
40
41
  - ext/extconf.rb
41
42
  - ext/admin.c
42
43
  - ext/admin.h