--- builds_bin/update_repos 2010/11/21 22:12:14 1.61 +++ builds_bin/update_repos 2011/10/04 19:48:59 1.67 @@ -33,6 +33,8 @@ my $distrepo = { '7' => { active => 1 builds => '/builds/smeserver-7-core/', community => '/builds/smeserver-7-contribs/', stage => '/stage/7/', + sign => 1, + checksum => 'sha', }, '8' => { active => 1, centos => 5, @@ -41,17 +43,19 @@ my $distrepo = { '7' => { active => 1 builds => '/builds/smeserver-8-core/', community => '/builds/smeserver-8-contribs/', stage => '/stage/8/', + sign => 1, + checksum => 'sha', }, }; -my $repos = { "${repotag}os" => { prio => 18, inc => 1, ver => 1, rel => 1, os => 1 }, - "${repotag}updates" => { prio => 17, inc => 1, ver => 1, rel => 1 }, - "${repotag}updates-testing" => { prio => 16, inc => 1, ver => 1, rel => 3 }, - "${repotag}extras" => { prio => 15, inc => 0, ver => 1, rel => 1 }, - "${repotag}addons" => { prio => 14, inc => 0, ver => 1, rel => 1 }, - "${repotag}contribs" => { prio => 13, inc => 0, ver => 1, rel => 1 }, - "${repotag}test" => { prio => 12, inc => 0, ver => 2, rel => 3, devel => 2 }, - "${repotag}dev" => { prio => 11, inc => 0, ver => 1, rel => 1, devel => 1 }, +my $repos = { "${repotag}os" => { prio => 19, inc => 1, ver => 1, rel => 1, os => 1 }, + "${repotag}updates" => { prio => 18, inc => 1, ver => 1, rel => 1 }, + "${repotag}updates-testing" => { prio => 17, inc => 1, ver => 1, rel => 3 }, + "${repotag}extras" => { prio => 16, inc => 0, ver => 1, rel => 1 }, + "${repotag}addons" => { prio => 15, inc => 0, ver => 1, rel => 1 }, + "${repotag}contribs" => { prio => 14, inc => 0, ver => 1, rel => 1 }, + "${repotag}test" => { prio => 13, inc => 0, ver => 2, rel => 3, devel => 2 }, + "${repotag}dev" => { prio => 12, inc => 0, ver => 1, rel => 1, devel => 1 }, 'centos' => { prio => 10, inc => 0, ver => 0, rel => 0, orig => 1, base => 1 }, 'epel' => { prio => 9, inc => 0, ver => 0, rel => 0, orig => 1, base => 1 }, 'rpmforge' => { prio => 7, inc => 0, ver => 0, rel => 0, orig => 1, base => 1 }, @@ -74,6 +78,10 @@ my $baserepo = { "~S${repotag}os/~A/$osd '/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', '/mirrors/fedora/epel/~C/~A/' => 'epel', '/mirrors/fedora/epel/testing/~C/~A/' => 'epel', '/mirrors/rpmforge/redhat/el~C/en/~A/dag/RPMS/' => 'rpmforge', @@ -94,13 +102,13 @@ if ( $opts{q} ) { 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 } ( 'mod_auth_tkt', 'perl-Test-Inline', 'spamassassin' ) }, + 'rpmforge' => { map { $_ => 1 } ( 'dovecot', 'mod_auth_tkt', 'perl-Test-Inline', 'spamassassin' ) }, 'atrpms' => { map { $_ => 1 } ( 'check4updates', 'dovecot', 'trac', 'yum' ) }, }, '8' => { 'atrpms' => { map { $_ => 1 } ( 'gnupg' ) }, 'centos' => { map { $_ => 1 } ( 'horde', 'imp-h3', 'ingo-h3', 'turba-h3' ) }, - 'epel' => { map { $_ => 1 } ( 'clamav', 'horde', 'libtalloc', 'libtdb', '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 } ( 'libtalloc', 'mod_auth_tkt', 'perl-Test-Inline', 'spamassassin' ) }, + 'epel' => { map { $_ => 1 } ( 'clamav', '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' ) }, }, }; @@ -160,13 +168,17 @@ foreach my $ver ( sort { $a <=> $b } key # rpmforge (.el4.rf to .rf, with rf,rfb,rft,rfx endings) ($tmp = $pkg->{svr}) =~ s{\.el\d(\.rf[btx]?)$}{$1} && $rpms->{$base}->{vers}->{$tmp} && last SRC; - # rpmforge (.el4.rfx to .rf, with rfb,rft,rfx switched to rf) + # rpmforge (.el4.rfx to .rf, rfb,rft,rfx switched to rf) ($tmp = $pkg->{svr}) =~ s{\.el\d(\.rf)[btx]$}{$1} && $rpms->{$base}->{vers}->{$tmp} && last SRC; + # rpmforge (.el4.rf to .rfx, rf,rfb,rft,rfx switched to rfx) + ($tmp = $pkg->{svr}) =~ s{\.el\d(\.rf)[btx]?$}{$1x} && $rpms->{$base}->{vers}->{$tmp} && last SRC; # rpmforge (.el4.rf to .el5) TODO: remove when no longer needed ($tmp = $pkg->{svr}) =~ s{\.el\d\.rf$}{.el5} && $rpms->{$base}->{vers}->{$tmp} && last SRC; # rpmforge (.2.el4.rf to .rf, minor modification not pushed to source?) TODO: remove when no longer needed ($tmp = $pkg->{svr}) =~ s{\.2\.el\d(\.rf)$}{$1} && $rpms->{$base}->{vers}->{$tmp} && last SRC; + # atrpms (remove .at) + ($tmp = $pkg->{svr}) =~ s{\.at$}{} && $rpms->{$base}->{vers}->{$tmp} && last SRC; # atrpms (remove .el4.at) ($tmp = $pkg->{svr}) =~ s{\.el\d\.at$}{} && $rpms->{$base}->{vers}->{$tmp} && last SRC; # atrpms (remove .el4) @@ -222,26 +234,49 @@ foreach my $ver ( sort { $a <=> $b } key } else { $cmp->{delete}++; } - } elsif ( $repos->{$cmp->{repo}}->{orig}) { + } 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}; qx(touch $tag/PUSHED) if ! $opts{t} && -d $tag && ! -f "$tag/PUSHED"; } - } else { - if ( $cmp->{src} && $cmp->{delete} && $cmp->{oldrepo} && $reposrc{$cmp->{oldrepo}}) { + } elsif ( $cmp->{src} ) { + if ( $cmp->{delete} && $cmp->{oldrepo} && $reposrc{$cmp->{oldrepo}}) { $cmp->{repo} = $cmp->{oldrepo}; delete $cmp->{delete}; } - if ( $cmp->{src} && $reposrc{$cmp->{repo}} ) { + if ( $reposrc{$cmp->{repo}} ) { $reposrc{$cmp->{repo}}->{srpm} = $cmp; $srpm = $cmp if ! $srpm; - } elsif ( $seen{$cmp->{nvra}}->{repo} ne $cmp->{repo} ) { + } elsif ( $seen{$cmp->{nvra}}->{repo} ne $cmp->{repo} && ! $cmp->{done} ) { $cmp->{delete}++; } + } elsif ( $seen{$cmp->{nvra}}->{repo} ne $cmp->{repo} ) { + $cmp->{delete}++; + } + } elsif ( $cmp->{src} ) { + if ( $reposrc{$cmp->{repo}} && $reposrc{$cmp->{repo}}->{srpm} && $reposrc{$cmp->{repo}}->{srpm}->{oldrepo} ne $cmp->{repo} ) { + $acnt->{$cmp->{repo}}->{$cmp->{rpm}->as_nvre}->{src} = [ + grep { $_ ne $reposrc{$cmp->{repo}}->{srpm} } @{$acnt->{$cmp->{repo}}->{$cmp->{rpm}->as_nvre}->{src}} + ]; + + if ( @{$reposrc{$cmp->{repo}}->{srpm}->{repos}} == 1 ) { + $reposrc{$cmp->{repo}}->{srpm}->{repo} = $reposrc{$cmp->{repo}}->{srpm}->{oldrepo}; + delete $reposrc{$cmp->{repo}}->{srpm}->{oldrepo}; + delete $reposrc{$cmp->{repo}}->{srpm}->{delete}; + delete $reposrc{$cmp->{repo}}->{srpm}->{repos}; + delete $reposrc{$cmp->{repo}}->{srpm}->{done}; + $seen{$cmp->{nvra}} = $cmp if $seen{$cmp->{nvra}} eq $reposrc{$cmp->{repo}}->{srpm}; + } else { + warn "How did I get here??"; + } + } else { + $seen{$cmp->{nvra}} = $cmp if $seen{$cmp->{nvra}}->{repo} ne $cmp->{repo}; } + $srpm = $cmp if ! $srpm && $cmp->{src}; + $reposrc{$cmp->{repo}}->{srpm} = $cmp if $reposrc{$cmp->{repo}}; } - } elsif ($repos->{$cmp->{repo}}->{stage} ) { + } elsif ( $repos->{$cmp->{repo}}->{stage} ) { $cmp->{delete}++; } else { $srpm = $cmp if ! $srpm && $cmp->{src}; @@ -313,7 +348,7 @@ foreach my $ver ( sort { $a <=> $b } key $cmp->{latest}++ if ! $seen{$cmp->{nvra}} || $cmp->{src}; } $seen{$cmp->{nvra}} = $cmp unless $seen{$cmp->{nvra}}; - push @{$acnt->{$cmp->{repo}}->{$cmp->{rpm}->as_nvre}->{$cmp->{src} ? 'src' : $cmp->{rpm}->arch}}, $cmp; + push @{$acnt->{$cmp->{repo}}->{$cmp->{rpm}->as_nvre}->{$cmp->{src} ? 'src' : $cmp->{rpm}->arch}}, $cmp unless $cmp->{done}; } $cmp->{done}++; } @@ -350,17 +385,19 @@ foreach my $ver ( sort { $a <=> $b } key foreach my $pkg ( sort { $a->{nvra} cmp $b->{nvra} } @{$rpms->{$base}->{rpms}} ) { if ( $pkg->{latest} && $pkg->{latest} == 1 ) { - $pkg->{oldrepo} = $pkg->{repo} unless $pkg->{oldrepo}; - $pkg->{repo} = $stage; - push @{$pkg->{repos}}, $stage; + unless ( grep { $_->{nvra} eq $pkg->{nvra} && $_->{repo} eq $stage } @{$rpms->{$base}->{rpms}} ) { + $pkg->{oldrepo} = $pkg->{repo} unless $pkg->{oldrepo}; + $pkg->{repo} = $stage; + push @{$pkg->{repos}}, $stage; + } } - if ( ! $print && ($pkg->{delete} || $pkg->{repos} || $pkg->{nosig} ) ) { + 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} ) { + 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); @@ -420,7 +457,7 @@ foreach my $ver ( sort { $a <=> $b } key next if $pkg->{done} || $repos->{$pkg->{repo}}->{orig} || $repos->{$pkg->{repo}}->{base}; $pkg->{delete}++; my $src = $pkg->{rpm}->filename; - if ( ! $print && ($pkg->{delete} || $pkg->{repos} || $pkg->{nosig} ) ) { + if ( ! $print && ($pkg->{delete} || $pkg->{repos} || ( $pkg->{nosig} && $distrepo->{$ver}->{sign} ) ) ) { print "\n$base ($disttag$ver)\n", "=" x length("$base ($disttag$ver)"), "\n"; $print++; } @@ -442,20 +479,17 @@ foreach my $ver ( sort { $a <=> $b } key chomp $dir; print "rebuild $repo/$arch\n"; unless ( $opts{t} ) { - if ( $dir =~ m{test/|-testing/} ) { - if ( -f "$dir/repodata/comps.xml" ) { - qx(createrepo --update --database --exclude *smeserver-release*.rpm --exclude *.src.rpm --exclude *-debuginfo-*.rpm --groupfile repodata/comps.xml $dir); - } else { - qx(createrepo --update --database --exclude *smeserver-release*.rpm --exclude *.src.rpm --exclude *-debuginfo-*.rpm $dir); - } - } else { - if ( -f "$dir/repodata/comps.xml" ) { - qx(createrepo --update --database --exclude *.src.rpm --exclude *-debuginfo-*.rpm --groupfile repodata/comps.xml $dir); - } else { - qx(createrepo --update --database --exclude *.src.rpm --exclude *-debuginfo-*.rpm $dir); - } - } + my $checksum = "--checksum $distrepo->{$ver}->{checksum}"; + + my $exclude = ""; + $exclude = "--exclude *smeserver-release*.rpm" if $dir =~ m{test/|-testing/}; + + my $groupfile = ""; + $groupfile = "--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); + qx(rm -rf $dir/.olddata) if -d "$dir/.olddata"; qx(rm -rf $dir/.repodata) if -d "$dir/.repodata"; qx(rm -rf $dir/repodata/index.html) if -f "$dir/repodata/index.html"; @@ -523,7 +557,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; + 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)/};