Hello community,
here is the log from the commit of package build for openSUSE:Factory checked in at 2018-04-06 17:41:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/build (Old)
and /work/SRC/openSUSE:Factory/.build.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "build"
Fri Apr 6 17:41:04 2018 rev:114 rq:593183 version:20180329
Changes:
--------
--- /work/SRC/openSUSE:Factory/build/build.changes 2018-02-14 09:17:26.918300139 +0100
+++ /work/SRC/openSUSE:Factory/.build.new/build.changes 2018-04-06 17:41:08.745698941 +0200
@@ -1,0 +2,10 @@
+Tue Apr 3 11:30:47 UTC 2018 - adrian@suse.de
+
+- KIWI: Support OBS-Profiles kiwi annotation
+ kiwi profile filtering
+- Switch to a little perl http server to get rid of the python2 dependency
+- Avoid Ubuntu 18.04 uncompress failure messages
+- Don't rely on AppImage's auto-detection for architecture
+- build-recipe-livebuild: count ONIE images as build results
+
+-------------------------------------------------------------------
Old:
----
obs-build-20180209.tar.gz
New:
----
obs-build-20180329.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ build.spec ++++++
--- /var/tmp/diff_new_pack.99hJQo/_old 2018-04-06 17:41:16.501418827 +0200
+++ /var/tmp/diff_new_pack.99hJQo/_new 2018-04-06 17:41:16.501418827 +0200
@@ -20,9 +20,9 @@
Name: build
Summary: A Script to Build SUSE Linux RPMs
-License: GPL-2.0+ and GPL-2.0
+License: GPL-2.0-or-later AND GPL-2.0-only
Group: Development/Tools/Building
-Version: 20180209
+Version: 20180329
Release: 0
Source: obs-build-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -53,6 +53,7 @@
Recommends: perl(YAML::LibYAML)
Recommends: bsdtar
Recommends: qemu-linux-user
+Recommends: /sbin/mkfs.ext3
%endif
%if 0%{?suse_version} > 1120 || ! 0%{?suse_version}
++++++ PKGBUILD ++++++
--- /var/tmp/diff_new_pack.99hJQo/_old 2018-04-06 17:41:16.541417382 +0200
+++ /var/tmp/diff_new_pack.99hJQo/_new 2018-04-06 17:41:16.545417238 +0200
@@ -1,5 +1,5 @@
pkgname=build
-pkgver=20180209
+pkgver=20180329
pkgrel=0
pkgdesc="Build packages in sandbox"
arch=('i686' 'x86_64')
++++++ build.dsc ++++++
--- /var/tmp/diff_new_pack.99hJQo/_old 2018-04-06 17:41:16.581415938 +0200
+++ /var/tmp/diff_new_pack.99hJQo/_new 2018-04-06 17:41:16.585415793 +0200
@@ -1,6 +1,6 @@
Format: 1.0
Source: build
-Version: 20180209
+Version: 20180329
Binary: build
Maintainer: Adrian Schroeter
Architecture: all
++++++ debian.changelog ++++++
--- /var/tmp/diff_new_pack.99hJQo/_old 2018-04-06 17:41:16.613414782 +0200
+++ /var/tmp/diff_new_pack.99hJQo/_new 2018-04-06 17:41:16.613414782 +0200
@@ -1,4 +1,4 @@
-build (20180209) unstable; urgency=low
+build (20180329) unstable; urgency=low
* Update to current git trunk
- add sles11sp2 build config and adapt autodetection
++++++ obs-build-20180209.tar.gz -> obs-build-20180329.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/Build/Deb.pm new/obs-build-20180329/Build/Deb.pm
--- old/obs-build-20180209/Build/Deb.pm 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/Build/Deb.pm 2018-03-29 17:01:40.000000000 +0200
@@ -186,18 +186,22 @@
local (*TMP, *TMP2);
open(TMP, "+>", undef) or die("could not open tmpfile\n");
syswrite TMP, $data;
- sysseek(TMP, 0, 0);
my $pid = open(TMP2, "-|");
die("fork: $!\n") unless defined $pid;
if (!$pid) {
open(STDIN, "<&TMP");
+ seek(STDIN, 0, 0); # these two lines are a workaround for a perl bug mixing up FD
+ sysseek(STDIN, 0, 0);
exec($tool);
die("$tool: $!\n");
}
close(TMP);
$data = '';
1 while sysread(TMP2, $data, 1024, length($data)) > 0;
- close(TMP2) || die("$tool error\n");
+ if (!close(TMP2)) {
+ warn("$tool error: $?\n");
+ return undef;
+ }
return $data;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/Build/Docker.pm new/obs-build-20180329/Build/Docker.pm
--- old/obs-build-20180209/Build/Docker.pm 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/Build/Docker.pm 2018-03-29 17:01:40.000000000 +0200
@@ -39,7 +39,7 @@
if ($q ne "'" && $str =~ /\$/) {
$str =~ s/\$([a-zA-Z0-9_]+|\{([^\}]+)\})/join(' ', @{$vars->{$2 || $1} || []})/ge;
}
- $str =~ s/([ \t\"\'\$])/sprintf("%%%02X", ord($1))/ge;
+ $str =~ s/([ \t\"\'\$\(\)])/sprintf("%%%02X", ord($1))/ge;
return $str;
}
@@ -180,7 +180,7 @@
}
} elsif ($cmd eq 'RUN') {
$line =~ s/#.*//; # get rid of comments
- for my $l (split(/(?:\||\|\||\&|\&\&|;)/, $line)) {
+ for my $l (split(/(?:\||\|\||\&|\&\&|;|\)|\()/, $line)) {
$l =~ s/^\s+//;
$l =~ s/\s+$//;
@args = split(/[ \t]+/, $l);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/Build/Kiwi.pm new/obs-build-20180329/Build/Kiwi.pm
--- old/obs-build-20180209/Build/Kiwi.pm 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/Build/Kiwi.pm 2018-03-29 17:01:40.000000000 +0200
@@ -55,7 +55,7 @@
}
sub kiwiparse {
- my ($xml, $arch, $count) = @_;
+ my ($xml, $arch, $count, $buildflavor) = @_;
$count ||= 0;
die("kiwi config inclusion depth limit reached\n") if $count++ > 10;
@@ -73,8 +73,13 @@
my $schemaversion56 = versionstring('5.6');
my $obsexclusivearch;
my $obsexcludearch;
+ my $obsprofiles;
$obsexclusivearch = $1 if $xml =~ /^\s*<!--\s+OBS-ExclusiveArch:\s+(.*)\s+-->\s*$/im;
$obsexcludearch = $1 if $xml =~ /^\s*<!--\s+OBS-ExcludeArch:\s+(.*)\s+-->\s*$/im;
+ $obsprofiles = $1 if $xml =~ /^\s*<!--\s+OBS-Profiles:\s+(.*)\s+-->\s*$/im;
+ if ($obsprofiles) {
+ $obsprofiles = [ grep {defined($_)} map {$_ eq '@BUILD_FLAVOR@' ? $buildflavor : $_} split(' ', $obsprofiles) ];
+ }
my $kiwi = Build::SimpleXML::parse($xml);
die("not a kiwi config\n") unless $kiwi && $kiwi->{'image'};
$kiwi = $kiwi->{'image'}->[0];
@@ -85,6 +90,32 @@
if (!$ret->{'name'} && $description->{'specification'}) {
$ret->{'name'} = $description->{'specification'}->[0]->{'_content'};
}
+
+ # do obsprofiles arch filtering
+ if ($obsprofiles && $arch && $kiwi->{'profiles'} && $kiwi->{'profiles'}->[0]->{'profile'}) {
+ my %obsprofiles = map {$_ => 1} @$obsprofiles;
+ for my $prof (@{$kiwi->{'profiles'}[0]->{'profile'}}) {
+ next unless $prof->{'name'} && exists $obsprofiles{$prof->{'name'}};
+ my $valid;
+ if ($prof->{'arch'}) {
+ my $ma = $arch;
+ $ma =~ s/i[456]86/i386/;
+ for my $pa (split(",", $prof->{'arch'})) {
+ $pa =~ s/i[456]86/i386/;
+ $valid = 1 if $ma eq $pa;
+ }
+ } else {
+ $valid = 1;
+ }
+ if ($valid) {
+ $obsprofiles{$prof->{'name'}} = 2;
+ } elsif ($obsprofiles{$prof->{'name'}} == 1) {
+ $obsprofiles{$prof->{'name'}} = 0;
+ }
+ }
+ $obsprofiles = [ grep {$obsprofiles{$_}} @$obsprofiles ];
+ }
+
# take default version setting
my $preferences = ($kiwi->{'preferences'} || []);
if ($preferences->[0]->{'version'}) {
@@ -92,6 +123,10 @@
}
my $containerconfig;
for my $pref (@{$preferences || []}) {
+ if ($obsprofiles && $pref->{'profiles'}) {
+ my %obsprofiles = map {$_ => 1} @$obsprofiles;
+ next unless grep {$obsprofiles{$_}} split(",", $pref->{'profiles'});
+ }
for my $type (@{$pref->{'type'} || []}) {
next unless @{$pref->{'type'}} == 1 || !$type->{'optional'};
if (defined $type->{'image'}) {
@@ -137,7 +172,7 @@
my ($bootxml, $xsrc) = $bootcallback->($1, $2);
next unless $bootxml;
push @extrasources, $xsrc if $xsrc;
- my $bret = kiwiparse($bootxml, $arch, $count);
+ my $bret = kiwiparse($bootxml, $arch, $count, $buildflavor);
push @bootrepos, map {"$_->{'project'}/$_->{'repository'}"} @{$bret->{'path'} || []};
push @packages, @{$bret->{'deps'} || []};
push @extrasources, @{$bret->{'extrasource'} || []};
@@ -233,6 +268,15 @@
my $patterntype;
for my $packages (@{$kiwi->{'packages'}}) {
next if $packages->{'type'} && $packages->{'type'} ne 'image' && $packages->{'type'} ne 'bootstrap';
+ # we could skip the sections also when no profile is used,
+ # but don't to stay backward compatible
+ if ($obsprofiles && $packages->{'profiles'}) {
+ my %obsprofiles = map {$_ => 1} @$obsprofiles;
+ my @section_profiles = split(",", $packages->{'profiles'});
+
+ next unless grep {$obsprofiles{$_}} @section_profiles;
+ }
+
$patterntype ||= $packages->{'patternType'};
push @pkgs, @{$packages->{'package'}} if $packages->{'package'};
for my $pattern (@{$kiwi->{'namedCollection'} || []}) {
@@ -349,6 +393,13 @@
$containertags = [ "$containername:latest" ] if defined($containername) && !$containertags;
$ret->{'container_tags'} = $containertags if $containertags;
}
+ if ($obsprofiles) {
+ if (@$obsprofiles) {
+ $ret->{'profiles'} = [ unify(@$obsprofiles) ];
+ } else {
+ $ret->{'exclarch'} = []; # all profiles excluded
+ }
+ }
return $ret;
}
@@ -363,7 +414,7 @@
$cf ||= {};
my $d;
eval {
- $d = kiwiparse($xml, ($cf->{'arch'} || ''));
+ $d = kiwiparse($xml, ($cf->{'arch'} || ''), 0, $cf->{'buildflavor'});
};
if ($@) {
my $err = $@;
@@ -374,11 +425,16 @@
}
sub show {
- my ($fn, $field, $arch) = @ARGV;
+ my ($fn, $field, $arch, $buildflavor) = @ARGV;
local $urlmapper = sub { return $_[0] };
my $cf = {'arch' => $arch};
+ $cf->{'buildflavor'} = $buildflavor if defined $buildflavor;
my $d = parse($cf, $fn);
die("$d->{'error'}\n") if $d->{'error'};
+ if ($field eq 'profiles' && $d->{'exclarch'} && !@{$d->{'exclarch'}}) {
+ print "__excluded\n";
+ return;
+ }
my $x = $d->{$field};
$x = [ $x ] unless ref $x;
print "@$x\n";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/Makefile new/obs-build-20180329/Makefile
--- old/obs-build-20180209/Makefile 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/Makefile 2018-03-29 17:01:40.000000000 +0200
@@ -73,6 +73,7 @@
build-validate-params \
openstack-console \
startdockerd \
+ dummyhttpserver \
obs-docker-support \
$(DESTDIR)$(pkglibdir)
install -m755 emulator/emulator.sh $(DESTDIR)$(pkglibdir)/emulator/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/build-recipe-appimage new/obs-build-20180329/build-recipe-appimage
--- old/obs-build-20180209/build-recipe-appimage 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/build-recipe-appimage 2018-03-29 17:01:40.000000000 +0200
@@ -91,7 +91,7 @@
release_option="--release $RELEASE"
fi
- chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && /usr/lib/appimagetool/pkg2appimage $release_option" - root \
+ chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && ARCH=$ARCH /usr/lib/appimagetool/pkg2appimage $release_option" - root \
|| cleanup_and_exit 1
# extract build result basenames
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/build-recipe-kiwi new/obs-build-20180329/build-recipe-kiwi
--- old/obs-build-20180209/build-recipe-kiwi 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/build-recipe-kiwi 2018-03-29 17:01:40.000000000 +0200
@@ -373,7 +373,6 @@
# XXX: again?
chroot "$BUILD_ROOT" chown -R abuild.abuild "$TOPDIR"
chroot "$BUILD_ROOT" rm -rf "$TOPDIR/KIWIROOT"
-set -x
if test -x "$BUILD_ROOT/usr/bin/product-builder"; then
# current implementation of product generation
chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/bin/product-builder --root $TOPDIR/KIWIROOT $VERBOSE_OPTION --logfile terminal --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true
@@ -392,7 +391,6 @@
chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/sbin/kiwi --root $TOPDIR/KIWIROOT $VERBOSE_OPTION --logfile terminal -p $TOPDIR/SOURCES --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true
fi
fi
-set +x
# move created product to destination
# NOTE: older kiwi versions exit also in error case with 0
@@ -486,7 +484,7 @@
}
# translate kiwi8 parameters to kiwi9
-translate_kiwi_parameters() {
+kiwi_translate_parameters() {
local i lasti
local add_repo_url=() add_repo_type=() add_repo_alias=() add_repo_priority=()
local set_repo_url set_repo_type set_repo_alias set_repo_priority
@@ -543,6 +541,10 @@
fi
}
+kiwi_query_recipe() {
+ perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show "$BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE" "$1" "${BUILD_ARCH%%:*}" "$BUILD_FLAVOR"
+}
+
build_kiwi_appliance() {
if test -z "$RUNNING_IN_VM" ; then
# NOTE: this must be done with the outer system, because it loads
@@ -551,13 +553,21 @@
test -x /etc/init.d/boot.device-mapper && \
/etc/init.d/boot.device-mapper start
fi
- local kiwi_profile=$(queryconfig \
- --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" \
- --archpath "$BUILD_ARCH" buildflags kiwiprofile
- )
+ local kiwi_profile
+ kiwi_profile=$(kiwi_query_recipe profiles)
+ if test -z "$kiwi_profile"; then
+ kiwi_profile=$(queryconfig \
+ --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" \
+ --archpath "$BUILD_ARCH" buildflags kiwiprofile
+ )
+ fi
if test -z "$kiwi_profile"; then
kiwi_profile=__not__set
fi
+ if test "$kiwi_profile" = __excluded ; then
+ cleanup_and_exit 1 "none of the selected profiles can be built on this architecture"
+ fi
+
local kiwi_path=/usr/bin/kiwi kiwi_legacy=false
if ! test -L "$BUILD_ROOT/usr/bin/kiwi" ; then
kiwi_path=/usr/sbin/kiwi
@@ -565,7 +575,7 @@
fi
if test "$kiwi_legacy" != true ; then
- translate_kiwi_parameters
+ kiwi_translate_parameters
fi
local run_bundle=true
@@ -588,11 +598,15 @@
}
recipe_build_kiwi() {
- imagetype=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE imagetype)
- imagename=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE filename)
- imageversion=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE version)
- drop_repo=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE drop_repository)
+ imagetype=$(kiwi_query_recipe imagetype)
+ imagename=$(kiwi_query_recipe filename)
+ imageversion=$(kiwi_query_recipe version)
+ drop_repo=$(kiwi_query_recipe drop_repository)
+ if test -z "$imagetype" ; then
+ cleanup_and_exit 1 "no imagetype set for this architecture/profile"
+ fi
+
# prepare rpms as source and createrepo on the repositories
ln -sf $TOPDIR/SOURCES/repos $BUILD_ROOT/repos
test -d $BUILD_ROOT/$TOPDIR/SOURCES/containers && ln -sf $TOPDIR/SOURCES/containers $BUILD_ROOT/containers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/build-recipe-livebuild new/obs-build-20180329/build-recipe-livebuild
--- old/obs-build-20180209/build-recipe-livebuild 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/build-recipe-livebuild 2018-03-29 17:01:40.000000000 +0200
@@ -223,6 +223,9 @@
*.iso)
build_results="${build_results}\n${i%%.iso}"
;;
+ *ONIE.bin)
+ build_results="${build_results}\n${i%%ONIE.bin}"
+ ;;
*.img)
build_results="${build_results}\n${i%%.img}"
;;
@@ -242,12 +245,18 @@
cleanup_and_exit 1 "No live-build result found"
fi
- # move created products (and their metadata files) to destination
+ # move created products (and their metadata files) to destination and
+ # create sha256 hashsums
local buildnum="${RELEASE:+-Build${RELEASE}}"
for prefix in $(echo -e ${build_results} | sort | uniq) ; do
for f in ${prefix}.* ; do
mv ${f} \
$BUILD_ROOT/$TOPDIR/OTHER/${prefix##*/}${buildnum}${f#${prefix}}
+ # change directory to avoid having full path in hashsum file
+ pushd $BUILD_ROOT/$TOPDIR/OTHER >/dev/null
+ /usr/bin/sha256sum "${prefix##*/}${buildnum}${f#${prefix}}" > \
+ "${prefix##*/}${buildnum}${f#${prefix}}".sha256
+ popd >/dev/null
BUILD_SUCCEEDED=true
done
done
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/build-vm new/obs-build-20180329/build-vm
--- old/obs-build-20180209/build-vm 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/build-vm 2018-03-29 17:01:40.000000000 +0200
@@ -516,6 +516,9 @@
BUILD_ROOT=/
BUILD_DIR=/.build
echo "machine type: `uname -m`"
+ echo "Linux version: `uname -rv`"
+ echo "Increasing log level from now on..."
+ echo 4 > /proc/sysrq-trigger
if test "$PERSONALITY" != 0 -a -z "$PERSONALITY_SET" ; then
export PERSONALITY_SET=true
echo "switching personality to $PERSONALITY..."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/dist/build.spec new/obs-build-20180329/dist/build.spec
--- old/obs-build-20180209/dist/build.spec 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/dist/build.spec 2018-03-29 17:01:40.000000000 +0200
@@ -53,6 +53,7 @@
Recommends: perl(YAML::LibYAML)
Recommends: bsdtar
Recommends: qemu-linux-user
+Recommends: /sbin/mkfs.ext3
%endif
%if 0%{?suse_version} > 1120 || ! 0%{?suse_version}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/dummyhttpserver new/obs-build-20180329/dummyhttpserver
--- old/obs-build-20180209/dummyhttpserver 1970-01-01 01:00:00.000000000 +0100
+++ new/obs-build-20180329/dummyhttpserver 2018-03-29 17:01:40.000000000 +0200
@@ -0,0 +1,191 @@
+#!/usr/bin/perl
+
+# dead-simple HTTP server
+# serves current directory on localhost:80
+
+use Socket;
+use POSIX;
+use Fcntl qw(:DEFAULT :flock);
+
+use strict;
+
+$| = 1;
+
+my ($build_root, $dir) = @ARGV;
+
+if (defined($build_root)) {
+ chroot($build_root) || die("chroot $build_root: $!\n");
+ chdir('/') || die("chdir /: $!\n");
+}
+if (defined($dir)) {
+ chdir($dir) || die("chdir $dir: $!\n");
+}
+
+my $tcpproto = getprotobyname('tcp');
+my $acceptsock;
+socket($acceptsock , PF_INET, SOCK_STREAM, $tcpproto) || die "socket: $!\n";
+setsockopt($acceptsock, SOL_SOCKET, SO_REUSEADDR, pack("l",1));
+bind($acceptsock, sockaddr_in(80, inet_aton('127.0.0.1'))) || die "bind: $!\n";
+listen($acceptsock , 512) || die "listen: $!\n";
+
+my $sock;
+my $status;
+
+sub reply {
+ my ($str, @hdrs) = @_;
+ if (@hdrs && $hdrs[0] =~ /^status: ((\d+).*)/i) {
+ $status = $2;
+ $hdrs[0] = "HTTP/1.1 $1";
+ $hdrs[0] =~ s/:/ /g;
+ } else {
+ $status = 200;
+ unshift @hdrs, "HTTP/1.1 200 OK";
+ }
+ push @hdrs, "Cache-Control: no-cache";
+ push @hdrs, "Connection: close";
+ push @hdrs, "Content-Length: ".length($str) if defined($str);
+ my $data = join("\r\n", @hdrs)."\r\n\r\n";
+ $data .= $str if defined $str;
+ fcntl($sock, F_SETFL,O_NONBLOCK);
+ my $dummy = '';
+ 1 while sysread($sock, $dummy, 1024, 0);
+ fcntl($sock, F_SETFL,0);
+ my $l;
+ while (length($data)) {
+ $l = syswrite($sock, $data, length($data));
+ die("write error: $!\n") unless $l;
+ $data = substr($data, $l);
+ }
+}
+
+sub reply_error {
+ my ($errstr) = @_;
+ my $code = 400;
+ my $tag = 'Error';
+ if ($errstr =~ /^(\d+)\s+([^\r\n]*)/) {
+ $code = $1;
+ $tag = $2;
+ } elsif ($errstr =~ /^([^\r\n]+)/) {
+ $tag = $1;
+ }
+ reply("$errstr\n", "Status: $code $tag", 'Content-Type: text/plain');
+}
+
+sub readrequest {
+ my $qu = '';
+ my $request;
+
+ while (1) {
+ if ($qu =~ /^(.*?)\r?\n/s) {
+ $request = $1;
+ last;
+ }
+ die($qu eq '' ? "empty query\n" : "received truncated query\n") if !sysread($sock, $qu, 1024, length($qu));
+ }
+ my ($act, $path, $vers, undef) = split(' ', $request, 4);
+ die("400 No method name\n") if !$act;
+ if ($vers) {
+ die("501 Unsupported method: $act\n") if $act ne 'GET' && $act ne 'HEAD';
+ # read in all headers
+ while ($qu !~ /^(.*?)\r?\n\r?\n(.*)$/s) {
+ die("501 received truncated query\n") if !sysread($sock, $qu, 1024, length($qu));
+ }
+ $qu =~ /^(.*?)\r?\n\r?\n(.*)$/s; # redo regexp to work around perl bug
+ $qu = $2;
+ } else {
+ die("501 Bad method, must be GET\n") if $act ne 'GET';
+ $qu = '';
+ }
+ my $query_string = '';
+ if ($path =~ /^(.*?)\?(.*)$/) {
+ $path = $1;
+ $query_string = $2;
+ }
+ $path =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge; # unescape path
+ die("501 invalid path\n") unless $path =~ /^\//s; # forbid relative paths
+ die("501 invalid path\n") if $path =~ /\0/s;
+ # do simple path substitutions
+ while (1) {
+ next if $path =~ s!//!/!;
+ next if $path =~ s!/\.(?:/|$)!/!;
+ next if $path =~ s!/[^/]+/..(?:/|$)!/!;
+ next if $path =~ s!/..(?:/|$)!/!;
+ last;
+ }
+ return ($path, $query_string, $qu);
+}
+
+sub escape {
+ my ($d) = @_;
+ $d =~ s/&/&/sg;
+ $d =~ s/</sg;
+ $d =~ s/>/>/sg;
+ $d =~ s/"/"/sg;
+ return $d;
+}
+
+while (1) {
+ my $peeraddr = accept($sock, $acceptsock);
+ next unless $peeraddr;
+ my $pid = fork();
+ last if defined($pid) && !$pid;
+ close $sock;
+ 1 while waitpid(-1, POSIX::WNOHANG) > 0;
+}
+close($acceptsock);
+
+my $path = '?';
+eval {
+ ($path) = readrequest();
+ my $lpath = ".$path";
+ if (-d $lpath) {
+ if ($path !~ /\/$/) {
+ my $rpath = "$path/";
+ $rpath =~ s/([\000-\040<>;\"#\?&\+=%[\177-\377])/sprintf("%%%02X",ord($1))/sge;
+;
+ reply('', 'Status: 301 Moved Permanently', "Location: $rpath");
+ } else {
+ my %d;
+ my $dir;
+ if (opendir($dir, $lpath)) {
+ %d = map {$_ => 1} readdir($dir);
+ closedir($dir);
+ }
+ delete $d{'.'};
+ delete $d{'..'};
+ my $body = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\"><html>\n";
+ $body .= "<title>Directory listing for ".escape($path)."</title>\n";
+ $body .= "<body>\n";
+ $body .= "<h2>Directory listing for ".escape($path)."</h2>\n";
+ $body .= "<hr>\n<ul>\n";
+ $body .= "<li>".escape($_)."</a>\n" for sort keys %d;
+ $body .= "</ul>\n<hr>\n</body>\n</html>\n";
+ reply($body, 'Content-type: text/html');
+ }
+ } elsif (-e _) {
+ my $f;
+ open($f, '<', $lpath) || die("500 $lpath: $!\n");
+ my @s = stat($f);
+ die("stat: $!\n") unless @s;
+ my $l = $s[7];
+ reply(undef, "Content-Length: $l", 'Content-Type: application/octet-stream');
+ my $data;
+ while (1) {
+ last unless $l;
+ my $r = sysread($f, $data, 8192);
+ $data = substr($data, 0, $l) if length($data) > $l;
+ $l -= length($data);
+ while (length($data)) {
+ my $l2 = syswrite($sock, $data, length($data));
+ die("socket write: $!\n") unless $l2;
+ $data = substr($data, $l2);
+ }
+ }
+ close($f);
+ } else {
+ die("404 File not found\n");
+ }
+};
+reply_error($@) if $@;
+close $sock;
+print "[$status $path]";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/obs-docker-support new/obs-build-20180329/obs-docker-support
--- old/obs-build-20180209/obs-docker-support 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/obs-docker-support 2018-03-29 17:01:40.000000000 +0200
@@ -46,7 +46,7 @@
esac
done
case $cmd in
- in|install|rm|remove|up|update)
+ in|install|rm|remove|up|update|if|info)
exec /usr/bin/zypper -D $LOCAL_REPOS_D "${globalopts[@]}" "$cmd" "$@"
;;
ar|addrepo)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/openstack-console new/obs-build-20180329/openstack-console
--- old/obs-build-20180209/openstack-console 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/openstack-console 2018-03-29 17:01:40.000000000 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
################################################################
#
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-build-20180209/startdockerd new/obs-build-20180329/startdockerd
--- old/obs-build-20180209/startdockerd 2018-02-09 17:00:36.000000000 +0100
+++ new/obs-build-20180329/startdockerd 2018-03-29 17:01:40.000000000 +0200
@@ -153,7 +153,7 @@
if test -n "$WEBSERVER" ; then
echo "Starting local repository server"
- chroot $BUILD_ROOT bash -c "cd $WEBSERVER && python -m SimpleHTTPServer 80 &"
+ $BUILD_DIR/dummyhttpserver "$BUILD_ROOT" "$WEBSERVER" &
WEBSERVER_PID=$!
echo "$CONTAINERD_PID $DOCKERD_PID $WEBSERVER_PID" > $BUILD_ROOT/.startdockerd.pids
fi