--- builds_bin/update_repos 2012/05/25 17:47:34 1.69 +++ builds_bin/update_repos 2013/09/10 02:26:09 1.73 @@ -14,11 +14,10 @@ umask 002; $| = 1; my %opts; -getopts( 'osqtr:', \%opts ); +getopts( 'ostr:', \%opts ); $opts{r} ||= ''; -my $rpm_flags = RPM2->vsf_nosha1header | RPM2->vsf_nomd5header | RPM2->vsf_nodsaheader | RPM2->vsf_norsaheader; -$rpm_flags |= RPM2->vsf_nosha1 | RPM2->vsf_nomd5 | RPM2->vsf_nodsa | RPM2->vsf_norsa; +my $rpm_flags = RPM2->vsf_nodsaheader | RPM2->vsf_norsaheader | RPM2->vsf_nodsa | RPM2->vsf_norsa; my $osdir = 'SME'; my $disttag = 'sme'; @@ -26,25 +25,25 @@ my $repotag = 'sme'; my @archs = ( 'i386', 'x86_64' ); -my $distrepo = { '7' => { active => 1, - centos => 4, - repo => '/releases/7/', - os => 'RPMS/', - builds => '/builds/smeserver-7-core/', - community => '/builds/smeserver-7-contribs/', - stage => '/stage/7/', +my $distrepo = { '8' => { active => 1, + centos => 5, + repo => '/build/smeserver/repo/8/', + builds => ['/build/builds/smeserver-8-core/'], + community => '/build/builds/smeserver-8-contribs/', + stage => '/build/smeserver/stage/8/', sign => 1, + keyname => 'SME Server 7 signing key ', checksum => 'sha', }, - '8' => { active => 1, - centos => 5, - repo => '/releases/8/', - os => '', - builds => '/builds/smeserver-8-core/', - community => '/builds/smeserver-8-contribs/', - stage => '/stage/8/', + '9' => { active => 1, + centos => 6, + repo => '/build/smeserver/repo/testing/9/', + builds => ['/build/builds/smeserver-9-core/'], + community => '/build/builds/smeserver-9-contribs/', + stage => '/build/smeserver/stage/9/', sign => 1, - checksum => 'sha', + keyname => 'SME Server 7 signing key ', + checksum => 'sha256', }, }; @@ -65,27 +64,27 @@ my $repos = { "${repotag}os" 'stage' => { prio => 1, inc => 0, ver => 0, rel => 0, stage => 1, os => 1 }, }; -my $baserepo = { "~S${repotag}os/~A/$osdir/~O" => "${repotag}os", - "~S${repotag}updates/~A/RPMS/" => "${repotag}updates", - "~S${repotag}updates-testing/~A/RPMS/" => "${repotag}updates-testing", - "~S${repotag}extras/~A/RPMS/" => "${repotag}extras", - "~S${repotag}addons/~A/RPMS/" => "${repotag}addons", - "~S${repotag}contribs/~A/RPMS/" => "${repotag}contribs", - "~S${repotag}test/~A/RPMS/" => "${repotag}test", - "~S${repotag}dev/~A/RPMS/" => "${repotag}dev", - "/stage/~s/~A/$osdir/~O" => 'stage', - '/mirrors/centos/~C/fasttrack/~A/RPMS/' => 'centos', - '/mirrors/centos/~C/updates/~A/RPMS/' => 'centos', - '/mirrors/centos/~C/os/~A/CentOS/~O' => 'centos', - '/mirrors/centos/~C/extras/~A/RPMS/' => 'centos', - '/mirrors/centos-vault/~C/fasttrack/~A/RPMS/' => 'centos', - '/mirrors/centos-vault/~C/updates/~A/RPMS/' => 'centos', - '/mirrors/centos-vault/~C/os/~A/CentOS/~O' => 'centos', - '/mirrors/centos-vault/~C/extras/~A/RPMS/' => 'centos', +my $baserepo = { "~S${repotag}os/~A/" => "${repotag}os", + "~S${repotag}updates/~A/" => "${repotag}updates", + "~S${repotag}updates-testing/~A/" => "${repotag}updates-testing", + "~S${repotag}extras/~A/" => "${repotag}extras", + "~S${repotag}addons/~A/" => "${repotag}addons", + "~S${repotag}contribs/~A/" => "${repotag}contribs", + "~S${repotag}test/~A/" => "${repotag}test", + "~S${repotag}dev/~A/" => "${repotag}dev", + "/build/smeserver/stage/~s/~A/" => 'stage', + '/mirrors/centos/~C/fasttrack/~A/' => 'centos', + '/mirrors/centos/~C/updates/~A/' => 'centos', + '/mirrors/centos/~C/os/~A/' => 'centos', + '/mirrors/centos/~C/extras/~A/' => 'centos', + '/mirrors/centos-vault/~C/fasttrack/~A/' => 'centos', + '/mirrors/centos-vault/~C/updates/~A/' => 'centos', + '/mirrors/centos-vault/~C/os/~A/' => 'centos', + '/mirrors/centos-vault/~C/extras/~A/' => 'centos', '/mirrors/fedora/epel/~C/~A/' => 'epel', '/mirrors/fedora/epel/testing/~C/~A/' => 'epel', - '/mirrors/rpmforge/redhat/el~C/en/~A/dag/RPMS/' => 'rpmforge', - '/mirrors/rpmforge/redhat/el~C/en/~A/extras/RPMS/' => 'rpmforge', + '/mirrors/rpmforge/redhat/el~C/en/~A/dag/' => 'rpmforge', + '/mirrors/rpmforge/redhat/el~C/en/~A/extras/' => 'rpmforge', '/mirrors/rpmforge/source/' => 'rpmforge', '/mirrors/atrpms/el~C-~A/atrpms/stable/' => 'atrpms', '/mirrors/atrpms/el~C-~A/atrpms/testing/' => 'atrpms', @@ -93,23 +92,15 @@ my $baserepo = { "~S${repotag}os/~A/$osd '/mirrors/atrpms/src/el~C-~A/atrpms/testing/' => 'atrpms', }; -if ( $opts{q} ) { - $baserepo->{'/mirrors/centos-qa/CentOS/~C/fasttrack/~A/RPMS/'} = 'centos'; - $baserepo->{'/mirrors/centos-qa/CentOS/~C/updates/~A/RPMS/'} = 'centos'; - $baserepo->{'/mirrors/centos-qa/CentOS/~C/os/~A/CentOS/~O'} = 'centos'; - $baserepo->{'/mirrors/centos-qa/CentOS/~C/extras/~A/RPMS/'} = 'centos'; -} - -my $skippkg = { '7' => { 'centos' => { map { $_ => 1 } ( 'horde', 'imp-h3', 'ingo-h3', 'turba-h3' ) }, - 'epel' => { map { $_ => 1 } ( 'clamav', 'fping', 'ocsinventory', 'perl-Compress-Bzip2', 'perl-Compress-Raw-Zlib', 'perl-Compress-Raw-Bzip2', 'perl-Crypt-OpenSSL-Bignum', 'perl-Crypt-OpenSSL-Random', 'perl-Crypt-OpenSSL-RSA', 'perl-DateTime', 'perl-Razor-Agent', 'perl-Text-Iconv' ) }, - 'rpmforge' => { map { $_ => 1 } ( 'dovecot', 'mod_auth_tkt', 'perl-Test-Inline', 'perl-libwww-perl', 'spamassassin' ) }, - 'atrpms' => { map { $_ => 1 } ( 'check4updates', 'dovecot', 'trac', 'yum' ) }, - }, - '8' => { 'atrpms' => { map { $_ => 1 } ( 'gnupg' ) }, +my $skippkg = { '8' => { 'atrpms' => { map { $_ => 1 } ( 'clamav', 'gnupg' ) }, 'centos' => { map { $_ => 1 } ( 'horde', 'imp-h3', 'ingo-h3', 'turba-h3' ) }, 'epel' => { map { $_ => 1 } ( 'clamav', 'fping', 'html2ps', 'horde', 'libtalloc', 'libtdb', 'oidentd', 'perl-Compress-Bzip2', 'perl-Compress-Raw-Zlib', 'perl-Compress-Raw-Bzip2', 'perl-Crypt-OpenSSL-Bignum', 'perl-Crypt-OpenSSL-Random', 'perl-Crypt-OpenSSL-RSA', 'perl-Razor-Agent', 'smolt' ) }, 'rpmforge' => { map { $_ => 1 } ( 'dovecot', 'libtalloc', 'mod_auth_tkt', 'perl-Test-Inline', 'spamassassin' ) }, }, + '9' => { 'atrpms' => { map { $_ => 1 } ( 'clamav', 'perl-Pod-Escapes', 'perl-Pod-Simple' ) }, + 'epel' => { map { $_ => 1 } ( 'oidentd', 'perl-Razor-Agent' ) }, + 'rpmforge' => { map { $_ => 1 } ( 'perl-CGI', 'perl-Compress-Raw-Zlib', 'perl-ExtUtils-ParseXS', 'perl-Pod-Escapes', 'perl-Pod-Simple', 'perl-Time-HiRes', 'perl-version', 'spamassassin' ) }, + }, }; my ($stage) = sort { $repos->{$a}->{stage} <=> $repos->{$b}->{stage} } grep { $repos->{$_}->{stage} } keys %$repos; @@ -127,25 +118,38 @@ foreach my $ver ( sort { $a <=> $b } key foreach my $dir ( sort { $repos->{$baserepo->{$b}}->{prio} <=> $repos->{$baserepo->{$a}}->{prio} || $a cmp $b } keys %$baserepo ) { my $bdir = $dir; - $bdir =~ s/~O/$distrepo->{$ver}->{os}/; $bdir =~ s/~S/$distrepo->{$ver}->{repo}/; $bdir =~ s/~s/$ver/; $bdir =~ s/~C/$distrepo->{$ver}->{centos}/; for my $arch ( @archs, 'SRPMS/' ) { my $adir = $bdir; if ( $arch eq 'SRPMS/' ) { - $adir =~ s/~A.*/$arch/; + $adir =~ s/~A.*//; + if ( -d "${adir}SRPMS" ) { + $adir .= "SRPMS/"; + } elsif ( -d "${adir}Source/SPackages" ) { + $adir .= "Source/SPackages/"; + } } else { $adir =~ s/~A/$arch/; + if ( -d "${adir}RPMS" ) { + $adir .= "RPMS/"; + } elsif ( -d "${adir}Packages" ) { + $adir .= "Packages/"; + } elsif ( -d "${adir}CentOS" ) { + $adir .= "CentOS/"; + } elsif ( -d "${adir}$osdir" ) { + $adir .= "$osdir/"; + } } - opendir DIR, $adir or next; next unless -d $adir; + opendir DIR, $adir or next; process_rpm("$adir$_", $ver, $baserepo->{$dir}) foreach readdir DIR; closedir DIR; last unless $dir =~ m{~A}; } } - find( { wanted => sub { process_rpm($_, $ver, 'builds'); }, no_chdir => 1, follow_fast => 1 }, $distrepo->{$ver}->{'builds'} ); + find( { wanted => sub { process_rpm($_, $ver, 'builds'); }, no_chdir => 1, follow_fast => 1 }, "$_" ) foreach @{$distrepo->{$ver}->{'builds'}}; find( { wanted => sub { process_rpm($_, $ver, 'community'); }, no_chdir => 1, follow_fast => 1 }, $distrepo->{$ver}->{'community'} ) if $distrepo->{$ver}->{'community'}; foreach my $base ( sort keys %$rpms ) { @@ -237,7 +241,7 @@ foreach my $ver ( sort { $a <=> $b } key } elsif ( $repos->{$cmp->{repo}}->{orig} ) { $orig{$cmp->{nvra}}++; unless ( $repos->{$cmp->{repo}}->{base} ) { - my $tag = sprintf '%s%s/%s-%s', $distrepo->{$ver}->{$cmp->{repo}}, $cmp->{name}, $cmp->{ver}, $cmp->{rel}; + my $tag = dirname(dirname($cmp->{rpm}->{filename})); qx(touch $tag/PUSHED) if ! $opts{t} && -d $tag && ! -f "$tag/PUSHED"; } } elsif ( $cmp->{src} ) { @@ -288,7 +292,7 @@ foreach my $ver ( sort { $a <=> $b } key if ( $repos->{$cmp->{repo}}->{orig} ) { $orig{$cmp->{nvra}}++; unless ( $repos->{$cmp->{repo}}->{base} ) { - my $tag = sprintf '%s%s/%s-%s', $distrepo->{$ver}->{$cmp->{repo}}, $cmp->{name}, $cmp->{ver}, $cmp->{rel}; + my $tag = dirname(dirname($cmp->{rpm}->{filename})); qx(touch $tag/PUSHED) if ! $opts{t} && -d $tag && ! -f "$tag/PUSHED"; } } elsif ( $cmp->{src} && $reposrc{$cmp->{repo}} ) { @@ -325,7 +329,7 @@ foreach my $ver ( sort { $a <=> $b } key unless ( $cmp->{src} && ! $reposrc{$dest} ) { if ( $repos->{$dest}->{prio} >= $repos->{$track{repo}}->{prio} && ! verrel($cmp, $dest, \%counts) ) { unless ( $repos->{$cmp->{repo}}->{base} ) { - my $tag = sprintf '%s%s/%s-%s', $distrepo->{$ver}->{$cmp->{repo}}, $cmp->{name}, $cmp->{ver}, $cmp->{rel}; + my $tag = dirname(dirname($cmp->{rpm}->{filename})); qx(touch $tag/PUSHED) if ! $opts{t} && -d $tag && ! -f "$tag/PUSHED"; } push @{$cmp->{repos}}, $dest; @@ -391,22 +395,23 @@ foreach my $ver ( sort { $a <=> $b } key push @{$pkg->{repos}}, $stage; } } - if ( ! $print && ($pkg->{delete} || $pkg->{repos} || ( $pkg->{nosig} && $distrepo->{$ver}->{sign} ) ) ) { - print "\n$base ($disttag$ver)\n", "=" x length("$base ($disttag$ver)"), "\n"; - $print++; - } - my $src = $pkg->{rpm}->filename; - if ( $pkg->{nosig} && $distrepo->{$ver}->{sign} ) { - print "sign package (", basename($pkg->{rpm}->filename), ")\n"; - unless ( $opts{t} ) { - qx(cat $HOME/.rpmpass | setsid rpm --addsign $src >& /dev/null); - if ($?) { - print " * failed to sign package\n"; - next; - } - } - } + if ( ! $print && ($pkg->{delete} || $pkg->{repos} || ( ! $repos->{$pkg->{repo}}->{base} && $pkg->{nosig} && $distrepo->{$ver}->{sign} ) ) ) { + print "\n$base ($disttag$ver)\n", "=" x length("$base ($disttag$ver)"), "\n"; + $print++; + } + + my $src = $pkg->{rpm}->filename; + if ( ! $repos->{$pkg->{repo}}->{base} && $pkg->{nosig} && $distrepo->{$ver}->{sign} ) { + print "sign package (", basename($pkg->{rpm}->filename), ")\n"; + unless ( $opts{t} ) { + qx(cat $HOME/.rpmpass | setsid rpm -D '_gpg_name $distrepo->{$ver}->{keyname}' --addsign $src >& /dev/null); + if ($?) { + print " * failed to sign package\n"; + next; + } + } + } if ( $pkg->{repos} ) { foreach my $repo ( @{$pkg->{repos}} ) { @@ -425,7 +430,7 @@ foreach my $ver ( sort { $a <=> $b } key my @d = (); my $head = $distrepo->{$ver}->{repo} . $repo . '/'; $head = $distrepo->{$ver}->{stage} if $repos->{$repo}->{stage}; - my $tail = $repos->{$repo}->{os} ? "$osdir/" . $distrepo->{$ver}->{os} : 'RPMS/'; + my $tail = $repos->{$repo}->{os} ? "$osdir/" : 'RPMS/'; if ( $pkg->{src} ) { push @d, "${head}SRPMS/" . basename($pkg->{rpm}->filename); } elsif ( $pkg->{rpm}->arch eq 'noarch' ) { @@ -446,7 +451,7 @@ foreach my $ver ( sort { $a <=> $b } key qx(rm -f $src) unless $opts{t}; $repochg{$pkg->{repo}}++ unless $repos->{$pkg->{repo}}->{base} || $repos->{$pkg->{repo}}->{stage}; if ( $repos->{$pkg->{repo}}->{orig} && ! $repos->{$pkg->{repo}}->{base} ) { - my $tag = sprintf '%s%s/%s-%s', $distrepo->{$ver}->{$pkg->{repo}}, $pkg->{name}, $pkg->{ver}, $pkg->{rel}; + my $tag = dirname(dirname($pkg->{rpm}->{filename})); qx(rm -f $tag/PUSHED) if ! $opts{t} && -d $tag && -f "$tag/PUSHED"; } } @@ -476,16 +481,21 @@ foreach my $ver ( sort { $a <=> $b } key foreach my $arch ( @archs ) { my $dir = $distrepo->{$ver}->{repo} . "$repo/$arch"; $dir = qx(readlink -f $dir); - chomp $dir; + if ( $dir ) { + chomp $dir; + } else { + $dir = $distrepo->{$ver}->{repo} . "$repo/$arch"; + } print "rebuild $repo/$arch\n"; unless ( $opts{t} ) { my $checksum = "--checksum $distrepo->{$ver}->{checksum}"; my $exclude = ""; - $exclude = "--exclude *smeserver-release*.rpm" if $dir =~ m{test/|-testing/}; + $exclude .= " --exclude ${osdir}/*" if -d "$dir/Packages"; + $exclude .= " --exclude *smeserver-release*.rpm" if $dir =~ m{test/|-testing/}; my $groupfile = ""; - $groupfile = "--groupfile repodata/comps.xml" if -f "$dir/repodata/comps.xml"; + $groupfile = "--simple-md-filenames --groupfile repodata/comps.xml" if -f "$dir/repodata/comps.xml"; qx(createrepo --update --database --exclude *.src.rpm --exclude *-debuginfo-*.rpm $checksum $exclude $groupfile $dir); qx(repoview $dir); @@ -499,7 +509,10 @@ foreach my $ver ( sort { $a <=> $b } key } } unless ( $opts{t} ) { - finddepth(sub{rmdir}, $distrepo->{$ver}->{builds}) if -d "$distrepo->{$ver}->{builds}"; + foreach (@{$distrepo->{$ver}->{builds}}) + { + finddepth(sub{rmdir}, "$_") if -d "$_"; + } finddepth(sub{rmdir}, $distrepo->{$ver}->{community}) if -d "$distrepo->{$ver}->{community}"; } } @@ -548,8 +561,13 @@ sub process_rpm { eval { $pkg = RPM2->open_package($rpm, $rpm_flags); }; if ($@) { print " * corrupt package ($rpm)\n"; return; } eval { my $sig = $pkg->siggpg }; - my $nosig = ! $@; - + + my $nosig = 1; + eval { my $sig = $pkg->dsaheader }; $nosig &= ! $@; + eval { my $sig = $pkg->rsaheader }; $nosig &= ! $@; + eval { my $sig = $pkg->siggpg }; $nosig &= ! $@; + eval { my $sig = $pkg->sigpgp }; $nosig &= ! $@; + my $cmp = $latest{$pkg->name}; if ( $repos->{$repo}->{base} && ! $pkg->is_source_package ) { return unless $cmp; @@ -557,7 +575,7 @@ sub process_rpm { } my ($src, $version, $release) = ($pkg->is_source_package ? $pkg->filename : $pkg->sourcerpm) =~ m{(?:^|/)([^/]*)-([^-]+)-([^-]+)\.\w+\.rpm$}; return if $skippkg->{$ver}->{$repo} && ( $skippkg->{$ver}->{$repo}->{$src} || $skippkg->{$ver}->{$repo}->{$pkg->name} ); - return if $repos->{$repo}->{base} && $nosig && $baserepo->{$ver}->{sign}; + return if $repos->{$repo}->{base} && $nosig && $baserepo->{$ver}->{sign}; if ( $nosig && ! -f "$HOME/.rpmpass" ) { print " * missing signature (" .$pkg->filename . ")\n"; return; } my $arch = 'unknown'; $arch = 'SRPMS' if $pkg->filename =~ m{[/-](SRPMS?|src|source)/};