#!/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')
import ftptree
from common import checkdir
import ftpio
from mailer import Message
-import config
-cval=config.value
+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:]
+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"
- print "move.py [options] src-tree dst-tree package [package2 package3 ...]"
- print "\nOptions:"
- print " -nb Do not check if builds are finished.\n"
+ 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 "ERR: %s tree already locked" % 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 "ERR: %s tree already locked" % 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.FtpTree(sys.argv[1], loadall=True)
- dsttree=ftptree.FtpTree(sys.argv[2])
+ 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
- srctree.mark4moving(sys.argv[3:])
+ 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 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' not in cval:
+if logs_list == None:
sys.exit(0)
-print 'Sending mail notification...',
+print('Sending mail notification to %s...' % logs_list)
-pkgs={}
+pkgs = {}
for pkg in srctree.marked4moving:
- requesters=[]
+ requesters = []
for bid in pkg.build.keys():
if pkg.build[bid].requester not in requesters:
requesters.append(pkg.build[bid].requester)
- pkgs[pkg.name]=requesters
-
-m=Message()
-m.set_headers(to=cval['logs_list'], subject='MOVED: %s => %s... %d packages' %
- (sys.argv[1], sys.argv[2], len(pkgs)))
-m.write(('SrcTree: %s DstTree: %s\n' +
- 'Amount: %d\n\n---- Moved:\n\n') % (sys.argv[1], sys.argv[2], len(pkgs)))
+ pkgs[pkg.nvr] = requesters
-for name in sorted(pkgs.keys()):
- m.write_line('%s ---- %s' % (name, ', '.join(pkgs[name])))
+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.'
-
+print('done.')