checking in RPM build system
authorivan <ivan>
Wed, 7 Jul 2010 17:51:58 +0000 (17:51 +0000)
committerivan <ivan>
Wed, 7 Jul 2010 17:51:58 +0000 (17:51 +0000)
rpm/build/build-freeside [new file with mode: 0755]
rpm/build/cvs-check-and-build [new file with mode: 0755]
rpm/build/enrpm [new file with mode: 0755]
rpm/build/expect-addsign [new file with mode: 0755]
rpm/build/expect-signrepo [new file with mode: 0755]
rpm/build/ovid2flute [new file with mode: 0755]
rpm/build/refresh-repo [new file with mode: 0755]

diff --git a/rpm/build/build-freeside b/rpm/build/build-freeside
new file mode 100755 (executable)
index 0000000..f17210e
--- /dev/null
@@ -0,0 +1,169 @@
+#!/bin/sh
+#
+# Copyright 2008, Elirion, Inc.  All rights reserved.
+# This software is licensed under the same terms as Freeside itself.
+#
+# This script rebuilds SRPMs of Freeside builds or the required Perl modules on all the target
+# distributions and versions using mock.  After a successful build, it signs the resulting RPMs
+# and scp's them to the server where the yum repositories are hosted.
+# (Of course, koji is supposed to do all this, including updating the repo.)
+
+VERSIONS='1.7 1.9'
+REPO=testing
+BRANCH=
+DISTROS='centos sles'
+CENTOSVERS='4 5'
+SLESVERS=10
+WHICHVERS=
+ARCHS='i386 x86_64'
+MOCKARGS='--autocache'
+
+BUILDSYSDIR=`dirname $0`
+
+if [ -f $HOME/buildsysrc ]; then
+       . $HOME/buildsysrc
+fi
+
+usage() {
+       echo "build-freeside: build RPMs for all target distros and architectures using mock"
+       echo "where:"
+       echo " -a <archs>: change architectures (currently: $ARCHS)"
+       echo " -b <branch>: change branch (currently: $BRANCH)"
+       echo " -d <distros>: change distributions (currently: $DISTROS)"
+       echo " -m <arguments>: change arguments passed to 'mock' (currently: $MOCKARGS)"
+       echo " -r <repo>: change repositories (currently: $REPO)"
+       echo " -s <srpms>: build these SRPMs instead of new ones in staging area"
+       echo " -v <versions>: change versions (currently: $VERSIONS)"
+       echo " -w <distvers>: change distro version (currently: $WHICHVERS)"
+       exit 0
+}
+
+while getopts "a:b:d:hm:r:s:v:w:" flag
+do
+       case $flag in
+               a)
+                       echo "Changing architectures from $ARCHS to $OPTARG"
+                       ARCHS=$OPTARG;;
+               b)
+                       echo "Changing branch from $BRANCH to $OPTARG"
+                       BRANCH=$OPTARG;;
+               d)
+                       echo "Changing distros from $DISTROS to $OPTARG"
+                       DISTROS=$OPTARG;;
+               m)
+                       echo "Changing mock arguments from $MOCKARGS to $OPTARG"
+                       MOCKARGS=$OPTARG;;
+               r)
+                       echo "Changing repository from $REPO to $OPTARG"
+                       REPO=$OPTARG;;
+               s)
+                       echo "Changing SRPMS from $SRPMS to $OPTARG"
+                       SRPMS=$OPTARG;;
+               v)
+                       echo "Changing versions from $VERSIONS to $OPTARG"
+                       VERSIONS=$OPTARG;;
+               w)
+                       echo "Changing which distro versions from $WHICHVERS to $OPTARG"
+                       WHICHVERS=$OPTARG;;
+               *)
+                       usage;;
+       esac
+done
+
+if [ "${SRCFOLDER}x" = "x" ]; then
+       echo "No source folder defined!"
+       exit
+fi
+
+if [ "${REFFOLDER}x" = "x" ]; then
+       echo "No reference folder defined!"
+       exit
+fi
+
+if [ "${SRPMS}x" = "x" ]; then
+       # Work out the new SRPMs on grosbeak
+       SRPMS=`/usr/bin/rsync -Cavz --dry-run $SRCFOLDER/ $REFFOLDER | grep .src.rpm | grep -v safecat | tr '\n' ' '`
+
+       # Go and get the SRPMs
+       /usr/bin/rsync -Cavz $SRCFOLDER/ $REFFOLDER
+fi
+
+# Make sure the SRPMs are there
+for srpm in ${SRPMS}
+do
+       if [ ! -f $REFFOLDER/${srpm} ]
+       then
+               echo "No such file: $REFFOLDER/${srpm}"
+               exit
+       fi
+done
+
+# Build all the SRPMs
+for srpm in ${SRPMS}
+do
+       for distro in $DISTROS
+       do
+               if [ "${WHICHVERS}x" = "x" ]; then
+                       if [ "$distro" = "centos" ]; then
+                               DISTVERS=$CENTOSVERS
+                       fi
+                       if [ "$distro" = "sles" ]; then
+                               DISTVERS=$SLESVERS
+                       fi
+               else
+                       DISTVERS=$WHICHVERS
+               fi
+               for distver in $DISTVERS
+               do
+                       os=${distro}-${distver}
+                       for arch in $ARCHS
+                       do
+                               echo "$os - $arch: $srpm"
+                               time mock $MOCKARGS -r ${os}-${arch} $REFFOLDER/${srpm}
+                               if [ -f /var/lib/mock/${os}-${arch}/state/status ] && grep done /var/lib/mock/${os}-${arch}/state/status
+                               then
+                                       for VERSION in $VERSIONS
+                                       do
+                                               DEST=$VERSION
+                                               if [ "${BRANCH}x" != "x" ]
+                                               then
+                                                       DEST=$BRANCH
+                                               fi
+                                               # Copy freeside RPMs for this version only
+                                               FILES=`ls -1 /var/lib/mock/${os}-${arch}/result/freeside*-${VERSION}-*.rpm | grep -v .src.rpm | tr '\n' ' '`
+                                               echo $FILES
+                                               if [ "${FILES}x" != "x" ]
+                                               then
+                                                       for FILE in $FILES
+                                                       do
+                                                               $BUILDSYSDIR/expect-addsign $FILE
+                                                       done
+                                                       if [ "${REPOMACHINE}x" != "x" ]
+                                                       then
+                                                               scp -p $FILES $REPOUSER@$REPOMACHINE:$REPOFOLDER/repo/${distro}/${distver}/freeside-${DEST}/${REPO}/${arch}
+                                                       else
+                                                               cp -p $FILES $REPOFOLDER/repo/${distro}/${distver}/freeside-${DEST}/${REPO}/${arch}
+                                                       fi
+                                               fi
+                                               # Copy non-freeside RPMs to all versions
+                                               FILES=`ls -1 /var/lib/mock/${os}-${arch}/result/*.rpm | grep -v freeside | grep -v .src.rpm | tr '\n' ' '`
+                                               echo $FILES
+                                               if [ "${FILES}x" != "x" ]
+                                               then
+                                                       for FILE in $FILES
+                                                       do
+                                                               $BUILDSYSDIR/expect-addsign $FILE
+                                                       done
+                                                       if [ "${REPOMACHINE}x" != "x" ]
+                                                       then
+                                                               scp -p $FILES $REPOUSER@$REPOMACHINE:$REPOFOLDER/repo/${distro}/${distver}/freeside-${DEST}/${REPO}/${arch}
+                                                       else
+                                                               cp -p $FILES $REPOFOLDER/repo/${distro}/${distver}/freeside-${DEST}/${REPO}/${arch}
+                                                       fi
+                                               fi
+                                       done
+                               fi
+                       done
+               done
+       done
+done
diff --git a/rpm/build/cvs-check-and-build b/rpm/build/cvs-check-and-build
new file mode 100755 (executable)
index 0000000..b5e94b7
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Copyright 2009, Elirion, Inc.  All rights reserved.
+# This software is licensed under the same terms as Freeside itself.
+#
+# This script wraps other scripts in the build system.  It does a CVS comparison on the vserver
+# to determine if the CVS contents have changed.  If so, an SRPM is built.  The script then invokes
+# the local build script which pulls down this SRPM and uses mock to build binary RPMs for the
+# default targets.  Finally, the repository is updated.
+#
+# There's currently no testing for failure.
+
+FORCE_FLAG=
+QUIET_FLAG=
+
+usage() {
+       echo "cvs-check-and-build: check Freeside CVS and build RPMs if changed"
+       echo "where:"
+       echo " -f: force SRPM rebuild even if CVS contents have not changed"
+       echo " -h: print this help message"
+       echo " -q: run yum-arch and createrepo in quiet mode"
+       exit 0
+}
+
+while getopts "fhq" flag
+do
+        case $flag in
+               f)
+                       echo "Force mode"
+                       FORCE_FLAG=-f;;
+               q)
+                       echo "Quiet mode"
+                       QUIET_FLAG=-q;;
+               *)
+                       usage;;
+        esac
+done
+
+ssh 10.5.4.5 /home/rsiddall/build-from-cvs $FORCE_FLAG
+cd /home/rsiddall/buildsys; ./build-freeside; ./refresh-repo $QUIET_FLAG
+
diff --git a/rpm/build/enrpm b/rpm/build/enrpm
new file mode 100755 (executable)
index 0000000..11f69ba
--- /dev/null
@@ -0,0 +1,187 @@
+#!/usr/bin/perl -w
+#
+# Attempt to build RPMs for Freeside from a tarball or module
+#
+# Contains portions of "cpanspec" http://cpanspec.sourceforge.net/
+
+=head1 NAME
+
+enrpm - Attempt to build RPMs for Freeside from a tarball or a module
+
+=head1 SYNOPSIS
+
+enrpm [options] [tarball|module-name [...]]
+
+ Options:
+   --help       -h      Help message
+
+=head1 DESCRIPTION
+
+B<enrpm> will generate a spec file to build a rpm from a CPAN-style
+Perl module distribution, then try to build RPMs from that spec file
+under mock, and update the repositories if successful.
+
+B<enrpm> uses the file extension of the tarball or module-name specified
+on the command line to determine if the argument is a tarball or a module name.
+
+Modules are downloaded from the CPAN.  You must have initialized CPAN on the machine
+for B<enrpm> to be able to do this.
+
+For tarballs B<enrpm> attempts to build a usable .spec file using cpanflute2, and then builds
+an SRPM from the .spec file and the tarball.
+
+Once an SRPM has been built, B<enrpm> uses an external script to build binary RPMs under "mock".
+It then uses a second script to update the repositories.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--help>
+
+Print a brief help message and exit.
+
+=item B<--packager>
+
+Specify the name and e-mail address of the packager.  This winds up in auto-generated .spec files.
+
+=item B<--server>
+
+Specify the host name or IP address of the server on which the SRPM will be built.  This server must be
+set up for SRPM building, which means it must have both B<ovid> and B<cpanflute2> installed on it.
+
+=item B<--dry-run>
+
+Just print out commands, don't actually run them.
+
+=back
+
+=head1 BUGS
+
+Currently has little in the way of error detection and diagnostics.
+
+The back-end should be replaced with an existing build system such as koji.
+
+=head1 AUTHOR
+
+Richard Siddall <richard.siddall@elirion.net>
+
+=head1 SEE ALSO
+
+L<perl(1)>, L<cpan2rpm(1)>, L<cpanflute2(1)>
+
+=cut
+
+use strict;
+use Getopt::Long;
+use Cwd qw/getcwd abs_path/;
+use File::Basename;
+use Sys::Hostname; # False laziness to get around a real config file...
+
+my %opts;
+
+GetOptions(\%opts, 'packager=s', 'release=s', 'server=s', 'dryrun');
+
+$ENV{PATH} = "/bin:/usr/bin";
+
+sub usage {
+       print STDERR "usage: enrpm --packager <Your Name <you\@example.com>> [--release=<rpm-release-string>] --server <server-name> [--dryrun] tarball|module-name\n";
+       print STDERR "where:\n\t--packager is the name and e-mail address of the packager for the .spec file\n\t--release is the rpm release number for the .spec file\n\t--server is the server to build the SRPM on\n\t--dryrun means do not actually run the commands\n\n";
+       print STDERR "\ttarball is the name of a tarball containing the Perl module to be packaged\n";
+       print STDERR "\tmodule-name is the name of a CPAN Perl module to be packaged\n";
+       exit;
+}
+
+# Feeble excuse for not having a real configuration file
+my $user = 'rsiddall';
+my $buildsys = '/home/rsiddall/work';
+my $rembuild = '/home/rsiddall/work/cvs';
+my $remdeps = '/home/rsiddall';
+my $rpmtopdir = '/home/rsiddall/work/redhat';
+my $packager = 'Richard Siddall <richard.siddall@elirion.net>';
+my $server = 'grosbeak';
+
+if (hostname =~ /wavetail/i) {
+       $buildsys = '/home/rsiddall/buildsys';
+       $rembuild = '/home/rsiddall/buildsys/ref';
+       $remdeps = '/home/rsiddall';
+       $rpmtopdir = '/home/rsiddall/redhat';
+       $packager = 'Ivan Kohler <ivan@freeside.biz>';
+       $server = '10.5.4.5';
+}
+
+$server = $opts{server} if defined($opts{server});
+$user = $1 if $server =~ /(\w+)\@[\w\d\.]+/;
+
+$packager = $opts{packager} if defined($opts{packager});
+
+# Go ahead and build an SRPM...
+
+my $ovidignore = '--ignore ' . join ('--ignore ', qw/libwww/);
+
+
+for my $file (@ARGV) {
+       my ($name,$version,$type);
+
+       if ($file =~ /^(?:.*\/)?(.*)-(?:v\.?)?([^-]+)\.(tar)\.(?:gz|bz2)$/) {
+               $name = $1;
+               $version = $2;
+               $type = $3;
+       } elsif ($file =~ /^(?:.*\/)?(.*)-(?:v\.?)?([^-]+)\.tgz$/) {
+               $name = $1;
+               $version = $2;
+               $type = 'tar';
+       } elsif ($file =~ /^(?:.*\/)?(.*)-(?:v\.?)?([^-]+)\.(zip)$/) {
+               $name = $1;
+               $version = $2;
+               $type = $3;
+       } else {
+               # keep things happy if we get "Foo-Bar" instead of "Foo::Bar"
+               $file =~ s/-/::/g;
+               $name = $file;
+               $version = undef;
+               $type = 'module';
+       }
+
+       if ($type eq 'module') {
+               my $fluteopts = '';
+               $fluteopts .= "--packager='$packager' " if defined($packager);
+               $fluteopts .= "--release='$opts{release}' " if defined($opts{release});
+               do_cmd("ssh $user\@$server \"ovid --deps $ovidignore $name | tail -1 | $remdeps/ovid2flute $fluteopts | /bin/sh\"");
+       } else {
+               my $absfile = abs_path($file);
+               my $fname = basename($file);
+               die "Packager name and e-mail required" if !defined($packager);
+               die "RPM release string required" if !defined($opts{release});
+               do_cmd("scp $absfile $user\@$server:/home/$user/$fname");
+#              do_cmd("ssh $user\@$server 'cpanflute2 --just-spec --noperlreqs --email=\\\"$packager\\\" --release=$opts{release}  /home/$user/$fname > /home/$user/work/redhat/SPECS/$name.spec;'");
+#              do_cmd("ssh $user\@$server 'perl -pi -e \\\"s/perl\(perl\)/perl/g\\\" /home/$user/work/redhat/SPECS/$name.spec;'");
+#              do_cmd("ssh $user\@$server 'rpmbuild -bs --nodeps --define \\\"_sourcedir /home/$user/\\\" --define \\\"_srcrpmdir /home/$user/work/redhat/SRPMS\\\" /home/$user/work/redhat/SPECS/$name.spec'");
+               open SCRIPT, ">/home/$user/makesrpm" or die "Can't create SRPM construction script: ", $!;
+               print SCRIPT "#!/bin/sh\n\n";
+               print SCRIPT "cpanflute2 --just-spec --noperlreqs --email='$packager' --release=$opts{release}  /home/$user/$fname > $rpmtopdir/SPECS/$name.spec;\n";
+               print SCRIPT "perl -pi -e 's/perl(perl)/perl/g' $rpmtopdir/SPECS/$name.spec\n";
+               print SCRIPT "rpmbuild -bs --nodeps --define '_sourcedir /home/$user/' --define '_srcrpmdir $rpmtopdir/SRPMS' $rpmtopdir/SPECS/$name.spec\n";
+               close SCRIPT or die "Can't close SRPM construction script: ", $!;
+               chmod(0711, "/home/$user/makesrpm");
+               do_cmd("scp /home/$user/makesrpm $user\@$server:/home/$user/makesrpm");
+               do_cmd("ssh $user\@$server /home/$user/makesrpm");
+       }
+       my $olddir = getcwd();
+       do_cmd("$buildsys/build-freeside");
+       if (-x "$buildsys/refresh-repo") {
+               do_cmd("$buildsys/refresh-repo");
+       } else {
+               do_cmd("ssh $user\@$server $rembuild/refresh-repo");
+       }
+}
+
+sub do_cmd {
+       my $cmd = shift;
+
+       print "$cmd\n";
+       `$cmd` if !exists($opts{dryrun});
+}
+
+1;
+
diff --git a/rpm/build/expect-addsign b/rpm/build/expect-addsign
new file mode 100755 (executable)
index 0000000..ad5e4f6
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/bin/expect
+set p "not our actual passphrase"
+set f [lindex $argv 0]
+spawn /bin/rpm --resign $f
+expect "Enter pass phrase:"
+send -- "$p\r"
+expect eof
diff --git a/rpm/build/expect-signrepo b/rpm/build/expect-signrepo
new file mode 100755 (executable)
index 0000000..81035f9
--- /dev/null
@@ -0,0 +1,9 @@
+#!/usr/bin/expect
+set password "not our actual passphrase"
+set key [lindex $argv 0]
+set output [lindex $argv 1]
+set input [lindex $argv 2]
+spawn gpg -sab --yes -u "$key" -o $output $input
+expect "Enter passphrase:"
+send -- "$password\r"
+expect eof
diff --git a/rpm/build/ovid2flute b/rpm/build/ovid2flute
new file mode 100755 (executable)
index 0000000..403b1d9
--- /dev/null
@@ -0,0 +1,139 @@
+#!/usr/bin/perl -w
+#
+# Convert the output from ovid --deps into a list of modules to run through cpanflute2 to get
+# better .spec files, and generate SRPMs from these.
+
+use strict;
+use Getopt::Long;
+
+# Need to fix up modules where Ovid parses the name incorrectly
+my %badparse=(
+       'Crypt-PasswdMD-5' => 'Crypt-PasswdMD5',
+       'IPC-Run-3' => 'IPC-Run3',
+       'Digest-SHA-1' => 'Digest-SHA1',
+       'Digest-MD-4' => 'Digest-MD4',
+);
+
+my %extra_buildreqs=(
+       'File-Rsync' => [ qw/rsync/ ],
+       'MIMETools' => [ qw/perl(Mail::Header) perl(Mail::Internet) perl(Mail::Field) perl(IO::Stringy) perl(File::Temp)/ ],
+       'HTML::Scrubber' => [ qw/perl(HTML::Parser) perl(HTML::Tagset)/ ],
+#      'Time::Duration' => [ qw/perl(Test::Pod) perl(Test::Pod::Coverage)/ ],
+);
+
+my %extra_reqs=(
+       'File-Rsync' => [ qw/rsync/ ],
+);
+
+my %opts;
+
+GetOptions(\%opts, 'packager=s', 'release=s');
+
+$opts{packager} = 'Richard Siddall <richard.siddall@elirion.net>' if !defined($opts{packager});
+
+# Need to process modules that cause Ovid to crash
+#my @extramods= qw/Text::CSV_XS Pod::Simple Crypt::SSLeay/;
+#my @extramods= qw/Crypt::SSLeay/;
+my @extramods= qw/IPC::ShareLite/;
+
+my $specfiledir="/home/rsiddall/work/redhat/SPECS";
+my $srpmdir="/home/rsiddall/work/redhat/SRPMS";
+
+foreach (reverse <STDIN>) {
+       next if !defined($_);
+       #print $_;
+       last if $_ !~ /^([-\w:]+) perl-([-\w\.]+)(-\d+[\w\.]+?)$/;
+       #print "$1 = $2\n"
+       my ($name, $rpm, $ver) = ($1, $2, $3);
+       print "# $name ($rpm - $ver)\n";
+       foreach my $cand (keys %badparse) {
+               if ($rpm =~ /^$cand/) {
+                       $rpm =~ s/^$cand/$badparse{$cand}/;
+                       print "# Fixed up $rpm\n";
+                       last;
+               }
+       }
+       printcmds($name, "$rpm$ver");
+       #print "cpanspec -v --packager 'Unknown <nobody\@example.com>' $name\n";
+       #print "echo $rpm\n";
+       #print "repoquery perl-$rpm\n";
+       #touchsrpms($name, "$rpm$ver");
+}
+
+exit;
+
+foreach my $name (@extramods) {
+       my $rpm = $name;
+       $rpm =~ s/::/-/g;
+       my $tarball = `find ~/.cpan/sources -name '$rpm-*' -print | tail -1`;
+       #print "$name (Extra!)\n"
+       if ($tarball =~ /\/($rpm-.*?)(\.tar\.gz|\.tgz)\s*$/) {
+               $rpm = $1;
+               printcmds($name, $rpm);
+       } else {
+               die "Can't find full rpm name for $name in \"$tarball\"\n";
+       }
+}
+
+sub touchsrpms {
+       my ($name, $rpm) = @_;
+       my $repofolder ="/var/www/html/repo/sles/10/freeside-1.9/stable/x86_64";
+       my $srpmfolder ="/home/rsiddall/work/redhat/SRPMS";
+       my @files = glob "$repofolder/perl-$rpm-*.rpm";
+       if (! scalar(@files)) {
+               print "Can't find $rpm in $repofolder\n";
+               @files = glob "$srpmfolder/perl-$rpm-*.src.rpm\n";
+               if (scalar(@files)) {
+                       my $file = pop @files;
+                       print "touch $file\n";
+               } else {
+                       print STDERR "No corresponding SRPM: $srpmfolder/perl-$rpm-*.src.rpm\n";
+                       printcmds($name, $rpm);
+               }
+       }
+}
+
+sub printcmds {
+       my ($name, $rpm) = @_;
+
+       my $tarball = `find ~/.cpan -name '$rpm.tar.gz' -print`;
+       $tarball = `find ~/.cpan -name '$rpm.tgz' -print` if ! $tarball;
+       chomp($tarball);
+#      my $specfile = "$specfiledir/$name.spec";
+       my $rpmname = $rpm;
+       $rpmname = $1 if $rpm =~ /^(?:.*\/)?(.*)-(?:v\.?)?([^-]+)$/;
+       my $specfile = "$specfiledir/perl-$rpmname.spec";
+       $specfile =~ s/::/-/g;
+       # Work out which version of the SRPM we're going to generate.
+       my $rel;
+       if (!defined($opts{release})) {
+               for ($rel = 1; ; $rel++) {
+                       my $srpm = "$srpmdir/perl-$rpm-$rel.src.rpm";
+                       last if ! -e $srpm;
+                       print "# File exists: $srpm\n";
+               }
+       } else {
+               $rel = $opts{release};
+       }
+       my $fluteopts = "";
+       foreach my $cand (keys %extra_buildreqs) {
+               if ($rpm =~ /^$cand/) {
+                       $fluteopts .= join "", map { "--buildrequires $_ " } @{$extra_buildreqs{$cand}};
+                       last;
+               }
+       }
+       foreach my $cand (keys %extra_reqs) {
+               if ($rpm =~ /^$cand/) {
+                       $fluteopts .= join "", map { "--requires $_ " } @{$extra_reqs{$cand}};
+                       last;
+               }
+       }
+       print "cpanflute2 --just-spec --noperlreqs --email='$opts{packager}' --release=$rel $fluteopts $tarball > $specfile;\n";
+       # Should fix up the .spec file
+       print "perl -pi -e 's/perl\\(perl\\)/perl/g' $specfile;\n";
+       my $tarballdir = `dirname $tarball` or die "Can't find tarball for $name: $tarball\n";
+       chomp($tarballdir);
+       print "rpmbuild -bs --nodeps --define '_sourcedir $tarballdir' --define '_srcrpmdir $srpmdir' $specfile\n";
+       print "# Generates: $srpmdir/perl-$rpm-$rel.src.rpm\n";
+}
+
diff --git a/rpm/build/refresh-repo b/rpm/build/refresh-repo
new file mode 100755 (executable)
index 0000000..40f62cd
--- /dev/null
@@ -0,0 +1,156 @@
+#!/bin/sh
+#
+# Copyright 2008, Elirion, Inc.  All rights reserved.
+# This software is licensed under the same terms as Freeside itself.
+#
+# This script iterates through all the specified Freeside repositories, running
+# both yum-arch and createrepo to update the yum repository meta-data.
+# The script should be run after the repository contents are changed.
+#
+# TBD: Run yum-arch, createrepo, or both, as appropriate for the distro and version
+# the repository is targetted for.
+#
+DISTROS='centos sles'
+CENTOSVERS='4 5'
+SLESVERS=10
+WHICHVERS=
+VERSIONS='1.7 1.9'
+ARCHS='i386 x86_64'
+REPOS='testing stable prerelease'
+RPMS=
+KEYID=rsiddall
+SAVEDIR=$HOME
+
+REPOBASEFOLDER=/var/www/html
+
+QUIET_FLAG=
+
+BUILDSYSDIR=`dirname $0`
+
+if [ -f $HOME/buildsysrc ]; then
+       . $HOME/buildsysrc
+fi
+
+usage() {
+       echo "refresh-repo: refresh yum metadata for all yum repositories"
+       echo "where:"
+       echo " -a <archs>: change architectures (currently: $ARCHS)"
+       echo " -d <distros>: change distributions (currently: $DISTROS)"
+       echo " -r <repos>: change repositories (currently: $REPOS)"
+       echo " -v <versions>: change versions (currently: $VERSIONS)"
+       echo " -w <distvers>: change distro version (currently: $WHICHVERS)"
+       exit 0
+}
+
+while getopts "a:d:hqr:v:w:" flag
+do
+        case $flag in
+                a)
+                        echo "Changing architectures from $ARCHS to $OPTARG"
+                        ARCHS=$OPTARG;;
+                d)
+                        echo "Changing distros from $DISTROS to $OPTARG"
+                        DISTROS=$OPTARG;;
+               q)
+                       echo "Quiet mode"
+                       QUIET_FLAG=-q;;
+                r)
+                        echo "Changing repository from $REPOS to $OPTARG"
+                        REPOS=$OPTARG;;
+                v)
+                        echo "Changing versions from $VERSIONS to $OPTARG"
+                        VERSIONS=$OPTARG;;
+                w)
+                        echo "Changing which distro versions from $WHICHVERS to $OPTARG"
+                        WHICHVERS=$OPTARG;;
+               *)
+                       usage;;
+        esac
+done
+
+#for DISTRO in ${DISTROS}; do
+#      for VERSION in ${VERSIONS}; do
+#              for REPO in ${REPOS}; do
+#                      for ARCH in ${ARCHS}; do
+#                              # Determine which RPMs need to be signed
+#                              NEWRPMS=`rpm --checksig $REPOBASEFOLDER/repo/$DISTROS/$DISTVERS/freeside-${VERSION}/${REPO}/${ARCH}/*.rpm | grep -v ' gpg ' | cut -d ':' -f 1 | tr '\n' ' '`
+#                              RPMS=`echo "$RPMS $NEWRPMS"`
+#                      done
+#              done
+#      done
+#done
+##rpm --addsign $RPMS
+#for RPM in $RPMS; do
+#      ./expect-addsign $RPM
+#done
+for DISTRO in ${DISTROS}; do
+       for VERSION in ${VERSIONS}; do
+               for REPO in ${REPOS}; do
+                       for ARCH in ${ARCHS}; do
+                               if [ "${WHICHVERS}x" = "x" ]; then
+                                       if [ "$DISTRO" = "centos" ]; then
+                                               DISTVERS=$CENTOSVERS
+                                       fi
+                                       if [ "$DISTRO" = "sles" ]; then
+                                               DISTVERS=$SLESVERS
+                                       fi
+                               else
+                                       DISTVERS=$WHICHVERS
+                               fi
+                               for distver in $DISTVERS
+                               do
+                                       # Update the repo information
+                                       echo "${DISTRO}-${distver}: $VERSION - $REPO - $ARCH"
+                                       DIR=$REPOBASEFOLDER/repo/$DISTRO/$distver/freeside-${VERSION}/${REPO}/${ARCH}
+                                       if [ -d $DIR ]
+                                       then
+                                               # SLES requires signed repodata.  Save any existing files so we don't regenerate
+                                               for ext in asc key
+                                               do
+                                                       if [ -e $DIR/repodata/repomd.xml.${ext} ]
+                                                       then
+                                                               mv $DIR/repodata/repomd.xml.${ext} $SAVEDIR
+                                                       fi
+                                               done
+                                               if [ "$DISTRO" = "sles" ]
+                                               then
+                                                       for file in $DIR/freeside-mysql-*.rpm
+                                                       do
+                                                               mv $file $file.old
+                                                       done
+                                                       for file in $DIR/freeside-selfservice-*.rpm
+                                                       do
+                                                               mv $file $DIR/../self-service/$ARCH
+                                                       done
+                                               fi
+                                               if [ "$DISTRO-$distver" = "centos-4" ]
+                                               then
+                                                       yum-arch $QUIET_FLAG $DIR/
+                                               fi
+#                                              createrepo $QUIET_FLAG --checkts $DIR/
+                                               createrepo $QUIET_FLAG $DIR/
+                                               if [ "$DISTRO" = "sles" ]
+                                               then
+                                                       # SLES requires signed repodata...
+                                                       if [ -e $SAVEDIR/repomd.xml.asc ]
+                                                       then
+                                                               mv $SAVEDIR/repomd.xml.asc $DIR/repodata
+                                                       fi
+
+#                                                      gpg -sab --yes -u "$KEYID" -o $DIR/repodata/repomd.xml.asc $DIR/repodata/repomd.xml
+                                                       ./expect-signrepo $KEYID $DIR/repodata/repomd.xml.asc $DIR/repodata/repomd.xml
+                                                       if [ -e $SAVEDIR/repomd.xml.key ]
+                                                       then
+                                                               mv $SAVEDIR/repomd.xml.key $DIR/repodata
+                                                       else
+                                                               gpg -a --yes -u "$KEYID" --export -o $DIR/repodata/repomd.xml.key
+                                                       fi
+                                               fi
+                                       else
+                                               echo "No such folder $DIR - skipping"
+                                       fi
+                               done
+                       done
+               done
+       done
+done