"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 ]