diff --git a/butterfly.server.py b/butterfly.server.py old mode 100644 new mode 100755 index 954d2b4..2778048 --- a/butterfly.server.py +++ b/butterfly.server.py @@ -20,6 +20,7 @@ import tornado.options import tornado.ioloop import tornado.httpserver +import tornado_systemd import uuid import ssl import getpass @@ -220,9 +221,9 @@ else: from butterfly import application -http_server = tornado.httpserver.HTTPServer(application, ssl_options=ssl_opts) -http_server.listen(port, address=host) +http_server = tornado_systemd.SystemdHTTPServer(application, ssl_options=ssl_opts) +http_server.listen(port, address=host) url = "http%s://%s:%d/*" % ( "s" if not tornado.options.options.unsecure else "", host, port) diff --git a/butterfly.service b/butterfly.service index 943b5ea..6eed204 100644 --- a/butterfly.service +++ b/butterfly.service @@ -1,10 +1,5 @@ [Unit] Description=Butterfly Terminal Server -After=network.target [Service] ExecStart=/usr/bin/butterfly.server.py -Restart=on-abort - -[Install] -WantedBy=multi-user.target diff --git a/butterfly/__init__.py b/butterfly/__init__.py index 43d90af..661e742 100644 --- a/butterfly/__init__.py +++ b/butterfly/__init__.py @@ -14,7 +14,7 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . -__version__ = '1.5.2' +__version__ = '1.5.3' import os diff --git a/butterfly/routes.py b/butterfly/routes.py index 21d86b4..95a4c18 100644 --- a/butterfly/routes.py +++ b/butterfly/routes.py @@ -120,6 +120,8 @@ class Style(Route): @url(r'/ws(?:/user/([^/]+))?/?(?:/wd/(.+))?') class TermWebSocket(Route, tornado.websocket.WebSocketHandler): + terminals = set() + def pty(self): self.pid, self.fd = pty.fork() if self.pid == 0: @@ -281,6 +283,8 @@ class TermWebSocket(Route, tornado.websocket.WebSocketHandler): except LookupError: raise Exception('Invalid user in certificate') + TermWebSocket.terminals.add(self) + self.write_message(motd(self.socket)) self.pty() @@ -341,4 +345,9 @@ class TermWebSocket(Route, tornado.websocket.WebSocketHandler): except Exception: self.log.debug('waitpid fail', exc_info=True) + TermWebSocket.terminals.remove(self) self.log.info('Websocket closed') + + if self.application.systemd and not len(TermWebSocket.terminals): + self.log.info('No more terminals, exiting...') + sys.exit(0) diff --git a/setup.py b/setup.py index 17ae8b9..51ec49b 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ options = dict( platforms="Any", scripts=['butterfly.server.py'], packages=['butterfly'], - install_requires=["tornado>=3.2", "pyOpenSSL"], + install_requires=["tornado>=3.2", "pyOpenSSL", 'tornado_systemd'], package_data={ 'butterfly': [ 'scss/*.scss',