CINXE.COM
aprsc status
<!DOCTYPE html> <html ng-app='aprsc'> <head> <title>aprsc status</title> <meta name="lang" content="en" /> <meta http-equiv="Content-Type" content="application/xhtml+xml;charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="/bootstrap.min.css"> <link rel="stylesheet" href="/ngDialog.min.css"> <link rel="stylesheet" href="/ngDialog-theme-plain.min.css"> <link rel="stylesheet" type="text/css" href="/aprsc.css" /> <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /> <link rel="shortcut" href="/favicon.ico" type="image/x-icon" /> <script src="angular.min.js"></script> <script src="angular-translate.min.js"></script> <script src="angular-translate-loader-url.min.js"></script> <script src="ngDialog.min.js"></script> </head> <body ng-controller="aprscc"> <div class='container-fluid'> <div class="row"> <div class="col-md-3 col-sm-4 pull-right"> <div class="sprite_logo" style="float:right;"></div> </div> <div class="col-md-4 col-sm-5 pull-right"> <div class="text-primary text-right" ng-cloak> <h4>{{ 'APRSC_STATUS_TITLE' | translate:status.server }}<br/> <span ng-show="status">{{ status.server.time_now | datetime }}</span> </h4> </div> </div> <div class="col-md-5 col-sm-12 pull-left" ng-if="uierror" ng-cloak> <h4 class="text-danger">{{ uierror }}</h4> </div> </div> <div class="row" ng-if="status.alarms" ng-cloak> <div class="col-md-12 col-sm-12" ng-repeat="alarm in status.alarms"> <h4 class="text-danger"><span class="glyphicon glyphicon-exclamation-sign"></span> {{ 'ALARM_' + alarm.err | translate }}</h4> </div> </div> <div ng-bind-html="motd" ng-if="motd"></div> <div class='row' ng-cloak> <div class='col-md-4 col-sm-12'> <h4>{{ 'SERVER_TITLE' | translate }}</h4> <div class='table-responsive'> <table class='table table-hover table-condensed'> <tr><td>{{ 'SERVER_SERVER_ID' | translate }}</td> <td class="ar">{{ status.server.server_id }}</td></tr> <tr><td>{{ 'SERVER_SERVER_ADMIN' | translate }}</td> <td class="ar">{{ status.server.admin }}</td></tr> <tr ng-show='options.showemail == 1'><td>{{ 'SERVER_SERVER_EMAIL' | translate }}</td> <td class="ar">{{ status.server.email }}</td></tr> <tr><td>{{ 'SERVER_SOFTWARE' | translate }}</td> <td class="ar">{{ status.server.software }} {{ status.server.software_version }}</td></tr> <tr><td>{{ 'SERVER_SOFTWARE_FEATURES' | translate }}</td> <td class="ar">{{ status.server.software_build_features }}</td></tr> <tr><td>{{ 'SERVER_UPTIME' | translate }}</td> <td class="ar">{{ status.server.uptime | duration }}</td></tr> <tr><td>{{ 'SERVER_STARTED' | translate }}</td> <td class="ar">{{ status.server.time_started | datetime }}</td></tr> <tr><td>{{ 'SERVER_OS' | translate }}</td> <td class="ar">{{ status.server.os }}</td></tr> </table> </div> </div> <div class='col-md-8 col-sm-12'> <div style='height: 230px;' id='graph'></div> <div style='padding: 5px 0 0 0;'> <button ng-click='graphZoom(1)' ng-hide='graph_zoomed'>Zoom</button> <button ng-click='graphZoom(0)' ng-hide='!graph_zoomed'>Zoom out</button><br /><br /> </div> </div> </div><!-- row --> <div class='row' ng-cloak> <div class='col-md-4 col-sm-6'> <h4>{{ 'TOTALS_TITLE' | translate }}</h4> <div class='table-responsive'> <table class='table table-hover table-condensed'> <tr ng-repeat='k in setup.keys_totals' ng-click='graphSwitch("totals", k)' ng-class='graphClass("totals", k)'> <td class='link'>{{ 'TOTALS_' + k | translate }}</td> <td>{{ status.totals[k] }}</td> <td ng-show="status_prev">{{ (status.totals[k] - status_prev.totals[k]) / status.tick_dif | ratestr}}/s</td> </tr> </table> </div> </div> <div class='col-md-5 col-sm-6'> <h4>{{ 'DUPES_TITLE' | translate }} <span class='link' id='dupecheck_more_show' ng-click='dupe_vars_visible = !(dupe_vars_visible)' ng-show='!(dupe_vars_visible)'> <img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAIAAADkharWAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wKHQcqC7wd4jIAAABtSURBVCjPY/z//z8DKYAJU+jFA4YbNxh+4NLxHxV8//7fX/4/O/v//e//YwVMDCQCkjUgnLS//7+4+H9+/v/8/P8ZGP4zMPxn54dyzeMRTmKB6/zwgOHlSxSzfn5k+AkJhheD2tMka2AkNWkAAOhriTYQTgMEAAAAAElFTkSuQmCC" /> </span> <span class='link' id='dupecheck_more_hide' ng-click='dupe_vars_visible = !(dupe_vars_visible)' ng-show='dupe_vars_visible'> <img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAIAAADkharWAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wKHQcqE69xemQAAABMSURBVCjPY/z//z8DKYCJgUQwqDUcmMAgIcEgIMAgIMDAyMjAyMjAIQDlWiQgNLDAWR8eMLx8iWLYz48MPxkYGBgYXrxACDKOxGAFAAP1ERwzsIoPAAAAAElFTkSuQmCC" /> </span></h4> <div class='table-responsive'> <table class='table table-hover table-condensed'> <tr ng-repeat='k in setup.keys_dupecheck' ng-click='graphSwitch("dupecheck", k)' ng-class='graphClass("dupecheck", k)'> <td class='link'>{{ 'DUPES_' + k | translate }}</td> <td>{{ status.dupecheck[k] }}</td> <td ng-show="status_prev">{{ (status.dupecheck[k] - status_prev.dupecheck[k]) / status.tick_dif | ratestr}}/s</td> </tr> </table> </div> <div class='table-responsive' ng-show='dupe_vars_visible'> <table class='table table-hover table-condensed'> <tr ng-repeat="k in setup.keys_dupecheck_variations"> <td>{{ 'DUPES_' + k | translate }}</td> <td>{{ status.dupecheck.variations[k] }}</td> <td ng-show="status_prev">{{ (status.dupecheck.variations[k] - status_prev.dupecheck.variations[k]) / status.tick_dif | ratestr}}/s</td> </tr> </table> </div> </div> </div><!-- row --> <div class='row' ng-cloak> <div class='col-md-12 col-sm-12'> <h4>{{ 'LISTENERS_TITLE' | translate }}</h4> <div class='table-responsive' ng-show='status'> <table class='table table-hover table-condensed table-striped'> <tr><th ng-repeat="k in setup.cols_listener">{{ 'TH_' + k | translate }}</th></tr> <tr ng-repeat="l in status.listeners"> <td>{{ l.proto }}</td> <td>{{ l.addr }}</td> <td>{{ l.name }}</td> <td>{{ l.clients }}</td> <td>{{ l.clients_peak }}</td> <td>{{ l.clients_max }}</td> <td>{{ l.connects }}</td> <td><span ng-show='status.tick_dif'>{{ (l.connects - status_prev.listeners_id[l.id].connects) / status.tick_dif | ratestr }}</span></td> <td>{{ l.pkts_tx }}</td> <td ng-class='pkts_rx_class(l)' ng-click='pkts_rx_dialog(l)'>{{ l.pkts_rx }}/{{ l.pkts_dup }}/{{ l.pkts_ign }}</td> <td>{{ l.bytes_tx }}</td> <td>{{ l.bytes_rx }}</td> <td><span ng-show='status.tick_dif'>{{ (l.bytes_tx - status_prev.listeners_id[l.id].bytes_tx) / status.tick_dif | ratestr }} / {{ (l.bytes_rx - status_prev.listeners_id[l.id].bytes_rx) / status.tick_dif | ratestr }}</span></td> </tr> </table> </div> </div> </div><!-- row --> <div class='row' ng-cloak ng-show='status.uplinks.length > 0'> <div class='col-md-12 col-sm-12'> <h4>{{ 'UPLINKS_TITLE' | translate }}</h4> <div class='table-responsive' ng-show='status.uplinks'> <table class='table table-hover table-condensed table-striped'> <tr> <th ng-repeat="k in setup.cols_uplinks">{{ 'TH_' + k | translate }}</th> </tr> <tr ng-repeat="c in status.uplinks"> <td class='username'>{{ c.username }}</td> <td><a ng-href="{{ server_status_href(c) }}">{{ c.addr_rem }}</a></td> <td>{{ c.mode }} <span ng-show="c.proto == 'sctp'">SCTP</span></td> <td>{{ c.t_connect | datetime }}</td> <td>{{ c.since_connect | duration }}</td> <td>{{ c.since_last_read | duration }}</td> <td>{{ c.app_name }} {{ c.app_version }}</td> <td>{{ c.pkts_tx }}</td> <td ng-class='pkts_rx_class(c)' ng-click='pkts_rx_dialog(c)'>{{ c.pkts_rx }}/{{ c.pkts_dup }}/{{ c.pkts_ign }}</td> <td>{{ c.bytes_tx }}</td> <td>{{ c.bytes_rx }}</td> <td><span ng-show='status.tick_dif'>{{ (c.bytes_tx - status_prev.uplinks_id[c.id].bytes_tx) / status.tick_dif | ratestr }} / {{ (c.bytes_rx - status_prev.uplinks_id[c.id].bytes_rx) / status.tick_dif | ratestr }}</span></td> <td>{{ c.obuf_q }}</td> </tr> </table> </div> </div> </div><!-- row --> <div class='row' ng-cloak ng-show='status.peers.length > 0'> <div class='col-md-12 col-sm-12'> <h4>{{ 'PEERS_TITLE' | translate }}</h4> <div class='table-responsive'> <table class='table table-hover table-condensed table-striped'> <tr> <th ng-repeat="k in setup.cols_peers" ng-click="changeSorting(peers_sort, k)">{{ 'TH_' + k | translate }} <span ng-class="sortIndicator(peers_sort, k)"></span></th> </tr> <tr ng-repeat="c in status.peers | orderBy : peers_sort.column : peers_sort.descending"> <td class='username'>{{ c.username }}</td> <td><a ng-href="{{ server_status_href(c) }}">{{ c.addr_rem }}</a></td> <td>{{ c.since_last_read | duration }}</td> <td>{{ c.pkts_tx }}</td> <td ng-class='pkts_rx_class(c)' ng-click='pkts_rx_dialog(c)'>{{ c.pkts_rx }}/{{ c.pkts_dup }}/{{ c.pkts_ign }}</td> <td>{{ c.bytes_tx }}</td> <td>{{ c.bytes_rx }}</td> <td><span ng-show='status.tick_dif'>{{ (c.bytes_tx - status_prev.peers_id[c.id].bytes_tx) / status.tick_dif | ratestr }} / {{ (c.bytes_rx - status_prev.peers_id[c.id].bytes_rx) / status.tick_dif | ratestr }}</span></td> <td>{{ c.obuf_q }}</td> </tr> </table> </div> </div> </div><!-- row --> <div class='row' ng-cloak> <div class='col-md-12 col-sm-12'> <h4>{{ 'CLIENTS_TITLE' | translate }}</h4> <div class='table-responsive' ng-show='status'> <table class='table table-hover table-condensed table-striped'> <tr> <th ng-repeat="k in setup.cols_clients" ng-click="changeSorting(clients_sort, k)">{{ 'TH_' + k | translate }} <span ng-class="sortIndicator(clients_sort, k)"></span></th> </tr> <tr ng-repeat="c in status.clients | orderBy : clients_sort.column : clients_sort.descending"> <td>{{ c.addr_loc | onlyport }}</td> <td class='username'><a href="http://aprs.fi/?call={{ c.username }}" target="_blank">{{ c.username }}</a></td> <td><a ng-show="linkable(c)" ng-href="{{ server_status_href(c) }}">{{ c.addr_rem }}</a> <span ng-show="!linkable(c)">{{ c.addr_rem }}</span> <span ng-show="c.udp_downstream">+UDP</span> <span ng-show="c.proto == 'sctp'">SCTP</span> </td> <td><span ng-show='c.verified == 0' class='red'>No</span> <span ng-show='c.verified == 1'>Yes</span> <span ng-show='c.verified == 3' class='link' ng-click='client_cert_dialog(c)'>Cert</span> </td> <td>{{ c.since_connect | duration }}</td> <td>{{ c.since_last_read | duration }}</td> <td>{{ c.app_name }} {{ c.app_version }}</td> <td>{{ c.pkts_tx }}</td> <td ng-class='pkts_rx_class(c)' ng-click='pkts_rx_dialog(c)'>{{ c.pkts_rx }}/{{ c.pkts_dup }}/{{ c.pkts_ign }}</td> <td>{{ c.bytes_tx }}</td> <td>{{ c.bytes_rx }}</td> <td><span ng-show='status.tick_dif'>{{ (c.bytes_tx - status_prev.clients_id[c.id].bytes_tx) / status.tick_dif | ratestr }} / {{ (c.bytes_rx - status_prev.clients_id[c.id].bytes_rx) / status.tick_dif | ratestr }}</span></td> <td>{{ c.obuf_q }}</td> <td>{{ c.heard_count }}</td> <td>{{ c.filter }}</td> </tr> </table> </div> </div> </div><!-- row --> <div class='row' ng-cloak> <div class='col-md-9 col-sm-12'> <h4>{{ 'MEM_TITLE' | translate }}</h4> <div class='table-responsive'> <table class='table table-hover table-condensed'> <tr> <th>{{ 'MEM_TH_TYPE' | translate }}</th> <th>{{ 'MEM_TH_cell_size' | translate }}</th> <th>{{ 'MEM_TH_cells_used' | translate }}</th> <th>{{ 'MEM_TH_cells_free' | translate }}</th> <th>{{ 'MEM_TH_used_bytes' | translate }}</th> <th>{{ 'MEM_TH_allocated_bytes' | translate }}</th> <th>{{ 'MEM_TH_blocks' | translate }}</th> </tr> <tr ng-repeat='(k, v) in setup.rows_mem'> <td>{{ v }}</td> <td>{{ status.memory[k + '_cell_size'] }}</td> <td>{{ status.memory[k + '_cells_used'] }}</td> <td>{{ status.memory[k + '_cells_free'] }}</td> <td>{{ status.memory[k + '_used_bytes'] }}</td> <td>{{ status.memory[k + '_allocated_bytes'] }}</td> <td>{{ status.memory[k + '_blocks'] }}/{{ status.memory[k + '_blocks_max'] }}</td> </tr> </table> </div> </div> </div><!-- row --> </div><!-- container --> <script type="text/ng-template" id="pkts_rx_dialog"> <p><strong>{{'RXERR_DIALOG_TITLE' | translate:sel_c }}</strong></p> <p>{{'RXERR_DIALOG_MESSAGE' | translate:sel_c }}</p> <p> <span ng-repeat='i in sel_c.rx_errs track by $index' ng-show='i > 0'>{{ 'RXERR_' + status.rx_errs[$index] | translate }}: {{ i }}<br></span> </p> </script> <script type="text/ng-template" id="client_cert_dialog"> <p><strong>{{ 'CERT_DIALOG_TITLE' | translate:sel_c }}</strong></p> <p> <strong>{{ 'CERT_SUBJECT' | translate }}</strong><br> {{ sel_c.cert_subject }} </p> <p> <strong>{{ 'CERT_ISSUER' | translate }}</strong><br> {{ sel_c.cert_issuer }} </p> </script> <script type='text/JavaScript' src='jquery.min.js'></script> <script type='text/JavaScript' src='jquery.flot.min.js'></script> <script type='text/JavaScript' src='jquery.flot.time.min.js'></script> <script type='text/JavaScript' src='jquery.flot.selection.min.js'></script> <script type='text/JavaScript' src='jquery.flot.resize.min.js'></script> <script type='text/JavaScript' src='aprsc-graph.js'></script> <script type='text/JavaScript' src='aprsc.js'></script> </body> </html>