1/** 2 * Controller for SNMP 3 * 4 * @module app/configuration 5 * @exports snmpController 6 * @name snmpController 7 */ 8 9window.angular && (function(angular) { 10 'use strict'; 11 12 angular.module('app.configuration').controller('snmpController', [ 13 '$scope', '$window', 'APIUtils', '$route', '$q', 'ngToast', 14 function($scope, $window, APIUtils, $route, $q, ngToast) { 15 $scope.managers = []; 16 $scope.loading = true; 17 $scope.managersToDelete = []; 18 19 var getSNMPManagers = APIUtils.getSNMPManagers().then( 20 function(data) { 21 // Convert to array of objects from an object of objects, easier 22 // to manipulate (e.g. add/remove). Convert key to a path property. 23 for (var key in data.data) { 24 $scope.managers.push({ 25 path: key, 26 port: data.data[key].Port, 27 updatePort: false, 28 address: data.data[key].Address, 29 updateAddress: false 30 }) 31 } 32 }, 33 function(error) { 34 ngToast.danger('Unable to load SNMP settings.'); 35 console.log(JSON.stringify(error)); 36 }); 37 38 getSNMPManagers.finally(function() { 39 $scope.loading = false; 40 }); 41 42 $scope.addNewSNMPManager = function() { 43 $scope.managers.push({address: '', port: ''}); 44 }; 45 46 $scope.removeSNMPManager = function(index) { 47 // If the SNMP Manager has a path it exists on the backend and we 48 // need to make a call to remove it 49 if ($scope.managers[index].path) { 50 $scope.managersToDelete.push($scope.managers[index].path); 51 } 52 $scope.managers.splice(index, 1); 53 }; 54 55 $scope.refresh = function() { 56 $route.reload(); 57 }; 58 59 $scope.setSNMP = function() { 60 $scope.loading = true; 61 var promises = []; 62 63 // Interate in reverse so can splice 64 // https://stackoverflow.com/questions/9882284/looping-through-array-and-removing-items-without-breaking-for-loop 65 var i = $scope.managers.length; 66 while (i--) { 67 // Remove any SNMP Manager with an empty address and port 68 if (!$scope.managers[i].address && !$scope.managers[i].port) { 69 $scope.removeSNMPManager(i); 70 continue; 71 } 72 73 // Throw an error if only 1 of the fields is filled out 74 if (!$scope.managers[i].address || !$scope.managers[i].port) { 75 // TODO: Highlight the field that is empty 76 $scope.loading = false; 77 ngToast.danger('All fields are required.'); 78 return; 79 } 80 81 // If the manager does not have a 'path', it is a new manager 82 // and needs to be created 83 if (!$scope.managers[i].path) { 84 promises.push(addManager( 85 $scope.managers[i].address, $scope.managers[i].port)); 86 } else { 87 if ($scope.managers[i].updateAddress) { 88 promises.push(setManagerAddress( 89 $scope.managers[i].path, $scope.managers[i].address)); 90 } 91 if ($scope.managers[i].updatePort) { 92 promises.push(setManagerPort( 93 $scope.managers[i].path, $scope.managers[i].port)); 94 } 95 } 96 } 97 98 // Add delete promises last since we might be adding to 99 // managersToDelete above 100 for (var i in $scope.managersToDelete) { 101 promises.push(deleteManager($scope.managersToDelete[i])); 102 } 103 104 $q.all(promises) 105 .then( 106 function() { 107 ngToast.success('SNMP Managers set.'); 108 }, 109 function(errors) { 110 ngToast.danger('Unable to set SNMP Managers.'); 111 console.log(JSON.stringify(errors)); 112 }) 113 .finally(function() { 114 $scope.loading = false; 115 }); 116 }; 117 118 function addManager(address, port) { 119 return APIUtils.addSNMPManager(address, port); 120 } 121 122 function deleteManager(path) { 123 return APIUtils.deleteObject(path); 124 } 125 126 function setManagerAddress(path, address) { 127 return APIUtils.setSNMPManagerAddress(path, address); 128 } 129 130 function setManagerPort(path, port) { 131 return APIUtils.setSNMPManagerPort(path, port); 132 } 133 } 134 ]); 135})(angular); 136