1<?php
2
3echo 'Printer Status and Error State ';
4$state = snmp_get($device, 'hrDeviceStatus.1', '-Ovqe', 'HOST-RESOURCES-MIB');
5if (is_numeric($state)) {
6    //Create State Index
7    $state_name = 'hrDeviceStatus';
8    create_state_index(
9        $state_name,
10        [
11            ['value' => 1, 'generic' => 3, 'graph' => 0, 'descr' => 'Unknown'],
12            ['value' => 2, 'generic' => 0, 'graph' => 0, 'descr' => 'Running'],
13            ['value' => 3, 'generic' => 1, 'graph' => 0, 'descr' => 'Warning'],
14            ['value' => 4, 'generic' => 0, 'graph' => 0, 'descr' => 'Testing'],
15            ['value' => 5, 'generic' => 2, 'graph' => 0, 'descr' => 'Down'],
16        ]
17    );
18    $sensor_index = 0;
19    discover_sensor(
20        $valid['sensor'],
21        'state',
22        $device,
23        '.1.3.6.1.2.1.25.3.2.1.5.1',
24        $sensor_index,
25        $state_name,
26        'Printer Device Status',
27        1,
28        1,
29        null,
30        null,
31        null,
32        null,
33        $state,
34        'snmp',
35        0
36    );
37    //Create Sensor To State Index
38    create_sensor_to_state_index($device, $state_name, $sensor_index);
39}
40
41$state = snmp_get($device, 'hrPrinterDetectedErrorState.1', '-Ovqe', 'HOST-RESOURCES-MIB');
42if ($state) {
43    // https://www.ietf.org/rfc/rfc1759.txt hrPrinterDetectedErrorState
44    //Create State Index
45    $printer_states =
46        [
47            ['value' => 0, 'generic' => 0, 'graph' => 0, 'descr' => 'Normal'],
48            ['value' => 1, 'generic' => 1, 'graph' => 0, 'descr' => 'Paper Low'],
49            ['value' => 2, 'generic' => 2, 'graph' => 0, 'descr' => 'No Paper'],
50            ['value' => 3, 'generic' => 1, 'graph' => 0, 'descr' => 'Toner Low'],
51            ['value' => 4, 'generic' => 2, 'graph' => 0, 'descr' => 'No Toner'],
52            ['value' => 5, 'generic' => 2, 'graph' => 0, 'descr' => 'Door Open'],
53            ['value' => 6, 'generic' => 2, 'graph' => 0, 'descr' => 'Jammed'],
54            ['value' => 7, 'generic' => 2, 'graph' => 0, 'descr' => 'Offline'],
55            ['value' => 8, 'generic' => 2, 'graph' => 0, 'descr' => 'Service Needed'],
56            ['value' => 9, 'generic' => 1, 'graph' => 0, 'descr' => 'Warning, multiple issues'],
57            ['value' => 10, 'generic' => 2, 'graph' => 0, 'descr' => 'Critical, multiple issues'],
58        ];
59    $bit_flags = q_bridge_bits2indices($state);
60    $is_critical = false;
61    if (count($bit_flags) == 0) {
62        $state = 0;
63    } else {
64        for ($i = 0; $i < count($bit_flags); $i++) {
65            // second octet of error flags not reliable, skipping
66            if ($bit_flags[$i] > 8) {
67                continue;
68            }
69            $state = $printer_states[$bit_flags[$i]]['value'];
70            if ($printer_states[$bit_flags[$i]]['generic'] == 2) {
71                $is_critical = true;
72                break;
73            }
74        }
75        // cannot create an index for each bit combination, instead warning or critical
76        if (count($bit_flags) > 1) {
77            $state = $is_critical ? 10 : 9;
78        }
79    }
80
81    $state_name = 'hrPrinterDetectedErrorState';
82    create_state_index($state_name, $printer_states);
83
84    d_echo('Printer error state: ' . $state_name . ': ' . $state);
85    $sensor_index = 0;
86    discover_sensor(
87        $valid['sensor'],
88        'state',
89        $device,
90        '.1.3.6.1.2.1.25.3.5.1.2.1',
91        $sensor_index,
92        $state_name,
93        'Printer Error Status',
94        1,
95        1,
96        null,
97        null,
98        null,
99        null,
100        $state,
101        'snmp',
102        0
103    );
104
105    //Create Sensor To State Index
106    create_sensor_to_state_index($device, $state_name, $sensor_index);
107}
108