feature: FreeRADIUS application monitoring (#7818)

* Update unbound.inc.php

* Update unbound.inc.php

* Create unbound_cache.inc.php

* Update AUTHORS.md

* Update apps.inc.php

* Update bind.inc.php

* Update bind.inc.php

* Update bind.inc.php

* Update bind.inc.php

* Update tiles.php

* Update Applications.md

* Update Applications.md

* Update Applications.md

* Update Applications.md

* Update Applications.md

* Update Applications.md

* Update apps.inc.php

* Create freeradius_access.inc.php

* Update functions.inc.php

* Create freeradius_auth.inc.php

* Create freeradius_accounting.inc.php

* Create freeradius_proxy_access.inc.php

* Create freeradius_proxy_auth.inc.php

* Create freeradius_proxy_acct.inc.php

* Create freeradius_queue.inc.php

* Update and rename freeradius_accounting.inc.php to freeradius_acct.inc.php

* Update apps.inc.php

* Create freeradius.inc.php

* Create freeradius.inc.php

* Update freeradius.inc.php

* Update freeradius.inc.php

* Update freeradius.inc.php

* Update freeradius.inc.php

* Update freeradius.inc.php

* Update Applications.md

* Update Applications.md

* Update freeradius_access.inc.php

* Update freeradius_acct.inc.php

* Update freeradius_access.inc.php

* Update freeradius_auth.inc.php

* Update freeradius_access.inc.php

* Update freeradius_acct.inc.php

* Update freeradius_proxy_access.inc.php

* Update freeradius_proxy_acct.inc.php

* Update freeradius_proxy_auth.inc.php

* Update freeradius_queue.inc.php

* Update freeradius_queue.inc.php

* Update freeradius.inc.php

* Update freeradius.inc.php

* Update freeradius.inc.php

* Update freeradius_acct.inc.php

* Update freeradius_acct.inc.php

* Update freeradius_access.inc.php

* Update freeradius_access.inc.php

* Update freeradius_auth.inc.php

* Update freeradius_proxy_access.inc.php

* Update freeradius_proxy_acct.inc.php

* Update freeradius_proxy_auth.inc.php

* Update freeradius_queue.inc.php
This commit is contained in:
Slashdoom
2017-12-13 16:13:24 +13:00
committed by Tony Murray
parent 58afe78ce4
commit 712201e691
12 changed files with 467 additions and 14 deletions

View File

@@ -13,6 +13,7 @@ Different applications support a variety of ways to collect data: by direct conn
1. [Fail2ban](#fail2ban) - SNMP extend
1. [FreeBSD NFS Client](#freebsd-nfs-client) - SNMP extend
1. [FreeBSD NFS Server](#freebsd-nfs-server) - SNMP extend
1. [FreeRADIUS](#freeradius) - SNMP extend, Agent
1. [Freeswitch](#freeswitch) - SNMP extend, Agent
1. [GPSD](#gpsd) - Agent
1. [Mailscanner](#mailscanner) - SNMP extend
@@ -258,32 +259,53 @@ extend fbsdnfsserver /etc/snmp/fbsdnfsserver
4: Restart snmpd on your host
### Mailscanner
### FreeRADIUS
The FreeRADIUS application extension requires that status_server be enabled in your FreeRADIUS config. For more information see: https://wiki.freeradius.org/config/Status
You should note that status requests increment the FreeRADIUS request stats. So LibreNMS polls will ultimately be reflected in your stats/charts.
1: Go to your FreeRADIUS configuration directory (usually /etc/raddb or /etc/freeradius).
2: `cd sites-enabled`
3: `ln -s ../sites-available/status status`
4: Restart FreeRADIUS.
5: You should be able to test with the radclient as follows...
```
echo "Message-Authenticator = 0x00, FreeRADIUS-Statistics-Type = 31, Response-Packet-Type = Access-Accept" | \
radclient -x localhost:18121 status adminsecret
```
Note that adminsecret is the default secret key in status_server. Change if you've modified this.
##### SNMP Extend
1. Download the script onto the desired host (the host must be added to LibreNMS devices)
1: Copy the freeradius shell script, to the desired host (the host must be added to LibreNMS devices)
```
wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mailscanner.php -O /etc/snmp/mailscanner.php
wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/freeradius.sh -O /etc/snmp/freeradius.sh
```
2. Make the script executable (chmod +x /etc/snmp/mailscanner.php)
2: Make the script executable (chmod +x /etc/snmp/freeradius.sh)
3. Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add:
3: If you've made any changes to the FreeRADIUS status_server config (secret key, port, etc.) edit freeradius.sh and adjust the config variable accordingly.
4: Edit your snmpd.conf file and add:
```
extend mailscanner /etc/snmp/mailscanner.php
extend freeradius /etc/snmp/freeradius.sh
```
4. Restart snmpd on your host
### GPSD
A small shell script that reports GPSD status.
5: Restart snmpd on the host in question.
##### Agent
[Install the agent](Agent-Setup.md) on this device if it isn't already and copy the `gpsd` script to `/usr/lib/check_mk_agent/local/`
You may need to configure `$server` or `$port`.
1: [Install the agent](Agent-Setup.md) on this device if it isn't already and copy the script to `/usr/lib/check_mk_agent/local/freeradius.sh` via `wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/freeradius.sh -O /usr/lib/check_mk_agent/local/freeradius.sh`
Verify it is working by running `/usr/lib/check_mk_agent/local/gpsd`
2: Run `chmod +x /usr/lib/check_mk_agent/local/freeradius.sh`
3: If you've made any changes to the FreeRADIUS status_server config (secret key, port, etc.) edit freeradius.sh and adjust the config variable accordingly.
4: Edit the freeradius.sh script and set the variable 'AGENT' to '1' in the config.
### Freeswitch
@@ -315,6 +337,34 @@ extend freeswitch /etc/snmp/freeswitch
6. Restart snmpd on your host
### GPSD
A small shell script that reports GPSD status.
##### Agent
[Install the agent](Agent-Setup.md) on this device if it isn't already and copy the `gpsd` script to `/usr/lib/check_mk_agent/local/`
You may need to configure `$server` or `$port`.
Verify it is working by running `/usr/lib/check_mk_agent/local/gpsd`
### Mailscanner
##### SNMP Extend
1. Download the script onto the desired host (the host must be added to LibreNMS devices)
```
wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mailscanner.php -O /etc/snmp/mailscanner.php
```
2. Make the script executable (chmod +x /etc/snmp/mailscanner.php)
3. Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add:
```
extend mailscanner /etc/snmp/mailscanner.php
```
4. Restart snmpd on your host
### Memcached
##### SNMP Extend
1. Copy the [memcached script](https://github.com/librenms/librenms-agent/blob/master/agent-local/memcached) to `/etc/snmp/` on your remote server.

View File

@@ -125,6 +125,9 @@ function nicecase($item)
case 'pi-hole':
return 'Pi-hole';
case 'freeradius':
return 'FreeRADIUS';
default:
return ucfirst($item);

View File

@@ -0,0 +1,26 @@
<?php
require 'includes/graphs/common.inc.php';
$i = 0;
$scale_min = 0;
$nototal = 1;
$unit_text = 'Per Sec.';
$rrd_filename = rrd_name($device['hostname'], array('app', 'freeradius-access', $app['app_id']));
$fr_access_array = array(
'requests' => 'Requests',
'accepts' => 'Accepts',
'rejects'=> 'Rejects',
'challenges' => 'Challenges'
);
$colours = 'mixed';
$rrd_list = array();
if (rrdtool_check_rrd_exists($rrd_filename)) {
foreach ($fr_access_array as $ds => $descr) {
$rrd_list[$i]['filename'] = $rrd_filename;
$rrd_list[$i]['descr'] = $descr;
$rrd_list[$i]['ds'] = $ds;
$i++;
}
} else {
echo "file missing: $rrd_filename";
}
require 'includes/graphs/generic_multi_line.inc.php';

View File

@@ -0,0 +1,29 @@
<?php
require 'includes/graphs/common.inc.php';
$i = 0;
$scale_min = 0;
$nototal = 1;
$unit_text = 'Per Sec.';
$rrd_filename = rrd_name($device['hostname'], array('app', 'freeradius-acct', $app['app_id']));
$fr_acct_array = array(
'requests' => 'Requests',
'responses' => 'Responses',
'duplicate_requests' => 'Duplicate Requests',
'malformed_requests' => 'Malformed Requests',
'invalid_requests' => 'Invalid Requests',
'dropped_requests' => 'Dropped Requests',
'unknown_types' => 'Unknown Types'
);
$colours = 'mixed';
$rrd_list = array();
if (rrdtool_check_rrd_exists($rrd_filename)) {
foreach ($fr_acct_array as $ds => $descr) {
$rrd_list[$i]['filename'] = $rrd_filename;
$rrd_list[$i]['descr'] = $descr;
$rrd_list[$i]['ds'] = $ds;
$i++;
}
} else {
echo "file missing: $rrd_filename";
}
require 'includes/graphs/generic_multi_line.inc.php';

View File

@@ -0,0 +1,28 @@
<?php
require 'includes/graphs/common.inc.php';
$i = 0;
$scale_min = 0;
$nototal = 1;
$unit_text = 'Per Sec.';
$rrd_filename = rrd_name($device['hostname'], array('app', 'freeradius-auth', $app['app_id']));
$fr_auth_array = array(
'responses' => 'Responses',
'duplicate_requests' => 'Duplicate Requests',
'malformed_requests' => 'Malformed Requests',
'invalid_requests' => 'Invalid Requests',
'dropped_requests' => 'Dropped Requests',
'unknown_types' => 'Unknown Types'
);
$colours = 'mixed';
$rrd_list = array();
if (rrdtool_check_rrd_exists($rrd_filename)) {
foreach ($fr_auth_array as $ds => $descr) {
$rrd_list[$i]['filename'] = $rrd_filename;
$rrd_list[$i]['descr'] = $descr;
$rrd_list[$i]['ds'] = $ds;
$i++;
}
} else {
echo "file missing: $rrd_filename";
}
require 'includes/graphs/generic_multi_line.inc.php';

View File

@@ -0,0 +1,26 @@
<?php
require 'includes/graphs/common.inc.php';
$i = 0;
$scale_min = 0;
$nototal = 1;
$unit_text = 'Per Sec.';
$rrd_filename = rrd_name($device['hostname'], array('app', 'freeradius-proxy_access', $app['app_id']));
$fr_proxy_access_array = array(
'requests' => 'Requests',
'accepts' => 'Accepts',
'rejects'=> 'Rejects',
'challenges' => 'Challenges'
);
$colours = 'mixed';
$rrd_list = array();
if (rrdtool_check_rrd_exists($rrd_filename)) {
foreach ($fr_proxy_access_array as $ds => $descr) {
$rrd_list[$i]['filename'] = $rrd_filename;
$rrd_list[$i]['descr'] = $descr;
$rrd_list[$i]['ds'] = $ds;
$i++;
}
} else {
echo "file missing: $rrd_filename";
}
require 'includes/graphs/generic_multi_line.inc.php';

View File

@@ -0,0 +1,29 @@
<?php
require 'includes/graphs/common.inc.php';
$i = 0;
$scale_min = 0;
$nototal = 1;
$unit_text = 'Per Sec.';
$rrd_filename = rrd_name($device['hostname'], array('app', 'freeradius-proxy_acct', $app['app_id']));
$fr_proxy_acct_array = array(
'requests' => 'Requests',
'responses' => 'Responses',
'duplicate_requests' => 'Duplicate Requests',
'malformed_requests' => 'Malformed Requests',
'invalid_requests' => 'Invalid Requests',
'dropped_requests' => 'Dropped Requests',
'unknown_types' => 'Unknown Types'
);
$colours = 'mixed';
$rrd_list = array();
if (rrdtool_check_rrd_exists($rrd_filename)) {
foreach ($fr_proxy_acct_array as $ds => $descr) {
$rrd_list[$i]['filename'] = $rrd_filename;
$rrd_list[$i]['descr'] = $descr;
$rrd_list[$i]['ds'] = $ds;
$i++;
}
} else {
echo "file missing: $rrd_filename";
}
require 'includes/graphs/generic_multi_line.inc.php';

View File

@@ -0,0 +1,28 @@
<?php
require 'includes/graphs/common.inc.php';
$i = 0;
$scale_min = 0;
$nototal = 1;
$unit_text = 'Per Sec.';
$rrd_filename = rrd_name($device['hostname'], array('app', 'freeradius-proxy_auth', $app['app_id']));
$fr_proxy_auth_array = array(
'responses' => 'Responses',
'duplicate_requests' => 'Duplicate Requests',
'malformed_requests' => 'Malformed Requests',
'invalid_requests' => 'Invalid Requests',
'dropped_requests' => 'Dropped Requests',
'unknown_types' => 'Unknown Types'
);
$colours = 'mixed';
$rrd_list = array();
if (rrdtool_check_rrd_exists($rrd_filename)) {
foreach ($fr_proxy_auth_array as $ds => $descr) {
$rrd_list[$i]['filename'] = $rrd_filename;
$rrd_list[$i]['descr'] = $descr;
$rrd_list[$i]['ds'] = $ds;
$i++;
}
} else {
echo "file missing: $rrd_filename";
}
require 'includes/graphs/generic_multi_line.inc.php';

View File

@@ -0,0 +1,29 @@
<?php
require 'includes/graphs/common.inc.php';
$i = 0;
$scale_min = 0;
$nototal = 1;
$unit_text = 'Per Sec.';
$rrd_filename = rrd_name($device['hostname'], array('app', 'freeradius-queue', $app['app_id']));
$fr_queue_array = array(
'len_internal' => 'Len Internal',
'len_proxy' => 'Len Proxy',
'len_auth' => 'Len Auth',
'len_acct' => 'Len Acct',
'len_detail' => 'Len Detail',
'pps_in' => 'PPS In',
'pps_out' => 'PPS Out'
);
$colours = 'mixed';
$rrd_list = array();
if (rrdtool_check_rrd_exists($rrd_filename)) {
foreach ($fr_queue_array as $ds => $descr) {
$rrd_list[$i]['filename'] = $rrd_filename;
$rrd_list[$i]['descr'] = $descr;
$rrd_list[$i]['ds'] = $ds;
$i++;
}
} else {
echo "file missing: $rrd_filename";
}
require 'includes/graphs/generic_multi_line.inc.php';

View File

@@ -273,6 +273,16 @@ $graphs['pi-hole'] = array(
'blocklist',
);
$graphs['freeradius'] = array(
'access',
'auth',
'acct',
'proxy_access',
'proxy_auth',
'proxy_acct',
'queue',
);
print_optionbar_start();
echo "<span style='font-weight: bold;'>Apps</span> &#187; ";

View File

@@ -0,0 +1,29 @@
<?php
global $config;
$graphs = array(
'freeradius_access' => 'FreeRADIUS - Access',
'freeradius_auth' => 'FreeRADIUS - Auth',
'freeradius_acct' => 'FreeRADIUS - Acct',
'freeradius_proxy_access' => 'FreeRADIUS - Proxy Access',
'freeradius_proxy_auth' => 'FreeRADIUS - Proxy Auth',
'freeradius_proxy_acct' => 'FreeRADIUS - Proxy Acct',
'freeradius_queue' => 'FreeRADIUS - Queue'
);
foreach ($graphs as $key => $text) {
$graph_type = $key;
$graph_array['height'] = '100';
$graph_array['width'] = '215';
$graph_array['to'] = $config['time']['now'];
$graph_array['id'] = $app['app_id'];
$graph_array['type'] = 'application_'.$key;
echo '<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">'.$text.'</h3>
</div>
<div class="panel-body">
<div class="row">';
include 'includes/print-graphrow.inc.php';
echo '</div>';
echo '</div>';
echo '</div>';
}

View File

@@ -0,0 +1,166 @@
<?php
use LibreNMS\RRD\RrdDefinition;
$name = 'freeradius';
$app_id = $app['app_id'];
echo " $name";
if (!empty($agent_data['app'][$name])) {
$rawdata = $agent_data['app'][$name];
} else {
$options = '-O qv';
$oid = '.1.3.6.1.4.1.8072.1.3.2.3.1.2.10.102.114.101.101.114.97.100.105.117.115';
$rawdata = snmp_get($device, $oid, $options);
}
update_application($app, $rawdata);
#Format Data
$lines = explode("\n", $rawdata);
$freeradius = array();
foreach ($lines as $line) {
list($var,$value) = explode(' = ', $line);
$freeradius[$var] = $value;
}
#FreeRADIUS-Total-Access
$rrd_name = array('app', $name,'access',$app_id);
$rrd_def = RrdDefinition::make()
->addDataset('requests', 'DERIVE', 0, 125000000000)
->addDataset('accepts', 'DERIVE', 0, 125000000000)
->addDataset('rejects', 'DERIVE', 0, 125000000000)
->addDataset('challenges', 'DERIVE', 0, 125000000000);
$fields = array (
'requests' => $freeradius['FreeRADIUS-Total-Access-Requests'],
'accepts' => $freeradius['FreeRADIUS-Total-Access-Accepts'],
'rejects' => $freeradius['FreeRADIUS-Total-Access-Rejects'],
'challenges' => $freeradius['FreeRADIUS-Total-Access-Challenges']
);
$tags = compact('name', 'app_id', 'rrd_name', 'rrd_def');
data_update($device, 'app', $tags, $fields);
#FreeRADIUS-Total-Auth
$rrd_name = array('app', $name,'auth',$app_id);
$rrd_def = RrdDefinition::make()
->addDataset('responses', 'DERIVE', 0, 125000000000)
->addDataset('duplicate_requests', 'DERIVE', 0, 125000000000)
->addDataset('malformed_requests', 'DERIVE', 0, 125000000000)
->addDataset('invalid_requests', 'DERIVE', 0, 125000000000)
->addDataset('dropped_requests', 'DERIVE', 0, 125000000000)
->addDataset('unknown_types', 'DERIVE', 0, 125000000000);
$fields = array (
'responses' => $freeradius['FreeRADIUS-Total-Auth-Responses'],
'duplicate_requests' => $freeradius['FreeRADIUS-Total-Auth-Duplicate-Requests'],
'malformed_requests' => $freeradius['FreeRADIUS-Total-Auth-Malformed-Requests'],
'invalid_requests' => $freeradius['FreeRADIUS-Total-Auth-Invalid-Requests'],
'dropped_requests' => $freeradius['FreeRADIUS-Total-Auth-Dropped-Requests'],
'unknown_types' => $freeradius['FreeRADIUS-Total-Auth-Unknown-Types']
);
$tags = compact('name', 'app_id', 'rrd_name', 'rrd_def');
data_update($device, 'app', $tags, $fields);
#FreeRADIUS-Total-Acct
$rrd_name = array('app', $name,'acct',$app_id);
$rrd_def = RrdDefinition::make()
->addDataset('requests', 'DERIVE', 0, 125000000000)
->addDataset('responses', 'DERIVE', 0, 125000000000)
->addDataset('duplicate_requests', 'DERIVE', 0, 125000000000)
->addDataset('malformed_requests', 'DERIVE', 0, 125000000000)
->addDataset('invalid_requests', 'DERIVE', 0, 125000000000)
->addDataset('dropped_requests', 'DERIVE', 0, 125000000000)
->addDataset('unknown_types', 'DERIVE', 0, 125000000000);
$fields = array (
'requests' => $freeradius['FreeRADIUS-Total-Accounting-Requests'],
'responses' => $freeradius['FreeRADIUS-Total-Accounting-Responses'],
'duplicate_requests' => $freeradius['FreeRADIUS-Total-Acct-Duplicate-Requests'],
'malformed_requests' => $freeradius['FreeRADIUS-Total-Acct-Malformed-Requests'],
'invalid_requests' => $freeradius['FreeRADIUS-Total-Acct-Invalid-Requests'],
'dropped_requests' => $freeradius['FreeRADIUS-Total-Acct-Dropped-Requests'],
'unknown_types' => $freeradius['FreeRADIUS-Total-Acct-Unknown-Types']
);
$tags = compact('name', 'app_id', 'rrd_name', 'rrd_def');
data_update($device, 'app', $tags, $fields);
#FreeRADIUS-Total-Proxy-Access
$rrd_name = array('app', $name,'proxy_access',$app_id);
$rrd_def = RrdDefinition::make()
->addDataset('requests', 'DERIVE', 0, 125000000000)
->addDataset('accepts', 'DERIVE', 0, 125000000000)
->addDataset('rejects', 'DERIVE', 0, 125000000000)
->addDataset('challenges', 'DERIVE', 0, 125000000000);
$fields = array (
'requests' => $freeradius['FreeRADIUS-Total-Proxy-Access-Requests'],
'accepts' => $freeradius['FreeRADIUS-Total-Proxy-Access-Accepts'],
'rejects' => $freeradius['FreeRADIUS-Total-Proxy-Access-Rejects'],
'challenges' => $freeradius['FreeRADIUS-Total-Proxy-Access-Challenges']
);
$tags = compact('name', 'app_id', 'rrd_name', 'rrd_def');
data_update($device, 'app', $tags, $fields);
#FreeRADIUS-Total-Proxy-Auth
$rrd_name = array('app', $name,'proxy_auth',$app_id);
$rrd_def = RrdDefinition::make()
->addDataset('responses', 'DERIVE', 0, 125000000000)
->addDataset('duplicate_requests', 'DERIVE', 0, 125000000000)
->addDataset('malformed_requests', 'DERIVE', 0, 125000000000)
->addDataset('invalid_requests', 'DERIVE', 0, 125000000000)
->addDataset('dropped_requests', 'DERIVE', 0, 125000000000)
->addDataset('unknown_types', 'DERIVE', 0, 125000000000);
$fields = array (
'responses' => $freeradius['FreeRADIUS-Total-Proxy-Auth-Responses'],
'duplicate_requests' => $freeradius['FreeRADIUS-Total-Proxy-Auth-Duplicate-Requests'],
'malformed_requests' => $freeradius['FreeRADIUS-Total-Proxy-Auth-Malformed-Requests'],
'invalid_requests' => $freeradius['FreeRADIUS-Total-Proxy-Auth-Invalid-Requests'],
'dropped_requests' => $freeradius['FreeRADIUS-Total-Proxy-Auth-Dropped-Requests'],
'unknown_types' => $freeradius['FreeRADIUS-Total-Proxy-Auth-Unknown-Types']
);
$tags = compact('name', 'app_id', 'rrd_name', 'rrd_def');
data_update($device, 'app', $tags, $fields);
#FreeRADIUS-Total-Proxy-Acct
$rrd_name = array('app', $name,'proxy_acct',$app_id);
$rrd_def = RrdDefinition::make()
->addDataset('requests', 'DERIVE', 0, 125000000000)
->addDataset('responses', 'DERIVE', 0, 125000000000)
->addDataset('duplicate_requests', 'DERIVE', 0, 125000000000)
->addDataset('malformed_requests', 'DERIVE', 0, 125000000000)
->addDataset('invalid_requests', 'DERIVE', 0, 125000000000)
->addDataset('dropped_requests', 'DERIVE', 0, 125000000000)
->addDataset('unknown_types', 'DERIVE', 0, 125000000000);
$fields = array (
'requests' => $freeradius['FreeRADIUS-Total-Proxy-Accounting-Requests'],
'responses' => $freeradius['FreeRADIUS-Total-Proxy-Accounting-Responses'],
'duplicate_requests' => $freeradius['FreeRADIUS-Total-Proxy-Acct-Duplicate-Requests'],
'malformed_requests' => $freeradius['FreeRADIUS-Total-Proxy-Acct-Malformed-Requests'],
'invalid_requests' => $freeradius['FreeRADIUS-Total-Proxy-Acct-Invalid-Requests'],
'dropped_requests' => $freeradius['FreeRADIUS-Total-Proxy-Acct-Dropped-Requests'],
'unknown_types' => $freeradius['FreeRADIUS-Total-Proxy-Acct-Unknown-Types']
);
$tags = compact('name', 'app_id', 'rrd_name', 'rrd_def');
data_update($device, 'app', $tags, $fields);
#FreeRADIUS-Queue
$rrd_name = array('app', $name,'queue',$app_id);
$rrd_def = RrdDefinition::make()
->addDataset('len_internal', 'DERIVE', 0, 125000000000)
->addDataset('len_proxy', 'DERIVE', 0, 125000000000)
->addDataset('len_auth', 'DERIVE', 0, 125000000000)
->addDataset('len_acct', 'DERIVE', 0, 125000000000)
->addDataset('len_detail', 'DERIVE', 0, 125000000000)
->addDataset('pps_in', 'DERIVE', 0, 125000000000)
->addDataset('pps_out', 'DERIVE', 0, 125000000000);
$fields = array (
'len_internal' => $freeradius['FreeRADIUS-Queue-Len-Internal'],
'len_proxy' => $freeradius['FreeRADIUS-Queue-Len-Proxy'],
'len_auth' => $freeradius['FreeRADIUS-Queue-Len-Auth'],
'len_acct' => $freeradius['FreeRADIUS-Queue-Len-Acct'],
'len_detail' => $freeradius['FreeRADIUS-Queue-Len-Detail'],
'pps_in' => $freeradius['FreeRADIUS-Queue-PPS-In'],
'pps_out' => $freeradius['FreeRADIUS-Queue-PPS-Out']
);
$tags = compact('name', 'app_id', 'rrd_name', 'rrd_def');
data_update($device, 'app', $tags, $fields);
unset($lines, $freeradius, $rrd_name, $rrd_def, $fields, $tags);