aboutsummaryrefslogtreecommitdiffstats
path: root/RepSys/cgi
diff options
context:
space:
mode:
Diffstat (limited to 'RepSys/cgi')
-rw-r--r--RepSys/cgi/__init__.py0
-rw-r--r--RepSys/cgi/soapserver.py93
-rw-r--r--RepSys/cgi/submit.py119
-rw-r--r--RepSys/cgi/xmlrpcserver.py111
4 files changed, 323 insertions, 0 deletions
diff --git a/RepSys/cgi/__init__.py b/RepSys/cgi/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/RepSys/cgi/__init__.py
diff --git a/RepSys/cgi/soapserver.py b/RepSys/cgi/soapserver.py
new file mode 100644
index 0000000..2f6b751
--- /dev/null
+++ b/RepSys/cgi/soapserver.py
@@ -0,0 +1,93 @@
+#!/usr/bin/python
+from RepSys import Error, config
+from RepSys.rpmutil import get_srpm
+from RepSys.cgiutil import CgiError, get_targets
+import sys
+import os
+
+try:
+ import NINZ.dispatch
+except ImportError:
+ NINZ = None
+
+class SoapIface:
+ def author_email(self, author):
+ return config.get("users", author)
+
+ def submit_package(self, packageurl, packagerev, targetname):
+ username = os.environ.get("REMOTE_USER")
+ packager = config.get("users", username)
+ if not packager:
+ raise CgiError, "your email was not found"
+ elif not packagerev:
+ raise CgiError, "no revision provided"
+ elif not targetname:
+ raise CgiError, "no target provided"
+ else:
+ targetname = targetname.lower()
+ for target in get_targets():
+ if target.name.lower() == targetname:
+ break
+ else:
+ raise CgiError, "target not found"
+ try:
+ tmp = int(packagerev)
+ except ValueError:
+ raise CgiError, "invalid revision provided"
+ for allowed in target.allowed:
+ if packageurl.startswith(allowed):
+ break
+ else:
+ raise CgiError, "%s is not allowed for this target" \
+ % packageurl
+ get_srpm(packageurl,
+ revision=packagerev,
+ targetdirs=target.target,
+ packager=packager,
+ revname=1,
+ svnlog=1,
+ scripts=target.scripts)
+ return 1
+
+ def submit_targets(self):
+ return [x.name for x in get_targets()]
+
+TEMPLATE = """\
+Content-type: text/html
+
+<html>
+<head>
+<title>Repository system SOAP server</title>
+</head>
+<body bgcolor="white">
+<br>
+<hr>
+<center>
+<b>%(message)s</b>
+</center>
+<hr>
+</body>
+</html>
+"""
+
+def show(msg="", error=0):
+ if error:
+ msg = '<font color="red">%s</font>' % msg
+ print TEMPLATE % {"message":msg}
+
+def main():
+ if not os.environ.has_key('REQUEST_METHOD'):
+ sys.stderr.write("error: this program is meant to be used as a cgi\n")
+ sys.exit(1)
+ if not NINZ:
+ show("NINZ is not properly installed in this system", error=1)
+ sys.exit(1)
+ username = os.environ.get("REMOTE_USER")
+ method = os.environ.get("REQUEST_METHOD")
+ if not username or method != "POST":
+ show("This is a SOAP interface!", error=1)
+ sys.exit(1)
+
+ NINZ.dispatch.AsCGI(modules=(SoapIface(),))
+
+# vim:et:ts=4:sw=4
diff --git a/RepSys/cgi/submit.py b/RepSys/cgi/submit.py
new file mode 100644
index 0000000..10f7cb2
--- /dev/null
+++ b/RepSys/cgi/submit.py
@@ -0,0 +1,119 @@
+#!/usr/bin/python
+from RepSys import Error, config
+from RepSys.rpmutil import get_srpm
+from RepSys.cgiutil import CgiError, get_targets
+import cgi
+import sys
+import os
+
+TEMPLATE = """\
+<html>
+<head>
+<title>Repository package submission system</title>
+</head>
+<body bgcolor="white">
+<table cellspacing=0 cellpadding=0 border=0 width="100%%">
+ <tr bgcolor="#020264"><td align="left" valign="middle"><img src="http://qa.mandriva.com/mandriva.png" hspace=0 border=0 alt=""></td></tr>
+</table>
+<br>
+<hr>
+<center>
+<b>%(message)s</b>
+<br><br>
+<form method="POST" action="">
+<table><tr><td valign="top">
+ Package URL:<br>
+ <input name="packageurl" size="60" value="svn+ssh://cvs.mandriva.com/svn/mdv/cooker/"><br>
+ <small>Ex. svn+ssh://cvs.mandriva.com/svn/mdv/cooker/pkgname</small><br>
+ </td><td valign="top">
+ Revision:<br>
+ <input name="packagerev" size="10" value=""><br>
+ </td></tr></table>
+ <br>
+ Package target:<br>
+ <select name="target" size=5>
+ %(targetoptions)s
+ </select><br>
+ <br>
+ <input type="submit" value="Submit package">
+</form>
+</center>
+<hr/>
+</body>
+</html>
+"""
+
+def get_targetoptions():
+ s = ""
+ selected = " selected"
+ for target in get_targets():
+ s += '<option value="%s"%s>%s</option>' \
+ % (target.name, selected, target.name)
+ selected = ""
+ return s
+
+def show(msg="", error=0):
+ if error:
+ msg = '<font color="red">%s</font>' % msg
+ print TEMPLATE % {"message":msg, "targetoptions":get_targetoptions()}
+
+def submit_packages(packager):
+ form = cgi.FieldStorage()
+ packageurl = form.getfirst("packageurl", "").strip()
+ packagerev = form.getfirst("packagerev", "").strip()
+ if not packageurl:
+ show()
+ elif not packagerev:
+ raise CgiError, "No revision provided!"
+ else:
+ targetname = form.getfirst("target")
+ if not targetname:
+ raise CgiError, "No target selected!"
+ for target in get_targets():
+ if target.name == targetname:
+ break
+ else:
+ raise CgiError, "Target not found!"
+ try:
+ tmp = int(packagerev)
+ except ValueError:
+ raise CgiError, "Invalid revision provided!"
+ for allowed in target.allowed:
+ if packageurl.startswith(allowed):
+ break
+ else:
+ raise CgiError, "%s is not allowed for this target!" % packageurl
+ get_srpm(packageurl,
+ revision=packagerev,
+ targetdirs=target.target,
+ packager=packager,
+ revname=1,
+ svnlog=1,
+ scripts=target.scripts)
+ show("Package submitted!")
+
+def main():
+ if not os.environ.has_key('REQUEST_METHOD'):
+ sys.stderr.write("error: this program is meant to be used as a cgi\n")
+ sys.exit(1)
+ print "Content-type: text/html\n\n"
+ try:
+ username = os.environ.get("REMOTE_USER")
+ method = os.environ.get("REQUEST_METHOD")
+ if not username or method != "POST":
+ show()
+ else:
+ useremail = config.get("users", username)
+ if not useremail:
+ raise CgiError, \
+ "Your email was not found. Contact the administrator!"
+ submit_packages(useremail)
+ except CgiError, e:
+ show(str(e), error=1)
+ except Error, e:
+ error = str(e)
+ show(error[0].upper()+error[1:], error=1)
+ except:
+ cgi.print_exception()
+
+# vim:et:ts=4:sw=4
diff --git a/RepSys/cgi/xmlrpcserver.py b/RepSys/cgi/xmlrpcserver.py
new file mode 100644
index 0000000..e0851d1
--- /dev/null
+++ b/RepSys/cgi/xmlrpcserver.py
@@ -0,0 +1,111 @@
+#!/usr/bin/python
+from RepSys import Error, config
+from RepSys.rpmutil import get_srpm
+from RepSys.cgiutil import CgiError, get_targets
+import sys
+import os
+
+import xmlrpclib, cgi
+
+class XmlRpcIface:
+ def author_email(self, author):
+ return config.get("users", author)
+
+ def submit_package(self, packageurl, packagerev, targetname):
+ username = os.environ.get("REMOTE_USER")
+ packager = config.get("users", username)
+ if not packager:
+ raise CgiError, "your email was not found"
+ elif not packagerev:
+ raise CgiError, "no revision provided"
+ elif not targetname:
+ raise CgiError, "no target provided"
+ else:
+ targetname = targetname.lower()
+ for target in get_targets():
+ if target.name.lower() == targetname:
+ break
+ else:
+ raise CgiError, "target not found"
+ try:
+ tmp = int(packagerev)
+ except ValueError:
+ raise CgiError, "invalid revision provided"
+ for allowed in target.allowed:
+ if packageurl.startswith(allowed):
+ break
+ else:
+ raise CgiError, "%s is not allowed for this target" \
+ % packageurl
+ get_srpm(packageurl,
+ revision=packagerev,
+ targetdirs=target.target,
+ packager=packager,
+ revname=1,
+ svnlog=1,
+ scripts=target.scripts)
+ return 1
+
+ def submit_targets(self):
+ return [x.name for x in get_targets()]
+
+TEMPLATE = """\
+Content-type: text/html
+
+<html>
+<head>
+<title>Repository system SOAP server</title>
+</head>
+<body bgcolor="white">
+<br>
+<hr>
+<center>
+<b>%(message)s</b>
+</center>
+<hr>
+</body>
+</html>
+"""
+
+def show(msg="", error=0):
+ if error:
+ msg = '<font color="red">%s</font>' % msg
+ print TEMPLATE % {"message":msg}
+
+def main():
+ if not os.environ.has_key('REQUEST_METHOD'):
+ sys.stderr.write("error: this program is meant to be used as a cgi\n")
+ sys.exit(1)
+ username = os.environ.get("REMOTE_USER")
+ method = os.environ.get("REQUEST_METHOD")
+ if not username or method != "POST":
+ show("This is a XMLRPC interface!", error=1)
+ sys.exit(1)
+
+ iface = XmlRpcIface()
+
+ response = ""
+ try:
+ form = cgi.FieldStorage()
+ parms, method = xmlrpclib.loads(form.value)
+ meth = getattr(iface, method)
+ response = (meth(*parms),)
+ except CgiError, e:
+ msg = str(e)
+ try:
+ msg = msg.decode("iso-8859-1")
+ except UnicodeError:
+ pass
+ response = xmlrpclib.Fault(1, msg)
+ except Exception, e:
+ msg = str(e)
+ try:
+ msg = msg.decode("iso-8859-1")
+ except UnicodeError:
+ pass
+ response = xmlrpclib.Fault(1, msg)
+
+ sys.stdout.write("Content-type: text/xml\n\n")
+ sys.stdout.write(xmlrpclib.dumps(response, methodresponse=1))
+
+# vim:et:ts=4:sw=4