diff options
| author | pliablepixels <pliablepixels@gmail.com> | 2016-03-16 16:33:58 -0400 |
|---|---|---|
| committer | pliablepixels <pliablepixels@gmail.com> | 2016-03-16 16:33:58 -0400 |
| commit | 8af8b2ceedebdb3e513591be0ac5ee28ac93217c (patch) | |
| tree | 8440afc3076e9776f850190a3db4e70587ee960f /www | |
| parent | fcad5d2d8d654cd5dba9181a34f536da4aeb49ad (diff) | |
#133 - initial code to daisy chain configurations
Former-commit-id: d889e12001de6e6e9974703a2dfcc5345028dee7
Diffstat (limited to 'www')
| -rw-r--r-- | www/js/DataModel.js | 148 | ||||
| -rw-r--r-- | www/js/LoginCtrl.js | 56 | ||||
| -rw-r--r-- | www/js/app.js | 298 | ||||
| -rw-r--r-- | www/templates/login.html | 11 |
4 files changed, 312 insertions, 201 deletions
diff --git a/www/js/DataModel.js b/www/js/DataModel.js index 555433c0..bf58f112 100644 --- a/www/js/DataModel.js +++ b/www/js/DataModel.js @@ -31,6 +31,7 @@ angular.module('zmApp.controllers') 'serverName':'', 'username': '', 'password': '', + 'fallbackConfiguration': '', 'url': '', // This is the ZM portal path 'apiurl': '', // This is the API path 'eventServer':'', //experimental Event server address @@ -209,6 +210,110 @@ angular.module('zmApp.controllers') }, + getReachableConfig: function () + { + var d = $q.defer(); + if (loginData.serverName=="") + { + zmLog("Reachable: No server name configured, likely first use?"); + d.reject ("No servers"); + return d.promise; + } + + var chainURLs = [ {url:'http://1.ozone.network',server: 'o1'}, + {url:'http://2.ozone.network',server: 'o2'}, + {url:'http://3.ozone.network',server: 'o3'}, + + ]; + var savedLoginData = angular.copy(loginData); + + //zmLog ("Making sure " + loginData.serverName + " is reachable..."); + var tLd = serverGroupList[loginData.serverName]; + + var keepBuilding = true; + while (keepBuilding==true) + { + if (arrayObjectIndexOf(chainURLs,tLd.url,"url") == -1 ) // no loop + { + zmLog ("Adding to chain stack: " + tLd.serverName + ">"+tLd.url); + chainURLs.push ({url:tLd.url, server:tLd.serverName}); + zmLog ("Fallback of " + tLd.serverName + " is " + tLd.fallbackConfiguration); + if (tLd.fallbackConfiguration) + { + tLd = serverGroupList [tLd.fallbackConfiguration]; + } + else + { + zmLog ("reached end of chain loop"); + } + } + else + { + zmLog ("detected loop when " + tLd.serverName + " fallsback to " + tLd.fallbackConfiguration); + keepBuilding = false; + } + } + + + + //contactedServers.push(loginData.serverName); + findFirstReachableUrl(chainURLs).then(function (firstReachableUrl) { + d.resolve (firstReachableUrl); + // also make sure loginData points to this now + + loginData = serverGroupList[firstReachableUrl.server]; + + console.log ("set login Data to " + JSON.stringify(loginData)); + + return d.promise; + // OK: do something with firstReachableUrl + }, function () { + d.reject ("No servers reachable"); + return d.promise; + // KO: no url could be reached + }); + + + function arrayObjectIndexOf(myArray, searchTerm, property) + { + for(var i = 0, len = myArray.length; i < len; i++) + { + if (myArray[i][property] === searchTerm) + return i; + } + return -1; + } + + function findFirstReachableUrl (urls) + { + if (urls.length > 0) + { + $ionicLoading.show({template: 'trying ' + urls[0].server}); + zmLog ("Reachability test.." + urls[0].url); + return $http.get(urls[0].url).then(function () { + zmLog ("Success: reachability on "+ urls[0].url); + $ionicLoading.hide(); + return urls[0]; + }, function() { + zmLog ("Failed reachability on "+ urls[0].url); + return findFirstReachableUrl(urls.slice(1)); + }); + } + else + { + $ionicLoading.hide(); + return $q.reject("No reachable URL"); + + } + + + } + + return d.promise; + + + }, + init: function () { // console.log("****** DATAMODEL INIT SERVICE CALLED ********"); @@ -491,49 +596,6 @@ angular.module('zmApp.controllers') setLogin(newLogin); $rootScope.showBlog = newLogin.enableBlog; - - /* - window.localStorage.setItem("username", loginData.username); - window.localStorage.setItem("password", loginData.password); - window.localStorage.setItem("url", loginData.url); - window.localStorage.setItem("apiurl", loginData.apiurl); - window.localStorage.setItem("streamingurl", loginData.streamingurl); - window.localStorage.setItem("eventServer", loginData.eventServer); - window.localStorage.setItem("eventServerMonitors", loginData.eventServerMonitors); - window.localStorage.setItem("eventServerInterval", loginData.eventServerInterval); - window.localStorage.setItem("maxFPS", loginData.maxFPS); - - - - window.localStorage.setItem("useSSL", loginData.useSSL?"1":"0"); - window.localStorage.setItem("usePin", loginData.usePin?"1":"0"); - window.localStorage.setItem("canSwipeMonitors", loginData.canSwipeMonitors?"1":"0"); - window.localStorage.setItem("persistMontageOrder", loginData.persistMontageOrder?"1":"0"); - - window.localStorage.setItem("enableh264", loginData.enableh264?"1":"0"); - window.localStorage.setItem("gapless", loginData.gapless?"1":"0"); - - window.localStorage.setItem("pinCode", loginData.pinCode); - - - window.localStorage.setItem("enableDebug", loginData.enableDebug?"1":"0"); - window.localStorage.setItem("keepAwake", loginData.keepAwake?"1":"0"); - window.localStorage.setItem("maxMontage", loginData.maxMontage); - window.localStorage.setItem("montageQuality", loginData.montageQuality); - window.localStorage.setItem("singleImageQuality", loginData.singleImageQuality); - window.localStorage.setItem("refreshSec", loginData.refreshSec); - - - window.localStorage.setItem("isUseAuth", loginData.isUseAuth); - window.localStorage.setItem("isUseEventServer", loginData.isUseEventServer); - window.localStorage.setItem("disablePush", loginData.disablePush); - window.localStorage.setItem("onTapScreen", loginData.onTapScreen); - - - console.log ("***** SETTING ISUSEAUTH TO " + loginData.isUseAuth); - */ - - }, //------------------------------------------------------- diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js index 0c09e4c3..e892d3f3 100644 --- a/www/js/LoginCtrl.js +++ b/www/js/LoginCtrl.js @@ -10,6 +10,15 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r var serverbuttons = []; var availableServers; + $scope.loginData = ZMDataModel.getLogin(); + + $scope.check = { + isUseAuth: "", + isUseEventServer: "" + }; + + $scope.check.isUseAuth = ($scope.loginData.isUseAuth == '1') ? true : false; + $scope.check.isUseEventServer = ($scope.loginData.isUseEventServer == true) ? true : false; //---------------------------------------------------------------- // Alarm notification handling @@ -29,15 +38,7 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r } }; - $scope.loginData = ZMDataModel.getLogin(); - - $scope.check = { - isUseAuth: "", - isUseEventServer: "" - }; - - $scope.check.isUseAuth = ($scope.loginData.isUseAuth == '1') ? true : false; - $scope.check.isUseEventServer = ($scope.loginData.isUseEventServer == true) ? true : false; + //console.log("*************************************************"); @@ -50,6 +51,43 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r }); //console.log("ADDING : " + availableServers[servIter]); } + + + $scope.selectFallback = function () + { + var as = Object.keys(ZMDataModel.getServerGroups()); + if (as.length < 2) + { + $rootScope.zmPopup= SecuredPopups.show('alert',{ + title: 'Error', + template: 'You need to have at least 2 distinct configurations created for a fallback' + }); + return; + + } + var ab = [{text:'Clear'}]; + var ld = ZMDataModel.getLogin(); + as.forEach(function(item) { if (item != ld.serverName) ab.push({text:item});}); + var sheet = $ionicActionSheet.show({ + buttons: ab, + titleText: 'Select fallback', + cancelText: 'Cancel', + cancel: function() {}, + buttonClicked: function (index) + { + console.log ("YOU WANT " + ab[index].text + index); + if (index==0) + $scope.loginData.fallbackConfiguration=""; + else + $scope.loginData.fallbackConfiguration = ab[index].text; + ZMDataModel.setLogin($scope.loginData); + return true; + } + }); + + + + }; $scope.serverActionSheet = function () { var hideSheet = $ionicActionSheet.show({ diff --git a/www/js/app.js b/www/js/app.js index e5100e05..298644c4 100644 --- a/www/js/app.js +++ b/www/js/app.js @@ -737,181 +737,189 @@ angular.module('zmApp', [ function doLogin(str) { - // recompute rand anyway so even if you don't have auth - // your stream should not get frozen - $rootScope.rand = Math.floor((Math.random() * 100000) + 1); - $rootScope.modalRand = Math.floor((Math.random() * 100000) + 1); + var d = $q.defer(); - var statename = $ionicHistory.currentStateName(); + var statename = $ionicHistory.currentStateName(); + + if (statename == "montage-history") + { + ZMDataModel.zmLog ("Skipping login process as we are in montage history. Re-logging will mess up the stream"); + d.resolve("success"); + return d.promise; + + } - if (statename == "montage-history") - { - ZMDataModel.zmLog ("Skipping login process as we are in montage history. Re-logging will mess up the stream"); - return; - } - // console.log ("***** STATENAME IS " + statename); + ZMDataModel.getReachableConfig() + .then (function (data) + { + ZMDataModel.zmLog ("REACHABILITY SUCCESS " + JSON.stringify(data)); + proceedWithLogin() + .then (function(success) + { d.resolve(success); return d.promise;}, + function(error) + { d.reject(error); return d.promise;}); + + }, + function (error) + { + ZMDataModel.zmLog ("REACHABILITY ERROR " + JSON.stringify(error)); + d.reject (error); + return d.promise; + }); + return d.promise; - var d = $q.defer(); - var ld = ZMDataModel.getLogin(); - if (ld.isUseAuth != "1") { - $ionicLoading.hide(); - ZMDataModel.zmLog("Authentication is disabled. Skipping login"); - ZMDataModel.zmLog("However, still doing a reachability check..."); + + function proceedWithLogin() + { + // recompute rand anyway so even if you don't have auth + // your stream should not get frozen + $rootScope.rand = Math.floor((Math.random() * 100000) + 1); + $rootScope.modalRand = Math.floor((Math.random() * 100000) + 1); - ZMDataModel.zmDebug ("LD.url is " + ld.url); - $http.get(ld.url) - .then(function (success) { - ZMDataModel.zmLog(ld.url + " is reachable."); - d.resolve("Login success - no auth"); - return d.promise; + - }, - function (error) { - ZMDataModel.zmLog(ld.url + " is NOT reachable."); - d.reject("Login Error - not reachable"); - $rootScope.$emit('auth-error', "not reachable"); - return d.promise; - }); + // console.log ("***** STATENAME IS " + statename); - return d.promise; - } + var d = $q.defer(); + var ld = ZMDataModel.getLogin(); + ZMDataModel.zmLog("zmAutologin called"); - ZMDataModel.zmLog("zmAutologin called"); + if (str) { + $ionicLoading.show({ + template: str, + noBackdrop: true, + duration: zm.httpTimeout + }); + } - if (str) { - $ionicLoading.show({ - template: str, - noBackdrop: true, - duration: zm.httpTimeout - }); - } + ZMDataModel.isReCaptcha() + .then(function (result) { + if (result == true) { + $ionicLoading.hide(); + ZMDataModel.displayBanner('error', ['reCaptcha must be disabled', + ], "", 8000); + var alertPopup = $ionicPopup.alert({ + title: 'reCaptcha enabled', + template: 'Looks like you have enabled reCaptcha. It needs to be turned off for zmNinja to work' + }); - ZMDataModel.isReCaptcha() - .then(function (result) { - if (result == true) { - $ionicLoading.hide(); - ZMDataModel.displayBanner('error', ['reCaptcha must be disabled', - ], "", 8000); - var alertPopup = $ionicPopup.alert({ - title: 'reCaptcha enabled', - template: 'Looks like you have enabled reCaptcha. It needs to be turned off for zmNinja to work' - }); - - - // close it after 5 seconds - $timeout(function () { - alertPopup.close(); - }, 5000); - - d.reject ("Error-disable recaptcha"); - return (d.promise); - } - - + // close it after 5 seconds + $timeout(function () { - }); + alertPopup.close(); + }, 5000); + d.reject ("Error-disable recaptcha"); + return (d.promise); + } - var loginData = ZMDataModel.getLogin(); - //ZMDataModel.zmDebug ("*** AUTH LOGIN URL IS " + loginData.url); - $http({ - method: 'POST', - //withCredentials: true, - url: loginData.url + '/index.php', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'application/json', - }, - transformRequest: function (obj) { - var str = []; - for (var p in obj) - str.push(encodeURIComponent(p) + "=" + - encodeURIComponent(obj[p])); - var params = str.join("&"); - return params; - }, - - data: { - username: loginData.username, - password: loginData.password, - action: "login", - view: "console" - } - }) - .success(function (data, status, headers) { - $ionicLoading.hide(); - // Coming here does not mean success - // it could also be a bad login, but - // ZM returns you to login.php and returns 200 OK - // so we will check if the data has - // <title>ZM - Login</title> -- it it does then its the login page + }); - if (data.indexOf(zm.loginScreenString) == -1) { - //eventServer.start(); - $rootScope.loggedIntoZm = 1; - ZMDataModel.zmLog("zmAutologin successfully logged into Zoneminder"); + var loginData = ZMDataModel.getLogin(); + //ZMDataModel.zmDebug ("*** AUTH LOGIN URL IS " + loginData.url); + $http({ + method: 'POST', + //withCredentials: true, + url: loginData.url + '/index.php', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + }, + transformRequest: function (obj) { + var str = []; + for (var p in obj) + str.push(encodeURIComponent(p) + "=" + + encodeURIComponent(obj[p])); + var params = str.join("&"); + return params; + }, - d.resolve("Login Success"); + data: { + username: loginData.username, + password: loginData.password, + action: "login", + view: "console" + } + }) + .success(function (data, status, headers) { + $ionicLoading.hide(); - $rootScope.$emit('auth-success', data); - - } else // this means login error - { - $rootScope.loggedIntoZm = -1; - //console.log("**** ZM Login FAILED"); - ZMDataModel.zmLog("zmAutologin Error: Bad Credentials ", "error"); - $rootScope.$emit('auth-error', "incorrect credentials"); + // Coming here does not mean success + // it could also be a bad login, but + // ZM returns you to login.php and returns 200 OK + // so we will check if the data has + // <title>ZM - Login</title> -- it it does then its the login page - d.reject("Login Error"); - return (d.promise); - } - // Now go ahead and re-get auth key - // if login was a success - $rootScope.authSession = "undefined"; - var ld = ZMDataModel.getLogin(); - ZMDataModel.getAuthKey($rootScope.validMonitorId) - .then(function (success) { + if (data.indexOf(zm.loginScreenString) == -1) { + //eventServer.start(); + $rootScope.loggedIntoZm = 1; - //console.log(success); - $rootScope.authSession = success; - ZMDataModel.zmLog("Stream authentication construction: " + - $rootScope.authSession); + ZMDataModel.zmLog("zmAutologin successfully logged into Zoneminder"); - }, - function (error) { - //console.log(error); + d.resolve("Login Success"); - ZMDataModel.zmLog("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession); - ZMDataModel.zmDebug("Error was: " + JSON.stringify(error)); - }); + $rootScope.$emit('auth-success', data); - return (d.promise); + } else // this means login error + { + $rootScope.loggedIntoZm = -1; + //console.log("**** ZM Login FAILED"); + ZMDataModel.zmLog("zmAutologin Error: Bad Credentials ", "error"); + $rootScope.$emit('auth-error', "incorrect credentials"); - }) - .error(function (error, status) { - $ionicLoading.hide(); - - //console.log("**** ZM Login FAILED"); - - // FIXME: Is this sometimes results in null - - ZMDataModel.zmLog("zmAutologin Error " + JSON.stringify(error) + " and status " + status); - // bad urls etc come here - $rootScope.loggedIntoZm = -1; - $rootScope.$emit('auth-error', error); + d.reject("Login Error"); + return (d.promise); + } - d.reject("Login Error"); - return d.promise; - }); - return d.promise; + // Now go ahead and re-get auth key + // if login was a success + $rootScope.authSession = "undefined"; + var ld = ZMDataModel.getLogin(); + ZMDataModel.getAuthKey($rootScope.validMonitorId) + .then(function (success) { + + //console.log(success); + $rootScope.authSession = success; + ZMDataModel.zmLog("Stream authentication construction: " + + $rootScope.authSession); + + }, + function (error) { + //console.log(error); + + ZMDataModel.zmLog("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession); + ZMDataModel.zmDebug("Error was: " + JSON.stringify(error)); + }); + + return (d.promise); + + }) + .error(function (error, status) { + $ionicLoading.hide(); + + //console.log("**** ZM Login FAILED"); + + // FIXME: Is this sometimes results in null + + ZMDataModel.zmLog("zmAutologin Error " + JSON.stringify(error) + " and status " + status); + // bad urls etc come here + $rootScope.loggedIntoZm = -1; + $rootScope.$emit('auth-error', error); + + d.reject("Login Error"); + return d.promise; + }); + return d.promise; + } + } diff --git a/www/templates/login.html b/www/templates/login.html index 8ba67e2d..6e9280cb 100644 --- a/www/templates/login.html +++ b/www/templates/login.html @@ -73,16 +73,19 @@ ng-model="loginData.apiurl"> </label> + <a class="item item-icon-right" href="" ng-click="selectFallback()"> + <i class="icon ion-ios-arrow-right"> + </i> + Fallback configuration<p>{{loginData.fallbackConfiguration}}</p> + </a> + <a class="item item-icon-right" href="" ng-click="eventServerSettings()"> <i class="icon ion-ios-arrow-right"> </i> - Event Server + Event Server </a> - - - <div ng-if="$root.platformOS != 'desktop'"> <label> |
