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