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