Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Terminado with Unix sockets #192

Open
iliajie opened this issue Sep 29, 2022 · 4 comments
Open

Terminado with Unix sockets #192

iliajie opened this issue Sep 29, 2022 · 4 comments

Comments

@iliajie
Copy link

iliajie commented Sep 29, 2022

Hello,

Thank you for an amazing terminal emulator!

Can anyone please provide an example of how Terminado could be used with Unix socket file instead of TCP port, in familiar example as in demos/unique.py? Is this even possible?

@KoopaKing
Copy link
Contributor

You should take a peek at https://gist.github.com/superduper/5579037#file-tornado-unix-socket-py

I think you just need to use tornado's tornado.netutil.bind_unix_socket instead of tornado.web.Application::listen

@iliajie
Copy link
Author

iliajie commented Sep 29, 2022

Thanks, Chris. It seems to work on the first glance, but it would be more useful for the future reader to have it placed in demos alongside with other examples.

@iliajie
Copy link
Author

iliajie commented Sep 29, 2022

I have tried:

"""A separate terminal for every websocket opened.
"""
import tornado.ioloop
import tornado.web
from tornado.httpserver import HTTPServer
from tornado.options import options, define
from tornado.netutil import bind_unix_socket

# This demo requires tornado_xstatic and XStatic-term.js
import tornado_xstatic
from common_demo_stuff import STATIC_DIR, TEMPLATE_DIR, run_and_show_browser

from terminado import TermSocket, UniqueTermManager

class TerminalPageHandler(tornado.web.RequestHandler):
    def get(self):
        return self.render(
            "termpage.html",
            static=self.static_url,
            xstatic=self.application.settings["xstatic_url"],
            ws_url_path="/websocket",
        )

def main(argv):
    term_manager = UniqueTermManager(shell_command=["bash"])
    handlers = [
        (r"/websocket", TermSocket, {"term_manager": term_manager}),
        (r"/", TerminalPageHandler),
        (r"/xstatic/(.*)", tornado_xstatic.XStaticFileHandler, {"allowed_modules": ["termjs"]}),
    ]
    app = tornado.web.Application(
        handlers,
        static_path=STATIC_DIR,
        template_path=TEMPLATE_DIR,
        xstatic_url=tornado_xstatic.url_maker("/xstatic/"),
    )
    server = HTTPServer(app)
    socket = bind_unix_socket("/run/terminado/root.sock")
    server.add_socket(socket)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main([])

After the service was started the root.sock file was created under /run/terminado directory as expected. All seems good so far.

Now, using Apache config under VirtualServer I have created ProxyPass:

ProxyPass / unix:/run/terminado/root.sock|ws://127.0.0.1/

.. and when visiting http://debian11-gpl.synology/ (my local test domain) I have it connected and the page loads with the expected source:

<!doctype html>
<head>
<meta charset="UTF-8" />
<title>pyxterm</title>
<!--
pyxterm: Basic Python socket implementation for term.js
Example template
Modified by: R. Saravanan <[email protected]> 2014
Original Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
-->
<style>
html {
background: #555;
}
h1 {
margin-bottom: 20px;
font: 20px/1.5 sans-serif;
}
</style>
<script src="/xstatic/termjs/term.js?v=68946c0396179ab51b8f8a8cdae05c3be1b0be94358a44ea00dfcfe698039c97307980ace681e20ef14072581338cfe7c72f9229259a6735b1571dc6ca78068c"></script>
<script src="/static/terminado.js?v=6c5ebb6a6d9c68385e908aa106f8db64b66cff67becacefe8f6bc13defbd1cc25a35d919c31faee93c28b942689811cf66a77ddbae04a9b72eb6402a849a8378"></script>
<script>
...
...
...
<span id="dummy-screen-rows" style="visibility:hidden;">01234567890123456789012345678901234567890123456789012345678901234567890123456789</span>
</pre>
</body>

.. however the following error is returned on the console:

image

I have no clue right now why websocket is not being proxied to Terminado socket? Is the problem in Apache config or Terminado config?

Also, is there a way to add/pass so called webprefix to Terminado internal links, so the links would be prefixed and have a look of src="/webprefix/xstatic/termjs/term.js" to load links as expected when proxied to a sub-dir?

@iliajie
Copy link
Author

iliajie commented Oct 16, 2022

@KoopaKing Chris, could you please check if the Python script part in example above is correct for Terminado to work with Unix sockets?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants