📄 buildpkg.sh
字号:
#!/bin/sh## 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 buildPKGNAME=OpenSSHSYSVINIT_NAME=opensshdMAKE=${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 packageSYSTEM_DIR="/etc \/etc/init.d \/etc/rcS.d \/etc/rc0.d \/etc/rc1.d \/etc/rc2.d \/etc/opt \/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/opt \/var/run \/var/tmp \/tmp"# 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.inFAKE_ROOT=$START/package[ -d $FAKE_ROOT ] && rm -fr $FAKE_ROOTmkdir $FAKE_ROOT${MAKE} install-nokeys DESTDIR=$FAKE_ROOTif [ $? -gt 0 ]then echo "Fake root install failed, stopping." exit 1fi## Fill in some details, like prefix and sysconfdirfor confvar in prefix exec_prefix bindir sbindir libexecdir datadir mandir sysconfdir piddirdo eval $confvar=`grep "^$confvar=" Makefile | cut -d = -f 2`done## 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 correctlysed -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}[ "${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 PrintMotdperl -p -i -e "s/#PrintMotd yes/PrintMotd no/" \ $FAKE_ROOT/${sysconfdir}/sshd_config# We don't want to overwrite config files on multiple installsmv $FAKE_ROOT/${sysconfdir}/ssh_config $FAKE_ROOT/${sysconfdir}/ssh_config.defaultmv $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.defaultcd $FAKE_ROOT## Ok, this is outright wrong, but it will work. I'm tired of pkgmk## whining.for i in *; do PROTO_ARGS="$PROTO_ARGS $i=/$i";done## Build info fileecho "Building pkginfo file..."cat > pkginfo << _EOFPKG=$PKGNAMENAME="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"ARCH=$ARCHVERSION=$VERSIONCATEGORY="Security,application"BASEDIR=/CLASSES="none"_EOF## Build preinstall fileecho "Building preinstall file..."cat > preinstall << _EOF#! /sbin/sh#[ "\${PRE_INS_STOP}" = "yes" ] && ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} stopexit 0_EOF## Build postinstall fileecho "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} selse [ "$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} lfi# If piddir doesn't exist we add it. (Ie. --with-pid-dir=/var/opt/ssh)[ -d $piddir ] || installf ${PKGNAME} $TEST_DIR$piddir d 755 root sysinstallf -f ${PKGNAME}[ "\${POST_INS_START}" = "yes" ] && ${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} startexit 0_EOF## Build preremove fileecho "Building preremove file..."cat > preremove << _EOF#! /sbin/sh#${TEST_DIR}/etc/init.d/${SYSVINIT_NAME} stopexit 0_EOF## Build request fileecho "Building request file..."cat > request << _EOFtrap 'exit 3' 15USE_SYM_LINKS=noPRE_INS_STOP=noPOST_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 daemonif [ -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 ;; esacelse# 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 ;; esacfi# make parameters available to installation service,# and so to any other packaging scriptscat >\$1 <<!USE_SYM_LINKS='\$USE_SYM_LINKS'PRE_INS_STOP='\$PRE_INS_STOP'POST_INS_START='\$POST_INS_START'!exit 0_EOF## Build space fileecho "Building space file..."cat > 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 prototypeecho "Building prototype file..."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; }_EOFfind . | 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 ${FAKE_ROOT} -f $FAKE_ROOT/prototype -oecho | pkgtrans -os ${FAKE_ROOT} ${START}/$PKGNAME-$UNAME_S-$ARCH-$VERSION.pkgrm -rf $FAKE_ROOT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -