module EtcUtils
Constants
- GROUP
- GSHADOW
- Gshadow
- PASSWD
- SHADOW
- SHELL
- VERSION
Public Class Methods
can_lockfile?()
click to toggle source
static VALUE eu_lockable_p(VALUE self) { #if defined(HAVE_LCKPWDF) ||defined(HAVE_ULCKPWDF) return Qtrue; #else return Qfalse; #endif }
endXXent()
click to toggle source
static VALUE eu_endXXent(VALUE self) { eu_endpwent(self); eu_endgrent(self); eu_endspent(self); eu_endsgent(self); return Qnil; }
endgrent()
click to toggle source
VALUE eu_endgrent(VALUE self) { #ifdef HAVE_ENDGRENT endgrent(); #endif return Qnil; }
endpwent()
click to toggle source
VALUE eu_endpwent(VALUE self) { #ifdef HAVE_ENDPWENT endpwent(); #endif return Qnil; }
endsgent()
click to toggle source
VALUE eu_endsgent(VALUE self) { #ifdef HAVE_ENDSGENT endsgent(); #endif return Qnil; }
endspent()
click to toggle source
VALUE eu_endspent(VALUE self) { #ifdef HAVE_ENDSPENT endspent(); #endif return Qnil; }
fgetgrent(p1)
click to toggle source
static VALUE eu_fgetgrent(VALUE self, VALUE io) { struct group *grp; ensure_file(io); if ( (grp = fgetgrent(RFILE_FPTR(io))) == NULL ) return Qnil; return setup_group(grp); }
fgetpwent(p1)
click to toggle source
static VALUE eu_fgetpwent(VALUE self, VALUE io) { struct passwd *pwd; ensure_file(io); if ( (pwd = fgetpwent(RFILE_FPTR(io))) == NULL ) return Qnil; return setup_passwd(pwd); }
fgetsgent(p1)
click to toggle source
static VALUE eu_fgetsgent(VALUE self, VALUE io) { struct sgrp *sgroup; ensure_file(io); if ( (sgroup = fgetsgent(RFILE_FPTR(io))) == NULL ) return Qnil; return setup_gshadow(sgroup); }
fgetspent(p1)
click to toggle source
static VALUE eu_fgetspent(VALUE self, VALUE io) { struct spwd *spwd; ensure_file(io); if ( (spwd = fgetspent(RFILE_FPTR(io))) == NULL ) return Qnil; return setup_shadow(spwd); }
find_grp(p1)
click to toggle source
VALUE eu_getgrp(VALUE self, VALUE v) { struct group *strt; eu_setgrent(self); if (FIXNUM_P(v)) strt = getgrgid(NUM2UIDT(v)); else { SafeStringValue(v); strt = getgrnam(StringValuePtr(v)); } if (!strt) return Qnil; return setup_group(strt); }
find_pwd(p1)
click to toggle source
endif VALUE eu_getpwd(VALUE self, VALUE v) { struct passwd *strt; eu_setpwent(self); if ( FIXNUM_P(v) ) strt = getpwuid(NUM2UIDT(v)); else { SafeStringValue(v); strt = getpwnam(StringValuePtr(v)); } if (!strt) return Qnil; return setup_passwd(strt); }
find_sgrp(p1)
click to toggle source
VALUE eu_getsgrp(VALUE self, VALUE v) { #ifdef GSHADOW struct sgrp *strt; eu_setsgent(self); if ( FIXNUM_P(v) ) { struct group *s; if ( (s = getgrgid(NUM2UIDT(v))) ) v = setup_safe_str(s->gr_name); } SafeStringValue(v); strt = getsgnam(StringValuePtr(v)); if (!strt) return Qnil; return setup_gshadow(strt); #else return Qnil; #endif }
find_spwd(p1)
click to toggle source
VALUE eu_getspwd(VALUE self, VALUE v) { #ifdef SHADOW struct spwd *strt; eu_setspent(self); if ( FIXNUM_P(v) ) { struct passwd *s; if ( (s = getpwuid(NUM2UIDT(v))) ) v = rb_str_new2(s->pw_name); else return Qnil; } SafeStringValue(v); strt = getspnam(StringValuePtr(v)); if (!strt) return Qnil; return setup_shadow(strt); #else return Qnil; #endif }
getgrent()
click to toggle source
VALUE eu_getgrent(VALUE self) { struct group *grp; if (rb_block_given_p()) each_group(); else if ( (grp = getgrent()) ) return setup_group(grp); return Qnil; }
getgrnam(p1)
click to toggle source
VALUE eu_getgrp(VALUE self, VALUE v) { struct group *strt; eu_setgrent(self); if (FIXNUM_P(v)) strt = getgrgid(NUM2UIDT(v)); else { SafeStringValue(v); strt = getgrnam(StringValuePtr(v)); } if (!strt) return Qnil; return setup_group(strt); }
getlogin()
click to toggle source
static VALUE eu_getlogin(VALUE self) { struct passwd *pwd; pwd = getpwuid(geteuid()); return setup_passwd(pwd); }
getpwent()
click to toggle source
VALUE eu_getpwent(VALUE self) { struct passwd *pwd; if (rb_block_given_p()) each_passwd(); else if ( (pwd = getpwent()) ) return setup_passwd(pwd); return Qnil; }
getpwnam(p1)
click to toggle source
endif VALUE eu_getpwd(VALUE self, VALUE v) { struct passwd *strt; eu_setpwent(self); if ( FIXNUM_P(v) ) strt = getpwuid(NUM2UIDT(v)); else { SafeStringValue(v); strt = getpwnam(StringValuePtr(v)); } if (!strt) return Qnil; return setup_passwd(strt); }
getsgent()
click to toggle source
VALUE eu_getsgent(VALUE self) { struct sgrp *sgroup; if (rb_block_given_p()) each_sgrp(); else if ( (sgroup = getsgent()) ) return setup_gshadow(sgroup); return Qnil; }
getsgnam(p1)
click to toggle source
VALUE eu_getsgrp(VALUE self, VALUE v) { #ifdef GSHADOW struct sgrp *strt; eu_setsgent(self); if ( FIXNUM_P(v) ) { struct group *s; if ( (s = getgrgid(NUM2UIDT(v))) ) v = setup_safe_str(s->gr_name); } SafeStringValue(v); strt = getsgnam(StringValuePtr(v)); if (!strt) return Qnil; return setup_gshadow(strt); #else return Qnil; #endif }
getspent()
click to toggle source
VALUE eu_getspent(VALUE self) { struct spwd *shadow; if (rb_block_given_p()) each_shadow(); else if ( (shadow = getspent()) ) return setup_shadow(shadow); return Qnil; }
getspnam(p1)
click to toggle source
VALUE eu_getspwd(VALUE self, VALUE v) { #ifdef SHADOW struct spwd *strt; eu_setspent(self); if ( FIXNUM_P(v) ) { struct passwd *s; if ( (s = getpwuid(NUM2UIDT(v))) ) v = rb_str_new2(s->pw_name); else return Qnil; } SafeStringValue(v); strt = getspnam(StringValuePtr(v)); if (!strt) return Qnil; return setup_shadow(strt); #else return Qnil; #endif }
has_group?()
click to toggle source
static VALUE eu_group_p(VALUE self) { #ifdef GROUP return Qtrue; #else return Qfalse; #endif }
has_gshadow?()
click to toggle source
static VALUE eu_gshadow_p(VALUE self) { #ifdef GSHADOW return Qtrue; #else return Qfalse; #endif }
has_passwd?()
click to toggle source
static VALUE eu_passwd_p(VALUE self) { #ifdef PASSWD return Qtrue; #else return Qfalse; #endif }
has_shadow?()
click to toggle source
static VALUE eu_shadow_p(VALUE self) { #ifdef SHADOW return Qtrue; #else return Qfalse; #endif }
lckpwdf()
click to toggle source
static VALUE eu_lckpwdf(VALUE self) { VALUE r; if ( !(r = eu_locked_p(self)) ) { if ( !(lckpwdf()) ) r = Qtrue; } return r; }
lock()
click to toggle source
static VALUE eu_lock(VALUE self) { if (eu_lckpwdf(self)) { if (rb_block_given_p()) { if (in_lock) rb_raise(rb_eRuntimeError, "parallel lock iteration"); rb_ensure(rb_yield, Qnil, lock_ensure, 0); return Qnil; } return Qtrue; } else rb_raise(rb_eIOError, "unable to create file lock"); }
locked?()
click to toggle source
static VALUE eu_locked_p(VALUE self) { int i; errno = 0; i = lckpwdf(); if (errno) rb_raise(rb_eSystemCallError, "Error locking passwd files: %s", strerror(errno)); if (i) return Qtrue; else if (!ulckpwdf()) return Qfalse; else rb_raise(rb_eIOError,"Unable to determine the locked state of password files"); }
me()
click to toggle source
static VALUE eu_getlogin(VALUE self) { struct passwd *pwd; pwd = getpwuid(geteuid()); return setup_passwd(pwd); }
next_gid(p1 = v1)
click to toggle source
VALUE next_gid(int argc, VALUE *argv, VALUE self) { VALUE i; gid_t req; rb_scan_args(argc, argv, "01", &i); if (NIL_P(i)) i = gid_global; i = rb_Integer(i); req = NUM2UINT(i); if ( req > ((unsigned int)65533) ) rb_raise(rb_eArgError, "GID must be between 0 and 65533"); while ( getgrgid(req) || rb_ary_includes(assigned_gids, UINT2NUM(req)) ) req++; if (!argc) rb_ary_push(assigned_gids, UINT2NUM(req)); else gid_global = UINT2NUM(req); return UINT2NUM(req); }
next_gid=(p1 = v1)
click to toggle source
VALUE next_gid(int argc, VALUE *argv, VALUE self) { VALUE i; gid_t req; rb_scan_args(argc, argv, "01", &i); if (NIL_P(i)) i = gid_global; i = rb_Integer(i); req = NUM2UINT(i); if ( req > ((unsigned int)65533) ) rb_raise(rb_eArgError, "GID must be between 0 and 65533"); while ( getgrgid(req) || rb_ary_includes(assigned_gids, UINT2NUM(req)) ) req++; if (!argc) rb_ary_push(assigned_gids, UINT2NUM(req)); else gid_global = UINT2NUM(req); return UINT2NUM(req); }
next_uid(p1 = v1)
click to toggle source
Start of helper functions
VALUE next_uid(int argc, VALUE *argv, VALUE self) { VALUE i; uid_t req; rb_scan_args(argc, argv, "01", &i); if (NIL_P(i)) i = uid_global; i = rb_Integer(i); req = NUM2UINT(i); if ( req > ((unsigned int)65533) ) rb_raise(rb_eArgError, "UID must be between 0 and 65533"); while ( getpwuid(req) || rb_ary_includes(assigned_uids, UINT2NUM(req)) ) req++; if (!argc) rb_ary_push(assigned_uids, UINT2NUM(req)); else uid_global = UINT2NUM(req); return UINT2NUM(req); }
next_uid=(p1 = v1)
click to toggle source
Start of helper functions
VALUE next_uid(int argc, VALUE *argv, VALUE self) { VALUE i; uid_t req; rb_scan_args(argc, argv, "01", &i); if (NIL_P(i)) i = uid_global; i = rb_Integer(i); req = NUM2UINT(i); if ( req > ((unsigned int)65533) ) rb_raise(rb_eArgError, "UID must be between 0 and 65533"); while ( getpwuid(req) || rb_ary_includes(assigned_uids, UINT2NUM(req)) ) req++; if (!argc) rb_ary_push(assigned_uids, UINT2NUM(req)); else uid_global = UINT2NUM(req); return UINT2NUM(req); }
putgrent(p1, p2)
click to toggle source
static VALUE eu_putgrent(VALUE mod, VALUE entry, VALUE io) { return group_putgrent(entry,io); }
putpwent(p1, p2)
click to toggle source
static VALUE eu_putpwent(VALUE mod, VALUE entry, VALUE io) { return user_putpwent(entry,io); }
putsgent(p1, p2)
click to toggle source
static VALUE eu_putsgent(VALUE mod, VALUE entry, VALUE io) { return group_putsgent(entry,io); }
putspent(p1, p2)
click to toggle source
static VALUE eu_putspent(VALUE mod, VALUE entry, VALUE io) { return user_putspent(entry,io); }
read_group?()
click to toggle source
static VALUE eu_read_group_p(VALUE self) { if (eu_group_p(self)) return eu_file_readable_p(GROUP); return Qfalse; }
read_gshadow?()
click to toggle source
static VALUE eu_read_gshadow_p(VALUE self) { #ifdef GSHADOW if (eu_gshadow_p(self) && eu_file_readable_p(GSHADOW)) if (getsgent()) { setsgent(); return Qtrue; } #endif return Qfalse; }
read_passwd?()
click to toggle source
static VALUE eu_read_passwd_p(VALUE self) { if (eu_passwd_p(self)) return eu_file_readable_p(PASSWD); return Qfalse; }
read_shadow?()
click to toggle source
static VALUE eu_read_shadow_p(VALUE self) { #ifdef SHADOW if (eu_shadow_p(self)) return eu_file_readable_p(SHADOW); #endif return Qfalse; }
setXXent()
click to toggle source
static VALUE eu_setXXent(VALUE self) { eu_setpwent(self); eu_setgrent(self); eu_setspent(self); eu_setsgent(self); return Qnil; }
setgrent()
click to toggle source
VALUE eu_setgrent(VALUE self) { #ifdef HAVE_SETGRENT setgrent(); #endif return Qnil; }
setpwent()
click to toggle source
set/end syscalls
VALUE eu_setpwent(VALUE self) { #ifdef HAVE_SETPWENT setpwent(); #endif return Qnil; }
setsgent()
click to toggle source
VALUE eu_setsgent(VALUE self) { #ifdef HAVE_SETSGENT setsgent(); #endif return Qnil; }
setspent()
click to toggle source
VALUE eu_setspent(VALUE self) { #ifdef HAVE_SETSPENT setspent(); #endif return Qnil; }
sgetgrent(p1)
click to toggle source
members VALUE eu_sgetgrent(VALUE self, VALUE str) { VALUE ary; eu_setpwent(self); eu_setgrent(self); ary = rb_str_split(str, ":"); str = rb_ary_entry(ary,0); if (RSTRING_BLANK_P(str)) rb_raise(rb_eArgError,"Group name must be present."); if (getgrnam( StringValuePtr(str) )) return eu_grp_cur(str, ary); else return eu_grp_new(self, ary); }
sgetpwent(p1)
click to toggle source
INPUT Examples:
-
CURRENT USERS
-
bin:x:2:2:bin:/bin:/bin/bash
-
bin:x:::bin:/bin:/bin/bash
-
bin:x:::bin:/bin:/bin/sh
-
bin:x:::bin:/bin:/bin/sh
-
bin:x:::Bin User:/bin:/bin/sh
-
NEW USERS
-
newuser:x:1000:1000:New User:/home/newuser:/bin/bash
-
newuser:x:::New User:/home/newuser:/bin/bash
-
newuser:x:::New User::/bin/bash
-
UNIVERSAL BEHAVIOR
if USERNAME empty - raise error
CURRENT USER
iff one of uid/gid is empty - if VAL is NOT equal to VAL in PASSWD - if VAL is available - Populate VAL - else raise error - else Populate VAL if PASSWORD, UID, GID, GECOS, HOMEDIR, SHELL are empty - populate VALUE from PASSWD
NEW USER
if UID/GID are empty - next_uid/next_gid else - Test VALUE availability then - Populate UID/GID if GECOS, HOMEDIR, SHELL is empty - GECOS defaults to USERNAME - Assign default VALUE (Need to set config VALUES) if PASSWORD is empty - raise Error
VALUE eu_sgetpwent(VALUE self, VALUE str) { VALUE ary; eu_setpwent(self); eu_setgrent(self); ary = rb_str_split(str, ":"); str = rb_ary_entry(ary,0); if (RSTRING_BLANK_P(str)) rb_raise(rb_eArgError,"User name must be present."); if (getpwnam( StringValuePtr(str) )) return eu_parsecurrent(str, ary); else return eu_parsenew(self, ary); }
sgetsgent(p1)
click to toggle source
VALUE eu_sgetsgent(VALUE self, VALUE nam) { #ifdef GSHADOW struct sgrp *gshadow; SafeStringValue(nam); if ( !(gshadow = sgetsgent(StringValuePtr(nam))) ) rb_raise(rb_eArgError, "can't parse %s into EtcUtils::GShadow", StringValuePtr(nam)); return setup_gshadow(gshadow); #else return Qnil; #endif }
sgetspent(p1)
click to toggle source
VALUE eu_sgetspent(VALUE self, VALUE nam) { #ifdef SHADOW struct spwd *shadow; SafeStringValue(nam); if ( !(shadow = sgetspent(StringValuePtr(nam))) ) rb_raise(rb_eArgError, "can't parse %s into EtcUtils::Shadow", StringValuePtr(nam)); return setup_shadow(shadow); #else return Qnil; #endif }
ulckpwdf()
click to toggle source
static VALUE eu_ulckpwdf(VALUE self) { VALUE r; if ( (r = eu_locked_p(self)) ) if ( !(ulckpwdf()) ) r = Qtrue; return r; }
unlock()
click to toggle source
static VALUE eu_unlock(VALUE self) { return eu_ulckpwdf(self); }