domotz-remote-pawn
Version:
Domotz Agent
297 lines (231 loc) • 17.3 kB
JavaScript
(function() {
'use strict';
angular.module('domotzAngularWidgets', [
])
.constant('ANGULAR_WIDGETS_IMAGES_PATH', '../images/')
.factory('netToolsService', [function() {
var throwNotImplemented = function () {
throw new Error('netToolsService method not implemented');
};
return {
fetchNetworkInfo: throwNotImplemented,
startMtrTest: throwNotImplemented,
startSpeedTest: throwNotImplemented,
fetchSpeedTestServer: throwNotImplemented
};
}]);
})();
(function () {
'use strict';
angular.module('domotzAngularWidgets')
.controller('FieldController', ['$scope', function ($scope) {
var _self = $scope;
_self.fieldFocus = false;
if (_self.onFieldFocus === undefined) {
_self.onFieldFocus = angular.noop;
}
}])
.directive('dmtField', [function() {
return {
restrict: 'E',
scope: {
ngModel: '=',
fieldLabel: '@',
fieldType: '@',
onFieldFocus: '&?'
},
controller: 'FieldController',
template:'<div class=dmt-field-wrapper ng-form=fieldForm><div class=dmt-field-input ng-class=\"{\'dmt-active\': fieldFocus || ngModel.length > 0 || fieldForm.$error.email}\"><input class=dmt-input name=field type={{fieldType}} ng-model=ngModel ng-focus=\"fieldFocus = true; onFieldFocus()\" ng-blur=\"fieldFocus = false\" required> <span class=dmt-input-label>{{fieldLabel}}</span></div></div>',
replace: true
};
}]);
})();
(function () {
'use strict';
angular.module('domotzAngularWidgets')
.controller('NetInfoController', ['$scope', 'netToolsService', '$timeout', function ($scope, netToolsService, $timeout) {
var _self = $scope;
_self.networkInformation = {
loading: false,
error: false,
data: {}
};
_self.fetchNetworkInfo = function () {
if (_self.networkInformation.loading)
return;
_self.networkInformation.loading = true;
_self.networkInformation.error = false;
$timeout(function () {
netToolsService.fetchNetworkInfo().then(function (response) {
_self.networkInformation.data = response;
}, function () {
_self.networkInformation.data = {};
_self.networkInformation.error = true;
}).finally(function () {
_self.networkInformation.loading = false;
});
}, 1000);
};
}])
.directive('dmtNetInfoView', [function() {
return {
restrict: 'E',
scope: {},
controller: 'NetInfoController',
template:'<div ng-init=fetchNetworkInfo() ng-class=\"{\'dmt-error\': networkInformation.error}\"><ion-content class=\"has-header dmt-content-wrapper dmt-netinfo\" ng-show=!networkInformation.loading><h3>Network Info</h3><div class=dmt-error-wrapper><span class=dmt-error-msg>Oops, something went wrong.</span></div><div class=dmt-rows><div class=dmt-row-data><span class=dmt-left>Public IP Address</span> <span class=dmt-right>{{networkInformation.data.internet_access.ip.address || \'N/A\'}}</span></div><div class=dmt-row-data><span class=dmt-left>Public Name</span> <span class=dmt-right>{{networkInformation.data.internet_access.ip.name || \'N/A\'}}</span></div><div class=dmt-row-data><span class=dmt-left>Provider</span> <span class=dmt-right>{{networkInformation.data.internet_access.provider.netname}}</span> <span class=dmt-right>{{networkInformation.data.internet_access.provider.descr}}</span> <span class=dmt-right>{{networkInformation.data.internet_access.provider.inetnum}}</span> <span class=dmt-right ng-if=!networkInformation.data.internet_access.provider>N/A</span></div><div class=dmt-row-data><span class=dmt-left>Gateway</span> <span class=dmt-right>{{networkInformation.data.local_network.servers.gateway || \'N/A\'}}</span></div><div class=dmt-row-data><span class=dmt-left>DNS</span> <span class=dmt-right ng-repeat=\"dns in networkInformation.data.local_network.servers.dns\">{{dns}}</span> <span class=dmt-right ng-if=!networkInformation.data.local_network.servers.dns>N/A</span></div><div class=dmt-row-data><span class=dmt-left>DHCP</span> <span class=dmt-right ng-repeat=\"dhcp in networkInformation.data.local_network.servers.dhcp\">{{dhcp}}</span> <span class=dmt-right ng-if=!networkInformation.data.local_network.servers.dhcp>N/A</span></div><div class=dmt-row-data><span class=dmt-left>Interface</span> <span class=dmt-right ng-repeat=\"interface in networkInformation.data.local_network.interfaces\">{{interface.address}} ({{interface.name}})</span> <span class=dmt-right ng-if=!networkInformation.data.local_network.interfaces>N/A</span></div></div><div class=dmt-action-button ng-click=fetchNetworkInfo() ng-if=networkInformation.error>Retry</div></ion-content><ion-content class=\"has-header dmt-spinner-wrapper\" ng-show=networkInformation.loading><ion-spinner icon=android class=dmt-spinner></ion-spinner><div class=dmt-notice>Fetching your network information.</div></ion-content></div>',
replace: true
};
}]);
})();
(function () {
'use strict';
angular.module('domotzAngularWidgets')
.controller('NetRouteController', ['$scope', 'netToolsService', '$ionicScrollDelegate', 'ANGULAR_WIDGETS_IMAGES_PATH', function ($scope, netToolsService, $ionicScrollDelegate, ANGULAR_WIDGETS_IMAGES_PATH) {
var _self = $scope;
_self.imagesPath = ANGULAR_WIDGETS_IMAGES_PATH;
_self.mtrTest = {
loading: false,
error: false,
target: 'google.com',
packets: 10,
raw: false,
data: {}
};
_self.startMtrTest = function () {
if (_self.mtrTest.loading)
return;
// Reset previous data
if (_self.mtrTest.data.mtr) {
_self.mtrTest.data = {};
_self.mtrTest.raw = false;
_self.mtrTest.error = false;
updateMtrScrollHeight();
return;
}
_self.mtrTest.loading = true;
_self.mtrTest.error = false;
_self.mtrTest.data = {};
var destination = _self.mtrTest.target || 'google.com';
var count = _self.mtrTest.packets || 10;
netToolsService.startMtrTest(destination, count).then(function (response) {
_self.mtrTest.data = response;
}, function () {
_self.mtrTest.error = true;
}).finally(function () {
_self.mtrTest.loading = false;
updateMtrScrollHeight();
});
};
_self.showMtrRawData = function () {
_self.mtrTest.raw = true;
updateMtrScrollHeight();
$ionicScrollDelegate.$getByHandle('netroute-scroll').scrollBottom();
};
function updateMtrScrollHeight() {
$scope.$broadcast('scroll-resize', {handler: 'netroute-scroll'});
}
}])
.directive('dmtNetRouteView', [function() {
return {
restrict: 'E',
scope: {},
controller: 'NetRouteController',
template:'<div ng-init=fetchNetworkInfo() ng-class=\"{\'dmt-error\': mtrTest.error}\"><ion-content class=\"has-header dmt-content-wrapper dmt-netroute\" delegate-handle=netroute-scroll scroll-resize><h3>Route Analysis</h3><div class=dmt-error-wrapper><span class=dmt-error-msg>Oops, something went wrong.</span></div><div class=dmt-animation-wrapper><img ng-src={{imagesPath}}mtr-test-results.gif ng-show=mtrTest.data.mtr> <img ng-src=\"{{imagesPath}}{{mtrTest.loading ? \'mtr-test-animation\' : \'mtr-test-static\'}}.gif\" ng-show=!mtrTest.data.mtr><div class=dmt-netroute-results ng-class=\"\'dmt-netroute-results-\' + res\" ng-repeat=\"res in [\'internal\', \'isp\', \'destination\']\" ng-show=mtrTest.data.mtr><div class=\"dmt-netroute-labels row\"><div class=col-50>Loss%</div><div class=col-50>Avg</div></div><div class=\"dmt-netroute-values row\"><div class=col-50>{{mtrTest.data.mtr[res].loss_ratio || \'N/A\'}}</div><div class=col-50>{{(mtrTest.data.mtr[res].ping.average ? mtrTest.data.mtr[res].ping.average + \'ms\' : \'N/A\')}}</div></div></div></div><div class=dmt-netroute-config ng-class=\"{\'dmt-disabled\' : mtrTest.loading}\" ng-show=!mtrTest.data.mtr><div class=dmt-label>Test Target</div><div class=dmt-input><input type=text ng-model=mtrTest.target></div><div class=dmt-label>Packets Number</div><div class=\"dmt-options-group row\"><div class=\"dmt-option col-33\" ng-repeat=\"val in [10, 20, 50]\" ng-class=\"{\'dmt-active\': mtrTest.packets == val}\" ng-click=\"mtrTest.packets = val\">{{val}}</div></div></div><div class=dmt-notice ng-show=!mtrTest.data.mtr>This test will last approximately {{mtrTest.packets}} seconds.</div><div class=dmt-netroute-resume ng-show=mtrTest.data.mtr><div class=dmt-highlight>Sent {{mtrTest.packets}} packets to {{mtrTest.target}}</div><div class=dmt-more ng-click=showMtrRawData() ng-show=!mtrTest.raw>See raw data</div><ion-scroll direction=x class=dmt-netroute-raw ng-show=mtrTest.raw><pre ng-repeat=\"line in mtrTest.data.mtr.raw\">{{line}}</pre></ion-scroll></div><div class=dmt-action-button ng-class=\"{\'dmt-disabled\' : mtrTest.loading}\" ng-click=startMtrTest()>{{mtrTest.loading ? \'Testing...\' : (mtrTest.data.mtr ? \'Done\' : \'Start\')}}</div></ion-content></div>',
replace: true
};
}]);
})();
(function () {
'use strict';
angular.module('domotzAngularWidgets')
.controller('NetSpeedController', ['$scope', 'netToolsService', '$timeout', 'ANGULAR_WIDGETS_IMAGES_PATH', function ($scope, netToolsService, $timeout, ANGULAR_WIDGETS_IMAGES_PATH) {
var DEFAULT_SPEEDTEST_GIF = 'speed-test-starter';
var MBIT = 1000000;
var _self = $scope;
_self.imagesPath = ANGULAR_WIDGETS_IMAGES_PATH;
_self.speedTest = {
loading: false,
error: false,
server: {
loading: false,
error: false,
location: ''
},
data: {
ping: {
gif: DEFAULT_SPEEDTEST_GIF
},
download: {
gif: DEFAULT_SPEEDTEST_GIF
},
upload: {
gif: DEFAULT_SPEEDTEST_GIF
}
}
};
_self.startSpeedTest = function () {
if (_self.speedTest.loading)
return;
_self.speedTest.loading = true;
_self.speedTest.error = false;
_self.speedTest.server.error = false;
_resetSpeedTest();
_self.speedTest.server.loading = true;
netToolsService.fetchSpeedTestServer().then(_self.executeSpeedTest, function (error) {
_self.speedTest.server.location = 'N/A';
_self.speedTest.server.error = true;
_self.speedTest.loading = false;
}).finally(function () {
_self.speedTest.server.loading = false;
});
};
_self.executeSpeedTest = function (response) {
_self.speedTest.server.location = response.location && response.location.siteName ? (response.location.siteName + (response.location.state ? ' (' + response.location.state + ')' : '')) : 'N/A';
var serverID = response.id;
if (serverID) {
_self.speedTest.data.ping.gif = 'ping-animation';
_self.speedTest.data.download.gif = 'download-animation';
_self.speedTest.data.upload.gif = 'upload-animation';
var speedPromise = netToolsService.startSpeedTest(serverID);
$timeout(function () {
speedPromise.then(function (testResponse) {
_self.speedTest.data.ping.value = testResponse.speedTest.speed && testResponse.speedTest.speed.rtt ? (parseInt(testResponse.speedTest.speed.rtt) + 'ms') : 'N/A';
_self.speedTest.data.download.value = testResponse.speedTest.speed && testResponse.speedTest.speed.download ? (parseFloat(testResponse.speedTest.speed.download / MBIT).toFixed(2) + ' Mbps') : 'N/A';
_self.speedTest.data.upload.value = testResponse.speedTest.speed && testResponse.speedTest.speed.upload ? (parseFloat(testResponse.speedTest.speed.upload / MBIT).toFixed(2) + ' Mbps') : 'N/A';
}, function () {
_self.speedTest.data.ping.value = 'N/A';
_self.speedTest.data.download.value = 'N/A';
_self.speedTest.data.upload.value = 'N/A';
_self.speedTest.error = true;
}).finally(function () {
_self.speedTest.loading = false;
// Reset gifs
_self.speedTest.data.ping.gif = DEFAULT_SPEEDTEST_GIF;
_self.speedTest.data.download.gif = DEFAULT_SPEEDTEST_GIF;
_self.speedTest.data.upload.gif = DEFAULT_SPEEDTEST_GIF;
});
}, 30000);
} else {
_self.speedTest.server.location = 'N/A';
_self.speedTest.server.error = true;
_self.speedTest.loading = false;
}
};
function _resetSpeedTest() {
_self.speedTest.data.ping.value = '';
_self.speedTest.data.download.value = '';
_self.speedTest.data.upload.value = '';
}
}])
.directive('dmtNetSpeedView', [function() {
return {
restrict: 'E',
scope: {
agentName: '=?'
},
controller: 'NetSpeedController',
template:'<div ng-init=fetchNetworkInfo() ng-class=\"{\'dmt-error\': speedTest.error || speedTest.server.error}\"><ion-content class=\"has-header dmt-content-wrapper dmt-netspeed\"><h3>Speed Test</h3><div class=dmt-error-wrapper><span class=dmt-error-msg>{{speedTest.server.error ? \'Cannot find an available server right now, please try again.\' : \'Oops, something went wrong.\'}}</span></div><div class=dmt-rows><div class=\"dmt-row-data dmt-netspeed-location\"><span class=dmt-left>From</span> <span class=dmt-right>To</span> <span class=\"dmt-left dmt-netspeed-source\">{{agentName || \'Domotz Agent\'}}</span> <span class=\"dmt-right dmt-netspeed-server-spinner\" ng-show=\"speedTest.loading && speedTest.server.loading\"><ion-spinner icon=android class=dmt-spinner></ion-spinner></span> <span class=\"dmt-right dmt-netspeed-server\"><span ng-show=!speedTest.server.loading ng-class=\"{\'dmt-error\': speedTest.server.error, \'dmt-italic\': !speedTest.server.location}\">{{speedTest.server.location || \'Nearest Server\'}}</span></span></div></div><div class=dmt-rows><div class=dmt-row-data><span class=\"dmt-left dmt-netspeed-label\">Ping</span> <span class=\"dmt-right dmt-netspeed-value\">{{speedTest.data.ping.value}}</span> <span class=\"dmt-right dmt-netspeed-gif\" ng-show=!speedTest.data.ping.value><img ng-src={{imagesPath}}{{speedTest.data.ping.gif}}.gif></span></div><div class=dmt-row-data><span class=\"dmt-left dmt-netspeed-label\">Download Speed</span> <span class=\"dmt-right dmt-netspeed-value\">{{speedTest.data.download.value}}</span> <span class=\"dmt-right dmt-netspeed-gif\" ng-show=!speedTest.data.download.value><img ng-src={{imagesPath}}{{speedTest.data.download.gif}}.gif></span></div><div class=dmt-row-data><span class=\"dmt-left dmt-netspeed-label\">Upload Speed</span> <span class=\"dmt-right dmt-netspeed-value\">{{speedTest.data.upload.value}}</span> <span class=\"dmt-right dmt-netspeed-gif\" ng-show=!speedTest.data.upload.value><img ng-src={{imagesPath}}{{speedTest.data.upload.gif}}.gif></span></div></div><div class=dmt-action-button ng-class=\"{\'dmt-disabled\' : speedTest.loading}\" ng-click=startSpeedTest()>{{speedTest.loading ? \'Testing...\' : (speedTest.data.ping.value ? \'Test Again\' : \'Start\')}}</div></ion-content></div>',
replace: true
};
}]);
})();