#
# Makefile for building a Solaris package of OpenSSH 
#   $Id: openssh.Makefile,v 1.11 2002/06/28 15:20:37 dgregor Exp $
# 
# Copyright (c) 1998-2002 Daniel J. Gregor, Jr., All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
#    must display the following acknowledgement:
# 	This product includes software developed by Daniel J. Gregor, Jr.
# 4. The name of Daniel J. Gregor, Jr. may not be used to endorse or promote
#    products derived from this software without specific prior written
#    permission.
# 
# THIS SOFTWARE IS PROVIDED BY DANIEL J. GREGOR, JR. ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL DANIEL J. GREGOR, JR. BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
#
# The homepage for OpenSSH is at
#   http://www.openssh.com/
#

TOPDIR:sh   = pwd

BUILDDIR    = openssh-3.4p1
BUILDREV:sh = echo '$$Revision: 1.11 $$' | sed 's/.*\.//;s/ .*//'

PKGNAME     = openssh
DESTDIR     = ${TOPDIR}/pkg 

BASEDIR     = /opt/${PKGNAME}
ETCDIR      = /etc/opt/${PKGNAME}
BASEDIREXISTS = /opt /etc/opt /etc/init.d /etc/rc0.d /etc/rc1.d /etc/rc2.d \
		/etc/rc3.d

CONFOPTS    = 

OPENSSL_DIR = /opt/OpenSSL
ZLIB_DIR    = /usr/lib

#OPENSSL_DIR = ${TOPDIR}/../openssl/openssl-0.9.6b
#ZLIB_DIR    = ${TOPDIR}/../zlib/zlib-1.1.3

PIDDIR       = /var/run
PRNGD_SOCKET = /var/opt/LJprngd/prngd-socket

PRIVSEP_USER = sshd
PRIVSEP_PATH = ${BASEDIR}/empty
PRIVSEP_UID  = 27
PRIVSEP_GID  = 27

NAME        = openssh
DESC        = OpenSSH - an encrypted remote login and file transfer application
ARCH:sh     = uname -p
FULLVER     = echo ${BUILDDIR} | sed 's/.*-//'
CATEGORY    = application
VENDOR      = OpenBSD
EMAIL       = dj@gregor.com
CLASSES     = none
PSTAMP:sh   = date "+`hostname`%Y%m%d%H%M%S"

CONFIGFILES = ssh_config sshd_config # ssh_prng_cmds 
INITSCRIPT  = ssh
INITLINKS   = ${DESTDIR}/etc/rc2.d/S82${INITSCRIPT} \
		${DESTDIR}/etc/rc0.d/K10${INITSCRIPT} \
		${DESTDIR}/etc/rc1.d/K10${INITSCRIPT}

PKGPROTO    = /usr/bin/pkgproto
PKGMK       = /usr/bin/pkgmk
PKGTRANS    = /usr/bin/pkgtrans

INSTUSER    = root
INSTGROUP   = root
INSTALLFILES= install/pkginfo \
		install/depend \
		install/postinstall \
		install/postremove \
		install/preremove # XXX need to add: install/copyright

SPOOLDIR    = /var/spool/pkg

all: pkg

build: .configured.${BUILDDIR}
	cd ${BUILDDIR} ; ${MAKE}

clean:
	cd ${BUILDDIR} ; ${MAKE} clean

install:
	cd ${BUILDDIR} ; ${MAKE} install

pkg:	${BUILDDIR}-${BUILDREV}.pkg

${DESTDIR}:
	mkdir ${DESTDIR}
	mkdir -p ${DESTDIR}/${BASEDIR}
	mkdir -p ${DESTDIR}/${ETCDIR}

.untarred.${BUILDDIR}: ${BUILDDIR}.tar.gz 
	gzip -cd ${BUILDDIR}.tar.gz | tar xvf -
	touch $@

clean.${DESTDIR}:
	rm -rf ${DESTDIR}

