Issues (2963)

includes/html/pages/addhost.inc.php (1 issue)

1
<?php
2
3
use LibreNMS\Config;
4
use LibreNMS\Exceptions\HostUnreachableException;
5
use LibreNMS\Util\IP;
6
7
$no_refresh = true;
8
9
if (! Auth::user()->hasGlobalAdmin()) {
10
    include 'includes/html/error-no-perm.inc.php';
11
12
    exit;
13
}
14
15
echo '<div class="row">
16
            <div class="col-sm-3">
17
            </div>
18
            <div class="col-sm-6">';
19
20
// first load enabled, after that check snmp variable
21
$snmp_enabled = ! isset($_POST['hostname']) || isset($_POST['snmp']);
22
23
if (! empty($_POST['hostname'])) {
24
    $hostname = strip_tags($_POST['hostname']);
25
    if (! \LibreNMS\Util\Validate::hostname($hostname) && ! IP::isValid($hostname)) {
26
        print_error("Invalid hostname or IP: $hostname");
27
    }
28
29
    if (Auth::user()->hasGlobalRead()) {
30
        // Settings common to SNMPv2 & v3
31
        if ($_POST['port']) {
32
            $port = strip_tags($_POST['port']);
33
        } else {
34
            $port = Config::get('snmp.port');
35
        }
36
37
        if ($_POST['transport']) {
38
            $transport = strip_tags($_POST['transport']);
39
        } else {
40
            $transport = 'udp';
41
        }
42
43
        $additional = [];
44
        if (! $snmp_enabled) {
45
            $snmpver = 'v2c';
46
            $additional = [
47
                'snmp_disable' => 1,
48
                'os'           => $_POST['os'] ? $_POST['os_id'] : 'ping',
49
                'hardware'     => $_POST['hardware'],
50
                'sysName'      => $_POST['sysName'],
51
            ];
52
        } elseif ($_POST['snmpver'] === 'v2c' || $_POST['snmpver'] === 'v1') {
53
            if ($_POST['community']) {
54
                Config::set('snmp.community', [$_POST['community']]);
55
            }
56
57
            $snmpver = strip_tags($_POST['snmpver']);
58
            print_message("Adding host $hostname communit" . (count(Config::get('snmp.community')) == 1 ? 'y' : 'ies') . ' ' . implode(', ', Config::get('snmp.community')) . " port $port using $transport");
59
        } elseif ($_POST['snmpver'] === 'v3') {
60
            $v3 = [
61
                'authlevel'  => strip_tags($_POST['authlevel']),
62
                'authname'   => $_POST['authname'],
63
                'authpass'   => $_POST['authpass'],
64
                'authalgo'   => strip_tags($_POST['authalgo']),
65
                'cryptopass' => $_POST['cryptopass'],
66
                'cryptoalgo' => $_POST['cryptoalgo'],
67
            ];
68
69
            $v3_config = Config::get('snmp.v3');
70
            array_unshift($v3_config, $v3);
0 ignored issues
show
It seems like $v3_config can also be of type null; however, parameter $array of array_unshift() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

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

70
            array_unshift(/** @scrutinizer ignore-type */ $v3_config, $v3);
Loading history...
71
            Config::set('snmp.v3', $v3_config);
72
73
            $snmpver = 'v3';
74
            print_message("Adding SNMPv3 host: $hostname port: $port");
75
        } else {
76
            print_error('Unsupported SNMP Version. There was a dropdown menu, how did you reach this error ?');
77
        }//end if
78
79
        $poller_group = strip_tags($_POST['poller_group']);
80
        $force_add = ($_POST['force_add'] == 'on');
81
82
        $port_assoc_mode = strip_tags($_POST['port_assoc_mode']);
83
        try {
84
            $device_id = addHost($hostname, $snmpver, $port, $transport, $poller_group, $force_add, $port_assoc_mode, $additional);
85
            $link = \LibreNMS\Util\Url::deviceUrl($device_id);
86
            print_message("Device added <a href='$link'>$hostname ($device_id)</a>");
87
        } catch (HostUnreachableException $e) {
88
            print_error($e->getMessage());
89
            foreach ($e->getReasons() as $reason) {
90
                print_error($reason);
91
            }
92
        } catch (Exception $e) {
93
            print_error($e->getMessage());
94
        }
95
    } else {
96
        print_error("You don't have the necessary privileges to add hosts.");
97
    }
98
}
99
echo '    </div>
100
        <div class="col-sm-3">
