#!/usr/bin/env python3 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et from __future__ import print_function import sys, os sys.path.insert(0, os.environ['HOME']+'/tld-ftp-admin/modules') import ftptree from common import checkdir import ftpio from mailer import Message from config import archived_trees, logs_list os.umask(0o022) nocheckbuild = False if len(sys.argv) > 4 and sys.argv[1] == '-nb': nocheckbuild = True sys.argv = sys.argv[1:] if len(sys.argv) < 4: print("ERR: not enough parameters given", file=sys.stderr) print("move.py [options] src-tree dst-tree package [package2 package3 ...]", file=sys.stderr) print("\nOptions:", file=sys.stderr) print(" -nb Do not check if builds are finished.\n", file=sys.stderr) sys.exit(1) checkdir(sys.argv[1]) checkdir(sys.argv[2]) if sys.argv[2] in archived_trees: archivetreename = "archive" checkdir(archivetreename) else: archivetreename = None ftpio.connect('move') if not ftpio.lock(sys.argv[1], True): print("ERR: %s tree already locked" % sys.argv[1], file=sys.stderr) sys.exit(1) if not ftpio.lock(sys.argv[2], True): ftpio.unlock(sys.argv[1]) print("ERR: %s tree already locked" % sys.argv[2], file=sys.stderr) sys.exit(1) if archivetreename != None and archivetreename != sys.argv[1] and not ftpio.lock(archivetreename, True): ftpio.unlock(sys.argv[2]) ftpio.unlock(sys.argv[1]) print("ERR: %s tree already locked" % archivetreename, file=sys.stderr) sys.exit(1) try: srctree = ftptree.FtpTree(sys.argv[1], loadall = True) dsttree = ftptree.FtpTree(sys.argv[2]) if archivetreename != None: archivetree = ftptree.FtpTree(archivetreename) else: archivetree = None if nocheckbuild: srctree.do_checkbuild = False pkgs = list(set(sys.argv[3:])) srctree.mark4moving(pkgs) srctree.movepkgs(dsttree, archivetree = archivetree) except ftptree.SomeError: # In case of problems we need to unlock the trees before exiting ftpio.unlock(sys.argv[1]) ftpio.unlock(sys.argv[2]) if archivetreename != None: ftpio.unlock(archivetreename) sys.exit(1) ftpio.unlock(sys.argv[1]) ftpio.unlock(sys.argv[2]) if archivetreename != None and archivetreename != sys.argv[1]: ftpio.unlock(archivetreename) if logs_list == None: sys.exit(0) print('Sending mail notification to %s...' % logs_list) pkgs = {} for pkg in srctree.marked4moving: requesters = [] for bid in pkg.build.keys(): if pkg.build[bid].requester not in requesters: requesters.append(pkg.build[bid].requester) pkgs[pkg.nvr] = requesters ftpadmin = "(unknown)" try: ftpadmin = os.environ['FTPADM'] except KeyError as e: pass m = Message() m.set_headers( to = logs_list, subject = 'MOVED: %s => %s... %d packages' % (sys.argv[1], sys.argv[2], len(pkgs)) ) m.write( ( 'FTP admin %(ftpadmin)s moved from *%(srctree)s* to *%(dsttree)s* %(count)d packages\n\n' + '---- Package name ---- Package built by:\n\n' ) % { 'ftpadmin' : ftpadmin, 'srctree' : sys.argv[1], 'dsttree' : sys.argv[2], 'count' : len(pkgs), } ) for nvr in sorted(pkgs.keys()): m.write_line('%s ---- %s' % (nvr, ', '.join(pkgs[nvr]))) m.send() print('done.')