install-pkg:  build clean.${DESTDIR} ${DESTDIR}
	cd ${BUILDDIR} ; ${MAKE} DESTDIR=${DESTDIR} \
		INSTALL=/usr/ucb/install install-nokeys
	-strip ${DESTDIR}${BASEDIR}/bin/*
	-strip ${DESTDIR}${BASEDIR}/sbin/*
	for a in ${CONFIGFILES}; do \
		mv ${DESTDIR}${ETCDIR}/$$a ${DESTDIR}${ETCDIR}/$$a.default; \
	done

.patched.${BUILDDIR}: .untarred.${BUILDDIR}
	${APPLYPATCHES}
	touch $@

.configured.${BUILDDIR}: .patched.${BUILDDIR}
	${MAKE} configure
	touch $@

configure:
	cd ${BUILDDIR} ; ./configure \
		--prefix=${BASEDIR} \
		--libexecdir=${BASEDIR}/sbin \
		--sysconfdir=${ETCDIR} \
		--with-pam \
		--with-ssl-dir=${OPENSSL_DIR} \
		--with-zlib=${ZLIB_DIR} \
		--with-prngd-socket=${PRNGD_SOCKET} \
		--with-pid-dir=${PIDDIR} \
		--with-privsep-user=${PRIVSEP_USER} \
		--with-privsep-path=${PRIVSEP_PATH} \
		${CONFOPTS}

veryclean:
	rm -rf ${BUILDDIR} ${DESTDIR} .configured.${BUILDDIR} \
		.untarred.${BUILDDIR} .patched.${BUILDDIR}

${BUILDDIR}-${BUILDREV}.pkg: ${DESTDIR}/prototype
	( cd ${DESTDIR} ; ${PKGMK} -d ${SPOOLDIR} -or . )
	( cd ${SPOOLDIR}/${PKGNAME}/reloc ; find . -depth -print | \
		grep -v '^\.$$' | cpio -odm | compress > ../reloc.cpio.Z )
	rm -rf ${SPOOLDIR}/${PKGNAME}/reloc
	$(PKGTRANS) ${SPOOLDIR} ${TOPDIR}/$@ ${PKGNAME}

${DESTDIR}/prototype: install-pkg ${DESTDIR}/install/pkginfo \
		${DESTDIR}/install/depend \
		${DESTDIR}/install/postinstall \
		${DESTDIR}/install/postremove \
		${DESTDIR}/install/preremove \
		${DESTDIR}/etc/init.d/${INITSCRIPT} \
		${INITLINKS}
	( cd ${DESTDIR} ; \
	 find . -print | \
		$(PKGPROTO) | \
		nawk -v instuser="${INSTUSER}" \
		     -v instgroup="${INSTGROUP}" \
		     -v basedirexists="${BASEDIREXISTS}" \
		'BEGIN { \
			b = split(basedirexists, basedirs); \
		} \
		{ \
			if ( match($$3, "^prototype$$") ) { \
				next; \
 			} \
			if ( match($$3, "^install$$") ) { \
				next; \
 			} \
			if ( match($$3, "^install/") ) { \
			 	base = $$3; \
			 	sub("^.*/", "", base); \
			 	print "i", base "=" $$3; \
				next; \
 			} \
			for ( i = 1; i <= b; i++ ) { \
				checkbasedir = basedirs[i]; \
				sub("^/", "", checkbasedir); \
				while ( checkbasedir != "" ) { \
					if ( match($$3, "^"checkbasedir"$$") ) { \
						sub("[^/]*$$", "", checkbasedir); \
						sub("/$$", "", checkbasedir); \
						print $$1, $$2, $$3, "?", "?", "?"; \
						next; \
	 				} \
					sub("[^/]*$$", "", checkbasedir); \
					sub("/$$", "", checkbasedir); \
				} \
			} \
			\
			print $$1, $$2, $$3, $$4, instuser, instgroup; \
		}' \
	 ) > $@


${DESTDIR}/install/pkginfo:	${DESTDIR}/install
	rm -f $@
	@echo "PKG=\"${PKGNAME}\"" >> $@
	@echo "NAME=\"${NAME}\"" >> $@
	@echo "ARCH=\"${ARCH}\"" >> $@
	@echo "VERSION=\"${FULLVER:sh},REV=${BUILDREV}\" (`uname -s`-`uname -r`)" >> $@
	@echo "CATEGORY=\"${CATEGORY}\"" >> $@
	@echo "VENDOR=\"${VENDOR}\"" >> $@
	@echo "EMAIL=\"${EMAIL}\"" >> $@
	@echo "BASEDIR=\"/\"" >> $@
	@echo "CLASSES=\"${CLASSES}\"" >> $@
	@echo "PSTAMP=\"${PSTAMP}\"" >> $@

