Reject API device_add that are missing snmp info (#16314)

This commit is contained in:
Tony Murray
2024-08-27 07:08:19 -05:00
committed by GitHub
parent 3e3d09bb26
commit 9e4b2fa3a3
2 changed files with 29 additions and 1 deletions

View File

@@ -167,6 +167,30 @@ class Device extends BaseModel
return null; return null;
} }
public function hasSnmpInfo(): bool
{
if ($this->snmpver == 'v3') {
if ($this->authlevel == 'authNoPriv') {
return ! empty($this->authname) && ! empty($this->authpass);
}
if ($this->authlevel == 'authPriv') {
return ! empty($this->authname)
&& ! empty($this->authpass)
&& ! empty($this->cryptoalgo)
&& ! empty($this->cryptopass);
}
return $this->authlevel !== 'noAuthNoPriv'; // reject if not noAuthNoPriv
}
if ($this->snmpver == 'v2c' || $this->snmpver == 'v1') {
return ! empty($this->community);
}
return false; // no known snmpver
}
/** /**
* Get VRF contexts to poll. * Get VRF contexts to poll.
* If no contexts are found, return the default context '' * If no contexts are found, return the default context ''

View File

@@ -437,14 +437,18 @@ function add_device(Illuminate\Http\Request $request)
$device->snmpver = $data['version']; $device->snmpver = $data['version'];
} }
$force_add = ! empty($data['force_add']);
if (! empty($data['snmp_disable'])) { if (! empty($data['snmp_disable'])) {
$device->os = $data['os'] ?? 'ping'; $device->os = $data['os'] ?? 'ping';
$device->sysName = $data['sysName'] ?? ''; $device->sysName = $data['sysName'] ?? '';
$device->hardware = $data['hardware'] ?? ''; $device->hardware = $data['hardware'] ?? '';
$device->snmp_disable = 1; $device->snmp_disable = 1;
} elseif ($force_add && ! $device->hasSnmpInfo()) {
return api_error(400, 'SNMP information is required when force adding a device');
} }
(new ValidateDeviceAndCreate($device, ! empty($data['force_add']), ! empty($data['ping_fallback'])))->execute(); (new ValidateDeviceAndCreate($device, $force_add, ! empty($data['ping_fallback'])))->execute();
} catch (Exception $e) { } catch (Exception $e) {
return api_error(500, $e->getMessage()); return api_error(500, $e->getMessage());
} }