]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blob - bin/pfa-from-incoming
Rebuild test indexes when something was moved.
[projects/pld-ftp-admin.git] / bin / pfa-from-incoming
1 #!/usr/bin/env python
2 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
3
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
8 import config
9 from common import noarchcachedir, tmpdir, fileexists
10 from baseftptree import BaseFtpTree, BasePkg
11 from ftptree import FtpTree, Pkg
12 import ftpio
13
14 def rm(file):
15     os.remove(file)
16
17 def mv(src, dst):
18     os.rename(src, dst + '/' + src.split('/')[-1])
19
20 # duplicate code in ftptree.py
21 def 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
30 def findfiles(dir):
31     def filterinfos(x):
32         if x[-11:] == '.uploadinfo':
33             return True
34         else:
35             return False
36     return filter(filterinfos, os.listdir(dir))
37
38 def getcontent(file):
39     f = open(file, 'r')
40     content = f.read()
41     f.close()
42     if not content[-5:] == '\nEND\n':
43         return None
44     else:
45         return content[:-4]
46
47 def send_noarch_msg(files_differ, reqs_differ, pkg, rpmfile, arch):
48     req_email=pkg.build[pkg.lastbid].requester_email
49     req_bid=pkg.lastbid
50     cc_list=[]
51     if 'logs_list' in cval:
52         cc_list.append(cval['logs_list'])
53     m_subject="Noarch error: %s files differ among builders" % rpmfile
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
65 References: <%s@pld.src.builder>
66 In-Reply-To: <%s@pld.src.builder>
67 Subject: %s
68
69 """ % (cval['xpldbuilder'], req_bid, req_bid, m_subject)
70
71     sm = os.popen("/usr/sbin/sendmail -t", "w")
72
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" %
78               (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
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" %
88               (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
89         for line in f.readlines(True)[2:]:
90             sm.write(line)
91         f.close()
92
93     sm.close()
94
95 def move_noarch(f, arch, rpmfile, dstpkg):
96     if dstpkg.noarch_arch.has_key(rpmfile):
97         os.system("rpm -qlp %s | LC_ALL=C sort > %s/files.new" %
98                   (incoming_dir + arch + '/' + rpmfile, tmpdir))
99         os.system("rpm -qRp %s | LC_ALL=C sort | uniq > %s/reqs.new" %
100                   (incoming_dir + arch + '/' + rpmfile, tmpdir))
101
102         files_differ = False
103         reqs_differ = False
104
105         if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" %
106                      (noarchcachedir, rpmfile, tmpdir, tmpdir)):
107             files_differ = True
108         if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" %
109                      (noarchcachedir, rpmfile, tmpdir, tmpdir)):
110             reqs_differ = True
111
112         if files_differ or reqs_differ:
113             send_noarch_msg(files_differ, reqs_differ, dstpkg, rpmfile, arch)
114
115         rm(incoming_dir + arch + '/' + rpmfile)
116     else:
117         os.system("rpm -qlp %s > %s/%s.filelist" %
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')
123
124 # main()
125 try:
126     ftpio.connect('from-incoming-pid-%s' % os.getpid())
127 except:
128     sys.exit(0)
129
130 ftptree = BaseFtpTree(cval['default_to'])
131
132 if not ftpio.lock(cval['default_to']):
133     sys.exit(0)
134
135 moved_anything = False
136
137 for uploadinfo in findfiles(incoming_dir + 'SRPMS'):
138     content = getcontent(incoming_dir + 'SRPMS/' + uploadinfo)
139     if not content:
140         continue # Uploading not finished
141
142     pkg = BasePkg(uploadinfo[:-19], content = content)
143     srpm = pkg.files['SRPMS'][0]
144
145     if not os.path.exists(incoming_dir + 'SRPMS/' + srpm):
146         ftpio.log("%s file missing; skipping move until next round" % (srpm))
147         continue
148
149     if ftptree.has_key(`pkg`):
150         ftpio.log("%s already present in %s; removing newer files" % (srpm, ftptree))
151         rm(incoming_dir + 'SRPMS/' + srpm)
152         f = open(default_to + 'SRPMS/.metadata/' + srpm+'.info', 'a')
153         bid = pkg.build.keys()[0]
154         build = pkg.build[bid]
155         f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
156                  % (bid, build.requester, bid, build.requester_email))
157         f.close()
158     else:
159         mv(incoming_dir + 'SRPMS/' + srpm, default_to + 'SRPMS/RPMS')
160
161         f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'w')
162         f.write(content)
163         f.close()
164
165     rm(incoming_dir + 'SRPMS/' + uploadinfo)
166
167 for arch in ftp_archs:
168     for uploadinfo in findfiles(incoming_dir + arch):
169         content = getcontent(incoming_dir + arch + '/' + uploadinfo)
170         if not content:
171             print "%s not finished uploading" % uploadinfo
172             continue # Uploading not finished
173
174         srcpkg = BasePkg(uploadinfo[:-19], content = content)
175         srpm = srcpkg.files['SRPMS'][0]
176
177         if not ftptree.has_key(`srcpkg`):
178             continue # We require the src.rpm to be present
179
180         rpmfile_missing = [f for f in srcpkg.files['ARCH'] if not os.path.exists(incoming_dir + arch + '/'+f)]
181         if len(rpmfile_missing):
182             for filem in rpmfile_missing:
183                 ftpio.log("%s file missing; skipping move until next round" % (filem))
184             continue
185
186         dstpkg = BasePkg(`srcpkg`, ftptree)
187
188         if dstpkg.files.has_key(arch):
189             ftpio.log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
190             for rpmfile in srcpkg.files['ARCH']:
191                 try:
192                     rm(incoming_dir + arch + '/'+rpmfile)
193                 except OSError, e:
194                     l = "Removing %s problem: %s" % (incoming_dir + arch + '/' + rpmfile, e)
195                     ftpio.log(l)
196                     print l
197             rm(incoming_dir + arch + '/' + uploadinfo)
198             continue
199
200         f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'a')
201         for rpmfile in srcpkg.files['ARCH']:
202             moved_anything = True
203             if rpmfile[-11:] == '.noarch.rpm' and config.separate_noarch:
204                 move_noarch(f, arch, rpmfile, dstpkg)
205             else:
206                 f.write("file:%s:%s\n" % (arch, rpmfile))
207                 srcfile = incoming_dir + arch + '/' + rpmfile
208
209                 if is_debuginfo(rpmfile):
210                     dstfile = default_to + arch + '/debuginfo'
211                 else:
212                     dstfile = default_to + arch + '/RPMS'
213
214                 try:
215                     mv(srcfile, dstfile)
216                 except OSError, e:
217                     l = "Moving %s to %s problem: %s" % (srcfile, dstfile, e)
218                     ftpio.log(l)
219                     print l
220         f.close()
221
222         rm(incoming_dir + arch + '/' + uploadinfo)
223
224 ftpio.unlock(cval['default_to'])
225
226 if moved_anything:
227     os.system("%s/pld-ftp-admin/scripts/gen-indexes.py --quiet --noyum test" % (os.getenv("HOME"))
This page took 0.536143 seconds and 4 git commands to generate.