Revision a1e29b31

b/vncauthproxy/proxy.py
751 751

  
752 752
    opts = parse_arguments(sys.argv[1:])
753 753

  
754
    # Create pidfile
755
    pidf = pidlockfile.TimeoutPIDLockFile(opts.pid_file, 10)
756

  
757 754
    # Initialize logger
758 755
    lvl = logging.DEBUG if opts.debug else logging.INFO
759 756

  
......
767 764
    handler.setFormatter(formatter)
768 765
    logger.addHandler(handler)
769 766

  
770
    # Become a daemon:
771
    # Redirect stdout and stderr to handler.stream to catch
772
    # early errors in the daemonization process [e.g., pidfile creation]
773
    # which will otherwise go to /dev/null.
774
    daemon_context = AllFilesDaemonContext(
775
        pidfile=pidf,
776
        umask=0022,
777
        stdout=handler.stream,
778
        stderr=handler.stream,
779
        files_preserve=[handler.stream])
780

  
781
    # Remove any stale PID files, left behind by previous invocations
782
    if daemon.runner.is_pidfile_stale(pidf):
783
        logger.warning("Removing stale PID lock file %s", pidf.path)
784
        pidf.break_lock()
785

  
786 767
    try:
787
        daemon_context.open()
788
    except (AlreadyLocked, LockTimeout):
789
        logger.critical(("Failed to lock PID file %s, another instance "
790
                         "running?"), pidf.path)
791
        sys.exit(1)
792
    logger.info("Became a daemon")
768
        # Create pidfile
769
        pidf = pidlockfile.TimeoutPIDLockFile(opts.pid_file, 10)
793 770

  
794
    # A fork() has occured while daemonizing,
795
    # we *must* reinit gevent
796
    gevent.reinit()
771
        # Init ephemeral port pool
772
        ports = range(opts.min_port, opts.max_port + 1)
797 773

  
798
    # Catch signals to ensure graceful shutdown,
799
    #
800
    # Uses gevent.signal so the handler fires even during
801
    # gevent.socket.accept()
802
    gevent.signal(SIGINT, fatal_signal_handler, "SIGINT")
803
    gevent.signal(SIGTERM, fatal_signal_handler, "SIGTERM")
774
        # Init VncAuthProxy class attributes
775
        VncAuthProxy.server_timeout = opts.server_timeout
776
        VncAuthProxy.connect_retries = opts.connect_retries
777
        VncAuthProxy.retry_wait = opts.retry_wait
778
        VncAuthProxy.connect_timeout = opts.connect_timeout
779
        VncAuthProxy.ports = ports
804 780

  
805
    # Init ephemeral port pool
806
    ports = range(opts.min_port, opts.max_port + 1)
807

  
808
    # Init VncAuthProxy class attributes
809
    VncAuthProxy.server_timeout = opts.server_timeout
810
    VncAuthProxy.connect_retries = opts.connect_retries
811
    VncAuthProxy.retry_wait = opts.retry_wait
812
    VncAuthProxy.connect_timeout = opts.connect_timeout
813
    VncAuthProxy.ports = ports
814

  
815
    try:
816 781
        VncAuthProxy.authdb = parse_auth_file(opts.auth_file)
817
    except InternalError as err:
818
        logger.critical(err)
819
        sys.exit(1)
820
    except Exception as err:
821
        logger.exception(err)
822
        logger.error("Unexpected error")
823
        sys.exit(1)
824 782

  
825
    try:
826 783
        sockets = get_listening_sockets(opts.listen_port, opts.listen_address,
827 784
                                        reuse_addr=True)
785

  
786
        wrap_ssl = lambda sock: sock
787
        if opts.enable_ssl:
788
            ssl_prot = ssl.PROTOCOL_TLSv1
789
            wrap_ssl = lambda sock: ssl.wrap_socket(sock, server_side=True,
790
                                                    keyfile=opts.key_file,
791
                                                    certfile=opts.cert_file,
792
                                                    ssl_version=ssl_prot)
793

  
794
        # Become a daemon:
795
        # Redirect stdout and stderr to handler.stream to catch
796
        # early errors in the daemonization process [e.g., pidfile creation]
797
        # which will otherwise go to /dev/null.
798
        daemon_context = AllFilesDaemonContext(
799
            pidfile=pidf,
800
            umask=0022,
801
            stdout=handler.stream,
802
            stderr=handler.stream,
803
            files_preserve=[handler.stream])
804

  
805
        # Remove any stale PID files, left behind by previous invocations
806
        if daemon.runner.is_pidfile_stale(pidf):
807
            logger.warning("Removing stale PID lock file %s", pidf.path)
808
            pidf.break_lock()
809

  
810
        try:
811
            daemon_context.open()
812
        except (AlreadyLocked, LockTimeout):
813
            raise InternalError(("Failed to lock PID file %s, another "
814
                                 "instance running?"), pidf.path)
815

  
816
        logger.info("Became a daemon")
817

  
818
        # A fork() has occured while daemonizing,
819
        # we *must* reinit gevent
820
        gevent.reinit()
821

  
822
        # Catch signals to ensure graceful shutdown,
823
        #
824
        # Uses gevent.signal so the handler fires even during
825
        # gevent.socket.accept()
826
        gevent.signal(SIGINT, fatal_signal_handler, "SIGINT")
827
        gevent.signal(SIGTERM, fatal_signal_handler, "SIGTERM")
828 828
    except InternalError as err:
829
        logger.critical("Error binding control socket")
829
        logger.critical(err)
830 830
        sys.exit(1)
831 831
    except Exception as err:
832
        logger.critical("Unexpected error:")
832 833
        logger.exception(err)
833
        logger.critical("Unexpected error")
834 834
        sys.exit(1)
835 835

  
836
    wrap_ssl = lambda sock: sock
837
    if opts.enable_ssl:
838
        wrap_ssl = lambda sock: ssl.wrap_socket(sock, server_side=True,
839
                                                keyfile=opts.key_file,
840
                                                certfile=opts.cert_file,
841
                                                ssl_version=ssl.PROTOCOL_TLSv1)
842

  
843 836
    while True:
844 837
        try:
845 838
            client = None
......
852 845
                VncAuthProxy.spawn(logger, client)
853 846
            continue
854 847
        except Exception as err:
848
            logger.error("Unexpected error:")
855 849
            logger.exception(err)
856
            logger.error("Unexpected error")
857 850
            if client:
858 851
                client.close()
859 852
            continue
860 853
        except SystemExit:
861 854
            break
862 855

  
863
    logger.info("Closing control sockets")
864
    while sockets:
865
        sock = sockets.pop()
866
        sock.close()
856
    try:
857
        logger.info("Closing control sockets")
858
        while sockets:
859
            sock = sockets.pop()
860
            sock.close()
867 861

  
868
    daemon_context.close()
869
    sys.exit(0)
862
        daemon_context.close()
863
        sys.exit(0)
864
    except Exception as err:
865
        logger.critical("Unexpected error:")
866
        logger.exception(err)
867
        sys.exit(1)

Also available in: Unified diff