summaryrefslogtreecommitdiff
path: root/bin/pfa-mvpkg
blob: b12779c49d84960998e8a6d1c76f72f00c06b96f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/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
from config import archived_trees, logs_list

os.umask(022)

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/" + 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], 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.')