Merge pull request #4 from Akilan1999/x2x

Added default remote keyboard and mouse as x2x
This commit is contained in:
Akilan Selvacoumar
2021-09-21 22:52:29 +04:00
committed by GitHub
5 changed files with 72 additions and 33 deletions

View File

@@ -24,22 +24,14 @@ https://github.com/Akilan1999/laplace/tree/keyboard_mouse
### Installation required to share keyboard and mouse ### Installation required to share keyboard and mouse
To do this we ensure that the client either has an IPV6 We need to ensure that the client has SSH client installed.
address or a public IPV4 address. We use the popular open repository known as [x2x](https://github.com/dottedmag/x2x).
We use the popular open repository known as [Barrier KVM](https://github.com/debauchee/barrier).
#### What is Barrier kvm? Note: x2x runs on top of SSH.
Barrier is software that mimics the functionality of a KVM switch, which historically would allow you to use a single keyboard and mouse to control multiple computers by physically turning a dial on the box to switch the machine you're controlling at any given moment. Barrier does this in software, allowing you to tell it which machine to control by moving your mouse to the edge of the screen, or by using a keypress to switch focus to a different system. #### What is x2x?
x2x allows the keyboard, mouse on one X display to be used to control another X
#### Barrier KVM build status and links to install display. It also shares X clipboards between the displays.
|Platform |Build Status|
| --:|:-- |
|Linux |[![Build Status](https://dev.azure.com/debauchee/Barrier/_apis/build/status/debauchee.barrier?branchName=master&jobName=Linux%20Build)](https://dev.azure.com/debauchee/Barrier/_build/latest?definitionId=1&branchName=master)|
|Mac |[![Build Status](https://dev.azure.com/debauchee/Barrier/_apis/build/status/debauchee.barrier?branchName=master&jobName=Mac%20Build)](https://dev.azure.com/debauchee/Barrier/_build/latest?definitionId=1&branchName=master)|
|Windows Debug |[![Build Status](https://dev.azure.com/debauchee/Barrier/_apis/build/status/debauchee.barrier?branchName=master&jobName=Windows%20Build&configuration=Windows%20Build%20Debug)](https://dev.azure.com/debauchee/Barrier/_build/latest?definitionId=1&branchName=master)|
|Windows Release|[![Build Status](https://dev.azure.com/debauchee/Barrier/_apis/build/status/debauchee.barrier?branchName=master&jobName=Windows%20Build&configuration=Windows%20Build%20Release%20with%20Release%20Installer)](https://dev.azure.com/debauchee/Barrier/_build/latest?definitionId=1&branchName=master)|
|Snap |[![Snap Status](https://build.snapcraft.io/badge/debauchee/barrier.svg)](https://build.snapcraft.io/user/debauchee/barrier)|
### Build from source ### Build from source
@@ -48,7 +40,6 @@ Barrier is software that mimics the functionality of a KVM switch, which histori
# Assumes to be running on ubuntu 20.04 # Assumes to be running on ubuntu 20.04
# Ports required to be allocated internally: # Ports required to be allocated internally:
# - 8888 (laplace server) # - 8888 (laplace server)
# - 24800 (barrier server)
# Updating and installing go compiler # Updating and installing go compiler
apt update apt update
@@ -56,8 +47,8 @@ apt install -y golang
apt install -y jq apt install -y jq
## Installing git ## Installing git
apt install -y git apt install -y git
## Installing barrier ## Installing x2x
apt install -y barrier apt install -y x2x
## Installing chromium ## Installing chromium
wget https://github.com/RobRich999/Chromium_Clang/releases/download/v94.0.4585.0-r904940-linux64-deb-avx/chromium-browser-unstable_94.0.4585.0-1_amd64.deb wget https://github.com/RobRich999/Chromium_Clang/releases/download/v94.0.4585.0-r904940-linux64-deb-avx/chromium-browser-unstable_94.0.4585.0-1_amd64.deb
apt install -y ./chromium-browser-unstable_94.0.4585.0-1_amd64.deb apt install -y ./chromium-browser-unstable_94.0.4585.0-1_amd64.deb

View File

@@ -24,6 +24,7 @@ type Config struct {
Rooms string Rooms string
IPAddress string IPAddress string
ScriptToExecute string ScriptToExecute string
SSHPassword string
} }
// Exists reports whether the named file or directory exists. // Exists reports whether the named file or directory exists.
@@ -63,6 +64,7 @@ func SetDefaults() error {
defaults["Rooms"] = defaultPath + "room.json" defaults["Rooms"] = defaultPath + "room.json"
defaults["IPAddress"] = "0.0.0.0" defaults["IPAddress"] = "0.0.0.0"
defaults["ScriptToExecute"] = "" defaults["ScriptToExecute"] = ""
defaults["SSHPassword"] = ""
//Paths to search for config file //Paths to search for config file
configPaths = append(configPaths, defaultPath) configPaths = append(configPaths, defaultPath)

View File

@@ -53,7 +53,20 @@ func GetHttp() *http.ServeMux {
return return
} }
fmt.Fprintf(w, configResp.BarrierHostName) fmt.Fprintf(w, configResp.SystemUsername)
})
//Get SSH password of the current machine
server.HandleFunc("/SSHPassword", func(w http.ResponseWriter, r *http.Request) {
// Read hostname from config file
configResp, err := config.ConfigInit()
if err != nil {
print(err)
return
}
fmt.Fprintf(w, configResp.SSHPassword)
}) })
server.HandleFunc("/ws_serve", func(writer http.ResponseWriter, request *http.Request) { server.HandleFunc("/ws_serve", func(writer http.ResponseWriter, request *http.Request) {

View File

@@ -45,18 +45,18 @@
<div class="form-group"> <div class="form-group">
<input id="inputRoomID" type="text" class="form-control form-control-lg text-center" placeholder="Enter room ID" required> <input id="inputRoomID" type="text" class="form-control form-control-lg text-center" placeholder="Enter room ID" required>
</div> </div>
<h4>Connect to Barrier KVM (Beta)</h4> <!-- <h4>Connect to Barrier KVM (Beta)</h4>-->
<p class="help-text"> <!-- <p class="help-text">-->
This is a feature is still on beta testing. This feature will ensure that you can share the keyboard <!-- This is a feature is still on beta testing. This feature will ensure that you can share the keyboard-->
and mouse of the server machine. <!-- and mouse of the server machine.-->
<br> <!-- <br>-->
<span class="text-success font-weight-bold"> Note: This only works if the laplace server has barrierc installed and the room name you are connecting <!-- <span class="text-success font-weight-bold"> Note: This only works if the laplace server has barrierc installed and the room name you are connecting-->
too belongs to the server.</span> <!-- too belongs to the server.</span>-->
</p> <!-- </p>-->
<h6>Host Name: <span id="hostname"> Not detected </span></h6> <!-- <h6>Host Name: <span id="hostname"> Not detected </span></h6>-->
<div class="form-group"> <!-- <div class="form-group">-->
<input id="barrierIP" type="text" class="form-control form-control-lg text-center" placeholder="IPV6 or IPV4 address"> <!-- <input id="barrierIP" type="text" class="form-control form-control-lg text-center" placeholder="IPV6 or IPV4 address">-->
</div> <!-- </div>-->
<button type="submit" class="btn btn-dark btn-block" value="submit">Join</button> <button type="submit" class="btn btn-dark btn-block" value="submit">Join</button>
</form> </form>
</div> </div>
@@ -145,6 +145,18 @@
</div> </div>
<hr> <hr>
<div> <div>
<h4>Use keyboard and mouse</h4>
<p>
Ensure you have an SSH client installed on your machine
</p>
<h4>Run the following command on terminal:</h4>
<p>ssh -XC <span id="Username"></span>@<span id="IP"></span> x2x -west -to :0.0</p>
<p>Password: <span id="SSHPassword"></span></p>
<p class="help-text">
Move your mouse to the west, and you should have access to the other computer.
</p>
<h6>Status</h6> <h6>Status</h6>
<table class="table table-borderless table-sm table-meta"> <table class="table table-borderless table-sm table-meta">
<tr> <tr>

View File

@@ -144,6 +144,9 @@ function initUI() {
LaplaceVar.ui.videoContainer = document.getElementById('video-container'); LaplaceVar.ui.videoContainer = document.getElementById('video-container');
LaplaceVar.ui.barrierIP = document.getElementById('barrierIP'); LaplaceVar.ui.barrierIP = document.getElementById('barrierIP');
LaplaceVar.ui.barrierhostname = document.getElementById('hostname'); LaplaceVar.ui.barrierhostname = document.getElementById('hostname');
LaplaceVar.ui.serverUsername = document.getElementById('Username');
LaplaceVar.ui.serverIP = document.getElementById('IP');
LaplaceVar.ui.SSHPassword = document.getElementById('SSHPassword')
LaplaceVar.headless = { result :"0"}; LaplaceVar.headless = { result :"0"};
LaplaceVar.ui.joinForm.onsubmit = async e => { LaplaceVar.ui.joinForm.onsubmit = async e => {
@@ -197,7 +200,10 @@ function initUI() {
} }
//getting server hostname //getting server hostname
getServerHostName() getServerIPandHostname()
//getting SSHPassword
getSSHPassword()
// Getting query string from the URL // Getting query string from the URL
const queryString = window.location.search; const queryString = window.location.search;
@@ -221,15 +227,29 @@ function initUI() {
// This is so that user can // This is so that user can
// add the host name to connect // add the host name to connect
// to laplace // to laplace
function getServerHostName() { function getServerIPandHostname() {
// Source https://stackoverflow.com/questions/247483/http-get-request-in-javascript // Source https://stackoverflow.com/questions/247483/http-get-request-in-javascript
var xmlHttp = new XMLHttpRequest() var xmlHttp = new XMLHttpRequest()
xmlHttp.open( "GET", getHttpUrl() + "/hostname", false ); // false for synchronous request xmlHttp.open( "GET", getHttpUrl() + "/hostname", false ); // false for synchronous request
xmlHttp.send(null); xmlHttp.send(null);
LaplaceVar.ui.barrierhostname.innerHTML = xmlHttp.responseText //LaplaceVar.ui.barrierhostname.innerHTML = xmlHttp.responseText
LaplaceVar.ui.serverUsername.innerHTML = xmlHttp.responseText
// Server IP address
LaplaceVar.ui.serverIP.innerHTML = window.location.hostname
//console.log(window.location.href.split('?')[0]) //console.log(window.location.href.split('?')[0])
} }
function getSSHPassword() {
// Source https://stackoverflow.com/questions/247483/http-get-request-in-javascript
var xmlHttp = new XMLHttpRequest()
xmlHttp.open( "GET", getHttpUrl() + "/SSHPassword", false ); // false for synchronous request
xmlHttp.send(null);
LaplaceVar.ui.SSHPassword.innerHTML = xmlHttp.responseText
}
function updateStatusUIStream() { function updateStatusUIStream() {
LaplaceVar.status.peers = Object.keys(LaplaceVar.pcs).map(s => s.split('$')[1]); LaplaceVar.status.peers = Object.keys(LaplaceVar.pcs).map(s => s.split('$')[1]);
LaplaceVar.status.numConn = LaplaceVar.status.peers.length; LaplaceVar.status.numConn = LaplaceVar.status.peers.length;
@@ -592,6 +612,7 @@ function routeByUrl() {
function AddRoomID(roomID) { function AddRoomID(roomID) {
document.getElementById('inputRoomID').value = roomID document.getElementById('inputRoomID').value = roomID
} }
function leaveRoom() { function leaveRoom() {
window.location.href = getBaseUrl(); window.location.href = getBaseUrl();
} }