1#!/bin/sh 2# 3# buildbff.sh: Create AIX SMIT-installable OpenSSH packages 4# $Id: buildbff.sh,v 1.7 2003/11/21 12:48:56 djm Exp $ 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 22umask 022 23 24startdir=`pwd` 25 26# Path to inventory.sh: same place as buildbff.sh 27if echo $0 | egrep '^/' 28then 29 inventory=`dirname $0`/inventory.sh # absolute path 30else 31 inventory=`pwd`/`dirname $0`/inventory.sh # relative path 32fi 33 34# 35# We still support running from contrib/aix, but this is deprecated 36# 37if pwd | egrep 'contrib/aix$' 38then 39 echo "Changing directory to `pwd`/../.." 40 echo "Please run buildbff.sh from your build directory in future." 41 cd ../.. 42 contribaix=1 43fi 44 45if [ ! -f Makefile ] 46then 47 echo "Makefile not found (did you run configure?)" 48 exit 1 49fi 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# 57objdir=`pwd` 58PKGNAME=openssh 59PKGDIR=package 60 61# 62# Collect local configuration settings to override defaults 63# 64if [ -s ./config.local ] 65then 66 echo Reading local settings from config.local 67 . ./config.local 68fi 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# 75for confvar in prefix exec_prefix bindir sbindir libexecdir datadir mandir mansubdir sysconfdir piddir srcdir 76do 77 eval $confvar=`grep "^$confvar=" $objdir/Makefile | cut -d = -f 2` 78done 79 80# 81# Collect values of privsep user and privsep path 82# currently only found in config.h 83# 84for confvar in SSH_PRIVSEP_USER PRIVSEP_PATH 85do 86 eval $confvar=`awk '/#define[ \t]'$confvar'/{print $3}' $objdir/config.h` 87done 88 89# Set privsep defaults if not defined 90if [ -z "$SSH_PRIVSEP_USER" ] 91then 92 SSH_PRIVSEP_USER=sshd 93fi 94if [ -z "$PRIVSEP_PATH" ] 95then 96 PRIVSEP_PATH=/var/empty 97fi 98 99# Clean package build directory 100rm -rf $objdir/$PKGDIR 101FAKE_ROOT=$objdir/$PKGDIR/root 102mkdir -p $FAKE_ROOT 103 104# Start by faking root install 105echo "Faking root install..." 106cd $objdir 107make install-nokeys DESTDIR=$FAKE_ROOT 108 109if [ $? -gt 0 ] 110then 111 echo "Fake root install failed, stopping." 112 exit 1 113fi 114 115# 116# Copy informational files to include in package 117# 118cp $srcdir/LICENCE $objdir/$PKGDIR/ 119cp $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# 125VERSION=`./ssh -V 2>&1 | cut -f 1 -d , | cut -f 2 -d _` 126MAJOR=`echo $VERSION | cut -f 1 -d p | cut -f 1 -d .` 127MINOR=`echo $VERSION | cut -f 1 -d p | cut -f 2 -d .` 128PATCH=`echo $VERSION | cut -f 1 -d p | cut -f 3 -d .` 129PORTABLE=`echo $VERSION | awk 'BEGIN{FS="p"}{print $2}'` 130[ "$PATCH" = "" ] && PATCH=0 131[ "$PORTABLE" = "" ] && PORTABLE=0 132BFFVERSION=`printf "%d.%d.%d.%d" $MAJOR $MINOR $PATCH $PORTABLE` 133 134echo "Building BFF for $PKGNAME $VERSION (package version $BFFVERSION)" 135 136# 137# Set ssh and sshd parameters as per config.local 138# 139if [ "${PERMIT_ROOT_LOGIN}" = no ] 140then 141 perl -p -i -e "s/#PermitRootLogin yes/PermitRootLogin no/" \ 142 $FAKE_ROOT/${sysconfdir}/sshd_config 143fi 144if [ "${X11_FORWARDING}" = yes ] 145then 146 perl -p -i -e "s/#X11Forwarding no/X11Forwarding yes/" \ 147 $FAKE_ROOT/${sysconfdir}/sshd_config 148fi 149 150 151# Rename config files; postinstall script will copy them if necessary 152for cfgfile in ssh_config sshd_config ssh_prng_cmds 153do 154 mv $FAKE_ROOT/$sysconfdir/$cfgfile $FAKE_ROOT/$sysconfdir/$cfgfile.default 155done 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# 162cd $FAKE_ROOT 163echo Generating LPP control files 164find . ! -name . -print >../openssh.al 165$inventory >../openssh.inventory 166 167cat <<EOD >../openssh.copyright 168This software is distributed under a BSD-style license. 169For the full text of the license, see /usr/lpp/openssh/LICENCE 170EOD 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# 177files=`find . -type f -print` 178dirs=`for file in $files; do dirname $file; done | sort -u` 179for dir in $dirs 180do 181 du $dir 182done > ../openssh.size 183 184# 185# Create postinstall script 186# 187cat <<EOF >>../openssh.post_i 188#!/bin/sh 189 190echo Creating configs from defaults if necessary. 191for cfgfile in ssh_config sshd_config ssh_prng_cmds 192do 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 200done 201echo 202 203# Create PrivSep user if PrivSep not disabled in config 204echo Creating PrivSep prereqs if required. 205if egrep '^[ \t]*UsePrivilegeSeparation[ \t]+no' $sysconfdir/sshd_config >/dev/null 206then 207 echo "UsePrivilegeSeparation disabled in config, not creating PrivSep user," 208 echo "group or chroot directory." 209else 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 ALL | cut -f1 -d: | egrep '^'$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 241fi 242echo 243 244# Generate keys unless they already exist 245echo Creating host keys if required. 246if [ -f "$sysconfdir/ssh_host_key" ] ; then 247 echo "$sysconfdir/ssh_host_key already exists, skipping." 248else 249 $bindir/ssh-keygen -t rsa1 -f $sysconfdir/ssh_host_key -N "" 250fi 251if [ -f $sysconfdir/ssh_host_dsa_key ] ; then 252 echo "$sysconfdir/ssh_host_dsa_key already exists, skipping." 253else 254 $bindir/ssh-keygen -t dsa -f $sysconfdir/ssh_host_dsa_key -N "" 255fi 256if [ -f $sysconfdir/ssh_host_rsa_key ] ; then 257 echo "$sysconfdir/ssh_host_rsa_key already exists, skipping." 258else 259 $bindir/ssh-keygen -t rsa -f $sysconfdir/ssh_host_rsa_key -N "" 260fi 261echo 262 263# Set startup command depending on SRC support 264if [ "$AIX_SRC" = "yes" ] 265then 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" 271else 272 startupcmd="$sbindir/sshd" 273 oldstartcmd="start $sbindir/sshd \\\"$src_running\\\"" 274fi 275 276# If migrating to or from SRC, change previous startup command 277# otherwise add to rc.tcpip 278if egrep "^\$oldstartcmd" /etc/rc.tcpip >/dev/null 279then 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 288else 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 299fi 300EOF 301 302# 303# Create liblpp.a and move control files into it 304# 305echo 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 334echo Creating lpp_name 335cat <<EOF >../lpp_name 3364 R I $PKGNAME { 337$PKGNAME $BFFVERSION 1 N U en_US OpenSSH $VERSION Portable for AIX 338[ 339% 340EOF 341 342for i in $bindir $sysconfdir $libexecdir $mandir/${mansubdir}1 $mandir/${mansubdir}8 $sbindir $datadir /usr/lpp/openssh 343do 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 350done 351 352echo '%' >>../lpp_name 353echo ']' >>../lpp_name 354echo '}' >>../lpp_name 355 356# 357# Move pieces into place 358# 359mkdir -p usr/lpp/openssh 360mv ../liblpp.a usr/lpp/openssh 361mv ../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# 368echo Creating $PKGNAME-$VERSION.bff with backup... 369rm -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# 378mv ../$PKGNAME-$VERSION.bff $startdir 379cd $startdir 380rm -rf $objdir/$PKGDIR 381 382echo $0: done. 383 384