#!/usr/bin/env python3 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et from __future__ import print_function import getopt import sys, os sys.path.insert(0, os.environ['HOME']+'/tld-ftp-admin/modules') from common import checkdir from config import ftp_dir,all_ftp_archs import config import ftpio try: opts, args = getopt.getopt(sys.argv[1:], 'q', [ "quiet", "index=", "nopoldek", "noyum", "norpmrepo", "poldek", "yum", "rpmrepo" ] ) except getopt.GetoptError: print("ERR: not enough parameters given", file=sys.stderr) print("gen-indexes.py [--quiet] [--[no]poldek] [--[no]yum] [--[no]rpmrepo] tree [tree2...]", file=sys.stderr) sys.exit(1) do_poldek = True do_yum = False do_rpmrepo = False quiet = False # update only if changed (applicable to yum) freshen = True for o, a in opts: if o == "--nopoldek": do_poldek = False if o == "--noyum": do_yum = False if o == "--norpmrepo": do_rpmrepo = False if o == "--poldek": do_poldek = True if o == "--yum": do_yum = True if o == "--rpmrepo": do_rpmrepo = True if o == "-q" or o == "--quiet": quiet = True if o == "--index": do_poldek = do_yum = do_rpmrepo = False for v in a.split(','): if v == 'poldek': do_poldek = True if v == 'yum': do_yum = True if v == 'rpmrepo': do_rpmrepo = True if not quiet: print("poldek: %s; yum: %s; rpmrepo: %s" % (do_poldek, do_yum, do_rpmrepo)) if not do_poldek and not do_yum and not do_rpmrepo: print("ERR: speciy at least one action", file=sys.stderr) sys.exit(1) trees = args for tree in trees: checkdir(tree) ftpio.connect('gen-indexes') locked = [] for tree in trees: if ftpio.lock(tree, True): locked.append(tree) else: print("ERR: %s tree already locked" % tree, file=sys.stderr) for i in locked: ftpio.unlock(i) sys.exit(1) home = os.environ['HOME'] os.umask(0o022) os.nice(19) if do_poldek: poldek = '%s.stat/bin/poldek-new --cachedir=%s/tmp/poldek --conf %s.stat/etc/poldek.conf --mkidxz' % (ftp_dir, home, ftp_dir) for tree in trees: print('\n-------------------------- %s --------------------------' % tree) for arch in all_ftp_archs: print('\ngenerate poldek index for %s' % arch) print('%s -s %s%s/%s/RPMS/ --mkidxz --mkidx-type pndir' % (poldek, ftp_dir, tree, arch)) os.system('%s -s %s%s/%s/RPMS/ --mkidxz --mkidx-type pndir' % (poldek, ftp_dir, tree, arch)) if arch != 'noarch' and config.separate_debuginfo: os.system('%s -s %s%s/%s/debuginfo/ --mkidxz --mkidx-type pndir' % (poldek, ftp_dir, tree, arch)) if do_yum: os.system('%s cd %s.stat/repodata && cvs %s up comps.xml' % ("" if quiet else "set -x;", ftp_dir, "" if quiet else "-Q")) yum = '%s.stat/bin/createrepo -d -v --update --checkts --skip-stat --workers=12 -g %s.stat/repodata/comps.xml' % (ftp_dir, ftp_dir) comps_file = '%s.stat/repodata/comps.xml' % ftp_dir for tree in trees: print('\n-------------------------- %s --------------------------' % tree) cachedir = '%s/tmp/createrepo/%s' % (home, tree) treedir = "%s%s" % (ftp_dir, tree) for arch in all_ftp_archs: print('\ngenerate repodata for %s using createrepo' % arch) archdir = "%s/%s" % (treedir, arch) poldek_idx = "%s/RPMS/packages.ndir.md" % archdir repodata_idx = "%s/RPMS/repodata/repomd.xml" % archdir if freshen and os.path.exists(poldek_idx) and os.path.exists(repodata_idx) \ and not os.path.getmtime(comps_file) > os.path.getmtime(repodata_idx) \ and not os.path.getmtime(poldek_idx) > os.path.getmtime(repodata_idx): print("repodata indexes already fresh") continue print('%s %s --cache %s-%s %s/RPMS' % ("" if quiet else "time", yum, cachedir, arch, archdir)) os.system('%s %s --cache %s-%s %s/RPMS' % ("" if quiet else "time", yum, cachedir, arch, archdir)) if arch != 'noarch' and config.separate_debuginfo: os.system('%s %s --cache %s-%s %s/debuginfo' % ("" if quiet else "time", yum, cachedir, arch, archdir)) if do_rpmrepo: os.system('%s cd %s.stat/repodata && cvs %s up comps.xml' % ("" if quiet else "set -x;", ftp_dir, "" if quiet else "-Q")) for tree in trees: print('\n-------------------------- %s --------------------------' % tree) for arch in all_ftp_archs: dir = '%s/%s/%s/RPMS' % (ftp_dir, tree, arch) if not quiet: print('\ngenerate repodata for %s using rpmrepo (in %s)' % (arch, dir)) os.system('%s rpmrepo %s -o %s' % ("" if quiet else "set -x;", dir, dir)) if not quiet: print('copy comps.xml') comps = '%s.stat/repodata/comps.xml' % ftp_dir os.system('%s cp -p %s %s/repodata' % ("" if quiet else "set -x;", comps, dir)) for tree in trees: ftpio.unlock(tree)