Compare commits

...

3 Commits

Author SHA1 Message Date
malle-pietje
bf3446bba0 API client class v1.1.64
- added information to several docblocks
- changed handling of request headers, added private property for this
- applied changes for improved use of require_once in the README and examples
- added `list_sites()` example
- *potential breaking changes:*
    renamed `get_request_type()` and `set_request_type()` functions/methods to `get_request_method()` and `set_request_method()` respectively
2021-01-21 10:59:27 +01:00
malle-pietje
a4998de3a9 API client class v1.1.63
- changed references to *UbiOS* back to *UniFi OS*
- removed capitalization from all header strings (per RFC, header fields are case-insensitive: https://tools.ietf.org/html/rfc7230#section-3.2)
- removed charset parameter from headers (not required per RFC)
- added x-csrf-token header to all requests except GET when talking to UniFi OS-based controllers, thanks go to @paciks for raising #86
2021-01-06 17:03:21 +01:00
malle-pietje
c82481a28a API client class v1.1.62
- added several monthly stats methods: `stat_monthly_gateway()`, `stat_monthly_site()`, `stat_monthly_aps()`, `stat_monthly_user()`, thanks go to @Roel Janssens for spotting these MongoDB collections
- test for `object` or `resource` in `get_curl_resource()`, closes PR #82 submitted by @banakito
- applied change to comments in `example/modify_smartpower_pdu_outlet.php` based on a suggestion by @thesohoguy
- removed unnecessary variable from `list_apgroups()`, thanks go to Stephen Davies for reporting
- added an optional parameter $ap_group_ids to the `create_wlan()` function/method for UniFi controller versions 6.0.X and higher, thanks go to Stephen Davies for contributing
2020-12-10 14:52:39 +01:00
32 changed files with 419 additions and 252 deletions

View File

@@ -1,6 +1,6 @@
## UniFi Controller API client class
A PHP class that provides access to Ubiquiti's [**UniFi Network Controller**](https://unifi-network.ui.com/) API, versions 4.X.X, 5.X.X and 6.0.X of the UniFi Network Controller software are supported (version 6.0.37 has been confirmed to work) as well as UbiOS-based controllers (version 5.12.59 has been confirmed to work). This class is used by our API browser tool which can be found [here](https://github.com/Art-of-WiFi/UniFi-API-browser).
A PHP class that provides access to Ubiquiti's [**UniFi Network Controller**](https://unifi-network.ui.com/) API, versions 4.X.X, 5.X.X and 6.0.X of the UniFi Network Controller software are supported (version 6.0.43 has been confirmed to work) as well as UniFi OS-based controllers (version 5.12.59 has been confirmed to work). This class is used by our API browser tool which can be found [here](https://github.com/Art-of-WiFi/UniFi-API-browser).
The package can be installed manually or by using composer/[packagist](https://packagist.org/packages/art-of-wifi/unifi-api-client) for easy inclusion in your projects.
@@ -11,15 +11,15 @@ The package can be installed manually or by using composer/[packagist](https://p
- you must use **local accounts**, not UniFi Cloud accounts, to access the UniFi Controller API through this class
## UbiOS Support
## UniFi OS Support
Support for UbiOS-based controllers (UniFi Dream Machine Pro) has been added as of version 1.1.47. The class automatically detects UbiOS devices and adjusts URLs and several functions/methods accordingly. If your own code applies strict validation of the URL that is passed to the constructor, please adapt your logic to allow URLs without a port suffix when dealing with a UbiOS-based controller.
Support for UniFi OS-based controllers (UniFi Dream Machine Pro or Cloud Key Gen2/Cloud Key Gen2 Plus with firmware version 2.0.24 or higher) has been added as of version 1.1.47. The class automatically detects UniFi OS devices and adjusts URLs and several functions/methods accordingly. If your own code applies strict validation of the URL that is passed to the constructor, please adapt your logic to allow URLs without a port suffix when dealing with a UniFi OS-based controller.
Please test all methods you plan on using thoroughly before using the API Client with UbiOS devices in a production environment.
Please test all methods you plan on using thoroughly before using the API Client with UniFi OS devices in a production environment.
## Installation
You can use [Composer](#composer), [Git](#git) or simply [Download the Release](#download-the-release) to install the API client class.
Use [Composer](#composer), [Git](#git) or simply [Download the Release](#download-the-release) to install the API client class.
### Composer
@@ -31,7 +31,7 @@ Once composer is installed, simply execute this command from the shell in your p
composer require art-of-wifi/unifi-api-client
```
Or you can manually add the package to your composer.json file:
Or manually add the package to your composer.json file:
```javascript
{
@@ -44,7 +44,7 @@ composer require art-of-wifi/unifi-api-client
Finally, be sure to include the autoloader in your code:
```php
require_once('vendor/autoload.php');
require_once 'vendor/autoload.php';
```
### Git
@@ -58,15 +58,15 @@ git clone https://github.com/Art-of-WiFi/UniFi-API-client.git
When git is done cloning, include the file containing the class like so in your code:
```php
require_once('path/to/src/Client.php');
require_once 'path/to/src/Client.php';
```
### Download the Release
If you prefer not to use composer or git, you can simply [download the package](https://github.com/Art-of-WiFi/UniFi-API-client/archive/master.zip), uncompress the zip file, then include the file containing the class in your code like so:
If you prefer not to use composer or git, simply [download the package](https://github.com/Art-of-WiFi/UniFi-API-client/archive/master.zip), uncompress the zip file, then include the file containing the class in your code like so:
```php
require_once('path/to/src/Client.php');
require_once 'path/to/src/Client.php';
```
## Example usage
@@ -77,7 +77,7 @@ A basic example how to use the class:
/**
* load the class using the composer autoloader
*/
require_once('vendor/autoload.php');
require_once 'vendor/autoload.php';
/**
* initialize the Unifi API connection class, log in to the controller and request the alarms collection
@@ -88,7 +88,7 @@ $login = $unifi_connection->login();
$results = $unifi_connection->list_alarms(); // returns a PHP array containing alarm objects
```
Please refer to the `examples/` directory for some more detailed examples which you can use as a starting point for your own PHP code.
Please refer to the `examples/` directory for some more detailed examples which can be used as a starting point for your own PHP code.
#### IMPORTANT NOTES:
@@ -249,6 +249,10 @@ The class currently supports the following functions/methods to GET/POST/PUT/DEL
- stat_status()
- stat_sysinfo()
- stat_voucher()
- stat_monthly_aps()
- stat_monthly_gateway()
- stat_monthly_site()
- stat_monthly_user()
- unauthorize_guest()
- unblock_sta()
- unset_locate_ap() (deprecated but still available as alias)
@@ -265,7 +269,7 @@ Other functions, getters/setters:
- get_is_unifi_os()
- get_last_error_message()
- get_last_results_raw()
- get_request_type()
- get_request_method()
- get_site()
- get_ssl_verify_host()
- get_ssl_verify_peer()
@@ -273,7 +277,7 @@ Other functions, getters/setters:
- set_cookies()
- set_debug()
- set_is_unifi_os()
- set_request_type()
- set_request_method()
- set_site()
- set_ssl_verify_host()
- set_ssl_verify_peer()
@@ -296,7 +300,7 @@ This class is based on the initial work by the following developers:
and the API as published by Ubiquiti:
- https://dl.ui.com/unifi/5.12.35/unifi_sh_api
- https://dl.ui.com/unifi/6.0.41/unifi_sh_api
## Important Disclaimer

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to fetch an Access Point's scanning state/results
* description: example basic PHP script to fetch an Access Point's scanning state/results
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* site id and MAC address of AP to query

View File

@@ -3,11 +3,11 @@
* PHP API usage example
*
* contributed by: @4oo4
* description: example script to upgrade device firmware (can be scheduled with systemd/cron)
* to the most current version
* description: example script to upgrade device firmware (can be scheduled with systemd/cron)
* to the most current version
*/
require_once('vendor/autoload.php');
require_once('config.php');
require_once 'vendor/autoload.php';
require_once 'config.php';
/**
* site id of the AP to update

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example PHP script to perform a basic auth of a guest device
* description: example PHP script to perform a basic auth of a guest device
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the MAC address of the device to authorize

View File

@@ -3,21 +3,21 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to auth a guest device and attach a note to it,
* this requires the device to be connected to the WLAN/LAN at moment of
* authorization
* description: example basic PHP script to auth a guest device and attach a note to it,
* this requires the device to be connected to the WLAN/LAN at moment of
* authorization
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the MAC address of the device to authorize

View File

@@ -3,27 +3,26 @@
* PHP API usage example
*
* contributed by: @malcolmcif, based on another Art of WiFi example
* description: basic PHP script to block a list of mac addresses passed in via command line,
* output is to console in non json format
* description: basic PHP script to block a list of mac addresses passed in via command line,
* output is to console in non json format
*
* usage:
* php block_list.php <list of comma seperated mac addresses>
*
* 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');
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');
require_once 'config.php';
$debug = false;
/**

View File

@@ -3,14 +3,14 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to modify the super_mgmt settings for UniFi controller and output results
* in json format
* description: example basic PHP script to modify the super_mgmt settings for UniFi controller and output results
* in json format
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
require_once 'vendor/autoload.php';
/**
* UniFi controller credentials and the site to use, in this case since we are modifying global settings you can select
@@ -18,7 +18,7 @@ require_once('vendor/autoload.php');
*
* NOTE: in this case you need to enter Super Administrator account credentials in config.php
*/
require_once('config.php');
require_once 'config.php';
$site_id = 'default';
$debug = false;

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to change the WPA2 password/PSK of a WLAN, returns true on success
* description: example basic PHP script to change the WPA2 password/PSK of a WLAN, returns true on success
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* The site to which the WLAN you want to modify belongs

View File

@@ -1,10 +1,8 @@
<?php
/**
* Copyright (c) 2017, Art of WiFi
*
* This file is subject to the MIT license that is bundled
* with this package in the file LICENSE.md
* Copyright (c) 2021, Art of WiFi
*
* This file is subject to the MIT license that is bundled with this package in the file LICENSE.md
*/
/**

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to create a new site, returns true upon success
* description: example basic PHP script to create a new site, returns true upon success
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the site to use to log in to the controller

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to create a set of vouchers, returns an array containing the newly created vouchers
* description: example basic PHP script to create a set of vouchers, returns an array containing the newly created vouchers
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* minutes the voucher is valid after activation (expiration time)

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to delete a site, returns true upon success
* description: example basic PHP script to delete a site, returns true upon success
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the site to use to log in to the controller

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to disable/enable a device, returns true upon success
* description: example basic PHP script to disable/enable a device, returns true upon success
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the 24 character id of the device to disable/enable

View File

@@ -12,13 +12,13 @@
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the site to use to log in to the controller

View File

@@ -3,20 +3,20 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to execute a custom API request using the
* custom_api_request() function/method
* description: example basic PHP script to execute a custom API request using the
* custom_api_request() function/method
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* The site to authorize the device with
@@ -27,10 +27,10 @@ $site_id = '<enter your site id here>';
/**
* parameters
*/
$url = '/api/s/' . $site_id . '/stat/fwupdate/latest-version';
$request_type = 'GET';
$payload = null;
$return = 'array';
$url = '/api/s/' . $site_id . '/stat/fwupdate/latest-version';
$request_method = 'GET';
$payload = null;
$return = 'array';
/**
* initialize the UniFi API connection class and log in to the controller and do our thing
@@ -38,7 +38,7 @@ $return = 'array';
$unifi_connection = new UniFi_API\Client($controlleruser, $controllerpassword, $controllerurl, $site_id, $controllerversion);
$set_debug_mode = $unifi_connection->set_debug($debug);
$loginresults = $unifi_connection->login();
$results = $unifi_connection->custom_api_request($url, $request_type, $payload, $return);
$results = $unifi_connection->custom_api_request($url, $request_method, $payload, $return);
/**
* provide feedback in JSON format or as PHP Object

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: mtotone
* description: example of how to extend validity of guest authorizations
* description: example of how to extend validity of guest authorizations
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* must be adapted to your site!

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to pull current alarms from the UniFi controller and output in json format
* description: example basic PHP script to pull current alarms from the UniFi controller and output in json format
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the site to use

View File

@@ -3,20 +3,20 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example to pull connected user numbers for Access Points from the UniFi controller and output the results
* in raw HTML format
* description: example to pull connected user numbers for Access Points from the UniFi controller and output the results
* in raw HTML format
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the short name of the site which you wish to query

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: @gahujipo
* description: example to pull connected users and their details from the UniFi controller and output the results
* in JSON format
* description: example to pull connected users and their details from the UniFi controller and output the results
* in JSON format
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the short name of the site which you wish to query

View File

@@ -3,20 +3,20 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example to pull site health metrics from the UniFi controller and output the results
* in json format
* description: example to pull site health metrics from the UniFi controller and output the results
* in json format
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the short name of the site you wish to query

46
examples/list_sites.php Executable file
View File

@@ -0,0 +1,46 @@
<?php
/**
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to list all site on the controller that are
* available to the admin account defined in config.php
*/
/**
* 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';
/**
* we use the default site in the initial connection
*/
$site_id = 'default';
/**
* 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);
$set_debug_mode = $unifi_connection->set_debug($debug);
$loginresults = $unifi_connection->login();
$data = $unifi_connection->list_sites();
/**
* we can render the full results in json format
*/
//echo json_encode($data, JSON_PRETTY_PRINT);
/**
* or we print each site name and site id
*/
foreach ($data as $site) {
echo 'Site name: ' . $site->desc . ', site id: ' . $site->name . PHP_EOL;
}
echo PHP_EOL;

View File

@@ -3,20 +3,20 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to pull Facebook social auth details from the UniFi controller and output
* them in basic HTML format
* description: example basic PHP script to pull Facebook social auth details from the UniFi controller and output
* them in basic HTML format
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the site to use

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to pull stats for s epcific user/client device from the UniFi controller and output in json format
* description: example basic PHP script to pull stats for s epcific user/client device from the UniFi controller and output in json format
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the site to use

View File

@@ -12,7 +12,7 @@ require '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');
require_once 'config.php';
/**
* the site to use
@@ -55,6 +55,9 @@ $loginresults = $unifi_connection->login();
if ($loginresults) {
$pdu_details = $unifi_connection->list_devices($pdu_mac);
/**
* change the model below from USPPDUP to UP1 when using a USP-Plug (thanks to @thesohoguy for contributing this)
*/
if (!empty($pdu_details) && property_exists($pdu_details[0], 'model') && $pdu_details[0]->model === 'USPPDUP' && property_exists($pdu_details[0], 'outlet_overrides')) {
$device_id = $pdu_details[0]->_id;
$outlet_overrides = $pdu_details[0]->outlet_overrides;

View File

@@ -3,19 +3,19 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to force a client device to reconnect
* description: example basic PHP script to force a client device to reconnect
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the MAC address to reconnect

View File

@@ -3,7 +3,7 @@
* Test the connection to your UniFi controller
*
* contributed by: Art of WiFi
* description: PHP script to check/debug the connection to your controller using PHP and cURL
* description: PHP script to check/debug the connection to your controller using PHP and cURL
*/
/**
@@ -11,7 +11,7 @@
* see the config.template.php file for an example.
* (will only be used here to get the URL to the controller)
*/
require_once('config.php');
require_once 'config.php';
/**
* Check whether the cURL module supports SSL

View File

@@ -3,20 +3,20 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example to toggle the locate function (flashing LED) on an Access Point and
* output the response in json format
* description: example to toggle the locate function (flashing LED) on an Access Point and
* output the response in json format
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* site id to use

View File

@@ -3,8 +3,8 @@
* PHP API usage example
*
* contributed by: @malcolmcif, based on another Art of WiFi example
* description: basic PHP script to unblock a list of mac addresses passed in via command line,
* output is to console in non json format
* description: basic PHP script to unblock a list of mac addresses passed in via command line,
* output is to console in non json format
*
* usage:
* php unblock_list.php <list of comma seperated mac addresses>
@@ -17,13 +17,13 @@
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
$debug = false;
/**

View File

@@ -3,21 +3,21 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to update the port settings of an AC-IW device
* FYI: the AC-IW device has three ports, one for the wired uplink and two with external connectors
* note: requires controller version 5.5.X or higher (to be verified)
* description: example basic PHP script to update the port settings of an AC-IW device
* FYI: the AC-IW device has three ports, one for the wired uplink and two with external connectors
* note: requires controller version 5.5.X or higher (to be verified)
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the site to use to log in to the controller

View File

@@ -3,20 +3,20 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to update WLAN settings of a device when using a controller version 5.5.X or higher
* where set_ap_radiosettings() throws an error
* description: example basic PHP script to update WLAN settings of a device when using a controller version 5.5.X or higher
* where set_ap_radiosettings() throws an error
*/
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the site to use to log in to the controller

View File

@@ -13,13 +13,13 @@
/**
* using the composer autoloader
*/
require_once('vendor/autoload.php');
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');
require_once 'config.php';
/**
* the site to use to log in to the controller

View File

@@ -10,9 +10,9 @@ namespace UniFi_API;
* and the API as published by Ubiquiti:
* https://www.ubnt.com/downloads/unifi/<UniFi controller version number>/unifi_sh_api
*
* @package UniFi Controller API client class
* @package UniFi_Controller_API_Client_Class
* @author Art of WiFi <info@artofwifi.net>
* @version 1.1.61
* @version Release: 1.1.64
* @license This class is subject to the MIT license that is bundled with this package in the file LICENSE.md
* @example This directory in the package repository contains a collection of examples:
* https://github.com/Art-of-WiFi/UniFi-API-client/tree/master/examples
@@ -22,24 +22,25 @@ class Client
/**
* protected and private properties
*/
protected $baseurl = 'https://127.0.0.1:8443';
protected $user = '';
protected $password = '';
protected $site = 'default';
protected $version = '5.6.39';
protected $debug = false;
protected $is_loggedin = false;
protected $is_unifi_os = false;
protected $exec_retries = 0;
protected $class_version = '1.1.61';
private $cookies = '';
private $request_type = 'GET';
private $request_types_allowed = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'];
private $connect_timeout = 10;
private $last_results_raw = null;
private $last_error_message = null;
private $curl_ssl_verify_peer = false;
private $curl_ssl_verify_host = false;
protected $baseurl = 'https://127.0.0.1:8443';
protected $user = '';
protected $password = '';
protected $site = 'default';
protected $version = '6.0.43';
protected $debug = false;
protected $is_loggedin = false;
protected $is_unifi_os = false;
protected $exec_retries = 0;
protected $class_version = '1.1.64';
private $cookies = '';
private $headers = [];
private $request_method = 'GET';
private $request_methods_allowed = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'];
private $connect_timeout = 10;
private $last_results_raw = null;
private $last_error_message = null;
private $curl_ssl_verify_peer = false;
private $curl_ssl_verify_host = false;
/**
* Construct an instance of the UniFi API client class
@@ -160,7 +161,7 @@ class Client
$curl_options = [
CURLOPT_NOBODY => false,
CURLOPT_POSTFIELDS => json_encode(['username' => $this->user, 'password' => $this->password]),
CURLOPT_HTTPHEADER => ['content-type: application/json; charset=utf-8'],
CURLOPT_HTTPHEADER => ['content-type: application/json'],
CURLOPT_REFERER => $this->baseurl . '/login',
CURLOPT_URL => $this->baseurl . '/api/login'
];
@@ -178,7 +179,7 @@ class Client
/**
* execute the cURL request and get the HTTP response code
*/
$content = curl_exec($ch);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
@@ -190,7 +191,7 @@ class Client
print PHP_EOL . '-----------LOGIN-------------' . PHP_EOL;
print_r(curl_getinfo($ch));
print PHP_EOL . '----------RESPONSE-----------' . PHP_EOL;
print $content;
print $response;
print PHP_EOL . '-----------------------------' . PHP_EOL;
print '</pre>' . PHP_EOL;
}
@@ -205,17 +206,17 @@ class Client
return $http_code;
}
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($content, 0, $header_size);
$body = trim(substr($content, $header_size));
$response_header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$response_headers = substr($response, 0, $response_header_size);
$response_body = trim(substr($response, $response_header_size));
curl_close($ch);
/**
* we are good to extract the cookies
*/
if ($http_code >= 200 && $http_code < 400 && !empty($body)) {
preg_match_all('|Set-Cookie: (.*);|Ui', $headers, $results);
if ($http_code >= 200 && $http_code < 400 && !empty($response_body)) {
preg_match_all('|Set-Cookie: (.*);|Ui', $response_headers, $results);
if (array_key_exists(1, $results)) {
$this->cookies = implode(';', $results[1]);
@@ -260,19 +261,16 @@ class Client
/**
* constuct HTTP request headers as required
*/
$headers = ['Content-Length: 0'];
$logout_path = '/logout';
$this->headers = ['content-length: 0'];
$logout_path = '/logout';
if ($this->is_unifi_os) {
$logout_path = '/api/auth/logout';
$curl_options[CURLOPT_CUSTOMREQUEST] = 'POST';
$csrf_token = $this->extract_csrf_token_from_cookie();
if ($csrf_token) {
$headers[] = 'x-csrf-token: ' . $csrf_token;
}
$this->create_x_csrf_token_header();
}
$curl_options[CURLOPT_HTTPHEADER] = $headers;
$curl_options[CURLOPT_HTTPHEADER] = $this->headers;
$curl_options[CURLOPT_URL] = $this->baseurl . $logout_path;
curl_setopt_array($ch, $curl_options);
@@ -564,6 +562,36 @@ class Client
return $this->fetch_results('/api/s/' . $this->site . '/stat/report/daily.site', $payload);
}
/**
* Fetch monthly site stats
*
* NOTES:
* - defaults to the past 52 weeks (52*7*24 hours)
* - "bytes" are no longer returned with controller version 4.9.1 and later
*
* @param int $start optional, Unix timestamp in milliseconds
* @param int $end optional, Unix timestamp in milliseconds
* @return array returns an array of monthly stats objects for the current site
*/
public function stat_monthly_site($start = null, $end = null)
{
$end = empty($end) ? (time() - (time() % 3600)) * 1000 : intval($end);
$start = empty($start) ? $end - (52 * 7 * 24 * 3600 * 1000) : intval($start);
$attribs = [
'bytes',
'wan-tx_bytes',
'wan-rx_bytes',
'wlan_bytes',
'num_sta',
'lan-num_sta',
'wlan-num_sta',
'time'
];
$payload = ['attrs' => $attribs, 'start' => $start, 'end' => $end];
return $this->fetch_results('/api/s/' . $this->site . '/stat/report/monthly.site', $payload);
}
/**
* Fetch 5 minutes stats for a single access point or all access points
*
@@ -646,6 +674,33 @@ class Client
return $this->fetch_results('/api/s/' . $this->site . '/stat/report/daily.ap', $payload);
}
/**
* Fetch monthly stats for a single access point or all access points
*
* NOTES:
* - defaults to the past 52 weeks (52*7*24 hours)
* - make sure that the retention policy for hourly stats is set to the correct value in
* the controller settings
*
* @param int $start optional, Unix timestamp in milliseconds
* @param int $end optional, Unix timestamp in milliseconds
* @param string $mac optional, AP MAC address to return stats for, when empty,
* stats for all APs are returned
* @return array returns an array of monthly stats objects
*/
public function stat_monthly_aps($start = null, $end = null, $mac = null)
{
$end = empty($end) ? time() * 1000 : intval($end);
$start = empty($start) ? $end - (52 * 7 * 24 * 3600 * 1000) : intval($start);
$attribs = ['bytes', 'num_sta', 'time'];
$payload = ['attrs' => $attribs, 'start' => $start, 'end' => $end];
if (!empty($mac)) {
$payload['mac'] = strtolower($mac);
}
return $this->fetch_results('/api/s/' . $this->site . '/stat/report/monthly.ap', $payload);
}
/**
* Fetch 5 minutes stats for a single user/client device
*
@@ -730,6 +785,34 @@ class Client
return $this->fetch_results('/api/s/' . $this->site . '/stat/report/daily.user', $payload);
}
/**
* Fetch monthly stats for a single user/client device
*
* NOTES:
* - defaults to the past 13 weeks (52*7*24 hours)
* - only supported with UniFi controller versions 5.8.X and higher
* - make sure that the retention policy for monthly 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
*
* @param string $mac MAC address of user/client device to return stats for
* @param int $start optional, Unix timestamp in milliseconds
* @param int $end optional, Unix timestamp in milliseconds
* @param array $attribs 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']
* @return array returns an array of monthly stats objects
*/
public function stat_monthly_user($mac, $start = null, $end = null, $attribs = null)
{
$end = empty($end) ? time() * 1000 : intval($end);
$start = empty($start) ? $end - (13 * 7 * 24 * 3600 * 1000) : intval($start);
$attribs = empty($attribs) ? ['time', 'rx_bytes', 'tx_bytes'] : array_merge(['time'], $attribs);
$payload = ['attrs' => $attribs, 'start' => $start, 'end' => $end, 'mac' => strtolower($mac)];
return $this->fetch_results('/api/s/' . $this->site . '/stat/report/monthly.user', $payload);
}
/**
* Fetch 5 minutes gateway stats
*
@@ -787,7 +870,7 @@ class Client
* Fetch daily gateway stats
*
* NOTES:
* - defaults to the past 52*7*24 hours
* - defaults to the past 52 weeks (52*7*24 hours)
* - requires a USG
*
* @param int $start optional, Unix timestamp in milliseconds
@@ -808,6 +891,31 @@ class Client
return $this->fetch_results('/api/s/' . $this->site . '/stat/report/daily.gw', $payload);
}
/**
* Fetch monthly gateway stats
*
* NOTES:
* - defaults to the past 52 weeks (52*7*24 hours)
* - requires a USG
*
* @param int $start optional, Unix timestamp in milliseconds
* @param int $end optional, Unix timestamp in milliseconds
* @param array $attribs array containing attributes (strings) to be returned, valid values are:
* mem, cpu, loadavg_5, lan-rx_errors, lan-tx_errors, lan-rx_bytes,
* lan-tx_bytes, lan-rx_packets, lan-tx_packets, lan-rx_dropped, lan-tx_dropped
* default is ['time', 'mem', 'cpu', 'loadavg_5']
* @return array returns an array of monthly stats objects for the gateway belonging to the current site
*/
public function stat_monthly_gateway($start = null, $end = null, $attribs = null)
{
$end = empty($end) ? (time() - (time() % 3600)) * 1000 : intval($end);
$start = empty($start) ? $end - (52 * 7 * 24 * 3600 * 1000) : intval($start);
$attribs = empty($attribs) ? ['time', 'mem', 'cpu', 'loadavg_5'] : array_merge(['time'], $attribs);
$payload = ['attrs' => $attribs, 'start' => $start, 'end' => $end];
return $this->fetch_results('/api/s/' . $this->site . '/stat/report/monthly.gw', $payload);
}
/**
* Fetch speed test results
*
@@ -1001,8 +1109,12 @@ class Client
return false;
}
$this->request_type = 'PUT';
$payload = ['_id' => $client_id, 'use_fixedip' => $use_fixedip];
$this->request_method = 'PUT';
$payload = [
'_id' => $client_id,
'use_fixedip' => $use_fixedip
];
if ($use_fixedip) {
if ($network_id) {
$payload['network_id'] = $network_id;
@@ -1053,7 +1165,7 @@ class Client
*/
public function edit_usergroup($group_id, $site_id, $group_name, $group_dn = -1, $group_up = -1)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
$payload = [
'_id' => $group_id,
'name' => $group_name,
@@ -1073,7 +1185,7 @@ class Client
*/
public function delete_usergroup($group_id)
{
$this->request_type = 'DELETE';
$this->request_method = 'DELETE';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/usergroup/' . trim($group_id));
}
@@ -1085,7 +1197,7 @@ class Client
*/
public function list_apgroups()
{
return $this->fetch_results('/v2/api/site/' . $this->site . '/apgroups/' . trim($group_id));
return $this->fetch_results('/v2/api/site/' . $this->site . '/apgroups');
}
/**
@@ -1113,7 +1225,7 @@ class Client
*/
public function edit_apgroup($group_id, $group_name, $device_macs)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
$payload = [
'_id' => $group_id,
'attr_no_delete' => false,
@@ -1132,7 +1244,7 @@ class Client
*/
public function delete_apgroup($group_id)
{
$this->request_type = 'DELETE';
$this->request_method = 'DELETE';
return $this->fetch_results_boolean('/v2/api/site/' . $this->site . '/apgroups/' . trim($group_id));
}
@@ -1186,7 +1298,7 @@ class Client
return false;
}
$this->request_type = 'PUT';
$this->request_method = 'PUT';
$payload = [
'_id' => $group_id,
'name' => $group_name,
@@ -1206,7 +1318,7 @@ class Client
*/
public function delete_firewallgroup($group_id)
{
$this->request_type = 'DELETE';
$this->request_method = 'DELETE';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/firewallgroup/' . trim($group_id));
}
@@ -1413,7 +1525,7 @@ class Client
*/
public function set_site_country($country_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/setting/country/' . trim($country_id), $payload);
}
@@ -1432,7 +1544,7 @@ class Client
*/
public function set_site_locale($locale_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/setting/locale/' . trim($locale_id), $payload);
}
@@ -1448,7 +1560,7 @@ class Client
*/
public function set_site_snmp($snmp_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/setting/snmp/' . trim($snmp_id), $payload);
}
@@ -1464,7 +1576,7 @@ class Client
*/
public function set_site_mgmt($mgmt_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/setting/mgmt/' . trim($mgmt_id), $payload);
}
@@ -1480,7 +1592,7 @@ class Client
*/
public function set_site_guest_access($guest_access_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/setting/guest_access/' . trim($guest_access_id), $payload);
}
@@ -1496,7 +1608,7 @@ class Client
*/
public function set_site_ntp($ntp_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/setting/ntp/' . trim($ntp_id), $payload);
}
@@ -1512,7 +1624,7 @@ class Client
*/
public function set_site_connectivity($connectivity_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/setting/connectivity/' . trim($connectivity_id), $payload);
}
@@ -1681,7 +1793,7 @@ class Client
* Fetch controller status
*
* NOTES: in order to get useful results (e.g. controller version) you can call get_last_results_raw()
* immediately after this method
* immediately after this method. Login not required.
*
* @return bool true upon success (controller is online)
*/
@@ -2018,7 +2130,7 @@ class Client
return false;
}
$this->request_type = 'PUT';
$this->request_method = 'PUT';
$payload = ['disabled' => $disable];
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/device/' . trim($ap_id), $payload);
@@ -2042,8 +2154,8 @@ class Client
return false;
}
$this->request_type = 'PUT';
$payload = ['led_override' => $override_mode];
$this->request_method = 'PUT';
$payload = ['led_override' => $override_mode];
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/device/' . trim($device_id), $payload);
}
@@ -2318,7 +2430,7 @@ class Client
*/
public function set_dynamicdns($dynamicdns_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/dynamicdns/' . trim($dynamicdns_id), $payload);
}
@@ -2356,7 +2468,7 @@ class Client
*/
public function set_networksettings_base($network_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/networkconf/' . trim($network_id), $payload);
}
@@ -2369,7 +2481,7 @@ class Client
*/
public function delete_network($network_id)
{
$this->request_type = 'DELETE';
$this->request_method = 'DELETE';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/networkconf/' . trim($network_id));
}
@@ -2405,6 +2517,7 @@ class Client
* @param boolean $uapsd_enabled optional, enable/disable Unscheduled Automatic Power Save Delivery
* @param boolean $schedule_enabled optional, enable/disable wlan schedule
* @param array $schedule optional, schedule rules
* @param array $ap_group_ids optional, array of ap group ids, required for UniFi controller versions 6.0.X and higher
* @return bool true on success
*/
public function create_wlan(
@@ -2422,7 +2535,8 @@ class Client
$vlan = null,
$uapsd_enabled = false,
$schedule_enabled = false,
$schedule = []
$schedule = [],
$ap_group_ids = null
) {
$payload = [
'name' => $name,
@@ -2448,6 +2562,10 @@ class Client
$payload['x_passphrase'] = $x_passphrase;
}
if (!empty($ap_group_ids) && is_array($ap_group_ids)) {
$payload['ap_group_ids'] = $ap_group_ids;
}
return $this->fetch_results_boolean('/api/s/' . $this->site . '/add/wlanconf', $payload);
}
@@ -2461,7 +2579,7 @@ class Client
*/
public function set_wlansettings_base($wlan_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/wlanconf/' . trim($wlan_id), $payload);
}
@@ -2514,7 +2632,7 @@ class Client
*/
public function delete_wlan($wlan_id)
{
$this->request_type = 'DELETE';
$this->request_method = 'DELETE';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/wlanconf/' . trim($wlan_id));
}
@@ -2587,7 +2705,8 @@ class Client
/**
* Count alarms
*
* @param bool $archived if true all alarms are counted, if false only non-archived (active) alarms are counted
* @param bool $archived optional, if true all alarms are counted, if false only non-archived (active) alarms are counted,
* by default all alarms are counted
* @return array containing the alarm count
*/
public function count_alarms($archived = null)
@@ -2600,7 +2719,8 @@ class Client
/**
* Archive alarms(s)
*
* @param string $alarm_id _id of the alarm to archive which can be found with the list_alarms() function,
* @param string $alarm_id optional, _id of the alarm to archive which can be found with the list_alarms() function,
* by default all alarms are archived
* @return bool true on success
*/
public function archive_alarm($alarm_id = null)
@@ -2707,7 +2827,8 @@ class Client
/**
* Fetch firmware versions
*
* @param string $type "available" or "cached", determines which firmware types to return
* @param string $type optional, "available" or "cached", determines which firmware types to return,
* default value is "available"
* @return array containing firmware versions
*/
public function list_firmware($type = 'available')
@@ -2773,7 +2894,7 @@ class Client
*/
public function set_device_settings_base($device_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/device/' . trim($device_id), $payload);
}
@@ -2880,7 +3001,7 @@ class Client
*/
public function set_radius_account_base($account_id, $payload)
{
$this->request_type = 'PUT';
$this->request_method = 'PUT';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/account/' . trim($account_id), $payload);
}
@@ -2896,7 +3017,7 @@ class Client
*/
public function delete_radius_account($account_id)
{
$this->request_type = 'DELETE';
$this->request_method = 'DELETE';
return $this->fetch_results_boolean('/api/s/' . $this->site . '/rest/account/' . trim($account_id));
}
@@ -2942,16 +3063,16 @@ class Client
* NOTE:
* Only use this method when you fully understand the behavior of the UniFi controller API. No input validation is performed, to be used with care!
*
* @param string $path suffix of the URL (following the port number) to pass request to, *must* start with a "/" character
* @param string $request_type optional, HTTP request type, can be GET (default), POST, PUT, PATCH, or DELETE
* @param object|array $payload optional, stdClass object or associative array containing the payload to pass
* @param string $return optional, string; determines how to return results, when "boolean" the method must return a
* boolean result (true/false) or "array" when the method must return an array
* @return bool|array returns results as requested, returns false on incorrect parameters
* @param string $path suffix of the URL (following the port number) to pass request to, *must* start with a "/" character
* @param string $request_method optional, HTTP request type, can be GET (default), POST, PUT, PATCH, or DELETE
* @param object|array $payload optional, stdClass object or associative array containing the payload to pass
* @param string $return optional, string; determines how to return results, when "boolean" the method must return a
* boolean result (true/false) or "array" when the method must return an array
* @return bool|array returns results as requested, returns false on incorrect parameters
*/
public function custom_api_request($path, $request_type = 'GET', $payload = null, $return = 'array')
public function custom_api_request($path, $request_method = 'GET', $payload = null, $return = 'array')
{
if (!in_array($request_type, $this->request_types_allowed)) {
if (!in_array($request_method, $this->request_methods_allowed)) {
return false;
}
@@ -2959,7 +3080,7 @@ class Client
return false;
}
$this->request_type = $request_type;
$this->request_method = $request_method;
if ($return === 'array') {
return $this->fetch_results($path, $payload);
@@ -3194,6 +3315,7 @@ class Client
* Get version of the Class
*
* @return string semver compatible version of this class
* https://semver.org/
*/
public function get_class_version()
{
@@ -3215,29 +3337,29 @@ class Client
}
/**
* Get current request type
* Get current request method
*
* @return string request type
*/
public function get_request_type()
public function get_request_method()
{
return $this->request_type;
return $this->request_method;
}
/**
* Set request type
* Set request method
*
* @param string $request_type a valid HTTP request type
* @return bool whether request was successful or not
* @param string $request_method a valid HTTP request method
* @return bool whether request was successful or not
*/
public function set_request_type($request_type)
public function set_request_method($request_method)
{
if (!in_array($request_type, $this->request_types_allowed)) {
if (!in_array($request_method, $this->request_methods_allowed)) {
return false;
}
$this->request_type = $request_type;
$this->request_method = $request_method;
return true;
}
@@ -3272,7 +3394,6 @@ class Client
return true;
}
/**
* Get value for cURL option CURLOPT_SSL_VERIFYHOST
*
@@ -3304,9 +3425,9 @@ class Client
}
/**
* Is current controller UnifiOS-based/UbiOS-based
* Is current controller UniFi OS-based
*
* @return bool whether current controller is UnifiOS-based/UbiOS-based
* @return bool whether current controller is UniFi OS-based
*/
public function get_is_unifi_os()
{
@@ -3483,7 +3604,7 @@ class Client
break;
default:
// we have an unknown error
$error = 'Unknown JSON error occured';
$error = 'Unknown JSON error occurred';
break;
}
@@ -3535,7 +3656,7 @@ class Client
/**
* Update the unificookie if sessions are enabled
*
* @return bool true when unificookie was updated, else return false
* @return bool true when unificookie was updated, else returns false
*/
private function update_unificookie()
{
@@ -3556,11 +3677,11 @@ class Client
}
/**
* Extract the CSRF token from our Cookie string
* Add a header containing the CSRF token from our Cookie string
*
* @return bool|string the CSRF token upon success or false when unable to extract the CSRF token
* @return bool true upon success or false when unable to extract the CSRF token
*/
private function extract_csrf_token_from_cookie()
private function create_x_csrf_token_header()
{
if (!empty($this->cookies)) {
$cookie_bits = explode('=', $this->cookies);
@@ -3577,26 +3698,25 @@ class Client
return false;
}
return json_decode(base64_decode($jwt_payload))->csrfToken;
$this->headers[] = 'x-csrf-token: ' . json_decode(base64_decode($jwt_payload))->csrfToken;
return true;
}
return false;
}
/**
*/
/**
* Execute the cURL request
*
* @param string $path path for the request
* @param object|array $payload optional, payload to pass with the request
* @return bool|array response returned by the controller API
* @return bool|array response returned by the controller API, false upon error
*/
protected function exec_curl($path, $payload = null)
{
if (!in_array($this->request_type, $this->request_types_allowed)) {
trigger_error('an invalid HTTP request type was used: ' . $this->request_type);
if (!in_array($this->request_method, $this->request_methods_allowed)) {
trigger_error('an invalid HTTP request type was used: ' . $this->request_method);
}
if (!($ch = $this->get_curl_resource())) {
@@ -3620,52 +3740,49 @@ class Client
CURLOPT_URL => $url
];
/**
* what we do when a payload is passed
*/
if (!is_null($payload)) {
$json_payload = json_encode($payload, JSON_UNESCAPED_SLASHES);
$curl_options[CURLOPT_POST] = true;
$curl_options[CURLOPT_POSTFIELDS] = $json_payload;
$headers = [
'Content-Type: application/json;charset=UTF-8',
'Content-Length: ' . strlen($json_payload)
$this->headers = [
'content-type: application/json',
'content-length: ' . strlen($json_payload)
];
if ($this->is_unifi_os) {
$csrf_token = $this->extract_csrf_token_from_cookie();
if ($csrf_token) {
$headers[] = 'x-csrf-token: ' . $csrf_token;
}
}
$curl_options[CURLOPT_HTTPHEADER] = $headers;
/**
* we shouldn't be using GET (the default request type) or DELETE when passing a payload,
* switch to POST instead
*/
switch ($this->request_type) {
case 'GET':
$this->request_type = 'POST';
break;
case 'DELETE':
$this->request_type = 'POST';
break;
case 'PUT':
$curl_options[CURLOPT_CUSTOMREQUEST] = 'PUT';
break;
if ($this->request_method === 'GET' || $this->request_method === 'DELETE') {
$this->request_method = 'POST';
}
}
switch ($this->request_type) {
switch ($this->request_method) {
case 'POST':
$curl_options[CURLOPT_CUSTOMREQUEST] = 'POST';
break;
case 'DELETE':
$curl_options[CURLOPT_CUSTOMREQUEST] = 'DELETE';
break;
case 'PUT':
$curl_options[CURLOPT_CUSTOMREQUEST] = 'PUT';
break;
case 'PATCH':
$curl_options[CURLOPT_CUSTOMREQUEST] = 'PATCH';
break;
case 'POST':
$curl_options[CURLOPT_CUSTOMREQUEST] = 'POST';
break;
}
if ($this->is_unifi_os && $this->request_method !== 'GET') {
$this->create_x_csrf_token_header();
}
if (count($this->headers) > 0) {
$curl_options[CURLOPT_HTTPHEADER] = $this->headers;
}
curl_setopt_array($ch, $curl_options);
@@ -3673,7 +3790,7 @@ class Client
/**
* execute the cURL request
*/
$content = curl_exec($ch);
$response = curl_exec($ch);
if (curl_errno($ch)) {
trigger_error('cURL error: ' . curl_error($ch));
}
@@ -3741,7 +3858,7 @@ class Client
}
print PHP_EOL . '----------RESPONSE-----------' . PHP_EOL;
print $content;
print $response;
print PHP_EOL . '-----------------------------' . PHP_EOL;
print '</pre>' . PHP_EOL;
}
@@ -3749,11 +3866,11 @@ class Client
curl_close($ch);
/**
* set request_type value back to default, just in case
* set request_method value back to default, just in case
*/
$this->request_type = 'GET';
$this->request_method = 'GET';
return $content;
return $response;
}
/**
@@ -3764,7 +3881,7 @@ class Client
protected function get_curl_resource()
{
$ch = curl_init();
if (is_resource($ch)) {
if (is_object($ch) || is_resource($ch)) {
$curl_options = [
CURLOPT_SSL_VERIFYPEER => $this->curl_ssl_verify_peer,
CURLOPT_SSL_VERIFYHOST => $this->curl_ssl_verify_host,