mirror of
git://git.proxmox.com/git/pve-xtermjs.git
synced 2025-03-11 20:58:41 +03:00
detect not running guests and add start button
akin to what we now have in novnc css classes copied from novnc, so that we have the same look Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
parent
81a288b933
commit
9871a3b81e
@ -11,6 +11,12 @@
|
||||
<body>
|
||||
<div id="status_bar"></div>
|
||||
<div id="wrap">
|
||||
<div class="center">
|
||||
<div id="connect_dlg">
|
||||
<div id="pve_start_info">Guest not running</div>
|
||||
<div id="connect_btn"><div> Start Now </div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="terminal-container"></div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
|
@ -11,6 +11,12 @@
|
||||
<body>
|
||||
<div id="status_bar"></div>
|
||||
<div id="wrap">
|
||||
<div class="center">
|
||||
<div id="connect_dlg">
|
||||
<div id="pve_start_info">Guest not running</div>
|
||||
<div id="connect_btn"><div> Start Now </div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="terminal-container"></div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
|
@ -97,10 +97,59 @@ function updateState(newState, msg, code) {
|
||||
|
||||
var terminalContainer = document.getElementById('terminal-container');
|
||||
document.getElementById('status_bar').addEventListener('click', hideMsg);
|
||||
document.getElementById('connect_btn').addEventListener('click', startGuest);
|
||||
const fitAddon = new FitAddon.FitAddon();
|
||||
|
||||
createTerminal();
|
||||
|
||||
function startConnection(url, params, term) {
|
||||
API2Request({
|
||||
method: 'POST',
|
||||
params: params,
|
||||
url: url + '/termproxy',
|
||||
success: function(result) {
|
||||
var port = encodeURIComponent(result.data.port);
|
||||
ticket = result.data.ticket;
|
||||
socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/api2/json' + url + '/vncwebsocket?port=' + port + '&vncticket=' + encodeURIComponent(ticket);
|
||||
|
||||
term.open(terminalContainer, true);
|
||||
socket = new WebSocket(socketURL, 'binary');
|
||||
socket.binaryType = 'arraybuffer';
|
||||
socket.onopen = runTerminal;
|
||||
socket.onclose = tryReconnect;
|
||||
socket.onerror = tryReconnect;
|
||||
updateState(states.connecting);
|
||||
},
|
||||
failure: function(msg) {
|
||||
updateState(states.disconnected,msg);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function startGuest() {
|
||||
let api_type = type === 'kvm' ? 'qemu' : 'lxc';
|
||||
API2Request({
|
||||
method: 'POST',
|
||||
url: `/nodes/${nodename}/${api_type}/${vmid}/status/start`,
|
||||
success: function(result) {
|
||||
showMsg('Guest started successfully', 0);
|
||||
setTimeout(function() {
|
||||
location.reload();
|
||||
}, 1000);
|
||||
},
|
||||
failure: function(msg) {
|
||||
if (msg.match(/already running/)) {
|
||||
showMsg('Guest started successfully', 0);
|
||||
setTimeout(function() {
|
||||
location.reload();
|
||||
}, 1000);
|
||||
} else {
|
||||
updateState(states.disconnected,msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function createTerminal() {
|
||||
term = new Terminal(getTerminalSettings());
|
||||
term.loadAddon(fitAddon);
|
||||
@ -132,28 +181,24 @@ function createTerminal() {
|
||||
}
|
||||
break;
|
||||
}
|
||||
API2Request({
|
||||
method: 'POST',
|
||||
params: params,
|
||||
url: url + '/termproxy',
|
||||
success: function(result) {
|
||||
var port = encodeURIComponent(result.data.port);
|
||||
ticket = result.data.ticket;
|
||||
socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/api2/json' + url + '/vncwebsocket?port=' + port + '&vncticket=' + encodeURIComponent(ticket);
|
||||
|
||||
term.open(terminalContainer, true);
|
||||
socket = new WebSocket(socketURL, 'binary');
|
||||
socket.binaryType = 'arraybuffer';
|
||||
socket.onopen = runTerminal;
|
||||
socket.onclose = tryReconnect;
|
||||
socket.onerror = tryReconnect;
|
||||
updateState(states.connecting);
|
||||
},
|
||||
failure: function(msg) {
|
||||
updateState(states.disconnected,msg);
|
||||
}
|
||||
});
|
||||
|
||||
if (type === 'kvm' || type === 'lxc') {
|
||||
API2Request({
|
||||
method: 'GET',
|
||||
url: `${url}/status/current`,
|
||||
success: function(result) {
|
||||
if (result.data.status === 'running') {
|
||||
startConnection(url, params, term);
|
||||
} else {
|
||||
document.getElementById('connect_dlg').classList.add('pve_open');
|
||||
}
|
||||
},
|
||||
failure: function(msg) {
|
||||
updateState(states.disconnected, msg);
|
||||
},
|
||||
});
|
||||
} else {
|
||||
startConnection(url, params, term);
|
||||
}
|
||||
}
|
||||
|
||||
function runTerminal() {
|
||||
|
@ -83,3 +83,62 @@ html,body {
|
||||
#status_bar.warning {
|
||||
background: rgba(180,180,30,0.9);
|
||||
}
|
||||
|
||||
#pve_start_info {
|
||||
color: white;
|
||||
text-align: center;
|
||||
font-size: 20px;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
#connect_dlg {
|
||||
transition: 0.2s ease-in-out;
|
||||
|
||||
transform: scale(0, 0);
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
font-family: Helvetica;
|
||||
}
|
||||
|
||||
#connect_dlg.pve_open {
|
||||
transform: scale(1, 1);
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#connect_btn {
|
||||
cursor: pointer;
|
||||
padding: 6px;
|
||||
color: white;
|
||||
background:#4c4c4c;;
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
font-size: 20px;
|
||||
box-shadow: 4px 4px 0px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
#connect_btn div {
|
||||
margin: 2px;
|
||||
padding: 5px 30px;
|
||||
border: 1px solid #2f2f2f;
|
||||
border-bottom-width: 2px;
|
||||
border-radius: 5px;
|
||||
background:#4c4c4c;;
|
||||
|
||||
/* This avoids it jumping around when :active */
|
||||
vertical-align: middle;
|
||||
}
|
||||
#connect_btn div:active {
|
||||
border-bottom-width: 1px;
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
div.center {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user