diff --git a/README.md b/README.md
index 440d411..47e98a7 100755
--- a/README.md
+++ b/README.md
@@ -21,11 +21,6 @@ Please keep the following in mind:
- there is still work to be done to add/improve functionality and usability of this tool so suggestions/comments are welcome. Please use the github [issue](https://github.com/Art-of-WiFi/UniFi-API-browser/issues) list or the Ubiquiti Community forums (https://community.ubnt.com/t5/UniFi-Wireless/UniFi-API-browser-tool-released/m-p/1392651) to share your ideas/questions.
- please read the Security Notice below before installing this tool!
-### Donations
-If you'd like to support further development of the API browser tool and the PHP API client class, please use the donate button below. All donations go to the project maintainer.
-
-[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=M7TVNVX3Z44VN)
-
### Features
The UniFi API browser tool offers the following features:
- browse data collections/API endpoints exposed by the UniFi Controller API in an easy manner
@@ -91,7 +86,7 @@ The UniFi API browser tool offers the following features:
Please note that the bundled API client supports many more API endpoints, not all make sense to add to the API browser though.
### Requirements
-- a web server with PHP and cURL modules installed (tested on apache2 with PHP Version 5.6.1 and cURL 7.42.1)
+- a web server with PHP and cURL modules installed (tested on apache2 with PHP Version 5.6.1 and cURL 7.42.1 and with PHP 7.0.7 and cURL 7.37.0)
- network connectivity between this web server and the server (and port) where the UniFi controller is running (in case you are seeing errors, please check out [this issue](https://github.com/Art-of-WiFi/UniFi-API-browser/issues/4))
- clients using this tool should have internet access because the CSS and JS files are loaded from CDNs.
diff --git a/composer.lock b/composer.lock
index 8328967..6437b6d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -9,16 +9,16 @@
"packages": [
{
"name": "art-of-wifi/unifi-api-client",
- "version": "v1.1.25",
+ "version": "v1.1.30",
"source": {
"type": "git",
"url": "https://github.com/Art-of-WiFi/UniFi-API-client.git",
- "reference": "d7827fdbf18e454f876bba514a6175a32160d669"
+ "reference": "871ab82608327b04a228629628545497cd2a872a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Art-of-WiFi/UniFi-API-client/zipball/d7827fdbf18e454f876bba514a6175a32160d669",
- "reference": "d7827fdbf18e454f876bba514a6175a32160d669",
+ "url": "https://api.github.com/repos/Art-of-WiFi/UniFi-API-client/zipball/871ab82608327b04a228629628545497cd2a872a",
+ "reference": "871ab82608327b04a228629628545497cd2a872a",
"shasum": ""
},
"require": {
@@ -52,7 +52,7 @@
"ubiquiti",
"unifi"
],
- "time": "2018-03-24 09:46:42"
+ "time": "2018-07-02 13:06:31"
},
{
"name": "kint-php/kint",
diff --git a/index.php b/index.php
index 99aa8d2..8d0b26f 100755
--- a/index.php
+++ b/index.php
@@ -17,7 +17,7 @@
* with this package in the file LICENSE.md
*
*/
-define('API_BROWSER_VERSION', '1.0.27');
+define('API_BROWSER_VERSION', '1.0.28');
define('API_CLASS_VERSION', get_client_version());
/**
@@ -711,7 +711,7 @@ function get_client_version()
usort($sites, "sites_sort");
foreach ($sites as $site) {
- echo '
' . $site->desc . '' . "\n";
+ echo '' . $site->desc . '' . "\n";
}
?>
@@ -1037,7 +1037,7 @@ function get_client_version()
var alert_message = '';
var action = '';
var site_id = '';
- var site_name = '';
+ var site_name = "";
var controller_id = '';
var output_format = '';
var selection = '';
diff --git a/vendor/art-of-wifi/unifi-api-client/README.md b/vendor/art-of-wifi/unifi-api-client/README.md
index db74825..9b29e0f 100755
--- a/vendor/art-of-wifi/unifi-api-client/README.md
+++ b/vendor/art-of-wifi/unifi-api-client/README.md
@@ -1,6 +1,6 @@
## UniFi Controller API client class
-A PHP class which provides access to Ubiquiti's **UniFi Controller API**, versions 4.x.x and 5.x.x of the UniFi Controller software are supported (version 5.6.29 has been confirmed to work). It's a standalone version of the class which is used in our API browser tool which can be found [here](https://github.com/Art-of-WiFi/UniFi-API-browser).
+A PHP class which provides access to Ubiquiti's **UniFi Controller API**, versions 4.X.X and 5.X.X of the UniFi Controller software are supported (version 5.8.24 has been confirmed to work). It's a standalone version of the class which is used in our API browser tool which can be found [here](https://github.com/Art-of-WiFi/UniFi-API-browser).
This class can be installed using composer/[packagist](https://packagist.org/packages/art-of-wifi/unifi-api-client) for easy inclusion in your projects.
@@ -20,6 +20,7 @@ The class currently supports the following functions/methods to get/post/put/del
- create_radius_account()
- create_site()
- create_usergroup()
+- create_user()
- create_voucher()
- create_wlan()
- delete_device()
@@ -31,6 +32,9 @@ The class currently supports the following functions/methods to get/post/put/del
- disable_ap()
- edit_usergroup()
- extend_guest_validity()
+- forget_sta() (supported on controller version 5.9.X and higher)
+- invite_admin()
+- revoke_admin()
- led_override()
- list_admins()
- list_all_admins()
@@ -100,12 +104,15 @@ The class currently supports the following functions/methods to get/post/put/del
- stat_allusers()
- stat_auths()
- stat_client()
-- stat_5minutes_aps() (supported on controller version 5.5.* and higher)
+- stat_5minutes_aps() (supported on controller version 5.5.X and higher)
- stat_hourly_aps()
- stat_daily_aps()
-- stat_5minutes_site() (supported on controller version 5.5.* and higher)
+- stat_5minutes_site() (supported on controller version 5.5.X and higher)
- stat_hourly_site()
- stat_daily_site()
+- stat_5minutes_user (supported on controller version 5.7.X and higher)
+- stat_hourly_user() (supported on controller version 5.7.X and higher)
+- stat_daily_user() (supported on controller version 5.7.X and higher)
- stat_payment()
- stat_sessions()
- stat_sites()
@@ -118,6 +125,8 @@ The class currently supports the following functions/methods to get/post/put/del
- unset_locate_ap() (deprecated but still available as alias)
- upgrade_device()
- upgrade_device_external()
+- start_rolling_upgrade()
+- cancel_rolling_upgrade()
Internal functions, getters/setters:
@@ -133,7 +142,7 @@ Please refer to the source code for more details on the functions/methods and th
## Requirements
-- a web server with PHP and cURL modules installed (tested on apache2 with PHP Version 5.6.1 and cURL 7.42.1)
+- a web server with PHP and cURL modules installed (tested on apache2 with PHP Version 5.6.1 and cURL 7.42.1 and with PHP 7.0.7 and cURL 7.37.0)
- network connectivity between this web server and the server and port (normally TCP port 8443) where the UniFi Controller is running
## Installation ##
@@ -232,7 +241,7 @@ If you would like to contribute code (improvements), please open an issue and in
This class is based on the work done by the following developers:
- domwo: http://community.ubnt.com/t5/UniFi-Wireless/little-php-class-for-unifi-api/m-p/603051
- fbagnol: https://github.com/fbagnol/class.unifi.php
-- and the API as published by Ubiquiti: https://dl.ubnt.com/unifi/5.6.18-8261dc5066/unifi_sh_api
+- and the API as published by Ubiquiti: https://dl.ubnt.com/unifi/5.8.24/unifi_sh_api
## Important Disclaimer
diff --git a/vendor/art-of-wifi/unifi-api-client/examples/block_list.php b/vendor/art-of-wifi/unifi-api-client/examples/block_list.php
new file mode 100755
index 0000000..302394b
--- /dev/null
+++ b/vendor/art-of-wifi/unifi-api-client/examples/block_list.php
@@ -0,0 +1,90 @@
+
+ *
+ * example:
+ * php block_list.php 09:09:09:09:09:09,10:10:10:10:10:10
+ *
+ */
+
+/**
+ * using the composer autoloader
+ */
+require_once('vendor/autoload.php');
+
+/**
+ * include the config file (place your credentials etc. there if not already present)
+ * see the config.template.php file for an example
+ */
+require_once('config.php');
+
+$debug=false;
+/**
+ * the MAC address(es) of the device(s) to block
+ */
+$macs_to_block = explode(',',$argv[1]);
+
+/**
+ * The site to authorize the device with
+ */
+$site_id = 'MUST_DEFINE_THIS';
+if ($site_id == "MUST_DEFINE_THIS")
+{
+ print 'ERROR: set the site id in your script';
+ return;
+}
+
+/**
+ * initialize the UniFi API connection class and log in to the controller
+ */
+$unifi_connection = new UniFi_API\Client($controlleruser, $controllerpassword, $controllerurl, $site_id, $controllerversion);
+$set_debug_mode = $unifi_connection->set_debug($debug);
+$loginresults = $unifi_connection->login(); // always true regardless of site id
+
+foreach ($macs_to_block as &$mac)
+{
+ // block_result is always true even if mac address does not exist :(
+ $block_result = $unifi_connection->block_sta($mac);
+
+ /**
+ * NOTE:
+ * during testing I had some strange behavior where clients were not reconnecting to the network correctly,
+ * they appeared unblocked and received a valid IP address but could not actually get any data.
+ * the clients did not come to life until I disabled the SSID and then re enabled it.
+ * I guessed maybe these commands were occurring too quickly for the controller so I have slowed them down;
+ * since introducing the sleep I have not seen the above behavior so it might be fixed
+ */
+ sleep(1);
+
+ $getid_result = $unifi_connection->stat_client($mac);
+
+ if (property_exists($getid_result[0], "oui")) // this field(manufacturer) seems to exist on valid mac addresses
+ {
+ if (property_exists($getid_result[0], "name")) // this is the alias field if it has been defined
+ {
+ $name = $getid_result[0]->name;
+ }
+ else
+ {
+ $name = $getid_result[0]->hostname;
+ }
+ print 'blocked ' . $name . PHP_EOL;
+ }
+ else
+ {
+ print 'ERROR: could not block ' . $mac . PHP_EOL;
+ print ' check mac address is valid and part of your network' . PHP_EOL;
+ }
+}
+
+/**
+ * No json formatted data
+ */
+//echo json_encode($block_result, JSON_PRETTY_PRINT);
\ No newline at end of file
diff --git a/vendor/art-of-wifi/unifi-api-client/examples/list_user_stats.php b/vendor/art-of-wifi/unifi-api-client/examples/list_user_stats.php
new file mode 100755
index 0000000..7d7feab
--- /dev/null
+++ b/vendor/art-of-wifi/unifi-api-client/examples/list_user_stats.php
@@ -0,0 +1,51 @@
+';
+
+/**
+ * MAC address of client to fetch stats for
+ */
+$mac = '';
+
+/**
+ * array of attributes to collect
+ * valid attributes:
+ * rx_bytes, tx_bytes, signal, rx_rate, tx_rate, rx_retries, tx_retries, rx_packets, tx_packets
+ */
+//$attribs = ['rx_bytes', 'tx_bytes', 'signal', 'rx_rate', 'tx_rate', 'rx_retries', 'tx_retries', 'rx_packets', 'tx_packets'];
+$attribs = ['rx_bytes', 'tx_bytes'];
+
+/**
+ * initialize the UniFi API connection class and log in to the controller and do our thing
+ */
+$unifi_connection = new UniFi_API\Client($controlleruser, $controllerpassword, $controllerurl, $site_id, $controllerversion, true);
+$set_debug_mode = $unifi_connection->set_debug(false);
+$loginresults = $unifi_connection->login();
+//$data = $unifi_connection->stat_5minutes_user($mac, null, null, $attribs);
+//$data = $unifi_connection->stat_hourly_user($mac, null, null, $attribs);
+$data = $unifi_connection->stat_daily_user($mac, null, null, $attribs);
+
+/**
+ * provide feedback in json format
+ */
+echo json_encode($data, JSON_PRETTY_PRINT);
\ No newline at end of file
diff --git a/vendor/art-of-wifi/unifi-api-client/examples/unblock_list.php b/vendor/art-of-wifi/unifi-api-client/examples/unblock_list.php
new file mode 100755
index 0000000..042259f
--- /dev/null
+++ b/vendor/art-of-wifi/unifi-api-client/examples/unblock_list.php
@@ -0,0 +1,90 @@
+
+ *
+ * example:
+ * php unblock_list.php 09:09:09:09:09:09,10:10:10:10:10:10
+ *
+ */
+
+/**
+ * using the composer autoloader
+ */
+require_once('vendor/autoload.php');
+
+/**
+ * include the config file (place your credentials etc. there if not already present)
+ * see the config.template.php file for an example
+ */
+require_once('config.php');
+
+$debug=false;
+/**
+ * the MAC addresses of the device(s) to unblock
+ */
+$macs_to_unblock = explode(',',$argv[1]);
+
+/**
+ * The site to authorize the device with
+ */
+$site_id = 'MUST_DEFINE_THIS';
+if ($site_id == "MUST_DEFINE_THIS")
+{
+ print 'ERROR: set the site id in your script';
+ return;
+}
+
+/**
+ * initialize the UniFi API connection class and log in to the controller
+ */
+$unifi_connection = new UniFi_API\Client($controlleruser, $controllerpassword, $controllerurl, $site_id, $controllerversion);
+$set_debug_mode = $unifi_connection->set_debug($debug);
+$loginresults = $unifi_connection->login(); // always true regardless of site id
+
+foreach ($macs_to_unblock as &$mac)
+{
+ // block_result is always true even if mac address does not exist :(
+ $block_result = $unifi_connection->unblock_sta($mac);
+
+ /**
+ * NOTE:
+ * during testing I had some strange behavior where clients were not reconnecting to the network correctly,
+ * they appeared unblocked and received a valid IP address but could not actually get any data.
+ * the clients did not come to life until I disabled the SSID and then re enabled it.
+ * I guessed maybe these commands were occurring too quickly for the controller so I have slowed them down;
+ * since introducing the sleep I have not seen the above behavior so it might be fixed
+ */
+ sleep(1);
+
+ $getid_result = $unifi_connection->stat_client($mac);
+
+ if (property_exists($getid_result[0], "oui")) // this field(manufacturer) seems to exist on valid mac addresses
+ {
+ if (property_exists($getid_result[0], "name"))
+ {
+ $name = $getid_result[0]->name;
+ }
+ else
+ {
+ $name = $getid_result[0]->hostname;
+ }
+ print 'unblocked ' . $name . PHP_EOL;
+ }
+ else
+ {
+ print 'ERROR: could not unblock ' . $mac . PHP_EOL;
+ print ' check mac address is valid and part of your network' . PHP_EOL;
+ }
+}
+
+/**
+ * provide feedback in json format
+ */
+//echo json_encode($block_result, JSON_PRETTY_PRINT);
\ No newline at end of file
diff --git a/vendor/art-of-wifi/unifi-api-client/src/Client.php b/vendor/art-of-wifi/unifi-api-client/src/Client.php
index ede22fc..7cf3777 100755
--- a/vendor/art-of-wifi/unifi-api-client/src/Client.php
+++ b/vendor/art-of-wifi/unifi-api-client/src/Client.php
@@ -138,8 +138,8 @@ public function login()
}
if ($code === 400) {
- trigger_error('We have received an HTTP response status: 400. Probably a controller login failure');
- return $code;
+ trigger_error('We have received an HTTP response status: 400. Probably a controller login failure');
+ return $code;
}
}
}
@@ -358,14 +358,57 @@ public function unblock_sta($mac)
}
/**
- * Add/modify/remove a client device note
+ * Forget one or more client devices
+ * ---------------------------------
+ * return true on success
+ * required parameter = array of client MAC addresses
+ *
+ * NOTE:
+ * only supported with controller versions 5.9.X and higher
+ */
+ public function forget_sta($macs)
+ {
+ if (!$this->is_loggedin) return false;
+ $json = json_encode(['cmd' => 'forget-sta', 'macs' => $macs]);
+ $response = $this->exec_curl('/api/s/'.$this->site.'/cmd/stamgr', 'json='.$json);
+ return $this->process_response_boolean($response);
+ }
+
+ /**
+ * Create a new user/client-device
+ * -------------------------------
+ * return an array with a single object containing details of the new user/client-device on success, else return false
+ * required parameter = client MAC address
+ * required parameter = _id value for the user group the new user/client-device should belong to which
+ * can be obtained from the output of list_usergroups()
+ * optional parameter = name to be given to the new user/client-device
+ * optional parameter = note to be applied to the new user/client-device
+ */
+ public function create_user($mac, $user_group_id, $name = null, $note = null)
+ {
+ if (!$this->is_loggedin) return false;
+ $this->request_type = 'POST';
+ $new_user = ['mac' => $mac, 'usergroup_id' => $user_group_id];
+ if (!is_null($name)) $new_user['name'] = $name;
+ if (!is_null($note)) {
+ $new_user['note'] = $note;
+ $new_user['noted'] = true;
+ }
+ $json = ['objects' => [['data' => $new_user]]];
+ $json = json_encode($json);
+ $response = $this->exec_curl('/api/s/'.$this->site.'/group/user', 'json='.$json);
+ return $this->process_response($response);
+ }
+
+ /**
+ * Add/modify/remove a client-device note
* --------------------------------------
* return true on success
- * required parameter = id of the user device to be modified
- * optional parameter = note to be applied to the user device
+ * required parameter = id of the client-device to be modified
+ * optional parameter = note to be applied to the client-device
*
* NOTES:
- * - when note is empty or not set, the existing note for the user will be removed and "noted" attribute set to false
+ * - when note is empty or not set, the existing note for the client-device will be removed and "noted" attribute set to false
*/
public function set_sta_note($user_id, $note = null)
{
@@ -397,7 +440,7 @@ public function set_sta_name($user_id, $name = null)
/**
* 5 minutes site stats method
* ---------------------------
- * returns an array of 5 minutes stats objects for the current site
+ * returns an array of 5-minute stats objects for the current site
* optional parameter = Unix timestamp in seconds
* optional parameter = Unix timestamp in seconds
*
@@ -465,7 +508,7 @@ public function stat_daily_site($start = null, $end = null)
/**
* 5 minutes stats method for a single access point or all access points
* ---------------------------------------------------------------------
- * returns an array of 5 minutes stats objects
+ * returns an array of 5-minute stats objects
* optional parameter = Unix timestamp in seconds
* optional parameter = Unix timestamp in seconds
* optional parameter = AP MAC address to return stats for
@@ -536,6 +579,92 @@ public function stat_daily_aps($start = null, $end = null, $mac = null)
return $this->process_response($response);
}
+ /**
+ * 5 minutes stats method for a single user/client device
+ * ------------------------------------------------------
+ * returns an array of 5-minute stats objects
+ * required parameter = MAC address of user/client device to return stats for
+ * optional parameter = Unix timestamp in seconds
+ * optional parameter = Unix timestamp in seconds
+ * optional parameter = array containing attributes (strings) to be returned, valid values are:
+ * rx_bytes, tx_bytes, signal, rx_rate, tx_rate, rx_retries, tx_retries, rx_packets, tx_packets
+ * default is ['rx_bytes', 'tx_bytes']
+ *
+ * NOTES:
+ * - defaults to the past 12 hours
+ * - only supported with UniFi controller versions 5.8.X and higher
+ * - make sure that the retention policy for 5 minutes stats is set to the correct value in
+ * the controller settings
+ * - make sure that "Clients Historical Data" has been enabled in the UniFi controller settings in the Maintenance section
+ */
+ public function stat_5minutes_user($mac, $start = null, $end = null, $attribs = null)
+ {
+ if (!$this->is_loggedin) return false;
+ $end = is_null($end) ? ((time())*1000) : intval($end);
+ $start = is_null($start) ? $end-(12*3600*1000) : intval($start);
+ $attribs = is_null($attribs) ? ['time', 'rx_bytes', 'tx_bytes'] : array_merge(['time'], $attribs);
+ $json = ['attrs' => $attribs, 'start' => $start, 'end' => $end, 'mac' => $mac];
+ $json = json_encode($json);
+ $response = $this->exec_curl('/api/s/'.$this->site.'/stat/report/5minutes.user', 'json='.$json);
+ return $this->process_response($response);
+ }
+
+ /**
+ * Hourly stats method for a a single user/client device
+ * -----------------------------------------------------
+ * returns an array of hourly stats objects
+ * required parameter = MAC address of user/client device to return stats for
+ * optional parameter = Unix timestamp in seconds
+ * optional parameter = Unix timestamp in seconds
+ * optional parameter = array containing attributes (strings) to be returned, valid values are:
+ * rx_bytes, tx_bytes, signal, rx_rate, tx_rate, rx_retries, tx_retries, rx_packets, tx_packets
+ * default is ['rx_bytes', 'tx_bytes']
+ *
+ * NOTES:
+ * - defaults to the past 7*24 hours
+ * - only supported with UniFi controller versions 5.8.X and higher
+ * - make sure that "Clients Historical Data" has been enabled in the UniFi controller settings in the Maintenance section
+ */
+ public function stat_hourly_user($mac, $start = null, $end = null, $attribs = null)
+ {
+ if (!$this->is_loggedin) return false;
+ $end = is_null($end) ? ((time())*1000) : intval($end);
+ $start = is_null($start) ? $end-(7*24*3600*1000) : intval($start);
+ $attribs = is_null($attribs) ? ['time', 'rx_bytes', 'tx_bytes'] : array_merge(['time'], $attribs);
+ $json = ['attrs' => $attribs, 'start' => $start, 'end' => $end, 'mac' => $mac];
+ $json = json_encode($json);
+ $response = $this->exec_curl('/api/s/'.$this->site.'/stat/report/hourly.user', 'json='.$json);
+ return $this->process_response($response);
+ }
+
+ /**
+ * Daily stats method for a single user/client device
+ * --------------------------------------------------
+ * returns an array of daily stats objects
+ * required parameter = MAC address of user/client device to return stats for
+ * optional parameter = Unix timestamp in seconds
+ * optional parameter = Unix timestamp in seconds
+ * optional parameter = array containing attributes (strings) to be returned, valid values are:
+ * rx_bytes, tx_bytes, signal, rx_rate, tx_rate, rx_retries, tx_retries, rx_packets, tx_packets
+ * default is ['rx_bytes', 'tx_bytes']
+ *
+ * NOTES:
+ * - defaults to the past 7*24 hours
+ * - only supported with UniFi controller versions 5.8.X and higher
+ * - make sure that "Clients Historical Data" has been enabled in the UniFi controller settings in the Maintenance section
+ */
+ public function stat_daily_user($mac, $start = null, $end = null, $attribs = null)
+ {
+ if (!$this->is_loggedin) return false;
+ $end = is_null($end) ? ((time())*1000) : intval($end);
+ $start = is_null($start) ? $end-(7*24*3600*1000) : intval($start);
+ $attribs = is_null($attribs) ? ['time', 'rx_bytes', 'tx_bytes'] : array_merge(['time'], $attribs);
+ $json = ['attrs' => $attribs, 'start' => $start, 'end' => $end, 'mac' => $mac];
+ $json = json_encode($json);
+ $response = $this->exec_curl('/api/s/'.$this->site.'/stat/report/daily.user', 'json='.$json);
+ return $this->process_response($response);
+ }
+
/**
* Show all login sessions
* -----------------------
@@ -1041,6 +1170,77 @@ public function list_all_admins()
return $this->process_response($response);
}
+ /**
+ * Invite a new admin for access to the current site
+ * -------------------------------------------------
+ * returns true on success
+ * required parameter = string, name to assign to the new admin user
+ * required parameter = email address to assign to the new admin user
+ * optional parameter = boolean, whether or not SSO will be allowed for the new admin
+ * default value is true which enables the SSO capability
+ * optional parameter = boolean, whether or not the new admin will have readonly
+ * permissions, default value is true which gives the new admin
+ * administrator permissions
+ * optional parameter = boolean, whether or not the new admin will have permissions to
+ * adopt devices, default value is false. Only applies when readonly
+ * is true.
+ * optional parameter = boolean, whether or not the new admin will have permissions to
+ * restart devices, default value is false. Only applies when readonly
+ * is true.
+ *
+ * NOTES:
+ * - after issuing a valid request, an invite will be sent to the email address provided
+ * - issuing this command against an existing admin will trigger a "re-invite"
+ */
+ public function invite_admin($name, $email, $enable_sso = true, $readonly = false, $device_adopt = false, $device_restart = false)
+ {
+ if (!$this->is_loggedin) return false;
+ $email_valid = filter_var(trim($email), FILTER_VALIDATE_EMAIL);
+ if (!$email_valid) {
+ trigger_error('The email address provided is invalid!');
+ return false;
+ }
+
+ $json = ['name' => trim($name), 'email' => trim($email), 'for_sso' => $enable_sso, 'cmd' => 'invite-admin'];
+ if ($readonly) {
+ $json['role'] = 'readonly';
+ $permissions = [];
+ if ($device_adopt) {
+ $permissions[] = "API_DEVICE_ADOPT";
+ }
+
+ if ($device_restart) {
+ $permissions[] = "API_DEVICE_RESTART";
+ }
+
+ if (count($permissions) > 0) {
+ $json['permissions'] = $permissions;
+ }
+ }
+
+ $json = json_encode($json);
+ $response = $this->exec_curl('/api/s/'.$this->site.'/cmd/sitemgr', 'json='.$json);
+ return $this->process_response_boolean($response);
+ }
+
+ /**
+ * Revoke an admin
+ * ---------------
+ * returns true on success
+ * required parameter = id of the admin to revoke which can be obtained using the
+ * list_all_admins() method/function
+ *
+ * NOTES:
+ * only non-superadmins account can be revoked
+ */
+ public function revoke_admin($admin_id)
+ {
+ if (!$this->is_loggedin) return false;
+ $json = json_encode(['admin' => $admin_id, 'cmd' => 'revoke-admin']);
+ $response = $this->exec_curl('/api/s/'.$this->site.'/cmd/sitemgr', 'json='.$json);
+ return $this->process_response_boolean($response);
+ }
+
/**
* List wlan_groups
* ----------------
@@ -1245,6 +1445,10 @@ public function list_current_channels()
* List country codes
* ------------------
* returns an array of available country codes
+ *
+ * NOTES:
+ * these codes following the ISO standard:
+ * https://en.wikipedia.org/wiki/ISO_3166-1_numeric
*/
public function list_country_codes()
{
@@ -1278,8 +1482,8 @@ public function list_dynamicdns()
}
/**
- * List port configuration
- * -----------------------
+ * List port configurations
+ * ------------------------
* returns an array of port configurations
*/
public function list_portconf()
@@ -1879,6 +2083,38 @@ public function upgrade_device_external($firmware_url, $device_mac)
return $this->process_response_boolean($response);
}
+ /**
+ * Start rolling upgrade
+ * ---------------------
+ * return true on success
+ *
+ * NOTES:
+ * - updates all access points to the latest firmware known to the controller in a
+ * staggered/rolling fashion
+ */
+ public function start_rolling_upgrade()
+ {
+ if (!$this->is_loggedin) return false;
+ $json = ['cmd' => 'set-rollupgrade'];
+ $json = json_encode($json);
+ $response = $this->exec_curl('/api/s/'.$this->site.'/cmd/devmgr', 'json='.$json);
+ return $this->process_response_boolean($response);
+ }
+
+ /**
+ * Cancel rolling upgrade
+ * ---------------------
+ * return true on success
+ */
+ public function cancel_rolling_upgrade()
+ {
+ if (!$this->is_loggedin) return false;
+ $json = ['cmd' => 'unset-rollupgrade'];
+ $json = json_encode($json);
+ $response = $this->exec_curl('/api/s/'.$this->site.'/cmd/devmgr', 'json='.$json);
+ return $this->process_response_boolean($response);
+ }
+
/**
* Power-cycle the PoE output of a switch port
* -------------------------------------------
@@ -1888,6 +2124,7 @@ public function upgrade_device_external($firmware_url, $device_mac)
*
* NOTES:
* - only applies to switches and their PoE ports...
+ * - port must be actually providing power
*/
public function power_cycle_switch_port($switch_mac, $port_idx)
{
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 0351fe3..228f77e 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -61,24 +61,24 @@
},
{
"name": "art-of-wifi/unifi-api-client",
- "version": "v1.1.25",
- "version_normalized": "1.1.25.0",
+ "version": "v1.1.30",
+ "version_normalized": "1.1.30.0",
"source": {
"type": "git",
"url": "https://github.com/Art-of-WiFi/UniFi-API-client.git",
- "reference": "d7827fdbf18e454f876bba514a6175a32160d669"
+ "reference": "871ab82608327b04a228629628545497cd2a872a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Art-of-WiFi/UniFi-API-client/zipball/d7827fdbf18e454f876bba514a6175a32160d669",
- "reference": "d7827fdbf18e454f876bba514a6175a32160d669",
+ "url": "https://api.github.com/repos/Art-of-WiFi/UniFi-API-client/zipball/871ab82608327b04a228629628545497cd2a872a",
+ "reference": "871ab82608327b04a228629628545497cd2a872a",
"shasum": ""
},
"require": {
"ext-curl": "*",
"php": ">=5.4.0"
},
- "time": "2018-03-24 09:46:42",
+ "time": "2018-07-02 13:06:31",
"type": "library",
"installation-source": "dist",
"autoload": {