incremental
diff --git a/static/js/bmcApp.js b/static/js/bmcApp.js
new file mode 100644
index 0000000..dfd4d4b
--- /dev/null
+++ b/static/js/bmcApp.js
@@ -0,0 +1,313 @@
+'use strict';
+angular.module('Authentication', []);
+var app = angular.module('bmcApp', [
+ 'Authentication', 'ngCookies', 'ui.bootstrap', 'ui.router', 'restangular',
+ 'ngSanitize', 'ngWebSocket'
+]);
+
+
+app.controller('MainCtrl', function($scope, Restangular) {
+
+});
+
+app.run(['$rootScope', '$cookieStore', '$state', 'Restangular', 'AuthenticationService',
+ function($rootScope, $cookieStore, $state, Restangular, AuthenticationService) {
+ if ($rootScope.globals == undefined){
+ $rootScope.globals = {};
+ }
+
+ // keep user logged in after page refresh
+ AuthenticationService.RestoreCredientials();
+
+ $rootScope.$on(
+ '$stateChangeStart',
+ function(event, toState, toParams, fromState, fromParams, options) {
+ // redirect to login page if not logged in
+ if (toState.name !== 'login' && !$rootScope.globals.currentUser) {
+ // If logged out and transitioning to a logged in page:
+ event.preventDefault();
+ $state.go('login');
+ }
+ });
+
+ // RestangularProvider.setDefaultHttpFields({cache: true});
+ Restangular.setErrorInterceptor(function(response) {
+ if (response.status == 401) {
+ console.log("Login required... ");
+
+ var invalidate_reason = "Your user was logged out.";
+ var continue_promise_chain = false;
+
+ // if we're attempting to log in, we need to
+ // continue the promise chain to make sure the user is informed
+ if ($state.current.name === "login") {
+ invalidate_reason = "Your username and password was incorrect";
+ continue_promise_chain = true
+ } else {
+ $state.after_login_state = $state.current.name;
+ $state.go('login');
+ }
+ AuthenticationService.ClearCredentials(invalidate_reason);
+
+ return continue_promise_chain; // stop the promise chain
+ } else if (response.status == 404) {
+ console.log("Resource not available...");
+ } else {
+ console.log(
+ "Response received with HTTP error code: " + response.status);
+ }
+
+ });
+
+ }
+]);
+
+app.config(function(RestangularProvider) {
+ // set the base url for api calls on our RESTful services
+ var newBaseUrl = "";
+
+ var deployedAt = window.location.href.substring(0, window.location.href);
+ newBaseUrl = deployedAt + "/restui";
+
+ RestangularProvider.setBaseUrl(newBaseUrl);
+});
+
+app.config(function($stateProvider, $urlRouterProvider) {
+
+ $urlRouterProvider.otherwise('/systeminfo');
+
+ $stateProvider
+ // nested list with just some random string data
+ .state('login', {
+ url: '/login',
+ templateUrl: 'login.html',
+ controller: 'LoginController',
+ })
+ // systeminfo view ========================================
+ .state(
+ 'systeminfo',
+ {url: '/systeminfo', templateUrl: 'partial-systeminfo.html'})
+
+
+ // HOME STATES AND NESTED VIEWS ========================================
+ .state(
+ 'eventlog', {url: '/eventlog', templateUrl: 'partial-eventlog.html'})
+
+
+ .state(
+ 'kvm', {url: '/kvm', templateUrl: 'partial-kvm.html'})
+
+ // ABOUT PAGE AND MULTIPLE NAMED VIEWS =================================
+ .state('about', {url: '/about', templateUrl: 'partial-fruinfo.html'})
+
+ // nested list with custom controller
+ .state('about.list', {
+ url: '/list',
+ templateUrl: 'partial-home-list.html',
+ controller: function($scope) {
+ $scope.dogs = ['Bernese', 'Husky', 'Goldendoodle'];
+ }
+ })
+
+
+});
+
+app.controller('PaginationDemoCtrl', function($scope, $log) {
+ $scope.totalItems = 64;
+ $scope.currentPage = 4;
+
+ $scope.setPage = function(pageNo) { $scope.currentPage = pageNo; };
+
+ $scope.pageChanged = function() {
+ $log.log('Page changed to: ' + $scope.currentPage);
+ };
+
+ $scope.maxSize = 5;
+ $scope.bigTotalItems = 175;
+ $scope.bigCurrentPage = 1;
+});
+
+angular
+ .module('Authentication')
+
+ .controller('LoginController', [
+ '$scope', '$rootScope', '$location', '$state', 'AuthenticationService',
+ function($scope, $rootScope, $location, $state, AuthenticationService) {
+ $scope.logoutreason = AuthenticationService.logoutreason;
+
+ $scope.login = function() {
+ $scope.dataLoading = true;
+ AuthenticationService.Login(
+ $scope.username, $scope.password,
+ function(response) {
+ AuthenticationService.SetCredentials(
+ $scope.username, response.token);
+ if (typeof $state.after_login_state === "undefined") {
+ $state.after_login_state = "systeminfo";
+ }
+ $state.go($state.after_login_state);
+ delete $state.after_login_state;
+
+ },
+ function(response) {
+ if (response.status === 401) {
+ // reset login status
+ AuthenticationService.ClearCredentials(
+ "Username or Password is incorrect");
+ }
+ $scope.logoutreason = AuthenticationService.logoutreason;
+ $scope.error = response.message;
+ $scope.dataLoading = false;
+ });
+ };
+ }
+ ]);
+
+angular
+ .module('Authentication')
+
+ .factory(
+ 'AuthenticationService',
+ [
+ 'Restangular', '$cookieStore', '$rootScope', '$timeout',
+ function(Restangular, $cookieStore, $rootScope, $timeout) {
+ var service = {};
+
+ service.Login = function(
+ username, password, success_callback, fail_callback) {
+
+ var user = {"username": username, "password": password};
+ Restangular.all("login").post(user).then(
+ success_callback, fail_callback);
+ };
+
+ service.SetCredentials = function(username, token) {
+ $rootScope.globals["currentUser"] = {username: username, authdata: token};
+ Restangular.setDefaultHeaders(
+ {'Authorization': 'Token ' + token});
+ $cookieStore.put('globals', $rootScope.globals);
+ };
+
+ service.ClearCredentials = function(reason) {
+ $rootScope.globals["currentUser"] = null;
+ if (reason !== null) {
+ service.logoutreason = reason;
+ }
+ $cookieStore.remove('globals');
+ Restangular.setDefaultHeaders({});
+ };
+
+ service.RestoreCredientials = function() {
+ var globals = $cookieStore.get('globals') || {};
+ if (globals.currentUser) {
+ service.SetCredentials(
+ globals.currentUser.username, globals.currentUser.authdata);
+ }
+ };
+
+ service.logoutreason = "";
+ return service;
+ }
+ ])
+
+ .factory('Websocket_URI',
+ function($rootScope, $http) {
+ var loc = window.location, websocket_uri;
+ if (loc.protocol === "https:") {
+ websocket_uri = "wss:";
+ } else {
+ websocket_uri = "ws:";
+ }
+ websocket_uri += "//" + loc.hostname + ":9000";
+ // Append the authentication token
+ websocket_uri += "?token="
+ websocket_uri += $rootScope.globals["currentUser"]["authdata"]
+ var methods = {
+ uri: websocket_uri
+ }
+ return methods;
+ })
+ .factory('Base64', function() {
+ /* jshint ignore:start */
+
+ var keyStr =
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+ return {
+ encode: function(input) {
+ var output = "";
+ var chr1, chr2, chr3 = "";
+ var enc1, enc2, enc3, enc4 = "";
+ var i = 0;
+
+ do {
+ chr1 = input.charCodeAt(i++);
+ chr2 = input.charCodeAt(i++);
+ chr3 = input.charCodeAt(i++);
+
+ enc1 = chr1 >> 2;
+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+ enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+ enc4 = chr3 & 63;
+
+ if (isNaN(chr2)) {
+ enc3 = enc4 = 64;
+ } else if (isNaN(chr3)) {
+ enc4 = 64;
+ }
+
+ output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) +
+ keyStr.charAt(enc3) + keyStr.charAt(enc4);
+ chr1 = chr2 = chr3 = "";
+ enc1 = enc2 = enc3 = enc4 = "";
+ } while (i < input.length);
+
+ return output;
+ },
+
+ decode: function(input) {
+ var output = "";
+ var chr1, chr2, chr3 = "";
+ var enc1, enc2, enc3, enc4 = "";
+ var i = 0;
+
+ // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
+ var base64test = /[^A-Za-z0-9\+\/\=]/g;
+ if (base64test.exec(input)) {
+ window.alert(
+ "There were invalid base64 characters in the input text.\n" +
+ "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
+ "Expect errors in decoding.");
+ }
+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+
+ do {
+ enc1 = keyStr.indexOf(input.charAt(i++));
+ enc2 = keyStr.indexOf(input.charAt(i++));
+ enc3 = keyStr.indexOf(input.charAt(i++));
+ enc4 = keyStr.indexOf(input.charAt(i++));
+
+ chr1 = (enc1 << 2) | (enc2 >> 4);
+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+ chr3 = ((enc3 & 3) << 6) | enc4;
+
+ output = output + String.fromCharCode(chr1);
+
+ if (enc3 != 64) {
+ output = output + String.fromCharCode(chr2);
+ }
+ if (enc4 != 64) {
+ output = output + String.fromCharCode(chr3);
+ }
+
+ chr1 = chr2 = chr3 = "";
+ enc1 = enc2 = enc3 = enc4 = "";
+
+ } while (i < input.length);
+
+ return output;
+ }
+ };
+
+ /* jshint ignore:end */
+ });