]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blob - bin/pfa-from-incoming
- all scripts use ftpiod for locking and logging
[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 import ftpio
12
13 try:
14     ftpio.connect('from-incoming')
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     m_subject="Noarch error: %s files differ among builders" % rpm
80     bids=pkg.build.keys()
81     if len(bids)>1:
82         for bid in bids:
83             newcc=pkg.build[bid].requester_email
84             if req_email!=newcc and newcc not in cc_list:
85                 cc_list.append(newcc)
86
87     msg="From: %s\nTo: %s\n" % (cval['from_field'], req_email)
88     if cc_list:
89         msg=msg+"Cc: %s\n" % ", ".join(cc_list)
90     msg=msg+"""X-PLD-Builder: %s
91 References: <%s@pld.src.builder>
92 In-Reply-To: <%s@pld.src.builder>
93 Subject: %s
94
95 """ % (cval['xpldbuilder'], req_bid, req_bid, m_subject)
96
97     sm = os.popen("/usr/sbin/sendmail -t", "w")
98     
99     sm.write(msg)
100
101     if files_differ:
102         f=open("%s/files.diff" % tmpdir, 'r')
103         sm.write("Difference between %s (currently in %s) and %s FILES\n" %
104               (pkg.noarch_arch[rpm], `ftptree`, arch)),
105         for line in f.readlines(True)[2:]:
106             sm.write(line)
107         f.close()
108
109     sm.write('\n')
110
111     if reqs_differ:
112         f=open("%s/reqs.diff" % tmpdir, 'r')
113         sm.write("Difference between %s (currently in %s) and %s REQS\n" %
114               (pkg.noarch_arch[rpm], `ftptree`, arch)),
115         for line in f.readlines(True)[2:]:
116             sm.write(line)
117         f.close()
118
119     sm.close()
120
121    
122
123 def move_noarch(f, arch, rpm, dstpkg):
124     if dstpkg.noarch_arch.has_key(rpm):
125         os.system("rpm -qlp %s > %s/files.new" %
126                   (incoming_dir+arch+'/'+rpm, tmpdir))
127         os.system("rpm -qRp %s |sort|uniq > %s/reqs.new" %
128                   (incoming_dir+arch+'/'+rpm, tmpdir))
129
130         files_differ=False
131         reqs_differ=False
132
133         if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" %
134                      (noarchcachedir, rpm, tmpdir, tmpdir)):
135             files_differ=True
136         if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" %
137                      (noarchcachedir, rpm, tmpdir, tmpdir)):
138             reqs_differ=True
139
140         if files_differ or reqs_differ:
141             send_noarch_msg(files_differ, reqs_differ, dstpkg, rpm, arch)
142
143         rm(incoming_dir+arch+'/'+rpm)
144     else:
145         os.system("rpm -qlp %s > %s/%s.filelist" %
146                   (incoming_dir+arch+'/'+rpm, noarchcachedir, rpm))
147         os.system("rpm -qRp %s |sort|uniq > %s/%s.reqlist" % 
148                   (incoming_dir+arch+'/'+rpm, noarchcachedir, rpm))
149         f.write("file:noarch:%s\ninfo:noarch_arch:%s:%s\n" % (rpm, rpm, arch))
150         mv(incoming_dir+arch+'/'+rpm, default_to+'noarch/RPMS')
151
152 for arch in ftp_archs:
153     for uploadinfo in findfiles(incoming_dir+arch):
154         content=getcontent(incoming_dir+arch+'/'+uploadinfo)
155         if not content:
156             continue # Uploading not finished
157
158         srcpkg=BasePkg(uploadinfo[:-19], content=content)
159         srpm=srcpkg.files['SRPMS'][0]
160
161         if not ftptree.has_key(`srcpkg`):
162             continue # We require the src.rpm to be present
163
164         dstpkg=BasePkg(`srcpkg`, ftptree)
165
166         if dstpkg.files.has_key(arch):
167             ftpio.log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
168             for rpm in srcpkg.files['ARCH']:
169                 rm(incoming_dir+arch+'/'+rpm)
170             rm(incoming_dir+arch+'/'+uploadinfo)
171             continue
172
173         f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'a')
174         for rpm in srcpkg.files['ARCH']:
175             if rpm[-11:]=='.noarch.rpm':
176                 move_noarch(f, arch, rpm, dstpkg)
177             else:
178                 f.write("file:%s:%s\n" % (arch, rpm))
179                 mv(incoming_dir+arch+'/'+rpm, default_to+arch+'/RPMS')
180         f.close()
181
182         rm(incoming_dir+arch+'/'+uploadinfo)
183
184 ftpio.unlock(cval['default_to'])
185
This page took 0.046211 seconds and 3 git commands to generate.