101
        </div>
102
    </div>';
103
104
$pagetitle[] = 'Add host';
105
106
?>
107
108
<div class="row">
109
  <div class="col-sm-3">
110
  </div>
111
  <div class="col-sm-6">
112
<form name="form1" method="post" action="" class="form-horizontal" role="form">
113
    <?php echo csrf_field() ?>
114
  <div><h2>Add Device</h2></div>
115
  <div class="alert alert-info">Devices will be checked for Ping/SNMP reachability before being probed.</div>
116
  <div class="well well-lg">
117
      <div class="form-group">
118
          <label for="hostname" class="col-sm-3 control-label">Hostname or IP</label>
119
          <div class="col-sm-9">
120
              <input type="text" id="hostname" name="hostname" class="form-control input-sm" placeholder="Hostname">
121
          </div>
122
      </div>
123
      <div class='form-group'>
124
        <label for='hardware' class='col-sm-3 control-label'>SNMP</label>
125
        <div class='col-sm-4'>
126
            <input type="checkbox" id="snmp" name="snmp" data-size="small" onChange="disableSnmp(this);" checked>
127
        </div>
128
    </div>
129
    <div id='snmp_override' style="display: none;">
130
        <div class='form-group'>
131
            <label for='sysName' class='col-sm-3 control-label'>sysName (optional)</label>
132
            <div class='col-sm-9'>
133
                <input id='sysName' class='form-control' name='sysName' placeholder="sysName (optional)"/>
134
            </div>
135
        </div>
136
        <div class='form-group'>
137
            <label for='hardware' class='col-sm-3 control-label'>Hardware (optional)</label>
138
            <div class='col-sm-9'>
139
                <input id='hardware' class='form-control' name='hardware' placeholder="Hardware (optional)"/>
140
            </div>
141
        </div>
142
        <div class='form-group'>
143
            <label for='os' class='col-sm-3 control-label'>OS (optional)</label>
144
            <div class='col-sm-9'>
145
                <input id='os' class='form-control' name='os' placeholder="OS (optional)"/>
146
                <input type='hidden' id='os_id' class='form-control' name='os_id' />
147
            </div>
148
        </div>
149
    </div>
150
    <div id="snmp_conf" style="display: block;">
151
        <div class="form-group">
152
          <label for="snmpver" class="col-sm-3 control-label">SNMP Version</label>
153
          <div class="col-sm-3">
154
            <select name="snmpver" id="snmpver" class="form-control input-sm" onChange="changeForm();">
155
              <option value="v1">v1</option>
156
              <option value="v2c" selected>v2c</option>
157
              <option value="v3">v3</option>
158
            </select>
159
          </div>
160
          <div class="col-sm-3">
161
            <input type="text" name="port" placeholder="port" class="form-control input-sm">
162
          </div>
163
          <div class="col-sm-3">
164
            <select name="transport" id="transport" class="form-control input-sm">
165
<?php
166
foreach (Config::get('snmp.transports') as $transport) {
167
    echo "<option value='" . $transport . "'";
168
    if ($transport == $device['transport']) {
169
        echo " selected='selected'";
170
    }
171
172
    echo '>' . $transport . '</option>';
173
}
174
?>
175
            </select>
176
          </div>
177
        </div>
178
        <div class="form-group">
179
          <label for="port_association_mode" class="col-sm-3 control-label">Port Association Mode</label>
180
          <div class="col-sm-3">
181
            <select name="port_assoc_mode" id="port_assoc_mode" class="form-control input-sm">
182
<?php
183
184
foreach (get_port_assoc_modes() as $mode) {
185
    $selected = '';
186
    if ($mode == Config::get('default_port_association_mode')) {
187
        $selected = 'selected';
188
    }
189
190
    echo "              <option value=\"$mode\" $selected>$mode</option>\n";
191
}
192
193
['sha2' => $snmpv3_sha2, 'aes256' => $snmpv3_aes256] = snmpv3_capabilities();
194
?>
195
            </select>
