#!/usr/bin/python3 from MgaRepo import Error, config, plugins, layout from MgaRepo.mirror import strip_username from MgaRepo.rpmutil import get_srpm from MgaRepo.cgiutil import get_targets from MgaRepo.util import mapurl, execcmd, get_helper from MgaRepo.binrepo import file_hash import sys import os import pwd import optparse import subprocess import urllib.parse import urllib.request, urllib.parse, urllib.error import rpm def get_rpm_hdr(filename): ts = rpm.TransactionSet() f = os.open(filename, os.O_RDONLY) hdr = ts.hdrFromFdno(f) os.close(f) return hdr class youridb: def __init__(self): dbname = config.get("youridb", "dbname") if not dbname: self.usedb = False return import psycopg2 self.usedb = True dbuser = config.get("youridb", "dbuser") dbpasswd = config.get("youridb", "dbpasswd") dbhost = config.get("youridb", "dbhost") sslmode = 1 self.db = psycopg2.connect(database=dbname, user=dbuser, password=dbpasswd, host=dbhost) def add(self, srpm, url, revision, packager): if not self.usedb: return rpmhdr = get_rpm_hdr(srpm) rpmname = rpmhdr[rpm.RPMTAG_NAME] rpmEVR = rpmhdr[rpm.RPMTAG_EVR] rpmsha1 = file_hash(srpm) cur = self.db.cursor() cur.execute("INSERT INTO submits (sha1, rpmname, EVR, packager, url, revision, status, submit_ts) VALUES (%s, %s, %s, %s, %s, %s, %s, CURRENT_TIMESTAMP);", (rpmsha1, rpmname, rpmEVR, packager, url, revision, '1')) cur.close() self.db.commit() def close(self): if not self.usedb: return self.db.close() class CmdError(Error): pass class CmdIface: def author_email(self, author): return config.get("users", author) def submit_package(self, urls, revision, targetname, dontmapurl_=0, define=[]): try: db = youridb() except Exception as e: print('youridb error:', e) return 0 pw = pwd.getpwuid(os.getuid()) username = pw[0] packager = config.get("users", username) or pw[4] if not packager: raise CmdError("your email was not found") elif not targetname: raise CmdError("no target provided") else: targetname = targetname.lower() for target in get_targets(): if target.name.lower() == targetname: break else: raise CmdError("target not found") for url in urls: url = strip_username(url) for allowed in target.allowed: if url.startswith(allowed): break else: raise CmdError("%s is not allowed for this target" \ % url) if not dontmapurl_: #FIXME don't use it! urls = [mapurl(url) for url in urls] uploadsrpms = [] for url in urls: urlrev = revision or layout.get_url_revision(url) url, _ = layout.split_url_revision(url) targetsrpms = get_srpm(url, revision=urlrev, targetdirs=target.target, packager=packager, svnlog=1, revname=1, scripts=target.scripts, macros=target.macros) uploadsrpms.extend(targetsrpms) for srpm in targetsrpms: try: db.add(srpm, url=url, revision=urlrev, packager=packager) except Exception as e: print(e.pgerror) return 0 uploadcmd = get_helper("upload-srpm") if uploadcmd: upload_command = [uploadcmd] if define: for x in define: upload_command.append("--define") upload_command.append(x) upload_command.append(targetname) upload_command.extend(uploadsrpms) command = subprocess.list2cmdline(upload_command) status, output = execcmd(command, noerror=1) for srpm in uploadsrpms: if os.path.isfile(srpm): os.unlink(srpm) else: sys.stderr.write("warning: temporary file "\ "'%s' removed unexpectedly\n" % srpm) if status != 0: raise CmdError("Failed to upload "\ "%s:\n%s" % (" ".join(urls), output)) db.close() return 1 def submit_targets(self): return [x.name for x in get_targets()] def parse_options(): usage = "create-srpm -t " parser = optparse.OptionParser(usage=usage) parser.add_option("-t", "--target", type="string", dest="target", help="target name") parser.add_option("-M", "--nomapping", action="store_true", dest="urlmap", default=False, help="disable url mapping") parser.add_option("--define", action="append") parser.add_option("--list", dest="list_targets", default=False, action="store_true", help="list submit targets available") parser.add_option("-r", help="revision", dest="revision", type="int", default=None) opts, args = parser.parse_args() if not opts.list_targets and not args: parser.error("you must supply a package url") return opts, args def main(): plugins.load() iface = CmdIface() opts, args = parse_options() try: if opts.list_targets: for target in iface.submit_targets(): print(target) else: iface.submit_package(args, opts.revision, opts.target, opts.urlmap, opts.define) except Error as e: sys.stderr.write("error: %s\n" % str(e)) sys.exit(1) if __name__ == "__main__": main() # vim:ts=4:sw=4:et