diff --git a/doc/API/API-Docs.md b/doc/API/API-Docs.md
index 17b34e753..e879fe637 100644
--- a/doc/API/API-Docs.md
+++ b/doc/API/API-Docs.md
@@ -18,6 +18,7 @@
- [`list_devices`](#api-route-10)
- [`add_device`](#api-route-11)
- [`list_oxidized`](#api-route-21)
+ - [`update_device_field`](#api-route-update_device_field)
- [`routing`](#api-routing)
- [`list_bgp`](#api-route-1)
- [`switching`](#api-switching)
@@ -462,6 +463,33 @@ Output:
]
```
+### Function: `update_device_field` [`top`](#top)
+
+Update devices field in the database.
+
+Route: /api/v0/devices/:hostname
+
+Input (JSON):
+
+ - field: The column name within the database
+ - data: The data to update the column with
+
+Examples:
+```curl
+curl -X PATCH -d '{"field": "notes", "data": "This server should be kept online"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost
+```
+
+Output:
+
+```text
+[
+ {
+ "status": "ok",
+ "message": "Device notes has been updated"
+ }
+]
+```
+
## `Routing` [`top`](#top)
### Function: `list_bgp` [`top`](#top)
diff --git a/html/api_v0.php b/html/api_v0.php
index a64bab30d..426591162 100644
--- a/html/api_v0.php
+++ b/html/api_v0.php
@@ -42,6 +42,7 @@ $app->group(
// api/v0/devices/$hostname
$app->get('/:hostname', 'authToken', 'get_device')->name('get_device');
// api/v0/devices/$hostname
+ $app->patch('/:hostname', 'authToken', 'update_device')->name('update_device_field');
$app->get('/:hostname/vlans', 'authToken', 'get_vlans')->name('get_vlans');
// api/v0/devices/$hostname/vlans
$app->get('/:hostname/graphs', 'authToken', 'get_graphs')->name('get_graphs');
diff --git a/html/includes/api_functions.inc.php b/html/includes/api_functions.inc.php
index 7a903bc65..9caa5c2b5 100644
--- a/html/includes/api_functions.inc.php
+++ b/html/includes/api_functions.inc.php
@@ -978,3 +978,39 @@ function list_bills() {
$app->response->headers->set('Content-Type', 'application/json');
echo _json_encode($output);
}
+
+function update_device() {
+ global $config;
+ $app = \Slim\Slim::getInstance();
+ $router = $app->router()->getCurrentRoute()->getParams();
+ $status = 'error';
+ $code = 500;
+ $hostname = $router['hostname'];
+ // use hostname as device_id if it's all digits
+ $device_id = ctype_digit($hostname) ? $hostname : getidbyname($hostname);
+ $data = json_decode(file_get_contents('php://input'), true);
+ $bad_fields = array('id','hostname');
+ if (empty($data['field'])) {
+ $message = 'Device field to patch has not been supplied';
+ }
+ elseif (in_array($data['field'], $bad_fields)) {
+ $message = 'Device field is not allowed to be updated';
+ }
+ else {
+ if (dbUpdate(array(mres($data['field']) => mres($data['data'])), 'devices', '`device_id`=?', array($device_id))) {
+ $status = 'ok';
+ $message = 'Device ' . mres($data['field']) . ' field has been updated';
+ $code = 200;
+ }
+ else {
+ $message = 'Device ' . mres($data['field']) . ' field failed to be updated';
+ }
+ }
+ $output = array(
+ 'status' => $status,
+ 'message' => $message,
+ );
+ $app->response->setStatus($code);
+ $app->response->headers->set('Content-Type', 'application/json');
+ echo _json_encode($output);
+}