Issues (2963)

includes/callback.php (1 issue)

Labels
Severity
1
<?php
2
3
/*
4
 * LibreNMS
5
 *
6
 * Copyright (c) 2014 Neil Lathwood <https://github.com/laf/ http://www.lathwood.co.uk/fa>
7
 *
8
 * This program is free software: you can redistribute it and/or modify it
9
 * under the terms of the GNU General Public License as published by the
10
 * Free Software Foundation, either version 3 of the License, or (at your
11
 * option) any later version.  Please see LICENSE.txt at the top level of
12
 * the source code distribution for details.
13
 */
14
15
$enabled = dbFetchCell("SELECT `value` FROM `callback` WHERE `name` = 'enabled'");
16
if ($enabled == 1) {
17
    if (dbFetchCell("SELECT `value` FROM `callback` WHERE `name` = 'uuid'") == '') {
18
        dbInsert(['name' => 'uuid', 'value' => guidv4(openssl_random_pseudo_bytes(16))], 'callback');
19
    }
20
21
    $uuid = dbFetchCell("SELECT `value` FROM `callback` WHERE `name` = 'uuid'");
22
23
    $version = version_info();
24
    $queries = [
25
        'alert_rules'     => 'SELECT COUNT(*) AS `total`,`severity` FROM `alert_rules` WHERE `disabled`=0 GROUP BY `severity`',
26
        'alert_templates' => 'SELECT COUNT(*) AS `total` FROM `alert_templates`',
27
        'api_tokens'      => 'SELECT COUNT(*) AS `total` FROM `api_tokens` WHERE `disabled`=0',
28
        'applications'    => 'SELECT COUNT(*) AS `total`,`app_type` FROM `applications` GROUP BY `app_type`',
29
        'bgppeer_state'   => 'SELECT COUNT(*) AS `total`,`bgpPeerState` FROM `bgpPeers` GROUP BY `bgpPeerState`',
30
        'bgppeer_status'  => 'SELECT COUNT(*) AS `total`,`bgpPeerAdminStatus` FROM `bgpPeers` GROUP BY `bgpPeerAdminStatus`',
31
        'bills'           => 'SELECT COUNT(*) AS `total`,`bill_type` FROM `bills` GROUP BY `bill_type`',
32
        'cef'             => 'SELECT COUNT(*) AS `total` FROM `cef_switching`',
33
        'cisco_asa'       => 'SELECT COUNT(*) AS `total`,`oid` FROM `ciscoASA` WHERE `disabled` = 0 GROUP BY `oid`',
34
        'mempool'         => 'SELECT COUNT(*) AS `total`,`mempool_descr` FROM `mempools` GROUP BY `mempool_descr`',
35
        'dbschema'        => 'SELECT COUNT(*) AS `total`, COUNT(*) AS `version` FROM `migrations`',
36
        'snmp_version'    => 'SELECT COUNT(*) AS `total`,`snmpver` FROM `devices` GROUP BY `snmpver`',
37
        'os'              => 'SELECT COUNT(*) AS `total`,`os` FROM `devices` GROUP BY `os`',
38
        'type'            => 'SELECT COUNT(*) AS `total`,`type` FROM `devices` GROUP BY `type`',
39
        'hardware'        => 'SELECT COUNT(*) AS `total`, `hardware` FROM `devices` GROUP BY `hardware`',
40
        'ipsec'           => 'SELECT COUNT(*) AS `total` FROM `ipsec_tunnels`',
41
        'ipv4_addresses'  => 'SELECT COUNT(*) AS `total` FROM `ipv4_addresses`',
42
        'ipv4_macaddress' => 'SELECT COUNT(*) AS `total` FROM ipv4_mac',
43
        'ipv4_networks'   => 'SELECT COUNT(*) AS `total` FROM ipv4_networks',
44
        'ipv6_addresses'  => 'SELECT COUNT(*) AS `total` FROM `ipv6_addresses`',
45
        'ipv6_networks'   => 'SELECT COUNT(*) AS `total` FROM `ipv6_networks`',
46
        'xdp'             => 'SELECT COUNT(*) AS `total`,`protocol` FROM `links` GROUP BY `protocol`',
47
        'ospf'            => 'SELECT COUNT(*) AS `total`,`ospfVersionNumber` FROM `ospf_instances` GROUP BY `ospfVersionNumber`',
48
        'ospf_links'      => 'SELECT COUNT(*) AS `total`,`ospfIfType` FROM `ospf_ports` GROUP BY `ospfIfType`',
49
        'arch'            => 'SELECT COUNT(*) AS `total`,`arch` FROM `packages` GROUP BY `arch`',
50
        'pollers'         => 'SELECT COUNT(*) AS `total` FROM `pollers`',
51
        'port_type'       => 'SELECT COUNT(*) AS `total`,`ifType` FROM `ports` GROUP BY `ifType`',
52
        'port_ifspeed'    => 'SELECT COUNT(*) AS `total`,ROUND(`ifSpeed`/1000/1000) FROM `ports` GROUP BY `ifSpeed`',
53
        'port_vlans'      => 'SELECT COUNT(*) AS `total`,`state` FROM `ports_vlans` GROUP BY `state`',
54
        'processes'       => 'SELECT COUNT(*) AS `total` FROM `processes`',
55
        'processors'      => 'SELECT COUNT(*) AS `total`,`processor_type` FROM `processors` GROUP BY `processor_type`',
56
        'pseudowires'     => 'SELECT COUNT(*) AS `total` FROM `pseudowires`',
57
        'sensors'         => 'SELECT COUNT(*) AS `total`,`sensor_class` FROM `sensors` GROUP BY `sensor_class`',
58
        'sla'             => 'SELECT COUNT(*) AS `total`,`rtt_type` FROM `slas` GROUP BY `rtt_type`',
59
        'wireless'        => 'SELECT COUNT(*) AS `total`,`sensor_class` FROM `wireless_sensors` GROUP BY `sensor_class`',
60
        'storage'         => 'SELECT COUNT(*) AS `total`,`storage_type` FROM `storage` GROUP BY `storage_type`',
61
        'toner'           => 'SELECT COUNT(*) AS `total`,`supply_type` FROM `printer_supplies` GROUP BY `supply_type`',
62
        'vlans'           => 'SELECT COUNT(*) AS `total`,`vlan_type` FROM `vlans` GROUP BY `vlan_type`',
63
        'vminfo'          => 'SELECT COUNT(*) AS `total`,`vm_type` FROM `vminfo` GROUP BY `vm_type`',
64
        'vmware'          => 'SELECT COUNT(*) AS `total` FROM `vminfo`',
65
        'vrfs'            => 'SELECT COUNT(*) AS `total` FROM `vrfs`',
66
        'mysql_version'   => 'SELECT 1 AS `total`, @@version AS `version`',
67
    ];
68
69
    foreach ($queries as $name => $query) {
70
        $data = dbFetchRows($query);
71
        $response[$name] = $data;
72
    }
73
    $response['php_version'][] = ['total' => 1, 'version' => $version['php_ver']];
74
    $response['python_version'][] = ['total' => 1, 'version' => $version['python_ver']];
75
    $response['rrdtool_version'][] = ['total' => 1, 'version' => $version['rrdtool_ver']];
76
    $response['netsnmp_version'][] = ['total' => 1, 'version' => $version['netsnmp_ver']];
77
78
    // collect sysDescr and sysObjectID for submission
79
    $device_info = dbFetchRows('SELECT COUNT(*) AS `count`,`os`, `sysDescr`, `sysObjectID` FROM `devices`
80
        WHERE `sysDescr` IS NOT NULL AND `sysObjectID` IS NOT NULL GROUP BY `os`, `sysDescr`, `sysObjectID`');
81
82
    // sanitize sysDescr
83
    $device_info = array_map(function ($entry) {
84
        // remove hostnames from linux, macosx, and SunOS
85
        $entry['sysDescr'] = preg_replace_callback('/^(Linux |Darwin |FreeBSD |SunOS )[A-Za-z0-9._\-]+ ([0-9.]{3,9})/', function ($matches) {
86
            return $matches[1] . 'hostname ' . $matches[2];
87
        }, $entry['sysDescr']);
88
89
        // wipe serial numbers, preserve the format
90
        $sn_patterns = ['/[A-Z]/', '/[a-z]/', '/[0-9]/'];
91
        $sn_replacements = ['A', 'a', '0'];
92
        $entry['sysDescr'] = preg_replace_callback(
93
            '/((s\/?n|serial num(ber)?)[:=]? ?)([a-z0-9.\-]{4,16})/i',
94
            function ($matches) use ($sn_patterns, $sn_replacements) {
95
                return $matches[1] . preg_replace($sn_patterns, $sn_replacements, $matches[4]);
96
            },
97
            $entry['sysDescr']
98
        );
99
100
        return $entry;
101
    }, $device_info);
102
103
    $output = [
104
        'uuid' => $uuid,
105
        'data' => $response,
106
        'info' => $device_info,
107
    ];
108
    $data = json_encode($output);
109
    $submit = ['data' => $data];
110
111
    $fields = '';
112
    foreach ($submit as $key => $value) {
113
        $fields .= $key . '=' . $value . '&';
114
    }
115
116
    rtrim($fields, '&');
117
118
    $post = curl_init();
119
    set_curl_proxy($post);
120
    curl_setopt($post, CURLOPT_URL, \LibreNMS\Config::get('callback_post'));
121
    curl_setopt($post, CURLOPT_POST, count($submit));
122
    curl_setopt($post, CURLOPT_POSTFIELDS, $fields);
123
    curl_setopt($post, CURLOPT_RETURNTRANSFER, 1);
124
    $result = curl_exec($post);
125
} elseif ($enabled == 2) {
126
    $uuid = dbFetchCell("SELECT `value` FROM `callback` WHERE `name` = 'uuid'");
127
    $fields = "uuid=$uuid";
128
129
    $clear = curl_init();
130
    set_curl_proxy($clear);
131
    curl_setopt($clear, CURLOPT_URL, \LibreNMS\Config::get('callback_clear'));
132
    curl_setopt($clear, CURLOPT_POST, count($clear));
0 ignored issues
show
$clear of type CurlHandle|resource is incompatible with the type Countable|array expected by parameter $value of count(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

132
    curl_setopt($clear, CURLOPT_POST, count(/** @scrutinizer ignore-type */ $clear));
Loading history...
133
    curl_setopt($clear, CURLOPT_POSTFIELDS, $fields);
134
    curl_setopt($clear, CURLOPT_RETURNTRANSFER, 1);
135
    $result = curl_exec($clear);
136
    dbDelete('callback', '`name`="uuid"', []);
137
    dbUpdate(['value' => '0'], 'callback', '`name` = "enabled"', []);
138
}
139