summaryrefslogtreecommitdiffstats
path: root/contrib/solaris/build-pkg
blob: 76529ed48138f3b0a2cf5c017f2de0c466ef423e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#!/bin/sh

# OpenSSH solaris build script and supporting data files
# Copyright (c) 2000 Rip Loomis and
#   Science Applications International Corporation (SAIC)
#   (http://www.cist-east.saic.com).  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. The name of the author may not be used to endorse or promote products
#    derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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.

# Obviously, without all the hard work of the OpenBSD OpenSSH developers
# and the OpenSSH Portability Team, these scripts would be pointless...
# so thanks again folks!
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#### Known issues
# These methods are generally based on a "default" compilation of
# OpenSSH on Solaris--so the more things that you change from the default,
# the greater the chance that something in the script won't be able to
# handle the changes.  In general, though, most things should be determined
# from your compile environment--the architecture, SSH version, and
# other related data should all get picked up by this script.  The script
# and data files were last updated to match OpenSSH 2.1.1p4.
#
# All building and packaging is done under a temporary directory that is
# itself created under the contrib/solaris directory--so there shouldn't
# be any special security issues (or need for root access during the
# packaging process).  The temporary directory is defined below as
# ${BUILDDIR}.
#
# The permissions on the installed files are based on how we prefer to
# do things here--so nothing is installed SetUID to root.
#
# The post-install script makes a good-faith attempt to install a
# functional configuration on your system.  I would be interested in hearing
# of any failure modes that are found, as I tried to compensate for all
# the ones that showed up here when we started replacing all the
# different installed versions of SSH.

#### Body of the script (finally!)
# We expect to be building the solaris package under the contrib/solaris
# directory--but the build-package script might be run with a relative
# path by a user in the main SSH directory...so we try to handle this
# case.  Note that this is still a quick and dirty solution, not robust.

if [ -f sshd.c ]; then
   cd contrib/solaris >/dev/null
fi

# Locations of standard binaries
UNAME=/usr/bin/uname
SED=/usr/bin/sed
PWD=/usr/bin/pwd
CUT=/usr/bin/cut
STRIP=/usr/ccs/bin/strip
PKGMK=/usr/bin/pkgmk
PKGTRANS=/usr/bin/pkgtrans
GREP=/usr/bin/grep
DATE=/usr/bin/date

CURRDIR=`${PWD}`
BUILDDIR=${CURRDIR}/build-SSH-package
# If you really want to name the package "ssh" then go ahead, but the
# Sun convention is that the first 2-4 characters are supposed to be
# uppercase representing the company or organization that produced the
# software, and the next 3-5 characters are supposed to be lowercase
# identifying the specific software.  The best package names I could
# come up with were "OBSDssh" or "OPENssh", given those constraints.
PKGNAME="OPENssh"
# PSTAMP is a standard setting in the 'pkginfo' file that helps to identify
# the time and location that the packaging was done.
PSTAMP="`${UNAME} -n`-`${DATE} +%Y-%m-%d-%H%M`"
# The several lines below are designed to pull the relevant information
# out of the Makefile.  It may be simpler to hard-code this if you have
# made changes and these lines don't find them. 
prefix=`${GREP} "^prefix=" ../../Makefile | ${CUT} -d = -f 2`
execprefix=`${GREP} "^execprefix=" ../../Makefile | ${CUT} -d = -f 2`
INSTROOT=${prefix:=/usr/local}
ETCDIR=`${GREP} "^ETCDIR=" ../../Makefile | ${CUT} -d = -f 2`
PIDDIR=`${GREP} "^piddir=" ../../Makefile | ${CUT} -d = -f 2`

if [ ! -f ../../sshd ]; then
   echo "Unable to locate sshd binary where I expected, and can't continue."
   echo "Verify that the SSH configure/make has been completed, and that"
   echo "  this script is being run from within the SSH source tree."
   exit 1
fi


VERSION=`${GREP} "SSH_VERSION" ../../version.h | ${CUT} -f 2 | sed -e 's/"//g' -e 's/OpenSSH_//g'`
# Extra shenanigans to compensate for Sun marketeer tricks with Solaris
# version numbering...
OSMINOR=`${UNAME} -r | ${CUT} -f 2 -d .`
if [ $OSMINOR -gt 6 ]; then
    OSVERSION=$OSMINOR