${DESTDIR}/install/depend:	${DESTDIR}/install
	rm -f $@
	@echo "P   LJprngd   Lutz Jaenicke's Random Number Generator" >> $@

${DESTDIR}/install/postinstall: ${DESTDIR}/install
	rm -f $@
	@echo "#!/bin/sh" >> $@
	@echo "" >> $@
	@echo "basedir=${BASEDIR}" >> $@
	@echo "etcdir=${ETCDIR}" >> $@
	@echo "" >> $@
	@echo "for a in ${CONFIGFILES}; do" >> $@
	@echo '	test -f $${PKG_INSTALL_ROOT}$${etcdir}/$$a || \' >> $@
	@echo '		cp $${PKG_INSTALL_ROOT}$${etcdir}/$$a.default \' >> $@
	@echo '			$${etcdir}/$$a' >> $@
	@echo "done" >> $@
	@echo "" >> $@
	@echo "if [ \"x\$${PKG_INSTALL_ROOT}\" = \"x\" ]" >> $@
	@echo "then" >> $@
	@echo "	getent group ${PRIVSEP_USER} > /dev/null || \\" >> $@
	@echo "		groupadd -g ${PRIVSEP_GID} ${PRIVSEP_USER} || \\" >> $@
	@echo "		groupadd ${PRIVSEP_USER}" >> $@
	@echo "" >> $@
	@echo "	getent passwd ${PRIVSEP_USER} > /dev/null || \\" >> $@
	@echo "		useradd -c 'sshd privsep' -d '${PRIVSEP_PATH}' \\" >> $@
	@echo "			-g '${PRIVSEP_USER}' -u ${PRIVSEP_UID} \\" >> $@
	@echo "			${PRIVSEP_USER} || \\" >> $@
	@echo "		useradd -c 'sshd privsep' -d '${PRIVSEP_PATH}' \\" >> $@
	@echo "			-g '${PRIVSEP_USER}' \\" >> $@
	@echo "			${PRIVSEP_USER}" >> $@
	@echo "else" >> $@
	@echo "	echo \"You will need to create a ${PRIVSEP_USER} group\"" >> $@
	@echo "	echo \"and create a ${PRIVSEP_USER} user that is a member\"" >> $@
	@echo "	echo \"of the ${PRIVSEP_USER} group.\"" >> $@
	@echo "fi" >> $@
	@echo "" >> $@
	@echo 'test -f $${PKG_INSTALL_ROOT}$${etcdir}/ssh_host_key || \' >> $@
	@echo '	$${PKG_INSTALL_ROOT}$${basedir}/bin/ssh-keygen -t rsa1 \' >> $@
	@echo '		-f $${PKG_INSTALL_ROOT}$${etcdir}/ssh_host_key \' >> $@
	@echo '		-N ""' >> $@
	@echo 'test -f $${PKG_INSTALL_ROOT}$${etcdir}/ssh_host_dsa_key || \' >> $@
	@echo '	$${PKG_INSTALL_ROOT}$${basedir}/bin/ssh-keygen -t dsa \' >> $@
	@echo '		-f $${PKG_INSTALL_ROOT}$${etcdir}/ssh_host_dsa_key \' >> $@
	@echo '		-N ""' >> $@
	@echo 'test -f $${PKG_INSTALL_ROOT}$${etcdir}/ssh_host_rsa_key || \' >> $@
	@echo '	$${PKG_INSTALL_ROOT}$${basedir}/bin/ssh-keygen -t rsa \' >> $@
	@echo '		-f $${PKG_INSTALL_ROOT}$${etcdir}/ssh_host_rsa_key \' >> $@
	@echo '		-N ""' >> $@
	@echo "" >> $@
	@echo "if [ \"x\$${PKG_INSTALL_ROOT}\" = \"x\" ]" >> $@
	@echo "then" >> $@
	@echo "	/etc/init.d/${INITSCRIPT} start" >> $@
	@echo "else" >> $@
	@echo "	echo \"SSH will start next time you reboot the machine\"" >> $@
	@echo "fi" >> $@
	chmod 755 $@

