2 <html xmlns:ng="http://angularjs.org">
3 <script src="http://code.angularjs.org/angular-0.9.17.min.js" ng:autobind></script>
6 function user($xhr,$resource,$log) {
11 self.r.CRM_search = $resource('/g/CRM_search/:username', {username:'@search_username'});
12 self.CRM_search = function(username) {
13 if ( ! username ) username = self.search_username;
14 $log.info( 'CRM_search', username );
16 self.message.CRM = 'search for '+username;
17 self.r.CRM_search.query({username: username}, function(CRM) {
19 $log.info( 'CRM', CRM )
21 self.message.CRM = 'no results';
24 self.message.CRM = null;
25 if ( CRM.length == 1 ) {
26 self.selected_username = CRM[0].USERNAME;
27 $log.info( 'auto-selected ', self.selected_username );
32 self.r.LDAP_search = $resource('/g/LDAP_search/:username', {username:'@selected_username'});
33 self.LDAP_search = function(username) {
34 if ( self.selected_username == username ) {
35 $log.error("LDAP_search - not changed", username);
39 if ( ! username ) username = self.selected_username;
42 self.message.LDAP = 'no username';
45 $log.info( 'LDAP_search', username );
47 self.selected_username = username;
48 self.message.LDAP = 'search '+username;
49 self.r.LDAP_search.query({ username: username }, function(LDAP) {
51 $log.info( 'LDAP', LDAP );
52 if ( self.LDAP.length == 0 ) {
53 self.message.LDAP ='no results for '+username;
56 self.cpe.parser = LDAP[0]._cpe_parser;
57 self.cpe.table_name = 'cpe_' + LDAP[0]._cpe_parser;
58 self.username = LDAP[0].cn;
59 self.message.LDAP = null;
60 $log.info( 'cpe', self.cpe );
63 self.$watch('selected_username', self.LDAP_search );
65 self.gnuplot_changed = function() {
66 var h_cols = self.gnuplot.cols;
67 $log.info( 'gnuplot_changed', h_cols );
68 if ( ! h_cols || h_cols.length < 1) {
69 $log.warn("no columns for gnuplot");
73 var cols = [ 'timestamp' ];
74 for ( var i = 0; i < h_cols.length; i++ ) {
75 cols.push( 'h->\'' + h_cols[i] + '\' as "' + h_cols[i] + '"' );
77 self.gnuplot.sql = 'select ' + cols.join(',') + ' from cpe_' + self.cpe.parser + ' where username = \'' + self.username + '\' order by timestamp desc limit 100';
78 $log.info( 'gnuplot', cols, self.gnuplot );
80 self.gnuplot_refresh = function() {
81 if ( ! self.gnuplot || ! self.gnuplot.cols || ! self.gnuplot.sql) return;
82 self.message.gnuplot = self.gnuplot.cols.join(' ');
83 self.gnuplot.img = '/gnuplot?hide=1;with='+self.gnuplot.with+';sql=' + self.gnuplot.sql;
84 $log.info('gnuplot_refresh', self.gnuplot.img);
86 self.$watch('gnuplot.sql', self.gnuplot_refresh );
87 self.$watch('gnuplot.with', self.gnuplot_refresh );
89 self.gnuplot_onload = function() {
90 $log.info( 'gnuplot_onload' );
91 self.message.gnuplot = '<a href="#gnuplot">ready</a>';
94 self.r.table = $resource('/table/:table');
95 self.table_update = function () {
96 if ( ! self.username || ! self.cpe.table_name ) return;
98 self.message.ping = self.username+' loading';
99 self.r.table.get({ username: self.username, table: 'ping', limit: 1 }, function(ping) {
100 $log.info('ping', ping);
101 self.message.ping = null;
103 for(var i = 0; i <= ping.columns.length; i++) {
104 hash[ping.columns[i]] = ping.rows[0][i];
106 self.cpe.ping = hash;
107 $log.info('ping hash', hash);
110 self.message.table = self.username + ' loading from ' + self.cpe.table_name;
111 self.r.table.get({ username: self.username, table: self.cpe.table_name, limit: self.cpe_limit }, function(table) {
112 $log.info( 'table', table );
113 self.cpe.table = table;
114 self.message.table = null;
115 if ( table.rows.length == 0 ) {
116 self.message.table = 'no results for '+self.username;
120 if ( h_cols = self.cpe_hash[self.cpe.parser] ) {
121 self.gnuplot.cols = h_cols;
122 self.gnuplot_changed();
124 self.message.gnuplot = 'no graph for ' + self.cpe.parser;
128 self.$watch('username', self.table_update );
130 this.clear = function() {
136 this.clear_LDAP = function() {
137 $log.info('clear_LDAP');
139 self.selected_username = null;
140 self.gnuplot = { 'with': 'points', cols: [] };
147 self.$watch('selected_username', function() {
148 if ( self.selected_username == null ) self.clear_LDAP();
152 self.$watch('cpe_limit', function() {
153 $log.info( 'cpe_limit', self.cpe_limit );
168 'Davolink': [ 'Max_down', 'Max_up' ],
169 'EasyGateway': [ 'upstreamCurrRate', 'upstreamMaxRate', 'upstreamNoiseMargin' ],
172 this.keys = function(h) {
173 if ( angular.isArray(h) ) h = h[0];
175 for(i in h) if (h.hasOwnProperty(i))
184 user.$inject = ['$xhr','$resource','$log'];
186 // http://jsfiddle.net/gronky/cLEck/
187 angular.formatter('include', {
188 parse: function(apply, value, list) {
189 angular.Array[apply ? 'add' : 'remove'](list, value);
192 format: function(apply, value, list) {
193 return angular.Array.indexOf(list, value) != -1;
199 <style type="text/css">
202 border-collapse:collapse;
206 border-bottom: 2px solid gray;
210 border-left: 1em solid white;
211 border-right: 1em solid white;
238 .panel_right ul > li {
239 list-style-type: none;
242 .panel_right > label {
252 <div ng:controller="user">
254 <form ng:submit="CRM_search()">
255 <label for="args">username:
256 <input type="text" name="search_username" placeholder="test" size="10" autofocus ng:required />
258 <input type="submit" value="search in CRM">
259 <input type="reset" ng:click="clear()" value="clear">
261 <span id="message" ng:show="message.$size()" ng:click="message={}" title="click to close">
262 <div ng:repeat="(category,status) in message" ng:show="status"><b>{{category}}</b> {{status}}</div>
268 <div class="panel_right" ng:show="CRM">
271 <input type=checkbox name=show_columns>
273 <ul ng:show="show_columns">
274 <li ng:repeat="c in keys(CRM)" ng:show="columns.indexOf(c) < 0" ng:click="columns.push(c)">{{c}}
278 <table ng:show="CRM">
280 <th ng:repeat="c in columns" ng:click="columns.$remove(c)">{{c}}</th>
282 <tr ng:repeat="u in CRM" ng:click="LDAP_search(u.USERNAME)" ng:class-even="'zebra'">
283 <td ng:repeat="c in columns" ng:show="! selected_username || selected_username == u.USERNAME">{{u[c]}}</td>
287 <input type=button value="Show ALL results, not just {{selected_username}}" ng:click="selected_username=''" ng:show="selected_username">
289 <div ng:show="selected_username">
291 <h2><tt>{{selected_username}}</tt> LDAP entry</h2>
294 <li ng:repeat="c in keys(LDAP)"><tt>{{c}}</tt> {{LDAP[0][c]}}</li>
297 <div ng:show="cpe.ping">
298 ping <tt>{{cpe.ping.ip}}</tt> rtt <tt>{{cpe.ping.rtt}}</tt> at <tt>{{cpe.ping.timestamp}}</tt>
301 <h2 ng:show="cpe.table_name">{{cpe.table_name}} {{username}}</h2>
303 <table ng:show="cpe.table">
305 <th ng:repeat="c in cpe.table.columns">{{c}}</th>
307 <tr ng:repeat="r in cpe.table.rows" ng:class-even="'zebra'">
308 <td ng:repeat="v in r">{{v}}</td>
311 <td colspan="{{cpe.table.columns.length}}">
313 <label>1<input name="cpe_limit" type="radio" value=1></label>
314 · · ·
315 <label>5<input name="cpe_limit" type="radio" value=5></label>
316 · · ·
317 <label>10<input name="cpe_limit" type="radio" value=10></label>
322 <div class="panel_right" ng:show="cpe.table">
325 <input type=checkbox name=show_gnuplot_cols>
328 <ul ng:show="show_gnuplot_cols">
329 with <select name="gnuplot.with">
330 <option ng:repeat="with in ['points','dots','steps','lines']">{{with}}</option>
333 <li ng:repeat="(k,v) in cpe.table.rows[0][cpe.table.hash_col]">
335 <input type="checkbox" name="checked_cols" ng:format="include:k:gnuplot.cols" ng:click="gnuplot_changed()">
343 <ng:include src="gnuplot.img" ng:show="gnuplot.img" onload="message.gnuplot = gnuplot_onload" ></ng:include>
347 <input type=checkbox name=debug value=1>