196
          </div>
197
        </div>
198
        <div id="snmpv1_2">
199
          <div class="form-group">
200
            <div class="col-sm-12 alert alert-info">
201
              <label class="control-label text-left input-sm">SNMPv1/2c Configuration</label>
202
            </div>
203
          </div>
204
          <div class="form-group">
205
            <label for="community" class="col-sm-3 control-label">Community</label>
206
            <div class="col-sm-9">
207
              <input type="text" name="community" id="community" placeholder="Community" class="form-control input-sm">
208
            </div>
209
          </div>
210
        </div>
211
        <div id="snmpv3">
212
          <div class="form-group">
213
            <div class="col-sm-12 alert alert-info">
214
              <label class="control-label text-left input-sm">SNMPv3 Configuration</label>
215
            </div>
216
          </div>
217
          <div class="form-group">
218
            <label for="authlevel" class="col-sm-3 control-label">Auth Level</label>
219
            <div class="col-sm-3">
220
              <select name="authlevel" id="authlevel" class="form-control input-sm">
221
                <option value="noAuthNoPriv" selected>noAuthNoPriv</option>
222
                <option value="authNoPriv">authNoPriv</option>
223
                <option value="authPriv">authPriv</option>
224
              </select>
225
            </div>
226
          </div>
227
          <div class="form-group">
228
            <label for="authname" class="col-sm-3 control-label">Auth User Name</label>
229
            <div class="col-sm-9">
230
              <input type="text" name="authname" id="authname" class="form-control input-sm" autocomplete="off">
231
            </div>
232
          </div>
233
          <div class="form-group">
234
            <label for="authpass" class="col-sm-3 control-label">Auth Password</label>
235
            <div class="col-sm-9">
236
              <input type="text" name="authpass" id="authpass" placeholder="AuthPass" class="form-control input-sm" autocomplete="off">
237
            </div>
238
          </div>
239
          <div class="form-group">
240
            <label for="authalgo" class="col-sm-3 control-label">Auth Algorithm</label>
241
            <div class="col-sm-9">
242
              <select name="authalgo" id="authalgo" class="form-control input-sm">
243
                <option value="MD5" selected>MD5</option>
244
                <option value="SHA">SHA</option>
245
                <option value="SHA-224"<?= $snmpv3_sha2 ?: ' disabled'?>>SHA-224</option>
246
                <option value="SHA-256"<?= $snmpv3_sha2 ?: ' disabled'?>>SHA-256</option>
247
                <option value="SHA-384"<?= $snmpv3_sha2 ?: ' disabled'?>>SHA-384</option>
248
                <option value="SHA-512"<?= $snmpv3_sha2 ?: ' disabled'?>>SHA-512</option>
249
              </select>
250
              <?php if (! $snmpv3_sha2) {?>
251
              <label class="text-left"><small>Some options are disabled. <a href="https://docs.librenms.org/Support/FAQ/#optional-requirements-for-snmpv3-sha2-auth">Read more here</a></small></label>
252
              <?php } ?>
253
            </div>
254
          </div>
255
          <div class="form-group">
256
            <label for="cryptopass" class="col-sm-3 control-label">Crypto Password</label>
257
            <div class="col-sm-9">
258
              <input type="text" name="cryptopass" id="cryptopass" placeholder="Crypto Password" class="form-control input-sm" autocomplete="off">
259
            </div>
260
          </div>
261
          <div class="form-group">
262
            <label for="cryptoalgo" class="col-sm-3 control-label">Crypto Algorithm</label>
263
            <div class="col-sm-9">
264
              <select name="cryptoalgo" id="cryptoalgo" class="form-control input-sm">
265
                <option value="AES" selected>AES</option>
266
                <option value="AES-192"<?= $snmpv3_aes256 ?: ' disabled'?>>AES-192</option>
267
                <option value="AES-256"<?= $snmpv3_aes256 ?: ' disabled'?>>AES-256</option>
