"Fossies" - the Fresh Open Source Software Archive

Member "passwd_exp-1.2.11/mod/shadow.linux" (21 Nov 2005, 4833 Bytes) of package /linux/privat/old/passwd_exp-1.2.11.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 #! /usr/bin/perl
    2 # PROGRAM   : shadow.linux (passwd_exp 1.x helper)
    3 # PURPOSE   : create input list from linux shadow
    4 # AUTHOR    : Samuel Behan <samkob@gmail.com> (c) 2000-2006
    5 # HOMEPAGE  : http://devel.dob.sk/passwd_exp
    6 # LICENSE   : GNU GPL v2, NO WARRANTY VOID (see file LICENSE)
    7 ################################################################################
    8 #requirements
    9 use POSIX    qw(uname);
   10 #pragmas
   11 #use strict;
   12 use integer;
   13 use vars qw($VERSION $AUTHOR $AUTHOR_EMAIL $SCRIPT);
   14 
   15 #script info
   16 $AUTHOR     = 'Samuel Behan';
   17 $AUTHOR_EMAIL   = 'samkob@gmail.com';
   18 $VERSION    = '1.0.0';
   19 $SCRIPT     = 'shadow.linux';
   20 
   21 #config defaults
   22 my %CONFIG;
   23 $CONFIG{-shells_file}   = '/etc/shells';
   24 $CONFIG{"shadow"}   = '/etc/shadow';
   25 $CONFIG{"host"}     = ( uname() )[1];
   26 $CONFIG{"getent"}   = 0;
   27  
   28 ##constants
   29 #shadow
   30 sub SH_NAME     {   0;  };
   31 sub SH_PASSWD       {   1;  };
   32 sub SH_LAST_CHANGE  {   2;  };
   33 sub SH_CHANGE_MIN   {   3;  };
   34 sub SH_CHANGE_MAX   {   4;  };
   35 sub SH_CHANGE_WARN  {   5;  };
   36 sub SH_INACTIVE_MAX {   6;  };
   37 sub SH_EXPIRE_DATE  {   7;  };
   38 sub SH_RESERVED     {   8;  };
   39 #passwd
   40 sub PW_NAME     {   0;  };
   41 sub PW_PASSWD       {   1;  };
   42 sub PW_UID      {   2;  };
   43 sub PW_GID      {   3;  };
   44 sub PW_QUOTA        {   4;  };
   45 sub PW_COMMENT      {   5;  };
   46 sub PW_GCOS     {   6;  };
   47 sub PW_DIR      {   7;  };
   48 sub PW_SHELL        {   8;  };
   49 sub PW_EXPIRE       {   9;  };
   50 
   51 #print info
   52 sub cmd_print_info(;$)
   53 {   
   54     print STDERR <<__EOT__
   55 usage: $SCRIPT [command] [options]
   56       -- $SCRIPT (passwd_exp helper) $VERSION by $AUTHOR 
   57 [command]
   58     info            print module info
   59 [options]
   60     getent=BOOL     use getent to fetch shadow data
   61     uid_min=INT     set minimum UID
   62     uid_max=INT     set maximum UID
   63     uid_regexp=EXPR     check UID against regexp
   64     gid_min=INT     set minimum GID
   65     gid_max=INT     set minimum GID
   66     gid_regexp=EXPR     check GID against regexp
   67     group_regexp=EXPR   check group name against regexp
   68     host=HOST       set host name
   69     shell=0/1       require valid shell (from '$CONFIG{-shells_file}')
   70     shadow=FILE     set shadow file to use (default '$CONFIG{shadow}')
   71 __EOT__
   72 ;
   73     exit(defined($_[0]));
   74 }
   75 
   76 
   77 ################
   78 # MAIN PROGRAM #
   79 ################
   80 my ($cmd, $line, $linenum, @shdata, @pwdata, @pcdata);
   81 my (@SHELLS);
   82 
   83 #parse command line
   84 foreach $cmd (@ARGV)
   85 {
   86     cmd_print_info() if($cmd eq '-info' || $cmd eq '--info' || $cmd eq '-h' ||
   87                 $cmd eq '-help' || $cmd eq '--help' || $file ne '');
   88     cmd_print_info(1) if(substr($cmd, 0, 1) eq '-' || substr($cmd, 0, 2) eq '--');  
   89     if($cmd =~ /^(\w+)=(.*)$/o)
   90     {   $CONFIG{$1} = $2 if(defined($2) && $2 ne '');
   91         next;   }
   92     warn("$SCRIPT: unknown argument '$cmd'\n")
   93 }
   94 #check params
   95 die("$SCRIPT: missing host name (try passing host=HOST), exiting...\n")
   96     if(!defined($CONFIG{"host"}) || $CONFIG{"host"} eq '');
   97 
   98 
   99 #open shadow file
  100 if(defined($CONFIG{"getent"}) && $CONFIG{"getent"}) #use getent
  101 {   die("$SCRIPT: failed get shadow database via `getent shadow` ($!)\n")
  102         if(!open(SHADOW, "getent shadow|"));    }
  103 else                            #use direct file access
  104 {   die("$SCRIPT: failed to open shadow file '$CONFIG{shadow}' ($!)\n")
  105         if(!open(SHADOW, $CONFIG{shadow})); }
  106 #read shell file
  107 if(defined($CONFIG{"shell"}) && $CONFIG{"shell"} == 1)
  108 {   
  109     die("$SCRIPT: can not get $CONFIG{-shells_file} entries ($!)\n")
  110         if(!open(SHELL, "_shell.reader $CONFIG{-shells_file}|") &&
  111             !open(SHELL, "$CONFIG{-path}/_shell.reader $CONFIG{-shells_file}|"));
  112     while(defined(($cmd = <SHELL>)))
  113     {   chomp($cmd);
  114         push(@SHELLS, $cmd);    }
  115     close(SHELL);
  116 }
  117 
  118 #read shadow
  119 setpwent();
  120 while(defined(($line = <SHADOW>)))
  121 {
  122     $linenum++;
  123     #remove eol
  124     chomp($line);
  125 
  126     #check empty lines
  127     next    if($line =~ /^#/o || $line eq '' || $line =~ /^\s+$/o);
  128 
  129     #split data & check them
  130     @shdata = split(/:/o, $line, 9);
  131     @pwdata = getpwnam($shdata[SH_NAME]);
  132     warn("$SCRIPT: incomplete data of user '".$shdata[SH_NAME]."', skipping...\n"), next
  133         if($#pwdata == -1);
  134 
  135     #test wheter account is active/not disabled (stolen from pam_unix)
  136     next    if(($pwdata[PW_PASSWD] eq '*' || $pwdata[PW_PASSWD] eq '!!')            #account disabled
  137             || (!$shdata[SH_LAST_CHANGE] || $shdata[SH_LAST_CHANGE] <= 0)   #never used
  138             || ((!$shdata[SH_CHANGE_MAX] || $shdata[SH_CHANGE_MAX] <= 0)    
  139             && !$shdata[SH_EXPIRE_DATE] && $shdata[SH_EXPIRE_DATE] != 99999));#never expires
  140 
  141     #selection
  142     next    if(($#SHELLS != -1 && !grep { $pwdata[PW_SHELL] eq $_} @SHELLS)
  143             || (exists($CONFIG{'uid_min'}) && $CONFIG{'uid_min'} >= $pwdata[PW_UID])
  144             || (exists($CONFIG{'uid_max'}) && $CONFIG{'uid_max'} <= $pwdata[PW_UID]));
  145 
  146     #assemble data
  147     @pcdata = ($shdata[SH_NAME],                #name
  148         $pwdata[PW_GCOS],               #info
  149         $shdata[SH_NAME].'@'.$CONFIG{"host"},       #email
  150         $shdata[SH_LAST_CHANGE]+$shdata[SH_CHANGE_MAX], #edate
  151         $shdata[SH_EXPIRE_DATE],            #adate
  152         $shdata[SH_CHANGE_WARN],            #wdays
  153         $shdata[SH_INACTIVE_MAX],           #idays
  154         0                       #nosend
  155             );
  156 
  157     #send data
  158     syswrite(STDOUT, join(":", @pcdata)."\n");
  159 
  160     #undef data
  161     undef @shdata;
  162     undef @pwdata;
  163     undef @pcdata;  
  164 }
  165 endpwent();
  166 
  167 #EOF (c) by UN*X 1970-$EOD (End of Days) [ EOD (c) by God ]