]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blobdiff - bin/pfa-from-incoming
Fix umask values (python3 compat)
[projects/pld-ftp-admin.git] / bin / pfa-from-incoming
old mode 100644 (file)
new mode 100755 (executable)
index 5194623..1696bf6
@@ -1,90 +1,60 @@
 #!/usr/bin/env python
 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
 
-import sys, os, stat, time
+from __future__ import print_function
+
+import sys, os, stat, time, re
 sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
 from config import incoming_dir, default_to, ftp_archs
+from config import value as cval
 import config
 from common import noarchcachedir, tmpdir, fileexists
 from baseftptree import BaseFtpTree, BasePkg
-cval=config.value
+from ftptree import FtpTree, Pkg
 import ftpio
 
-try:
-    ftpio.connect('from-incoming-pid-%s' % os.getpid())
-except:
-    sys.exit(0)
+os.umask(0o022)
 
 def rm(file):
     os.remove(file)
-    #print 'rm: '+file
 
 def mv(src, dst):
-    os.rename(src, dst+'/'+src.split('/')[-1])
-    #print "mv: %s %s" % (src, dst+'/'+src.split('/')[-1])
+    os.rename(src, dst + '/' + src.split('/')[-1])
+
+# duplicate code in ftptree.py
+def is_debuginfo(nvr):
+    """
+    returns true if NVR is debuginfo package and separate debuginfo is enabled
+    """
+    if not config.separate_debuginfo:
+        return False
+    pkg = nvr.split('-')[:-2]
+    return pkg[-1] == 'debuginfo'
 
 def findfiles(dir):
     def filterinfos(x):
-        if x[-11:]=='.uploadinfo':
-            mtime = os.stat(dir + '/' + x)[ST_MTIME]
-            now = time.time()
-            # don't look into uploadinfo files for 30 seconds after scp
-            if now - mtime > 30:
-                return True
-            else:
-                return False
+        if x[-11:] == '.uploadinfo':
+            return True
         else:
             return False
     return filter(filterinfos, os.listdir(dir))
 
 def getcontent(file):
-    f=open(file, 'r')
-    content=f.read()
+    f = open(file, 'r')
+    content = f.read()
     f.close()
-    if not content[-5:]=='\nEND\n':
+    if not content[-5:] == '\nEND\n':
         return None
     else:
         return content[:-4]
 
-ftptree=BaseFtpTree(cval['default_to'])
-
-if not ftpio.lock(cval['default_to']):
-    sys.exit(0)
-
-for uploadinfo in findfiles(incoming_dir+'SRPMS'):
-    content=getcontent(incoming_dir+'SRPMS/'+uploadinfo)
-    if not content:
-        continue # Uploading not finished
-
-    pkg=BasePkg(uploadinfo[:-19], content=content)
-    srpm=pkg.files['SRPMS'][0]
-
-    if ftptree.has_key(`pkg`):
-        ftpio.log("%s already present in %s; removing newer files" %
-            (srpm, ftptree))
-        rm(incoming_dir+'SRPMS/'+srpm)
-        f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'a')
-        bid=pkg.build.keys()[0]
-        build=pkg.build[bid]
-        f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
-                 % (bid, build.requester, bid, build.requester_email))
-        f.close()
-    else:
-        mv(incoming_dir+'SRPMS/'+srpm, default_to+'SRPMS/RPMS')
-        f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'w')
-        f.write(content)
-        f.close()
-
-    rm(incoming_dir+'SRPMS/'+uploadinfo)
-
-def send_noarch_msg(files_differ, reqs_differ, pkg, rpm, arch):
+def send_noarch_msg(files_differ, reqs_differ, pkg, rpmfile, arch):
     req_email=pkg.build[pkg.lastbid].requester_email
     req_bid=pkg.lastbid
     cc_list=[]
     if 'logs_list' in cval:
         cc_list.append(cval['logs_list'])
-    m_subject="Noarch error: %s files differ among builders" % rpm
+    m_subject="Noarch error: %s files differ among builders" % rpmfile
     bids=pkg.build.keys()
     if len(bids)>1:
         for bid in bids:
