summaryrefslogtreecommitdiff
path: root/rpm
diff options
context:
space:
mode:
authorivan <ivan>2010-07-07 17:51:58 +0000
committerivan <ivan>2010-07-07 17:51:58 +0000
commit4b8bad6a2302f764ae180e1b946cb148bc0ae051 (patch)
tree8496cfa3336831cfba22dad09ae1f836c0947bdc /rpm
parenteddecac89afcd7a87e4d254ecaa72dc6fc1f93b7 (diff)
checking in RPM build system
Diffstat (limited to 'rpm')
-rwxr-xr-xrpm/build/build-freeside169
-rwxr-xr-xrpm/build/cvs-check-and-build41
-rwxr-xr-xrpm/build/enrpm187
-rwxr-xr-xrpm/build/expect-addsign7
-rwxr-xr-xrpm/build/expect-signrepo9
-rwxr-xr-xrpm/build/ovid2flute139
-rwxr-xr-xrpm/build/refresh-repo156
7 files changed, 708 insertions, 0 deletions
diff --git a/rpm/build/build-freeside b/rpm/build/build-freeside
new file mode 100755
index 000000000..f17210ee6
--- /dev/null
+++ b/rpm/build/build-freeside
@@ -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
index 000000000..b5e94b78b
--- /dev/null
+++ b/rpm/build/cvs-check-and-build
@@ -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
index 000000000..11f69ba56
--- /dev/null
+++ b/rpm/build/enrpm
@@ -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
index 000000000..ad5e4f600
--- /dev/null
+++ b/rpm/build/expect-addsign
@@ -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
index 000000000..81035f9f2
--- /dev/null
+++ b/rpm/build/expect-signrepo
@@ -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
index 000000000..403b1d93f
--- /dev/null
+++ b/rpm/build/ovid2flute
@@ -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
index 000000000..40f62cdeb
--- /dev/null
+++ b/rpm/build/refresh-repo
@@ -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