default=False, action="store_true")
parser.add_option("-p", "--port", dest="port",
help="Port to run API",
- default=API_PORT)
+ default=API_PORT, type="int")
parser.add_option("-S", "--https", dest="ssl",
help="Secure HTTP protocol with SSL",
default=False, action="store_true")
options, args = parser.parse_args()
if len(args) != 1 or args[0] not in ("start", "stop"):
- print >>sys.stderr, "Usage: %s [-d] [-p port] start|stop\n" % sys.argv[0]
+ print >> sys.stderr, "Usage: %s [-d] [-p port] start|stop\n" % sys.argv[0]
sys.exit(1)
if options.ssl:
if not (options.ssl_cert and options.ssl_key):
- print >>sys.stderr, "For secure mode please provide " \
+ print >> sys.stderr, "For secure mode please provide " \
"--ssl-key and --ssl-cert arguments"
sys.exit(1)
Return:
Exit code.
"""
- port = int(options.port)
# do the UNIX double-fork magic
try:
pid = os.fork()
# exit first parent
sys.exit(0)
except OSError, e:
- print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
+ print >> sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
return 1
# decouple from parent environment
pid = os.fork()
if pid > 0:
# exit from second parent, print eventual PID before
- print "Ganeti-RAPI PID: %d port: %d" % (pid, port)
+ print "Ganeti-RAPI PID: %d port: %d" % (pid, options.port)
return 0
except OSError, e:
- print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
+ print >> sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
return 1
# start the daemon main loop
def StopAPI(options):
"""Stop the API."""
- port = int(options.port)
try:
- pid = Port2PID(port)
+ pid = Port2PID(options.port)
if pid:
- print "Stopping Ganeti-RAPI PID: %d, port: %d.... " % (pid, port),
+ print "Stopping Ganeti-RAPI PID: %d, port: %d... " \
+ % (pid, options.port),
os.kill(pid, 9)
print "done."
else:
- print >>sys.stderr, "Unable to locate running Ganeti-RAPI on port: %d" % port
+ print >> sys.stderr, "Unable to locate running Ganeti-RAPI on port: %d" \
+ % options.port
+
except Exception, ex:
- print >>sys.stderr, ex
+ print >> sys.stderr, ex
return 1
return 0
#!/usr/bin/python
#
-
# Copyright (C) 2006, 2007 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
import OpenSSL
import logging
import logging.handlers
-import sys
-import os
-from optparse import OptionParser
from ganeti.rapi import resources
"""RESTfull HTTPS Server module.
def OpenLog():
"""Set up logging to the syslog.
+
"""
log = logging.getLogger('ganeti-rapi')
slh = logging.handlers.SysLogHandler('/dev/log',
class RESTHTTPServer(BaseHTTPServer.HTTPServer):
+ """The class to provide HTTP/HTTPS server.
+
+ """
def __init__(self, server_address, HandlerClass, options):
- """ REST Server Constructor.
+ """REST Server Constructor.
Args:
server_address - a touple with pair:
ip - a string with IP address, localhost if null-string
port - port number, integer
- HandlerClass - HTTPRequestHandler object.
- options: command-line options.
+ HandlerClass - HTTPRequestHandler object
+ options - Command-line options
"""
-
-
- SocketServer.BaseServer.__init__(self, server_address, HandlerClass)
+ BaseHTTPServer.HTTPServer.__init__(self,server_address, HandlerClass)
if options.ssl:
# Set up SSL
context = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD)
"""
controller = self.map.getController(uri)
if controller:
- return eval("resources.%s(self, %s, %s)" % controller)
+ return eval("resources.%s(self, %s, %s)" % controller)
else:
raise exceptions.AttribureError
def start(options):
- port = int(options.port)
- httpd = RESTHTTPServer(("", port), RESTRequestHandler, options)
+ httpd = RESTHTTPServer(("", options.port), RESTRequestHandler, options)
try:
httpd.serve_forever()
finally:
- httpd.close()
- del httpd
- return 1
+ httpd.server_close()
if __name__ == "__main__":
class R_Generic(object):
- """ Generic class for resources. """
+ """ Generic class for resources.
+
+ """
def __init__(self, dispatcher, items, args):
""" Gentric resource constructor.
self.items = items
self.args = args
self.code = 200
+ self.result = None
def do_GET(self):
- """Default GET flow."""
+ """Default GET flow.
+
+ """
try:
self._get()
self.send(self.code, self.result)
self.send_error(500, 'Internal Server Error: %s' % msg)
def _get(self):
+ """ GET Stub.
+
+ """
raise AttributeError("GET method is not implemented")
if os.name not in self.valid_os_list:
self.valid_os_list.append(os.name)
else:
- if os.name in valid_os_list:
- self.valid_oslist.remove(os.name)
+ if os.name in self.valid_os_list:
+ self.valid_os_list.remove(os.name)
def _get(self):
request = ganeti.opcodes.OpDiagnoseOS()