@@ -103,13 +73,13 @@ Subject: %s
 """ % (cval['xpldbuilder'], req_bid, req_bid, m_subject)
 
     sm = os.popen("/usr/sbin/sendmail -t", "w")
-    
+
     sm.write(msg)
 
     if files_differ:
         f=open("%s/files.diff" % tmpdir, 'r')
         sm.write("Difference between %s (currently in %s) and %s FILES\n" %
-              (pkg.noarch_arch[rpm], `ftptree`, arch)),
+              (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
         for line in f.readlines(True)[2:]:
             sm.write(line)
         f.close()
@@ -119,80 +89,193 @@ Subject: %s
     if reqs_differ:
         f=open("%s/reqs.diff" % tmpdir, 'r')
         sm.write("Difference between %s (currently in %s) and %s REQS\n" %
-              (pkg.noarch_arch[rpm], `ftptree`, arch)),
+              (pkg.noarch_arch[rpmfile], `ftptree`, arch)),
         for line in f.readlines(True)[2:]:
             sm.write(line)
         f.close()
 
     sm.close()
 
-   
-
-def move_noarch(f, arch, rpm, dstpkg):
-    if dstpkg.noarch_arch.has_key(rpm):
-        os.system("rpm -qlp %s > %s/files.new" %
-                  (incoming_dir+arch+'/'+rpm, tmpdir))
-        os.system("rpm -qRp %s |sort|uniq > %s/reqs.new" %
-                  (incoming_dir+arch+'/'+rpm, tmpdir))
+def move_noarch(f, arch, rpmfile, dstpkg):
+    if dstpkg.noarch_arch.has_key(rpmfile):
+        os.system("LC_ALL=C rpm -qlp %s | LC_ALL=C sort > %s/files.new" %
+                  (incoming_dir + arch + '/' + rpmfile, tmpdir))
+        os.system("rpm -qRp %s | LC_ALL=C sort | LC_ALL=C uniq > %s/reqs.new" %
+                  (incoming_dir + arch + '/' + rpmfile, tmpdir))
 
-        files_differ=False
-        reqs_differ=False
+        files_differ = False
+        reqs_differ = False
 
         if os.system("diff -u %s/%s.filelist %s/files.new > %s/files.diff" %
-                     (noarchcachedir, rpm, tmpdir, tmpdir)):
-            files_differ=True
+                     (noarchcachedir, rpmfile, tmpdir, tmpdir)):
+            files_differ = True
         if os.system("diff -u %s/%s.reqlist %s/reqs.new > %s/reqs.diff" %
-                     (noarchcachedir, rpm, tmpdir, tmpdir)):
-            reqs_differ=True
+                     (noarchcachedir, rpmfile, tmpdir, tmpdir)):
+            reqs_differ = True
 
         if files_differ or reqs_differ:
-            send_noarch_msg(files_differ, reqs_differ, dstpkg, rpm, arch)
+            send_noarch_msg(files_differ, reqs_differ, dstpkg, rpmfile, arch)
+
+        rm(incoming_dir + arch + '/' + rpmfile)
+    else:
+        os.system("LC_ALL=C rpm -qlp %s | LC_ALL=C sort > %s/%s.filelist" %
+                  (incoming_dir + arch + '/' + rpmfile, noarchcachedir, rpmfile))
+        os.system("rpm -qRp %s | LC_ALL=C sort | LC_ALL=C uniq > %s/%s.reqlist" %
+                  (incoming_dir + arch + '/' + rpmfile, noarchcachedir, rpmfile))
+        if not dstpkg.files.has_key(arch):
+            f.write("file:noarch:%s\ninfo:noarch_arch:%s:%s\n" % (rpmfile, rpmfile, arch))
+        mv(incoming_dir + arch + '/' + rpmfile, default_to + 'noarch/RPMS')
+
+def send_vr_msg(snvr, anvr, pkg, arch):
+    req_email=pkg.build[pkg.lastbid].requester_email
+    req_bid=pkg.lastbid
+    cc_list=[]
+    if 'logs_list' in cval:
+        cc_list.append(cval['logs_list'])
+    m_subject="NVR error: %s version or relese differ among subpackages" % snvr[0]
+    bids=pkg.build.keys()
+    if len(bids)>1:
+        for bid in bids:
+            newcc=pkg.build[bid].requester_email
+            if req_email!=newcc and newcc not in cc_list:
+                cc_list.append(newcc)
+
+    msg="From: %s\nTo: %s\n" % (cval['from_field'], req_email)
+    if cc_list:
+        msg=msg+"Cc: %s\n" % ", ".join(cc_list)
+    msg=msg+"""X-PLD-Builder: %s
+References: <%s@pld.src.builder>
+In-Reply-To: <%s@pld.src.builder>
+Subject: %s
+
+""" % (cval['xpldbuilder'], req_bid, req_bid, m_subject)
+
+    sm = os.popen("/usr/sbin/sendmail -t", "w")
+
+    sm.write(msg)
+
+    sm.write("Difference between %s SRPM (currently in %s) and %s RPM NVR:\n\n" %
+          (snvr[0], `ftptree`, arch)),
+    sm.write("Expected (%s):\nV: %s\nR: %s\n\n" % snvr)
+    sm.write("RPM:\nN: %s\nV: %s\nR: %s\n" % anvr)
+    sm.write('\n')
+
+    sm.close()
+
+# main()
+try:
+    ftpio.connect('from-incoming-pid-%s' % os.getpid())
+except:
+    print("Can't get ftpiod connection")
+    sys.exit(1)
+
+ftptree = BaseFtpTree(cval['default_to'])
+
+if not ftpio.lock(cval['default_to']):
+    print("Can't get lock: %s" % cval['default_to'])
+    sys.exit(1)
+
+moved_anything = False
+
+for uploadinfo in findfiles(incoming_dir + 'SRPMS'):
+    content = getcontent(incoming_dir + 'SRPMS/' + uploadinfo)
+    if not content:
+        continue # Uploading not finished
+
+    pkg = BasePkg(uploadinfo[:-19], content = content)
+    srpm = pkg.files['SRPMS'][0]
 
-        rm(incoming_dir+arch+'/'+rpm)
+    if not os.path.exists(incoming_dir + 'SRPMS/' + srpm):
+        ftpio.log("%s file missing; skipping move until next round" % (srpm))
+        continue
+
+    if ftptree.has_key(`pkg`):
+        ftpio.log("%s already present in %s; removing older files" % (srpm, ftptree))
+        rm(default_to + 'SRPMS/RPMS/' + srpm)
+        f = open(default_to + 'SRPMS/.metadata/' + srpm+'.info', 'a')
+        bid = pkg.build.keys()[0]
+        build = pkg.build[bid]
+        f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\n"
+                 % (bid, build.requester, bid, build.requester_email))
+        f.close()
     else:
-        os.system("rpm -qlp %s > %s/%s.filelist" %
-                  (incoming_dir+arch+'/'+rpm, noarchcachedir, rpm))
-        os.system("rpm -qRp %s |sort|uniq > %s/%s.reqlist" % 
-                  (incoming_dir+arch+'/'+rpm, noarchcachedir, rpm))
-        f.write("file:noarch:%s\ninfo:noarch_arch:%s:%s\n" % (rpm, rpm, arch))
-        mv(incoming_dir+arch+'/'+rpm, default_to+'noarch/RPMS')
+        f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'w')
+        f.write(content)
+        f.close()
+
+    mv(incoming_dir + 'SRPMS/' + srpm, default_to + 'SRPMS/RPMS')
+    rm(incoming_dir + 'SRPMS/' + uploadinfo)
 
 for arch in ftp_archs:
-    for uploadinfo in findfiles(incoming_dir+arch):
-        content=getcontent(incoming_dir+arch+'/'+uploadinfo)
+    for uploadinfo in findfiles(incoming_dir + arch):
+        content = getcontent(incoming_dir + arch + '/' + uploadinfo)
         if not content:
+            ftpio.log("%s not finished uploading" % uploadinfo)
             continue # Uploading not finished
 
-        srcpkg=BasePkg(uploadinfo[:-19], content=content)
-        srpm=srcpkg.files['SRPMS'][0]
+        srcpkg = BasePkg(uploadinfo[:-19], content = content)
+        srpm = srcpkg.files['SRPMS'][0]
 
         if not ftptree.has_key(`srcpkg`):
             continue # We require the src.rpm to be present
 
-        dstpkg=BasePkg(`srcpkg`, ftptree)
+        renvr = re.compile(r'(.*)-(.*)-(.*)\.[^.]*\.rpm')
+        srcnvr = renvr.match(srpm).groups()
+
+        rpmfile_missing = [f for f in srcpkg.files['ARCH'] if not os.path.exists(incoming_dir + arch + '/'+f)]
+        if len(rpmfile_missing):
+            for filem in rpmfile_missing:
+                ftpio.log("%s file missing; skipping move until next round" % (filem))
+            continue
+
+        dstpkg = BasePkg(`srcpkg`, ftptree)
 
         if dstpkg.files.has_key(arch):
-            ftpio.log("files from %s for arch %s already present in %s; removing newer files" % (`srcpkg`, arch, ftptree))
-            for rpm in srcpkg.files['ARCH']:
+            ftpio.log("files from %s for arch %s already present in %s; removing older files" % (`srcpkg`, arch, ftptree))
+            for rpmfile in dstpkg.files[arch]:
+                if is_debuginfo(rpmfile):
+                    dstfile = default_to + arch + '/debuginfo'
+                else:
+                    dstfile = default_to + arch + '/RPMS'
                 try:
-                    rm(incoming_dir+arch+'/'+rpm)
-                except OSError, e:
-                    l = "Removing %s problem: %s" % (incoming_dir+arch+'/'+rpm, e)
+                    rm(dstfile + '/' + rpmfile)
+                except OSError as e:
+                    l = "Removing %s problem: %s" % (dstfile + '/' + rpmfile, e)
                     ftpio.log(l)
-                    print l
-            rm(incoming_dir+arch+'/'+uploadinfo)
-            continue
+                    print(l)
+
+        f = open(default_to + 'SRPMS/.metadata/' + srpm + '.info', 'a')
+        for rpmfile in srcpkg.files['ARCH']:
+            moved_anything = True
 
-        f=open(default_to+'SRPMS/.metadata/'+srpm+'.info', 'a')
-        for rpm in srcpkg.files['ARCH']:
-            if rpm[-11:]=='.noarch.rpm' and config.separate_noarch:
-                move_noarch(f, arch, rpm, dstpkg)
+# Too much noise, too little use
+#            archnvr = renvr.match(rpmfile).groups()
+#            if srcnvr[1] != archnvr[1] or srcnvr[2] != archnvr[2]:
+#                send_vr_msg(srcnvr, archnvr, dstpkg, arch)
+
+            if rpmfile[-11:] == '.noarch.rpm' and config.separate_noarch:
+                move_noarch(f, arch, rpmfile, dstpkg)
             else:
-                f.write("file:%s:%s\n" % (arch, rpm))
-                mv(incoming_dir+arch+'/'+rpm, default_to+arch+'/RPMS')
+                if not dstpkg.files.has_key(arch):
+                    f.write("file:%s:%s\n" % (arch, rpmfile))
+                srcfile = incoming_dir + arch + '/' + rpmfile
+
+                if is_debuginfo(rpmfile):
+                    dstfile = default_to + arch + '/debuginfo'
+                else:
+                    dstfile = default_to + arch + '/RPMS'
+
+                try:
+                    mv(srcfile, dstfile)
+                except OSError as e:
+                    l = "Moving %s to %s problem: %s" % (srcfile, dstfile, e)
+                    ftpio.log(l)
+                    print(l)
         f.close()
 
-        rm(incoming_dir+arch+'/'+uploadinfo)
+        rm(incoming_dir + arch + '/' + uploadinfo)
 
 ftpio.unlock(cval['default_to'])
 
+if moved_anything:
+    os.system("%s/pld-ftp-admin/bin/pfa-genindex --quiet test > /dev/null" % (os.getenv("HOME")))
This page took 0.079522 seconds and 4 git commands to generate.