2 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
4 from __future__ import print_function
6 import sys, os, stat, time, re
7 sys.path.insert(0, os.environ['HOME']+'/tld-ftp-admin/modules')
8 from config import incoming_dir, default_to, ftp_archs
9 from config import value as cval
11 from common import noarchcachedir, tmpdir, fileexists
12 from baseftptree import BaseFtpTree, BasePkg
13 from ftptree import FtpTree, Pkg
22 os.rename(src, dst + '/' + src.split('/')[-1])
24 # duplicate code in ftptree.py
25 def is_debuginfo(nvr):
27 returns true if NVR is debuginfo package and separate debuginfo is enabled
29 if not config.separate_debuginfo:
31 pkg = nvr.split('-')[:-2]
32 return pkg[-1] == 'debuginfo' or pkg[-1] == 'debugsource'
36 if x[-11:] == '.uploadinfo':
40 return filter(filterinfos, os.listdir(dir))
46 if not content[-5:] == '\nEND\n':
51 def send_noarch_msg(files_differ, reqs_differ, pkg, rpmfile, arch):
52 req_email=pkg.build[pkg.lastbid].requester_email
55 if 'logs_list' in cval:
56 cc_list.append(cval['logs_list'])
57 m_subject="Noarch error: %s files differ among builders" % rpmfile
61 newcc=pkg.build[bid].requester_email
62 if req_email!=newcc and newcc not in cc_list:
65 msg="From: %s\nTo: %s\n" % (cval['from_field'], req_email)
67 msg=msg+"Cc: %s\n" % ", ".join(cc_list)
68 msg=msg+"""X-PLD-Builder: %s
69 References: <%s@pld.src.builder>
70 In-Reply-To: <%s@pld.src.builder>
73 """ % (cval['xpldbuilder'], req_bid, req_bid, m_subject)
75 sm = os.popen("/usr/sbin/sendmail -t", "w")
80 f=open("%s/files.diff" % tmpdir, 'r')
81 sm.write("Difference between %s (currently in %s) and %s FILES\n" %
82 (pkg.noarch_arch[rpmfile], repr(ftptree), arch)),
83 for line in f.readlines()[2:]:
90 f=open("%s/reqs.diff" % tmpdir, 'r')
91 sm.write("Difference between %s (currently in %s) and %s REQS\n" %
92 (pkg.noarch_arch[rpmfile], repr(ftptree), arch)),
93 for line in f.readlines()[2:]:
99 def move_noarch(f, arch, rpmfile, dstpkg):
100 if rpmfile in dstpkg.noarch_arch:
101 os.system("LC_ALL=C rpm -qlp %s | LC_ALL=C sort > %s/files.new" %
102 (incoming_dir + arch + '/' + rpmfile, tmpdir))
103 os.system("rpm -qRp %s | LC_ALL=C sort | LC_ALL=C uniq > %s/reqs.new" %
104 (incoming_dir + arch + '/' + rpmfile, tmpdir))
109 if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" %
110 (noarchcachedir, rpmfile, tmpdir, tmpdir)):
112 if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" %
113 (noarchcachedir, rpmfile, tmpdir, tmpdir)):
116 if files_differ or reqs_differ:
117 send_noarch_msg(files_differ, reqs_differ, dstpkg, rpmfile, arch)
119 rm(incoming_dir + arch + '/' + rpmfile)
121 os.system("LC_ALL=C rpm -qlp %s | LC_ALL=C sort > %s/%s.filelist" %
122 (incoming_dir + arch + '/' + rpmfile, noarchcachedir, rpmfile))
123 os.system("rpm -qRp %s | LC_ALL=C sort | LC_ALL=C uniq > %s/%s.reqlist" %
124 (incoming_dir + arch + '/' + rpmfile, noarchcachedir, rpmfile))
125 if arch not in dstpkg.files:
126 f.write("file:noarch:%s\ninfo:noarch_arch:%s:%s\n" % (rpmfile, rpmfile, arch))
127 mv(incoming_dir + arch + '/' + rpmfile, default_to + 'noarch/RPMS')
129 def send_vr_msg(snvr, anvr, pkg, arch):
130 req_email=pkg.build[pkg.lastbid].requester_email
133 if 'logs_list' in cval:
134 cc_list.append(cval['logs_list'])
135 m_subject="NVR error: %s version or relese differ among subpackages" % snvr[0]
136 bids=pkg.build.keys()
139 newcc=pkg.build[bid].requester_email
140 if req_email!=newcc and newcc not in cc_list:
141 cc_list.append(newcc)
143 msg="From: %s\nTo: %s\n" % (cval['from_field'], req_email)
145 msg=msg+"Cc: %s\n" % ", ".join(cc_list)
146 msg=msg+"""X-PLD-Builder: %s
147 References: <%s@pld.src.builder>
148 In-Reply-To: <%s@pld.src.builder>
151 """ % (cval['xpldbuilder'], req_bid, req_bid, m_subject)
153 sm = os.popen("/usr/sbin/sendmail -t", "w")
157 sm.write("Difference between %s SRPM (currently in %s) and %s RPM NVR:\n\n" %
158 (snvr[0], repr(ftptree), arch)),
159 sm.write("Expected (%s):\nV: %s\nR: %s\n\n" % snvr)
160 sm.write("RPM:\nN: %s\nV: %s\nR: %s\n" % anvr)
167 ftpio.connect('from-incoming-pid-%s' % os.getpid())
169 print("Can't get ftpiod connection")
172 ftptree = BaseFtpTree(cval['default_to'])
174 if not ftpio.lock(cval['default_to']):
175 print("Can't get lock: %s" % cval['default_to'])
178 moved_anything = False
180 for uploadinfo in findfiles(incoming_dir + 'SRPMS'):
181 content = getcontent(incoming_dir + 'SRPMS/' + uploadinfo)
183 continue # Uploading not finished
185 pkg = BasePkg(uploadinfo[:-19], content = content)
186 srpm = pkg.files['SRPMS'][0]
188 if not os.path.exists(incoming_dir + 'SRPMS/' + srpm):
189 ftpio.log("%s file missing; skipping move until next round" % (srpm))
192 if ftptree.has_key(repr(pkg)):
193 ftpio.log("%s already present in %s; removing older files" % (srpm, ftptree))
194 rm(default_to + 'SRPMS/RPMS/' + srpm)
195 f = open(default_to + 'SRPMS/.metadata/' + srpm+'.info', 'a')
196 bid = list(pkg.build.keys())[0]
197 build = pkg.build[bid]
198 f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
199 % (bid, build.requester, bid, build.requester_email))
202 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'w')
206 mv(incoming_dir + 'SRPMS/' + srpm, default_to + 'SRPMS/RPMS')
207 rm(incoming_dir + 'SRPMS/' + uploadinfo)
209 for arch in ftp_archs:
210 for uploadinfo in findfiles(incoming_dir + arch):
211 content = getcontent(incoming_dir + arch + '/' + uploadinfo)
213 ftpio.log("%s not finished uploading" % uploadinfo)
214 continue # Uploading not finished
216 srcpkg = BasePkg(uploadinfo[:-19], content = content)
217 srpm = srcpkg.files['SRPMS'][0]
219 if not ftptree.has_key(repr(srcpkg)):
220 continue # We require the src.rpm to be present
222 renvr = re.compile(r'(.*)-(.*)-(.*)\.[^.]*\.rpm')
223 srcnvr = renvr.match(srpm).groups()
225 rpmfile_missing = [f for f in srcpkg.files['ARCH'] if not os.path.exists(incoming_dir + arch + '/'+f)]
226 if len(rpmfile_missing):
227 for filem in rpmfile_missing:
228 ftpio.log("%s file missing; skipping move until next round" % (filem))
231 dstpkg = BasePkg(repr(srcpkg), ftptree)
233 if arch in dstpkg.files:
234 ftpio.log("files from %s for arch %s already present in %s; removing older files" % (repr(srcpkg), arch, ftptree))
235 for rpmfile in dstpkg.files[arch]:
236 if is_debuginfo(rpmfile):
237 dstfile = default_to + arch + '/debuginfo'
239 dstfile = default_to + arch + '/RPMS'
241 rm(dstfile + '/' + rpmfile)
243 l = "Removing %s problem: %s" % (dstfile + '/' + rpmfile, e)
247 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'a')
248 for rpmfile in srcpkg.files['ARCH']:
249 moved_anything = True
251 # Too much noise, too little use
252 # archnvr = renvr.match(rpmfile).groups()
253 # if srcnvr[1] != archnvr[1] or srcnvr[2] != archnvr[2]:
254 # send_vr_msg(srcnvr, archnvr, dstpkg, arch)
256 if rpmfile[-11:] == '.noarch.rpm' and config.separate_noarch:
257 move_noarch(f, arch, rpmfile, dstpkg)
259 if arch not in dstpkg.files:
260 f.write("file:%s:%s\n" % (arch, rpmfile))
261 srcfile = incoming_dir + arch + '/' + rpmfile
263 if is_debuginfo(rpmfile):
264 dstfile = default_to + arch + '/debuginfo'
266 dstfile = default_to + arch + '/RPMS'
271 l = "Moving %s to %s problem: %s" % (srcfile, dstfile, e)
276 rm(incoming_dir + arch + '/' + uploadinfo)
278 ftpio.unlock(cval['default_to'])
281 os.system("%s/tld-ftp-admin/bin/pfa-genindex --quiet test > /dev/null" % (os.getenv("HOME")))