debian-koji/devtools/fakehub
2020-10-06 15:00:23 +02:00

108 lines
2.7 KiB
Python
Executable file

#!/usr/bin/python3
from __future__ import absolute_import, print_function
import ast
import io
import os
import os.path
import pprint
import sys
from urllib.parse import quote
sys.path.insert(0, os.getcwd())
sys.path.insert(1, os.path.join(os.getcwd(), 'hub'))
import koji
import kojixmlrpc
import koji.xmlrpcplus
def get_url(environ):
url = environ['wsgi.url_scheme']+'://'
if environ.get('HTTP_HOST'):
url += environ['HTTP_HOST']
else:
url += environ['SERVER_NAME']
if environ['wsgi.url_scheme'] == 'https':
if environ['SERVER_PORT'] != '443':
url += ':' + environ['SERVER_PORT']
else:
if environ['SERVER_PORT'] != '80':
url += ':' + environ['SERVER_PORT']
url += quote(environ.get('SCRIPT_NAME', ''))
url += quote(environ.get('PATH_INFO', ''))
if environ.get('QUERY_STRING'):
url += '?' + environ['QUERY_STRING']
return url
def nice_literal(value):
try:
return ast.literal_eval(value)
except (ValueError, SyntaxError):
return value
def get_request():
method = sys.argv[1]
args = []
kwargs = {}
for s in sys.argv[2:]:
if '=' in s:
k, v = s.split('=', 1)
v = nice_literal(v)
kwargs[k] = v
else:
args.append(nice_literal(s))
args = koji.encode_args(*args, **kwargs)
request = koji.xmlrpcplus.dumps(args, method, allow_none=1)
return request
def start_response(status, headers):
pprint.pprint("Status: %r" % status)
pprint.pprint("Headers: %r" % headers)
def parse_response(data):
p, u = koji.xmlrpcplus.getparser()
for chunk in data:
p.feed(chunk)
p.close()
result = u.close()
if len(result) == 1:
result = result[0]
return result
def set_config(environ):
lconfig = "%s/devtools/fakehub.conf" % os.getcwd()
lconfigd = "%s/devtools/fakehub.conf.d" % os.getcwd()
if os.path.exists(lconfig) or os.path.exists(lconfigd):
environ['koji.hub.ConfigFile'] = lconfig
environ['koji.hub.ConfigDir'] = lconfigd
def main():
environ = {}
environ['SCRIPT_FILENAME'] = kojixmlrpc.__file__
environ['wsgi.url_scheme'] = 'https'
environ['SERVER_NAME'] = 'myserver'
environ['SERVER_PORT'] = '443'
environ['REQUEST_URI'] = get_url(environ)
environ['wsgi.input'] = io.StringIO(get_request())
environ['REQUEST_METHOD'] = 'POST'
environ['CONTENT_TYPE'] = 'text/xml'
set_config(environ)
print('RESULT:')
data = kojixmlrpc.application(environ, start_response)
result = parse_response(data)
pprint.pprint(result)
if __name__ == '__main__':
main()