tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Binary patch generation script (initial version)



On Sat, May 02, 2009 at 04:25:52AM +0200, Tonnerre LOMBARD wrote:
> Salut,
> 
> Find appended the configure'd version of a preliminary script to
> faciliate patch generation following the methods defined earlier
> in conversations. It's probably ugly, but it's one more quick
> thing, and hey, it works!
> 
> The system variables are mostly determined by the running system,
> which may not always be right - but some build.sh-like flags can
> be passed to overcome this. The OpenSSL key has a default in
> /etc/openssl/private/$OS.pem - e.g. NetBSD.pem - and also doesn't
> need to be passed. The plist file is generated using diff if
> not given; for that to work, the builddir must be kept in the
> same location for both builds.
> 
> The pullup ID is required to retrieve the message. I'm not sure
> there's a better way.
> 
> An example would be:
> 
> mkpatch /usr/oobj/destdir /usr/obj/destdir 423
> 
> It is certainly still going to undergo a lot of work, and your
> input is really valued.
> 
> Now toast. ;-)
> 
>                               Tonnerre

> #!/bin/sh
> #
> # (c) 2009, Tonnerre Lombard <tonnerre%NetBSD.org@localhost>,
> #         The NetBSD Foundation. All rights reserved.
> #
> # Redistribution and use  in source and binary forms,  with or without
> # modification, are  permitted provided that  the following conditions
> # are met:
> #
> # * Redistributions  of source  code must  retain the  above copyright
> #   notice, this list of conditions and the following disclaimer.
> # * 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.
> # * Neither the name of the The NetBSD  Foundation nor the name of its
> #   contributors may  be used to  endorse or promote  products derived
> #   from this software without specific prior written permission.
> #
> # THIS SOFTWARE IS PROVIDED  BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES OF MERCHANTABILITY AND
> # FITNESS FOR A  PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO EVENT SHALL
> # THE  COPYRIGHT  OWNER OR  CONTRIBUTORS  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.
> #
> # $patchadd$
> #

The NetBSD Foundation encourages use of the 2 clause license. This
would be better:

#
# Copyright (c) 2009 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by 
#
# 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.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``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 FOUNDATION OR CONTRIBUTORS
# 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.
#

> ## Basic definitions
> 
> OPENSSL="/usr/bin/openssl"
> TAR="/bin/tar"
> OSABI=`uname -s`
> OSVERS=`uname -r`
> OSARCH=`uname -m`
> BSPATCH="/usr/pkg/bin/bspatch"
> BASENAME="/usr/bin/basename"
> BSDIFF="/usr/pkg/bin/bsdiff"
> CP="/bin/cp"
> MV="/bin/mv"
> RM="/bin/rm"
> MKDIR="/bin/mkdir"
> AWK="gawk"
> LYNX="/usr/pkg/bin/lynx"
> PULLUP_TRACKER_BASE="http://releng.netbsd.org/cgi-bin/req-{}.cgi";

Are you using GNU awk specific constructs? If so, please change them
to one true awk ones.

For pkgsrc-based utilities, you need to make these much more general.
 