else
    OSVERSION=`${UNAME} -r | ${SED} 's/5/2/'`
fi
ARCH=`$UNAME -p`
SHORTINSTROOT=""
if [ "$INSTROOT" = "/usr/local" ]; then
  SHORTINSTROOT="-local"
else
  if [ "$INSTROOT" = "/opt" ]; then
    SHORTINSTROOT="-opt"
  fi
fi

DESTFILE="${PKGNAME}-${VERSION}-sol${OSVERSION}-${ARCH}${SHORTINSTROOT}"

echo "Building Solaris package of OpenSSH ${VERSION} in\n\t${BUILDDIR}."
echo "Binaries were compiled for Solaris ${OSVERSION} (${ARCH})"
echo "The installable package will be named ${DESTFILE}."
echo "When installed, the package will be located under ${INSTROOT}."
echo ""

echo "Cleaning up old build files..."
rm -rf $BUILDDIR
mkdir $BUILDDIR
cd $BUILDDIR

echo "Setting up build directories..."
mkdir -p ${BUILDDIR}/man/man1
# Need manpages for sshd_config(5) and ssh_config(5), but we don't yet have.
#mkdir -p ${BUILDDIR}/man/man5
mkdir -p ${BUILDDIR}/man/man8
mkdir -p ${BUILDDIR}/etc
mkdir -p ${BUILDDIR}/bin
mkdir -p ${BUILDDIR}/sbin

echo "Populating build directories..."
cp -p ../../../sshd sbin
cp -p ../../../ssh-keygen bin
cp -p ../../../ssh bin
cp -p ../../../ssh-add bin
cp -p ../../../ssh-agent bin
cp -p ../../../scp bin
cp -p ../../../scp.1 man/man1/scp.1
cp -p ../../../ssh-add.1 man/man1/ssh-add.1
cp -p ../../../ssh-agent.1 man/man1/ssh-agent.1
cp -p ../../../ssh-keygen.1 man/man1/ssh-keygen.1
cp -p ../../../ssh.1 man/man1/ssh.1
cp -p ../../../sshd.8 man/man8/sshd.8
cp -p ../../../sshd_config.out etc/sshd_config.default 
cp -p ../../../ssh_config.out etc/ssh_config.default
cp -p ../../../ssh_prng_cmds etc/ssh_prng_cmds.default
cp -p ../../../primes etc/primes.default

# One of the annoying things about the Solaris packaging process is that
# there's no simple way to prototype on the fly--so make sure you edit
# the prototype file if you add/subtract files from the mix.
cp -p ../prototype .
cp -p ../preremove .

echo "Creating compile-dependent files from their prototypes"
$SED -e "s/%%PKGNAME%%/${PKGNAME}/g" -e "s|%%BASEDIR%%|${INSTROOT}|g" -e "s/%%VERSION%%/${VERSION}/g" -e "s/%%ARCH%%/${ARCH}/g" -e "s/%%OSVERSION%%/${OSVERSION}/g" <../pkginfo.in >./pkginfo
$SED -e "s/%%PKGNAME%%/${PKGNAME}/g" -e "s/%%OSMINOR%%/${OSMINOR}/g" -e "s/%%OSVERSION%%/${OSVERSION}/g" <../checkinstall.in >./checkinstall
$SED -e "s|%%PIDDIR%%|${PIDDIR}|g" <../postinstall.in >./postinstall
$SED -e "s|%%PIDDIR%%|${PIDDIR}|g" <../sshd-initscript.in > etc/sshd-initscript

echo "Stripping binaries"
${STRIP} bin/ssh
${STRIP} bin/ssh-add
${STRIP} bin/ssh-agent
${STRIP} bin/ssh-keygen
${STRIP} sbin/sshd
${STRIP} bin/scp

echo ""
echo "Building Package"

cd ${BUILDDIR}
$PKGMK -o -r . -p ${PSTAMP} -d ${BUILDDIR}

if [ $? -gt 0 ]; then
   echo "Error performing pkgmk--cannot continue."
   exit 1
fi

echo ""
echo "Translating Package Tree into Installable Image"
$PKGTRANS -s ${BUILDDIR} ${BUILDDIR}/${DESTFILE} OPENssh

if [ $? -gt 0 ]; then
   echo "Error performing pkgtrans--cannot continue."
   exit 1
fi

echo "Done.  Package is in ${BUILDDIR}/${DESTFILE} !"