268
                <option value="AES-256-C"<?= $snmpv3_aes256 ?: ' disabled'?>>AES-256-C</option>
269
                <option value="DES">DES</option>
270
              </select>
271
              <?php if (! $snmpv3_aes256) {?>
272
              <label class="text-left"><small>Some options are disabled. <a href="https://docs.librenms.org/Support/FAQ/#optional-requirements-for-snmpv3-sha2-auth">Read more here</a></small></label>
273
              <?php } ?>
274
            </div>
275
          </div>
276
        </div>
277
      </div>
278
<?php
279
if (Config::get('distributed_poller') === true) {
280
    echo '
281
          <div class="form-group">
282
              <label for="poller_group" class="col-sm-3 control-label">Poller Group</label>
283
              <div class="col-sm-9">
284
                  <select name="poller_group" id="poller_group" class="form-control input-sm">
285
                      <option value="0"> Default poller group</option>
286
    ';
287
288
    foreach (dbFetchRows('SELECT `id`,`group_name` FROM `poller_groups` ORDER BY `group_name`') as $group) {
289
        echo '<option value="' . $group['id'] . '">' . $group['group_name'] . '</option>';
290
    }
291
292
    echo '
293
                  </select>
294
              </div>
295
          </div>
296
    ';
297
}//endif
298
?>
299
      <div class="form-group">
300
          <label for="force_add" class="col-sm-3 control-label">Force add<br><small>(No ICMP or SNMP checks performed)</small></label>
301
          <div class="col-sm-9">
302
                  <input type="checkbox" name="force_add" id="force_add" data-size="small">
303
          </div>
304
      </div>
305
    <hr>
306
    <center><button type="submit" class="btn btn-default" name="Submit">Add Device</button></center>
307
  </div>
308
</form>
309
  </div>
310
  <div class="col-sm-3">
311
  </div>
312
</div>
313
<script>
314
    function changeForm() {
315
        snmpVersion = $("#snmpver").val();
316
        if(snmpVersion == 'v1' || snmpVersion == 'v2c') {
317
            $('#snmpv1_2').show();
318
            $('#snmpv3').hide();
319
        }
320
        else if(snmpVersion == 'v3') {
321
            $('#snmpv1_2').hide();
322
            $('#snmpv3').show();
323
        }
324
    }
325
    $('#snmpv3').toggle();
326
327
    function disableSnmp(e) {
328
        if(e.checked) {
329
            $('#snmp_conf').show();
330
            $('#snmp_override').hide();
331
        } else {
332
            $('#snmp_conf').hide();
333
            $('#snmp_override').show();
334
        }
335
    }
336
337
    var os_suggestions = new Bloodhound({
338
        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('text'),
339
        queryTokenizer: Bloodhound.tokenizers.whitespace,
340
        remote: {
341
            url: "ajax_ossuggest.php?term=%QUERY",
342
            filter: function (output) {
343
                return $.map(output, function (item) {
344
                    return {
345
                        text: item.text,
346
                        os: item.os,
347
                    };
348
                });
349
            },
350
            wildcard: "%QUERY"
351
        }
352
    });
353
    os_suggestions.initialize();
354
    $('#os').typeahead({
355
            hint: true,
356
            highlight: true,
357
            minLength: 1,
358
            classNames: {
359
                menu: 'typeahead-left'
360
            }
361
        },
362
        {
363
            source: os_suggestions.ttAdapter(),
364
            async: true,
365
            displayKey: 'text',
366
            valueKey: 'os',
367
            templates: {
368
                suggestion: Handlebars.compile('<p>&nbsp;{{text}}</p>')
369
            },
370
            limit: 20
371
        });
372
373
    $("#os").on("typeahead:selected typeahead:autocompleted", function(e,datum) {
374
        $("#os_id").val(datum.os);
375
        $("#os").html('<mark>' + datum.text + '</mark>');
376
    });
377
378
    $("[name='snmp']").bootstrapSwitch('offColor','danger');
379
    $("[name='force_add']").bootstrapSwitch();
380
<?php
381
if (! $snmp_enabled) {
382
    echo '  $("[name=\'snmp\']").trigger(\'click\');';
383
}
384
?>
385
</script>
386