sqlmap/lib/utils/xmlrpc.py
2012-12-12 16:31:20 +01:00

109 lines
3.3 KiB
Python

#!/usr/bin/env python
"""
Copyright (c) 2006-2012 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
"""
import sys
import threading
import types
import xmlrpclib
try:
from SimpleXMLRPCServer import SimpleXMLRPCServer
from lib.controller.controller import start
from lib.core.datatype import AttribDict
from lib.core.data import cmdLineOptions
from lib.core.data import kb
from lib.core.data import logger
from lib.core.option import init
from lib.core.settings import UNICODE_ENCODING
from lib.core.settings import XMLRPC_SERVER_PORT
except ImportError:
XMLRPC_SERVER_PORT = 8776
class XMLRPCServer:
def __init__(self, port):
self.port = port
self.reset()
self.server = SimpleXMLRPCServer(addr=("", self.port), logRequests=False, allow_none=True, encoding=UNICODE_ENCODING)
for _ in dir(self):
if not _.startswith('_') and isinstance(getattr(self, _), types.MethodType):
self.server.register_function(getattr(self, _))
logger.info("Registering RPC methods: %s" % str(self.server.system_listMethods()).strip("[]"))
self.server.register_introspection_functions()
logger.info("Running XML-RPC server at '0.0.0.0:%d'..." % self.port)
def reset(self):
self.options = AttribDict(cmdLineOptions)
def set_option(self, name, value):
self.options[name] = value
return value
def get_option(self, name):
return self.options[name]
def get_option_names(self):
return sorted(self.options.keys())
def is_busy(self):
return kb.get("busyFlag")
def read_output(self):
retval = []
for _ in ("stdout", "stderr"):
stream = getattr(sys, _)
stream.seek(0)
retval.append(stream.read())
stream.truncate(0)
if not filter(None, retval) and not self.is_busy():
retval = None
return retval
def run(self):
if not self.is_busy():
init(self.options, True)
thread = threading.Thread(target=start)
thread.daemon = True
thread.start()
else:
raise Exception, "sqlmap busy"
def serve(self):
self.server.serve_forever()
if __name__ == "__main__":
try:
import readline
except ImportError:
pass
try:
addr = "http://localhost:%d" % (int(sys.argv[1]) if len(sys.argv) > 1 else XMLRPC_SERVER_PORT)
print "[i] Starting debug XML-RPC client to '%s'..." % addr
server = xmlrpclib.ServerProxy(addr)
print "[i] Available RPC methods: %s" % str(server.system.listMethods()).strip("[]")
print "[i] Server instance name: 'server'"
print "[i] Sample usage: 'server.system.listMethods()'"
except Exception, ex:
if ex:
print "[x] '%s'" % str(ex)
else:
while True:
try:
cmd = raw_input("> ")
try:
result = eval(cmd)
print result if result is not None else ""
except SyntaxError:
exec(cmd)
except KeyboardInterrupt:
exit(0)
except Exception, ex:
print "[x] '%s'" % str(ex)