]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blob - bin/pfa-from-incoming
- Really move and remove files, don't just print info about it
[projects/pld-ftp-admin.git] / bin / pfa-from-incoming
1 #!/usr/bin/env python
2 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
3
4 import sys, os
5 sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
6 from config import incoming_dir, default_to, ftp_archs
7 import config
8 from common import noarchcachedir, tmpdir
9 from baseftptree import BaseFtpTree, BasePkg
10 cval=config.value
11
12 def log(msg):
13     f=open(os.environ['HOME']+'/pld-ftp-admin/var/log', 'a')
14     f.write(msg+'\n')
15     f.close()
16
17 def rm(file):
18     os.remove(file)
19     #print 'rm: '+file
20
21 def mv(src, dst):
22     os.rename(src, dst+'/'+src.split('/')[-1])
23     #print "mv: %s %s" % (src, dst+'/'+src.split('/')[-1])
24
25 def findfiles(dir):
26     def filterinfos(x):
27         if x[-11:]=='.uploadinfo':
28             return True
29         else:
30             return False
31     return filter(filterinfos, os.listdir(dir))
32
33 def getcontent(file):
34     f=open(file, 'r')
35     content=f.read()
36     f.close()
37     if not content[-5:]=='\nEND\n':
38         return None
39     else:
40         return content[:-4]
41
42 ftptree=BaseFtpTree(cval['default_to'])
43
44 for uploadinfo in findfiles(incoming_dir+'SRPMS'):
45     content=getcontent(incoming_dir+'SRPMS/'+uploadinfo)
46     if not content:
47         continue # Uploading not finished
48
49     pkg=BasePkg(uploadinfo[:-19], content=content)
50     srpm=pkg.files['SRPMS'][0]
51
52     if ftptree.has_key(`pkg`):
53         log("%s already present in %s; removing newer files" %
54             (srpm, ftptree))
55         rm(incoming_dir+'SRPMS/'+srpm)
56         f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'a')
57         bid=pkg.build.keys()[0]
58         build=pkg.build[bid]
59         f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
60                  % (bid, build.requester, bid, build.requester_email))
61         f.close()
62     else:
63         mv(incoming_dir+'SRPMS/'+srpm, default_to+'SRPMS/RPMS')
64  
65         f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'w')
66         f.write(content)
67         f.close()
68
69     rm(incoming_dir+'SRPMS/'+uploadinfo)
70
71 def send_noarch_msg(files_differ, reqs_differ, pkg, rpm, arch):
72     req_email=pkg.build[pkg.lastbid].requester_email
73     req_bid=pkg.lastbid
74     cc_list=[]
75     m_subject="Noarch error: %s files differ among builders" % rpm
76     bids=pkg.build.keys()
77     if len(bids)>1:
78         for bid in bids:
79             newcc=pkg.build[bid].requester_email
80             if req_email!=newcc and newcc not in cc_list:
81                 cc_list.append(newcc)
82
83     msg="From: %s\nTo: %s\n" % (cval['from_field'], req_email)
84     if cc_list:
85         msg=msg+"Cc: %s\n" % ", ".join(cc_list)
86     msg=msg+"""X-PLD-Builder: %s
87 References: <%s@pld.src.builder>
88 In-Reply-To: <%s@pld.src.builder>
89 Subject: %s
90
91 """ % (cval['xpldbuilder'], req_bid, req_bid, m_subject)
92
93     sm = os.popen("/usr/sbin/sendmail -t", "w")
94     
95     sm.write(msg)
96
97     if files_differ:
98         f=open("%s/files.diff" % tmpdir, 'r')
99         sm.write("Difference between %s (currently in %s) and %s FILES\n" %
100               (pkg.noarch_arch[rpm], `ftptree`, arch)),
101         for line in f.readlines(True)[2:]:
102             sm.write(line)
103         f.close()
104
105     sm.write('\n')
106
107     if reqs_differ:
108         f=open("%s/reqs.diff" % tmpdir, 'r')
109         sm.write("Difference between %s (currently in %s) and %s REQS\n" %
110               (pkg.noarch_arch[rpm], `ftptree`, arch)),
111         for line in f.readlines(True)[2:]:
112             sm.write(line)
113         f.close()
114
115     sm.close()
116
117    
118
119 def move_noarch(f, arch, rpm, dstpkg):
120     if dstpkg.noarch_arch.has_key(rpm):
121         os.system("rpm -qlp %s > %s/files.new" %
122                   (incoming_dir+arch+'/'+rpm, tmpdir))
123         os.system("rpm -qRp %s |sort|uniq > %s/reqs.new" %
124                   (incoming_dir+arch+'/'+rpm, tmpdir))
125
126         files_differ=False
127         reqs_differ=False
128
129         if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" %
130                      (noarchcachedir, rpm, tmpdir, tmpdir)):
131             files_differ=True
132         if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" %
133                      (noarchcachedir, rpm, tmpdir, tmpdir)):
134             reqs_differ=True
135
136         if files_differ or reqs_differ:
137             send_noarch_msg(files_differ, reqs_differ, dstpkg, rpm, arch)
138
139         rm(incoming_dir+arch+'/'+rpm)
140     else:
141         os.system("rpm -qlp %s > %s/%s.filelist" %
142                   (incoming_dir+arch+'/'+rpm, noarchcachedir, rpm))
143         os.system("rpm -qRp %s |sort|uniq > %s/%s.reqlist" % 
144                   (incoming_dir+arch+'/'+rpm, noarchcachedir, rpm))
145         f.write("file:noarch:%s\ninfo:noarch_arch:%s:%s\n" % (rpm, rpm, arch))
146         mv(incoming_dir+arch+'/'+rpm, default_to+'noarch/RPMS')
147
148 for arch in ftp_archs:
149     for uploadinfo in findfiles(incoming_dir+arch):
150         content=getcontent(incoming_dir+arch+'/'+uploadinfo)
151         if not content:
152             continue # Uploading not finished
153
154         srcpkg=BasePkg(uploadinfo[:-19], content=content)
155         srpm=srcpkg.files['SRPMS'][0]
156
157         if not ftptree.has_key(`srcpkg`):
158             continue # We require the src.rpm to be present
159
160         dstpkg=BasePkg(`srcpkg`, ftptree)
161
162         if dstpkg.files.has_key(arch):
163             log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
164             for rpm in srcpkg.files['ARCH']:
165                 rm(incoming_dir+arch+'/'+rpm)
166             rm(incoming_dir+arch+'/'+uploadinfo)
167             continue
168
169         f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'a')
170         for rpm in srcpkg.files['ARCH']:
171             if rpm[-11:]=='.noarch.rpm':
172                 move_noarch(f, arch, rpm, dstpkg)
173             else:
174                 f.write("file:%s:%s\n" % (arch, rpm))
175                 mv(incoming_dir+arch+'/'+rpm, default_to+arch+'/RPMS')
176         f.close()
177
178         rm(incoming_dir+arch+'/'+uploadinfo)
179
This page took 0.080983 seconds and 3 git commands to generate.