Parcourir la source

Make cmdctl output be more friendly when running cmdctl and it's running already.

git-svn-id: svn://bind10.isc.org/svn/bind10/branches/trac277@2516 e5f2f494-b856-4b98-b285-d166d9295462
Likun Zhang il y a 15 ans
Parent
commit
f7f4533d07
3 fichiers modifiés avec 33 ajouts et 7 suppressions
  1. 4 0
      ChangeLog
  2. 12 7
      src/bin/cmdctl/cmdctl.py.in
  3. 17 0
      src/bin/cmdctl/tests/cmdctl_test.py

+ 4 - 0
ChangeLog

@@ -1,3 +1,7 @@
+  77.	[func]		zhanglikun
+	Make error message be more friendly when running cmdctl and it's 
+	already running(listening on same port)(Trac #277, rTBD)
+
   76.	[bug]		jelte
 	Fixed a bug in the handling of 'remote' config modules (i.e.
 	modules that peek at the configuration of other modules), where

+ 12 - 7
src/bin/cmdctl/cmdctl.py.in

@@ -441,7 +441,12 @@ class SecureHTTPServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
                  CommandControlClass,
                  idle_timeout = 1200, verbose = False):
         '''idle_timeout: the max idle time for login'''
-        http.server.HTTPServer.__init__(self, server_address, RequestHandlerClass)
+        try:
+            http.server.HTTPServer.__init__(self, server_address, RequestHandlerClass)
+        except socket.error as err:
+            sys.stderr.write("[b10-cmdctl] Error creating b10-cmdctl, because: %s \n" % str(err))
+            sys.exit(0)
+
         self.user_sessions = {}
         self.idle_timeout = idle_timeout
         self.cmdctl = CommandControlClass(self, verbose)
@@ -587,17 +592,17 @@ def set_cmd_options(parser):
             help="display more about what is going on")
 
 if __name__ == '__main__':
+    set_signal_handler()
+    parser = OptionParser(version = __version__)
+    set_cmd_options(parser)
+    (options, args) = parser.parse_args()
     try:
-        set_signal_handler()
-        parser = OptionParser(version = __version__)
-        set_cmd_options(parser)
-        (options, args) = parser.parse_args()
         run(options.addr, options.port, options.idle_timeout, options.verbose)
     except isc.cc.SessionError as se:
         sys.stderr.write("[b10-cmdctl] Error creating b10-cmdctl, "
-                "is the command channel daemon running?\n")        
+                         "is the command channel daemon running?\n")        
     except KeyboardInterrupt:
-        sys.stderr.write("[b10-cmdctl] exit http server\n")
+        sys.stderr.write("[b10-cmdctl] exit from Cmdctl\n")
 
     if httpd:
         httpd.shutdown()

+ 17 - 0
src/bin/cmdctl/tests/cmdctl_test.py

@@ -383,13 +383,30 @@ class MySecureHTTPServer(SecureHTTPServer):
 class TestSecureHTTPServer(unittest.TestCase):
     def setUp(self):
         self.old_stdout = sys.stdout
+        self.old_stderr = sys.stderr
         sys.stdout = open(os.devnull, 'w')
+        sys.stderr = sys.stdout
         self.server = MySecureHTTPServer(('localhost', 8080), 
                                          MySecureHTTPRequestHandler,
                                          MyCommandControl, verbose=True)
 
     def tearDown(self):
         sys.stdout = self.old_stdout
+        sys.stderr = self.old_stderr
+
+    def test_addr_in_use(self):
+        server_one = None
+        try:
+            server_one = SecureHTTPServer(('localhost', 8080),
+                                        MySecureHTTPRequestHandler,
+                                        MyCommandControl)
+        except SystemExit:
+            pass
+        else:
+            self.assertRaises(SystemExit, SecureHTTPServer, ('localhost', 8080), 
+                              MySecureHTTPRequestHandler, MyCommandControl)
+        if server_one:
+            server_one.server_close()
 
     def test_create_user_info(self):
         self.server._create_user_info('/local/not-exist')