1198ce1ffSYoshie Muranaka/**
2198ce1ffSYoshie Muranaka * Directive for KVM (Kernel-based Virtual Machine)
3198ce1ffSYoshie Muranaka *
4198ce1ffSYoshie Muranaka * @module app/serverControl
5198ce1ffSYoshie Muranaka * @exports kvmConsole
6198ce1ffSYoshie Muranaka * @name kvmConsole
7198ce1ffSYoshie Muranaka */
8198ce1ffSYoshie Muranaka
9198ce1ffSYoshie Muranakaimport RFB from '@novnc/novnc/core/rfb.js';
10198ce1ffSYoshie Muranaka
11198ce1ffSYoshie Muranakawindow.angular && (function(angular) {
12198ce1ffSYoshie Muranaka  'use strict';
13198ce1ffSYoshie Muranaka
14198ce1ffSYoshie Muranaka  angular.module('app.serverControl').directive('kvmConsole', [
15c3f5e318SJames Feist    '$log', '$cookies', '$location',
16*052a282fSJames Feist    function($log, $cookies, $location) {
17198ce1ffSYoshie Muranaka      return {
18198ce1ffSYoshie Muranaka        restrict: 'E', template: require('./kvm-console.html'),
19bea45d53SDixsie Wolmers            scope: {newWindowBtn: '=?'}, link: function(scope, element) {
20198ce1ffSYoshie Muranaka              var rfb;
21198ce1ffSYoshie Muranaka
22198ce1ffSYoshie Muranaka              element.on('$destroy', function() {
23198ce1ffSYoshie Muranaka                if (rfb) {
24198ce1ffSYoshie Muranaka                  rfb.disconnect();
25198ce1ffSYoshie Muranaka                }
26198ce1ffSYoshie Muranaka              });
27198ce1ffSYoshie Muranaka
28198ce1ffSYoshie Muranaka              function sendCtrlAltDel() {
29198ce1ffSYoshie Muranaka                rfb.sendCtrlAltDel();
30198ce1ffSYoshie Muranaka                return false;
31198ce1ffSYoshie Muranaka              };
32198ce1ffSYoshie Muranaka
33198ce1ffSYoshie Muranaka              function connected(e) {
34198ce1ffSYoshie Muranaka                $log.debug('RFB Connected');
35198ce1ffSYoshie Muranaka              }
36bea45d53SDixsie Wolmers
37198ce1ffSYoshie Muranaka              function disconnected(e) {
38198ce1ffSYoshie Muranaka                $log.debug('RFB disconnected');
39198ce1ffSYoshie Muranaka              }
40198ce1ffSYoshie Muranaka
41198ce1ffSYoshie Muranaka              var host = $location.host();
42198ce1ffSYoshie Muranaka              var port = $location.port();
43198ce1ffSYoshie Muranaka              var target = element[0].firstElementChild;
44198ce1ffSYoshie Muranaka              try {
45c3f5e318SJames Feist                var token = $cookies.get('XSRF-TOKEN');
46198ce1ffSYoshie Muranaka                rfb = new RFB(
47c3f5e318SJames Feist                    target, 'wss://' + host + '/kvm/0',
48c3f5e318SJames Feist                    {'wsProtocols': [token]});
49198ce1ffSYoshie Muranaka                rfb.addEventListener('connect', connected);
50198ce1ffSYoshie Muranaka                rfb.addEventListener('disconnect', disconnected);
51198ce1ffSYoshie Muranaka              } catch (exc) {
52198ce1ffSYoshie Muranaka                $log.error(exc);
53198ce1ffSYoshie Muranaka                updateState(
54198ce1ffSYoshie Muranaka                    null, 'fatal', null,
55198ce1ffSYoshie Muranaka                    'Unable to create RFB client -- ' + exc);
56198ce1ffSYoshie Muranaka                return;  // don't continue trying to connect
57198ce1ffSYoshie Muranaka              };
58bea45d53SDixsie Wolmers
59bea45d53SDixsie Wolmers              scope.openWindow = function() {
60bea45d53SDixsie Wolmers                window.open(
61bea45d53SDixsie Wolmers                    '#/server-control/kvm-window', 'Kvm Window',
62bea45d53SDixsie Wolmers                    'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=yes,width=1125,height=900');
63bea45d53SDixsie Wolmers              };
64198ce1ffSYoshie Muranaka            }
65198ce1ffSYoshie Muranaka      }
66198ce1ffSYoshie Muranaka    }
67198ce1ffSYoshie Muranaka  ]);
68198ce1ffSYoshie Muranaka})(window.angular);
69