]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blame - bin/pfa-from-incoming
- reset file perms after signing, rpm5 leaves them with 0600
[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
b2ef6244 4import sys, os, stat, time
38b2b764
MM
5sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
6from config import incoming_dir, default_to, ftp_archs
8e089d4f 7from config import value as cval
38b2b764 8import config
acd976ec 9from common import noarchcachedir, tmpdir, fileexists
bb2cb325 10from baseftptree import BaseFtpTree, BasePkg
8e089d4f 11from ftptree import FtpTree, Pkg
0a108b7f 12import ftpio
38b2b764 13
fc574b00
AM
14os.umask(022)
15
38b2b764 16def rm(file):
18c8e935 17 os.remove(file)
38b2b764
MM
18
19def mv(src, dst):
8911f226 20 os.rename(src, dst + '/' + src.split('/')[-1])
38b2b764 21
54ff0049
ER
22# duplicate code in ftptree.py
23def is_debuginfo(nvr):
24 """
25 returns true if NVR is debuginfo package and separate debuginfo is enabled
26 """
27 if not config.separate_debuginfo:
28 return False
29 pkg = nvr.split('-')[:-2]
30 return pkg[-1] == 'debuginfo'
31
38b2b764
MM
32def findfiles(dir):
33 def filterinfos(x):
8911f226 34 if x[-11:] == '.uploadinfo':
76dc40c3 35 return True
38b2b764
MM
36 else:
37 return False
38 return filter(filterinfos, os.listdir(dir))
39
38b2b764 40def getcontent(file):
8911f226
ER
41 f = open(file, 'r')
42 content = f.read()
38b2b764 43 f.close()
8911f226 44 if not content[-5:] == '\nEND\n':
38b2b764
MM
45 return None
46 else:
47 return content[:-4]
48
8e089d4f 49def send_noarch_msg(files_differ, reqs_differ, pkg, rpmfile, arch):
200470c5
MM
50 req_email=pkg.build[pkg.lastbid].requester_email
51 req_bid=pkg.lastbid
52 cc_list=[]
0fa16f20
MM
53 if 'logs_list' in cval:
54 cc_list.append(cval['logs_list'])
8e089d4f 55 m_subject="Noarch error: %s files differ among builders" % rpmfile
200470c5
MM
56 bids=pkg.build.keys()
57 if len(bids)>1:
58 for bid in bids:
59 newcc=pkg.build[bid].requester_email
60 if req_email!=newcc and newcc not in cc_list:
61 cc_list.append(newcc)
62
63 msg="From: %s\nTo: %s\n" % (cval['from_field'], req_email)
64 if cc_list:
65 msg=msg+"Cc: %s\n" % ", ".join(cc_list)
66 msg=msg+"""X-PLD-Builder: %s
67References: <%s@pld.src.builder>
68In-Reply-To: <%s@pld.src.builder>
69Subject: %s
70
71""" % (cval['xpldbuilder'], req_bid, req_bid, m_subject)
72
73 sm = os.popen("/usr/sbin/sendmail -t", "w")
8e089d4f 74
200470c5
MM
75 sm.write(msg)
76
77 if files_differ:
78 f=open("%s/files.diff" % tmpdir, 'r')
79 sm.write("Difference between %s (currently in %s) and %s FILES\n" %
8e089d4f 80 (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
200470c5
MM
81 for line in f.readlines(True)[2:]:
82 sm.write(line)
83 f.close()
84
85 sm.write('\n')
86
87 if reqs_differ:
88 f=open("%s/reqs.diff" % tmpdir, 'r')
89 sm.write("Difference between %s (currently in %s) and %s REQS\n" %
8e089d4f 90 (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
200470c5
MM
91 for line in f.readlines(True)[2:]:
92 sm.write(line)
93 f.close()
94
95 sm.close()
96
8e089d4f
ER
97def move_noarch(f, arch, rpmfile, dstpkg):
98 if dstpkg.noarch_arch.has_key(rpmfile):
9c19d8c9 99 os.system("rpm -qlp %s | LC_ALL=C sort > %s/files.new" %
8e089d4f 100 (incoming_dir + arch + '/' + rpmfile, tmpdir))
9c19d8c9 101 os.system("rpm -qRp %s | LC_ALL=C sort | uniq > %s/reqs.new" %
8e089d4f 102 (incoming_dir + arch + '/' + rpmfile, tmpdir))
bb2cb325 103
8911f226
ER
104 files_differ = False
105 reqs_differ = False
bb2cb325
MM
106
107 if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" %
8e089d4f 108 (noarchcachedir, rpmfile, tmpdir, tmpdir)):
8911f226 109 files_differ = True
bb2cb325 110 if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" %
8e089d4f 111 (noarchcachedir, rpmfile, tmpdir, tmpdir)):
8911f226 112 reqs_differ = True
bb2cb325
MM
113
114 if files_differ or reqs_differ:
8e089d4f 115 send_noarch_msg(files_differ, reqs_differ, dstpkg, rpmfile, arch)
bb2cb325 116
8e089d4f 117 rm(incoming_dir + arch + '/' + rpmfile)
bb2cb325
MM
118 else:
119 os.system("rpm -qlp %s > %s/%s.filelist" %
8e089d4f
ER
120 (incoming_dir + arch + '/' + rpmfile, noarchcachedir, rpmfile))
121 os.system("rpm -qRp %s |sort|uniq > %s/%s.reqlist" %
122 (incoming_dir + arch + '/' + rpmfile, noarchcachedir, rpmfile))
123 f.write("file:noarch:%s\ninfo:noarch_arch:%s:%s\n" % (rpmfile, rpmfile, arch))
124 mv(incoming_dir + arch + '/' + rpmfile, default_to + 'noarch/RPMS')
38b2b764 125
e4b21e2b
ER
126# main()
127try:
128 ftpio.connect('from-incoming-pid-%s' % os.getpid())
129except:
130 sys.exit(0)
131
132ftptree = BaseFtpTree(cval['default_to'])
133
134if not ftpio.lock(cval['default_to']):
135 sys.exit(0)
136
7c2f5e4c
AM
137moved_anything = False
138
e4b21e2b
ER
139for uploadinfo in findfiles(incoming_dir + 'SRPMS'):
140 content = getcontent(incoming_dir + 'SRPMS/' + uploadinfo)
141 if not content:
142 continue # Uploading not finished
143
144 pkg = BasePkg(uploadinfo[:-19], content = content)
145 srpm = pkg.files['SRPMS'][0]
146
46d96a92
AM
147 if not os.path.exists(incoming_dir + 'SRPMS/' + srpm):
148 ftpio.log("%s file missing; skipping move until next round" % (srpm))
149 continue
150
e4b21e2b
ER
151 if ftptree.has_key(`pkg`):
152 ftpio.log("%s already present in %s; removing newer files" % (srpm, ftptree))
153 rm(incoming_dir + 'SRPMS/' + srpm)
154 f = open(default_to + 'SRPMS/.metadata/' + srpm+'.info', 'a')
155 bid = pkg.build.keys()[0]
156 build = pkg.build[bid]
157 f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
158 % (bid, build.requester, bid, build.requester_email))
159 f.close()
160 else:
161 mv(incoming_dir + 'SRPMS/' + srpm, default_to + 'SRPMS/RPMS')
8e089d4f 162
e4b21e2b
ER
163 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'w')
164 f.write(content)
165 f.close()
166
167 rm(incoming_dir + 'SRPMS/' + uploadinfo)
168
38b2b764 169for arch in ftp_archs:
8e089d4f 170 for uploadinfo in findfiles(incoming_dir + arch):
8911f226 171 content = getcontent(incoming_dir + arch + '/' + uploadinfo)
38b2b764 172 if not content:
2abd3b77 173 ftpio.log("%s not finished uploading" % uploadinfo)
38b2b764
MM
174 continue # Uploading not finished
175
8911f226
ER
176 srcpkg = BasePkg(uploadinfo[:-19], content = content)
177 srpm = srcpkg.files['SRPMS'][0]
38b2b764 178
bb2cb325 179 if not ftptree.has_key(`srcpkg`):
38b2b764
MM
180 continue # We require the src.rpm to be present
181
46d96a92
AM
182 rpmfile_missing = [f for f in srcpkg.files['ARCH'] if not os.path.exists(incoming_dir + arch + '/'+f)]
183 if len(rpmfile_missing):
184 for filem in rpmfile_missing:
185 ftpio.log("%s file missing; skipping move until next round" % (filem))
186 continue
187
8911f226 188 dstpkg = BasePkg(`srcpkg`, ftptree)
38b2b764 189
bb2cb325 190 if dstpkg.files.has_key(arch):
0a108b7f 191 ftpio.log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
8e089d4f 192 for rpmfile in srcpkg.files['ARCH']:
2eb653d6 193 try:
8e089d4f 194 rm(incoming_dir + arch + '/'+rpmfile)
2eb653d6 195 except OSError, e:
8e089d4f 196 l = "Removing %s problem: %s" % (incoming_dir + arch + '/' + rpmfile, e)
2eb653d6
AM
197 ftpio.log(l)
198 print l
8911f226 199 rm(incoming_dir + arch + '/' + uploadinfo)
38b2b764
MM
200 continue
201
8911f226 202 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'a')
8e089d4f 203 for rpmfile in srcpkg.files['ARCH']:
7c2f5e4c 204 moved_anything = True
8e089d4f
ER
205 if rpmfile[-11:] == '.noarch.rpm' and config.separate_noarch:
206 move_noarch(f, arch, rpmfile, dstpkg)
bb2cb325 207 else:
8e089d4f
ER
208 f.write("file:%s:%s\n" % (arch, rpmfile))
209 srcfile = incoming_dir + arch + '/' + rpmfile
8911f226 210
8e089d4f 211 if is_debuginfo(rpmfile):
54ff0049
ER
212 dstfile = default_to + arch + '/debuginfo'
213 else:
214 dstfile = default_to + arch + '/RPMS'
8911f226 215
631d11b9 216 try:
8911f226 217 mv(srcfile, dstfile)
631d11b9 218 except OSError, e:
8911f226 219 l = "Moving %s to %s problem: %s" % (srcfile, dstfile, e)
631d11b9
AM
220 ftpio.log(l)
221 print l
38b2b764
MM
222 f.close()
223
8911f226 224 rm(incoming_dir + arch + '/' + uploadinfo)
38b2b764 225
0a108b7f 226ftpio.unlock(cval['default_to'])
7c2f5e4c
AM
227
228if moved_anything:
a34f0e55 229 os.system("%s/pld-ftp-admin/bin/pfa-genindex --quiet test > /dev/null" % (os.getenv("HOME")))
This page took 0.080934 seconds and 4 git commands to generate.