#!/usr/bin/env python
# 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']+'/pld-ftp-admin/modules')
-from ftptree import FtpTree
+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) < 3:
- print "Not enough parameters given"
- print "move.py src-tree dst-tree [package1, package2, ...]"
+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/" + sys.argv[2]
+ checkdir(archivetreename)
+else:
+ archivetreename = None
+
ftpio.connect('move')
if not ftpio.lock(sys.argv[1], True):
- print "%s tree already locked" %s sys.argv[1]
+ 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 "%s tree already locked" %s sys.argv[2]
+ 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(sys.argv[1], loadall=True)
- dsttree=FtpTree(sys.argv[2])
- srctree.mark4moving(sys.argv[3:])
+ 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)
+ srctree.movepkgs(dsttree, archivetree = archivetree)
except ftptree.SomeError:
- # In case of problems we need to unlock the tree before exiting
+ # 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.')