diff --git a/.dockerignore b/.dockerignore index 45eefa3..72bdf7e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,3 +8,4 @@ downloads logs var ssl +wetty diff --git a/.gitmodules b/.gitmodules index 36269b1..6e9e6d7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "rpc"] path = rpc url = git://github.com/LTD-Beget/sprutio-rpc.git +[submodule "wetty"] + path = wetty + url = https://github.com/rndviktor/wetty.git diff --git a/Makefile b/Makefile index 1f0c44d..cc2fe9a 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ .PHONY: all build push \ - build-python build-cron build-bower build-rpc build-app build-nginx build-frontend \ - push-python push-cron push-bower push-rpc push-app push-nginx push-frontend + build-python build-cron build-bower build-rpc build-app build-nginx build-wetty build-frontend \ + push-python push-cron push-bower push-rpc push-app push-nginx push-frontend push-wetty all: build -build: build-python build-cron build-bower build-rpc build-app build-nginx build-frontend +build: build-python build-cron build-bower build-rpc build-app build-nginx build-frontend build-wetty build-python: docker build -t beget/sprutio-python -f Dockerfile ./ @@ -24,11 +24,14 @@ build-app: build-nginx: docker build -t beget/sprutio-nginx -f Dockerfile.nginx ./ +build-wetty: + docker build -t rndviktor/wetty -f wetty/Dockerfile wetty/ + build-frontend: docker run -v $(PWD)/app/public:/app -w /app beget/sprutio-bower bower install --allow-root docker build -t beget/sprutio-frontend -f app/public/Dockerfile app/public/ -push: push-cron push-rpc push-app push-nginx push-frontend +push: push-cron push-rpc push-app push-nginx push-frontend push-wetty push-cron: docker push beget/sprutio-cron @@ -42,6 +45,9 @@ push-app: push-nginx: docker push beget/sprutio-nginx +push-wetty: + docker push rndviktor/wetty + push-frontend: docker push beget/sprutio-frontend diff --git a/app/classes/core/FM.py b/app/classes/core/FM.py index 70f67c9..c0f320f 100755 --- a/app/classes/core/FM.py +++ b/app/classes/core/FM.py @@ -115,6 +115,8 @@ class Actions(object): CREATE_ARCHIVE = 'actions.archive.create.CreateArchive' EXTRACT_ARCHIVE = 'actions.archive.extract.ExtractArchive' + OPEN_TERMINAL = 'actions.main.open_terminal.OpenTerminal' + # Aliases for FM actions class Action(object): @@ -173,6 +175,8 @@ class Action(object): HELP = 'FM.action.Help' LOGOUT = 'FM.action.Logout' + TERMINAL = 'FM.action.Terminal' + class ActionsProvider: @staticmethod diff --git a/app/config/routes.py b/app/config/routes.py index 3fcc85b..f1838f9 100644 --- a/app/config/routes.py +++ b/app/config/routes.py @@ -5,6 +5,7 @@ from handlers.actions.main import CancelOperationHandler from handlers.actions.main import LoadSettingsHandler from handlers.actions.main import SaveSettingsHandler +from handlers.actions.main import TerminalHandler # from handlers.actions.main import LogoutHandler from handlers.actions.files import ListFilesHandler from handlers.actions.files import RemoveFilesHandler @@ -62,6 +63,7 @@ (r"/actions/main/cancel_operation", CancelOperationHandler.CancelOperationHandler), (r"/actions/main/save_settings", SaveSettingsHandler.SaveSettingsHandler), (r"/actions/main/logout", LogoutHandler.LogoutHandler), + (r"/actions/main/terminal", TerminalHandler.TerminalHandler), (r"/actions/files/list", ListFilesHandler.ListFilesHandler), (r"/actions/files/remove", RemoveFilesHandler.RemoveFilesHandler), (r"/actions/files/chmod", ChmodFilesHandler.ChmodFilesHandler), diff --git a/app/handlers/actions/main/TerminalHandler.py b/app/handlers/actions/main/TerminalHandler.py new file mode 100644 index 0000000..5e801b6 --- /dev/null +++ b/app/handlers/actions/main/TerminalHandler.py @@ -0,0 +1,27 @@ +from tornado import web +from handlers.BaseHandler import BaseHandler, wrap_async_rpc, wrap_catch + +from core import FM + + +class TerminalHandler(BaseHandler): + @wrap_async_rpc + @wrap_catch + @web.authenticated + def post(self): + + session = self.get_post('session') + + if session is None: + self.json({ + 'error': True, + 'message': 'no session provided' + }) + self.finish() + return + + action = self.get_action(name=FM.Actions.OPEN_TERMINAL, session=session) + answer = action.run() + + self.json(answer) + self.finish() diff --git a/app/modules/home/actions/main/open_terminal.py b/app/modules/home/actions/main/open_terminal.py new file mode 100644 index 0000000..aafdeda --- /dev/null +++ b/app/modules/home/actions/main/open_terminal.py @@ -0,0 +1,16 @@ +from core import FM + + +class OpenTerminal(FM.BaseAction): + def __init__(self, session, **kwargs): + super(OpenTerminal, self).__init__(**kwargs) + + self.session = session + + def run(self): + request = self.get_rpc_request() + result = request.request('main/open_terminal', login=self.request.get_current_user(), + password=self.request.get_current_password(), session=self.session) + answer = self.process_result(result) + + return answer diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 89ff414..c9ff376 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -25,6 +25,10 @@ cron: redis: image: redis +wetty: + build: wetty + net: "host" + bower: build: . dockerfile: Dockerfile.bower diff --git a/docker-compose.yml b/docker-compose.yml index 6ff67f5..94b2ba0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -49,4 +49,8 @@ cron: redis: image: redis:3.0 +wetty: + image: rndviktor/wetty + net: "host" + # EOF diff --git a/travis/docker-build.sh b/travis/docker-build.sh index f9f3d6c..854e26c 100755 --- a/travis/docker-build.sh +++ b/travis/docker-build.sh @@ -22,6 +22,9 @@ docker build -t beget/sprutio-app -f app/Dockerfile app/ # nginx image docker build -t beget/sprutio-nginx -f Dockerfile.nginx ./ +# wetty image +docker build -t rndviktor/wetty -f wetty/Dockerfile wetty/ + # frontend docker build -t beget/sprutio-bower -f Dockerfile.bower ./ docker run -v $PWD/app/public:/app -w /app beget/sprutio-bower bower install --allow-root diff --git a/wetty b/wetty new file mode 160000 index 0000000..3babfc4 --- /dev/null +++ b/wetty @@ -0,0 +1 @@ +Subproject commit 3babfc4acc55cf0b31c5e8d85317a886deab8772