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