Files
webssh/webssh/main.py
T

90 lines
2.9 KiB
Python
Executable File

import logging
import tornado.web
import tornado.ioloop
from tornado.options import options
from webssh import handler
from webssh.handler import (
ConnectionHandler, ConnectionsHandler, IndexHandler, LoginHandler,
LogoutHandler, WsockHandler, NotFoundHandler
)
from webssh.settings import (
get_app_settings, get_host_keys_settings, get_policy_setting,
get_ssl_context, get_server_settings, check_encoding_setting
)
from webssh.workspace import (
ConnectionMetadataHandler, ConnectionExportHandler,
ConnectionImportHandler, FilesHandler
)
def make_handlers(loop, options):
host_keys_settings = get_host_keys_settings(options)
policy = get_policy_setting(options, host_keys_settings)
handlers = [
(r'/login', LoginHandler),
(r'/logout', LogoutHandler),
(r'/connections', ConnectionsHandler),
(r'/connections/export', ConnectionExportHandler),
(r'/connections/import', ConnectionImportHandler),
(r'/connections/([a-f0-9]{24})/metadata', ConnectionMetadataHandler),
(r'/connections/([a-f0-9]{24})', ConnectionHandler),
(r'/files/([A-Za-z0-9_-]+)', FilesHandler),
(r'/', IndexHandler, dict(loop=loop, policy=policy,
host_keys_settings=host_keys_settings)),
(r'/ws', WsockHandler, dict(loop=loop))
]
return handlers
def make_app(handlers, settings):
settings.update(default_handler_class=NotFoundHandler)
return tornado.web.Application(handlers, **settings)
def app_listen(app, port, address, server_settings):
app.listen(port, address, **server_settings)
if not server_settings.get('ssl_options'):
server_type = 'http'
else:
server_type = 'https'
handler.redirecting = True if options.redirect else False
logging.info(
'Listening on {}:{} ({})'.format(address, port, server_type)
)
def check_trusted_downstream(options, server_settings):
if not options.xheaders:
return
if server_settings.get('trusted_downstream'):
return
logging.warning(
'xheaders is enabled without --tdstream, so any client can spoof '
'X-Forwarded-For and impersonate another address. Set '
'--tdstream=<proxy ip> when running behind a reverse proxy, or '
'--xheaders=False when clients connect directly.'
)
def main():
options.parse_command_line()
check_encoding_setting(options.encoding)
loop = tornado.ioloop.IOLoop.current()
app = make_app(make_handlers(loop, options), get_app_settings(options))
ssl_ctx = get_ssl_context(options)
server_settings = get_server_settings(options)
check_trusted_downstream(options, server_settings)
app_listen(app, options.port, options.address, server_settings)
if ssl_ctx:
server_settings.update(ssl_options=ssl_ctx)
app_listen(app, options.sslport, options.ssladdress, server_settings)
loop.start()
if __name__ == '__main__':
main()