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