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