aboutsummaryrefslogtreecommitdiffstats
path: root/create-srpm
blob: 837c776ed9b8c0c77cba14dae7e4f14d53931474 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#!/usr/bin/python

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 urlparse
import urllib
import psycopg2
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")
        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):
        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):
        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, 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, 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 <packageurl> -t <target>"
    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, e:
        sys.stderr.write("error: %s\n" % str(e))
        sys.exit(1)
    

if __name__ == "__main__":
    main()

# vim:ts=4:sw=4:et