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