sys-admin 1.5.6 → 1.6.0

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.
metadata CHANGED
@@ -1,58 +1,74 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: sys-admin
3
- version: !ruby/object:Gem::Version
4
- hash: 15
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.6.0
5
5
  prerelease:
6
- segments:
7
- - 1
8
- - 5
9
- - 6
10
- version: 1.5.6
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Daniel J. Berger
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-07-30 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: test-unit
12
+ date: 2013-01-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ffi
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.1.0
22
+ type: :runtime
22
23
  prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.1.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: test-unit
32
+ requirement: !ruby/object:Gem::Requirement
24
33
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 9
29
- segments:
30
- - 2
31
- - 1
32
- - 1
33
- version: 2.1.1
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 2.5.0
34
38
  type: :development
35
- version_requirements: *id001
36
- description: " The sys-admin library is a unified, cross platform replacement for the\n 'etc' library that ships as part of the Ruby standard library. It\n provides a common interface for all platforms, including MS Windows. In\n addition, it provides an interface for adding, deleting and configuring\n users on MS Windows.\n"
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 2.5.0
46
+ description: ! " The sys-admin library is a unified, cross platform replacement
47
+ for the\n 'etc' library that ships as part of the Ruby standard library. It\n
48
+ \ provides a common interface for all platforms, including MS Windows. In\n addition,
49
+ it provides an interface for adding, deleting and configuring\n users on MS Windows.\n"
37
50
  email: djberg96@gmail.com
38
51
  executables: []
39
-
40
- extensions:
41
- - ext/extconf.rb
42
- extra_rdoc_files:
52
+ extensions: []
53
+ extra_rdoc_files:
43
54
  - CHANGES
44
55
  - README
45
56
  - MANIFEST
46
- - ext/sys/admin.c
47
- files:
57
+ files:
48
58
  - CHANGES
49
59
  - doc/sys-admin-unix.txt
50
60
  - doc/sys-admin-windows.txt
51
- - examples/groups.rb
52
- - examples/users.rb
53
- - ext/extconf.rb
54
- - ext/sys/admin.c
55
- - ext/sys/admin.h
61
+ - examples/example_groups.rb
62
+ - examples/example_users.rb
63
+ - lib/bsd/sys/admin.rb
64
+ - lib/darwin/sys/admin.rb
65
+ - lib/linux/sys/admin.rb
66
+ - lib/sunos/sys/admin.rb
67
+ - lib/sys/admin/common.rb
68
+ - lib/sys/admin/custom.rb
69
+ - lib/sys/admin.rb
70
+ - lib/unix/sys/admin.rb
71
+ - lib/windows/sys/admin.rb
56
72
  - MANIFEST
57
73
  - Rakefile
58
74
  - README
@@ -61,37 +77,29 @@ files:
61
77
  - test/test_sys_admin_unix.rb
62
78
  - test/test_sys_admin_windows.rb
63
79
  homepage: http://www.github.com/djberg96/sysutils
64
- licenses:
80
+ licenses:
65
81
  - Artistic 2.0
66
82
  post_install_message:
67
83
  rdoc_options: []
68
-
69
- require_paths:
84
+ require_paths:
70
85
  - lib
71
- required_ruby_version: !ruby/object:Gem::Requirement
86
+ required_ruby_version: !ruby/object:Gem::Requirement
72
87
  none: false
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- hash: 3
77
- segments:
78
- - 0
79
- version: "0"
80
- required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
93
  none: false
82
- requirements:
83
- - - ">="
84
- - !ruby/object:Gem::Version
85
- hash: 3
86
- segments:
87
- - 0
88
- version: "0"
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
89
98
  requirements: []
90
-
91
99
  rubyforge_project: sysutils
92
- rubygems_version: 1.8.3
100
+ rubygems_version: 1.8.24
93
101
  signing_key:
94
102
  specification_version: 3
95
103
  summary: A unified, cross platform replacement for the "etc" library.
96
- test_files:
104
+ test_files:
97
105
  - test/test_sys_admin.rb
