]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blob - bin/pfa-from-incoming
4fe4d18878f632958c06bcbe2a97daaefe5c0d7f
[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
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
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
24 def log(msg):
25     f=open(os.environ['HOME']+'/pld-ftp-admin/var/log', 'a')
26     f.write(msg+'\n')
27     f.close()
28
29 def rm(file):
30     os.remove(file)
31     #print 'rm: '+file
32
33 def mv(src, dst):
34     os.rename(src, dst+'/'+src.split('/')[-1])
35     #print "mv: %s %s" % (src, dst+'/'+src.split('/')[-1])
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
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
54 ftptree=BaseFtpTree(cval['default_to'])
55
56 if not lock():
57     log('Tree '+cval['default_to']+' locked')
58     sys.exit(0)
59
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
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))
77         f.close()
78     else:
79         mv(incoming_dir+'SRPMS/'+srpm, default_to+'SRPMS/RPMS')
80  
81         f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'w')
82         f.write(content)
83         f.close()
84
85     rm(incoming_dir+'SRPMS/'+uploadinfo)
86
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    
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:
153             send_noarch_msg(files_differ, reqs_differ, dstpkg, rpm, arch)
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')
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
170         srcpkg=BasePkg(uploadinfo[:-19], content=content)
171         srpm=srcpkg.files['SRPMS'][0]
172
173         if not ftptree.has_key(`srcpkg`):
174             continue # We require the src.rpm to be present
175
176         dstpkg=BasePkg(`srcpkg`, ftptree)
177
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)
182             rm(incoming_dir+arch+'/'+uploadinfo)
183             continue
184
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:
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
196 unlock()
197
This page took 0.035354 seconds and 2 git commands to generate.