Initial add of defaria.com
[clearscm.git] / defaria.com / Computers / code / adm / bin / mkpass
1 #!/bin/bash
2 ################################################################################
3 #
4 # File:         mkpass
5 # Description:  Mother of All (MoA) passwd administration script
6 # Author:       Cory Chan (cory@cup.hp.com)
7 # Language:     Korn Shell
8 # Modified:     11/18/1994 Ryan Fong (fong@cup.hp.com) Modified for 10.0
9 #               07/26/1995 Andrew DeFaria (defaria@cup.hp.com) Revamped to use
10 #               NFS mount point to avoid rcp. Script now works for both 9.0
11 #               and 10.0.
12 #               08/21/1995 Andrew DeFaria (defaria@cup.hp.com) Revamped mail
13 #               message sending.
14 #               03/25/98 Michael Coulter (coulter) Changed "ch.apollo" to
15 #               "che.hp.com" because of a domain name change for Chelmsford.
16 #
17 # (c) Copyright 2001, Andrew@DeFaria.com, all rights reserved
18 #
19 ################################################################################
20 # First source the appserver script
21 if [ -x /app/appserver ]; then
22   . /app/appserver
23 fi
24
25 if [ "$OS" = "09" ]; then
26   /bin/cp /usr/spool/cron/crontabs/root /tmp/root-crontab
27   /usr/bin/crontab /tmp/root-crontab >> /nisclient.log 2>&1
28   /bin/rm /tmp/root-crontab
29 else
30   /bin/cp /var/spool/cron/crontabs/root /tmp/root-crontab
31   /usr/bin/crontab /tmp/root-crontab >> /nisclient.log  2>&1
32   /bin/rm /tmp/root-crontab
33 fi
34 exit
35
36 # Set ADMIN_ROOT
37 ADMIN_ROOT=/app/admin
38
39 # Check for force flag
40 FORCE="False"
41
42 if [ "$1" = "-f" ]; then
43   FORCE="True"
44 fi
45
46 # Whom to notify of problems. 
47 NOTIFY=root@$(hostname)
48
49 # Determine OS level
50 OS=`uname -r | cut -c 3-4`
51
52 MASTER_PASSWD=$ADMIN_ROOT/lib/master_passwd
53 MASTER_PASSWD_MLL=$ADMIN_ROOT/lib/master_passwd.mll
54 LOCAL_PASSWD=/etc/passwd.loc
55 EXCLUDED_PASSWD=/etc/passwd.exc
56 MARKER_FILE=/etc/pass.time
57 PASSWD_OLD=/etc/passwd.old
58 PASSWD=/etc/passwd
59 TMP_PASSWD=/tmp/passwd.$$
60 TMP_PASSWD2=/tmp/passwd2.$$
61
62 # Log and save old messages if there were any problems
63 MESSAGE_FILE=$ADMIN_ROOT/log/mkpass.$(uname -n)
64
65 # Set file attribute
66 umask 022                               
67 # Check for existance of $MASTER_PASSWD file. If missing send message and
68 # abort.
69 if [[ ! -f $MASTER_PASSWD ]]; then
70   mailx -s "mkpass: $MASTER_PASSWD file is missing!" $NOTIFY < /dev/null
71   exit 1
72 fi
73
74 # Check existence of necessary files; make when necessary.  
75 if [[ ! -f $MARKER_FILE ]]; then
76   # make time marker if not exists
77   touch $MARKER_FILE
78 fi
79
80 if [[ ! -f $EXCLUDED_PASSWD ]]; then
81   echo "# one login per line, no space/tab/null line#" > $EXCLUDED_PASSWD
82 fi
83
84 if [[ ! -f $PASSWD_OLD ]]; then
85   # make old passwd file if not exists
86   cp $PASSWD $PASSWD_OLD                
87 fi
88
89 if [[ ! -f $LOCAL_PASSWD ]]; then               
90   # no local file, notify and exit
91   cat > $MESSAGE_FILE <<!EOM
92 There was no $LOCAL_PASSWD file found on `uname -n`. This file must exist
93 and have root as its first entry. Please correct the problem.
94
95 For more information see:
96
97 http://cllweb/productivity/SysAdmin/Passwords.html#root
98
99 !EOM
100   mailx -s "mkpass: $LOCAL_PASSWD missing!" $NOTIFY < $MESSAGE_FILE
101   exit 0
102 fi
103
104 if [ $FORCE = "False" ]; then
105   # Check if passwd was changed directly since last check, if so mail the
106   # differences to $NOTIFY
107   if [[ $PASSWD -nt $MARKER_FILE ]] ; then
108     cat > $MESSAGE_FILE <<!EOM
109 $PASSWD on `uname -n` changed without using merge script! This is not the 
110 proper way to update passwords. For help regarding what you should do see:
111
112 http://cllweb/productivity/SysAdmin/Passwords.html#email
113
114 Here are the differences between the files:
115
116 (< = /etc/passwd > = /etc/passwd.old)
117 -----------------------------------------------------------------------------
118 !EOM
119     diff $PASSWD $PASSWD_OLD >> $MESSAGE_FILE
120     mailx -s "mkpass: $PASSWD incorrectly changed" $NOTIFY < $MESSAGE_FILE
121     exit 0
122   fi
123 fi
124
125 # Check to see if $LOCAL_PASSWD, $MASTER_PASSWD or $EXCLUDED_PASSWD is newer
126 # than $PASSWD. If so, combine $LOCAL_PASSWD and $MASTER_PASSWD (excluding 
127 # entries from $EXCLUDED_PASSWD) to form new $PASSWD
128 if [[ $FORCE             =   "True"  ||
129       $LOCAL_PASSWD      -nt $PASSWD || 
130       $MASTER_PASSWD     -nt $PASSWD || 
131       $MASTER_PASSWD_MLL -nt $PASSWD || 
132       $EXCLUDED_PASSWD   -nt $PASSWD ]]; then
133
134   # If only the $MASTER_PASSWD changed then make a note not to send email
135   if [[ $LOCAL_PASSWD    -nt $PASSWD || 
136         $EXCLUDED_PASSWD -nt $PASSWD ]]; then
137     NOTIFY_OF_CHANGE=True
138   else
139     NOTIFY_OF_CHANGE=False
140   fi
141
142   # Save an old copy around
143   cp $PASSWD $PASSWD_OLD
144
145   # Check root entry in $LOCAL_PASSWD
146   if grep -v "^#" $LOCAL_PASSWD | head -n 1 | grep "^root:" > /dev/null; then
147     # 1st entry root OKAY in $LOCAL_PASSWD
148     :
149   else
150     # 1st entry NOT root in passwd.loc
151     cat > $MESSAGE_FILE <<!EOM
152 The first entry of $LOCAL_PASSWD on `uname -n` should be for root. 
153 Please correct this problem. 
154
155 For more information see:
156
157 http://cllweb/productivity/SysaAdmin/Passwords.html#root
158
159 !EOM
160     mailx -s "mkpass: Missing first root in $LOCAL_PASSWD" $NOTIFY < $MESSAGE_FILE
161     rm -f $TMP_PASSWD
162     exit 0
163   fi
164
165   # Make new $PASSWD
166   rm -f $TMP_PASSWD2
167
168   # MLL gives us a passwd file that does not qualify the machine name portion
169   # of the home directory. This code fixes that up and also adds "_MoA" to the
170   # geos field.
171   #
172   # Some engineers also use a local copy of tcsh, therefore we must also check
173   # shell and add on .che.hp.com to the shell path.
174   IFS=:
175   while read user pass uid gid geos home shell; do
176     first_component_home=$(print $home | cut -f2 -d/)
177     machine_component_home=$(print $home | cut -f3 -d/)
178     rest_home=$(print $home | cut -f4- -d/)
179     home=/$first_component_home/$machine_component_home.che.hp.com/$rest_home
180     first_component_shell=$(print $shell | cut -f2 -d/)
181     machine_component_shell=$(print $shell | cut -f3 -d/)
182     rest_shell=$(print $shell | cut -f4- -d/)
183     if [ $first_component_shell = "net" ]; then
184       shell=\
185 /$first_component_shell/$machine_component_shell.che.hp.com/$rest_shell
186     fi
187     print "$user:$pass:$uid:$gid:$geos,_MoA_:$home:$shell" >> $TMP_PASSWD2
188   done < $MASTER_PASSWD_MLL
189
190   cat $LOCAL_PASSWD $MASTER_PASSWD $TMP_PASSWD2 > $TMP_PASSWD
191
192   # Do exclusion
193   grep -v "^#" $EXCLUDED_PASSWD |\
194    grep -vf $EXCLUDED_PASSWD $TMP_PASSWD > $TMP_PASSWD2
195
196   # Transform password file to 10.0 format
197   if [ $OS = "10" ]; then
198     sed -e 's/:\/nfs/:\/net/' -e 's/:\/bin/:\/usr\/bin/' \
199      $TMP_PASSWD2 > $TMP_PASSWD
200     rm -f $TMP_PASSWD2
201   else
202     mv $TMP_PASSWD2 $TMP_PASSWD
203   fi
204
205   if [ -s $TMP_PASSWD ]; then
206     mv $TMP_PASSWD $PASSWD
207     chmod 444 $PASSWD
208   else
209     rm -f $TMP_PASSWD
210     mailx -s "mkpass: Error: Zero length passwd file resulted!" $NOTIFY <<!EOM
211 For some reason mkpass resulted in a zero length passwd file. Please
212 investigate this.
213 !EOM
214   fi
215  
216   if [[ $NOTIFY_OF_CHANGE = "True" ]]; then
217     # Notify... (This could be improved by implementing a logging facility
218     # instead of tons of email).
219     cat > $MESSAGE_FILE <<!EOM
220 MoA has updated the $PASSWD file on `uname -n`. Here were the differences
221 before the update occured. Unless you feel that these updates were made
222 incorrectly you can probably safely ignore this message.
223
224 (< = /etc/passwd > = /etc/passwd.old)
225 -----------------------------------------------------------------------------
226 !EOM
227     diff $PASSWD $PASSWD_OLD >> $MESSAGE_FILE
228     mailx -s "mkpass: Made new $PASSWD" $NOTIFY < $MESSAGE_FILE
229   fi
230 fi
231
232 # Update marker file
233 touch -ma $MARKER_FILE
234
235 # Update log file
236 echo "$PASSWD on `uname -n` is up to date as of `date`" > $MESSAGE_FILE
237
238 exit 0