UNPKG

domotz-remote-pawn

Version:

Domotz Agent

297 lines (231 loc) 17.3 kB
(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 }; }]); })();