]> TLD Linux GIT Repositories - TLD.git/blobdiff - pld-builder.new/client/make-request.sh
- from https://github.com/pld-linux/pld-builder.new
[TLD.git] / pld-builder.new / client / make-request.sh
diff --git a/pld-builder.new/client/make-request.sh b/pld-builder.new/client/make-request.sh
new file mode 100755 (executable)
index 0000000..35b94f9
--- /dev/null
@@ -0,0 +1,788 @@
+#!/bin/sh
+
+# prevent "*" from being expanded in builders var
+set -f
+
+builders=
+with=
+without=
+flags=
+command=
+command_flags=
+gpg_opts=
+default_branch='HEAD'
+dist=
+url=
+no_depend=no
+verbose=no
+autotag=no
+
+if [ -x /usr/bin/python ]; then
+       send_mode="python"
+else
+       echo "No python present, using mail mode"
+       send_mode="mail"
+fi
+
+if [ -n "$HOME_ETC" ]; then
+       USER_CFG=$HOME_ETC/.requestrc
+else
+       USER_CFG=$HOME/.requestrc
+fi
+
+if [ ! -f "$USER_CFG" ]; then
+       echo "Creating config file $USER_CFG. You *must* edit it."
+       cat > $USER_CFG <<EOF
+priority=2
+requester=deviloper@pld-linux.org
+default_key=deviloper@pld-linux.org
+send_mode="$send_mode"
+url="$url"
+mailer="/usr/sbin/sendmail -t"
+gpg_opts=""
+dist=th
+url="http://src.th.pld-linux.org:1234/"
+
+# defaults:
+f_upgrade=yes
+EOF
+exit
+fi
+
+if [ -f "$USER_CFG" ]; then
+       . $USER_CFG
+       # legacy fallback
+       if [ "${distro:+set}" = "set" ]; then
+               dist=$distro
+       fi
+fi
+
+# internal options, not to be overriden
+specs=
+df_fetch=no
+upgrade_macros=no
+
+# Set colors
+c_star=$(tput setaf 2)
+c_red=$(tput setaf 1)
+c_norm=$(tput op)
+msg() {
+       echo >&2 "${c_star}*${c_norm} $*"
+}
+red() {
+       echo "${c_red}$*${c_norm}"
+}
+
+die() {
+       echo >&2 "$0: $*"
+       exit 1
+}
+
+send_request() {
+       # switch to mail mode, if no url set
+       [ -z "$url" ] && send_mode="mail"
+
+       case "$send_mode" in
+       "mail")
+               msg "Sending using mail mode"
+               cat - | $mailer
+               ;;
+       *)
+               msg "Sending using http mode to $url"
+               cat - | python -c '
+import sys, socket, urllib2
+
+try:
+        data = sys.stdin.read()
+        url = sys.argv[1]
+        socket.setdefaulttimeout(10)
+        req = urllib2.Request(url, data)
+        f = urllib2.urlopen(req)
+        f.close()
+except Exception, e:
+        print >> sys.stderr, "Problem while sending request via HTTP: %s: %s" % (url, e)
+        sys.exit(1)
+print >> sys.stdout, "Request queued via HTTP."
+' "$url"
+               ;;
+       esac
+}
+
+# simple df_fetcher, based on packages/fetchsrc_request
+# TODO: tcp (smtp) mode
+# TODO: adjust for ~/.requestrc config
+df_fetch() {
+       local specs="$@"
+
+       # Sending by
+       local MAILER='/usr/sbin/sendmail'
+       # MAILER='/usr/bin/msmtp'
+       # Sending via
+       local VIA="SENDMAIL"
+       #VIA="localhost"
+       local VIA_ARGS=""
+       #VIA_ARGS="some additional flags"
+       # e.g. for msmtp:
+       # VIA_ARGS='-a gmail'
+       #
+       # DISTFILES EMAIL
+       local DMAIL="distfiles@pld-linux.org"
+
+       local HOST=$(hostname -f)
+       local LOGIN=${requester%@*}
+
+       for spec in $specs; do
+               local SPEC=$(echo "$spec" | sed -e 's|:.*||')
+               local BRANCH=$(echo "$spec" | sed -e 's|.*:||')
+               echo >&2 "Distfiles Request: $SPEC:$BRANCH via $MAILER ${VIA_ARGS:+ ($VIA_ARGS)}"
+               cat <<-EOF | "$MAILER" -t -i $VIA_ARGS
+                       To: $DMAIL
+                       From: $LOGIN <$LOGIN@$HOST>
+                       Subject: fetchsrc_request notify
+                       X-CVS-Module: SPECS
+                       X-distfiles-request: yes
+                       X-Login: $LOGIN
+                       X-Spec: $SPEC
+                       X-Branch: $BRANCH
+                       X-Flags: force-reply
+
+                       .
+                       EOF
+       done
+}
+
+# autotag from rpm-build-macros
+# displays latest used tag for a specfile
+autotag() {
+       local out s
+       for s in "$@"; do
+               # strip branches
+               s=${s%:*}
+               # ensure package ends with .spec
+               s=${s%.spec}.spec
+               out=$(cvs status -v $s | awk "!/Sticky/&&/auto-$dist-/{if (!a++) print \$1}")
+               echo "$s:$out"
+       done
+}
+
+# get autotag for specs
+# WARNING: This may checkout some files from CVS
+get_autotag() {
+       local pkg spec rpmdir
+
+       rpmdir=$(rpm -E %_topdir)
+       cd $rpmdir
+       for pkg in "$@"; do
+               # strip branches
+               pkg=${pkg%:*}
+               # strip .spec extension
+               pkg=${pkg%.spec}
+               # checkout only if missing
+               if [ ! -e $pkg/$pkg.spec ]; then
+                       $rpmdir/builder -g $pkg -ns -r HEAD 1>&2
+               fi
+               if [ ! -e $pkg/$pkg.spec ]; then
+                       # just print it out, to fallback to base pkg name
+                       echo "$pkg"
+               else
+                       autotag $pkg/$pkg.spec
+               fi
+       done
+}
+
+usage() {
+       cat <<EOF
+Usage: make-request.sh [OPTION] ... [SPECFILE] ....
+
+Mandatory arguments to long options are mandatory for short options too.
+
+      --config-file /path/to/config/file
+            Source additional config file (after $USER_CFG), useful when
+            when sending build requests to Ac/Th from the same account
+      -a
+            Try to use latest auto-tag for the spec when building
+            WARNING: This will checkout new files to your packages dir
+      -b 'BUILDER BUILDER ...',  --builder='BUILDER BUILDER ...'
+            Sends request to given builders (in 'version-arch' format)
+      --with VALUE, --without VALUE
+            Build package with(out) a given bcond
+      --kernel VALUE
+            set alt_kernel to VALUE
+      --target VALUE
+            set --target to VALUE
+      -s BUILD_ID, --skip BUILD_ID[,BUILD_ID][,BUILD_ID]
+            mark build ids on src builder to be skipped
+      --branch VALUE
+            specify default branch for specs in request
+      -t, --test-build
+            Performs a 'test-build'. Package will be uploaded to hidden .test-builds/
+            ftp tree and won't be upgraded on builders.
+      -r, --ready-build
+            Preforms a 'ready' build. Package will be built and uploaded to test/ ftp tree
+            (and later moved by release manager staff to ready/ and main ftp tree)
+      -u, --upgrade
+            Forces package upgrade (for use with -c or -q, not -t)
+      -n, --no-upgrade
+            Disables package upgrade (for use with -r)
+      -ni, --no-install-br
+            Do not install missing BuildRequires (--nodeps)
+      -nd, --no-depend
+            Do not add dependency of build jobs, each job in batch runs itself
+      -j, --jobs
+            Number of parallel jobs for single build
+      -f, --flag
+      -d, --dist DISTRIBUTION_ID
+            Specify value for \$dist
+      -df,  --distfiles-fetch[-request] PACKAGE
+            Send distfiles request to fetch sources for PACKAGE
+      -cf, --command-flag
+            Not yet documented
+      -c, --command
+            Executes a given command on builders (prepended to build jobs if build jobs included)
+      -C, --post-command
+            Executes a given command on builders (appended to build jobs if build jobs included)
+      --test-remove-pkg
+            shortcut for --command poldek -evt ARGS
+      --remove-pkg
+            shortcut for --command poldek -ev --noask ARGS
+      --upgrade-pkg
+            shortcut for --command poldek --up -Uv ARGS
+      --pull
+            Updates builders infrastructure (outside chroot)
+      --update-macros
+            Updates rpm-build-macros on src builder
+      -q
+            shortcut for --command rpm -q ARGS
+      -g, --gpg-opts "opts"
+            Pass additional options to gpg binary
+      -p, --priority VALUE
+            sets request priority (default 2)
+      -h, --help
+            Displays this help message
+EOF
+       exit 0
+}
+
+# validate distro, set $dist
+set_dist() {
+       case "$1" in
+       ac)
+               ;;
+       ac-java|ac-xen)
+               ;;
+       ti)
+               ;;
+       ti-dev)
+               ;;
+       th)
+               ;;
+       th-java)
+               ;;
+       aidath)
+               ;;
+       *)
+               die "dist \`$1' not known"
+               ;;
+       esac
+
+       dist=$1
+}
+
+while [ $# -gt 0 ] ; do
+       case "$1" in
+               -d | --dist | --distro)
+                       set_dist $2
+                       shift
+                       ;;
+
+               --config-file)
+                       [ -f "$2" ] && . $2 || die "Config file not found"
+                       shift
+                       ;;
+
+               --builder | -b)
+                       for b in $2; do
+                               builders="$builders ${b%:*}"
+                       done
+                       shift
+                       ;;
+
+               -a)
+                       autotag=yes
+                       ;;
+
+               --with)
+                       with="$with $(echo "$2" | tr ',' ' ')"
+                       shift
+                       ;;
+
+               --without)
+                       without="$without $(echo "$2" | tr ',' ' ')"
+                       shift
+                       ;;
+
+               --test-build | -t)
+                       build_mode=test
+                       f_upgrade=no
+                       ;;
+
+               --kernel)
+                       kernel=$2
+                       shift
+                       ;;
+
+               --target)
+                       target=$2
+                       shift
+                       ;;
+
+               -s|--skip)
+                       skip="$2"
+                       shift
+                       ;;
+
+               --branch)
+                       branch=$2
+                       shift
+                       ;;
+
+               --priority | -p)
+                       priority=$2
+                       shift
+                       ;;
+
+               --ready-build | -r)
+                       build_mode=ready
+                       ;;
+
+               --upgrade | -u)
+                       f_upgrade=yes
+                       ;;
+
+               --no-upgrade | -n)
+                       f_upgrade=no
+                       ;;
+
+               --no-depend | -nd)
+                       no_depend=yes
+                       ;;
+
+               --no-install-br | -ni)
+                       flags="$flags no-install-br"
+                       ;;
+
+               -j | --jobs)
+                       jobs="$2"
+                       shift
+                       ;;
+
+               -j*)
+                       jobs="${1#-j}"
+                       ;;
+
+               -v)
+                       verbose=yes
+                       ;;
+
+               --flag | -f)
+                       flags="$flags $2"
+                       shift
+                       ;;
+
+               --command-flags | -cf)
+                       command_flags="$2"
+                       shift
+                       ;;
+
+               --command | -c)
+                       command="$2"
+                       if [ "$command" = - ]; then
+                               echo >&2 "Reading command from STDIN"
+                               echo >&2 "---"
+                               command=$(cat)
+                               echo >&2 "---"
+                       fi
+                       shift
+                       ;;
+               --post-command | -C)
+                       post_command="$2"
+                       if [ "$post_command" = - ]; then
+                               echo >&2 "Reading post_command from STDIN"
+                               echo >&2 "---"
+                               post_command=$(cat)
+                               echo >&2 "---"
+                       fi
+                       shift
+                       ;;
+               --test-remove-pkg)
+                       command="poldek -evt $2"
+                       f_upgrade=no
+                       shift
+                       ;;
+               --remove-pkg)
+                       command="for a in $2; do poldek -ev --noask \$a; done"
+                       f_upgrade=no
+                       shift
+                       ;;
+               --upgrade-pkg|-Uhv)
+                       command="poldek --up; poldek -uv $2"
+                       f_upgrade=no
+                       shift
+                       ;;
+               -q)
+                       command="rpm -q $2"
+                       f_upgrade=no
+                       shift
+                       ;;
+
+               --pull)
+                       command_flags="no-chroot"
+                       command="git pull"
+                       f_upgrade=no
+                       ;;
+
+               --update-macros)
+                       upgrade_macros="yes"
+                       ;;
+
+               -df | --distfiles-fetch | --distfiles-fetch-request)
+                       df_fetch=yes
+                       ;;
+
+               --gpg-opts | -g)
+                       gpg_opts="$2"
+                       shift
+                       ;;
+
+               --help | -h)
+                       usage
+                       ;;
+
+               -*)
+                       die "unknown knob: $1"
+                       ;;
+
+               *:* | *)
+                       specs="$specs $1"
+                       ;;
+       esac
+       shift
+done
+
+case "$dist" in
+ac)
+       builder_email="builder-ac@pld-linux.org"
+       default_builders="ac-*"
+       default_branch="AC-branch"
+       url="http://ep09.pld-linux.org:1289/"
+       control_url="http://ep09.pld-linux.org/~buildsrc"
+       ;;
+ac-java) # fake "dist" for java available ac architectures
+       builder_email="builder-ac@pld-linux.org"
+       default_builders="ac-i586 ac-i686 ac-athlon ac-amd64"
+       default_branch="AC-branch"
+       url="http://ep09.pld-linux.org:1289/"
+       ;;
+ac-xen) # fake "dist" for xen-enabled architectures
+       builder_email="builder-ac@pld-linux.org"
+       default_builders="ac-i686 ac-athlon ac-amd64"
+       default_branch="AC-branch"
+       ;;
+ti)
+       builder_email="builderti@ep09.pld-linux.org"
+       default_builders="ti-*"
+       url="http://ep09.pld-linux.org:1231/"
+       control_url="http://ep09.pld-linux.org/~builderti"
+       ;;
+ti-dev)
+       builder_email="buildertidev@ep09.pld-linux.org"
+       default_builders="ti-dev-*"
+       url="http://ep09.pld-linux.org:1232/"
+       control_url="http://ep09.pld-linux.org/~buildertidev"
+       ;;
+th)
+       builder_email="builderth@pld-linux.org"
+       default_builders="th-*"
+       url="http://src.th.pld-linux.org:1234/"
+       control_url="http://src.th.pld-linux.org"
+       ;;
+th-java) # fake "dist" for java available th architectures
+       builder_email="builderth@pld-linux.org"
+       default_builders="th-x86_64 th-athlon th-i686"
+       url="http://src.th.pld-linux.org:1234/"
+       ;;
+aidath)
+       builder_email="builderaidath@ep09.pld-linux.org"
+       default_builders="aidath-*"
+       ;;
+*)
+       die "dist \`$dist' not known"
+       ;;
+esac
+
+# need to do this after dist selection
+if [ "$skip" ]; then
+       skip=$(skip="$skip" control_url="$control_url" python -c '
+import urllib2
+import sys
+import StringIO
+import gzip
+import re
+import os
+import string
+from xml.dom import minidom
+
+skip = os.environ.get("skip").split(",");
+control_url = os.environ.get("control_url")
+
+print >> sys.stderr, "* Check queue_id-s against %s" % control_url
+
+try:
+       headers = { "Cache-Control": "no-cache", "Pragma": "no-cache" }
+       req = urllib2.Request(url=control_url + "/queue.gz", headers=headers)
+       f = urllib2.urlopen(req)
+except Exception, e:
+       print >> sys.stderr, "Fetch error %s: %s" % (control_url + "/queue.gz", e)
+       sys.exit(1)
+
+sio = StringIO.StringIO()
+sio.write(f.read())
+f.close()
+sio.seek(0)
+f = gzip.GzipFile(fileobj = sio)
+
+xml = re.compile("(<queue>.*?</queue>)", re.DOTALL).match(f.read()).group(1)
+d = minidom.parseString(xml)
+
+q = []
+for c in d.documentElement.childNodes:
+       if c.nodeName != "group":
+               continue
+       q.append(c.attributes["id"].value)
+
+err = 0
+for s in skip:
+       if s not in q:
+               print >> sys.stderr, "- Check %s: ERROR: Not valid queue-id" % s
+               err = 1
+       else:
+               print >> sys.stderr, "- Check %s: OK" % s
+if err == 1:
+       sys.exit(1)
+print string.join(skip, ",")
+') || exit $?
+       f_upgrade=no
+       build_mode=test
+       priority=-1
+       command="skip:$skip"
+       command_flags="no-chroot"
+       builders="$dist-src"
+fi
+
+branch=${branch:-$default_branch}
+
+specs=`for s in $specs; do
+       case "$s" in
+       ^)
+               # skip marker - pass it along
+               echo $s
+               ;;
+       *.spec:*) # spec with branch
+               basename $s
+               ;;
+       *.spec) # spec without branch
+               echo $(basename $s):$branch
+               ;;
+       *:*) # package name with branch
+               basename $s | sed -e 's/:/.spec:/'
+               ;;
+       *) # just package name
+               echo $(basename $s).spec:$branch
+               ;;
+       esac
+done`
+
+if [ "$autotag" = "yes" ]; then
+       msg "Auto autotag build enabled"
+       specs=$(get_autotag $specs)
+fi
+
+if [ "$df_fetch" = "yes" ]; then
+       df_fetch $specs
+       exit 0
+fi
+
+if [ "$upgrade_macros" = "yes" ]; then
+       command="poldek --up; poldek -uv rpm-build-macros"
+       builders="$dist-src"
+       f_upgrade=no
+       build_mode=test
+fi
+
+if [[ "$requester" != *@* ]] ; then
+       requester="$requester@pld-linux.org"
+fi
+
+if [ -z "$builders" ] ; then
+       builders="$default_builders"
+fi
+
+if [ "$f_upgrade" = "yes" ] ; then
+       flags="$flags upgrade"
+fi
+
+if [ "$build_mode" = "test" ] ; then
+       if [ "$f_upgrade" = "yes" ] ; then
+               die "--upgrade and --test-build are mutually exclusive"
+       fi
+       flags="$flags test-build"
+fi
+
+if [ -z "$build_mode" ] ; then
+       # missing build mode, builders go crazy when you proceed"
+       die "please specify build mode"
+fi
+
+
+ok=
+for s in $specs; do
+       ok=1
+done
+
+if [ -z "$specs" -a -z "$command" ]; then
+       die "no packages to build or command to invoke specified"
+fi
+
+id=$(uuidgen)
+
+gen_req() {
+       echo "<group id='$id' no='0' flags='$flags'>"
+       echo "  <time>$(date +%s)</time>"
+       msg "Using priority $priority"
+       echo "  <priority>$priority</priority>"
+       if [ -n "$jobs" ]; then
+               msg "Using jobs $jobs"
+               echo "  <maxjobs>$jobs</maxjobs>"
+       fi
+       if [ -z "$url" ]; then
+               msg "Using email $builder_email"
+       else
+               msg "Using URL $url"
+       fi
+
+       if [ "$build_mode" = "ready" ]; then
+               msg "Build mode: $(tput setaf 2)$build_mode$c_norm"
+       else
+               msg "Build mode: $(tput setaf 3)$build_mode$c_norm"
+       fi
+
+       msg "Queue-ID: $id"
+       echo
+
+       # job to depend on
+       local depend=
+       local b i=1
+       local name branch builders_xml
+
+       for b in $builders; do
+               msg "Builder: $(red $b)"
+               builders_xml="$builders_xml <builder>$b</builder>"
+       done
+
+       if [ "$command" ]; then
+               bid=$(uuidgen)
+               echo -E >&2 "* Command: $command"
+               echo "  <batch id='$bid' depends-on=''>"
+               echo "           <command flags='$command_flags'>"
+               echo -E "$command" | sed -e 's,&,\&amp;,g;s,<,\&lt;,g;s,>,\&gt;,g'
+               echo "</command>"
+               echo "           <info></info>"
+               echo "$builders_xml"
+               echo "  </batch>"
+               depend=$bid
+       fi
+
+       if [ "$f_upgrade" = "yes" ] ; then
+               msg "Upgrade mode: $f_upgrade"
+       fi
+
+       for s in $specs; do
+               # skip marker
+               if [ "$s" = "^" ]; then
+                       depend=
+                       continue
+               fi
+               if [ "$no_depend" = yes ]; then
+                       depend=
+               fi
+               bid=$(uuidgen)
+               echo "  <batch id='$bid' depends-on='$depend'>"
+
+               name=$(echo "$s" | sed -e 's|:.*||')
+               branch=$(echo "$s" | sed -e 's|.*:||')
+               msg "Adding #$i $name:$branch${kernel:+ alt_kernel=$kernel}${target:+ target=$target}${depend:+ depends on $depend}"
+               echo "           <spec>$name</spec>"
+               echo "           <branch>$branch</branch>"
+               echo "           ${kernel:+<kernel>$kernel</kernel>}"
+               echo "           ${target:+<target>$target</target>}"
+               echo "           <info></info>"
+               echo
+               for b in $with; do
+                       echo "           <with>$b</with>"
+               done
+               for b in $without; do
+                       echo "           <without>$b</without>"
+               done
+               echo
+               echo "$builders_xml"
+               echo "  </batch>"
+               i=$((i+1))
+
+               # let next job depend on previous
+               depend=$bid
+       done
+
+       if [ "$post_command" ]; then
+               bid=$(uuidgen)
+               if [ "$no_depend" = yes ]; then
+                       depend=
+               fi
+               echo -E >&2 "* Post-Command: $post_command"
+               echo "  <batch id='$bid' depends-on='$depend'>"
+               echo "           <command flags='$command_flags'>"
+               echo -E "$post_command" | sed -e 's,&,\&amp;,g;s,<,\&lt;,g;s,>,\&gt;,g'
+               echo "</command>"
+               echo "           <info></info>"
+               echo "$builders_xml"
+               echo "  </batch>"
+               depend=$bid
+       fi
+
+       echo "</group>"
+}
+
+gen_email () {
+       # make request first, so the STDERR/STDOUT streams won't be mixed
+       local tmp req
+       tmp=$(mktemp)
+       gen_req > $tmp
+
+       if [ "$verbose" = "yes" ]; then
+               cat $tmp >&2
+       fi
+
+       cat <<-EOF
+       From: $requester
+       To: $builder_email
+       Subject: build request
+       Message-Id: <$id@$(hostname)>
+       X-New-PLD-Builder: request
+       X-Requester-Version: \$Id$
+
+       EOF
+
+       gpg --clearsign --default-key $default_key $gpg_opts --output=- $tmp
+       rm -f $tmp
+}
+
+gen_email | send_request