1 | #!/usr/bin/python |
---|
2 | from RepSys import Error, config |
---|
3 | from RepSys.rpmutil import get_srpm |
---|
4 | from RepSys.cgiutil import CgiError, get_targets |
---|
5 | import sys |
---|
6 | import os |
---|
7 | |
---|
8 | import xmlrpclib, cgi |
---|
9 | |
---|
10 | class XmlRpcIface: |
---|
11 | def author_email(self, author): |
---|
12 | return config.get("users", author) |
---|
13 | |
---|
14 | def submit_package(self, packageurl, packagerev, targetname): |
---|
15 | username = os.environ.get("REMOTE_USER") |
---|
16 | packager = config.get("users", username) |
---|
17 | if not packager: |
---|
18 | raise CgiError, "your email was not found" |
---|
19 | elif not packagerev: |
---|
20 | raise CgiError, "no revision provided" |
---|
21 | elif not targetname: |
---|
22 | raise CgiError, "no target provided" |
---|
23 | else: |
---|
24 | targetname = targetname.lower() |
---|
25 | for target in get_targets(): |
---|
26 | if target.name.lower() == targetname: |
---|
27 | break |
---|
28 | else: |
---|
29 | raise CgiError, "target not found" |
---|
30 | try: |
---|
31 | tmp = int(packagerev) |
---|
32 | except ValueError: |
---|
33 | raise CgiError, "invalid revision provided" |
---|
34 | for allowed in target.allowed: |
---|
35 | if packageurl.startswith(allowed): |
---|
36 | break |
---|
37 | else: |
---|
38 | raise CgiError, "%s is not allowed for this target" \ |
---|
39 | % packageurl |
---|
40 | get_srpm(packageurl, |
---|
41 | revision=packagerev, |
---|
42 | targetdirs=target.target, |
---|
43 | packager=packager, |
---|
44 | revname=1, |
---|
45 | svnlog=1, |
---|
46 | scripts=target.scripts) |
---|
47 | return 1 |
---|
48 | |
---|
49 | def submit_targets(self): |
---|
50 | return [x.name for x in get_targets()] |
---|
51 | |
---|
52 | TEMPLATE = """\ |
---|
53 | Content-type: text/html |
---|
54 | |
---|
55 | <html> |
---|
56 | <head> |
---|
57 | <title>Repository system SOAP server</title> |
---|
58 | </head> |
---|
59 | <body bgcolor="white"> |
---|
60 | <br> |
---|
61 | <hr> |
---|
62 | <center> |
---|
63 | <b>%(message)s</b> |
---|
64 | </center> |
---|
65 | <hr> |
---|
66 | </body> |
---|
67 | </html> |
---|
68 | """ |
---|
69 | |
---|
70 | def show(msg="", error=0): |
---|
71 | if error: |
---|
72 | msg = '<font color="red">%s</font>' % msg |
---|
73 | print TEMPLATE % {"message":msg} |
---|
74 | |
---|
75 | def main(): |
---|
76 | if not os.environ.has_key('REQUEST_METHOD'): |
---|
77 | sys.stderr.write("error: this program is meant to be used as a cgi\n") |
---|
78 | sys.exit(1) |
---|
79 | username = os.environ.get("REMOTE_USER") |
---|
80 | method = os.environ.get("REQUEST_METHOD") |
---|
81 | if not username or method != "POST": |
---|
82 | show("This is a XMLRPC interface!", error=1) |
---|
83 | sys.exit(1) |
---|
84 | |
---|
85 | iface = XmlRpcIface() |
---|
86 | |
---|
87 | response = "" |
---|
88 | try: |
---|
89 | form = cgi.FieldStorage() |
---|
90 | parms, method = xmlrpclib.loads(form.value) |
---|
91 | meth = getattr(iface, method) |
---|
92 | response = (meth(*parms),) |
---|
93 | except CgiError, e: |
---|
94 | msg = str(e) |
---|
95 | try: |
---|
96 | msg = msg.decode("iso-8859-1") |
---|
97 | except UnicodeError: |
---|
98 | pass |
---|
99 | response = xmlrpclib.Fault(1, msg) |
---|
100 | except Exception, e: |
---|
101 | msg = str(e) |
---|
102 | try: |
---|
103 | msg = msg.decode("iso-8859-1") |
---|
104 | except UnicodeError: |
---|
105 | pass |
---|
106 | response = xmlrpclib.Fault(1, msg) |
---|
107 | |
---|
108 | sys.stdout.write("Content-type: text/xml\n\n") |
---|
109 | sys.stdout.write(xmlrpclib.dumps(response, methodresponse=1)) |
---|
110 | |
---|
111 | # vim:et:ts=4:sw=4 |
---|