Passing the paths in seems more logical.
---
 daemons/ganeti-confd |    1 +
 daemons/ganeti-noded |    4 +++-
 daemons/ganeti-rapi  |    4 +++-
 lib/constants.py     |    6 ------
 lib/daemon.py        |   40 +++++++++++++++++++++++++++-------------
 5 files changed, 34 insertions(+), 21 deletions(-)

diff --git a/daemons/ganeti-confd b/daemons/ganeti-confd
index 4d19ea6..f508783 100755
--- a/daemons/ganeti-confd
+++ b/daemons/ganeti-confd
@@ -40,6 +40,7 @@ from ganeti.confd import server as confd_server
 from ganeti import constants
 from ganeti import errors
 from ganeti import daemon
+from ganeti import utils
 from ganeti import ssconf
 
 
diff --git a/daemons/ganeti-noded b/daemons/ganeti-noded
index 5ee2eef..f963da4 100755
--- a/daemons/ganeti-noded
+++ b/daemons/ganeti-noded
@@ -820,7 +820,9 @@ def main():
   dirs.append((constants.LOG_OS_DIR, 0750))
   dirs.append((constants.LOCK_DIR, 1777))
   daemon.GenericMain(constants.NODED, parser, dirs, None, ExecNoded,
-                     default_port=utils.GetDaemonPort(constants.NODED))
+                     default_port=utils.GetDaemonPort(constants.NODED),
+                     default_ssl_cert=constants.SSL_CERT_FILE,
+                     default_ssl_key=constants.SSL_CERT_FILE)
 
 
 if __name__ == '__main__':
diff --git a/daemons/ganeti-rapi b/daemons/ganeti-rapi
index 087a6db..2bc2a21 100755
--- a/daemons/ganeti-rapi
+++ b/daemons/ganeti-rapi
@@ -223,7 +223,9 @@ def main():
   dirs = [(val, constants.RUN_DIRS_MODE) for val in constants.SUB_RUN_DIRS]
   dirs.append((constants.LOG_OS_DIR, 0750))
   daemon.GenericMain(constants.RAPI, parser, dirs, CheckRapi, ExecRapi,
-                     default_port=utils.GetDaemonPort(constants.RAPI))
+                     default_port=utils.GetDaemonPort(constants.RAPI),
+                     default_ssl_cert=constants.RAPI_CERT_FILE,
+                     default_ssl_key=constants.RAPI_CERT_FILE)
 
 
 if __name__ == "__main__":
diff --git a/lib/constants.py b/lib/constants.py
index b4d82f8..c6e9168 100644
--- a/lib/constants.py
+++ b/lib/constants.py
@@ -118,12 +118,6 @@ CONFD = "ganeti-confd"
 RAPI = "ganeti-rapi"
 MASTERD = "ganeti-masterd"
 
-DAEMONS_SSL = {
-  # daemon-name: (default-cert-path, default-key-path)
-  NODED: (SSL_CERT_FILE, SSL_CERT_FILE),
-  RAPI: (RAPI_CERT_FILE, RAPI_CERT_FILE),
-  }
-
 DAEMONS_PORTS = {
   # daemon-name: ("proto", "default-port")
   NODED: ("tcp", 1811),
diff --git a/lib/daemon.py b/lib/daemon.py
index 605a4a3..991f54f 100644
--- a/lib/daemon.py
+++ b/lib/daemon.py
@@ -223,6 +223,7 @@ class Mainloop(object):
 
 def GenericMain(daemon_name, optionparser, dirs, check_fn, exec_fn,
                 multithreaded=False, default_port=None):
+                default_ssl_cert=None, default_ssl_key=None):
   """Shared main function for daemons.
 
   @type daemon_name: string
@@ -242,6 +243,10 @@ def GenericMain(daemon_name, optionparser, dirs, check_fn, 
exec_fn,
   @param multithreaded: Whether the daemon uses threads
   @type default_port: int
   @param default_port: Default network port
+  @type default_ssl_cert: string
+  @param default_ssl_cert: Default SSL certificate path
+  @type default_ssl_key: string
+  @param default_ssl_key: Default SSL key path
 
   """
   optionparser.add_option("-f", "--foreground", dest="fork",
@@ -260,32 +265,41 @@ def GenericMain(daemon_name, optionparser, dirs, 
check_fn, exec_fn,
                             help="Bind address (default: 0.0.0.0)",
                             default="0.0.0.0", metavar="ADDRESS")
 
-  if daemon_name in constants.DAEMONS_SSL:
-    default_cert, default_key = constants.DAEMONS_SSL[daemon_name]
+  if default_ssl_key is not None and default_ssl_cert is not None:
     optionparser.add_option("--no-ssl", dest="ssl",
                             help="Do not secure HTTP protocol with SSL",
                             default=True, action="store_false")
     optionparser.add_option("-K", "--ssl-key", dest="ssl_key",
-                            help="SSL key",
-                            default=default_key, type="string")
+                            help=("SSL key path (default: %s)" %
+                                  default_ssl_key),
+                            default=default_ssl_key, type="string",
+                            metavar="SSL_KEY_PATH")
     optionparser.add_option("-C", "--ssl-cert", dest="ssl_cert",
-                            help="SSL certificate",
-                            default=default_cert, type="string")
+                            help=("SSL certificate path (default: %s)" %
+                                  default_ssl_cert),
+                            default=default_ssl_cert, type="string",
+                            metavar="SSL_CERT_PATH")
 
   # Disable the use of fork(2) if the daemon uses threads
   utils.no_fork = multithreaded
 
   options, args = optionparser.parse_args()
 
-  if hasattr(options, 'ssl') and options.ssl:
-    if not (options.ssl_cert and options.ssl_key):
-      print >> sys.stderr, "Need key and certificate to use ssl"
-      sys.exit(constants.EXIT_FAILURE)
-    for fname in (options.ssl_cert, options.ssl_key):
-      if not os.path.isfile(fname):
-        print >> sys.stderr, "Need ssl file %s to run" % fname
+  if getattr(options, "ssl", False):
+    ssl_paths = {
+      "certificate": options.ssl_cert,
+      "key": options.ssl_key,
+      }
+
+    for name, path in ssl_paths.iteritems():
+      if not os.path.isfile(path):
+        print >> sys.stderr, "SSL %s file '%s' was not found" % (name, path)
         sys.exit(constants.EXIT_FAILURE)
 
+    # TODO: By initiating http.HttpSslParams here we would only read the files
+    # once and have a proper validation (isfile returns False on directories)
+    # at the same time.
+
   if check_fn is not None:
     check_fn(options, args)
 
-- 
1.6.4.3

Reply via email to