]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blame - bin/pfa-from-incoming
LC_ALL=C for sort and uniq
[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):
ca2e224a 99 os.system("rpm -qlp %s | LC_ALL=C sort > %s/files.new" %
8e089d4f 100 (incoming_dir + arch + '/' + rpmfile, tmpdir))
ca2e224a 101 os.system("rpm -qRp %s | LC_ALL=C sort | LC_ALL=C 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 118 else:
ca2e224a 119 os.system("LC_ALL=C rpm -qlp %s | LC_ALL=C sort > %s/%s.filelist" %
8e089d4f 120 (incoming_dir + arch + '/' + rpmfile, noarchcachedir, rpmfile))
ca2e224a 121 os.system("rpm -qRp %s | LC_ALL=C sort | LC_ALL=C uniq > %s/%s.reqlist" %
8e089d4f
ER
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:
65017da5
ER
130 print "Can't get ftpiod connection"
131 sys.exit(1)
e4b21e2b
ER
132
133ftptree = BaseFtpTree(cval['default_to'])
134
135if not ftpio.lock(cval['default_to']):
65017da5
ER
136 print "Can't get lock: %s" % cval['default_to']
137 sys.exit(1)
e4b21e2b 138
7c2f5e4c
AM
139moved_anything = False
140
e4b21e2b
ER
141for uploadinfo in findfiles(incoming_dir + 'SRPMS'):
142 content = getcontent(incoming_dir + 'SRPMS/' + uploadinfo)
143 if not content:
144 continue # Uploading not finished
145
146 pkg = BasePkg(uploadinfo[:-19], content = content)
147 srpm = pkg.files['SRPMS'][0]
148
46d96a92
AM
149 if not os.path.exists(incoming_dir + 'SRPMS/' + srpm):
150 ftpio.log("%s file missing; skipping move until next round" % (srpm))
151 continue
152
e4b21e2b
ER
153 if ftptree.has_key(`pkg`):
154 ftpio.log("%s already present in %s; removing newer files" % (srpm, ftptree))
155 rm(incoming_dir + 'SRPMS/' + srpm)
156 f = open(default_to + 'SRPMS/.metadata/' + srpm+'.info', 'a')
157 bid = pkg.build.keys()[0]
158 build = pkg.build[bid]
159 f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
160 % (bid, build.requester, bid, build.requester_email))
161 f.close()
162 else:
163 mv(incoming_dir + 'SRPMS/' + srpm, default_to + 'SRPMS/RPMS')
8e089d4f 164
e4b21e2b
ER
165 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'w')
166 f.write(content)
167 f.close()
168
169 rm(incoming_dir + 'SRPMS/' + uploadinfo)
170
38b2b764 171for arch in ftp_archs:
8e089d4f 172 for uploadinfo in findfiles(incoming_dir + arch):
8911f226 173 content = getcontent(incoming_dir + arch + '/' + uploadinfo)
38b2b764 174 if not content:
2abd3b77 175 ftpio.log("%s not finished uploading" % uploadinfo)
38b2b764
MM
176 continue # Uploading not finished
177
8911f226
ER
178 srcpkg = BasePkg(uploadinfo[:-19], content = content)
179 srpm = srcpkg.files['SRPMS'][0]
38b2b764 180
bb2cb325 181 if not ftptree.has_key(`srcpkg`):
38b2b764
MM
182 continue # We require the src.rpm to be present
183
46d96a92
AM
184 rpmfile_missing = [f for f in srcpkg.files['ARCH'] if not os.path.exists(incoming_dir + arch + '/'+f)]
185 if len(rpmfile_missing):
186 for filem in rpmfile_missing:
187 ftpio.log("%s file missing; skipping move until next round" % (filem))
188 continue
189
8911f226 190 dstpkg = BasePkg(`srcpkg`, ftptree)
38b2b764 191
bb2cb325 192 if dstpkg.files.has_key(arch):
0a108b7f 193 ftpio.log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
8e089d4f 194 for rpmfile in srcpkg.files['ARCH']:
2eb653d6 195 try:
8e089d4f 196 rm(incoming_dir + arch + '/'+rpmfile)
2eb653d6 197 except OSError, e:
8e089d4f 198 l = "Removing %s problem: %s" % (incoming_dir + arch + '/' + rpmfile, e)
2eb653d6
AM
199 ftpio.log(l)
200 print l
8911f226 201 rm(incoming_dir + arch + '/' + uploadinfo)
38b2b764
MM
202 continue
203
8911f226 204 f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'a')
8e089d4f 205 for rpmfile in srcpkg.files['ARCH']:
7c2f5e4c 206 moved_anything = True
8e089d4f
ER
207 if rpmfile[-11:] == '.noarch.rpm' and config.separate_noarch:
208 move_noarch(f, arch, rpmfile, dstpkg)
bb2cb325 209 else:
8e089d4f
ER
210 f.write("file:%s:%s\n" % (arch, rpmfile))
211 srcfile = incoming_dir + arch + '/' + rpmfile
8911f226 212
8e089d4f 213 if is_debuginfo(rpmfile):
54ff0049
ER
214 dstfile = default_to + arch + '/debuginfo'
215 else:
216 dstfile = default_to + arch + '/RPMS'
8911f226 217
631d11b9 218 try:
8911f226 219 mv(srcfile, dstfile)
631d11b9 220 except OSError, e:
8911f226 221 l = "Moving %s to %s problem: %s" % (srcfile, dstfile, e)
631d11b9
AM
222 ftpio.log(l)
223 print l
38b2b764
MM
224 f.close()
225
8911f226 226 rm(incoming_dir + arch + '/' + uploadinfo)
38b2b764 227
0a108b7f 228ftpio.unlock(cval['default_to'])
7c2f5e4c
AM
229
230if moved_anything:
a34f0e55 231 os.system("%s/pld-ftp-admin/bin/pfa-genindex --quiet test > /dev/null" % (os.getenv("HOME")))
This page took 0.107143 seconds and 4 git commands to generate.