2 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
4 import sys, os, stat, time
5 sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
6 from config import incoming_dir, default_to, ftp_archs
7 from config import value as cval
9 from common import noarchcachedir, tmpdir, fileexists
10 from baseftptree import BaseFtpTree, BasePkg
11 from ftptree import FtpTree, Pkg
20 os.rename(src, dst + '/' + src.split('/')[-1])
22 # duplicate code in ftptree.py
23 def is_debuginfo(nvr):
25 returns true if NVR is debuginfo package and separate debuginfo is enabled
27 if not config.separate_debuginfo:
29 pkg = nvr.split('-')[:-2]
30 return pkg[-1] == 'debuginfo'
34 if x[-11:] == '.uploadinfo':
38 return filter(filterinfos, os.listdir(dir))
44 if not content[-5:] == '\nEND\n':
49 def send_noarch_msg(files_differ, reqs_differ, pkg, rpmfile, arch):
50 req_email=pkg.build[pkg.lastbid].requester_email
53 if 'logs_list' in cval:
54 cc_list.append(cval['logs_list'])
55 m_subject="Noarch error: %s files differ among builders" % rpmfile
59 newcc=pkg.build[bid].requester_email
60 if req_email!=newcc and newcc not in cc_list:
63 msg="From: %s\nTo: %s\n" % (cval['from_field'], req_email)
65 msg=msg+"Cc: %s\n" % ", ".join(cc_list)
66 msg=msg+"""X-PLD-Builder: %s
67 References: <%s@pld.src.builder>
68 In-Reply-To: <%s@pld.src.builder>
71 """ % (cval['xpldbuilder'], req_bid, req_bid, m_subject)
73 sm = os.popen("/usr/sbin/sendmail -t", "w")
78 f=open("%s/files.diff" % tmpdir, 'r')
79 sm.write("Difference between %s (currently in %s) and %s FILES\n" %
80 (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
81 for line in f.readlines(True)[2:]:
88 f=open("%s/reqs.diff" % tmpdir, 'r')
89 sm.write("Difference between %s (currently in %s) and %s REQS\n" %
90 (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
91 for line in f.readlines(True)[2:]:
97 def move_noarch(f, arch, rpmfile, dstpkg):
98 if dstpkg.noarch_arch.has_key(rpmfile):
99 os.system("rpm -qlp %s | LC_ALL=C sort > %s/files.new" %
100 (incoming_dir + arch + '/' + rpmfile, tmpdir))
101 os.system("rpm -qRp %s | LC_ALL=C sort | LC_ALL=C uniq > %s/reqs.new" %
102 (incoming_dir + arch + '/' + rpmfile, tmpdir))
107 if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" %
108 (noarchcachedir, rpmfile, tmpdir, tmpdir)):
110 if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" %
111 (noarchcachedir, rpmfile, tmpdir, tmpdir)):
114 if files_differ or reqs_differ:
115 send_noarch_msg(files_differ, reqs_differ, dstpkg, rpmfile, arch)
117 rm(incoming_dir + arch + '/' + rpmfile)
119 os.system("LC_ALL=C rpm -qlp %s | LC_ALL=C sort > %s/%s.filelist" %
120 (incoming_dir + arch + '/' + rpmfile, noarchcachedir, rpmfile))
121 os.system("rpm -qRp %s | LC_ALL=C sort | LC_ALL=C uniq > %s/%s.reqlist" %
122 (incoming_dir + arch + '/' + rpmfile, noarchcachedir, rpmfile))
123 f.write("file:noarch:%s\ninfo:noarch_arch:%s:%s\n" % (rpmfile, rpmfile, arch))
124 mv(incoming_dir + arch + '/' + rpmfile, default_to + 'noarch/RPMS')
128 ftpio.connect('from-incoming-pid-%s' % os.getpid())
130 print "Can't get ftpiod connection"
133 ftptree = BaseFtpTree(cval['default_to'])
135 if not ftpio.lock(cval['default_to']):
136 print "Can't get lock: %s" % cval['default_to']
139 moved_anything = False
141 for uploadinfo in findfiles(incoming_dir + 'SRPMS'):
142 content = getcontent(incoming_dir + 'SRPMS/' + uploadinfo)
144 continue # Uploading not finished
146 pkg = BasePkg(uploadinfo[:-19], content = content)
147 srpm = pkg.files['SRPMS'][0]
149 if not os.path.exists(incoming_dir + 'SRPMS/' + srpm):
150 ftpio.log("%s file missing; skipping move until next round" % (srpm))
153 if ftptree.has_key(`pkg`):
154 ftpio.log("%s already present in %s; removing newer files" % (srpm, ftptree))
155 rm(incoming_dir + 'SRPMS/' + srpm)
156 f = open(default_to + 'SRPMS/.metadata/' + srpm+'.info', 'a')
157 bid = pkg.build.keys()[0]
158 build = pkg.build[bid]
159 f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
160 % (bid, build.requester, bid, build.requester_email))
163 mv(incoming_dir + 'SRPMS/' + srpm, default_to + 'SRPMS/RPMS')
165 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'w')
169 rm(incoming_dir + 'SRPMS/' + uploadinfo)
171 for arch in ftp_archs:
172 for uploadinfo in findfiles(incoming_dir + arch):
173 content = getcontent(incoming_dir + arch + '/' + uploadinfo)
175 ftpio.log("%s not finished uploading" % uploadinfo)
176 continue # Uploading not finished
178 srcpkg = BasePkg(uploadinfo[:-19], content = content)
179 srpm = srcpkg.files['SRPMS'][0]
181 if not ftptree.has_key(`srcpkg`):
182 continue # We require the src.rpm to be present
184 rpmfile_missing = [f for f in srcpkg.files['ARCH'] if not os.path.exists(incoming_dir + arch + '/'+f)]
185 if len(rpmfile_missing):
186 for filem in rpmfile_missing:
187 ftpio.log("%s file missing; skipping move until next round" % (filem))
190 dstpkg = BasePkg(`srcpkg`, ftptree)
192 if dstpkg.files.has_key(arch):
193 ftpio.log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
194 for rpmfile in srcpkg.files['ARCH']:
196 rm(incoming_dir + arch + '/'+rpmfile)
198 l = "Removing %s problem: %s" % (incoming_dir + arch + '/' + rpmfile, e)
201 rm(incoming_dir + arch + '/' + uploadinfo)
204 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'a')
205 for rpmfile in srcpkg.files['ARCH']:
206 moved_anything = True
207 if rpmfile[-11:] == '.noarch.rpm' and config.separate_noarch:
208 move_noarch(f, arch, rpmfile, dstpkg)
210 f.write("file:%s:%s\n" % (arch, rpmfile))
211 srcfile = incoming_dir + arch + '/' + rpmfile
213 if is_debuginfo(rpmfile):
214 dstfile = default_to + arch + '/debuginfo'
216 dstfile = default_to + arch + '/RPMS'
221 l = "Moving %s to %s problem: %s" % (srcfile, dstfile, e)
226 rm(incoming_dir + arch + '/' + uploadinfo)
228 ftpio.unlock(cval['default_to'])
231 os.system("%s/pld-ftp-admin/bin/pfa-genindex --quiet test > /dev/null" % (os.getenv("HOME")))