]>
git.proxmox.com Git - pve-xtermjs.git/blob - src/www/main.js
1 console
.log('xtermjs: starting');
20 starttime
= new Date();
22 var type
= getQueryParameter('console');
23 var vmid
= getQueryParameter('vmid');
24 var vmname
= getQueryParameter('vmname');
25 var nodename
= getQueryParameter('node');
27 function updateState(newState
, msg
) {
28 var timeout
, severity
, message
;
30 case states
.connecting
:
31 message
= "Connecting...";
33 severity
= severities
.warning
;
35 case states
.connected
:
36 message
= "Connected";
38 case states
.disconnecting
:
39 message
= "Disconnecting...";
41 severity
= severities
.warning
;
43 case states
.reconnecting
:
44 message
= "Reconnecting...";
46 severity
= severities
.warning
;
48 case states
.disconnected
:
51 case states
.connecting
:
52 case states
.reconnecting
:
53 message
= "Connection failed";
55 severity
= severities
.error
;
57 case states
.connected
:
58 case states
.disconnecting
:
59 var time_since_started
= new Date() - starttime
;
61 if (time_since_started
> 5*1000) {
62 message
= "Connection closed";
64 message
= "Connection failed";
65 severity
= severities
.error
;
68 case states
.disconnected
:
72 throw "unknown state";
76 throw "unknown state";
79 message
+= " (" + msg
+ ")";
82 showMsg(message
, timeout
, severity
);
85 var terminalContainer
= document
.getElementById('terminal-container');
86 document
.getElementById('status_bar').addEventListener('click', hideMsg
);
87 Terminal
.applyAddon(fit
);
91 function createTerminal() {
92 term
= new Terminal(getTerminalSettings());
94 term
.on('resize', function (size
) {
95 if (state
=== states
.connected
) {
96 socket
.send("1:" + size
.cols
+ ":" + size
.rows
+ ":");
100 protocol
= (location
.protocol
=== 'https:') ? 'wss://' : 'ws://';
103 var url
= '/nodes/' + nodename
;
106 url
+= '/qemu/' + vmid
;
109 url
+= '/lxc/' + vmid
;
118 url
: url
+ '/termproxy',
119 success: function(result
) {
120 var port
= encodeURIComponent(result
.data
.port
);
121 ticket
= result
.data
.ticket
;
122 socketURL
= protocol
+ location
.hostname
+ ((location
.port
) ? (':' + location
.port
) : '') + '/api2/json' + url
+ '/vncwebsocket?port=' + port
+ '&vncticket=' + encodeURIComponent(ticket
);
124 term
.open(terminalContainer
, true);
125 socket
= new WebSocket(socketURL
, 'binary');
126 socket
.binaryType
= 'arraybuffer';
127 socket
.onopen
= runTerminal
;
128 socket
.onclose
= tryReconnect
;
129 socket
.onerror
= tryReconnect
;
130 window
.onbeforeunload
= stopTerminal
;
131 updateState(states
.connecting
);
133 failure: function(msg
) {
134 updateState(states
.disconnected
,msg
);
140 function runTerminal() {
141 socket
.onmessage = function(event
) {
142 var answer
= Utf8ArrayToStr(event
.data
);
143 if (state
=== states
.connected
) {
145 } else if(state
=== states
.connecting
) {
146 if (answer
.slice(0,2) === "OK") {
147 updateState(states
.connected
);
148 term
.write(answer
.slice(2));
155 term
.on('data', function(data
) {
156 if (state
=== states
.connected
) {
157 socket
.send("0:" + unescape(encodeURIComponent(data
)).length
.toString() + ":" + data
);
161 ping
= setInterval(function() {
165 window
.addEventListener('resize', function() {
166 clearTimeout(resize
);
167 resize
= setTimeout(function() {
173 socket
.send(PVE
.UserName
+ ':' + ticket
+ "\n");
175 // initial focus and resize
176 setTimeout(function() {
182 function getLxcStatus(callback
) {
185 url
: '/nodes/' + nodename
+ '/lxc/' + vmid
+ '/status/current',
186 success: function(result
) {
187 if (typeof callback
=== 'function') {
188 callback(true, result
);
191 failure: function(msg
) {
192 if (typeof callback
=== 'function') {
193 callback(false, msg
);
199 function checkMigration() {
201 if (apitype
=== 'kvm') {
209 url
: '/cluster/resources',
210 success: function(result
) {
211 // if not yet migrated , wait and try again
212 // if not migrating and stopped, cancel
213 // if started, connect
214 result
.data
.forEach(function(entity
) {
215 if (entity
.id
=== (apitype
+ '/' + vmid
)) {
216 var started
= entity
.status
=== 'running';
217 var migrated
= entity
.node
!== nodename
;
220 // goto different node
221 location
.href
= '?console=' + type
+
222 '&xtermjs=1&vmid=' + vmid
+ '&vmname=' +
223 vmname
+ '&node=' + entity
.node
;
226 updateState(states
.reconnecting
, 'waiting for migration to finish...');
227 setTimeout(checkMigration
, 5000);
230 if (type
=== 'lxc') {
231 // we have to check the status of the
232 // container to know if it has the
234 getLxcStatus(function(success
, result
) {
236 if (result
.data
.lock
=== 'migrate') {
238 updateState(states
.reconnecting
, 'waiting for migration to finish...');
239 setTimeout(checkMigration
, 5000);
240 } else if (started
) {
241 // container was rebooted
247 // probably the status call failed because
248 // the ct is already somewhere else, so retry
249 setTimeout(checkMigration
, 1000);
252 } else if (started
) {
253 // this happens if we have old data in
254 // /cluster/resources, or the connection
255 // disconnected, so simply try to reload here
257 } else if (type
=== 'kvm') {
258 // it seems the guest simply stopped
267 failure: function(msg
) {
268 errorTerminal({msg
: msg
});
273 function tryReconnect() {
274 var time_since_started
= new Date() - starttime
;
275 var type
= getQueryParameter('console');
276 if (time_since_started
< 5*1000) { // 5 seconds
279 } else if (type
=== 'shell') {
280 updateState(states
.reconnecting
, 'trying to reconnect...');
281 setTimeout(function() {
286 updateState(states
.disconnecting
, 'Detecting migration...');
287 setTimeout(checkMigration
, 5000);
290 function stopTerminal(event
) {
296 updateState(states
.disconnected
, event
.msg
+ event
.code
);
299 function errorTerminal(event
) {
306 updateState(states
.disconnected
, event
.msg
+ event
.code
);