Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | # |
| 3 | # Fake Root Solaris/SVR4/SVR5 Build System - Prototype |
| 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) |
| 8 | # |
| 9 | umask 022 |
| 10 | # |
| 11 | # Options for building the package |
| 12 | # You can create a openssh-config.local with your customized options |
| 13 | # |
| 14 | REMOVE_FAKE_ROOT_WHEN_DONE=yes |
| 15 | # |
| 16 | # uncommenting TEST_DIR and using |
| 17 | # configure --prefix=/var/tmp --with-privsep-path=/var/tmp/empty |
| 18 | # and |
| 19 | # PKGNAME=tOpenSSH should allow testing a package without interfering |
| 20 | # with a real OpenSSH package on a system. This is not needed on systems |
| 21 | # that support the -R option to pkgadd. |
| 22 | #TEST_DIR=/var/tmp # leave commented out for production build |
| 23 | PKGNAME=OpenSSH |
Tim Rice | a5757f0 | 2004-07-01 20:41:15 -0700 | [diff] [blame] | 24 | # revisions within the same version (REV=a) |
| 25 | #REV= |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 26 | SYSVINIT_NAME=opensshd |
Tim Rice | 77674b1 | 2006-10-06 18:49:36 -0700 | [diff] [blame] | 27 | AWK=${AWK:="nawk"} |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 28 | MAKE=${MAKE:="make"} |
| 29 | SSHDUID=67 # Default privsep uid |
| 30 | SSHDGID=67 # Default privsep gid |
| 31 | # uncomment these next three as needed |
| 32 | #PERMIT_ROOT_LOGIN=no |
| 33 | #X11_FORWARDING=yes |
| 34 | #USR_LOCAL_IS_SYMLINK=yes |
| 35 | # System V init run levels |
| 36 | SYSVINITSTART=S98 |
| 37 | SYSVINITSTOPT=K30 |
| 38 | # We will source these if they exist |
Tim Rice | bf209f5 | 2006-02-13 12:46:44 -0800 | [diff] [blame] | 39 | POST_MAKE_INSTALL_FIXES=./pkg-post-make-install-fixes.sh |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 40 | POST_PROTOTYPE_EDITS=./pkg-post-prototype-edit.sh |
| 41 | # We'll be one level deeper looking for these |
| 42 | PKG_PREINSTALL_LOCAL=../pkg-preinstall.local |
| 43 | PKG_POSTINSTALL_LOCAL=../pkg-postinstall.local |
| 44 | PKG_PREREMOVE_LOCAL=../pkg-preremove.local |
| 45 | PKG_POSTREMOVE_LOCAL=../pkg-postremove.local |
| 46 | PKG_REQUEST_LOCAL=../pkg-request.local |
| 47 | # end of sourced files |
| 48 | # |
Tim Rice | 5af9db9 | 2004-06-19 19:31:06 -0700 | [diff] [blame] | 49 | OPENSSHD=opensshd.init |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 50 | OPENSSH_MANIFEST=openssh.xml |
Tim Rice | c3af6d4 | 2007-03-01 09:34:52 -0800 | [diff] [blame] | 51 | OPENSSH_FMRI=svc:/site/${SYSVINIT_NAME}:default |
Tim Rice | ffe3a8e | 2007-07-24 21:16:07 -0700 | [diff] [blame] | 52 | SMF_METHOD_DIR=/lib/svc/method/site |
| 53 | SMF_MANIFEST_DIR=/var/svc/manifest/site |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 54 | |
| 55 | PATH_GROUPADD_PROG=@PATH_GROUPADD_PROG@ |
| 56 | PATH_USERADD_PROG=@PATH_USERADD_PROG@ |
| 57 | PATH_PASSWD_PROG=@PATH_PASSWD_PROG@ |
| 58 | # |
| 59 | # list of system directories we do NOT want to change owner/group/perms |
| 60 | # when installing our package |
| 61 | SYSTEM_DIR="/etc \ |
| 62 | /etc/init.d \ |
| 63 | /etc/rcS.d \ |
| 64 | /etc/rc0.d \ |
| 65 | /etc/rc1.d \ |
| 66 | /etc/rc2.d \ |
| 67 | /etc/opt \ |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 68 | /lib \ |
| 69 | /lib/svc \ |
| 70 | /lib/svc/method \ |
| 71 | /lib/svc/method/site \ |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 72 | /opt \ |
| 73 | /opt/bin \ |
| 74 | /usr \ |
| 75 | /usr/bin \ |
| 76 | /usr/lib \ |
| 77 | /usr/sbin \ |
| 78 | /usr/share \ |
| 79 | /usr/share/man \ |
| 80 | /usr/share/man/man1 \ |
| 81 | /usr/share/man/man8 \ |
| 82 | /usr/local \ |
| 83 | /usr/local/bin \ |
| 84 | /usr/local/etc \ |
| 85 | /usr/local/libexec \ |
| 86 | /usr/local/man \ |
| 87 | /usr/local/man/man1 \ |
| 88 | /usr/local/man/man8 \ |
| 89 | /usr/local/sbin \ |
| 90 | /usr/local/share \ |
| 91 | /var \ |
| 92 | /var/opt \ |
| 93 | /var/run \ |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 94 | /var/svc \ |
| 95 | /var/svc/manifest \ |
| 96 | /var/svc/manifest/site \ |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 97 | /var/tmp \ |
| 98 | /tmp" |
| 99 | |
| 100 | # We may need to build as root so we make sure PATH is set up |
| 101 | # only set the path if it's not set already |
| 102 | [ -d /opt/bin ] && { |
| 103 | echo $PATH | grep ":/opt/bin" > /dev/null 2>&1 |
| 104 | [ $? -ne 0 ] && PATH=$PATH:/opt/bin |
| 105 | } |
| 106 | [ -d /usr/local/bin ] && { |
| 107 | echo $PATH | grep ":/usr/local/bin" > /dev/null 2>&1 |
| 108 | [ $? -ne 0 ] && PATH=$PATH:/usr/local/bin |
| 109 | } |
| 110 | [ -d /usr/ccs/bin ] && { |
| 111 | echo $PATH | grep ":/usr/ccs/bin" > /dev/null 2>&1 |
| 112 | [ $? -ne 0 ] && PATH=$PATH:/usr/ccs/bin |
| 113 | } |
| 114 | export PATH |
| 115 | # |
| 116 | |
| 117 | [ -f Makefile ] || { |
| 118 | echo "Please run this script from your build directory" |
| 119 | exit 1 |
| 120 | } |
| 121 | |
| 122 | # we will look for openssh-config.local to override the above options |
| 123 | [ -s ./openssh-config.local ] && . ./openssh-config.local |
| 124 | |
| 125 | START=`pwd` |
| 126 | FAKE_ROOT=$START/pkg |
| 127 | |
| 128 | ## Fill in some details, like prefix and sysconfdir |
| 129 | for confvar in prefix exec_prefix bindir sbindir libexecdir datadir mandir sysconfdir piddir srcdir |
| 130 | do |
| 131 | eval $confvar=`grep "^$confvar=" Makefile | cut -d = -f 2` |
| 132 | done |
| 133 | |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 134 | ## Are we using Solaris' SMF? |
| 135 | DO_SMF=0 |
| 136 | if egrep "^#define USE_SOLARIS_PROCESS_CONTRACTS" config.h > /dev/null 2>&1 |
| 137 | then |
| 138 | DO_SMF=1 |
| 139 | fi |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 140 | |
| 141 | ## Collect value of privsep user |
| 142 | for confvar in SSH_PRIVSEP_USER |
| 143 | do |
| 144 | eval $confvar=`awk '/#define[ \t]'$confvar'/{print $3}' config.h` |
| 145 | done |
| 146 | |
| 147 | ## Set privsep defaults if not defined |
| 148 | if [ -z "$SSH_PRIVSEP_USER" ] |
| 149 | then |
| 150 | SSH_PRIVSEP_USER=sshd |
| 151 | fi |
| 152 | |
| 153 | ## Extract common info requires for the 'info' part of the package. |
| 154 | VERSION=`./ssh -V 2>&1 | sed -e 's/,.*//'` |
| 155 | |
| 156 | ARCH=`uname -m` |
| 157 | DEF_MSG="\n" |
| 158 | OS_VER=`uname -v` |
| 159 | SCRIPT_SHELL=/sbin/sh |
Tim Rice | 09f1093 | 2006-10-06 14:58:38 -0700 | [diff] [blame] | 160 | UNAME_R=`uname -r` |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 161 | UNAME_S=`uname -s` |
| 162 | case ${UNAME_S} in |
| 163 | SunOS) UNAME_S=Solaris |
Tim Rice | 09f1093 | 2006-10-06 14:58:38 -0700 | [diff] [blame] | 164 | OS_VER=${UNAME_R} |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 165 | ARCH=`uname -p` |
| 166 | RCS_D=yes |
| 167 | DEF_MSG="(default: n)" |
| 168 | ;; |
Tim Rice | 09f1093 | 2006-10-06 14:58:38 -0700 | [diff] [blame] | 169 | SCO_SV) case ${UNAME_R} in |
| 170 | 3.2) UNAME_S=OpenServer5 |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 171 | OS_VER=`uname -X | grep Release | sed -e 's/^Rel.*3.2v//'` |
Tim Rice | 09f1093 | 2006-10-06 14:58:38 -0700 | [diff] [blame] | 172 | ;; |
| 173 | 5) UNAME_S=OpenServer6 |
| 174 | ;; |
| 175 | esac |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 176 | SCRIPT_SHELL=/bin/sh |
| 177 | RC1_D=no |
| 178 | DEF_MSG="(default: n)" |
| 179 | ;; |
| 180 | esac |
| 181 | |
| 182 | case `basename $0` in |
| 183 | buildpkg.sh) |
| 184 | ## Start by faking root install |
| 185 | echo "Faking root install..." |
| 186 | [ -d $FAKE_ROOT ] && rm -fr $FAKE_ROOT |
| 187 | mkdir $FAKE_ROOT |
| 188 | ${MAKE} install-nokeys DESTDIR=$FAKE_ROOT |
| 189 | if [ $? -gt 0 ] |
| 190 | then |
| 191 | echo "Fake root install failed, stopping." |
| 192 | exit 1 |
| 193 | fi |
| 194 | |
| 195 | ## Setup our run level stuff while we are at it. |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 196 | if [ $DO_SMF -eq 1 ] |
| 197 | then |
| 198 | # For Solaris' SMF, /lib/svc/method/site is the preferred place |
| 199 | # for start/stop scripts that aren't supplied with the OS, and |
| 200 | # similarly /var/svc/manifest/site for manifests. |
Tim Rice | ffe3a8e | 2007-07-24 21:16:07 -0700 | [diff] [blame] | 201 | mkdir -p $FAKE_ROOT${TEST_DIR}${SMF_METHOD_DIR} |
| 202 | mkdir -p $FAKE_ROOT${TEST_DIR}${SMF_MANIFEST_DIR} |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 203 | |
Tim Rice | ffe3a8e | 2007-07-24 21:16:07 -0700 | [diff] [blame] | 204 | cp ${OPENSSHD} $FAKE_ROOT${TEST_DIR}${SMF_METHOD_DIR}/${SYSVINIT_NAME} |
| 205 | chmod 744 $FAKE_ROOT${TEST_DIR}${SMF_METHOD_DIR}/${SYSVINIT_NAME} |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 206 | |
Tim Rice | ffe3a8e | 2007-07-24 21:16:07 -0700 | [diff] [blame] | 207 | cat ${OPENSSH_MANIFEST} | \ |
| 208 | sed -e "s|__SYSVINIT_NAME__|${SYSVINIT_NAME}|" \ |
| 209 | -e "s|__SMF_METHOD_DIR__|${SMF_METHOD_DIR}|" \ |
| 210 | > $FAKE_ROOT${TEST_DIR}${SMF_MANIFEST_DIR}/${SYSVINIT_NAME}.xml |
| 211 | chmod 644 $FAKE_ROOT${TEST_DIR}${SMF_MANIFEST_DIR}/${SYSVINIT_NAME}.xml |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 212 | else |
| 213 | mkdir -p $FAKE_ROOT${TEST_DIR}/etc/init.d |
| 214 | |
| 215 | cp ${OPENSSHD} $FAKE_ROOT${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} |
| 216 | chmod 744 $FAKE_ROOT${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} |
| 217 | fi |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 218 | |
| 219 | [ "${PERMIT_ROOT_LOGIN}" = no ] && \ |
| 220 | perl -p -i -e "s/#PermitRootLogin yes/PermitRootLogin no/" \ |
Tim Rice | cd22d30 | 2007-07-24 21:40:59 -0700 | [diff] [blame] | 221 | $FAKE_ROOT${sysconfdir}/sshd_config |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 222 | [ "${X11_FORWARDING}" = yes ] && \ |
| 223 | perl -p -i -e "s/#X11Forwarding no/X11Forwarding yes/" \ |
Tim Rice | cd22d30 | 2007-07-24 21:40:59 -0700 | [diff] [blame] | 224 | $FAKE_ROOT${sysconfdir}/sshd_config |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 225 | # fix PrintMotd |
| 226 | perl -p -i -e "s/#PrintMotd yes/PrintMotd no/" \ |
Tim Rice | cd22d30 | 2007-07-24 21:40:59 -0700 | [diff] [blame] | 227 | $FAKE_ROOT${sysconfdir}/sshd_config |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 228 | |
| 229 | # We don't want to overwrite config files on multiple installs |
Tim Rice | cd22d30 | 2007-07-24 21:40:59 -0700 | [diff] [blame] | 230 | mv $FAKE_ROOT${sysconfdir}/ssh_config $FAKE_ROOT${sysconfdir}/ssh_config.default |
| 231 | mv $FAKE_ROOT${sysconfdir}/sshd_config $FAKE_ROOT${sysconfdir}/sshd_config.default |
| 232 | [ -f $FAKE_ROOT${sysconfdir}/ssh_prng_cmds ] && \ |
| 233 | mv $FAKE_ROOT${sysconfdir}/ssh_prng_cmds $FAKE_ROOT${sysconfdir}/ssh_prng_cmds.default |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 234 | |
| 235 | # local tweeks here |
| 236 | [ -s "${POST_MAKE_INSTALL_FIXES}" ] && . ${POST_MAKE_INSTALL_FIXES} |
| 237 | |
| 238 | cd $FAKE_ROOT |
| 239 | |
| 240 | ## Ok, this is outright wrong, but it will work. I'm tired of pkgmk |
| 241 | ## whining. |
| 242 | for i in *; do |
| 243 | PROTO_ARGS="$PROTO_ARGS $i=/$i"; |
| 244 | done |
| 245 | |
| 246 | ## Build info file |
| 247 | echo "Building pkginfo file..." |
| 248 | cat > pkginfo << _EOF |
| 249 | PKG=$PKGNAME |
| 250 | NAME="OpenSSH Portable for ${UNAME_S}" |
| 251 | DESC="Secure Shell remote access utility; replaces telnet and rlogin/rsh." |
| 252 | VENDOR="OpenSSH Portable Team - http://www.openssh.com/portable.html" |
| 253 | ARCH=$ARCH |
Tim Rice | a5757f0 | 2004-07-01 20:41:15 -0700 | [diff] [blame] | 254 | VERSION=$VERSION$REV |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 255 | CATEGORY="Security,application" |
| 256 | BASEDIR=/ |
| 257 | CLASSES="none" |
| 258 | PSTAMP="${UNAME_S} ${OS_VER} ${ARCH} `date '+%d%b%Y %H:%M'`" |
| 259 | _EOF |
| 260 | |
| 261 | ## Build empty depend file that may get updated by $POST_PROTOTYPE_EDITS |
| 262 | echo "Building depend file..." |
| 263 | touch depend |
| 264 | |
| 265 | ## Build space file |
| 266 | echo "Building space file..." |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 267 | if [ $DO_SMF -eq 1 ] |
| 268 | then |
| 269 | # XXX Is this necessary? If not, remove space line from mk-proto.awk. |
| 270 | touch space |
| 271 | else |
| 272 | cat > space << _EOF |
| 273 | # extra space required by start/stop links added by installf |
| 274 | # in postinstall |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 275 | $TEST_DIR/etc/rc0.d/${SYSVINITSTOPT}${SYSVINIT_NAME} 0 1 |
| 276 | $TEST_DIR/etc/rc2.d/${SYSVINITSTART}${SYSVINIT_NAME} 0 1 |
| 277 | _EOF |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 278 | [ "$RC1_D" = no ] || \ |
| 279 | echo "$TEST_DIR/etc/rc1.d/${SYSVINITSTOPT}${SYSVINIT_NAME} 0 1" >> space |
| 280 | [ "$RCS_D" = yes ] && \ |
| 281 | echo "$TEST_DIR/etc/rcS.d/${SYSVINITSTOPT}${SYSVINIT_NAME} 0 1" >> space |
| 282 | fi |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 283 | |
| 284 | ## Build preinstall file |
| 285 | echo "Building preinstall file..." |
| 286 | cat > preinstall << _EOF |
| 287 | #! ${SCRIPT_SHELL} |
| 288 | # |
| 289 | _EOF |
| 290 | |
| 291 | # local preinstall changes here |
| 292 | [ -s "${PKG_PREINSTALL_LOCAL}" ] && . ${PKG_PREINSTALL_LOCAL} |
| 293 | |
| 294 | cat >> preinstall << _EOF |
| 295 | # |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 296 | if [ "\${PRE_INS_STOP}" = "yes" ] |
| 297 | then |
| 298 | if [ $DO_SMF -eq 1 ] |
| 299 | then |
| 300 | svcadm disable $OPENSSH_FMRI |
| 301 | else |
| 302 | ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} stop |
| 303 | fi |
| 304 | fi |
| 305 | |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 306 | exit 0 |
| 307 | _EOF |
| 308 | |
| 309 | ## Build postinstall file |
| 310 | echo "Building postinstall file..." |
| 311 | cat > postinstall << _EOF |
| 312 | #! ${SCRIPT_SHELL} |
| 313 | # |
| 314 | [ -f \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_config ] || \\ |
| 315 | cp -p \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_config.default \\ |
| 316 | \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_config |
| 317 | [ -f \${PKG_INSTALL_ROOT}${sysconfdir}/sshd_config ] || \\ |
| 318 | cp -p \${PKG_INSTALL_ROOT}${sysconfdir}/sshd_config.default \\ |
| 319 | \${PKG_INSTALL_ROOT}${sysconfdir}/sshd_config |
| 320 | [ -f \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_prng_cmds.default ] && { |
| 321 | [ -f \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_prng_cmds ] || \\ |
| 322 | cp -p \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_prng_cmds.default \\ |
| 323 | \${PKG_INSTALL_ROOT}${sysconfdir}/ssh_prng_cmds |
| 324 | } |
| 325 | |
| 326 | # make rc?.d dirs only if we are doing a test install |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 327 | [ -n "${TEST_DIR}" ] && [ $DO_SMF -ne 1 ] && { |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 328 | [ "$RCS_D" = yes ] && mkdir -p ${TEST_DIR}/etc/rcS.d |
| 329 | mkdir -p ${TEST_DIR}/etc/rc0.d |
| 330 | [ "$RC1_D" = no ] || mkdir -p ${TEST_DIR}/etc/rc1.d |
| 331 | mkdir -p ${TEST_DIR}/etc/rc2.d |
| 332 | } |
| 333 | |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 334 | if [ $DO_SMF -eq 1 ] |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 335 | then |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 336 | # Delete the existing service, if it exists, then import the |
| 337 | # new one. |
| 338 | if svcs $OPENSSH_FMRI > /dev/null 2>&1 |
| 339 | then |
| 340 | svccfg delete -f $OPENSSH_FMRI |
| 341 | fi |
Tim Rice | c3af6d4 | 2007-03-01 09:34:52 -0800 | [diff] [blame] | 342 | # NOTE, The manifest disables sshd by default. |
Tim Rice | ffe3a8e | 2007-07-24 21:16:07 -0700 | [diff] [blame] | 343 | svccfg import ${TEST_DIR}${SMF_MANIFEST_DIR}/${SYSVINIT_NAME}.xml |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 344 | else |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 345 | if [ "\${USE_SYM_LINKS}" = yes ] |
| 346 | then |
| 347 | [ "$RCS_D" = yes ] && \ |
| 348 | installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rcS.d/${SYSVINITSTOPT}${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s |
| 349 | installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc0.d/${SYSVINITSTOPT}${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s |
| 350 | [ "$RC1_D" = no ] || \ |
| 351 | installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc1.d/${SYSVINITSTOPT}${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s |
| 352 | installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc2.d/${SYSVINITSTART}${SYSVINIT_NAME}=../init.d/${SYSVINIT_NAME} s |
| 353 | else |
| 354 | [ "$RCS_D" = yes ] && \ |
| 355 | installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rcS.d/${SYSVINITSTOPT}${SYSVINIT_NAME}=\${PKG_INSTALL_ROOT}$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l |
| 356 | installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc0.d/${SYSVINITSTOPT}${SYSVINIT_NAME}=\${PKG_INSTALL_ROOT}$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l |
| 357 | [ "$RC1_D" = no ] || \ |
| 358 | installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc1.d/${SYSVINITSTOPT}${SYSVINIT_NAME}=\${PKG_INSTALL_ROOT}$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l |
| 359 | installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR/etc/rc2.d/${SYSVINITSTART}${SYSVINIT_NAME}=\${PKG_INSTALL_ROOT}$TEST_DIR/etc/init.d/${SYSVINIT_NAME} l |
| 360 | fi |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 361 | fi |
| 362 | |
| 363 | # If piddir doesn't exist we add it. (Ie. --with-pid-dir=/var/opt/ssh) |
| 364 | [ -d $piddir ] || installf ${PKGNAME} \${PKG_INSTALL_ROOT}$TEST_DIR$piddir d 0755 root sys |
| 365 | |
| 366 | _EOF |
| 367 | |
| 368 | # local postinstall changes here |
| 369 | [ -s "${PKG_POSTINSTALL_LOCAL}" ] && . ${PKG_POSTINSTALL_LOCAL} |
| 370 | |
| 371 | cat >> postinstall << _EOF |
| 372 | installf -f ${PKGNAME} |
| 373 | |
| 374 | # Use chroot to handle PKG_INSTALL_ROOT |
| 375 | if [ ! -z "\${PKG_INSTALL_ROOT}" ] |
| 376 | then |
| 377 | chroot="chroot \${PKG_INSTALL_ROOT}" |
| 378 | fi |
| 379 | # If this is a test build, we will skip the groupadd/useradd/passwd commands |
| 380 | if [ ! -z "${TEST_DIR}" ] |
| 381 | then |
| 382 | chroot=echo |
| 383 | fi |
| 384 | |
Darren Tucker | 733a292 | 2006-09-09 20:41:25 +1000 | [diff] [blame] | 385 | echo "PrivilegeSeparation user always required." |
Tim Rice | a5757f0 | 2004-07-01 20:41:15 -0700 | [diff] [blame] | 386 | if cut -f1 -d: \${PKG_INSTALL_ROOT}/etc/passwd | egrep '^'$SSH_PRIVSEP_USER'\$' >/dev/null |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 387 | then |
Tim Rice | a5757f0 | 2004-07-01 20:41:15 -0700 | [diff] [blame] | 388 | echo "PrivSep user $SSH_PRIVSEP_USER already exists." |
| 389 | SSH_PRIVSEP_GROUP=\`grep "^$SSH_PRIVSEP_USER:" \${PKG_INSTALL_ROOT}/etc/passwd | awk -F: '{print \$4}'\` |
| 390 | SSH_PRIVSEP_GROUP=\`grep ":\$SSH_PRIVSEP_GROUP:" \${PKG_INSTALL_ROOT}/etc/group | awk -F: '{print \$1}'\` |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 391 | else |
Tim Rice | a5757f0 | 2004-07-01 20:41:15 -0700 | [diff] [blame] | 392 | DO_PASSWD=yes |
| 393 | fi |
| 394 | [ -z "\$SSH_PRIVSEP_GROUP" ] && SSH_PRIVSEP_GROUP=$SSH_PRIVSEP_USER |
| 395 | |
| 396 | # group required? |
| 397 | if cut -f1 -d: \${PKG_INSTALL_ROOT}/etc/group | egrep '^'\$SSH_PRIVSEP_GROUP'\$' >/dev/null |
| 398 | then |
| 399 | echo "PrivSep group \$SSH_PRIVSEP_GROUP already exists." |
| 400 | else |
| 401 | DO_GROUP=yes |
| 402 | fi |
| 403 | |
| 404 | # create group if required |
| 405 | [ "\$DO_GROUP" = yes ] && { |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 406 | # Use gid of 67 if possible |
| 407 | if cut -f3 -d: \${PKG_INSTALL_ROOT}/etc/group | egrep '^'$SSHDGID'\$' >/dev/null |
| 408 | then |
| 409 | : |
| 410 | else |
| 411 | sshdgid="-g $SSHDGID" |
| 412 | fi |
Tim Rice | a5757f0 | 2004-07-01 20:41:15 -0700 | [diff] [blame] | 413 | echo "Creating PrivSep group \$SSH_PRIVSEP_GROUP." |
| 414 | \$chroot ${PATH_GROUPADD_PROG} \$sshdgid \$SSH_PRIVSEP_GROUP |
| 415 | } |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 416 | |
| 417 | # Create user if required |
Tim Rice | a5757f0 | 2004-07-01 20:41:15 -0700 | [diff] [blame] | 418 | [ "\$DO_PASSWD" = yes ] && { |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 419 | # Use uid of 67 if possible |
Tim Rice | 8db70e2 | 2005-12-28 14:28:08 -0800 | [diff] [blame] | 420 | if cut -f3 -d: \${PKG_INSTALL_ROOT}/etc/passwd | egrep '^'$SSHDUID'\$' >/dev/null |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 421 | then |
| 422 | : |
| 423 | else |
| 424 | sshduid="-u $SSHDUID" |
| 425 | fi |
| 426 | echo "Creating PrivSep user $SSH_PRIVSEP_USER." |
| 427 | \$chroot ${PATH_USERADD_PROG} -c 'SSHD PrivSep User' -s /bin/false -g $SSH_PRIVSEP_USER \$sshduid $SSH_PRIVSEP_USER |
| 428 | \$chroot ${PATH_PASSWD_PROG} -l $SSH_PRIVSEP_USER |
Tim Rice | a5757f0 | 2004-07-01 20:41:15 -0700 | [diff] [blame] | 429 | } |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 430 | |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 431 | if [ "\${POST_INS_START}" = "yes" ] |
| 432 | then |
| 433 | if [ $DO_SMF -eq 1 ] |
| 434 | then |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 435 | svcadm enable $OPENSSH_FMRI |
| 436 | else |
| 437 | ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} start |
| 438 | fi |
| 439 | fi |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 440 | exit 0 |
| 441 | _EOF |
| 442 | |
| 443 | ## Build preremove file |
| 444 | echo "Building preremove file..." |
| 445 | cat > preremove << _EOF |
| 446 | #! ${SCRIPT_SHELL} |
| 447 | # |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 448 | if [ $DO_SMF -eq 1 ] |
| 449 | then |
| 450 | svcadm disable $OPENSSH_FMRI |
| 451 | else |
| 452 | ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} stop |
| 453 | fi |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 454 | _EOF |
| 455 | |
| 456 | # local preremove changes here |
| 457 | [ -s "${PKG_PREREMOVE_LOCAL}" ] && . ${PKG_PREREMOVE_LOCAL} |
| 458 | |
| 459 | cat >> preremove << _EOF |
| 460 | exit 0 |
| 461 | _EOF |
| 462 | |
| 463 | ## Build postremove file |
| 464 | echo "Building postremove file..." |
| 465 | cat > postremove << _EOF |
| 466 | #! ${SCRIPT_SHELL} |
| 467 | # |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 468 | if [ $DO_SMF -eq 1 ] |
| 469 | then |
| 470 | if svcs $OPENSSH_FMRI > /dev/null 2>&1 |
| 471 | then |
| 472 | svccfg delete -f $OPENSSH_FMRI |
| 473 | fi |
| 474 | fi |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 475 | _EOF |
| 476 | |
| 477 | # local postremove changes here |
| 478 | [ -s "${PKG_POSTREMOVE_LOCAL}" ] && . ${PKG_POSTREMOVE_LOCAL} |
| 479 | |
| 480 | cat >> postremove << _EOF |
| 481 | exit 0 |
| 482 | _EOF |
| 483 | |
| 484 | ## Build request file |
| 485 | echo "Building request file..." |
| 486 | cat > request << _EOF |
| 487 | trap 'exit 3' 15 |
| 488 | |
| 489 | _EOF |
| 490 | |
| 491 | [ -x /usr/bin/ckyorn ] || cat >> request << _EOF |
| 492 | |
| 493 | ckyorn() { |
Tim Rice | 09f1093 | 2006-10-06 14:58:38 -0700 | [diff] [blame] | 494 | # for some strange reason OpenServer5 has no ckyorn |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 495 | # We build a striped down version here |
| 496 | |
| 497 | DEFAULT=n |
| 498 | PROMPT="Yes or No [yes,no,?,quit]" |
| 499 | HELP_PROMPT=" Enter y or yes if your answer is yes; n or no if your answer is no." |
| 500 | USAGE="usage: ckyorn [options] |
| 501 | where options may include: |
| 502 | -d default |
| 503 | -h help |
| 504 | -p prompt |
| 505 | " |
| 506 | |
| 507 | if [ \$# != 0 ] |
| 508 | then |
| 509 | while getopts d:p:h: c |
| 510 | do |
| 511 | case \$c in |
| 512 | h) HELP_PROMPT="\$OPTARG" ;; |
| 513 | d) DEFAULT=\$OPTARG ;; |
| 514 | p) PROMPT=\$OPTARG ;; |
| 515 | \\?) echo "\$USAGE" 1>&2 |
| 516 | exit 1 ;; |
| 517 | esac |
| 518 | done |
| 519 | shift \`expr \$OPTIND - 1\` |
| 520 | fi |
| 521 | |
| 522 | while true |
| 523 | do |
| 524 | echo "\${PROMPT}\\c " 1>&2 |
| 525 | read key |
| 526 | [ -z "\$key" ] && key=\$DEFAULT |
| 527 | case \$key in |
| 528 | [n,N]|[n,N][o,O]|[y,Y]|[y,Y][e,E][s,S]) echo "\${key}\\c" |
| 529 | exit 0 ;; |
| 530 | \\?) echo \$HELP_PROMPT 1>&2 ;; |
| 531 | q|quit) echo "q\\c" 1>&2 |
| 532 | exit 3 ;; |
| 533 | esac |
| 534 | done |
| 535 | |
| 536 | } |
| 537 | |
| 538 | _EOF |
| 539 | |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 540 | if [ $DO_SMF -eq 1 ] |
| 541 | then |
| 542 | # This could get hairy, as the running sshd may not be under SMF. |
| 543 | # We'll assume an earlier version of OpenSSH started via SMF. |
| 544 | cat >> request << _EOF |
| 545 | PRE_INS_STOP=no |
| 546 | POST_INS_START=no |
| 547 | # determine if should restart the daemon |
| 548 | if [ -s ${piddir}/sshd.pid ] && \ |
Tim Rice | c3af6d4 | 2007-03-01 09:34:52 -0800 | [diff] [blame] | 549 | /usr/bin/svcs -H $OPENSSH_FMRI 2>&1 | egrep "^online" > /dev/null 2>&1 |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 550 | then |
| 551 | ans=\`ckyorn -d n \ |
| 552 | -p "Should the running sshd daemon be restarted? ${DEF_MSG}"\` || exit \$? |
| 553 | case \$ans in |
| 554 | [y,Y]*) PRE_INS_STOP=yes |
| 555 | POST_INS_START=yes |
| 556 | ;; |
| 557 | esac |
| 558 | |
| 559 | else |
| 560 | |
| 561 | # determine if we should start sshd |
| 562 | ans=\`ckyorn -d n \ |
| 563 | -p "Start the sshd daemon after installing this package? ${DEF_MSG}"\` || exit \$? |
| 564 | case \$ans in |
| 565 | [y,Y]*) POST_INS_START=yes ;; |
| 566 | esac |
| 567 | fi |
| 568 | |
| 569 | # make parameters available to installation service, |
| 570 | # and so to any other packaging scripts |
| 571 | cat >\$1 <<! |
| 572 | PRE_INS_STOP='\$PRE_INS_STOP' |
| 573 | POST_INS_START='\$POST_INS_START' |
| 574 | ! |
| 575 | |
| 576 | _EOF |
| 577 | else |
| 578 | cat >> request << _EOF |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 579 | USE_SYM_LINKS=no |
| 580 | PRE_INS_STOP=no |
| 581 | POST_INS_START=no |
| 582 | # Use symbolic links? |
| 583 | ans=\`ckyorn -d n \ |
| 584 | -p "Do you want symbolic links for the start/stop scripts? ${DEF_MSG}"\` || exit \$? |
| 585 | case \$ans in |
| 586 | [y,Y]*) USE_SYM_LINKS=yes ;; |
| 587 | esac |
| 588 | |
| 589 | # determine if should restart the daemon |
| 590 | if [ -s ${piddir}/sshd.pid -a -f ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} ] |
| 591 | then |
| 592 | ans=\`ckyorn -d n \ |
| 593 | -p "Should the running sshd daemon be restarted? ${DEF_MSG}"\` || exit \$? |
| 594 | case \$ans in |
| 595 | [y,Y]*) PRE_INS_STOP=yes |
| 596 | POST_INS_START=yes |
| 597 | ;; |
| 598 | esac |
| 599 | |
| 600 | else |
| 601 | |
| 602 | # determine if we should start sshd |
| 603 | ans=\`ckyorn -d n \ |
| 604 | -p "Start the sshd daemon after installing this package? ${DEF_MSG}"\` || exit \$? |
| 605 | case \$ans in |
| 606 | [y,Y]*) POST_INS_START=yes ;; |
| 607 | esac |
| 608 | fi |
| 609 | |
| 610 | # make parameters available to installation service, |
| 611 | # and so to any other packaging scripts |
| 612 | cat >\$1 <<! |
| 613 | USE_SYM_LINKS='\$USE_SYM_LINKS' |
| 614 | PRE_INS_STOP='\$PRE_INS_STOP' |
| 615 | POST_INS_START='\$POST_INS_START' |
| 616 | ! |
| 617 | |
| 618 | _EOF |
Damien Miller | 223897a | 2006-09-12 21:54:10 +1000 | [diff] [blame] | 619 | fi |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 620 | |
| 621 | # local request changes here |
| 622 | [ -s "${PKG_REQUEST_LOCAL}" ] && . ${PKG_REQUEST_LOCAL} |
| 623 | |
| 624 | cat >> request << _EOF |
| 625 | exit 0 |
| 626 | |
| 627 | _EOF |
| 628 | |
| 629 | ## Next Build our prototype |
| 630 | echo "Building prototype file..." |
| 631 | cat >mk-proto.awk << _EOF |
| 632 | BEGIN { print "i pkginfo"; print "i depend"; \\ |
| 633 | print "i preinstall"; print "i postinstall"; \\ |
| 634 | print "i preremove"; print "i postremove"; \\ |
| 635 | print "i request"; print "i space"; \\ |
| 636 | split("$SYSTEM_DIR",sys_files); } |
| 637 | { |
| 638 | for (dir in sys_files) { if ( \$3 != sys_files[dir] ) |
| 639 | { if ( \$1 == "s" ) |
| 640 | { \$5=""; \$6=""; } |
| 641 | else |
| 642 | { \$5="root"; \$6="sys"; } |
| 643 | } |
| 644 | else |
| 645 | { \$4="?"; \$5="?"; \$6="?"; break;} |
| 646 | } } |
| 647 | { print; } |
| 648 | _EOF |
| 649 | |
| 650 | find . | egrep -v "prototype|pkginfo|mk-proto.awk" | sort | \ |
Tim Rice | 77674b1 | 2006-10-06 18:49:36 -0700 | [diff] [blame] | 651 | pkgproto $PROTO_ARGS | ${AWK} -f mk-proto.awk > prototype |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 652 | |
| 653 | # /usr/local is a symlink on some systems |
| 654 | [ "${USR_LOCAL_IS_SYMLINK}" = yes ] && { |
| 655 | grep -v "^d none /usr/local ? ? ?$" prototype > prototype.new |
| 656 | mv prototype.new prototype |
| 657 | } |
| 658 | |
| 659 | ## Step back a directory and now build the package. |
| 660 | cd .. |
| 661 | # local prototype tweeks here |
| 662 | [ -s "${POST_PROTOTYPE_EDITS}" ] && . ${POST_PROTOTYPE_EDITS} |
| 663 | |
| 664 | echo "Building package.." |
| 665 | pkgmk -d ${FAKE_ROOT} -f $FAKE_ROOT/prototype -o |
Tim Rice | a5757f0 | 2004-07-01 20:41:15 -0700 | [diff] [blame] | 666 | echo | pkgtrans -os ${FAKE_ROOT} ${START}/$PKGNAME-$VERSION$REV-$UNAME_S-$ARCH.pkg |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 667 | ;; |
| 668 | |
| 669 | justpkg.sh) |
| 670 | rm -fr ${FAKE_ROOT}/${PKGNAME} |
| 671 | grep -v "^PSTAMP=" $FAKE_ROOT/pkginfo > $$tmp |
| 672 | mv $$tmp $FAKE_ROOT/pkginfo |
| 673 | cat >> $FAKE_ROOT/pkginfo << _EOF |
| 674 | PSTAMP="${UNAME_S} ${OS_VER} ${ARCH} `date '+%d%b%Y %H:%M'`" |
| 675 | _EOF |
| 676 | pkgmk -d ${FAKE_ROOT} -f $FAKE_ROOT/prototype -o |
Tim Rice | a5757f0 | 2004-07-01 20:41:15 -0700 | [diff] [blame] | 677 | echo | pkgtrans -os ${FAKE_ROOT} ${START}/$PKGNAME-$VERSION$REV-$UNAME_S-$ARCH.pkg |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 678 | ;; |
| 679 | |
| 680 | esac |
| 681 | |
| 682 | [ "${REMOVE_FAKE_ROOT_WHEN_DONE}" = yes ] && rm -rf $FAKE_ROOT |
Tim Rice | 2d2b9f7 | 2004-05-30 21:48:40 -0700 | [diff] [blame] | 683 | exit 0 |
Tim Rice | 6f1f758 | 2004-05-30 21:38:51 -0700 | [diff] [blame] | 684 | |