diff --git a/html/images/logos/dahua.png b/html/images/logos/dahua.png
new file mode 100644
index 0000000000..2d59deb49d
Binary files /dev/null and b/html/images/logos/dahua.png differ
diff --git a/html/images/os/dahua.png b/html/images/os/dahua.png
new file mode 100644
index 0000000000..9251f22186
Binary files /dev/null and b/html/images/os/dahua.png differ
diff --git a/includes/definitions/dahua-nvr.yaml b/includes/definitions/dahua-nvr.yaml
new file mode 100644
index 0000000000..b1d35bbf38
--- /dev/null
+++ b/includes/definitions/dahua-nvr.yaml
@@ -0,0 +1,10 @@
+os: dahua-nvr
+text: 'Dahua NVR'
+type: appliance
+icon: dahua
+group: dahua
+over:
+ - { graph: device_bits, text: 'Device Traffic' }
+discovery:
+ - sysObjectID:
+ - .1.3.6.1.4.1.1004849.3.2.
diff --git a/tests/data/dahua-nvr.json b/tests/data/dahua-nvr.json
new file mode 100644
index 0000000000..efce353703
--- /dev/null
+++ b/tests/data/dahua-nvr.json
@@ -0,0 +1,474 @@
+{
+ "os": {
+ "discovery": {
+ "devices": [
+ {
+ "sysName": "",
+ "sysObjectID": ".1.3.6.1.4.1.1004849.3.2.10",
+ "sysDescr": "DH-NVR4108HS-8P-4KS2",
+ "sysContact": null,
+ "version": null,
+ "hardware": "",
+ "features": null,
+ "location": null,
+ "os": "dahua-nvr",
+ "type": "appliance",
+ "serial": null,
+ "icon": "dahua.png"
+ }
+ ]
+ },
+ "poller": {
+ "devices": [
+ {
+ "sysName": "",
+ "sysObjectID": ".1.3.6.1.4.1.1004849.3.2.10",
+ "sysDescr": "DH-NVR4108HS-8P-4KS2",
+ "sysContact": "",
+ "version": null,
+ "hardware": "",
+ "features": null,
+ "location": "",
+ "os": "dahua-nvr",
+ "type": "appliance",
+ "serial": null,
+ "icon": "dahua.png"
+ }
+ ]
+ }
+ },
+ "ports": {
+ "discovery": {
+ "ports": [
+ {
+ "port_descr_type": null,
+ "port_descr_descr": null,
+ "port_descr_circuit": null,
+ "port_descr_speed": null,
+ "port_descr_notes": null,
+ "ifDescr": "lo",
+ "ifName": "",
+ "portName": null,
+ "ifIndex": "1",
+ "ifSpeed": null,
+ "ifConnectorPresent": null,
+ "ifPromiscuousMode": null,
+ "ifHighSpeed": null,
+ "ifOperStatus": null,
+ "ifOperStatus_prev": null,
+ "ifAdminStatus": null,
+ "ifAdminStatus_prev": null,
+ "ifDuplex": null,
+ "ifMtu": null,
+ "ifType": null,
+ "ifAlias": "",
+ "ifPhysAddress": null,
+ "ifHardType": null,
+ "ifLastChange": "0",
+ "ifVlan": "",
+ "ifTrunk": null,
+ "ifVrf": "0",
+ "counter_in": null,
+ "counter_out": null,
+ "ignore": "0",
+ "disabled": "0",
+ "detailed": "0",
+ "deleted": "0",
+ "pagpOperationMode": null,
+ "pagpPortState": null,
+ "pagpPartnerDeviceId": null,
+ "pagpPartnerLearnMethod": null,
+ "pagpPartnerIfIndex": null,
+ "pagpPartnerGroupIfIndex": null,
+ "pagpPartnerDeviceName": null,
+ "pagpEthcOperationMode": null,
+ "pagpDeviceId": null,
+ "pagpGroupIfIndex": null,
+ "ifInUcastPkts": null,
+ "ifInUcastPkts_prev": null,
+ "ifInUcastPkts_delta": null,
+ "ifInUcastPkts_rate": null,
+ "ifOutUcastPkts": null,
+ "ifOutUcastPkts_prev": null,
+ "ifOutUcastPkts_delta": null,
+ "ifOutUcastPkts_rate": null,
+ "ifInErrors": null,
+ "ifInErrors_prev": null,
+ "ifInErrors_delta": null,
+ "ifInErrors_rate": null,
+ "ifOutErrors": null,
+ "ifOutErrors_prev": null,
+ "ifOutErrors_delta": null,
+ "ifOutErrors_rate": null,
+ "ifInOctets": null,
+ "ifInOctets_prev": null,
+ "ifInOctets_delta": null,
+ "ifInOctets_rate": null,
+ "ifOutOctets": null,
+ "ifOutOctets_prev": null,
+ "ifOutOctets_delta": null,
+ "ifOutOctets_rate": null,
+ "poll_prev": null,
+ "ifInNUcastPkts": null,
+ "ifInNUcastPkts_prev": null,
+ "ifInNUcastPkts_delta": null,
+ "ifInNUcastPkts_rate": null,
+ "ifOutNUcastPkts": null,
+ "ifOutNUcastPkts_prev": null,
+ "ifOutNUcastPkts_delta": null,
+ "ifOutNUcastPkts_rate": null,
+ "ifInDiscards": null,
+ "ifInDiscards_prev": null,
+ "ifInDiscards_delta": null,
+ "ifInDiscards_rate": null,
+ "ifOutDiscards": null,
+ "ifOutDiscards_prev": null,
+ "ifOutDiscards_delta": null,
+ "ifOutDiscards_rate": null,
+ "ifInUnknownProtos": null,
+ "ifInUnknownProtos_prev": null,
+ "ifInUnknownProtos_delta": null,
+ "ifInUnknownProtos_rate": null,
+ "ifInBroadcastPkts": null,
+ "ifInBroadcastPkts_prev": null,
+ "ifInBroadcastPkts_delta": null,
+ "ifInBroadcastPkts_rate": null,
+ "ifOutBroadcastPkts": null,
+ "ifOutBroadcastPkts_prev": null,
+ "ifOutBroadcastPkts_delta": null,
+ "ifOutBroadcastPkts_rate": null,
+ "ifInMulticastPkts": null,
+ "ifInMulticastPkts_prev": null,
+ "ifInMulticastPkts_delta": null,
+ "ifInMulticastPkts_rate": null,
+ "ifOutMulticastPkts": null,
+ "ifOutMulticastPkts_prev": null,
+ "ifOutMulticastPkts_delta": null,
+ "ifOutMulticastPkts_rate": null
+ },
+ {
+ "port_descr_type": null,
+ "port_descr_descr": null,
+ "port_descr_circuit": null,
+ "port_descr_speed": null,
+ "port_descr_notes": null,
+ "ifDescr": "eth0",
+ "ifName": "",
+ "portName": null,
+ "ifIndex": "2",
+ "ifSpeed": null,
+ "ifConnectorPresent": null,
+ "ifPromiscuousMode": null,
+ "ifHighSpeed": null,
+ "ifOperStatus": null,
+ "ifOperStatus_prev": null,
+ "ifAdminStatus": null,
+ "ifAdminStatus_prev": null,
+ "ifDuplex": null,
+ "ifMtu": null,
+ "ifType": null,
+ "ifAlias": "",
+ "ifPhysAddress": null,
+ "ifHardType": null,
+ "ifLastChange": "0",
+ "ifVlan": "",
+ "ifTrunk": null,
+ "ifVrf": "0",
+ "counter_in": null,
+ "counter_out": null,
+ "ignore": "0",
+ "disabled": "0",
+ "detailed": "0",
+ "deleted": "0",
+ "pagpOperationMode": null,
+ "pagpPortState": null,
+ "pagpPartnerDeviceId": null,
+ "pagpPartnerLearnMethod": null,
+ "pagpPartnerIfIndex": null,
+ "pagpPartnerGroupIfIndex": null,
+ "pagpPartnerDeviceName": null,
+ "pagpEthcOperationMode": null,
+ "pagpDeviceId": null,
+ "pagpGroupIfIndex": null,
+ "ifInUcastPkts": null,
+ "ifInUcastPkts_prev": null,
+ "ifInUcastPkts_delta": null,
+ "ifInUcastPkts_rate": null,
+ "ifOutUcastPkts": null,
+ "ifOutUcastPkts_prev": null,
+ "ifOutUcastPkts_delta": null,
+ "ifOutUcastPkts_rate": null,
+ "ifInErrors": null,
+ "ifInErrors_prev": null,
+ "ifInErrors_delta": null,
+ "ifInErrors_rate": null,
+ "ifOutErrors": null,
+ "ifOutErrors_prev": null,
+ "ifOutErrors_delta": null,
+ "ifOutErrors_rate": null,
+ "ifInOctets": null,
+ "ifInOctets_prev": null,
+ "ifInOctets_delta": null,
+ "ifInOctets_rate": null,
+ "ifOutOctets": null,
+ "ifOutOctets_prev": null,
+ "ifOutOctets_delta": null,
+ "ifOutOctets_rate": null,
+ "poll_prev": null,
+ "ifInNUcastPkts": null,
+ "ifInNUcastPkts_prev": null,
+ "ifInNUcastPkts_delta": null,
+ "ifInNUcastPkts_rate": null,
+ "ifOutNUcastPkts": null,
+ "ifOutNUcastPkts_prev": null,
+ "ifOutNUcastPkts_delta": null,
+ "ifOutNUcastPkts_rate": null,
+ "ifInDiscards": null,
+ "ifInDiscards_prev": null,
+ "ifInDiscards_delta": null,
+ "ifInDiscards_rate": null,
+ "ifOutDiscards": null,
+ "ifOutDiscards_prev": null,
+ "ifOutDiscards_delta": null,
+ "ifOutDiscards_rate": null,
+ "ifInUnknownProtos": null,
+ "ifInUnknownProtos_prev": null,
+ "ifInUnknownProtos_delta": null,
+ "ifInUnknownProtos_rate": null,
+ "ifInBroadcastPkts": null,
+ "ifInBroadcastPkts_prev": null,
+ "ifInBroadcastPkts_delta": null,
+ "ifInBroadcastPkts_rate": null,
+ "ifOutBroadcastPkts": null,
+ "ifOutBroadcastPkts_prev": null,
+ "ifOutBroadcastPkts_delta": null,
+ "ifOutBroadcastPkts_rate": null,
+ "ifInMulticastPkts": null,
+ "ifInMulticastPkts_prev": null,
+ "ifInMulticastPkts_delta": null,
+ "ifInMulticastPkts_rate": null,
+ "ifOutMulticastPkts": null,
+ "ifOutMulticastPkts_prev": null,
+ "ifOutMulticastPkts_delta": null,
+ "ifOutMulticastPkts_rate": null
+ }
+ ]
+ },
+ "poller": {
+ "ports": [
+ {
+ "port_descr_type": null,
+ "port_descr_descr": null,
+ "port_descr_circuit": null,
+ "port_descr_speed": null,
+ "port_descr_notes": null,
+ "ifDescr": "lo",
+ "ifName": "lo",
+ "portName": null,
+ "ifIndex": "1",
+ "ifSpeed": "10000000",
+ "ifConnectorPresent": null,
+ "ifPromiscuousMode": null,
+ "ifHighSpeed": null,
+ "ifOperStatus": "up",
+ "ifOperStatus_prev": null,
+ "ifAdminStatus": "up",
+ "ifAdminStatus_prev": null,
+ "ifDuplex": null,
+ "ifMtu": "65536",
+ "ifType": "softwareLoopback",
+ "ifAlias": "lo",
+ "ifPhysAddress": null,
+ "ifHardType": null,
+ "ifLastChange": "0",
+ "ifVlan": "",
+ "ifTrunk": null,
+ "ifVrf": "0",
+ "counter_in": null,
+ "counter_out": null,
+ "ignore": "0",
+ "disabled": "0",
+ "detailed": "0",
+ "deleted": "0",
+ "pagpOperationMode": null,
+ "pagpPortState": null,
+ "pagpPartnerDeviceId": null,
+ "pagpPartnerLearnMethod": null,
+ "pagpPartnerIfIndex": null,
+ "pagpPartnerGroupIfIndex": null,
+ "pagpPartnerDeviceName": null,
+ "pagpEthcOperationMode": null,
+ "pagpDeviceId": null,
+ "pagpGroupIfIndex": null,
+ "ifInUcastPkts": "106897",
+ "ifInUcastPkts_prev": "0",
+ "ifInUcastPkts_delta": null,
+ "ifInUcastPkts_rate": null,
+ "ifOutUcastPkts": "106897",
+ "ifOutUcastPkts_prev": "0",
+ "ifOutUcastPkts_delta": null,
+ "ifOutUcastPkts_rate": null,
+ "ifInErrors": "0",
+ "ifInErrors_prev": "0",
+ "ifInErrors_delta": null,
+ "ifInErrors_rate": null,
+ "ifOutErrors": "0",
+ "ifOutErrors_prev": "0",
+ "ifOutErrors_delta": null,
+ "ifOutErrors_rate": null,
+ "ifInOctets": "136299042",
+ "ifInOctets_prev": "0",
+ "ifInOctets_delta": null,
+ "ifInOctets_rate": null,
+ "ifOutOctets": "136299042",
+ "ifOutOctets_prev": "0",
+ "ifOutOctets_delta": null,
+ "ifOutOctets_rate": null,
+ "poll_prev": null,
+ "ifInNUcastPkts": "0",
+ "ifInNUcastPkts_prev": "0",
+ "ifInNUcastPkts_delta": null,
+ "ifInNUcastPkts_rate": null,
+ "ifOutNUcastPkts": "0",
+ "ifOutNUcastPkts_prev": "0",
+ "ifOutNUcastPkts_delta": null,
+ "ifOutNUcastPkts_rate": null,
+ "ifInDiscards": "0",
+ "ifInDiscards_prev": "0",
+ "ifInDiscards_delta": null,
+ "ifInDiscards_rate": null,
+ "ifOutDiscards": "0",
+ "ifOutDiscards_prev": "0",
+ "ifOutDiscards_delta": null,
+ "ifOutDiscards_rate": null,
+ "ifInUnknownProtos": "0",
+ "ifInUnknownProtos_prev": "0",
+ "ifInUnknownProtos_delta": null,
+ "ifInUnknownProtos_rate": null,
+ "ifInBroadcastPkts": "0",
+ "ifInBroadcastPkts_prev": "0",
+ "ifInBroadcastPkts_delta": null,
+ "ifInBroadcastPkts_rate": null,
+ "ifOutBroadcastPkts": "0",
+ "ifOutBroadcastPkts_prev": "0",
+ "ifOutBroadcastPkts_delta": null,
+ "ifOutBroadcastPkts_rate": null,
+ "ifInMulticastPkts": "0",
+ "ifInMulticastPkts_prev": "0",
+ "ifInMulticastPkts_delta": null,
+ "ifInMulticastPkts_rate": null,
+ "ifOutMulticastPkts": "0",
+ "ifOutMulticastPkts_prev": "0",
+ "ifOutMulticastPkts_delta": null,
+ "ifOutMulticastPkts_rate": null
+ },
+ {
+ "port_descr_type": null,
+ "port_descr_descr": null,
+ "port_descr_circuit": null,
+ "port_descr_speed": null,
+ "port_descr_notes": null,
+ "ifDescr": "eth0",
+ "ifName": "eth0",
+ "portName": null,
+ "ifIndex": "2",
+ "ifSpeed": "100000000",
+ "ifConnectorPresent": null,
+ "ifPromiscuousMode": null,
+ "ifHighSpeed": null,
+ "ifOperStatus": "up",
+ "ifOperStatus_prev": null,
+ "ifAdminStatus": "up",
+ "ifAdminStatus_prev": null,
+ "ifDuplex": null,
+ "ifMtu": "1500",
+ "ifType": "ethernetCsmacd",
+ "ifAlias": "eth0",
+ "ifPhysAddress": "33633a65663a",
+ "ifHardType": null,
+ "ifLastChange": "0",
+ "ifVlan": "",
+ "ifTrunk": null,
+ "ifVrf": "0",
+ "counter_in": null,
+ "counter_out": null,
+ "ignore": "0",
+ "disabled": "0",
+ "detailed": "0",
+ "deleted": "0",
+ "pagpOperationMode": null,
+ "pagpPortState": null,
+ "pagpPartnerDeviceId": null,
+ "pagpPartnerLearnMethod": null,
+ "pagpPartnerIfIndex": null,
+ "pagpPartnerGroupIfIndex": null,
+ "pagpPartnerDeviceName": null,
+ "pagpEthcOperationMode": null,
+ "pagpDeviceId": null,
+ "pagpGroupIfIndex": null,
+ "ifInUcastPkts": "740733267",
+ "ifInUcastPkts_prev": "0",
+ "ifInUcastPkts_delta": null,
+ "ifInUcastPkts_rate": null,
+ "ifOutUcastPkts": "383597040",
+ "ifOutUcastPkts_prev": "0",
+ "ifOutUcastPkts_delta": null,
+ "ifOutUcastPkts_rate": null,
+ "ifInErrors": "0",
+ "ifInErrors_prev": "0",
+ "ifInErrors_delta": null,
+ "ifInErrors_rate": null,
+ "ifOutErrors": "0",
+ "ifOutErrors_prev": "0",
+ "ifOutErrors_delta": null,
+ "ifOutErrors_rate": null,
+ "ifInOctets": "1797133182",
+ "ifInOctets_prev": "0",
+ "ifInOctets_delta": null,
+ "ifInOctets_rate": null,
+ "ifOutOctets": "3937058151",
+ "ifOutOctets_prev": "0",
+ "ifOutOctets_delta": null,
+ "ifOutOctets_rate": null,
+ "poll_prev": null,
+ "ifInNUcastPkts": "0",
+ "ifInNUcastPkts_prev": "0",
+ "ifInNUcastPkts_delta": null,
+ "ifInNUcastPkts_rate": null,
+ "ifOutNUcastPkts": "0",
+ "ifOutNUcastPkts_prev": "0",
+ "ifOutNUcastPkts_delta": null,
+ "ifOutNUcastPkts_rate": null,
+ "ifInDiscards": "0",
+ "ifInDiscards_prev": "0",
+ "ifInDiscards_delta": null,
+ "ifInDiscards_rate": null,
+ "ifOutDiscards": "0",
+ "ifOutDiscards_prev": "0",
+ "ifOutDiscards_delta": null,
+ "ifOutDiscards_rate": null,
+ "ifInUnknownProtos": "0",
+ "ifInUnknownProtos_prev": "0",
+ "ifInUnknownProtos_delta": null,
+ "ifInUnknownProtos_rate": null,
+ "ifInBroadcastPkts": "0",
+ "ifInBroadcastPkts_prev": "0",
+ "ifInBroadcastPkts_delta": null,
+ "ifInBroadcastPkts_rate": null,
+ "ifOutBroadcastPkts": "0",
+ "ifOutBroadcastPkts_prev": "0",
+ "ifOutBroadcastPkts_delta": null,
+ "ifOutBroadcastPkts_rate": null,
+ "ifInMulticastPkts": "0",
+ "ifInMulticastPkts_prev": "0",
+ "ifInMulticastPkts_delta": null,
+ "ifInMulticastPkts_rate": null,
+ "ifOutMulticastPkts": "0",
+ "ifOutMulticastPkts_prev": "0",
+ "ifOutMulticastPkts_delta": null,
+ "ifOutMulticastPkts_rate": null
+ }
+ ]
+ }
+ }
+}
diff --git a/tests/snmpsim/dahua-nvr.snmprec b/tests/snmpsim/dahua-nvr.snmprec
new file mode 100644
index 0000000000..ea9340fb6c
--- /dev/null
+++ b/tests/snmpsim/dahua-nvr.snmprec
@@ -0,0 +1,51 @@
+1.3.6.1.2.1.1.1.0|4|DH-NVR4108HS-8P-4KS2
+1.3.6.1.2.1.1.2.0|6|.1.3.6.1.4.1.1004849.3.2.10
+1.3.6.1.2.1.1.3.0|67|24641813
+1.3.6.1.2.1.1.4.0|4|
+1.3.6.1.2.1.1.5.0|4|
+1.3.6.1.2.1.1.6.0|4|
+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.2.1|4|lo
+1.3.6.1.2.1.2.2.1.2.2|4|eth0
+1.3.6.1.2.1.2.2.1.3.1|2|24
+1.3.6.1.2.1.2.2.1.3.2|2|6
+1.3.6.1.2.1.2.2.1.4.1|2|65536
+1.3.6.1.2.1.2.2.1.4.2|2|1500
+1.3.6.1.2.1.2.2.1.5.1|66|10000000
+1.3.6.1.2.1.2.2.1.5.2|66|100000000
+1.3.6.1.2.1.2.2.1.6.1|4|
+1.3.6.1.2.1.2.2.1.6.2|4|3c:ef:8c:8:4e:1e
+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.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.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.10.1|65|136299042
+1.3.6.1.2.1.2.2.1.10.2|65|1797133182
+1.3.6.1.2.1.2.2.1.11.1|65|106897
+1.3.6.1.2.1.2.2.1.11.2|65|740733267
+1.3.6.1.2.1.2.2.1.12.1|65|0
+1.3.6.1.2.1.2.2.1.12.2|65|0
+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.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.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.16.1|65|136299042
+1.3.6.1.2.1.2.2.1.16.2|65|3937058151
+1.3.6.1.2.1.2.2.1.17.1|65|106897
+1.3.6.1.2.1.2.2.1.17.2|65|383597040
+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.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.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.21.1|66|0
+1.3.6.1.2.1.2.2.1.21.2|66|0
+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.6.3.10.2.1.3.0|2|246422