#!/usr/bin/python
#

# Copyright (C) 2006, 2007 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.

""" Ganeti Remote API master script.
"""

import glob
import optparse
import sys
import os

# we need to import rpc early in order to get our custom reactor,
# instead of the default twisted one; without this, things breaks in a
# not-nice-to-debug way
from ganeti import rpc
from ganeti import constants
from ganeti import utils
from ganeti.rapi import RESTHTTPServer


def ParseOptions():
  """Parse the command line options.

  Returns:
    (options, args) as from OptionParser.parse_args()

  """
  parser = optparse.OptionParser(description="Ganeti Remote API",
                    usage="%prog [-d] [-p port]",
                    version="%%prog (ganeti) %s" %
                                 constants.RAPI_VERSION)
  parser.add_option("-d", "--debug", dest="debug",
                    help="Enable some debug messages",
                    default=False, action="store_true")
  parser.add_option("-p", "--port", dest="port",
                    help="Port to run API (%s default)." %
                                 constants.RAPI_PORT,
                    default=constants.RAPI_PORT, type="int")
  parser.add_option("-S", "--https", dest="ssl",
                    help="Secure HTTP protocol with SSL",
                    default=False, action="store_true")
  parser.add_option("-K", "--ssl-key", dest="ssl_key",
                    help="SSL key",
                    default=None, type="string")
  parser.add_option("-C", "--ssl-cert", dest="ssl_cert",
                    help="SSL certificate",
                    default=None, type="string")
  parser.add_option("-f", "--foreground", dest="fork",
                    help="Don't detach from the current terminal",
                    default=True, action="store_false")

  options, args = parser.parse_args()

  if len(args) != 0:
    print >> sys.stderr, "Usage: %s [-d] [-p port]" % sys.argv[0]
    sys.exit(1)

  if options.ssl and not (options.ssl_cert and options.ssl_key):
    print >> sys.stderr, ("For secure mode please provide "
                         "--ssl-key and --ssl-cert arguments")
    sys.exit(1)

  return options, args


def main():
  """Main function.

  """
  options, args = ParseOptions()
  if options.fork:
    utils.Daemonize(logfile=constants.LOG_RAPISERVER)
  RESTHTTPServer.start(options)
  sys.exit(0)


if __name__ == '__main__':
  main()