data/examples/groups.rb DELETED
@@ -1,39 +0,0 @@
1
- ###########################################################################
2
- # groups.rb
3
- #
4
- # Sample script to demonstrate some of the various group methods. Alter
5
- # as you see fit.
6
- ###########################################################################
7
- base = File.basename(Dir.pwd)
8
-
9
- if base == "examples" || base =~ /sys-admin.*/
10
- require "ftools"
11
- Dir.chdir("..") if base == "examples"
12
- Dir.mkdir("sys") unless File.exists?("sys")
13
- if RUBY_PLATFORM.match("mswin")
14
- File.copy("lib/sys/admin.rb", "sys/admin.rb")
15
- else
16
- File.copy("admin.so","sys") if File.exists?("admin.so")
17
- end
18
- $LOAD_PATH.unshift(Dir.pwd)
19
- end
20
-
21
- require "pp"
22
- require "sys/admin"
23
- include Sys
24
-
25
- if PLATFORM.match("mswin")
26
- pp Admin.get_group("guests")
27
- pp Admin.get_group(513)
28
- else
29
- pp Admin.get_group("adm")
30
- pp Admin.get_group(7)
31
- end
32
-
33
- Admin.groups{ |g|
34
- pp g
35
- puts
36
- }
37
-
38
- # This should raise an error
39
- Admin.get_group("fofofofof")
data/examples/users.rb DELETED
@@ -1,53 +0,0 @@
1
- ###########################################################################
2
- # users.rb
3
- #
4
- # Sample script to demonstrate some of the various user methods. Alter
5
- # as you see fit.
6
- ###########################################################################
7
- base = File.basename(Dir.pwd)
8
-
9
- if base == "examples" || base =~ /sys-admin.*/
10
- require "ftools"
11
- Dir.chdir("..") if base == "examples"
12
- Dir.mkdir("sys") unless File.exists?("sys")
13
- if RUBY_PLATFORM.match("mswin")
14
- File.copy("lib/sys/admin.rb", "sys/admin.rb")
15
- else
16
- File.copy("admin.so","sys") if File.exists?("admin.so")
17
- end
18
- $LOAD_PATH.unshift(Dir.pwd)
19
- end
20
-
21
- require "pp"
22
- require "sys/admin"
23
- include Sys
24
-
25
- user = User.new do |u|
26
- u.name = "Foo"
27
- u.description = "Test account"
28
- u.password = "changeme"
29
- #u.lockout = false
30
- u.disabled = true
31
- #u.password_required = true
32
- end
33
-
34
- Admin.delete_user(u.name) rescue nil
35
- Admin.add_user(user)
36
-
37
- #pp Admin.get_user("Foo")
38
-
39
- #Admin.delete_user("Foo")
40
-
41
- =begin
42
- user = Admin.get_login
43
-
44
- puts "User: #{user}"
45
-
46
- Admin.users{ |u|
47
- pp u
48
- puts
49
- }
50
-
51
- pp Admin.get_user(user)
52
- pp Admin.get_user(501)
53
- =end
data/ext/extconf.rb DELETED
@@ -1,72 +0,0 @@
1
- require "mkmf"
2
- require "rbconfig"
3
-
4
- AIX = Config::CONFIG['host_os'] =~ /aix/i
5
-
6
- # TODO: Just run the rake install task.
7
- if File::ALT_SEPARATOR
8
- STDERR.puts "Use the 'rake install' task to install on MS Windows."
9
- STDERR.puts "Exiting. The sys-admin package was NOT installed."
10
- exit
11
- else
12
- dir_config('admin')
13
-
14
- # Some versions of AIX apparently have buggy implementations of certain
15
- # re-entrant functions, so they're skipped for now.
16
-
17
- have_func("getlogin_r")
18
- have_func("getlogin")
19
- have_func("getenv")
20
-
21
- have_func("getpwuid_r")
22
- have_func("getpwuid")
23
- have_func("getpwnam_r")
24
- have_func("getpwnam")
25
- have_func("getpwent_r") unless AIX
26
- have_func("getpwent")
27
-
28
- have_func("getgrgid_r")
29
- have_func("getgrgid")
30
- have_func("getgrnam_r")
31
- have_func("getgrnam")
32
- have_func("getgrent_r") unless AIX
33
- have_func("getgrent")
34
-
35
- have_struct_member("struct passwd", "pw_gecos", "pwd.h")
36
- have_struct_member("struct passwd", "pw_change", "pwd.h")
37
- have_struct_member("struct passwd", "pw_quota", "pwd.h")
38
- have_struct_member("struct passwd", "pw_age", "pwd.h")
39
- have_struct_member("struct passwd", "pw_class", "pwd.h")
40
- have_struct_member("struct passwd", "pw_comment", "pwd.h")
41
- have_struct_member("struct passwd", "pw_expire", "pwd.h")
42
- have_struct_member("struct passwd", "pw_passwd", "pwd.h")
43
-
44
- have_struct_member("struct group", "gr_passwd", "grp.h")
45
-
46
- if have_header("usersec.h") # AIX
47
- have_func("getuserattr", "usersec.h")
48
- else
49
- utmp = have_header("utmp.h")
50
- lastlog = have_header("lastlog.h")
51
-
52
- if have_header("utmpx.h")
53
- have_func("getlastlogx")
54
- end
55
-
56
- if utmp || lastlog
57
- have_struct_member(
58
- "struct lastlog",
59
- "ll_time",
60
- ["utmp.h", "time.h", "lastlog.h"]
61
- )
62
- end
63
- end
64
-
65
- $CFLAGS += " -D_POSIX_PTHREAD_SEMANTICS"
66
-
67
- if RUBY_PLATFORM =~ /linux|bsd/i
68
- $CFLAGS += " -D_GNU_SOURCE -D_REENTRANT"
69
- end
70
- end
71
-
72
- create_makefile('sys/admin', 'sys')
data/ext/sys/admin.c DELETED
@@ -1,419 +0,0 @@
1
- #include "ruby.h"
2
- #include "admin.h"
3
-
4
- #ifndef RSTRING_PTR
5
- #define RSTRING_PTR(v) (RSTRING(v)->ptr)
6
- #define RSTRING_LEN(v) (RSTRING(v)->len)
7
- #endif
8
-
9
- #ifndef RARRAY_PTR
10
- #define RARRAY_PTR(v) (RARRAY(v)->ptr)
11
- #define RARRAY_LEN(v) (RARRAY(v)->len)
12
- #endif
13
-
14
- /*
15
- * call-seq:
16
- * User.new
17
- * User.new{ |user| ... }
18
- *
19
- * Creates and returns a User object, which encapsulates the information
20
- * typically found within an /etc/passwd entry, i.e. a struct passwd.
21
- *
22
- * If a block is provided, yields the object back to the block.
23
- */
24
- static VALUE user_init(VALUE self){
25
- if(rb_block_given_p())
26
- rb_yield(self);
27
-
28
- return self;
29
- }
30
-
31
- /*
32
- * call-seq:
33
- * Group.new
34
- * Group.new{ |user| ... }
35
- *
36
- * Creates and returns a Group object, which encapsulates the information
37
- * typically found within an /etc/group entry, i.e. a struct group.
38
- *
39
- * If a block is provided, yields the object back to the block.
40
- */
41
- static VALUE group_init(VALUE self){
42
- if(rb_block_given_p())
43
- rb_yield(self);
44
-
45
- return self;
46
- }
47
-
48
- /*
49
- * call-seq:
50
- * Sys::Admin.get_login
51
- *
52
- * Returns the login for the process. If this is called from a process that
53
- * has no controlling terminal, then it resorts to returning the "LOGNAME" or
54
- * "USER" environment variable. If neither of those is defined, then nil
55
- * is returned.
56
- *
57
- * Note that this method will _probably_ return the real user login, but may
58
- * return the effective user login. YMMV depending on your platform and how
59
- * the program is run.
60
- */
61
- static VALUE admin_get_login(VALUE klass){
62
- #ifdef HAVE_GETLOGIN_R
63
- char login[_POSIX_LOGIN_NAME_MAX];
64
-
65
- if(!getlogin_r(login, _POSIX_LOGIN_NAME_MAX))
66
- return rb_str_new2(login);
67
- #elif HAVE_GETLOGIN
68
- char* login = getlogin();
69
-
70
- if(login)
71
- return rb_str_new2(login);
72
- #endif
73
-
74
- #ifdef HAVE_GETPWUID_R
75
- uid_t uid;
76
- char buf[USER_BUF_SIZE];
77
- struct passwd pwd;
78
- struct passwd* pwdbuf;
79
-
80
- uid = getuid();
81
-
82
- if(getpwuid_r(uid, &pwd, buf, USER_BUF_SIZE, &pwdbuf) != 0)
83
- return rb_str_new2(pwdbuf->pw_name);
84
- #elif HAVE_GETPWUID
85
- uid_t uid;
86
- struct passwd* pwd;
87
-
88
- uid = getuid();
89
-
90
- if((pwd = getpwuid(uid)))
91
- return rb_str_new2(pwd->pw_name);
92
- #endif
93
-
94
- #ifdef HAVE_GETENV
95
- char* user = getenv("LOGNAME");
96
-
97
- if(user){
98
- return rb_str_new2(user);
99
- }
100
- else{
101
- user = getenv("USER");
102
- if(user)
103
- return rb_str_new2(user);
104
- }
105
- #endif
106
-
107
- return Qnil;
108
- }
109
-
110
- /* call-seq:
111
- * Admin.get_user(name)
112
- * Admin.get_user(uid)
113
- *
114
- * Returns a User object for the given +name+ or +uid+. Raises an Admin::Error
115
- * if a user cannot be found for that name or user ID.
116
- */
117
- static VALUE admin_get_user(VALUE klass, VALUE v_value){
118
- VALUE v_user;
119
-
120
- if(FIXNUM_P(v_value))
121
- v_user = get_user_by_num(v_value);
122
- else
123
- v_user = get_user_by_name(v_value);
124
-
125
- return v_user;
126
- }
127
-
128
- /* call-seq:
129
- * Admin.get_group(name)
130
- * Admin.get_group(gid)
131
- *
132
- * Returns a Group object for the given +name+ or +gid+. Raises an Admin::Error
133
- * if a group cannot be found for that name or GID.
134
- *
135
- *--
136
- * Developer's Note:
137
- *
138
- * I generally oppose method overloading like this, but for this method, and
139
- * for only two types, I can live with it for the added convenience it
140
- * provides.
141
- */
142
- static VALUE admin_get_group(VALUE klass, VALUE v_value){
143
- VALUE v_group;
144
-
145
- if(FIXNUM_P(v_value))
146
- v_group = get_group_by_num(v_value);
147
- else
148
- v_group = get_group_by_name(v_value);
149
-
150
- return v_group;
151
- }
152
-
153
- /*
154
- * :no-doc:
155
- *
156
- * This is the main body of the Admin.groups method. It is wrapped separately
157
- * for the sake of an rb_ensure() call.
158
- */
159
- static VALUE admin_groups_body(VALUE klass){
160
- VALUE v_array = Qnil;
161
-
162
- if(!rb_block_given_p())
163
- v_array = rb_ary_new();
164
-
165
- setgrent();
166
-
167
- #ifdef HAVE_GETGRENT_R
168
- struct group grp;
169
- char buf[GROUP_BUF_SIZE];
170
- #if defined _GNU_SOURCE && !defined __sunos && !defined __SUNPRO_C && !defined __SUNPRO_CC
171
- struct group* grp_p;
172
-
173
- while(!getgrent_r(&grp, buf, GROUP_BUF_SIZE, &grp_p)){
174
- if(grp_p == NULL)
175
- break;
176
-
177
- if(rb_block_given_p())
178
- rb_yield(get_group(grp_p));
179
- else
180
- rb_ary_push(v_array, get_group(grp_p));
181
- }
182
- #else
183
- while(getgrent_r(&grp, buf, GROUP_BUF_SIZE) != NULL){
184
- if(rb_block_given_p())
185
- rb_yield(get_group(&grp));
186
- else
187
- rb_ary_push(v_array, get_group(&grp));
188
- }
189
- #endif
190
- #elif HAVE_GETGRENT
191
- struct group* grp;
192
- while((grp = getgrent()) != NULL){
193
- if(rb_block_given_p())
194
- rb_yield(get_group(grp));
195
- else
196
- rb_ary_push(v_array, get_group(grp));
197
- }
198
- #else
199
- rb_raise(rb_eNotImpError, "groups method not supported on this platform");
200
- #endif
201
-
202
- return v_array; /* Nil or an array */
203
- }
204
-
205
- /* call-seq:
206
- * Admin.groups
207
- * Admin.groups{ |group| ... }
208
- *
209
- * In block form, yields a Group object for each group on the system. In
210
- * non-block form, returns an Array of Group objects.
211
- */
212
- static VALUE admin_groups(VALUE klass){
213
- return rb_ensure(admin_groups_body, rb_ary_new3(1, klass),
214
- admin_groups_cleanup, Qnil
215
- );
216
- }
217
-
218
- /*
219
- * :no-doc:
220
- *
221
- * This is the main body of the Admin.users method. It is wrapped separately
222
- * for the sake of an rb_ensure() call.
223
- */
224
- static VALUE admin_users_body(VALUE klass){
225
- VALUE v_array = Qnil;
226
-
227
- if(!rb_block_given_p())
228
- v_array = rb_ary_new();
229
-
230
- setpwent();
231
-
232
- #ifdef HAVE_GETPWENT_R
233
- struct passwd pwd;
234
- char buf[USER_BUF_SIZE];
235
-
236
- #if defined _GNU_SOURCE && !defined __sunos && !defined __SUNPRO_C && !defined __SUNPRO_CC
237
- struct passwd* pwd_p;
238
-
239
- while(!getpwent_r(&pwd, buf, USER_BUF_SIZE, &pwd_p)){
240
- if(pwd_p == NULL)
241
- break;
242
-
243
- if(rb_block_given_p())
244
- rb_yield(get_user(pwd_p));
245
- else
246
- rb_ary_push(v_array, get_user(pwd_p));
247
- }
248
- #else
249
- while(getpwent_r(&pwd, buf, USER_BUF_SIZE) != NULL){
250
- if(rb_block_given_p())
251
- rb_yield(get_user(&pwd));
252
- else
253
- rb_ary_push(v_array, get_user(&pwd));
254
- }
255
- #endif
256
- #elif HAVE_GETPWENT
257
- struct passwd* pwd;
258
-
259
- while((pwd = getpwent()) != NULL){
260
- if(rb_block_given_p())
261
- rb_yield(get_user(pwd));
262
- else
263
- rb_ary_push(v_array, get_user(pwd));
264
- }
265
- #else
266
- rb_raise(rb_eNotImpError, "users method not supported on this platform");
267
- #endif
268
-
269
- return v_array; /* Nil or an array */
270
- }
271
-
272
-
273
- /* call-seq:
274
- * Admin.users
275
- * Admin.users{ |user| ... }
276
- *
277
- * In block form, yields a User object for each user on the system. In
278
- * non-block form, returns an Array of User objects.
279
- */
280
- static VALUE admin_users(VALUE klass){
281
- return rb_ensure(admin_users_body, rb_ary_new3(1, klass),
282
- admin_users_cleanup, Qnil
283
- );
284
- }
285
-
286
- /* call-seq:
287
- * User#groups # => ['staff', 'admin', ...]
288
- *
289
- * Returns an array of groups the user belongs to.
290
- */
291
- static VALUE user_groups(VALUE self){
292
- VALUE v_groups, v_group, v_users, v_group_name, v_name, v_result;
293
- int i;
294
-
295
- v_name = rb_funcall(self, rb_intern("name"), 0, 0);
296
- v_result = rb_ary_new();
297
- v_groups = admin_groups(self);
298
-
299
- /* Iterate over each group, checking its members. If the members includes
300
- * the user name, we have a match.
301
- */
302
- if(!NIL_P(v_groups)){
303
- for(i = 0; i < RARRAY_LEN(v_groups); i++){
304
- v_group = RARRAY_PTR(v_groups)[i];
305
- v_users = rb_funcall(v_group, rb_intern("members"), 0, 0);
306
-
307
- if(RTEST(rb_funcall(v_users, rb_intern("include?"), 1, v_name))){
308
- v_group_name = rb_funcall(v_group, rb_intern("name"), 0, 0);
309
- rb_ary_push(v_result, v_group_name);
310
- }
311
- }
312
- }
313
-
314
- return v_result;
315
- }
316
-
317
- /*
318
- * The Sys::Admin class encapsulates typical operations surrounding the query
319
- * of user and group information.
320
- */
321
- void Init_admin(){
322
- VALUE mSys, cAdmin;
323
-
324
- /* The Sys module is used primarily as a namespace for Sys::Admin */
325
- mSys = rb_define_module("Sys");
326
-
327
- /* A unified, cross platform replacement for the Etc module. */
328
- cAdmin = rb_define_class_under(mSys, "Admin", rb_cObject);
329
-
330
- /* Encapsulates information typically found in /etc/passwd */
331
- cUser = rb_define_class_under(mSys, "User", rb_cObject);
332
-
333
- /* Encapsulates information typically found in /etc/group */
334
- cGroup = rb_define_class_under(mSys, "Group", rb_cObject);
335
-
336
- /* Error raised if any of the Sys::Admin methods fail */
337
- cAdminError = rb_define_class_under(cAdmin, "Error", rb_eStandardError);
338
-
339
- /* Class Methods */
340
- rb_define_singleton_method(cAdmin, "get_login", admin_get_login, 0);
341
- rb_define_singleton_method(cAdmin, "get_user", admin_get_user, 1);
342
- rb_define_singleton_method(cAdmin, "get_group", admin_get_group, 1);
343
- rb_define_singleton_method(cAdmin, "users", admin_users, 0);
344
- rb_define_singleton_method(cAdmin, "groups", admin_groups, 0);
345
-
346
- /* Instance Methods */
347
- rb_define_method(cUser, "initialize", user_init, 0);
348
- rb_define_method(cUser, "groups", user_groups, 0);
349
- rb_define_method(cGroup,"initialize", group_init, 0);
350
-
351
- /* User Attributes */
352
-
353
- /* The user name associated with the account */
354
- rb_define_attr(cUser, "name", 1, 1);
355
-
356
- /* The user's encrypted password. Deprecated in favor of /etc/shadow */
357
- rb_define_attr(cUser, "passwd", 1, 1);
358
-
359
- /* The user's user ID */
360
- rb_define_attr(cUser, "uid", 1, 1);
361
-
362
- /* The user's primary group ID */
363
- rb_define_attr(cUser, "gid", 1, 1);
364
-
365
- /* The absolute pathname of the user's home directory */
366
- rb_define_attr(cUser, "dir", 1, 1);
367
-
368
- /* The user's login shell */
369
- rb_define_attr(cUser, "shell", 1, 1);
370
-
371
- /* A comment field. Rarely used. */
372
- rb_define_attr(cUser, "gecos", 1, 1);
373
-
374
- /* The user's alloted amount of disk space */
375
- rb_define_attr(cUser, "quota", 1, 1);
376
-
377
- /* Used in the past for password aging. Deprecated in favor of /etc/shadow */
378
- rb_define_attr(cUser, "age", 1, 1);
379
-
380
- /* The user's access class */
381
- rb_define_attr(cUser, "access_class", 1, 1);
382
-
383
- /* Another comment field. Rarely used. */
384
- rb_define_attr(cUser, "comment", 1, 1);
385
-
386
- /* Account expiration date */
387
- rb_define_attr(cUser, "expire", 1, 1);
388
-
389
- /* Next date a password change will be needed */
390
- rb_define_attr(cUser, "change", 1, 1);
391
-
392
- /* The last time the user logged in */
393
- rb_define_attr(cUser, "login_time", 1, 0);
394
-
395
- /* The name of the terminal device the user last logged on with */
396
- rb_define_attr(cUser, "login_device", 1, 0);
397
-
398
- /* The hostname from which the user last logged in */
399
- rb_define_attr(cUser, "login_host", 1, 0);
400
-
401
- /* Group Attributes */
402
-
403
- /* The name of the group */
404
- rb_define_attr(cGroup, "name", 1, 1);
405
-
406
- /* The group's group ID */
407
- rb_define_attr(cGroup, "gid", 1, 1);
408
-
409
- /* An array of users that are members of the group */
410
- rb_define_attr(cGroup, "members", 1, 1);
411
-
412
- /* The group password, if any. */
413
- rb_define_attr(cGroup, "passwd", 1, 1);
414
-
415
- /* Constants */
416
-
417
- /* 1.5.5: The version of this library */
418
- rb_define_const(cAdmin, "VERSION", rb_str_new2(SYS_ADMIN_VERSION));
419
- }