]>
Commit | Line | Data |
---|---|---|
38b2b764 MM |
1 | #!/usr/bin/env python |
2 | # vi: encoding=utf-8 ts=8 sts=4 sw=4 et | |
3 | ||
b2ef6244 | 4 | import sys, os, stat, time |
38b2b764 MM |
5 | sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules') |
6 | from config import incoming_dir, default_to, ftp_archs | |
7 | import config | |
acd976ec | 8 | from common import noarchcachedir, tmpdir, fileexists |
bb2cb325 | 9 | from baseftptree import BaseFtpTree, BasePkg |
200470c5 | 10 | cval=config.value |
0a108b7f | 11 | import ftpio |
38b2b764 | 12 | |
0a108b7f | 13 | try: |
72d16386 | 14 | ftpio.connect('from-incoming-pid-%s' % os.getpid()) |
0a108b7f MM |
15 | except: |
16 | sys.exit(0) | |
38b2b764 MM |
17 | |
18 | def rm(file): | |
18c8e935 | 19 | os.remove(file) |
38b2b764 MM |
20 | |
21 | def mv(src, dst): | |
8911f226 | 22 | os.rename(src, dst + '/' + src.split('/')[-1]) |
38b2b764 | 23 | |
54ff0049 ER |
24 | # duplicate code in ftptree.py |
25 | def is_debuginfo(nvr): | |
26 | """ | |
27 | returns true if NVR is debuginfo package and separate debuginfo is enabled | |
28 | """ | |
29 | if not config.separate_debuginfo: | |
30 | return False | |
31 | pkg = nvr.split('-')[:-2] | |
32 | return pkg[-1] == 'debuginfo' | |
33 | ||
38b2b764 MM |
34 | def findfiles(dir): |
35 | def filterinfos(x): | |
8911f226 | 36 | if x[-11:] == '.uploadinfo': |
76dc40c3 | 37 | return True |
38b2b764 MM |
38 | else: |
39 | return False | |
40 | return filter(filterinfos, os.listdir(dir)) | |
41 | ||
38b2b764 | 42 | def getcontent(file): |
8911f226 ER |
43 | f = open(file, 'r') |
44 | content = f.read() | |
38b2b764 | 45 | f.close() |
8911f226 | 46 | if not content[-5:] == '\nEND\n': |
38b2b764 MM |
47 | return None |
48 | else: | |
49 | return content[:-4] | |
50 | ||
8911f226 | 51 | ftptree = BaseFtpTree(cval['default_to']) |
bb2cb325 | 52 | |
0a108b7f | 53 | if not ftpio.lock(cval['default_to']): |
acd976ec MM |
54 | sys.exit(0) |
55 | ||
8911f226 ER |
56 | for uploadinfo in findfiles(incoming_dir + 'SRPMS'): |
57 | content = getcontent(incoming_dir + 'SRPMS/' + uploadinfo) | |
38b2b764 MM |
58 | if not content: |
59 | continue # Uploading not finished | |
60 | ||
8911f226 ER |
61 | pkg = BasePkg(uploadinfo[:-19], content = content) |
62 | srpm = pkg.files['SRPMS'][0] | |
bb2cb325 MM |
63 | |
64 | if ftptree.has_key(`pkg`): | |
8911f226 ER |
65 | ftpio.log("%s already present in %s; removing newer files" % (srpm, ftptree)) |
66 | rm(incoming_dir + 'SRPMS/' + srpm) | |
67 | f = open(default_to + 'SRPMS/.metadata/' + srpm+'.info', 'a') | |
68 | bid = pkg.build.keys()[0] | |
69 | build = pkg.build[bid] | |
bb2cb325 MM |
70 | f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n" |
71 | % (bid, build.requester, bid, build.requester_email)) | |
38b2b764 MM |
72 | f.close() |
73 | else: | |
8911f226 | 74 | mv(incoming_dir + 'SRPMS/' + srpm, default_to + 'SRPMS/RPMS') |
38b2b764 | 75 | |
8911f226 | 76 | f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'w') |
38b2b764 MM |
77 | f.write(content) |
78 | f.close() | |
79 | ||
8911f226 | 80 | rm(incoming_dir + 'SRPMS/' + uploadinfo) |
38b2b764 | 81 | |
200470c5 MM |
82 | def send_noarch_msg(files_differ, reqs_differ, pkg, rpm, arch): |
83 | req_email=pkg.build[pkg.lastbid].requester_email | |
84 | req_bid=pkg.lastbid | |
85 | cc_list=[] | |
0fa16f20 MM |
86 | if 'logs_list' in cval: |
87 | cc_list.append(cval['logs_list']) | |
200470c5 MM |
88 | m_subject="Noarch error: %s files differ among builders" % rpm |
89 | bids=pkg.build.keys() | |
90 | if len(bids)>1: | |
91 | for bid in bids: | |
92 | newcc=pkg.build[bid].requester_email | |
93 | if req_email!=newcc and newcc not in cc_list: | |
94 | cc_list.append(newcc) | |
95 | ||
96 | msg="From: %s\nTo: %s\n" % (cval['from_field'], req_email) | |
97 | if cc_list: | |
98 | msg=msg+"Cc: %s\n" % ", ".join(cc_list) | |
99 | msg=msg+"""X-PLD-Builder: %s | |
100 | References: <%s@pld.src.builder> | |
101 | In-Reply-To: <%s@pld.src.builder> | |
102 | Subject: %s | |
103 | ||
104 | """ % (cval['xpldbuilder'], req_bid, req_bid, m_subject) | |
105 | ||
106 | sm = os.popen("/usr/sbin/sendmail -t", "w") | |
107 | ||
108 | sm.write(msg) | |
109 | ||
110 | if files_differ: | |
111 | f=open("%s/files.diff" % tmpdir, 'r') | |
112 | sm.write("Difference between %s (currently in %s) and %s FILES\n" % | |
113 | (pkg.noarch_arch[rpm], `ftptree`, arch)), | |
114 | for line in f.readlines(True)[2:]: | |
115 | sm.write(line) | |
116 | f.close() | |
117 | ||
118 | sm.write('\n') | |
119 | ||
120 | if reqs_differ: | |
121 | f=open("%s/reqs.diff" % tmpdir, 'r') | |
122 | sm.write("Difference between %s (currently in %s) and %s REQS\n" % | |
123 | (pkg.noarch_arch[rpm], `ftptree`, arch)), | |
124 | for line in f.readlines(True)[2:]: | |
125 | sm.write(line) | |
126 | f.close() | |
127 | ||
128 | sm.close() | |
129 | ||
130 | ||
bb2cb325 MM |
131 | |
132 | def move_noarch(f, arch, rpm, dstpkg): | |
133 | if dstpkg.noarch_arch.has_key(rpm): | |
9c19d8c9 | 134 | os.system("rpm -qlp %s | LC_ALL=C sort > %s/files.new" % |
8911f226 | 135 | (incoming_dir + arch + '/' + rpm, tmpdir)) |
9c19d8c9 | 136 | os.system("rpm -qRp %s | LC_ALL=C sort | uniq > %s/reqs.new" % |
8911f226 | 137 | (incoming_dir + arch + '/' + rpm, tmpdir)) |
bb2cb325 | 138 | |
8911f226 ER |
139 | files_differ = False |
140 | reqs_differ = False | |
bb2cb325 MM |
141 | |
142 | if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" % | |
143 | (noarchcachedir, rpm, tmpdir, tmpdir)): | |
8911f226 | 144 | files_differ = True |
bb2cb325 MM |
145 | if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" % |
146 | (noarchcachedir, rpm, tmpdir, tmpdir)): | |
8911f226 | 147 | reqs_differ = True |
bb2cb325 MM |
148 | |
149 | if files_differ or reqs_differ: | |
200470c5 | 150 | send_noarch_msg(files_differ, reqs_differ, dstpkg, rpm, arch) |
bb2cb325 | 151 | |
8911f226 | 152 | rm(incoming_dir + arch + '/' + rpm) |
bb2cb325 MM |
153 | else: |
154 | os.system("rpm -qlp %s > %s/%s.filelist" % | |
8911f226 | 155 | (incoming_dir + arch + '/' + rpm, noarchcachedir, rpm)) |
bb2cb325 | 156 | os.system("rpm -qRp %s |sort|uniq > %s/%s.reqlist" % |
8911f226 | 157 | (incoming_dir + arch + '/' + rpm, noarchcachedir, rpm)) |
bb2cb325 | 158 | f.write("file:noarch:%s\ninfo:noarch_arch:%s:%s\n" % (rpm, rpm, arch)) |
8911f226 | 159 | mv(incoming_dir + arch + '/' + rpm, default_to + 'noarch/RPMS') |
38b2b764 MM |
160 | |
161 | for arch in ftp_archs: | |
162 | for uploadinfo in findfiles(incoming_dir+arch): | |
8911f226 | 163 | content = getcontent(incoming_dir + arch + '/' + uploadinfo) |
38b2b764 | 164 | if not content: |
8911f226 | 165 | print "%s not finished uploading" % uploadinfo |
38b2b764 MM |
166 | continue # Uploading not finished |
167 | ||
8911f226 ER |
168 | srcpkg = BasePkg(uploadinfo[:-19], content = content) |
169 | srpm = srcpkg.files['SRPMS'][0] | |
38b2b764 | 170 | |
bb2cb325 | 171 | if not ftptree.has_key(`srcpkg`): |
38b2b764 MM |
172 | continue # We require the src.rpm to be present |
173 | ||
8911f226 | 174 | dstpkg = BasePkg(`srcpkg`, ftptree) |
38b2b764 | 175 | |
bb2cb325 | 176 | if dstpkg.files.has_key(arch): |
0a108b7f | 177 | ftpio.log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree)) |
bb2cb325 | 178 | for rpm in srcpkg.files['ARCH']: |
2eb653d6 | 179 | try: |
8911f226 | 180 | rm(incoming_dir + arch + '/'+rpm) |
2eb653d6 | 181 | except OSError, e: |
8911f226 | 182 | l = "Removing %s problem: %s" % (incoming_dir + arch + '/' + rpm, e) |
2eb653d6 AM |
183 | ftpio.log(l) |
184 | print l | |
8911f226 | 185 | rm(incoming_dir + arch + '/' + uploadinfo) |
38b2b764 MM |
186 | continue |
187 | ||
8911f226 | 188 | f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'a') |
bb2cb325 | 189 | for rpm in srcpkg.files['ARCH']: |
8911f226 | 190 | if rpm[-11:] == '.noarch.rpm' and config.separate_noarch: |
bb2cb325 MM |
191 | move_noarch(f, arch, rpm, dstpkg) |
192 | else: | |
38b2b764 | 193 | f.write("file:%s:%s\n" % (arch, rpm)) |
8911f226 ER |
194 | srcfile = incoming_dir + arch + '/' + rpm |
195 | ||
54ff0049 ER |
196 | if is_debuginfo(rpm): |
197 | dstfile = default_to + arch + '/debuginfo' | |
198 | else: | |
199 | dstfile = default_to + arch + '/RPMS' | |
8911f226 | 200 | |
631d11b9 | 201 | try: |
8911f226 | 202 | mv(srcfile, dstfile) |
631d11b9 | 203 | except OSError, e: |
8911f226 | 204 | l = "Moving %s to %s problem: %s" % (srcfile, dstfile, e) |
631d11b9 AM |
205 | ftpio.log(l) |
206 | print l | |
38b2b764 MM |
207 | f.close() |
208 | ||
8911f226 | 209 | rm(incoming_dir + arch + '/' + uploadinfo) |
38b2b764 | 210 | |
0a108b7f | 211 | ftpio.unlock(cval['default_to']) |