]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blame - bin/pfa-from-incoming
- wwwiface shows pkgs taken from ftpiod
[projects/pld-ftp-admin.git] / bin / pfa-from-incoming
CommitLineData
38b2b764
MM
1#!/usr/bin/env python
2# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
3
4import sys, os
5sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
6from config import incoming_dir, default_to, ftp_archs
7import config
acd976ec 8from common import noarchcachedir, tmpdir, fileexists
bb2cb325 9from baseftptree import BaseFtpTree, BasePkg
200470c5 10cval=config.value
38b2b764 11
acd976ec
MM
12lockfile=os.environ['HOME']+'/pld-ftp-admin/var/lock-'+cval['default_to']
13
14def lock():
15 if not fileexists(lockfile):
16 open(lockfile, 'w').close()
17 return True
18 else:
19 return False
20
21def unlock():
22 rm(lockfile)
23
38b2b764 24def 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
29def rm(file):
18c8e935
MM
30 os.remove(file)
31 #print 'rm: '+file
38b2b764
MM
32
33def 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
37def 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
45def 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 54ftptree=BaseFtpTree(cval['default_to'])
bb2cb325 55
acd976ec
MM
56if not lock():
57 log('Tree '+cval['default_to']+' locked')
58 sys.exit(0)
59
38b2b764
MM
60for 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
87def 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
103References: <%s@pld.src.builder>
104In-Reply-To: <%s@pld.src.builder>
105Subject: %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
135def 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
164for 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
196unlock()
197
This page took 0.049454 seconds and 4 git commands to generate.