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
173
174
175
176
177
178
179
180
|
#!/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 <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 as e:
sys.stderr.write("error: %s\n" % str(e))
sys.exit(1)
if __name__ == "__main__":
main()
# vim:ts=4:sw=4:et
|