Guacamole と Django を使用した Web ベースのリモート デスクトップ

グアカモーレ

最近の一部として hackday では、ユーザーに代わって起動されるノードにブラウザー内リモート デスクトップ機能を組み込みたいと考えていました。 Rescale に送信されるワークフローのほとんどは、無人で実行されるバッチ処理ジョブですが、マシンにログインして GUI を実行して実行中のシミュレーションを監視できる機能は、一部のユーザーにとって便利です。
Google で簡単に検索すると、というライブラリが見つかりました。 グアカモーレ それはもう数年前からあります。 Guacamole は 5 つの主要コンポーネントで構成されます。XNUMX つは、さまざまなリモート デスクトップ プロトコル (VNC、RDC、SSH) とカスタム guacamole プロトコルの間で変換を行う guacd と呼ばれるデーモン アプリケーション、リモート デスクトップを HTMLXNUMX キャンバス要素にレンダリングしてリッスンする一連の Javascript ライブラリです。マウスとキーボードのイベント、そして最後に、js ライブラリから HTTP リクエストを受け取り、guacd デーモン (*) と通信するシン Web アプリケーションです。
残念ながら、提供されている Web アプリケーション、Java サーブレット、および既存の Django Web スタックの間には、少し不一致があります。 Python バージョンの Web アプリがあれば、Guacamole を既存の製品に統合するのがはるかに簡単になります。 ありがたいことに、 ドキュメント これは比較的簡単に実行できるはずだと述べています。 ソース コードはよく書かれており、Hackday 品質のバージョンを Python にすぐに移植するのは非常に簡単でした。
guacamole js ライブラリは、Web アプリへの接続リクエストを行うことによって起動します。 この時点で guacd に対してソケットが開かれ、トンネル ID が割り当てられ、その後クライアントに返されます。 ここで重要な点は、このソケットは同じトンネル ID を含む複数の HTTP リクエスト間で共有する必要があるということです。 これを安全に行うために、ロックのペアを使用して、一度に XNUMX つのスレッドだけがソケットから読み書きすることを保証します。 次のコード スニペットは、Django ビュー ヘルパー関数を通じて guacd 命令がどのようにクライアントに返されるかを示しています。

ソケット = {} ソケット_ロック = threading.RLock() read_lock = threading.RLock() write_lock = threading.RLock() pending_read_request = threading.Event() def _do_read(request,cache_key): pending_read_request.set() def content():ソケットロック付き: guac = ソケット[キャッシュキー] 読み取りロック付き: pending_read_request.clear() while True: content = guac.read() if content: yield content else: Break if pending_read_request.is_set(): logger.info('別のリクエストを許可します引き継ぎます。') ブレーク # 命令終了マーカー yield '0.;' response = StreamingHttpResponse( content(), content_type='application/octet-stream') response['Cache-Control'] = 'no-cache' 応答を返します

指摘すべき興味深い点の XNUMX つは、 ワカモレJSライブラリ AJAX リクエストの交互のペアを使用してサーバーからデータをストリーミングします。 まず、最初の AJAX リクエストが作成されます。 この最初の接続が開かれ、サーバーからデータが戻ってきた後のある時点で、XNUMX 回目の接続が試行されます。 Web アプリはサーバー側でこれを検出し、最初の接続を終了し、XNUMX 番目の接続でデータの送信を開始できる必要があります。 Java コードで使用されている ReentrantLock には、他に待機中のスレッドがあるかどうかを簡単に判断する方法がありますが、Python RLock は同様のメソッドを公開していません。 イベントは、XNUMX つの実行中の HTTP リクエスト間のクイック アンド ダーティ シグナリング メカニズムとして使用されます。
明らかに、これは可能な限り迅速にハッキングされたものであり、運用環境での使用には適しておらず、おそらく複数のバグが含まれています。 現時点での大きな制限の XNUMX つは、現在、guacd に接続されているソケットが共有のグローバル ディクショナリに保存されているだけであることです。 したがって、これは、リクエストを処理する複数のスレッドを持つ単一プロセスとして実行される HTTP サーバーにのみ適しています。
全体として、移植するには楽しいコードでした。 ワカモレの作者の懸命な努力に敬意を表します。 サンプルの Django / Guacamole プロジェクトは、次の場所で入手できます。 githubの 好奇心旺盛な方へ。
(*) Guacamole は WebSocket をサポートしていますが、すぐに使用できる HTTP トンネリング アプローチは、古いブラウザをサポートしようとする場合に実際に利点があります。 最新のブラウザの動作をエミュレートするために利用できるさまざまな shim にもかかわらず、HTML5 機能への依存関係が少ないほど、レガシー ブラウザとの互換性が向上します。

類似の投稿