]> andersk Git - gssapi-openssh.git/blob - openssh/contrib/aix/buildbff.sh
Import of OpenSSH 4.1p1
[gssapi-openssh.git] / openssh / contrib / aix / buildbff.sh
1 #!/bin/sh
2 #
3 # buildbff.sh: Create AIX SMIT-installable OpenSSH packages
4 # $Id$
5 #
6 # Author: Darren Tucker (dtucker at zip dot com dot au)
7 # This file is placed in the public domain and comes with absolutely
8 # no warranty.
9 #
10 # Based originally on Ben Lindstrom's buildpkg.sh for Solaris
11 #
12
13 #
14 # Tunable configuration settings
15 #       create a "config.local" in your build directory or set
16 #       environment variables to override these.
17 #
18 [ -z "$PERMIT_ROOT_LOGIN" ] && PERMIT_ROOT_LOGIN=no
19 [ -z "$X11_FORWARDING" ] && X11_FORWARDING=no
20 [ -z "$AIX_SRC" ] && AIX_SRC=no
21
22 umask 022
23
24 startdir=`pwd`
25
26 # Path to inventory.sh: same place as buildbff.sh
27 if  echo $0 | egrep '^/'
28 then
29         inventory=`dirname $0`/inventory.sh             # absolute path
30 else
31         inventory=`pwd`/`dirname $0`/inventory.sh       # relative path
32 fi
33
34 #
35 # We still support running from contrib/aix, but this is deprecated
36 #
37 if pwd | egrep 'contrib/aix$'
38 then
39         echo "Changing directory to `pwd`/../.."
40         echo "Please run buildbff.sh from your build directory in future."
41         cd ../..
42         contribaix=1
43 fi
44
45 if [ ! -f Makefile ]
46 then
47         echo "Makefile not found (did you run configure?)"
48         exit 1
49 fi
50
51 #
52 # Directories used during build:
53 # current dir = $objdir         directory you ran ./configure in.
54 # $objdir/$PKGDIR/              directory package files are constructed in
55 # $objdir/$PKGDIR/root/         package root ($FAKE_ROOT)
56 #
57 objdir=`pwd`
58 PKGNAME=openssh
59 PKGDIR=package
60
61 #
62 # Collect local configuration settings to override defaults
63 #
64 if [ -s ./config.local ]
65 then
66         echo Reading local settings from config.local
67         . ./config.local
68 fi
69
70 #
71 # Fill in some details from Makefile, like prefix and sysconfdir
72 #       the eval also expands variables like sysconfdir=${prefix}/etc
73 #       provided they are eval'ed in the correct order
74 #
75 for confvar in prefix exec_prefix bindir sbindir libexecdir datadir mandir mansubdir sysconfdir piddir srcdir
76 do
77         eval $confvar=`grep "^$confvar=" $objdir/Makefile | cut -d = -f 2`
78 done
79
80 #
81 # Collect values of privsep user and privsep path
82 #       currently only found in config.h
83 #
84 for confvar in SSH_PRIVSEP_USER PRIVSEP_PATH
85 do
86         eval $confvar=`awk '/#define[ \t]'$confvar'/{print $3}' $objdir/config.h`
87 done
88
89 # Set privsep defaults if not defined
90 if [ -z "$SSH_PRIVSEP_USER" ]
91 then
92         SSH_PRIVSEP_USER=sshd
93 fi
94 if [ -z "$PRIVSEP_PATH" ]
95 then
96         PRIVSEP_PATH=/var/empty
97 fi
98
99 # Clean package build directory
100 rm -rf $objdir/$PKGDIR
101 FAKE_ROOT=$objdir/$PKGDIR/root
102 mkdir -p $FAKE_ROOT
103
104 # Start by faking root install
105 echo "Faking root install..."
106 cd $objdir
107 make install-nokeys DESTDIR=$FAKE_ROOT
108
109 if [ $? -gt 0 ]
110 then
111         echo "Fake root install failed, stopping."
112         exit 1
113 fi
114
115 #
116 # Copy informational files to include in package
117 #
118 cp $srcdir/LICENCE $objdir/$PKGDIR/
119 cp $srcdir/README* $objdir/$PKGDIR/
120
121 #
122 # Extract common info requires for the 'info' part of the package.
123 #       AIX requires 4-part version numbers
124 #
125 VERSION=`./ssh -V 2>&1 | cut -f 1 -d , | cut -f 2 -d _`
126 MAJOR=`echo $VERSION | cut -f 1 -d p | cut -f 1 -d .`
127 MINOR=`echo $VERSION | cut -f 1 -d p | cut -f 2 -d .`
128 PATCH=`echo $VERSION | cut -f 1 -d p | cut -f 3 -d .`
129 PORTABLE=`echo $VERSION | awk 'BEGIN{FS="p"}{print $2}'`
130 [ "$PATCH" = "" ] && PATCH=0
131 [ "$PORTABLE" = "" ] && PORTABLE=0
132 BFFVERSION=`printf "%d.%d.%d.%d" $MAJOR $MINOR $PATCH $PORTABLE`
133
134 echo "Building BFF for $PKGNAME $VERSION (package version $BFFVERSION)"
135
136 #
137 # Set ssh and sshd parameters as per config.local
138 #
139 if [ "${PERMIT_ROOT_LOGIN}" = no ]
140 then
141         perl -p -i -e "s/#PermitRootLogin yes/PermitRootLogin no/" \
142                 $FAKE_ROOT/${sysconfdir}/sshd_config
143 fi
144 if [ "${X11_FORWARDING}" = yes ]
145 then
146         perl -p -i -e "s/#X11Forwarding no/X11Forwarding yes/" \
147                 $FAKE_ROOT/${sysconfdir}/sshd_config
148 fi
149
150
151 # Rename config files; postinstall script will copy them if necessary
152 for cfgfile in ssh_config sshd_config ssh_prng_cmds
153 do
154         mv $FAKE_ROOT/$sysconfdir/$cfgfile $FAKE_ROOT/$sysconfdir/$cfgfile.default
155 done
156
157 #
158 # Generate lpp control files.
159 #       working dir is $FAKE_ROOT but files are generated in dir above
160 #       and moved into place just before creation of .bff
161 #
162 cd $FAKE_ROOT
163 echo Generating LPP control files
164 find . ! -name . -print >../openssh.al
165 $inventory >../openssh.inventory
166
167 cat <<EOD >../openssh.copyright
168 This software is distributed under a BSD-style license.
169 For the full text of the license, see /usr/lpp/openssh/LICENCE
170 EOD
171
172 #
173 # openssh.size file allows filesystem expansion as required
174 # generate list of directories containing files
175 # then calculate disk usage for each directory and store in openssh.size
176 #
177 files=`find . -type f -print`
178 dirs=`for file in $files; do dirname $file; done | sort -u`
179 for dir in $dirs
180 do
181         du $dir
182 done > ../openssh.size
183
184 #
185 # Create postinstall script
186 #
187 cat <<EOF >>../openssh.post_i
188 #!/bin/sh
189
190 echo Creating configs from defaults if necessary.
191 for cfgfile in ssh_config sshd_config ssh_prng_cmds
192 do
193         if [ ! -f $sysconfdir/\$cfgfile ]
194         then
195                 echo "Creating \$cfgfile from default"
196                 cp $sysconfdir/\$cfgfile.default $sysconfdir/\$cfgfile
197         else
198                 echo "\$cfgfile already exists."
199         fi
200 done
201 echo
202
203 # Create PrivSep user if PrivSep not disabled in config
204 echo Creating PrivSep prereqs if required.
205 if egrep '^[ \t]*UsePrivilegeSeparation[ \t]+no' $sysconfdir/sshd_config >/dev/null
206 then
207         echo "UsePrivilegeSeparation disabled in config, not creating PrivSep user,"
208         echo "group or chroot directory."
209 else
210         echo "UsePrivilegeSeparation enabled in config (or defaulting to on)."
211
212         # create group if required
213         if cut -f1 -d: /etc/group | egrep '^'$SSH_PRIVSEP_USER'\$' >/dev/null
214         then
215                 echo "PrivSep group $SSH_PRIVSEP_USER already exists."
216         else
217                 echo "Creating PrivSep group $SSH_PRIVSEP_USER."
218                 mkgroup -A $SSH_PRIVSEP_USER
219         fi
220
221         # Create user if required
222         if lsuser "$SSH_PRIVSEP_USER" >/dev/null
223         then
224                 echo "PrivSep user $SSH_PRIVSEP_USER already exists."
225         else
226                 echo "Creating PrivSep user $SSH_PRIVSEP_USER."
227                 mkuser gecos='SSHD PrivSep User' login=false rlogin=false account_locked=true pgrp=$SSH_PRIVSEP_USER $SSH_PRIVSEP_USER
228         fi
229
230         # create chroot directory if required
231         if [ -d $PRIVSEP_PATH ]
232         then
233                 echo "PrivSep chroot directory $PRIVSEP_PATH already exists."
234         else
235                 echo "Creating PrivSep chroot directory $PRIVSEP_PATH."
236                 mkdir $PRIVSEP_PATH
237                 chown 0 $PRIVSEP_PATH
238                 chgrp 0 $PRIVSEP_PATH
239                 chmod 755 $PRIVSEP_PATH
240         fi
241 fi
242 echo
243
244 # Generate keys unless they already exist
245 echo Creating host keys if required.
246 if [ -f "$sysconfdir/ssh_host_key" ] ; then
247         echo "$sysconfdir/ssh_host_key already exists, skipping."
248 else
249         $bindir/ssh-keygen -t rsa1 -f $sysconfdir/ssh_host_key -N ""
250 fi
251 if [ -f $sysconfdir/ssh_host_dsa_key ] ; then
252         echo "$sysconfdir/ssh_host_dsa_key already exists, skipping."
253 else
254         $bindir/ssh-keygen -t dsa -f $sysconfdir/ssh_host_dsa_key -N ""
255 fi
256 if [ -f $sysconfdir/ssh_host_rsa_key ] ; then
257         echo "$sysconfdir/ssh_host_rsa_key already exists, skipping."
258 else
259         $bindir/ssh-keygen -t rsa -f $sysconfdir/ssh_host_rsa_key -N ""
260 fi
261 echo
262
263 # Set startup command depending on SRC support
264 if [ "$AIX_SRC" = "yes" ]
265 then
266         echo Creating SRC sshd subsystem.
267         rmssys -s sshd 2>&1 >/dev/null
268         mkssys -s sshd -p "$sbindir/sshd" -a '-D' -u 0 -S -n 15 -f 9 -R -G tcpip
269         startupcmd="start $sbindir/sshd \\\"\\\$src_running\\\""
270         oldstartcmd="$sbindir/sshd"
271 else
272         startupcmd="$sbindir/sshd"
273         oldstartcmd="start $sbindir/sshd \\\"$src_running\\\""
274 fi
275
276 # If migrating to or from SRC, change previous startup command
277 # otherwise add to rc.tcpip
278 if egrep "^\$oldstartcmd" /etc/rc.tcpip >/dev/null
279 then
280         if sed "s|^\$oldstartcmd|\$startupcmd|g" /etc/rc.tcpip >/etc/rc.tcpip.new
281         then
282                 chmod 0755 /etc/rc.tcpip.new
283                 mv /etc/rc.tcpip /etc/rc.tcpip.old && \
284                 mv /etc/rc.tcpip.new /etc/rc.tcpip
285         else
286                 echo "Updating /etc/rc.tcpip failed, please check."
287         fi
288 else
289         # Add to system startup if required
290         if grep "^\$startupcmd" /etc/rc.tcpip >/dev/null
291         then
292                 echo "sshd found in rc.tcpip, not adding."
293         else
294                 echo "Adding sshd to rc.tcpip"
295                 echo >>/etc/rc.tcpip
296                 echo "# Start sshd" >>/etc/rc.tcpip
297                 echo "\$startupcmd" >>/etc/rc.tcpip
298         fi
299 fi
300 EOF
301
302 #
303 # Create liblpp.a and move control files into it
304 #
305 echo Creating liblpp.a
306 (
307         cd ..
308         for i in openssh.al openssh.copyright openssh.inventory openssh.post_i openssh.size LICENCE README*
309         do
310                 ar -r liblpp.a $i
311                 rm $i
312         done
313 )
314
315 #
316 # Create lpp_name
317 #
318 # This will end up looking something like:
319 # 4 R I OpenSSH {
320 # OpenSSH 3.0.2.1 1 N U en_US OpenSSH 3.0.2p1 Portable for AIX
321 # [
322 # %
323 # /usr/local/bin 8073
324 # /usr/local/etc 189
325 # /usr/local/libexec 185
326 # /usr/local/man/man1 145
327 # /usr/local/man/man8 83
328 # /usr/local/sbin 2105
329 # /usr/local/share 3
330 # %
331 # ]
332 # }
333
334 echo Creating lpp_name
335 cat <<EOF >../lpp_name
336 4 R I $PKGNAME {
337 $PKGNAME $BFFVERSION 1 N U en_US OpenSSH $VERSION Portable for AIX
338 [
339 %
340 EOF
341
342 for i in $bindir $sysconfdir $libexecdir $mandir/${mansubdir}1 $mandir/${mansubdir}8 $sbindir $datadir /usr/lpp/openssh
343 do
344         # get size in 512 byte blocks
345         if [ -d $FAKE_ROOT/$i ]
346         then
347                 size=`du $FAKE_ROOT/$i | awk '{print $1}'`
348                 echo "$i $size" >>../lpp_name
349         fi
350 done
351
352 echo '%' >>../lpp_name
353 echo ']' >>../lpp_name
354 echo '}' >>../lpp_name
355
356 #
357 # Move pieces into place
358 #
359 mkdir -p usr/lpp/openssh
360 mv ../liblpp.a usr/lpp/openssh
361 mv ../lpp_name .
362
363 #
364 # Now invoke backup to create .bff file
365 #       note: lpp_name needs to be the first file so we generate the
366 #       file list on the fly and feed it to backup using -i
367 #
368 echo Creating $PKGNAME-$VERSION.bff with backup...
369 rm -f $PKGNAME-$VERSION.bff
370 (
371         echo "./lpp_name"
372         find . ! -name lpp_name -a ! -name . -print
373 ) | backup  -i -q -f ../$PKGNAME-$VERSION.bff $filelist
374
375 #
376 # Move package into final location and clean up
377 #
378 mv ../$PKGNAME-$VERSION.bff $startdir
379 cd $startdir
380 rm -rf $objdir/$PKGDIR
381
382 echo $0: done.
383
This page took 0.063717 seconds and 5 git commands to generate.