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