]> andersk Git - gssapi-openssh.git/blame - openssh/contrib/solaris/buildpkg.sh
merged OPENSSH_3_8P1_GSSAPI_20040304 to gpt-branch
[gssapi-openssh.git] / openssh / contrib / solaris / buildpkg.sh
CommitLineData
3c0ef626 1#!/bin/sh
2#
2980ea68 3# Fake Root Solaris/SVR4/SVR5 Build System - Prototype
3c0ef626 4#
5# The following code has been provide under Public Domain License. I really
6# don't care what you use it for. Just as long as you don't complain to me
7# nor my employer if you break it. - Ben Lindstrom (mouring@eviladmin.org)
416fd2a8 8#
3c0ef626 9umask 022
2980ea68 10#
11# Options for building the package
12# You can create a config.local with your customized options
13#
e54b3d7c 14# uncommenting TEST_DIR and using
15# configure --prefix=/var/tmp --with-privsep-path=/var/tmp/empty
416fd2a8 16# and
2980ea68 17# PKGNAME=tOpenSSH should allow testing a package without interfering
e54b3d7c 18# with a real OpenSSH package on a system. This is not needed on systems
19# that support the -R option to pkgadd.
2980ea68 20#TEST_DIR=/var/tmp # leave commented out for production build
3c0ef626 21PKGNAME=OpenSSH
2980ea68 22SYSVINIT_NAME=opensshd
23MAKE=${MAKE:="make"}
e54b3d7c 24SSHDUID=67 # Default privsep uid
25SSHDGID=67 # Default privsep gid
416fd2a8 26# uncomment these next three as needed
2980ea68 27#PERMIT_ROOT_LOGIN=no
28#X11_FORWARDING=yes
416fd2a8 29#USR_LOCAL_IS_SYMLINK=yes
2980ea68 30# list of system directories we do NOT want to change owner/group/perms
31# when installing our package
32SYSTEM_DIR="/etc \
33/etc/init.d \
34/etc/rcS.d \
35/etc/rc0.d \
36/etc/rc1.d \
37/etc/rc2.d \
38/etc/opt \
39/opt \
40/opt/bin \
41/usr \
42/usr/bin \
43/usr/lib \
44/usr/sbin \
45/usr/share \
46/usr/share/man \
47/usr/share/man/man1 \
48/usr/share/man/man8 \
49/usr/local \
50/usr/local/bin \
51/usr/local/etc \
52/usr/local/libexec \
53/usr/local/man \
54/usr/local/man/man1 \
55/usr/local/man/man8 \
56/usr/local/sbin \
57/usr/local/share \
58/var \
59/var/opt \
60/var/run \
61/var/tmp \
62/tmp"
3c0ef626 63
e54b3d7c 64# We may need to build as root so we make sure PATH is set up
2980ea68 65# only set the path if it's not set already
66[ -d /usr/local/bin ] && {
67 echo $PATH | grep ":/usr/local/bin" > /dev/null 2>&1
68 [ $? -ne 0 ] && PATH=$PATH:/usr/local/bin
69}
70[ -d /usr/ccs/bin ] && {
71 echo $PATH | grep ":/usr/ccs/bin" > /dev/null 2>&1
72 [ $? -ne 0 ] && PATH=$PATH:/usr/ccs/bin
73}
74export PATH
75#
76
77[ -f Makefile ] || {
78 echo "Please run this script from your build directory"
79 exit 1
80}
81
82# we will look for config.local to override the above options
83[ -s ./config.local ] && . ./config.local
3c0ef626 84
416fd2a8 85## Start by faking root install
3c0ef626 86echo "Faking root install..."
87START=`pwd`
2980ea68 88OPENSSHD_IN=`dirname $0`/opensshd.in
3c0ef626 89FAKE_ROOT=$START/package
2980ea68 90[ -d $FAKE_ROOT ] && rm -fr $FAKE_ROOT
3c0ef626 91mkdir $FAKE_ROOT
2980ea68 92${MAKE} install-nokeys DESTDIR=$FAKE_ROOT
93if [ $? -gt 0 ]
94then
95 echo "Fake root install failed, stopping."
96 exit 1
97fi
3c0ef626 98
99## Fill in some details, like prefix and sysconfdir
2980ea68 100for confvar in prefix exec_prefix bindir sbindir libexecdir datadir mandir sysconfdir piddir
101do
416fd2a8 102 eval $confvar=`grep "^$confvar=" Makefile | cut -d = -f 2`
2980ea68 103done
3c0ef626 104
e54b3d7c 105
106## Collect value of privsep user
107for confvar in SSH_PRIVSEP_USER
108do
416fd2a8 109 eval $confvar=`awk '/#define[ \t]'$confvar'/{print $3}' config.h`
e54b3d7c 110done
111
112## Set privsep defaults if not defined
113if [ -z "$SSH_PRIVSEP_USER" ]
114then
416fd2a8 115 SSH_PRIVSEP_USER=sshd
e54b3d7c 116fi
117
2980ea68 118## Extract common info requires for the 'info' part of the package.
119VERSION=`./ssh -V 2>&1 | sed -e 's/,.*//'`
3c0ef626 120
2980ea68 121UNAME_S=`uname -s`
122case ${UNAME_S} in
123 SunOS) UNAME_S=Solaris
124 ARCH=`uname -p`
125 RCS_D=yes
126 DEF_MSG="(default: n)"
127 ;;
e54b3d7c 128 *) ARCH=`uname -m`
129 DEF_MSG="\n" ;;
2980ea68 130esac
131
132## Setup our run level stuff while we are at it.
133mkdir -p $FAKE_ROOT${TEST_DIR}/etc/init.d
3c0ef626 134
135## setup our initscript correctly
2980ea68 136sed -e "s#%%configDir%%#${sysconfdir}#g" \
137 -e "s#%%openSSHDir%%#$prefix#g" \
138 -e "s#%%pidDir%%#${piddir}#g" \
139 ${OPENSSHD_IN} > $FAKE_ROOT${TEST_DIR}/etc/init.d/${SYSVINIT_NAME}
140chmod 744 $FAKE_ROOT${TEST_DIR}/etc/init.d/${SYSVINIT_NAME}
3c0ef626 141
2980ea68 142[ "${PERMIT_ROOT_LOGIN}" = no ] && \
143 perl -p -i -e "s/#PermitRootLogin yes/PermitRootLogin no/" \
144 $FAKE_ROOT/${sysconfdir}/sshd_config
145[ "${X11_FORWARDING}" = yes ] && \
146 perl -p -i -e "s/#X11Forwarding no/X11Forwarding yes/" \
147 $FAKE_ROOT/${sysconfdir}/sshd_config
148# fix PrintMotd
149perl -p -i -e "s/#PrintMotd yes/PrintMotd no/" \
150 $FAKE_ROOT/${sysconfdir}/sshd_config
3c0ef626 151
2980ea68 152# We don't want to overwrite config files on multiple installs
153mv $FAKE_ROOT/${sysconfdir}/ssh_config $FAKE_ROOT/${sysconfdir}/ssh_config.default
154mv $FAKE_ROOT/${sysconfdir}/sshd_config $FAKE_ROOT/${sysconfdir}/sshd_config.default
155[ -f $FAKE_ROOT/${sysconfdir}/ssh_prng_cmds ] && \
156mv $FAKE_ROOT/${sysconfdir}/ssh_prng_cmds $FAKE_ROOT/${sysconfdir}/ssh_prng_cmds.default
157
158cd $FAKE_ROOT
3c0ef626 159
160## Ok, this is outright wrong, but it will work. I'm tired of pkgmk
161## whining.
162for i in *; do
163 PROTO_ARGS="$PROTO_ARGS $i=/$i";
164done
165
166## Build info file
167echo "Building pkginfo file..."
168cat > pkginfo << _EOF
169PKG=$PKGNAME
2980ea68 170NAME="OpenSSH Portable for ${UNAME_S}"
3c0ef626 171DESC="Secure Shell remote access utility; replaces telnet and rlogin/rsh."
172VENDOR="OpenSSH Portable Team - http://www.openssh.com/portable.html"
3c0ef626 173ARCH=$ARCH
174VERSION=$VERSION
2980ea68 175CATEGORY="Security,application"
3c0ef626 176BASEDIR=/
2980ea68 177CLASSES="none"
178_EOF
179
180## Build preinstall file
181echo "Building preinstall file..."
182cat > preinstall << _EOF
183#! /sbin/sh
184#
185[ "\${PRE_INS_STOP}" = "yes" ] && ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} stop
186exit 0
3c0ef626 187_EOF
188
2980ea68 189## Build postinstall file
190echo "Building postinstall file..."
191cat > postinstall << _EOF
192#! /sbin/sh
193#
e54b3d7c 194[ -f \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_config ] || \\
195 cp -p \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_config.default \\
196 \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_config
197[ -f \${PKG_INSTALL_ROOT}${sysconfdir}/sshd_config ] || \\
198 cp -p \${PKG_INSTALL_ROOT}${sysconfdir}/sshd_config.default \\
199 \${PKG_INSTALL_ROOT}${sysconfdir}/sshd_config
200[ -f \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_prng_cmds.default ] && {
201 [ -f \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_prng_cmds ] || \\
202 cp -p \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_prng_cmds.default \\
203 \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_prng_cmds
2980ea68 204}
205
206# make rc?.d dirs only if we are doing a test install
207[ -n "${TEST_DIR}" ] && {
208 [ "$RCS_D" = yes ] && mkdir -p ${TEST_DIR}/etc/rcS.d
209 mkdir -p ${TEST_DIR}/etc/rc0.d
210 mkdir -p ${TEST_DIR}/etc/rc1.d
211 mkdir -p ${TEST_DIR}/etc/rc2.d
212}
213
214if [ "\${USE_SYM_LINKS}" = yes ]
215then
216 [ "$RCS_D" = yes ] && \
e54b3d7c 217installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rcS.d/K30${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s
218 installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc0.d/K30${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s
219 installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc1.d/K30${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s
220 installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc2.d/S98${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s
2980ea68 221else
222 [ "$RCS_D" = yes ] && \
e54b3d7c 223installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rcS.d/K30${SYSVINIT_NAME}=$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l
224 installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc0.d/K30${SYSVINIT_NAME}=$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l
225 installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc1.d/K30${SYSVINIT_NAME}=$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l
226 installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc2.d/S98${SYSVINIT_NAME}=$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l
2980ea68 227fi
228
229# If piddir doesn't exist we add it. (Ie. --with-pid-dir=/var/opt/ssh)
e54b3d7c 230[ -d $piddir ] || installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR$piddir d 755 root sys
2980ea68 231
232installf -f ${PKGNAME}
233
e54b3d7c 234# Use chroot to handle PKG_INSTALL_ROOT
235if [ ! -z "\${PKG_INSTALL_ROOT}" ]
236then
237 chroot="chroot \${PKG_INSTALL_ROOT}"
238fi
239# If this is a test build, we will skip the groupadd/useradd/passwd commands
240if [ ! -z "${TEST_DIR}" ]
241then
242 chroot=echo
243fi
244
245if egrep '^[ \t]*UsePrivilegeSeparation[ \t]+no' \${PKG_INSTALL_ROOT}/$sysconfdir/sshd_config >/dev/null
246then
416fd2a8 247 echo "UsePrivilegeSeparation disabled in config, not creating PrivSep user"
248 echo "or group."
e54b3d7c 249else
416fd2a8 250 echo "UsePrivilegeSeparation enabled in config (or defaulting to on)."
e54b3d7c 251
416fd2a8 252 # create group if required
253 if cut -f1 -d: \${PKG_INSTALL_ROOT}/etc/group | egrep '^'$SSH_PRIVSEP_USER'\$' >/dev/null
254 then
255 echo "PrivSep group $SSH_PRIVSEP_USER already exists."
256 else
e54b3d7c 257 # Use gid of 67 if possible
258 if cut -f3 -d: \${PKG_INSTALL_ROOT}/etc/group | egrep '^'$SSHDGID'\$' >/dev/null
259 then
260 :
261 else
262 sshdgid="-g $SSHDGID"
263 fi
416fd2a8 264 echo "Creating PrivSep group $SSH_PRIVSEP_USER."
265 \$chroot /usr/sbin/groupadd \$sshdgid $SSH_PRIVSEP_USER
266 fi
267
268 # Create user if required
269 if cut -f1 -d: \${PKG_INSTALL_ROOT}/etc/passwd | egrep '^'$SSH_PRIVSEP_USER'\$' >/dev/null
270 then
271 echo "PrivSep user $SSH_PRIVSEP_USER already exists."
272 else
e54b3d7c 273 # Use uid of 67 if possible
274 if cut -f3 -d: \${PKG_INSTALL_ROOT}/etc/passwd | egrep '^'$SSHDGID'\$' >/dev/null
275 then
276 :
277 else
278 sshduid="-u $SSHDUID"
279 fi
416fd2a8 280 echo "Creating PrivSep user $SSH_PRIVSEP_USER."
e54b3d7c 281 \$chroot /usr/sbin/useradd -c 'SSHD PrivSep User' -s /bin/false -g $SSH_PRIVSEP_USER \$sshduid $SSH_PRIVSEP_USER
282 \$chroot /usr/bin/passwd -l $SSH_PRIVSEP_USER
416fd2a8 283 fi
e54b3d7c 284fi
285
2980ea68 286[ "\${POST_INS_START}" = "yes" ] && ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} start
287exit 0
288_EOF
289
290## Build preremove file
291echo "Building preremove file..."
292cat > preremove << _EOF
293#! /sbin/sh
294#
295${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} stop
296exit 0
297_EOF
298
299## Build request file
300echo "Building request file..."
301cat > request << _EOF
302trap 'exit 3' 15
303USE_SYM_LINKS=no
304PRE_INS_STOP=no
305POST_INS_START=no
306# Use symbolic links?
307ans=\`ckyorn -d n \
308-p "Do you want symbolic links for the start/stop scripts? ${DEF_MSG}"\` || exit \$?
309case \$ans in
310 [y,Y]*) USE_SYM_LINKS=yes ;;
311esac
312
313# determine if should restart the daemon
314if [ -s ${piddir}/sshd.pid -a -f ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} ]
315then
316 ans=\`ckyorn -d n \
317-p "Should the running sshd daemon be restarted? ${DEF_MSG}"\` || exit \$?
318 case \$ans in
319 [y,Y]*) PRE_INS_STOP=yes
320 POST_INS_START=yes
321 ;;
322 esac
323
324else
325
326# determine if we should start sshd
327 ans=\`ckyorn -d n \
328-p "Start the sshd daemon after installing this package? ${DEF_MSG}"\` || exit \$?
329 case \$ans in
330 [y,Y]*) POST_INS_START=yes ;;
331 esac
332fi
333
334# make parameters available to installation service,
335# and so to any other packaging scripts
336cat >\$1 <<!
337USE_SYM_LINKS='\$USE_SYM_LINKS'
338PRE_INS_STOP='\$PRE_INS_STOP'
339POST_INS_START='\$POST_INS_START'
340!
341exit 0
342
343_EOF
344
345## Build space file
346echo "Building space file..."
347cat > space << _EOF
348# extra space required by start/stop links added by installf in postinstall
349$TEST_DIR/etc/rc0.d/K30${SYSVINIT_NAME} 0 1
350$TEST_DIR/etc/rc1.d/K30${SYSVINIT_NAME} 0 1
351$TEST_DIR/etc/rc2.d/S98${SYSVINIT_NAME} 0 1
352_EOF
353[ "$RCS_D" = yes ] && \
354echo "$TEST_DIR/etc/rcS.d/K30${SYSVINIT_NAME} 0 1" >> space
355
3c0ef626 356## Next Build our prototype
357echo "Building prototype file..."
2980ea68 358cat >mk-proto.awk << _EOF
359 BEGIN { print "i pkginfo"; print "i preinstall"; \\
360 print "i postinstall"; print "i preremove"; \\
361 print "i request"; print "i space"; \\
416fd2a8 362 split("$SYSTEM_DIR",sys_files); }
2980ea68 363 {
364 for (dir in sys_files) { if ( \$3 != sys_files[dir] )
416fd2a8 365 { \$5="root"; \$6="sys"; }
366 else
367 { \$4="?"; \$5="?"; \$6="?"; break;}
2980ea68 368 } }
369 { print; }
370_EOF
371find . | egrep -v "prototype|pkginfo|mk-proto.awk" | sort | \
372 pkgproto $PROTO_ARGS | nawk -f mk-proto.awk > prototype
3c0ef626 373
416fd2a8 374# /usr/local is a symlink on some systems
375[ "${USR_LOCAL_IS_SYMLINK}" = yes ] && {
376 grep -v "^d none /usr/local ? ? ?$" prototype > prototype.new
377 mv prototype.new prototype
378}
379
3c0ef626 380## Step back a directory and now build the package.
381echo "Building package.."
382cd ..
2980ea68 383pkgmk -d ${FAKE_ROOT} -f $FAKE_ROOT/prototype -o
384echo | pkgtrans -os ${FAKE_ROOT} ${START}/$PKGNAME-$UNAME_S-$ARCH-$VERSION.pkg
3c0ef626 385rm -rf $FAKE_ROOT
2980ea68 386
This page took 0.109496 seconds and 5 git commands to generate.