mirror of
https://github.com/librenms/librenms.git
synced 2024-10-07 16:52:45 +00:00
Ubiquiti Airfiber60 (#13680)
* Add ubiquiti Airfiber 60 * New AF60 data and MIB * Stylci fix and small additions * Update test data * Stylefix * Remove the weird ubiquity oids containing encoded mac addresses * Updated test data * Remove more complex sensors for now to be added after the conflict airos airos-af60 is solved * Fix hardware and OS * To be verified is this is the most practical / clean way of doing it * Advanced wireless and MCS state sensor * Fix link capacity multiplier and active link * Test data update fix lint * Maybe better
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
namespace LibreNMS\OS;
|
||||
|
||||
use LibreNMS\Device\WirelessSensor;
|
||||
use LibreNMS\Interfaces\Discovery\OSDiscovery;
|
||||
use LibreNMS\Interfaces\Discovery\Sensors\WirelessDistanceDiscovery;
|
||||
use LibreNMS\Interfaces\Discovery\Sensors\WirelessFrequencyDiscovery;
|
||||
use LibreNMS\Interfaces\Discovery\Sensors\WirelessRateDiscovery;
|
||||
use LibreNMS\Interfaces\Discovery\Sensors\WirelessRssiDiscovery;
|
||||
use LibreNMS\Interfaces\Discovery\Sensors\WirelessSnrDiscovery;
|
||||
use LibreNMS\OS;
|
||||
|
||||
class AirosAf60 extends OS implements
|
||||
OSDiscovery,
|
||||
WirelessFrequencyDiscovery,
|
||||
WirelessDistanceDiscovery,
|
||||
WirelessRateDiscovery,
|
||||
WirelessRssiDiscovery,
|
||||
WirelessSnrDiscovery
|
||||
{
|
||||
/**
|
||||
* Discover wireless frequency. This is in GHz. Type is frequency.
|
||||
* Returns an array of LibreNMS\Device\Sensor objects that have been discovered
|
||||
*
|
||||
* @return array Sensors
|
||||
*/
|
||||
public function discoverWirelessFrequency()
|
||||
{
|
||||
$oid = '.1.3.6.1.4.1.41112.1.11.1.1.2.1'; // UI-AF60-MIB::af60Frequency.1
|
||||
|
||||
return [
|
||||
new WirelessSensor('frequency', $this->getDeviceId(), $oid, 'airos-af60', 1, 'Radio Frequency'),
|
||||
];
|
||||
}
|
||||
|
||||
public function discoverWirelessDistance()
|
||||
{
|
||||
$sensors = [];
|
||||
|
||||
$oids = snmpwalk_cache_oid($this->getDeviceArray(), 'af60StaRemoteDistance', [], 'UI-AF60-MIB', 'ubnt', '-OteQUsb');
|
||||
|
||||
foreach ($oids as $index => $entry) {
|
||||
$sensors[] = new WirelessSensor('distance', $this->getDeviceId(), '.1.3.6.1.4.1.41112.1.11.1.3.1.15.' . $index, 'airos-af60', 1, 'Distance', $entry['af60StaRemoteDistance'], 1, 1000); //UI-AF60-MIB::af60StaRemoteDistance
|
||||
}
|
||||
|
||||
return $sensors;
|
||||
}
|
||||
|
||||
public function discoverWirelessRate()
|
||||
{
|
||||
$sensors = [];
|
||||
|
||||
$oids = snmpwalk_cache_oid($this->getDeviceArray(), 'af60StaTxCapacity', [], 'UI-AF60-MIB', 'ubnt', '-OteQUsb');
|
||||
$oids = snmpwalk_cache_oid($this->getDeviceArray(), 'af60StaRxCapacity', $oids, 'UI-AF60-MIB', 'ubnt', '-OteQUsb');
|
||||
|
||||
foreach ($oids as $index => $entry) {
|
||||
$sensors[] = new WirelessSensor('rate', $this->getDeviceId(), '.1.3.6.1.4.1.41112.1.11.1.3.1.7.' . $index, 'airos-af60-TX', 1, 'Tx Capacity', $entry['af60StaTxCapacity'], 1000); //UI-AF60-MIB::af60StaTxCapacity
|
||||
$sensors[] = new WirelessSensor('rate', $this->getDeviceId(), '.1.3.6.1.4.1.41112.1.11.1.3.1.8.' . $index, 'airos-af60-RX', 1, 'Rx Capacity', $entry['af60StaRxCapacity'], 1000); //UI-AF60-MIB::af60StaRxCapacity
|
||||
}
|
||||
|
||||
return $sensors;
|
||||
}
|
||||
|
||||
public function discoverWirelessRssi()
|
||||
{
|
||||
$sensors = [];
|
||||
|
||||
$oids = snmpwalk_cache_oid($this->getDeviceArray(), 'af60StaRSSI', [], 'UI-AF60-MIB', 'ubnt', '-OteQUsb');
|
||||
$oids = snmpwalk_cache_oid($this->getDeviceArray(), 'af60StaRemoteRSSI', $oids, 'UI-AF60-MIB', 'ubnt', '-OteQUsb');
|
||||
|
||||
foreach ($oids as $index => $entry) {
|
||||
$sensors[] = new WirelessSensor('rssi', $this->getDeviceId(), '.1.3.6.1.4.1.41112.1.11.1.3.1.3.' . $index, 'airos-af60-l', 1, 'Local RSSI', $entry['af60StaRSSI'], 1); //UI-AF60-MIB::af60StaRSSI
|
||||
$sensors[] = new WirelessSensor('rssi', $this->getDeviceId(), '.1.3.6.1.4.1.41112.1.11.1.3.1.18.' . $index, 'airos-af60-r', 1, 'Remote RSSI', $entry['af60StaRemoteRSSI'], 1); //UI-AF60-MIB::af60StaRemoteRSSI
|
||||
}
|
||||
|
||||
return $sensors;
|
||||
}
|
||||
|
||||
public function discoverWirelessSnr()
|
||||
{
|
||||
$sensors = [];
|
||||
|
||||
$oids = snmpwalk_cache_oid($this->getDeviceArray(), 'af60StaSNR', [], 'UI-AF60-MIB', 'ubnt', '-OteQUsb');
|
||||
$oids = snmpwalk_cache_oid($this->getDeviceArray(), 'af60StaRemoteSNR', $oids, 'UI-AF60-MIB', 'ubnt', '-OteQUsb');
|
||||
|
||||
foreach ($oids as $index => $entry) {
|
||||
$sensors[] = new WirelessSensor('snr', $this->getDeviceId(), '.1.3.6.1.4.1.41112.1.11.1.3.1.4.' . $index, 'airos-af60-l', 1, 'Local SNR', $entry['af60StaSNR'], 1); //UI-AF60-MIB::af60StaSNR
|
||||
$sensors[] = new WirelessSensor('snr', $this->getDeviceId(), '.1.3.6.1.4.1.41112.1.11.1.3.1.19.' . $index, 'airos-af60-r', 1, 'Remote SNR', $entry['af60StaRemoteSNR'], 1); //UI-AF60-MIB::af60StaRemoteSNR
|
||||
}
|
||||
|
||||
return $sensors;
|
||||
}
|
||||
}
|
||||
@@ -42,6 +42,14 @@ is the preferred method for detection. Other options are available:
|
||||
matches one of the regex statements under this item
|
||||
- `snmpget` Do not use this unless none of the other methods
|
||||
work. Fetch an oid and compare it against a value.
|
||||
```yaml
|
||||
discovery:
|
||||
-
|
||||
snmpget:
|
||||
- oid: <someoid>
|
||||
- op: <["=","!=","==","!==","<=",">=","<",">","starts","ends","contains","regex","not_starts","not_ends","not_contains","not_regex","in_array","not_in_array","exists"]>
|
||||
- value: <'string' | boolean>
|
||||
```
|
||||
- `_except` You can add this to any of the above to exclude that
|
||||
element. As an example:
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
os: airos-af60
|
||||
text: 'Ubiquiti AirFiber 60'
|
||||
type: wireless
|
||||
icon: ubiquiti
|
||||
snmp_bulk: false
|
||||
mib_dir: ubnt
|
||||
over:
|
||||
- { graph: device_bits, text: 'Device Traffic' }
|
||||
- { graph: device_wireless_rate, text: 'Wireless Rate' }
|
||||
- { graph: device_processor, text: 'CPU Usage' }
|
||||
poller_modules:
|
||||
wifi: true
|
||||
discovery:
|
||||
-
|
||||
sysObjectID:
|
||||
- .1.3.6.1.4.1.10002.1
|
||||
- .1.3.6.1.4.1.41112.1.11.1
|
||||
sysDescr: Linux
|
||||
snmpget:
|
||||
oid: UI-AF60-MIB::af60FirmwareVersion.1
|
||||
op: '!='
|
||||
value: false
|
||||
@@ -14,3 +14,7 @@ discovery:
|
||||
- .1.3.6.1.4.1.10002.1
|
||||
- .1.3.6.1.4.1.41112.1.4
|
||||
sysDescr: Linux
|
||||
snmpget:
|
||||
oid: UI-AF60-MIB::af60Role.1
|
||||
op: '='
|
||||
value: false
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
mib: UI-AF60-MIB
|
||||
modules:
|
||||
os:
|
||||
hardware: UI-AF60-MIB::af60DevModel.1
|
||||
version: UI-AF60-MIB::af60FirmwareVersion.1
|
||||
lat: UI-AF60-MIB::af60GpsLat.1
|
||||
long: UI-AF60-MIB::af60GpsLon.1
|
||||
processors:
|
||||
data:
|
||||
-
|
||||
oid: af60CpuUsage
|
||||
num_oid: '.1.3.6.1.4.1.41112.1.11.2.6'
|
||||
sensors:
|
||||
state:
|
||||
data:
|
||||
-
|
||||
oid: af60Role
|
||||
num_oid: '.1.3.6.1.4.1.41112.1.11.1.1.1.{{ $index }}'
|
||||
index: af60Role
|
||||
descr: Radio Role
|
||||
state_name: af60Role
|
||||
states:
|
||||
- { value: 0, generic: 0, graph: 0, descr: AP }
|
||||
- { value: 1, generic: 0, graph: 0, descr: CPE }
|
||||
-
|
||||
oid: af60GpsStatus
|
||||
num_oid: '.1.3.6.1.4.1.41112.1.11.1.4.1.{{ $index }}'
|
||||
index: af60GpsStatus
|
||||
descr: GPS Status
|
||||
state_name: af60GpsStatus
|
||||
states:
|
||||
- { value: 0, generic: 1, graph: 0, descr: Absent }
|
||||
- { value: 1, generic: 1, graph: 0, descr: Off }
|
||||
- { value: 2, generic: 0, graph: 0, descr: On }
|
||||
-
|
||||
oid: af60GpsFix
|
||||
num_oid: '.1.3.6.1.4.1.41112.1.11.1.4.2.{{ $index }}'
|
||||
index: af60GpsFix
|
||||
descr: GPS fix
|
||||
state_name: af60GpsFix
|
||||
states:
|
||||
- { value: 0, generic: 1, graph: 0, descr: Unknown }
|
||||
- { value: 1, generic: 1, graph: 0, descr: Nofix }
|
||||
- { value: 2, generic: 0, graph: 0, descr: Fix2d }
|
||||
- { value: 3, generic: 0, graph: 0, descr: Fix3d }
|
||||
count:
|
||||
data:
|
||||
-
|
||||
oid: af60GpsSatsVisible
|
||||
num_oid: '.1.3.6.1.4.1.41112.1.11.1.4.7.{{ $index }}'
|
||||
index: af60GpsSatsVisible
|
||||
descr: Sat visible
|
||||
-
|
||||
oid: af60GpsSatsTracked
|
||||
num_oid: '.1.3.6.1.4.1.41112.1.11.1.4.8.{{ $index }}'
|
||||
index: af60GpsSatsTracked
|
||||
descr: Sat tracked
|
||||
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
$oids = snmpwalk_cache_oid($device, 'af60StaTxMCS', [], 'UI-AF60-MIB', 'ubnt', '-OteQUsb'); //UBNT-AFLTU-MIB::afLTUStaTxRate
|
||||
$oids = snmpwalk_cache_oid($device, 'af60StaRxMCS', $oids, 'UI-AF60-MIB', 'ubnt', '-OteQUsb'); //UBNT-AFLTU-MIB::afLTUStaRxRate
|
||||
|
||||
foreach ($oids as $index => $entry) {
|
||||
//Create State Index
|
||||
$txmcs_state_name = 'af60StaTxMCS';
|
||||
$rxmcs_state_name = 'af60StaRxMCS';
|
||||
|
||||
$rate_states = [
|
||||
['value' => 1, 'generic' => 2, 'graph' => 1, 'descr' => '1X'],
|
||||
['value' => 2, 'generic' => 2, 'graph' => 1, 'descr' => '2X'],
|
||||
['value' => 3, 'generic' => 1, 'graph' => 1, 'descr' => '3X'],
|
||||
['value' => 4, 'generic' => 1, 'graph' => 1, 'descr' => '4X'],
|
||||
['value' => 5, 'generic' => 0, 'graph' => 1, 'descr' => '5X'],
|
||||
['value' => 6, 'generic' => 0, 'graph' => 1, 'descr' => '6X'],
|
||||
['value' => 7, 'generic' => 0, 'graph' => 1, 'descr' => '7X'],
|
||||
['value' => 8, 'generic' => 0, 'graph' => 1, 'descr' => '8X'],
|
||||
['value' => 9, 'generic' => 0, 'graph' => 1, 'descr' => '9X'],
|
||||
];
|
||||
|
||||
create_state_index($txmcs_state_name, $rate_states);
|
||||
create_state_index($rxmcs_state_name, $rate_states);
|
||||
|
||||
//Discover Sensors
|
||||
discover_sensor($valid['sensor'], 'state', $device, '.1.3.6.1.4.1.41112.1.11.1.3.1.5.' . $index, 1, $txmcs_state_name, 'TX MCS Rate', '1', '1', null, null, null, null, $entry['af60StaTxMCS']);
|
||||
discover_sensor($valid['sensor'], 'state', $device, '.1.3.6.1.4.1.41112.1.11.1.3.1.6.' . $index, 2, $rxmcs_state_name, 'RX MCS Rate', '1', '1', null, null, null, null, $entry['af60StaRxMCS']);
|
||||
|
||||
//Create Sensor To State Index
|
||||
create_sensor_to_state_index($device, $txmcs_state_name, 1);
|
||||
create_sensor_to_state_index($device, $rxmcs_state_name, 2);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
unset(
|
||||
$oids,
|
||||
$index,
|
||||
$entry,
|
||||
$rate_states,
|
||||
$txmcs_state_name,
|
||||
$rxmcs_state_name
|
||||
);
|
||||
|
||||
$oids = snmpwalk_cache_oid($device, 'af60StaActiveLink', [], 'UI-AF60-MIB', 'ubnt', '-OteQUsb'); //UBNT-AFLTU-MIB::afLTUStaTxRate
|
||||
// This returns either "main" or "backup" as a string
|
||||
|
||||
foreach ($oids as $index => $entry) {
|
||||
// convert string to int main === 1 and backup === 2
|
||||
$entry['af60StaActiveLink'] = $entry['af60StaActiveLink'] === 'main' ? 1 : 2;
|
||||
//Create State Index
|
||||
$activeLink_state_name = 'af60StaActiveLink';
|
||||
|
||||
$rate_states = [
|
||||
['value' => 1, 'generic' => 0, 'graph' => 1, 'descr' => 'Main'],
|
||||
['value' => 2, 'generic' => 1, 'graph' => 1, 'descr' => 'Backup'],
|
||||
];
|
||||
|
||||
create_state_index($activeLink_state_name, $rate_states);
|
||||
|
||||
//Discover Sensors
|
||||
discover_sensor($valid['sensor'], 'state', $device, '.1.3.6.1.4.1.41112.1.11.1.3.1.2.' . $index, 1, $activeLink_state_name, 'Active link', '1', '1', null, null, null, null, $entry['af60StaActiveLink']);
|
||||
|
||||
//Create Sensor To State Index
|
||||
create_sensor_to_state_index($device, $activeLink_state_name, 1);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
unset(
|
||||
$oids,
|
||||
$index,
|
||||
$entry,
|
||||
$rate_states,
|
||||
$activeLink_state_name
|
||||
);
|
||||
+12
-10
@@ -5,22 +5,22 @@ UBNT-MIB DEFINITIONS ::= BEGIN
|
||||
OBJECT-GROUP, MODULE-COMPLIANCE FROM SNMPv2-CONF;
|
||||
|
||||
ubntMIB MODULE-IDENTITY
|
||||
LAST-UPDATED "201402270000Z"
|
||||
ORGANIZATION "Ubiquiti Networks, Inc."
|
||||
CONTACT-INFO "support@ubnt.com"
|
||||
DESCRIPTION "The MIB module for Ubiquiti Networks, Inc. entities"
|
||||
REVISION "201402270000Z"
|
||||
LAST-UPDATED "202109210000Z"
|
||||
ORGANIZATION "Ubiquiti, Inc."
|
||||
CONTACT-INFO "support@ui.com"
|
||||
DESCRIPTION "The MIB module for Ubiquiti, Inc. entities"
|
||||
REVISION "202109210000Z"
|
||||
DESCRIPTION "Split revision"
|
||||
::= { ubnt 1 }
|
||||
|
||||
-- --------------------------------------------------------------------------------
|
||||
-- Ubiquiti Networks Root
|
||||
-- Ubiquiti Root
|
||||
-- --------------------------------------------------------------------------------
|
||||
|
||||
ubnt OBJECT IDENTIFIER ::= { enterprises 41112 }
|
||||
|
||||
-- --------------------------------------------------------------------------------
|
||||
-- Ubiquiti Networks SNMP Information
|
||||
-- Ubiquiti SNMP Information
|
||||
-- --------------------------------------------------------------------------------
|
||||
|
||||
ubntSnmpInfo OBJECT IDENTIFIER ::= { ubntMIB 2 }
|
||||
@@ -33,11 +33,12 @@ UBNT-MIB DEFINITIONS ::= BEGIN
|
||||
ubntMFiGroups OBJECT IDENTIFIER ::= { ubntSnmpInfo 7}
|
||||
ubntUniTelGroups OBJECT IDENTIFIER ::= { ubntSnmpInfo 8}
|
||||
ubntAFLTUGroups OBJECT IDENTIFIER ::= { ubntSnmpInfo 9}
|
||||
uiAF60Groups OBJECT IDENTIFIER ::= { ubntSnmpInfo 10}
|
||||
|
||||
-- --------------------------------------------------------------------------------
|
||||
-- Ubiquiti Networks Products
|
||||
-- Ubiquiti Products
|
||||
-- --------------------------------------------------------------------------------
|
||||
|
||||
|
||||
ubntAirFIBER OBJECT IDENTIFIER ::= { ubntMIB 3 }
|
||||
ubntEdgeMax OBJECT IDENTIFIER ::= { ubntMIB 5 }
|
||||
ubntUniFi OBJECT IDENTIFIER ::= { ubntMIB 6 }
|
||||
@@ -45,9 +46,10 @@ UBNT-MIB DEFINITIONS ::= BEGIN
|
||||
ubntMFi OBJECT IDENTIFIER ::= { ubntMIB 8 }
|
||||
ubntUniTel OBJECT IDENTIFIER ::= { ubntMIB 9 }
|
||||
ubntAFLTU OBJECT IDENTIFIER ::= { ubntMIB 10 }
|
||||
uiAF60 OBJECT IDENTIFIER ::= { ubntMIB 11 }
|
||||
|
||||
-- --------------------------------------------------------------------------------
|
||||
-- Ubiquiti Networks OR table
|
||||
-- Ubiquiti OR table
|
||||
-- --------------------------------------------------------------------------------
|
||||
|
||||
ubntORTable OBJECT-TYPE
|
||||
|
||||
@@ -0,0 +1,424 @@
|
||||
UI-AF60-MIB DEFINITIONS ::= BEGIN
|
||||
|
||||
IMPORTS
|
||||
MODULE-IDENTITY, OBJECT-TYPE, Integer32, Counter64, IpAddress
|
||||
FROM SNMPv2-SMI
|
||||
MODULE-COMPLIANCE, OBJECT-GROUP
|
||||
FROM SNMPv2-CONF
|
||||
DisplayString
|
||||
FROM SNMPv2-TC
|
||||
uiAF60, uiAF60Groups
|
||||
FROM UBNT-MIB;
|
||||
|
||||
af60MIB MODULE-IDENTITY
|
||||
LAST-UPDATED "202110050000Z"
|
||||
ORGANIZATION "Ubiquiti, Inc."
|
||||
CONTACT-INFO "[email protected]"
|
||||
DESCRIPTION "The AF60 MIB module for Ubiquiti, Inc. entities"
|
||||
REVISION "202110050000Z"
|
||||
DESCRIPTION "AF60.v1.0 revision"
|
||||
::= { uiAF60 1 }
|
||||
|
||||
af60Compliances OBJECT IDENTIFIER ::= {uiAF60Groups 1}
|
||||
af60Groups OBJECT IDENTIFIER ::= {uiAF60Groups 2}
|
||||
|
||||
af60Config OBJECT IDENTIFIER ::= {af60MIB 1}
|
||||
af60Status OBJECT IDENTIFIER ::= {af60MIB 2}
|
||||
af60StationTable OBJECT IDENTIFIER ::= {af60MIB 3}
|
||||
af60Gps OBJECT IDENTIFIER ::= {af60MIB 4}
|
||||
af60Orientation OBJECT IDENTIFIER ::= {af60MIB 5}
|
||||
|
||||
-- --------------------------------------------------------------------------------
|
||||
-- Configuration table
|
||||
-- --------------------------------------------------------------------------------
|
||||
|
||||
af60Role OBJECT-TYPE
|
||||
SYNTAX INTEGER {
|
||||
ap (0),
|
||||
cpe (1)
|
||||
}
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Wireless Role (ap/cpe)"
|
||||
::= { af60Config 1 }
|
||||
|
||||
af60Frequency OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "MHz"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "The main frequency to use in MHz."
|
||||
::= { af60Config 2 }
|
||||
|
||||
af60Bandwidth OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "MHz"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Wireless channel bandwidth in MHz."
|
||||
::= { af60Config 3 }
|
||||
|
||||
af60Ssid OBJECT-TYPE
|
||||
SYNTAX DisplayString (SIZE (1..15))
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Radio SSID"
|
||||
::= { af60Config 4 }
|
||||
|
||||
af60LastIp OBJECT-TYPE
|
||||
SYNTAX IpAddress
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "IP address of a device"
|
||||
::= { af60Config 5 }
|
||||
|
||||
-- --------------------------------------------------------------------------------
|
||||
-- Status table
|
||||
-- --------------------------------------------------------------------------------
|
||||
|
||||
af60Mac OBJECT-TYPE
|
||||
SYNTAX Hex-STRING
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "The MAC address of this device"
|
||||
::= { af60Status 1 }
|
||||
|
||||
af60DevModel OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "The device model."
|
||||
::= { af60Status 2 }
|
||||
|
||||
af60DevName OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "The device name."
|
||||
::= { af60Status 3 }
|
||||
|
||||
af60FirmwareVersion OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "The firmware version running."
|
||||
::= { af60Status 4 }
|
||||
|
||||
af60MemoryUsage OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "%"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "The percentage of total memory usage."
|
||||
::= { af60Status 5 }
|
||||
|
||||
af60CpuUsage OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "%"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "The percentage of total CPU usage."
|
||||
::= { af60Status 6 }
|
||||
|
||||
af60Uptime OBJECT-TYPE
|
||||
SYNTAX TimeTicks
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "The uptime of the device"
|
||||
::= { af60Status 7 }
|
||||
|
||||
af60CarrierDrop OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "State of Carrier Drop"
|
||||
::= { af60Status 8 }
|
||||
|
||||
-- --------------------------------------------------------------------------------
|
||||
-- Station table
|
||||
-- --------------------------------------------------------------------------------
|
||||
|
||||
af60StationTable OBJECT-TYPE
|
||||
SYNTAX SEQUENCE OF Af60StationEntry
|
||||
MAX-ACCESS not-accessible
|
||||
STATUS current
|
||||
DESCRIPTION "Remote station table for status and statistics."
|
||||
::= { af60MIB 3 }
|
||||
|
||||
af60StationEntry OBJECT-TYPE
|
||||
SYNTAX Af60StationEntry
|
||||
MAX-ACCESS not-accessible
|
||||
STATUS current
|
||||
DESCRIPTION "An entry in the af60StationTable"
|
||||
INDEX { af60StaMac }
|
||||
::= { af60StationTable 1 }
|
||||
|
||||
Af60StationEntry ::= SEQUENCE {
|
||||
af60StaMac OCTET STRING (SIZE (6)),
|
||||
af60StaActiveLink DisplayString,
|
||||
af60StaRSSI Integer32,
|
||||
af60StaSNR Integer32,
|
||||
af60StaTxMCS Integer32,
|
||||
af60StaRxMCS Integer32,
|
||||
af60StaTxCapacity Integer32,
|
||||
af60StaRxCapacity Integer32,
|
||||
af60StaTxBytes Counter64,
|
||||
af60StaRxBytes Counter64,
|
||||
af60StaTxThroughput Integer32,
|
||||
af60StaRxThroughput Integer32,
|
||||
af60StaRemoteDevModel DisplayString,
|
||||
af60StaRemoteDevName DisplayString,
|
||||
af60StaRemoteDistance Integer32,
|
||||
af60StaRemoteDistanceFeet Integer32,
|
||||
af60StaRemoteConnectionTime TimeTicks,
|
||||
af60StaRemoteRSSI Integer32,
|
||||
af60StaRemoteSNR Integer32,
|
||||
af60StaRemoteLastIp IpAddress
|
||||
}
|
||||
|
||||
af60StaMac OBJECT-TYPE
|
||||
SYNTAX OCTET STRING (SIZE (6))
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "MAC address of remote endpoint"
|
||||
::= { af60StationEntry 1 }
|
||||
|
||||
af60StaActiveLink OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Link type used at the moment (main or backup)"
|
||||
::= { af60StationEntry 2 }
|
||||
|
||||
af60StaRSSI OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Local RSSI"
|
||||
::= { af60StationEntry 3 }
|
||||
|
||||
af60StaSNR OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Signal-to-noise ratio"
|
||||
::= { af60StationEntry 4 }
|
||||
|
||||
af60StaTxMCS OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "X"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Currently selected TX modulation and coding scheme"
|
||||
::= { af60StationEntry 5 }
|
||||
|
||||
af60StaRxMCS OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "X"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Currently selected RX modulation and coding scheme"
|
||||
::= { af60StationEntry 6 }
|
||||
|
||||
af60StaTxCapacity OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "Kbps"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Transmit Capacity"
|
||||
::= { af60StationEntry 7 }
|
||||
|
||||
af60StaRxCapacity OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "Kbps"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Receive Capacity"
|
||||
::= { af60StationEntry 8 }
|
||||
|
||||
af60StaTxBytes OBJECT-TYPE
|
||||
SYNTAX Counter64
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Bytes transmitted to remote endpoint"
|
||||
::= { af60StationEntry 9 }
|
||||
|
||||
af60StaRxBytes OBJECT-TYPE
|
||||
SYNTAX Counter64
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Bytes received from remote endpoint"
|
||||
::= { af60StationEntry 10 }
|
||||
|
||||
af60StaTxThroughput OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "Kbps"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Current throughput to remote endpoint"
|
||||
::= { af60StationEntry 11 }
|
||||
|
||||
af60StaRxThroughput OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "Kbps"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Current throughput from remote endpoint"
|
||||
::= { af60StationEntry 12 }
|
||||
|
||||
af60StaRemoteDevModel OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Device model of the remote endpoint"
|
||||
::= { af60StationEntry 13 }
|
||||
|
||||
af60StaRemoteDevName OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Device name of the remote endpoint"
|
||||
::= { af60StationEntry 14 }
|
||||
|
||||
af60StaRemoteDistance OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "m"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Remote endpoint distance in meters"
|
||||
::= { af60StationEntry 15 }
|
||||
|
||||
af60StaRemoteDistanceFeet OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "ft"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Remote endpoint distance in feet"
|
||||
::= { af60StationEntry 16 }
|
||||
|
||||
af60StaRemoteConnectionTime OBJECT-TYPE
|
||||
SYNTAX TimeTicks
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Remote endpoint connection time of current session"
|
||||
::= { af60StationEntry 17 }
|
||||
|
||||
af60StaRemoteRSSI OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
UNITS "dBm"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Remote endpoint RSSI"
|
||||
::= { af60StationEntry 18 }
|
||||
|
||||
af60StaRemoteSNR OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Remote endpoint signal-to-noise ratio"
|
||||
::= { af60StationEntry 19 }
|
||||
|
||||
af60StaRemoteLastIp OBJECT-TYPE
|
||||
SYNTAX IpAddress
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Remote endpoint last known IP address"
|
||||
::= { af60StationEntry 20 }
|
||||
|
||||
-- --------------------------------------------------------------------------------
|
||||
-- GPS table
|
||||
-- --------------------------------------------------------------------------------
|
||||
|
||||
af60GpsStatus OBJECT-TYPE
|
||||
SYNTAX INTEGER {
|
||||
absent(0),
|
||||
off(1),
|
||||
on(2)
|
||||
}
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "GPS status"
|
||||
::= { af60Gps 1 }
|
||||
|
||||
af60GpsFix OBJECT-TYPE
|
||||
SYNTAX INTEGER {
|
||||
unknown(0),
|
||||
nofix(1),
|
||||
fix2d(2),
|
||||
fix3d(3)
|
||||
}
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "GPS fix status"
|
||||
::= { af60Gps 2 }
|
||||
|
||||
af60GpsLat OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "GPS Latitude"
|
||||
::= { af60Gps 3 }
|
||||
|
||||
af60GpsLon OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "GPS Longitude"
|
||||
::= { af60Gps 4 }
|
||||
|
||||
af60GpsAltM OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
UNITS "m"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "GPS Atlitude in meters"
|
||||
::= { af60Gps 5 }
|
||||
|
||||
af60GpsAltFt OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
UNITS "ft"
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "GPS Atlitude in feet"
|
||||
::= { af60Gps 6 }
|
||||
|
||||
af60GpsSatsVisible OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "GPS visible statellites"
|
||||
::= { af60Gps 7 }
|
||||
|
||||
af60GpsSatsTracked OBJECT-TYPE
|
||||
SYNTAX Integer32
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "GPS tracked satellites"
|
||||
::= { af60Gps 8 }
|
||||
|
||||
af60GpsHDOP OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "GPS Horizontal Dilution of Precision"
|
||||
::= { af60Gps 9 }
|
||||
|
||||
-- --------------------------------------------------------------------------------
|
||||
-- Orientation table
|
||||
-- --------------------------------------------------------------------------------
|
||||
|
||||
af60OrientationTilt OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Tilt of orientation"
|
||||
::= { af60Orientation 1 }
|
||||
|
||||
af60OrientationRoll OBJECT-TYPE
|
||||
SYNTAX DisplayString
|
||||
MAX-ACCESS read-only
|
||||
STATUS current
|
||||
DESCRIPTION "Roll of orientation"
|
||||
::= { af60Orientation 2 }
|
||||
END
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,136 @@
|
||||
1.3.6.1.2.1.1.1.0|4|Linux 4.9.241 #2 SMP Thu Dec 30 12:43:55 EET 2021 armv7l
|
||||
1.3.6.1.2.1.1.2.0|6|1.3.6.1.4.1.10002.1
|
||||
1.3.6.1.2.1.1.4.0|4|<private>
|
||||
1.3.6.1.2.1.1.6.0|4|<private>
|
||||
1.3.6.1.2.1.2.2.1.1.1|2|1
|
||||
1.3.6.1.2.1.2.2.1.1.2|2|2
|
||||
1.3.6.1.2.1.2.2.1.1.3|2|3
|
||||
1.3.6.1.2.1.2.2.1.1.4|2|4
|
||||
1.3.6.1.2.1.2.2.1.1.5|2|5
|
||||
1.3.6.1.2.1.2.2.1.2.1|4|wlan0
|
||||
1.3.6.1.2.1.2.2.1.2.2|4|br0
|
||||
1.3.6.1.2.1.2.2.1.2.3|4|lo
|
||||
1.3.6.1.2.1.2.2.1.2.4|4|eth0
|
||||
1.3.6.1.2.1.2.2.1.2.5|4|ubond0
|
||||
1.3.6.1.2.1.2.2.1.3.1|2|6
|
||||
1.3.6.1.2.1.2.2.1.3.2|2|6
|
||||
1.3.6.1.2.1.2.2.1.3.3|2|24
|
||||
1.3.6.1.2.1.2.2.1.3.4|2|6
|
||||
1.3.6.1.2.1.2.2.1.3.5|2|6
|
||||
1.3.6.1.2.1.2.2.1.4.1|2|1600
|
||||
1.3.6.1.2.1.2.2.1.4.2|2|1600
|
||||
1.3.6.1.2.1.2.2.1.4.3|2|65536
|
||||
1.3.6.1.2.1.2.2.1.4.4|2|1600
|
||||
1.3.6.1.2.1.2.2.1.4.5|2|1600
|
||||
1.3.6.1.2.1.2.2.1.5.1|66|0
|
||||
1.3.6.1.2.1.2.2.1.5.2|66|0
|
||||
1.3.6.1.2.1.2.2.1.5.3|66|0
|
||||
1.3.6.1.2.1.2.2.1.5.4|66|1000000000
|
||||
1.3.6.1.2.1.2.2.1.5.5|66|0
|
||||
1.3.6.1.2.1.2.2.1.6.1|4x|F492BFE29EE0
|
||||
1.3.6.1.2.1.2.2.1.6.2|4x|F492BFE29EE0
|
||||
1.3.6.1.2.1.2.2.1.6.3|4|
|
||||
1.3.6.1.2.1.2.2.1.6.4|4x|F492BFE39EE0
|
||||
1.3.6.1.2.1.2.2.1.6.5|4x|F492BFE29EE0
|
||||
1.3.6.1.2.1.2.2.1.7.1|2|1
|
||||
1.3.6.1.2.1.2.2.1.7.2|2|1
|
||||
1.3.6.1.2.1.2.2.1.7.3|2|1
|
||||
1.3.6.1.2.1.2.2.1.7.4|2|1
|
||||
1.3.6.1.2.1.2.2.1.7.5|2|1
|
||||
1.3.6.1.2.1.2.2.1.8.1|2|1
|
||||
1.3.6.1.2.1.2.2.1.8.2|2|1
|
||||
1.3.6.1.2.1.2.2.1.8.3|2|1
|
||||
1.3.6.1.2.1.2.2.1.8.4|2|1
|
||||
1.3.6.1.2.1.2.2.1.8.5|2|1
|
||||
1.3.6.1.2.1.2.2.1.9.1|67|0
|
||||
1.3.6.1.2.1.2.2.1.9.2|67|0
|
||||
1.3.6.1.2.1.2.2.1.9.3|67|0
|
||||
1.3.6.1.2.1.2.2.1.9.4|67|0
|
||||
1.3.6.1.2.1.2.2.1.9.5|67|0
|
||||
1.3.6.1.2.1.2.2.1.10.1|65|68636836
|
||||
1.3.6.1.2.1.2.2.1.10.2|65|410220655
|
||||
1.3.6.1.2.1.2.2.1.10.3|65|1161035
|
||||
1.3.6.1.2.1.2.2.1.10.4|65|1148570841
|
||||
1.3.6.1.2.1.2.2.1.10.5|65|68636836
|
||||
1.3.6.1.2.1.2.2.1.11.1|65|392146079
|
||||
1.3.6.1.2.1.2.2.1.11.2|65|1733741
|
||||
1.3.6.1.2.1.2.2.1.11.3|65|5724
|
||||
1.3.6.1.2.1.2.2.1.11.4|65|793296923
|
||||
1.3.6.1.2.1.2.2.1.11.5|65|392146079
|
||||
1.3.6.1.2.1.2.2.1.12.1|65|214346
|
||||
1.3.6.1.2.1.2.2.1.12.2|65|0
|
||||
1.3.6.1.2.1.2.2.1.12.3|65|0
|
||||
1.3.6.1.2.1.2.2.1.12.4|65|0
|
||||
1.3.6.1.2.1.2.2.1.12.5|65|214346
|
||||
1.3.6.1.2.1.2.2.1.13.1|65|0
|
||||
1.3.6.1.2.1.2.2.1.13.2|65|0
|
||||
1.3.6.1.2.1.2.2.1.13.3|65|0
|
||||
1.3.6.1.2.1.2.2.1.13.4|65|0
|
||||
1.3.6.1.2.1.2.2.1.13.5|65|0
|
||||
1.3.6.1.2.1.2.2.1.14.1|65|0
|
||||
1.3.6.1.2.1.2.2.1.14.2|65|0
|
||||
1.3.6.1.2.1.2.2.1.14.3|65|0
|
||||
1.3.6.1.2.1.2.2.1.14.4|65|0
|
||||
1.3.6.1.2.1.2.2.1.14.5|65|0
|
||||
1.3.6.1.2.1.2.2.1.15.1|65|0
|
||||
1.3.6.1.2.1.2.2.1.15.2|65|0
|
||||
1.3.6.1.2.1.2.2.1.15.3|65|0
|
||||
1.3.6.1.2.1.2.2.1.15.4|65|0
|
||||
1.3.6.1.2.1.2.2.1.15.5|65|0
|
||||
1.3.6.1.2.1.2.2.1.16.1|65|996715929
|
||||
1.3.6.1.2.1.2.2.1.16.2|65|251315320
|
||||
1.3.6.1.2.1.2.2.1.16.3|65|1161035
|
||||
1.3.6.1.2.1.2.2.1.16.4|65|320308032
|
||||
1.3.6.1.2.1.2.2.1.16.5|65|996715929
|
||||
1.3.6.1.2.1.2.2.1.17.1|65|792195013
|
||||
1.3.6.1.2.1.2.2.1.17.2|65|934655
|
||||
1.3.6.1.2.1.2.2.1.17.3|65|5724
|
||||
1.3.6.1.2.1.2.2.1.17.4|65|393305172
|
||||
1.3.6.1.2.1.2.2.1.17.5|65|792195013
|
||||
1.3.6.1.2.1.2.2.1.18.1|65|0
|
||||
1.3.6.1.2.1.2.2.1.18.2|65|0
|
||||
1.3.6.1.2.1.2.2.1.18.3|65|0
|
||||
1.3.6.1.2.1.2.2.1.18.4|65|0
|
||||
1.3.6.1.2.1.2.2.1.18.5|65|0
|
||||
1.3.6.1.2.1.2.2.1.19.1|65|0
|
||||
1.3.6.1.2.1.2.2.1.19.2|65|0
|
||||
1.3.6.1.2.1.2.2.1.19.3|65|0
|
||||
1.3.6.1.2.1.2.2.1.19.4|65|0
|
||||
1.3.6.1.2.1.2.2.1.19.5|65|0
|
||||
1.3.6.1.2.1.2.2.1.20.1|65|0
|
||||
1.3.6.1.2.1.2.2.1.20.2|65|0
|
||||
1.3.6.1.2.1.2.2.1.20.3|65|0
|
||||
1.3.6.1.2.1.2.2.1.20.4|65|0
|
||||
1.3.6.1.2.1.2.2.1.20.5|65|0
|
||||
1.3.6.1.2.1.2.2.1.21.1|66|1000
|
||||
1.3.6.1.2.1.2.2.1.21.2|66|1000
|
||||
1.3.6.1.2.1.2.2.1.21.3|66|1
|
||||
1.3.6.1.2.1.2.2.1.21.4|66|1000
|
||||
1.3.6.1.2.1.2.2.1.21.5|66|1000
|
||||
1.3.6.1.2.1.2.2.1.22.1|6|0.0
|
||||
1.3.6.1.2.1.2.2.1.22.2|6|0.0
|
||||
1.3.6.1.2.1.2.2.1.22.3|6|0.0
|
||||
1.3.6.1.2.1.2.2.1.22.4|6|0.0
|
||||
1.3.6.1.2.1.2.2.1.22.5|6|0.0
|
||||
1.3.6.1.4.1.41112.1.1.1.1.1|2|1
|
||||
1.3.6.1.4.1.41112.1.11.1.1.1.1|2|0
|
||||
1.3.6.1.4.1.41112.1.11.1.1.2.1|2|69120
|
||||
1.3.6.1.4.1.41112.1.11.1.2.2.1|4|AF60-LR
|
||||
1.3.6.1.4.1.41112.1.11.1.2.4.1|4|GP.ipq806x.v2.6.0-RC.46590.211230.1238
|
||||
1.3.6.1.4.1.41112.1.11.1.2.6.1|2|3
|
||||
1.3.6.1.4.1.41112.1.11.1.3.1.2.244.146.191.226.158.141.1|4|main
|
||||
1.3.6.1.4.1.41112.1.11.1.3.1.3.244.146.191.226.158.141.1|2|-55
|
||||
1.3.6.1.4.1.41112.1.11.1.3.1.4.244.146.191.226.158.141.1|2|19
|
||||
1.3.6.1.4.1.41112.1.11.1.3.1.5.244.146.191.226.158.141.1|2|9
|
||||
1.3.6.1.4.1.41112.1.11.1.3.1.6.244.146.191.226.158.141.1|2|9
|
||||
1.3.6.1.4.1.41112.1.11.1.3.1.7.244.146.191.226.158.141.1|2|1951000
|
||||
1.3.6.1.4.1.41112.1.11.1.3.1.8.244.146.191.226.158.141.1|2|1951000
|
||||
1.3.6.1.4.1.41112.1.11.1.3.1.15.244.146.191.226.158.141.1|2|4076
|
||||
1.3.6.1.4.1.41112.1.11.1.3.1.18.244.146.191.226.158.141.1|2|-56
|
||||
1.3.6.1.4.1.41112.1.11.1.3.1.19.244.146.191.226.158.141.1|2|19
|
||||
1.3.6.1.4.1.41112.1.11.1.4.1.1|2|2
|
||||
1.3.6.1.4.1.41112.1.11.1.4.2.1|2|3
|
||||
1.3.6.1.4.1.41112.1.11.1.4.3.1|4|55.935896
|
||||
1.3.6.1.4.1.41112.1.11.1.4.4.1|4|-55.624861
|
||||
1.3.6.1.4.1.41112.1.11.1.4.7.1|2|12
|
||||
1.3.6.1.4.1.41112.1.11.1.4.8.1|2|9
|
||||
Reference in New Issue
Block a user