--- /dev/null
+#!/usr/bin/python
+# $Id$
+# expected argument is a URL on build.onelab.eu
+# this would then update the alpha node repo from that place
+# NOTE
+# the actual list of rpms that are needed or nodes is hard-coded
+
+import sys, os, os.path, glob, commands
+from optparse import OptionParser
+
+standard_repo = '/var/www/html/install-rpms/onelab-i386'
+alpha_repo = '%s-alpha'%standard_repo
+
+#################### from module-tools
+def prompt (question,default=True):
+
+ choices = []
+ if default is True: choices.append('[y]')
+ else : choices.append('y')
+ if default is False: choices.append('[n]')
+ else : choices.append('n')
+
+ try:
+ answer=raw_input(question + " " + "/".join(choices) + " ? ")
+ if not answer:
+ return default
+ answer=answer[0].lower()
+ if answer == 'y':
+ return True
+ elif answer == 'n':
+ return False
+ return prompt(question,default)
+ except:
+ raise
+
+##########
+def run (command,options,force=False):
+ if ( force or not options.dry_run):
+ print 'Running',command
+ os.system(command)
+ else:
+ print 'Would run',command
+
+# rewrite the http part into a rsync part
+def http_to_rsync (http):
+ result = http.replace ('http://build.onelab.eu/','root@build.onelab.eu:/build/')
+ # canonicalize : strip last / if present
+ while (result[-1]=='/'): result=result[0:-1]
+ return result
+
+def rsync_xfer(http,repo,options):
+ xfer='%s/xfer'%repo
+ command='mkdir -p %s' % xfer
+ run(command,options)
+
+ command='rsync -av'
+ if options.dry_run: command += ' -n'
+ command += ' ' + http_to_rsync(http) + ' ' + xfer
+ run (command,options)
+
+def rpm_name (rpm_file):
+ status,output = commands.getstatusoutput("rpm -q --qf '%%{NAME}' -p %s " % rpm_file)
+ return output
+
+def extract_contents (standard):
+ patt= '%s/*.rpm' % standard
+ rpm_files=glob.glob(patt)
+ contents = [ rpm_name(rpm_file) for rpm_file in rpm_files]
+ return contents
+
+def install_standard_rpm_name (repo,rpm_name,options):
+ former_alpha_rpms = set(glob.glob ('%s/%s*rpm'%(repo,rpm_name)))
+ xfer_patt= '%s/xfer/RPMS/*/%s*.rpm' % (repo, rpm_name);
+ xfer_rpm_names=glob.glob(xfer_patt)
+ for xfer_rpm_name in xfer_rpm_names:
+ command = 'mv %s %s' % ( xfer_rpm_name, repo)
+ if prompt('Adopt %s'%os.path.basename(xfer_rpm_name)):
+ run(command,options)
+ try:
+ former_alpha_rpms.remove('%s/%s'%(repo,rpm_name))
+ except:
+ pass
+ for former in former_alpha_rpms:
+ if prompt ('Remove old %s'%os.path.basename(former)):
+ command.run("rm %s"%former,options)
+
+def remaining_rpms (root):
+ command="find %s -name '*.rpm'"%root
+ status,output = commands.getstatusoutput(command)
+ return output.split("\n")
+
+def scan_remaining (repo,options):
+ for rpm in remaining_rpms('%s/xfer' % repo):
+ basename=os.path.basename(rpm)
+ command="mv %s %s/%s"%(rpm,repo,basename)
+ if prompt('Adopt %s'%basename,False):
+ run (command,options)
+
+def main ():
+ usage="Usage:%prog http://build.onelab.eu/.../RPMS"
+ parser=OptionParser(usage=usage)
+ parser.add_option("-n","--dry-run",action="store_true",dest="dry_run",default=False,
+ help="dry run")
+ parser.add_option("-r","--repo",action="store",dest="repo",default=alpha_repo,
+ help="the repo to populate")
+ parser.add_option("-s","--std",action="store",dest="standard",default=standard_repo,
+ help="the standard repo, used to compute the set of rpms")
+ (options, args) = parser.parse_args()
+ if len(args) != 1:
+ parser.print_help()
+ sys.exit(1)
+
+ http=args[0]
+ repo=options.repo
+ standard=options.standard
+
+ ### in case we have leftovers from a previous run days ago, better clean it up
+ xfer='%s/xfer'%repo
+ if os.path.isdir(xfer):
+ if prompt('Want to clean up %s'%xfer,False):
+ run('rm -rf %s'%xfer,options)
+
+ # go get the stuff
+ if prompt ('Need to fetch rpms from %s ' % http):
+ rsync_xfer(http,repo,options)
+
+ # install yumgroups
+ if prompt ('Install yumgroups'):
+ command="mv %s/xfer/RPMS/yumgroups.xml %s/"%(repo,repo)
+ run(command,options)
+
+ # compute the set of rpms currently in the standard repo
+ # i.e. the ones that come with noderepo
+ if prompt ('Get list of standard rpms from %s ' % standard):
+ rpm_names=extract_contents(standard)
+
+ # interactively propose to move them in the right place
+ if prompt ('Moving standard rpms to %s' % repo):
+ for rpm_name in rpm_names:
+ install_standard_rpm_name(repo,rpm_name,options)
+
+ # once here, we have moved all the rpms that belonged to the standard noderepo
+ # let's manually scan the ones that remain in xfer/
+ # as there might be new rpms in this new build
+ # the list proposed here contains mostly server-side rpms,
+ # so the prompt default is False
+ if prompt ('Scan remaining rpms for double-check'):
+ scan_remaining(repo,options)
+
+ if prompt ('Nuke repodata (force complete reindexing)'):
+ command="rm -rf %s/repodata %s/signed-stamps"%(repo,repo)
+ run(command,options)
+
+ if prompt ('Reindex'):
+ run('service plc start packages',options)
+
+if __name__ == '__main__':
+ main()