]> TLD Linux GIT Repositories - tld-ftp-admin.git/blob - bin/pfa-mvpkg
- raw from PLD
[tld-ftp-admin.git] / bin / pfa-mvpkg
1 #!/usr/bin/env python
2 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
3
4 import sys, os
5 sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
6 import ftptree
7 from common import checkdir
8 import ftpio
9 from mailer import Message
10 from config import archived_trees, logs_list
11
12 os.umask(022)
13
14 nocheckbuild = False
15 if len(sys.argv) > 4 and sys.argv[1] == '-nb':
16     nocheckbuild = True
17     sys.argv = sys.argv[1:]
18
19 if len(sys.argv) < 4:
20     print >>sys.stderr, "ERR: not enough parameters given"
21     print >>sys.stderr, "move.py [options] src-tree dst-tree package [package2 package3 ...]"
22     print >>sys.stderr, "\nOptions:"
23     print >>sys.stderr, "      -nb    Do not check if builds are finished.\n"
24     sys.exit(1)
25
26 checkdir(sys.argv[1])
27 checkdir(sys.argv[2])
28
29 if sys.argv[2] in archived_trees:
30     archivetreename = ".archive/" + sys.argv[2]
31     checkdir(archivetreename)
32 else:
33     archivetreename = None
34
35 ftpio.connect('move')
36
37 if not ftpio.lock(sys.argv[1], True):
38     print >>sys.stderr, "ERR: %s tree already locked" % sys.argv[1]
39     sys.exit(1)
40
41 if not ftpio.lock(sys.argv[2], True):
42     ftpio.unlock(sys.argv[1])
43     print >>sys.stderr, "ERR: %s tree already locked" % sys.argv[2]
44     sys.exit(1)
45
46 if archivetreename != None and archivetreename != sys.argv[1] and not ftpio.lock(archivetreename, True):
47     ftpio.unlock(sys.argv[2])
48     ftpio.unlock(sys.argv[1])
49     print "ERR: %s tree already locked" % archivetreename
50     sys.exit(1)
51
52 try:
53     srctree = ftptree.FtpTree(sys.argv[1], loadall = True)
54     dsttree = ftptree.FtpTree(sys.argv[2])
55     if archivetreename != None:
56         archivetree = ftptree.FtpTree(archivetreename)
57     else:
58         archivetree = None
59     if nocheckbuild:
60         srctree.do_checkbuild = False
61     pkgs = list(set(sys.argv[3:]))
62     srctree.mark4moving(pkgs)
63
64     srctree.movepkgs(dsttree, archivetree = archivetree)
65 except ftptree.SomeError:
66     # In case of problems we need to unlock the trees before exiting
67     ftpio.unlock(sys.argv[1])
68     ftpio.unlock(sys.argv[2])
69     if archivetreename != None:
70         ftpio.unlock(archivetreename)
71     sys.exit(1)
72
73 ftpio.unlock(sys.argv[1])
74 ftpio.unlock(sys.argv[2])
75 if archivetreename != None and archivetreename != sys.argv[1]:
76     ftpio.unlock(archivetreename)
77
78 if logs_list == None:
79     sys.exit(0)
80
81 print 'Sending mail notification to %s...' % logs_list
82
83 pkgs = {}
84
85 for pkg in srctree.marked4moving:
86     requesters = []
87     for bid in pkg.build.keys():
88         if pkg.build[bid].requester not in requesters:
89             requesters.append(pkg.build[bid].requester)
90     pkgs[pkg.nvr] = requesters
91
92 ftpadmin = "(unknown)"
93 try:
94     ftpadmin = os.environ['FTPADM']
95 except KeyError, e:
96     pass
97 m = Message()
98 m.set_headers(
99         to = logs_list,
100         subject = 'MOVED: %s => %s... %d packages' % (sys.argv[1], sys.argv[2], len(pkgs))
101 )
102
103 m.write(
104     (
105         'FTP admin %(ftpadmin)s moved from *%(srctree)s* to *%(dsttree)s* %(count)d packages\n\n' +
106         '---- Package name ---- Package built by:\n\n'
107     ) % {
108         'ftpadmin' : ftpadmin,
109         'srctree' : sys.argv[1],
110         'dsttree' : sys.argv[2],
111         'count' : len(pkgs),
112     }
113 )
114
115 for nvr in sorted(pkgs.keys()):
116     m.write_line('%s ---- %s' % (nvr, ', '.join(pkgs[nvr])))
117
118 m.send()
119
120 print 'done.'