bitkeeper revision 1.1159.265.2 (42319500DXIXjiTkjszNpliySomMvA)
authormjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Fri, 11 Mar 2005 12:54:24 +0000 (12:54 +0000)
committermjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Fri, 11 Mar 2005 12:54:24 +0000 (12:54 +0000)
Add support for setting the listen address for consoles
and the event port.

Signed-off-by: Mike Wray <mike.wray@hp.com>
tools/examples/xend-config.sxp
tools/python/xen/xend/XendRoot.py
tools/python/xen/xend/server/SrvDaemon.py
tools/python/xen/xend/server/console.py
tools/python/xen/xend/server/params.py

index a62b112519122b7d667d15c03d717feeb7b27151..8aa6ccaa7e7552c6b5d0a637868b8d28cdb1fb90 100644 (file)
@@ -3,11 +3,23 @@
 # Port xend should use for the HTTP interface.
 (xend-port         8000)
 
-# Address xend should listen on.
+# Port xend should use for the event interface.
+(xend-event-port   8001)
+
+# Address xend should listen on for HTTP connections.
 # Specifying 'localhost' prevents remote connections.
 # Specifying the empty string '' allows all connections.
 (xend-address      '')
 
+# The port xend should start from when allocating a port
+# for a domain console.
+(console-port-base 9600)
+
+# Address xend should listen on for console connections.
+# Specifying 'localhost' prevents remote connections.
+# Specifying the empty string '' allows all connections.
+(console-address   '')
+
 ## Use the following if VIF traffic is routed.
 # The script used to start/stop networking for xend.
 #(network-script     network-route)
index dea3eeeb2f6cbca7a524153e406b16625adb88a1..c8236a4ecd00454767e19acf71a94cd8ceba3989 100644 (file)
@@ -2,6 +2,11 @@
 
 """Xend root class.
 Creates the event server and handles configuration.
+
+Other classes get config variables by importing this module,
+using instance() to get a XendRoot instance, and then
+the config functions (e.g. get_xend_port()) to get
+configured values.
 """
 
 import os
@@ -34,17 +39,33 @@ class XendRoot:
     """Where block control scripts live."""
     block_script_dir = "/etc/xen/scripts"
 
+    """Default path to the log file. """
     logfile_default = "/var/log/xend.log"
 
     loglevel_default = 'DEBUG'
 
+    """Default interface address xend listens at. """
+    xend_address_default      = ''
+
+    """Default port xend serves HTTP at. """
+    xend_port_default         = '8000'
+
+    """Default port xend serves events at. """
+    xend_event_port_default   = '8001'
+
+    """Default inteface address xend listens at for consoles."""
+    console_address_default   = ''
+
+    """Default port xend serves consoles at. """
+    console_port_base_default = '9600'
+
     components = {}
 
     def __init__(self):
         self.dbroot = None
         self.config_path = None
         self.config = None
-        self.logger = None
+        self.logging = None
         self.configure()
         eserver.subscribe('xend.*', self.event_handler)
         #eserver.subscribe('xend.domain.created', self.event_handler)
@@ -73,9 +94,9 @@ class XendRoot:
 
     def _format(self, msg, args):
         if args:
-            return str(msg)
-        else:
             return str(msg) % args
+        else:
+            return str(msg)
 
     def _log(self, mode, fmt, args):
         """Logging function that uses the logger if it exists, otherwise
@@ -90,7 +111,7 @@ class XendRoot:
         if log:
             getattr(log, mode)(fmt, *args)
         else:
-            print >>stderr, "xend", "[%s]" % level, self._format(msg, args)
+            print >>sys.stderr, "xend", "[%s]" % level, self._format(fmt, args)
 
     def logDebug(self, fmt, *args):
         """Log a debug message.
@@ -132,7 +153,6 @@ class XendRoot:
         self.configure_logger()
         self.dbroot = self.get_config_value("dbroot", self.dbroot_default)
 
-
     def configure_logger(self):
         logfile = self.get_config_value("logfile", self.logfile_default)
         loglevel = self.get_config_value("loglevel", self.loglevel_default)
@@ -146,7 +166,7 @@ class XendRoot:
     def get_logger(self):
         """Get the logger.
         """
-        return self.logging.getLogger()
+        return self.logging and self.logging.getLogger()
 
     def get_dbroot(self):
         """Get the path to the database root.
@@ -160,14 +180,20 @@ class XendRoot:
         """
         self.config_path = os.getenv(self.config_var, self.config_default)
         if os.path.exists(self.config_path):
-            fin = file(self.config_path, 'rb')
+            #self.logInfo('Reading config file %s', self.config_path)
             try:
-                config = sxp.parse(fin)
+                fin = file(self.config_path, 'rb')
+                try:
+                    config = sxp.parse(fin)
+                finally:
+                    fin.close()
                 config.insert(0, 'xend-config')
                 self.config = config
