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": {