From 29bdd2c9bca2737e7a246ed50fd827a6ccba0c61 Mon Sep 17 00:00:00 2001 From: Tim Rice Date: Mon, 11 Mar 2002 20:55:53 -0800 Subject: [contrib/solaris/buildpkg.sh, contrib/solaris/README] Updated to build on all platforms that support SVR4 style package tools. Now runs from build dir. Parts are based on patches from Antonio Navarro, and Darren Tucker. --- contrib/solaris/README | 12 +- contrib/solaris/buildpkg.sh | 287 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 255 insertions(+), 44 deletions(-) (limited to 'contrib') diff --git a/contrib/solaris/README b/contrib/solaris/README index 55852499..9b0a46e2 100644 --- a/contrib/solaris/README +++ b/contrib/solaris/README @@ -1,6 +1,7 @@ The following is a new package build script for Solaris. This is being introduced into OpenSSH 3.0 and above in hopes of simplifying the build -process. +process. As of 3.1p2 the script should work on all platforms that have +SVR4 style package tools. The build process is called a 'dummy install'.. Which means the software does a "make install-nokeys DESTDIR=[fakeroot]". This way all manpages should @@ -11,7 +12,8 @@ Directions: 1. make -F Makefile.in distprep (Only if you are getting from the CVS tree) 2. ./configure --with-pam [..any other options you want..] -3. cd contrib/solaris; ./buildpkg.sh +3. look at the top of contrib/solaris/buildpkg.sh for the configurable options. +4. ./contrib/solaris/buildpkg.sh If all goes well you should have a solaris package ready to be installed. @@ -20,9 +22,3 @@ openssh-unix-dev@mindrot.org and I will try to assist you as best as I can. - Ben Lindstrom -TODO: -- Expand to cover all sysvr4 family of OSes -- Clean things up a bit more. -- Detect if sshd is running and refuse to start. -- SHOULD check for existing sshd_config nor ssh_config (does not currently). - [Post install script? Ugh.. Nasty] diff --git a/contrib/solaris/buildpkg.sh b/contrib/solaris/buildpkg.sh index 05abb223..20f8544a 100755 --- a/contrib/solaris/buildpkg.sh +++ b/contrib/solaris/buildpkg.sh @@ -1,52 +1,139 @@ #!/bin/sh # -# Fake Root Solaris Build System - Prototype +# Fake Root Solaris/SVR4/SVR5 Build System - Prototype # # The following code has been provide under Public Domain License. I really # don't care what you use it for. Just as long as you don't complain to me # nor my employer if you break it. - Ben Lindstrom (mouring@eviladmin.org) # umask 022 +# +# Options for building the package +# You can create a config.local with your customized options +# +# uncommenting TEST_DIR and using configure--prefix=/var/tmp and +# PKGNAME=tOpenSSH should allow testing a package without interfering +# with a real OpenSSH package on a system. +#TEST_DIR=/var/tmp # leave commented out for production build PKGNAME=OpenSSH +SYSVINIT_NAME=opensshd +MAKE=${MAKE:="make"} +# uncomment these next two as needed +#PERMIT_ROOT_LOGIN=no +#X11_FORWARDING=yes +# list of system directories we do NOT want to change owner/group/perms +# when installing our package +SYSTEM_DIR="/etc \ +/etc/init.d \ +/etc/rcS.d \ +/etc/rc0.d \ +/etc/rc1.d \ +/etc/rc2.d \ +/opt \ +/opt/bin \ +/usr \ +/usr/bin \ +/usr/lib \ +/usr/sbin \ +/usr/share \ +/usr/share/man \ +/usr/share/man/man1 \ +/usr/share/man/man8 \ +/usr/local \ +/usr/local/bin \ +/usr/local/etc \ +/usr/local/libexec \ +/usr/local/man \ +/usr/local/man/man1 \ +/usr/local/man/man8 \ +/usr/local/sbin \ +/usr/local/share \ +/var \ +/var/run \ +/var/tmp \ +/tmp" -## Extract common info requires for the 'info' part of the package. -VERSION=`tail -1 ../../version.h | sed -e 's/.*_\([0-9]\)/\1/g' | sed 's/\"$//'` -ARCH=`uname -p` +# We may need to buiild as root so we make sure PATH is set up +# only set the path if it's not set already +[ -d /usr/local/bin ] && { + echo $PATH | grep ":/usr/local/bin" > /dev/null 2>&1 + [ $? -ne 0 ] && PATH=$PATH:/usr/local/bin +} +[ -d /usr/ccs/bin ] && { + echo $PATH | grep ":/usr/ccs/bin" > /dev/null 2>&1 + [ $? -ne 0 ] && PATH=$PATH:/usr/ccs/bin +} +export PATH +# + +[ -f Makefile ] || { + echo "Please run this script from your build directory" + exit 1 +} + +# we will look for config.local to override the above options +[ -s ./config.local ] && . ./config.local ## Start by faking root install echo "Faking root install..." START=`pwd` +OPENSSHD_IN=`dirname $0`/opensshd.in FAKE_ROOT=$START/package +[ -d $FAKE_ROOT ] && rm -fr $FAKE_ROOT mkdir $FAKE_ROOT -cd ../.. -make install-nokeys DESTDIR=$FAKE_ROOT +${MAKE} install-nokeys DESTDIR=$FAKE_ROOT +if [ $? -gt 0 ] +then + echo "Fake root install failed, stopping." + exit 1 +fi ## Fill in some details, like prefix and sysconfdir -ETCDIR=`grep "^sysconfdir=" Makefile | sed 's/sysconfdir=//'` -PREFIX=`grep "^prefix=" Makefile | cut -d = -f 2` -PIDDIR=`grep "^piddir=" Makefile | cut -d = -f 2` -cd $FAKE_ROOT +for confvar in prefix exec_prefix bindir sbindir libexecdir datadir mandir sysconfdir piddir +do + eval $confvar=`grep "^$confvar=" Makefile | cut -d = -f 2` +done -## Setup our run level stuff while we are at it. -mkdir -p $FAKE_ROOT/etc/init.d -mkdir -p $FAKE_ROOT/etc/rcS.d -mkdir -p $FAKE_ROOT/etc/rc0.d -mkdir -p $FAKE_ROOT/etc/rc1.d -mkdir -p $FAKE_ROOT/etc/rc2.d +## Extract common info requires for the 'info' part of the package. +VERSION=`./ssh -V 2>&1 | sed -e 's/,.*//'` +UNAME_S=`uname -s` +case ${UNAME_S} in + SunOS) UNAME_S=Solaris + ARCH=`uname -p` + RCS_D=yes + DEF_MSG="(default: n)" + ;; + *) ARCH=`uname -m` ;; +esac + +## Setup our run level stuff while we are at it. +mkdir -p $FAKE_ROOT${TEST_DIR}/etc/init.d ## setup our initscript correctly -sed -e "s#%%configDir%%#$ETCDIR#g" \ - -e "s#%%openSSHDir%%#$PREFIX#g" \ - -e "s#%%pidDir%%#$PIDDIR#g" \ - ../opensshd.in > $FAKE_ROOT/etc/init.d/opensshd -chmod 711 $FAKE_ROOT/etc/init.d/opensshd +sed -e "s#%%configDir%%#${sysconfdir}#g" \ + -e "s#%%openSSHDir%%#$prefix#g" \ + -e "s#%%pidDir%%#${piddir}#g" \ + ${OPENSSHD_IN} > $FAKE_ROOT${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} +chmod 744 $FAKE_ROOT${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} -ln -s ../init.d/opensshd $FAKE_ROOT/etc/rcS.d/K30opensshd -ln -s ../init.d/opensshd $FAKE_ROOT/etc/rc0.d/K30opensshd -ln -s ../init.d/opensshd $FAKE_ROOT/etc/rc1.d/K30opensshd -ln -s ../init.d/opensshd $FAKE_ROOT/etc/rc2.d/S98opensshd +[ "${PERMIT_ROOT_LOGIN}" = no ] && \ + perl -p -i -e "s/#PermitRootLogin yes/PermitRootLogin no/" \ + $FAKE_ROOT/${sysconfdir}/sshd_config +[ "${X11_FORWARDING}" = yes ] && \ + perl -p -i -e "s/#X11Forwarding no/X11Forwarding yes/" \ + $FAKE_ROOT/${sysconfdir}/sshd_config +# fix PrintMotd +perl -p -i -e "s/#PrintMotd yes/PrintMotd no/" \ + $FAKE_ROOT/${sysconfdir}/sshd_config +# We don't want to overwrite config files on multiple installs +mv $FAKE_ROOT/${sysconfdir}/ssh_config $FAKE_ROOT/${sysconfdir}/ssh_config.default +mv $FAKE_ROOT/${sysconfdir}/sshd_config $FAKE_ROOT/${sysconfdir}/sshd_config.default +[ -f $FAKE_ROOT/${sysconfdir}/ssh_prng_cmds ] && \ +mv $FAKE_ROOT/${sysconfdir}/ssh_prng_cmds $FAKE_ROOT/${sysconfdir}/ssh_prng_cmds.default + +cd $FAKE_ROOT ## Ok, this is outright wrong, but it will work. I'm tired of pkgmk ## whining. @@ -58,28 +145,156 @@ done echo "Building pkginfo file..." cat > pkginfo << _EOF PKG=$PKGNAME -NAME=OpenSSH Portable for Solaris +NAME="OpenSSH Portable for ${UNAME_S}" DESC="Secure Shell remote access utility; replaces telnet and rlogin/rsh." VENDOR="OpenSSH Portable Team - http://www.openssh.com/portable.html" -BASEDIR=$FAKE_ROOT ARCH=$ARCH VERSION=$VERSION -CATEGORY=Security +CATEGORY="Security,application" BASEDIR=/ +CLASSES="none" +_EOF + +## Build preinstall file +echo "Building preinstall file..." +cat > preinstall << _EOF +#! /sbin/sh +# +[ "\${PRE_INS_STOP}" = "yes" ] && ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} stop +exit 0 +_EOF + +## Build postinstall file +echo "Building postinstall file..." +cat > postinstall << _EOF +#! /sbin/sh +# +[ -f ${sysconfdir}/ssh_config ] || \\ + cp -p ${sysconfdir}/ssh_config.default ${sysconfdir}/ssh_config +[ -f ${sysconfdir}/sshd_config ] || \\ + cp -p ${sysconfdir}/sshd_config.default ${sysconfdir}/sshd_config +[ -f ${sysconfdir}/ssh_prng_cmds.default ] && { + [ -f ${sysconfdir}/ssh_prng_cmds ] || \\ + cp -p ${sysconfdir}/ssh_prng_cmds.default ${sysconfdir}/ssh_prng_cmds +} + +# make rc?.d dirs only if we are doing a test install +[ -n "${TEST_DIR}" ] && { + [ "$RCS_D" = yes ] && mkdir -p ${TEST_DIR}/etc/rcS.d + mkdir -p ${TEST_DIR}/etc/rc0.d + mkdir -p ${TEST_DIR}/etc/rc1.d + mkdir -p ${TEST_DIR}/etc/rc2.d +} + +if [ "\${USE_SYM_LINKS}" = yes ] +then + [ "$RCS_D" = yes ] && \ +installf ${PKGNAME} $TEST_DIR/etc/rcS.d/K30${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s + installf ${PKGNAME} $TEST_DIR/etc/rc0.d/K30${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s + installf ${PKGNAME} $TEST_DIR/etc/rc1.d/K30${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s + installf ${PKGNAME} $TEST_DIR/etc/rc2.d/S98${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s +else + [ "$RCS_D" = yes ] && \ +installf ${PKGNAME} $TEST_DIR/etc/rcS.d/K30${SYSVINIT_NAME}=$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l + installf ${PKGNAME} $TEST_DIR/etc/rc0.d/K30${SYSVINIT_NAME}=$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l + installf ${PKGNAME} $TEST_DIR/etc/rc1.d/K30${SYSVINIT_NAME}=$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l + installf ${PKGNAME} $TEST_DIR/etc/rc2.d/S98${SYSVINIT_NAME}=$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l +fi + +installf -f ${PKGNAME} + +[ "\${POST_INS_START}" = "yes" ] && ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} start +exit 0 _EOF +## Build preremove file +echo "Building preremove file..." +cat > preremove << _EOF +#! /sbin/sh +# +${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} stop +exit 0 +_EOF + +## Build request file +echo "Building request file..." +cat > request << _EOF +trap 'exit 3' 15 +USE_SYM_LINKS=no +PRE_INS_STOP=no +POST_INS_START=no +# Use symbolic links? +ans=\`ckyorn -d n \ +-p "Do you want symbolic links for the start/stop scripts? ${DEF_MSG}"\` || exit \$? +case \$ans in + [y,Y]*) USE_SYM_LINKS=yes ;; +esac + +# determine if should restart the daemon +if [ -s ${piddir}/sshd.pid -a -f ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} ] +then + ans=\`ckyorn -d n \ +-p "Should the running sshd daemon be restarted? ${DEF_MSG}"\` || exit \$? + case \$ans in + [y,Y]*) PRE_INS_STOP=yes + POST_INS_START=yes + ;; + esac + +else + +# determine if we should start sshd + ans=\`ckyorn -d n \ +-p "Start the sshd daemon after installing this package? ${DEF_MSG}"\` || exit \$? + case \$ans in + [y,Y]*) POST_INS_START=yes ;; + esac +fi + +# make parameters available to installation service, +# and so to any other packaging scripts +cat >\$1 < space << _EOF +# extra space required by start/stop links added by installf in postinstall +$TEST_DIR/etc/rc0.d/K30${SYSVINIT_NAME} 0 1 +$TEST_DIR/etc/rc1.d/K30${SYSVINIT_NAME} 0 1 +$TEST_DIR/etc/rc2.d/S98${SYSVINIT_NAME} 0 1 +_EOF +[ "$RCS_D" = yes ] && \ +echo "$TEST_DIR/etc/rcS.d/K30${SYSVINIT_NAME} 0 1" >> space + ## Next Build our prototype echo "Building prototype file..." -find . | egrep -v "prototype|pkginfo" | sort | pkgproto $PROTO_ARGS | \ - awk ' - BEGIN { print "i pkginfo" } - { $5="root"; $6="sys"; } - { print; }' > prototype +cat >mk-proto.awk << _EOF + BEGIN { print "i pkginfo"; print "i preinstall"; \\ + print "i postinstall"; print "i preremove"; \\ + print "i request"; print "i space"; \\ + split("$SYSTEM_DIR",sys_files); } + { + for (dir in sys_files) { if ( \$3 != sys_files[dir] ) + { \$5="root"; \$6="sys"; } + else + { \$4="?"; \$5="?"; \$6="?"; break;} + } } + { print; } +_EOF +find . | egrep -v "prototype|pkginfo|mk-proto.awk" | sort | \ + pkgproto $PROTO_ARGS | nawk -f mk-proto.awk > prototype ## Step back a directory and now build the package. echo "Building package.." cd .. -pkgmk -d . -f $FAKE_ROOT/prototype -o +pkgmk -d ${FAKE_ROOT} -f $FAKE_ROOT/prototype -o +echo | pkgtrans -os ${FAKE_ROOT} ${START}/$PKGNAME-$UNAME_S-$ARCH-$VERSION.pkg rm -rf $FAKE_ROOT -echo | pkgtrans -os . $PKGNAME-$ARCH-$VERSION.pkg -rm -rf $PKGNAME + -- cgit v1.2.3