-            finally:
-                fin.close()
+            except Exception, ex:
+                self.logError('Reading config file %s: %s', self.config_path, str(ex))
+                raise
         else:
+            self.logError('Config file does not exist: %s', self.config_path)
             self.config = ['xend-config']
 
     def get_config(self, name=None):
@@ -193,10 +219,35 @@ class XendRoot:
         return sxp.child_value(self.config, name, val=val)
 
     def get_xend_port(self):
-        return int(self.get_config_value('xend-port', '8000'))
+        """Get the port xend listens at for its HTTP interface.
+        """
+        return int(self.get_config_value('xend-port', self.xend_port_default))
+
+    def get_xend_event_port(self):
+        """Get the port xend listens at for connection to its event server.
+        """
+        return int(self.get_config_value('xend-event-port', self.xend_event_port_default))
 
     def get_xend_address(self):
-        return self.get_config_value('xend-address', '')
+        """Get the address xend listens at for its HTTP and event ports.
+        This defaults to the empty string which allows all hosts to connect.
+        If this is set to 'localhost' only the localhost will be able to connect
+        to the HTTP and event ports.
+        """
+        return self.get_config_value('xend-address', self.xend_address_default)
+
+    def get_console_address(self):
+        """Get the address xend listens at for its console ports.
+        This defaults to the empty string which allows all hosts to connect.
+        If this is set to 'localhost' only the localhost will be able to connect
+        to the console ports.
+        """
+        return self.get_config_value('console-address', self.console_address_default)
+
+    def get_console_port_base(self):
+        """Get the base port number used to generate console ports for domains.
+        """
+        return int(self.get_config_value('console-port-base', self.console_port_base_default))
 
     def get_block_script(self, type):
         return self.get_config_value('block-%s' % type, '')
index 05eb1ed016b6b659f7a8e999dd9177b22cbf9217..9bf5fd9bb05670caa5db80773f273c73a7785052 100644 (file)
@@ -596,10 +596,10 @@ class Daemon:
     def set_user(self):
         # Set the UID.
         try:
-            os.setuid(pwd.getpwnam(USER)[2])
+            os.setuid(pwd.getpwnam(XEND_USER)[2])
             return 0
         except KeyError, error:
-            print "Error: no such user '%s'" % USER
+            print "Error: no such user '%s'" % XEND_USER
             return 1
 
     def stop(self):
@@ -609,7 +609,7 @@ class Daemon:
         xroot = XendRoot.instance()
         log.info("Xend Daemon started")
         self.createFactories()
-        self.listenEvent()
+        self.listenEvent(xroot)
         self.listenNotifier()
         self.listenVirq()
         SrvServer.create(bridge=1)
@@ -622,9 +622,11 @@ class Daemon:
         self.netifCF = netif.NetifControllerFactory()
         self.consoleCF = console.ConsoleControllerFactory()
 
-    def listenEvent(self):
+    def listenEvent(self, xroot):
         protocol = EventFactory(self)
-        return reactor.listenTCP(EVENT_PORT, protocol)
+        port = xroot.get_xend_event_port()
+        interface = xroot.get_xend_address()
+        return reactor.listenTCP(port, protocol, interface=interface)
 
     def listenNotifier(self):
         protocol = NotifierProtocol(self.channelF)
index ea4bf499215d658a52d88779f37268ceea8ed789..3e76c6ccef466e43a911224badd0a56d4956c9bb 100755 (executable)
@@ -11,6 +11,8 @@ from xen.xend.XendError import XendError
 from xen.xend import EventServer
 eserver = EventServer.instance()
 from xen.xend.XendLogging import log
+from xen.xend import XendRoot
+xroot = XendRoot.instance()
 
 import controller
 from messages import *
@@ -191,7 +193,8 @@ class ConsoleController(controller.Controller):
             pass
         else:
             f = ConsoleFactory(self, self.idx)
-            self.listener = reactor.listenTCP(self.console_port, f)
+            interface = xroot.get_console_address()
+            self.listener = reactor.listenTCP(self.console_port, f, interface=interface)
 
     def connect(self, addr, conn):
         """Connect a TCP connection to the console.
index bb5277aecdb01d58905b0744e6ee7e4b9a95286c..0f8632a4f2c18b3884b9f7805db198d80bd24922 100644 (file)
@@ -3,9 +3,5 @@ XEND_PID_FILE = '/var/run/xend.pid'
 XFRD_PID_FILE = '/var/run/xfrd.pid'
 XEND_TRACE_FILE = '/var/log/xend.trace'
 
-USER = 'root'
-
-EVENT_PORT = 8001
-
-CONSOLE_PORT_BASE = 9600
+XEND_USER = 'root'