> exitcode=0
> 
> ## Actual code
> 
> usage() {
>       echo "$0 [-p <plist-file>] [-m <machine-arch>] [-r <release>]" 1>&2
>       echo "        [-k <keyfile>] <olddir> <builddir> <pullup-id>" 1>&2
>       echo 1>&2
>       echo "    -p plist-file" 1>&2
>       echo "        PLIST file containing a list of files to diff." 1>&2
>       echo "    -k keyfile" 1>&2
>       echo "        Path to the patch signing key." 1>&2
>       echo "    -s os-abi" 1>&2
>       echo "        The OS ABI of the build, if differing." 1>&2
>       echo "    -m machine-arch" 1>&2
>       echo "        The architecture of the build, if differing." 1>&2
>       echo "    -r release" 1>&2
>       echo "        The release of the build, if differing." 1>&2
>       exit 1
> }
> 
> args=`getopt p:k:s:m:r: $*`
> [ $? -eq 0 ] || usage
> 
> set -- $args
> 
> PLIST=''
> KEYFILE=''
> 
> while [ $# -gt 0 ]
> do
>       case "$1" in
>               -p)
>                       PLIST="$2"
>                       shift
>                       ;;
>               -s)
>                       OSABI="$2"
>                       shift
>                       ;;
>               -m)
>                       OSARCH="$2"
>                       shift
>                       ;;
>               -r)
>                       OSVERS="$2"
>                       shift
>                       ;;
>               -k)
>                       KEYFILE="$2"
>                       shift
>                       ;;
>               --)
>                       shift; break
>                       ;;
>       esac
>       shift
> done
> 
> if [ "$#" -lt 3 ]
> then
>       echo "Too few arguments." 1>&2
>       usage
> fi
> 
> OSMAJ=`echo "${OSVERS}" | awk -F. '{ print $1 }'`
> OSFULL=`echo "${OSVERS}" | awk -F_ '{ print $1 }'`
> PULLUP_TRACKER=`echo "${PULLUP_TRACKER_BASE}" | sed -e"s@{}@${OSMAJ}@g"`
> ORIGDIR="$1"
> BUILDDIR="$2"
> PULLUP="$3"
> shift; shift; shift
> 
> if [ -z "${KEYFILE}" ]
> then
>       KEYFILE="/etc/openssl/private/${OSABI}.pem"
> fi
> 
> if [ ! -f "${KEYFILE}" ]
> then
>       echo "Key file ${KEYFILE} not found." 1>&2
>       usage
> fi
> 
> if [ -z "${PLIST}" ]
> then
>       PLIST=`mktemp /tmp/mkpatch-XXXXXX`
>       diff -rq "${ORIGDIR}" "${BUILDDIR}" | sed -e's/^Files //g'      \
>               -e's@ and .* differ$@@g' -e"s@${ORIGDIR}@@g" > "${PLIST}"
> fi
> 
> WRKDIR=`mktemp -d /tmp/mkpatch-XXXXXX`
> OUTDIR=`pwd`
> 
> "${LYNX}" -dump "${PULLUP_TRACKER}?show=${PULLUP}" |  \
>       sed -e '1,/Modified Files:/d' -e                \
>       '/To generate a diff of this commit/,$d' |      \
>       sed -e'1,3d' > "${WRKDIR}/+COMMENT"
> SHORTCOMMENT=`head -1 "${WRKDIR}/+COMMENT"`
> 
> cat << EOT > "${WRKDIR}/+INFO"
> ABI=${OSABI}
> OS_VERSION=${OSFULL}
> MACHINE_ARCH=${OSARCH}
> PATCHTOOLS=0.1
> NAME=${OSFULL}-${PULLUP}
> COMMENT=${SHORTCOMMENT}
> EOT
> 
> (while read file
> do
>       PFILE=`echo "${file}" | tr '/' '_' | sed -e's/^_//'`
>       OSUM=`sha1 -n "${ORIGDIR}/${file}" | awk '{ print $1 }'`
>       NSUM=`sha1 -n "${BUILDDIR}/${file}" | awk '{ print $1 }'`
> 
>       "${BSDIFF}" "${ORIGDIR}/${file}" "${BUILDDIR}/${file}" \
>               "${WRKDIR}/${PFILE}"
>       echo "${file}" "${PFILE}" "${OSUM}" "${NSUM}" "${OSUM}" >>      \
>               "${WRKDIR}/+CONTENTS"
> done) < "${PLIST}"
> 
> (cd "${WRKDIR}"; "${TAR}" cjvf "${OUTDIR}/${OSFULL}-${PULLUP}.tbz" *)
> "${OPENSSL}" smime -sign -binary -outform PEM -signer "${KEYFILE}"    \
>       -in "${OUTDIR}/${OSFULL}-${PULLUP}.tbz" -out                    \
>       "${OUTDIR}/${OSFULL}-${PULLUP}.tbz.sig"

As already indicated, please consider the use of netpgp and the
existing web of trust. There's a package in pkgsrc/security/netpgp.
 
Thanks,
Alistair


Home | Main Index | Thread Index | Old Index