${DESTDIR}/install/preremove: ${DESTDIR}/install
	rm -f $@
	@echo "#!/bin/sh" >> $@
	@echo "" >> $@
	@echo "etcdir=${ETCDIR}" >> $@
	@echo "" >> $@
	@echo "if [ \"x\$${PKG_INSTALL_ROOT}\" = \"x\" ]" >> $@
	@echo "then" >> $@
	@echo "	/etc/init.d/${INITSCRIPT} stop" >> $@
	@echo "fi" >> $@
	@echo "" >> $@
	@echo "for a in ${CONFIGFILES}; do" >> $@
	@echo '	if test -f $${PKG_INSTALL_ROOT}$${etcdir}/$$a && \' >> $@
	@echo '	    cmp -s $${PKG_INSTALL_ROOT}$${etcdir}/$$a \' >> $@
	@echo '	    $${PKG_INSTALL_ROOT}$${etcdir}/$$a.default' >> $@
	@echo "	then" >> $@
	@echo '		rm $${PKG_INSTALL_ROOT}$${etcdir}/$$a' >> $@
	@echo "	fi" >> $@
	@echo "done" >> $@
	chmod 755 $@

${DESTDIR}/install/postremove: ${DESTDIR}/install
	rm -f $@
	@echo "echo \"Run \\\"rm -rf \$${PKG_INSTALL_ROOT}${ETCDIR}\\\" to remove ${NAME} configuration files\"" >> $@
	@echo "echo \"and \\\"userdel ${PRIVSEP_USER} ; groupdel ${PRIVSEP_USER}\\\" to remove the privsep user and group\"" >> $@
	chmod 755 $@

${DESTDIR}/etc/init.d: ${DESTDIR}
	mkdir -p $@

${DESTDIR}/etc/init.d/${INITSCRIPT}: ${DESTDIR}/etc/init.d
	rm -f $@
	@echo "#!/bin/sh" >> $@
	@echo "" >> $@
	@echo "PATH=/sbin:/usr/bin:/usr/sbin" >> $@
	@echo "export PATH" >> $@
	@echo "" >> $@
	@echo "SSHD=${BASEDIR}/sbin/sshd" >> $@
	@echo "PIDFILE=${PIDDIR}/sshd.pid" >> $@
	@echo "" >> $@
	@echo 'case "$$1" in' >> $@
	@echo "	'start')" >> $@
	@echo "		# Start sshd" >> $@
	@echo '		$${SSHD}' >> $@
	@echo '		if [ $$? -ne 0 ]; then' >> $@
	@echo "			echo \"error starting sshd\" >&2" >> $@
	@echo "			exit 1" >> $@
	@echo "		fi" >> $@
	@echo "       	;; " >> $@
	@echo "" >> $@
	@echo "	'stop')" >> $@
	@echo "	       	# Stop sshd" >> $@
	@echo '		if [ -f  $$PIDFILE ]; then' >> $@
	@echo '		        if ps -p `cat $$PIDFILE` > /dev/null 2>&1; then' >> $@
	@echo '		               kill `cat $$PIDFILE`' >> $@
	@echo "			fi" >> $@
	@echo "		fi" >> $@
	@echo "		;; " >> $@
	@echo "" >> $@
	@echo "" >> $@
	@echo "	*)	# usage" >> $@
	@echo '		echo "usage: $$0 start|stop" >&2' >> $@
	@echo "		exit 1" >> $@
	@echo "	;;" >> $@
	@echo "" >> $@
	@echo "esac  " >> $@
	chmod 755 $@

${INITLINKS}: ${DESTDIR}/etc/init.d/${INITSCRIPT}
	mkdir `echo "$@" | sed 's/\\/[^\\/]*$$//'`
	ln $? $@

${DESTDIR}/install: ${DESTDIR}
	mkdir -p $@
