summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package.json4
-rw-r--r--www/js/StateCtrl.js117
-rw-r--r--www/lang/locale-en.json9
-rw-r--r--www/templates/state.html100
4 files changed, 180 insertions, 50 deletions
diff --git a/package.json b/package.json
index ef12e701..1dd678a8 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "zmninjapro",
"description": "Home security mobile app for ZoneMinder",
- "version":"1.3.029",
+ "version": "1.3.029",
"displayName": "zmNinja",
"author": "Pliable Pixels",
"license": "custom see LICENSE.md",
@@ -176,4 +176,4 @@
]
}
}
-}
+} \ No newline at end of file
diff --git a/www/js/StateCtrl.js b/www/js/StateCtrl.js
index cef454a7..c14c8628 100644
--- a/www/js/StateCtrl.js
+++ b/www/js/StateCtrl.js
@@ -26,30 +26,59 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
var apiRun = loginData.apiurl + "/host/daemonCheck.json";
var apiLoad = loginData.apiurl + "/host/getLoad.json";
- var apiDisk = loginData.apiurl + "/host/getDiskPercent.json";
+ var apiStorage = loginData.apiurl + "/storage.json";
+ var apiServer = loginData.apiurl + "/servers.json";
var apiCurrentState = loginData.apiurl + "/States.json";
var apiExec = loginData.apiurl + "/states/change/";
var inProgress = 0; // prevents user from another op if one is in progress
getRunStatus();
+ getLoadStatus();
+ getCurrentState();
+ getStorageStatus();
+ getServerStatus();
+
+
+// credit https://stackoverflow.com/a/14919494/1361529
+ $scope.humanFileSize = function(bytes, si) {
+ var thresh = si ? 1000 : 1024;
+ bytes = parseFloat(bytes);
+ if (isNaN(bytes)) bytes=0;
+ if(Math.abs(bytes) < thresh) {
+ return bytes + ' B';
+ }
+ var units = si? ['kB','MB','GB','TB','PB','EB','ZB','YB']:['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'];
+ var u = -1;
+ do {
+ bytes /= thresh;
+ ++u;
+ } while(Math.abs(bytes) >= thresh && u < units.length - 1);
+ return bytes.toFixed(1)+' '+units[u];
+};
+
+$scope.matchServer = function (id) {
+ var str = id;
+ var name = "";
+ for (var i=0; i< $scope.servers.length; i++) {
+ if ($scope.servers[i].Server.Id == id) {
+ name = $scope.servers[i].Server.Name;
+ break;
+ }
+ }
+ if (name) {
+ str = name + " ("+id+")";
+ }
+ return str;
+};
+$scope.toggleStorage = function() {
+ $scope.showStorage = !$scope.showStorage;
+};
-
-
- // Let's stagger this by 500ms each to see if Chrome lets these through
- // This may also help if your Apache is not configured to let multiple connections through
-
- $timeout(function () {
- NVRDataModel.debug("invoking LoadStatus...");
- getLoadStatus();
- }, 2000);
-
- $timeout(function () {
- NVRDataModel.debug("invoking CurrentState...");
- getCurrentState();
- }, 4000);
-
+$scope.toggleServer = function() {
+ $scope.showServer = !$scope.showServer;
+};
/*
$timeout(function () {
NVRDataModel.debug("invoking DiskStatus...");
@@ -67,6 +96,9 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
$scope.$on ('$ionicView.beforeEnter', function () {
+ $scope.showStorage = true;
+ $scope.showServer = true;
+
$scope.$on ( "process-push", function () {
NVRDataModel.debug (">> StateCtrl: push handler");
var s = NVRDataModel.evaluateTappedNotification();
@@ -194,22 +226,42 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
}
//----------------------------------------------------------------------
- // returns disk space in gigs taken up by events
+ // returns Storage data
//----------------------------------------------------------------------
- function getDiskStatus() {
- NVRDataModel.debug("StateCtrl/getDiskStatus: " + apiDisk);
- $http.get(apiDisk)
+ function getStorageStatus() {
+
+ $scope.storage = [];
+ NVRDataModel.debug("StorageStatus: " + apiStorage);
+ $http.get(apiStorage)
.then(
function (success) {
- NVRDataModel.debug("StateCtrl/getDiskStatus: success");
- NVRDataModel.debug("Disk results: " + JSON.stringify(success));
- var obj = success.data.usage;
- if (obj.Total.space != undefined) {
- $scope.zmDisk = parseFloat(obj.Total.space).toFixed(1).toString() + "G";
- } else {
- $scope.zmDisk = "unknown";
- NVRDataModel.log("Error retrieving disk space, API returned null for obj.Total.space");
- }
+
+ $scope.storage = success.data.storage;
+ //console.log (JSON.stringify($scope.storage));
+
+ },
+ function (error) {
+ $scope.zmDisk = "unknown";
+ // console.log("ERROR:" + JSON.stringify(error));
+ NVRDataModel.log("Error retrieving DiskStatus: " + JSON.stringify(error), "error");
+ }
+ );
+ }
+
+
+ //----------------------------------------------------------------------
+ // returns Storage data
+ //----------------------------------------------------------------------
+ function getServerStatus() {
+
+ $scope.servers = [];
+ NVRDataModel.debug("ServerStatus: " + apiStorage);
+ $http.get(apiServer)
+ .then(
+ function (success) {
+
+ $scope.servers = success.data.servers;
+ // console.log (JSON.stringify($scope.storage));
},
function (error) {
@@ -386,9 +438,10 @@ angular.module('zmApp.controllers').controller('zmApp.StateCtrl', ['$ionicPopup'
//console.log("***Pull to Refresh");
NVRDataModel.debug("StateCtrl/refresh: calling getRun/Load/Disk/CurrentState");
getRunStatus();
- $timeout(getLoadStatus, 2000);
- $timeout(getCurrentState, 4000);
- //$timeout (getDiskStatus,6000);
+ getLoadStatus();
+ getCurrentState();
+ getStorageStatus();
+ getServerStatus();
$scope.$broadcast('scroll.refreshComplete');
};
diff --git a/www/lang/locale-en.json b/www/lang/locale-en.json
index 100329b0..82d58859 100644
--- a/www/lang/locale-en.json
+++ b/www/lang/locale-en.json
@@ -352,6 +352,15 @@
"kStateAreYouSure" :"Are you sure you want to ",
"kStateHideControls" :"Hide ZoneMinder Controls",
"kStateShowControls" :"Show ZoneMinder Controls",
+ "kStateStorage" :"Storage",
+ "kStateServer" :"Server",
+ "kStatePath" :"Path",
+ "kStateHost" :"Host",
+ "kStateDiskUsed" :"Disk Used",
+ "kStateCpuLoad" :"CPU Load",
+ "kStateTotalMem" :"Total Memory",
+ "kStateFreeMem" :"Free Memory",
+ "kScheme" :"Scheme",
"kStatus" :"Status",
"kStop" :"Stop",
"kSuccess" :"Success",
diff --git a/www/templates/state.html b/www/templates/state.html
index f5bff536..7791cd7b 100644
--- a/www/templates/state.html
+++ b/www/templates/state.html
@@ -6,6 +6,24 @@
</ion-nav-buttons>
<ion-content delegate-handle="none" overflow-scroll="false" mouse-wheel-scroll>
<ion-refresher pulling-text="{{'kPullToReload' | translate}}..." spinner="bubbles" on-refresh="doRefresh()"></ion-refresher>
+
+ <ion-item>
+
+ <div>
+ <div class="row">
+ <div class="col text-center">
+ <a class="button button-small button-outline button-dark " ng-click="selectCustomState();" href="">{{'kChangeState'|translate}}</a>
+ <a class="button button-small button-outline button-dark " ng-click="controlZM('restart');" href="">{{'kRestart'
+ | translate}}</a>
+ <a class="button button-small button-outline button-dark" href="" ng-click="controlZM('stop');">{{'kStop'
+ | translate}}</a>
+ <a class="button button-small button-outline button-dark" ng-click="controlZM('start');" href="">{{'kStart'
+ | translate}}</a>
+ </div>
+ </div>
+ </div>
+ </ion-item>
+
<ion-list>
<ion-item>
<div class="row">
@@ -35,23 +53,73 @@
</div>
</div>
</ion-item>
+ </ion-list>
- <ion-item>
-
- <div>
- <div class="row">
- <div class="col text-center">
- <a class="button button-small button-outline button-dark " ng-click="selectCustomState();" href="">{{'kChangeState'|translate}}</a>
- <a class="button button-small button-outline button-dark " ng-click="controlZM('restart');" href="">{{'kRestart'
- | translate}}</a>
- <a class="button button-small button-outline button-dark" href="" ng-click="controlZM('stop');">{{'kStop'
- | translate}}</a>
- <a class="button button-small button-outline button-dark" ng-click="controlZM('start');" href="">{{'kStart'
- | translate}}</a>
- </div>
- </div>
+
+
+ <div class="list" >
+ <div class="item item-divider icon-left" ng-click="toggleStorage()">
+ <i class="icon" ng-class="showStorage? 'ion-chevron-up':'ion-chevron-down'"></i>
+ {{'kStateStorage' | translate}}
</div>
- </ion-item>
- </ion-list>
+ <div ng-repeat = "store in storage">
+ <div class="item item-accordion item-divider item-icon-left " ng-show="showStorage">
+ <i class="icon ion-social-buffer"></i>
+ {{store.Storage.Name}} ({{store.Storage.Id}})
+ </div> <!-- divider -->
+ <div class="item item-accordion" ng-show="showStorage">
+
+ <div class="row">
+ {{'kStatePath' | translate }}: {{store.Storage.Path}}
+ </div>
+ <div class="row">
+ {{'kStateDiskUsed' | translate }}: {{ humanFileSize(store.Storage.DiskSpace,true)}}
+ </div>
+ <div class="row">
+ {{'kScheme' | translate }}: {{ store.Storage.Scheme}}
+ </div>
+ <div ng-if="store.Storage.ServerId" class="row">
+ {{'kStateServer' | translate }}: {{ matchServer(store.Storage.ServerId)}}
+ </div>
+
+ </div> <!-- item -->
+ </div> <!-- repeat -->
+
+ <div class="item item-divider icon-left" ng-click="toggleServer()">
+ <i class="icon" ng-class="showServer? 'ion-chevron-up':'ion-chevron-down'"></i>
+ {{'kStateServer' | translate}}
+ </div>
+ <div ng-repeat = "server in servers">
+ <div class="item item-accordion item-divider item-icon-left " ng-show="showServer">
+ <i class="icon ion-monitor"></i>
+ {{server.Server.Name}} ({{server.Server.Id}})
+ </div> <!-- divider -->
+ <div class="item item-accordion" ng-show="showServer">
+
+ <div class="row">
+ {{'kStateHost' | translate }}: {{server.Server.Hostname}}
+ </div>
+ <div class="row">
+ {{'kStatus' | translate }}: {{ server.Server.Status}}
+ </div>
+ <div class="row">
+ {{'kStateCpuLoad' | translate }}: {{ server.Server.CpuLoad}}
+ </div>
+ <div class="row">
+ {{'kStateTotalMem' | translate }}: {{ humanFileSize(server.Server.TotalMem, true)}}
+ </div>
+ <div class="row">
+ {{'kStateFreeMem' | translate }}: {{ humanFileSize(server.Server.FreeMem, true)}}
+ </div>
+
+
+ </div> <!-- item -->
+ </div> <!-- repeat -->
+ </div> <!-- list ---->
+
+
+
+
+
</ion-content>
</ion-view>