Compare commits

...

24 Commits

Author SHA1 Message Date
malle-pietje
ccea0eee99 re-added the upgrade_device() function/method 2018-04-11 07:50:49 +02:00
malle-pietje
a238ced589 added methods/functions start_rolling_upgrade() and cancel_rolling_upgrade() 2018-04-10 15:24:12 +02:00
malle-pietje
bf9a6e801c added invite_admin() and revoke_admin() functions/methods 2018-03-30 13:57:59 +02:00
malle-pietje
d7827fdbf1 General code cleanup (replace tabs by spaces, etc.)
Finalised merge of PRs #10, #11, #12 and #13
Methods/functions added:
- list_country_codes()
- set_guestlogin_settings_base()
- set_site_connectivity()
- set_site_country()
- set_site_guest_access()
- set_site_locale()
- set_site_mgmt()
- set_site_name()
- set_site_ntp()
- set_site_snmp()
Examples added:
- ap_upgrade_firmware.php
- site_provisioning_example
- update_ac-iw_ports.php
2018-03-24 10:46:42 +01:00
malle-pietje
2c45d95965 Merge branch 'master' of github.com:Art-of-WiFi/UniFi-API-client
merge PRs
2018-03-24 09:29:50 +01:00
malle-pietje
ad21ebaad8 added example to change AC-IW port config
renamed update_wlan_settings_5.5.X.php to update_device_wlan_settings_5.5.X.php
2018-03-24 09:28:25 +01:00
Seth Mos
4532df8eac - Foreach the array to verify if we really need to update the settings so we only trigger for real updates. (#13)
- Move Test array settings down so you don't accidentally delete sites
- Don't delete sites in debug mode.
- Automatically adopt device if it matches the configured LAN settings, ofcourse this only works correctly when LAN settings are unique between sites.
2018-03-19 23:22:24 +01:00
4oo4
93d78b2f22 Add ap_upgrade_firmware.php to Examples (#12)
- add ap_upgrade_firmware.php, contributed by @4oo4
2018-03-18 14:28:40 +01:00
malle-pietje
546334c88e Merge pull request #11 from smos/master
Add a few more function for setting site specific parameters. It was …
2018-03-17 14:05:45 +01:00
Seth Mos
9f5aaa9838 Add a few more function for setting site specific parameters. It was neccesary to create several setting functions
for setting the information, although the site configuration is returned whole as one object.

I also added a provisioning example that I use with our internal ERP that automatically creates, updates and deletes sites according to internal ERP
site information. I added a settings template that has a couple of the most useful defaults, like auto upgrade, country and locale.
2018-03-13 13:39:38 +01:00
malle-pietje
757cf68698 Merge pull request #10 from patrice-guillemette/master
PR by @patrice-guillemette to update Client.php
- add method/function set_site_name()
- add method/function set_guestlogin_settings_base()
2018-03-10 09:00:25 +01:00
Patrice Guillemette
774fced2da Update Client.php 2018-03-09 16:24:31 -05:00
malle-pietje
14f4d58b02 minor bugs removed from two examples 2018-02-01 17:11:05 +01:00
malle-pietje
77972aab55 removed donation section from README (...) 2018-02-01 17:04:13 +01:00
malle-pietje
9629cc909d Merge branch 'master' of github.com:Art-of-WiFi/UniFi-API-client 2018-02-01 16:57:18 +01:00
malle-pietje
f6201ec21c minor changes
added an example to update WLAN settings for recent controllers (5.5.X and higher)
2018-02-01 16:56:17 +01:00
malle-pietje
dcf7d2059c removed some spaces for cosmetic reasons only 2018-01-29 13:36:13 +01:00
malle-pietje
7a5e2b5bbb Merge pull request #7 from JaspervRijbroek/master
Allow for extendibility. Thanks to @JaspervRijbroek
2018-01-29 13:34:06 +01:00
Jasper van Rijbroek
1db9040ea8 Allow for extendibility. 2018-01-20 15:46:04 +01:00
malle-pietje
cab0c1a35d Update README.md 2017-10-26 17:14:39 +02:00
malle-pietje
2b5ed31759 Update README.md 2017-10-26 17:12:51 +02:00
malle-pietje
a13ff36409 Merge branch 'master' of github.com:Art-of-WiFi/UniFi-API-client 2017-10-26 17:07:48 +02:00
malle-pietje
c4bc1243eb - minor code cleanup and input validation/sanitization improvements
- added delete_device() function/method
- added move_device() function/method
- added optional `type` parameter to stat_sessions()
- updated README
2017-10-26 17:06:59 +02:00
malle-pietje
c25f4d1937 Update disable_device.php 2017-10-20 09:25:59 +02:00
18 changed files with 1317 additions and 69 deletions

View File

@@ -1,18 +1,13 @@
## 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.18 has been confirmed to work). It's a standalone version of the class which is used in our API browser tool [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.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).
This class can be installed using composer/[packagist](https://packagist.org/packages/art-of-wifi/unifi-api-client) for easy inclusion in your projects.
### Donations
If you find this PHP API client class useful and wish to support it's further development, please use the PayPal 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)
## Methods and functions supported
The class currently supports the following functions/methods to get/post/put/delete data through the UniFi Controller API:
- login()
- logout()
- adopt_device()
@@ -27,6 +22,7 @@ The class currently supports the following functions/methods to get/post/put/del
- create_usergroup()
- create_voucher()
- create_wlan()
- delete_device()
- delete_network()
- delete_radius_account()
- delete_site()
@@ -35,11 +31,15 @@ The class currently supports the following functions/methods to get/post/put/del
- disable_ap()
- edit_usergroup()
- extend_guest_validity()
- invite_admin()
- revoke_admin()
- led_override()
- list_admins()
- list_all_admins()
- list_alarms()
- list_aps() (deprecated but still available as alias)
- list_clients()
- list_country_codes()
- list_current_channels()
- list_dashboard()
- list_devices()
@@ -67,6 +67,7 @@ The class currently supports the following functions/methods to get/post/put/del
- list_wlan_groups()
- list_wlanconf()
- locate_ap()
- move_device()
- power_cycle_switch_port()
- reconnect_sta()
- rename_ap()
@@ -75,9 +76,18 @@ The class currently supports the following functions/methods to get/post/put/del
- set_ap_radiosettings()
- set_device_settings_base()
- set_guestlogin_settings()
- set_guestlogin_settings_base()
- set_locate_ap() (deprecated but still available as alias)
- set_networksettings_base()
- set_radius_account_base()
- set_site_connectivity()
- set_site_country()
- set_site_guest_access()
- set_site_locale()
- set_site_mgmt()
- set_site_name()
- set_site_ntp()
- set_site_snmp()
- set_sta_name()
- set_sta_note()
- set_usergroup()
@@ -110,10 +120,13 @@ 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:
- set_debug()
- set_site()
- get_debug()
- set_site()
- get_site()
- get_cookie() (renamed from getcookie())
@@ -129,7 +142,7 @@ Please refer to the source code for more details on the functions/methods and th
## Installation ##
You can use **Composer**, **Git** or simply **Download the Release** to install the API client class.
You can use [Composer](#composer), [Git](#git) or simply [Download the Release](#download-the-release) to install the API client class.
### Composer
@@ -200,18 +213,15 @@ $results = $unifi_connection->list_alarms(); // returns a PHP array con
Please refer to the `examples/` directory for some more detailed examples which you can use as a starting point for your own PHP code.
### IMPORTANT NOTES:
#### IMPORTANT NOTES:
In the example above, the last parameter (`true`) that is passed to the constructor, enables validation of the controller's SSL certificate which is otherwise **disabled** by default.
It is highly recommended to enable this feature in production environments where you have a valid SSL cert installed on the UniFi Controller, and which is associated with the FQDN of the server as used in the `controller_url` parameter. This option was added with API client version 1.1.16.
1. The last parameter (`true`) that is passed to the constructor, enables validation of the controller's SSL certificate which is otherwise **disabled** by default. It is highly recommended to enable this feature in production environments where you have a valid SSL cert installed on the UniFi Controller, and which is associated with the FQDN of the server as used in the `controller_url` parameter. This option was added with API client version 1.1.16.
---
2. In the example above, `$site_id` is the 8 character short site "name" which is visible in the URL when managing the site in the UniFi Controller:
In the example above, `$site_id` is the 8 character short site "name" which is visible in the URL when managing the site in the UniFi Controller:
`https://<controller IP address or FQDN>:8443/manage/site/jl3z2shm/dashboard`
`https://<controller IP address or FQDN>:8443/manage/site/jl3z2shm/dashboard`
In this case, `jl3z2shm` is the value required for $site_id.
In this case, `jl3z2shm` is the value required for $site_id.
## Need help or have suggestions?
@@ -223,10 +233,10 @@ If you would like to contribute code (improvements), please open an issue and in
## Credits
This class is largely based on the work done by the following developers:
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.7.20/unifi_sh_api
## Important Disclaimer

View File

@@ -12,4 +12,4 @@ If you would like to share your own example file(s), please open an issue and in
## Important Disclaimer
Use these examples at your own risk!
Use these examples at your own risk!

View File

@@ -0,0 +1,37 @@
<?php
/**
* PHP API usage example
*
* contributed by: @4oo4
* description: example script to check and upgrade device firmware (can be scheduled with systemd/cron)
* to the most current version
*/
require_once('vendor/autoload.php');
require_once('config.php');
/**
* site id of the AP to update
*/
$site_id = '<enter your site id here>';
/**
* device MAC address formatted with colons, e.g. 'de:ad:be:ef:01:23'
*/
$device_mac = '<enter MAC address of device to update>';
/**
* initialize the UniFi API connection class, log in to the controller
* (this example assumes you have already assigned the correct values in config.php to the variables used)
*/
$unifi_connection = new UniFi_API\Client($controlleruser, $controllerpassword, $controllerurl, $site_id, $controllerversion, false);
$login = $unifi_connection->login();
/**
* Run the actual upgrade
*/
$results = $unifi_connection->upgrade_device($device_mac);
/**
* provide feedback in json format from $response given by upgrade_device();
*/
echo json_encode($results, JSON_PRETTY_PRINT);

View File

@@ -3,7 +3,9 @@
* 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
* 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
*/
/**

View File

@@ -21,4 +21,4 @@ $controllerversion = ''; // the version of the Controller software, eg. '4.6.6'
/**
* set to true (without quotes) to enable debug output to the browser and the PHP error log
*/
$debug = false;
$debug = false;

40
examples/create_site.php Executable file
View File

@@ -0,0 +1,40 @@
<?php
/**
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to create a new site, returns true upon success
*/
/**
* 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');
/**
* the site to use to log in to the controller
*/
$site_id = '<short site name of a site the credentials used have access to>';
/**
* description of the new site
*/
$description = 'new site';
/**
* 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);
$loginresults = $unifi_connection->login();
$results = $unifi_connection->create_site($description);
/**
* provide feedback in json format
*/
echo json_encode($results, JSON_PRETTY_PRINT);

41
examples/delete_site.php Executable file
View File

@@ -0,0 +1,41 @@
<?php
/**
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example basic PHP script to delete a site, returns true upon success
*/
/**
* 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');
/**
* the site to use to log in to the controller
*/
$site_id = '<short site name of a site the credentials used have access to>';
/**
* the site to delete, must not be the same site as referenced by $site_id
*/
$site_to_delete = '<_id value of the site>';
/**
* 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);
$loginresults = $unifi_connection->login();
$results = $unifi_connection->delete_site($site_to_delete);
/**
* provide feedback in json format
*/
echo json_encode($results, JSON_PRETTY_PRINT);

View File

@@ -45,6 +45,6 @@ $disable_result = $unifi_connection->disable_ap($device_id, true);
//$disable_result = $unifi_connection->disable_ap($device_id, false);
/**
* provide feedback (the newly created voucher code, without the dash) in json format
* provide feedback in json format
*/
echo json_encode($disable_result, JSON_PRETTY_PRINT);

View File

@@ -26,25 +26,25 @@ $set_debug_mode = $unifi_connection->set_debug($debug);
$loginresults = $unifi_connection->login();
if ($loginresults === 400) {
print "UniFi controller login failure, please check your credentials in config.php.\n";
print "UniFi controller login failure, please check your credentials in config.php.\n";
} else {
$guestlist = $unifi_connection->list_guests();
// print "<pre>"; print_r ($guestlist); print "</pre>";
// loop thru all known guests
foreach ($guestlist as $guest) {
// print "<pre>"; print_r ($guest); print "</pre>";
print "<pre>" . $guest->_id . " (" . $guest->mac . "), valid until " . date (DATE_ATOM, $guest->end) . " (" . $guest->end . ")</pre>";
$guestlist = $unifi_connection->list_guests();
// print "<pre>"; print_r ($guestlist); print "</pre>";
// loop thru all known guests
foreach ($guestlist as $guest) {
// print "<pre>"; print_r ($guest); print "</pre>";
print "<pre>" . $guest->_id . " (" . $guest->mac . "), valid until " . date (DATE_ATOM, $guest->end) . " (" . $guest->end . ")</pre>";
// just a sample: only extend validity of guests which have end date after 2017-04-02
if ($guest->end > 1491166482) {
// extend clients five times = five days
if (!$unifi_connection->extend_guest_validity ($guest->_id)) print "Extend failed for guest with id " . $guest->_id . "\n";
if (!$unifi_connection->extend_guest_validity ($guest->_id)) print "Extend failed for guest with id " . $guest->_id . "\n";
if (!$unifi_connection->extend_guest_validity ($guest->_id)) print "Extend failed for guest with id " . $guest->_id . "\n";
if (!$unifi_connection->extend_guest_validity ($guest->_id)) print "Extend failed for guest with id " . $guest->_id . "\n";
if (!$unifi_connection->extend_guest_validity ($guest->_id)) print "Extend failed for guest with id " . $guest->_id . "\n";
}
}
// just a sample: only extend validity of guests which have end date after 2017-04-02
if ($guest->end > 1491166482) {
// extend clients five times = five days
if (!$unifi_connection->extend_guest_validity ($guest->_id)) print "Extend failed for guest with id " . $guest->_id . "\n";
if (!$unifi_connection->extend_guest_validity ($guest->_id)) print "Extend failed for guest with id " . $guest->_id . "\n";
if (!$unifi_connection->extend_guest_validity ($guest->_id)) print "Extend failed for guest with id " . $guest->_id . "\n";
if (!$unifi_connection->extend_guest_validity ($guest->_id)) print "Extend failed for guest with id " . $guest->_id . "\n";
if (!$unifi_connection->extend_guest_validity ($guest->_id)) print "Extend failed for guest with id " . $guest->_id . "\n";
}
}
$logout_results = $unifi_connection->logout();
$logout_results = $unifi_connection->logout();
}

View File

@@ -3,7 +3,7 @@
* 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
* description: example to pull connected user numbers for Access Points from the UniFi controller and output the results
* in raw HTML format
*/
@@ -36,7 +36,7 @@ $aps_array = $unifi_connection->list_aps();
*/
header('Content-Type: text/html; charset=utf-8');
foreach ($aps_array as $ap) {
if ($ap->type === 'uap') {
echo '<b>AP name:</b>' . $ap->name . ' <b>model:</b>' . $ap->model . ' <b># connected clients:</b>' . $ap->num_sta . '<br>';
}
if ($ap->type === 'uap') {
echo '<b>AP name:</b>' . $ap->name . ' <b>model:</b>' . $ap->model . ' <b># connected clients:</b>' . $ap->num_sta . '<br>';
}
}

View File

@@ -3,7 +3,7 @@
* PHP API usage example
*
* contributed by: Art of WiFi
* description: example to pull site health metrics from the Unifi controller and output the results
* description: example to pull site health metrics from the UniFi controller and output the results
* in json format
*/

View File

@@ -0,0 +1,10 @@
## Site provisioning script
Contributed by @smos
This directory contains an example provisioning script to create a large number of sites with comparable network configurations. It sets the LAN config to site specific configuration. Copy the settings.template.php and config.template.php to their respective files for testing.
This is meant as a basic provisioning only system. Currently used against controller 5.6.30.
## Important Disclaimer
Use all examples at your own risk!

View File

@@ -0,0 +1,24 @@
<?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
*
*/
/**
* Controller configuration
* ===============================
* Copy this file to your working directory, rename it to config.php and update the section below with your UniFi
* controller details and credentials
*/
$controlleruser = ''; // the user name for access to the UniFi Controller
$controllerpassword = ''; // the password for access to the UniFi Controller
$controllerurl = ''; // full url to the UniFi Controller, eg. 'https://22.22.11.11:8443'
$controllerversion = ''; // the version of the Controller software, eg. '4.6.6' (must be at least 4.0.0)
/**
* set to true (without quotes) to enable debug output to the browser and the PHP error log
*/
$debug = false;

View File

@@ -0,0 +1,396 @@
<?php
/**
* PHP API usage example
*
* contributed by: @smos
* description: example provisioning script to create a large number of sites with comparable network configurations
*/
/* include important files */
require_once('UniFi-API-client/src/Client.php');
/* Set the default timezone */
date_default_timezone_set('Europe/Amsterdam');
// Example array with site information, includes numeric reference
$fil_array = array();
$fil_array[600]['aktief'] = 1; // Active
$fil_array[600]['kassa_aantal'] = 1; // Cash registers
$fil_array[600]['divisie_code'] = "D"; // Brand
$fil_array[600]['corr_woonplaats'] = "Amsterdam"; // City
echo "<pre>";
// Import the controller auth config
include("config.php");
/**
* set to true (without quotes) to enable debug output to the browser and the PHP error log
*/
$debug = true;
$site_id = "default";
/**
* initialize the UniFi API connection class, log in to the controller and request the alarms collection
* (this example assumes you have already assigned the correct values to the variables used)
*/
$unifi_connection = new UniFi_API\Client($controller_user, $controller_password, $controller_url, $site_id, $controller_version, false);
$login = $unifi_connection->login();
if($login > 400) {
echo "Failed to log into controller";
die;
}
// $sites = $unifi_connection->list_sites(); // returns a PHP array containing sites
$open_shops = array();
// Mogrify shop info into useable arrays
foreach($fil_array as $filnr => $shop) {
if(floatval($shop['aktief']) == 0)
continue;
if($shop['divisie_code'] != "D")
continue;
if((floatval($shop['kassa_aantal']) > 0))
$open_shops[$filnr] = ucfirst(strtolower($shop['corr_woonplaats']));
}
// If debug, create Fake open shops array, otherwise unset test shops
if($debug === true) {
$open_shops = array();
$open_shops[943] = "Test 1";
$open_shops[965] = "Test 2";
} else {
unset($open_shops[943]);
unset($open_shops[965]);
unset($close_shops[943]);
unset($close_shops[965]);
}
// Check if we can find all our shop sites, otherwise add to todo list for creation, close list for deletion
$todo_shops = $open_shops;
$active_shops = array();
$close_shops = array();
foreach($unifi_connection->list_sites() as $site){
$desc = $site->desc;
// Does it look like a shop?
if(preg_match("/([0-9][0-9][0-9]+)/", $desc, $matches)) {
// echo "Found site {$desc}\n";
unset($todo_shops[floatval($matches[1])]);
$active_shops[floatval($matches[1])] = $site->name;
if(!$open_shops[floatval($matches[1])]) {
// echo "Shop {$matches[1]} does not have hardware\n";
$close_shops[floatval($matches[1])] = $site->name;
}
}
}
// Any sites we need to create before we can continue?
foreach($todo_shops as $filnr => $city){
$filnr = sprintf("%04d", $filnr);
$desc = "{$filnr} {$city}";
echo "Create site for {$filnr}\n";
$createsite = $unifi_connection->create_site($desc);
if($createsite === false) {
echo "Failed to create site for {$filnr}, id {$siteid}\n";
break;
}
}
// Refresh site list
if(count($todo_shops > 0)) {
foreach($unifi_connection->list_sites() as $site){
$desc = $site->desc;
// Does it look like a shop?
if(preg_match("/([0-9][0-9][0-9]+)/", $desc, $matches)) {
// echo "Found site {$desc}\n";
unset($todo_shops[floatval($matches[1])]);
$active_shops[floatval($matches[1])] = $site->name;
}
}
}
// If debug, create Fake site entries array, otherwise unset test shops
if($debug === true) {
$close_shops = array();
$active_shops = array();
$active_shops[965] = "j103b83q";
$active_shops[943] = "winkels";
} else {
unset($active_shops[943]);
unset($active_shops[965]);
unset($close_shops[943]);
unset($close_shops[965]);
}
// We should have 0 todo shops now
// print_r($todo_shops);
/*
echo "Open\n";
print_r($open_shops);
echo "Active\n";
print_r($active_shops);
echo "Close\n";
print_r($close_shops);
die();
*/
// Foreach shop, select the site.
foreach($active_shops as $filnr => $siteid) {
$filnr = sprintf("%04d", $filnr);
$select = $unifi_connection->set_site($siteid);
// fetch configured group settings, we need those later, we only use the Default group.
$wlangroups = $unifi_connection->list_wlan_groups($siteid);
$usergroups = $unifi_connection->list_usergroups($siteid);
if(isset($close_shops[floatval($filnr)])) {
echo "Delete site {$siteid} with id ". $usergroups[0]->site_id ." for shop {$filnr}\n";
if($debug===false) {
$delete = $unifi_connection->delete_site($usergroups[0]->site_id);
}
if($delete === false) {
echo "Failed to delete site for {$filnr}, id {$siteid}\n";
}
continue;
}
// fetch configured group settings, we need those later, we only use the Default group.
$wlangroups = $unifi_connection->list_wlan_groups($siteid);
$usergroups = $unifi_connection->list_usergroups($siteid);
if($debug===true) {
//var_export ($wlangroups);
//var_export ($usergroups);
}
foreach($wlangroups as $group){
// Check if template networks exist
if($group->name == "Default") {
$shawlangroup_id = $group->_id;
}
}
foreach($usergroups as $group){
// Check if template networks exist
if($group->name == "Default") {
$shausergroup_id = $group->_id;
}
}
// Include each time so site specific settings based on shop number are picked up
unset($wirednetworks);
unset($wlannetworks);
unset($siteconf);
include("settings.php");
refresh_networks();
refresh_wlans();
fetch_site_conf();
if($debug===true) {
// var_export ($siteconf);
//var_export ($wlanconf);
// var_export ($networkconf);
//print_r($wlannetworks);
}
foreach($sitesettings as $key => $values) {
if(compare_array_item($sitesettings[$key], $setting[$key])) {
echo "Update site setting {$key} id {$setting_id[$key]} for {$filnr}, id {$siteid}\n";
switch($key){
case "country":
$update_site[$key] = $unifi_connection->set_site_country($setting_id[$key], $sitesettings[$key]);
break;
case "locale":
$update_site[$key] = $unifi_connection->set_site_locale($setting_id[$key], $sitesettings[$key]);
break;
case "connectivity ":
$update_site[$key] = $unifi_connection->set_site_connectivity($setting_id[$key], $sitesettings[$key]);
break;
case "mgmt":
$update_site[$key] = $unifi_connection->set_site_mgmt($setting_id[$key], $sitesettings[$key]);
break;
case "guest_access":
$update_site[$key] = $unifi_connection->set_site_guest_access($setting_id[$key], $sitesettings[$key]);
break;
case "snmp":
$update_site[$key] = $unifi_connection->set_site_snmp($setting_id[$key], $sitesettings[$key]);
break;
case "ntp":
$update_site[$key] = $unifi_connection->set_site_ntp($setting_id[$key], $sitesettings[$key]);
break;
default:
break;
}
}
if($update_site[$key] === false)
echo "Failed to update setting {$key} for {$filnr}, id {$siteid} ". print_r($sitesettings[$key], true) ."\n";
}
foreach($wirednetworks as $key => $values) {
// Template network didn't exist, create
if($wired[$key] === false) {
echo "Create new vlan {$key} for {$filnr}, id {$siteid}\n";
$addnetwork[$key] = $unifi_connection->create_network($wirednetworks[$key]);
// echo json_encode($addvlan, JSON_PRETTY_PRINT);
}
if($addnetwork[$key] === false)
echo "Failed to add network {$key} for {$filnr}, id {$siteid}\n";
// Do we need to update?
if(compare_array_item($wirednetworks[$key], $wired[$key])) {
echo "Update network {$key} id {$wired_id[$key]} for {$filnr}, id {$siteid}\n";
$updatenetwork[$key] = $unifi_connection->set_networksettings_base($wired_id[$key], $wirednetworks[$key]);
}
if($updatenetwork[$key] === false)
echo "Failed to update network {$key} for {$filnr}, id {$siteid} ". print_r($wirednetworks[$key], true) . print_r($wired_id, true) ."\n";
}
foreach($wlannetworks as $key => $values) {
// Template network didn't exist, create
if($wlan[$key] === false) {
echo "Create new disabled wlan {$key} for {$filnr}, id {$siteid}\n";
$addwlan[$key] = $unifi_connection->create_wlan($wlannetworks[$key]['name'], $wlannetworks[$key]['x_passphrase'], $wlannetworks[$key]['usergroup_id'], $wlannetworks[$key]['wlangroup_id'], false);
}
if($addwlan[$key] === false)
echo "Failed to add wlan {$key} for {$filnr}, id {$siteid} ". print_r($wlannetworks[$key], true) ."\n";
else
refresh_wlans();
// Do we need to update?
if(compare_array_item($wlannetworks[$key], $wlan[$key])) {
echo "Update wlan {$key} id {$wlan_id[$key]} for {$filnr}, id {$siteid}\n";
$updatewlan[$key] = $unifi_connection->set_wlansettings_base($wlan_id[$key], $wlannetworks[$key]);
}
if($updatewlan[$key] === false)
echo "Failed to update wlan {$key} for {$filnr}, id {$siteid} ". print_r($wlannetworks[$key], true) . print_r($wlan_id, true) ."\n";
}
// Any devices for adoption?
$devices[$filnr] = $unifi_connection->list_devices();
foreach($devices[$filnr] as $device) {
if($device->adopted == 1)
continue;
// Does this unadopted device belong to this shop network?
if(netMatch($wirednetworks['LAN']['ip_subnet'], $device->ip)) {
// Adopt device in IP range. adopt_device($mac)
echo "Adopting device {$device->mac} with ip {$device->ip} in network {$wirednetworks['LAN']['ip_subnet']} for shop {$filnr}\n";
$unifi_connection->adopt_device($device->mac);
// print_r($device);
}
}
if($debug===true) {
//break;
}
}
$logout = $unifi_connection->logout();
function refresh_networks() {
global $unifi_connection;
global $networkconf;
global $wired;
global $wired_id;
global $shasite_id;
global $wirednetworks;
// Fetch configured wired networks
$networkconf = $unifi_connection->list_networkconf();
foreach($wirednetworks as $key => $values) {
$wired[$key] = false;
}
// Lan netwerken
foreach($networkconf as $network){
// Check if template networks exist
foreach($wirednetworks as $key => $values) {
if(($network->name == "$key")) {
$wired[$key] = $network;
$wired_id[$key] = $network->_id;
$shasite_id = $network->site_id;
}
}
}
}
function refresh_wlans() {
global $unifi_connection;
global $wlanconf;
global $wlan;
global $wlan_id;
global $shasite_id;
global $wlannetworks;
// Fetch Wireless networks
$wlanconf = $unifi_connection->list_wlanconf();
foreach($wlannetworks as $key => $values)
$wlan[$key] = false;
foreach($wlanconf as $network){
// Check if template networks exist
foreach($wlannetworks as $key => $values) {
if($network->name == "$key") {
$wlan[$key] = $network;
$wlan_id[$key] = $network->_id;
$shasite_id = $network->site_id;
}
}
}
}
function fetch_site_conf() {
global $unifi_connection;
global $siteconf;
global $siteid;
global $sitesettings;
global $setting;
global $setting_id;
// Fetch site settings
$siteconf = $unifi_connection->list_settings($siteid);
foreach($sitesettings as $key => $values)
$sitesetting[$key] = false;
$setting = array();
foreach($siteconf as $arr) {
$setting[$arr->key] = $arr;
$setting_id[$arr->key] = $arr->_id;
}
}
// Return true or false
function compare_array_item($setting, $existing) {
$existing = (array)$existing;
unset($setting['site_id']);
unset($setting['_id']);
unset($existing['_id']);
unset($existing['site_id']);
foreach($setting as $key => $value) {
if(!is_array($setting[$key])) {
if($setting[$key] != $existing[$key]){
echo "setting key {$key} value {$value} differs from {$existing[$key]} - ";
// print_r($setting);
// print_r($existing);
return true;
}
}
if(is_array($setting[$key])) {
$diff = array();
$diff = array_diff_assoc($setting[$key], $existing[$key]);
if(!empty($diff)) {
echo "setting subkey {$key} differs diff count ". count($diff)."\n";
// print_r($diff);
// print_r($setting);
// print_r($existing);
return true;
}
}
}
return false;
}
?>

View File

@@ -0,0 +1,197 @@
<?php
/**
* template settings file for site provisioning example script
*
* contributed by: @smos
*/
// Extract shop IP addressing from numeric shop number, you could use something else, static or using a database lookup.
$octet1 = 10;
if(strlen($filnr) == 3) {
$octet2 = floatval(substr($filnr,0,1));
$octet3 = floatval(substr($filnr,1,2));
} else {
$octet2 = floatval(substr($filnr,0,2));
$octet3 = floatval(substr($filnr,2,2));
}
// Wired networks
$wirednetworks['LAN'] = array(
'dhcpd_enabled' => true,
'dhcpd_start' => "{$octet1}.{$octet2}.{$octet3}.100",
'dhcpd_stop' => "{$octet1}.{$octet2}.{$octet3}.150",
'domain_name' => 'foo.bar.nl',
'dhcpd_dns_1' => '10.56.154.13',
'dhcpd_dns_2' => '10.34.234.66',
'dhcpd_ip_1' => "{$octet1}.{$octet2}.{$octet3}.254",
'dhcpguard_enabled' => true,
'ip_subnet' => "{$octet1}.{$octet2}.{$octet3}.254/24",
'is_nat' => true,
'name' => 'LAN',
'networkgroup' => 'LAN',
'purpose' => 'corporate',
'site_id' => $shasite_id,
'vlan_enabled' => false,
);
$wirednetworks['shop-wifi'] = array(
'enabled' => true,
'is_nat' => true,
'dhcpd_ip_1' => '192.168.2.254',
'dhcpguard_enabled' => true,
'name' => 'shop-wifi',
'purpose' => 'vlan-only',
'site_id' => $shasite_id,
'vlan_enabled' => true,
'vlan' => 10,
);
// Wireless networks
$wlannetworks["UBNT-{$filnr}"] = array(
'enabled' => true,
'is_guest' => true,
'mac_filter_enabled' => false,
'mac_filter_list' => array (),
'mac_filter_policy' => 'allow',
'name' => "UBNT-{$filnr}",
'usergroup_id' => $shausergroup_id,
'wlangroup_id' => $shawlangroup_id,
'schedule' =>
array (
0 => 'mon|0800-1800',
1 => 'tue|0800-1800',
2 => 'wed|0800-1800',
3 => 'thu|0800-1800',
4 => 'fri|0800-1800',
5 => 'sat|0800-1800',
6 => 'sun|0800-1800',
),
'schedule_enabled' => true,
'security' => 'wpapsk',
'site_id' => $shasite_id,
'vlan' => '10',
'vlan_enabled' => true,
'wep_idx' => 1,
'wpa_enc' => 'ccmp',
'wpa_mode' => 'wpa2',
'x_passphrase' => 'datisgeheim',
);
$wlannetworks['CorporateWifi'] = array(
'enabled' => true,
'is_guest' => false,
'mac_filter_enabled' => false,
'mac_filter_list' => array (),
'mac_filter_policy' => 'allow',
'name' => "CorporateWifi",
'usergroup_id' => $shausergroup_id,
'wlangroup_id' => $shawlangroup_id,
'schedule' =>
array (
0 => 'mon|0800-1800',
1 => 'tue|0800-1800',
2 => 'wed|0800-1800',
3 => 'thu|0800-1800',
4 => 'fri|0800-1800',
5 => 'sat|0800-1800',
6 => 'sun|0800-1800',
),
'schedule_enabled' => true,
'security' => 'wpapsk',
'site_id' => $shasite_id,
'wep_idx' => 1,
'wpa_enc' => 'ccmp',
'wpa_mode' => 'wpa2',
'x_passphrase' => 'SuperSecretPassword',
);
// Unset this network for test shops
if(preg_match("/[0-9][9][0-9]+)/si", $filnr))
unset($wlannetworks['CorporateWifi']);
// Site settings template
$sitesettings['connectivity'] = array(
'enabled' => true,
'key' => 'connectivity',
'site_id' => $shasite_id,
'uplink_type' => 'gateway',
);
$sitesettings['guest_access'] = array(
'auth' => 'none',
'key' => 'guest_access',
'redirect_https' => true,
'redirect_to_https' => false,
'restricted_subnet_1' => '192.168.0.0/16',
'restricted_subnet_2' => '172.16.0.0/12',
'restricted_subnet_3' => '10.0.0.0/8',
'site_id' => $shasite_id,
);
$sitesettings['country'] = array(
'code' => '528',
'key' => 'country',
'site_id' => $shasite_id,
);
$sitesettings['locale'] = array(
'key' => 'locale',
'site_id' => $shasite_id,
'timezone' => 'Europe/Amsterdam',
);/*
$sitesettings['porta'] = array(
'key' => 'porta',
'site_id' => $shasite_id,
'ugw3_wan2_enabled' => false,
);*/
$sitesettings['snmp'] = array(
'community' => 'esenempee',
'key' => 'snmp',
'site_id' => $shasite_id,
);
$sitesettings['rsyslogd'] = array(
'key' => 'rsyslogd',
'port' => '514',
'site_id' => $shasite_id,
);/*
$sitesettings['auto_speedtest'] = array(
'enabled' => false,
'interval' => 20,
'key' => 'auto_speedtest',
'site_id' => $shasite_id,
);*/
$sitesettings['ntp'] = array(
'key' => 'ntp',
'ntp_server_1' => 'ntp.xs4all.nl',
'ntp_server_2' => '0.ubnt.pool.ntp.org',
'site_id' => $shasite_id,
);
/*
$sitesettings['usg'] = array(
'broadcast_ping' => false,
'ftp_module' => true,
'gre_module' => true,
'h323_module' => true,
'key' => 'usg',
'mdns_enabled' => false,
'mss_clamp' => 'auto',
'offload_accounting' => true,
'offload_l2_blocking' => true,
'offload_sch' => true,
'pptp_module' => true,
'receive_redirects' => false,
'send_redirects' => true,
'sip_module' => true,
'site_id' => $shasite_id,
'syn_cookies' => true,
'tftp_module' => true,
'upnp_enabled' => false,
'upnp_nat_pmp_enabled' => true,
'upnp_secure_mode' => true,
);*/
$sitesettings['mgmt'] = array(
'advanced_feature_enabled' => false,
'alert_enabled' => true,
'auto_upgrade' => true,
'key' => 'mgmt',
'led_enabled' => true,
'site_id' => $shasite_id,
'unifi_idp_enabled' => true,
'x_ssh_auth_password_enabled' => true,
'x_ssh_bind_wildcard' => false,
'x_ssh_enabled' => true,
);

78
examples/update_ac-iw_ports.php Executable file
View File

@@ -0,0 +1,78 @@
<?php
/**
* 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)
*/
/**
* 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');
/**
* the site to use to log in to the controller
*/
$site_id = '<short site name of a site the credentials used have access to>';
/**
* the MAC address of the AC-IW device to re-configure
*/
$device_mac = '<enter MAC address>';
/**
* port configuration id to apply to port #1 of the AC-IW device
* NOTE: port configurations are available through list_portconf()
*/
$port_conf_id_port_1 = '<_id of port configuration to apply to port #1>';
/**
* port configuration id to apply to port #2 of the AC-IW device
* NOTE: port configurations are available through list_portconf()
*/
$port_conf_id_port_2 = '<_id of port configuration to apply to port #2>';
/**
* prepare the payload to pass on to the API endpoint
*/
$new_ports_config = [
'port_overrides' => [
[
'port_idx' => 1,
'portconf_id' => $port_conf_id_port_1
],
[
'port_idx' => 2,
'portconf_id' => $port_conf_id_port_2
]
]
];
/**
* 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, false);
$set_debug_mode = $unifi_connection->set_debug(false);
$loginresults = $unifi_connection->login();
$data = $unifi_connection->list_devices($device_mac);
$device_id = $data[0]->device_id;
$update_device = $unifi_connection->set_device_settings_base($device_id, $new_ports_config);
if(!$update_device){
$error = $unifi_connection->get_last_results_raw();
echo json_encode($error, JSON_PRETTY_PRINT);
}
/**
* provide feedback in json format
*/
echo json_encode($update_device, JSON_PRETTY_PRINT);

View File

@@ -0,0 +1,83 @@
<?php
/**
* 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
*/
/**
* 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');
/**
* the site to use to log in to the controller
*/
$site_id = '<short site name of a site the credentials used have access to>';
/**
* the MAC address of the access point to modify
*/
$ap_mac = '<enter MAC address>';
/**
* power level for 2.4GHz
*/
$ng_tx_power_mode = 'low';
/**
* channel for 2.4GHz
*/
$ng_channel = 6;
/**
* power level for 5GHz
*/
$na_tx_power_mode = 'medium';
/**
* channel for 5GHz
*/
$na_channel = 44;
/**
* 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, false);
$set_debug_mode = $unifi_connection->set_debug(false);
$loginresults = $unifi_connection->login();
$data = $unifi_connection->list_devices($ap_mac);
$radio_table = $data[0]->radio_table;
$device_id = $data[0]->device_id;
foreach($radio_table as $radio){
if($radio->radio === 'ng'){
$radio->tx_power_mode = $ng_tx_power_mode;
$radio->channel = $ng_channel;
}
if($radio->radio === 'na'){
$radio->tx_power_mode = $na_tx_power_mode;
$radio->channel = $na_channel;
}
}
$update_device = $unifi_connection->set_device_settings_base($device_id, ['radio_table' => $radio_table]);
if(!$update_device){
$error = $unifi_connection->get_last_results_raw();
echo json_encode($error, JSON_PRETTY_PRINT);
}
/**
* provide feedback in json format
*/
echo json_encode($update_device, JSON_PRETTY_PRINT);

View File

@@ -13,7 +13,6 @@
* This source file is subject to the MIT license that is bundled
* with this package in the file LICENSE.md
*/
namespace UniFi_API;
/**
@@ -24,11 +23,11 @@ class Client
/**
* private properties
*/
private $baseurl = 'https://127.0.0.1:8443';
private $site = 'default';
private $version = '5.4.16';
private $debug = false;
private $is_loggedin = false;
protected $baseurl = 'https://127.0.0.1:8443';
protected $site = 'default';
protected $version = '5.4.16';
protected $debug = false;
protected $is_loggedin = false;
private $cookies = '';
private $request_type = 'POST';
private $connect_timeout = 10;
@@ -43,12 +42,12 @@ class Client
* return a new class instance
* required parameter <user> = string; user name to use when connecting to the UniFi controller
* required parameter <password> = string; password to use when connecting to the UniFi controller
* optional parameter <baseurl> = string; base URL of the UniFi controller, must include "https://" prefix and port suffix (:8443)
* optional parameter <baseurl> = string; base URL of the UniFi controller, *must* include "https://" prefix and port suffix (:8443)
* optional parameter <site> = string; short site name to access, defaults to "default"
* optional parameter <version> = string; the version number of the controller, defaults to "5.4.16"
* optional parameter <ssl_verify> = boolean; whether to validate the controller's SSL certificate or not, true is recommended for
* production environments to prevent potential MitM attacks, default is to not validate the
* controller certificate
* optional parameter <ssl_verify> = boolean; whether to validate the controller's SSL certificate or not, a value of true is
* recommended for production environments to prevent potential MitM attacks, default value (false)
* is to not validate the controller certificate
*/
function __construct($user, $password, $baseurl = '', $site = '', $version = '', $ssl_verify = false)
{
@@ -178,8 +177,8 @@ class Client
*/
public function set_site($site)
{
$this->check_site($site);
$this->site = trim($site);
$this->check_site($this->site);
return $this->site;
}
@@ -210,6 +209,16 @@ class Client
return false;
}
/**
* Get debug mode
* --------------
* get the value of private property debug, returns the current boolean value for debug
*/
public function get_debug()
{
return $this->debug;
}
/**
* Get last raw results
* --------------------
@@ -242,6 +251,12 @@ class Client
* Get Cookie from UniFi Controller
* --------------------------------
* returns the UniFi controller cookie
*
* NOTES:
* - when the results from this method are stored in $_SESSION['unificookie'], the class will initially not
* log in to the controller when a subsequent request is made using a new instance. This speeds up the
* overall request considerably. If that subsequent request fails (e.g. cookies have expired), a new login
* is executed automatically and the value of $_SESSION['unificookie'] is updated.
*/
public function get_cookie()
{
@@ -467,7 +482,7 @@ class Client
$end = is_null($end) ? ((time())*1000) : intval($end);
$start = is_null($start) ? $end-(12*3600*1000) : intval($start);
$json = ['attrs' => ['bytes', 'num_sta', 'time'], 'start' => $start, 'end' => $end];
if (!is_null($mac)) $json['mac'] = $mac;
if (!is_null($mac)) $json['mac'] = strtolower($mac);
$json = json_encode($json);
$response = $this->exec_curl('/api/s/'.$this->site.'/stat/report/5minutes.ap', 'json='.$json);
return $this->process_response($response);
@@ -491,7 +506,7 @@ class Client
$end = is_null($end) ? ((time())*1000) : intval($end);
$start = is_null($start) ? $end-(7*24*3600*1000) : intval($start);
$json = ['attrs' => ['bytes', 'num_sta', 'time'], 'start' => $start, 'end' => $end];
if (!is_null($mac)) $json['mac'] = $mac;
if (!is_null($mac)) $json['mac'] = strtolower($mac);
$json = json_encode($json);
$response = $this->exec_curl('/api/s/'.$this->site.'/stat/report/hourly.ap', 'json='.$json);
return $this->process_response($response);
@@ -515,7 +530,7 @@ class Client
$end = is_null($end) ? ((time())*1000) : intval($end);
$start = is_null($start) ? $end-(7*24*3600*1000) : intval($start);
$json = ['attrs' => ['bytes', 'num_sta', 'time'], 'start' => $start, 'end' => $end];
if (!is_null($mac)) $json['mac'] = $mac;
if (!is_null($mac)) $json['mac'] = strtolower($mac);
$json = json_encode($json);
$response = $this->exec_curl('/api/s/'.$this->site.'/stat/report/daily.ap', 'json='.$json);
return $this->process_response($response);
@@ -528,17 +543,19 @@ class Client
* optional parameter <start> = Unix timestamp in seconds
* optional parameter <end> = Unix timestamp in seconds
* optional parameter <mac> = client MAC address to return sessions for (can only be used when start and end are also provided)
* optional parameter <type> = client type to return sessions for, can be 'all', 'guest' or 'user'; default value is 'all'
*
* NOTES:
* - defaults to the past 7*24 hours
*/
public function stat_sessions($start = null, $end = null, $mac = null)
public function stat_sessions($start = null, $end = null, $mac = null, $type = 'all')
{
if (!$this->is_loggedin) return false;
if (!in_array($type, ['all', 'guest', 'user'])) return false;
$end = is_null($end) ? time() : intval($end);
$start = is_null($start) ? $end-(7*24*3600) : intval($start);
$json = ['type'=> 'all', 'start' => $start, 'end' => $end];
if (!is_null($mac)) $json['mac'] = $mac;
$json = ['type'=> $type, 'start' => $start, 'end' => $end];
if (!is_null($mac)) $json['mac'] = strtolower($mac);
$json = json_encode($json);
$response = $this->exec_curl('/api/s/'.$this->site.'/stat/session', 'json='.$json);
return $this->process_response($response);
@@ -863,6 +880,142 @@ class Client
return $this->process_response_boolean($response);
}
/**
* Change a site's name
* --------------------
* return true on success
* required parameter <site_name> = string; the long name for the site
*
* NOTES: immediately after being changed, the site will be available in the output of the list_sites() function
*/
public function set_site_name($site_name)
{
if (!$this->is_loggedin) return false;
$json = json_encode(['cmd' => 'update-site', 'desc' => $site_name]);
$response = $this->exec_curl('/api/s/'.$this->site.'/cmd/sitemgr', 'json='.$json);
return $this->process_response_boolean($response);
}
/**
* Set site country
* ----------------
* required parameter <setting> = stdClass object or associative array containing the configuration to apply to the network, must be a (partial)
* object structured in the same manner as is returned by list_settings() for the "country" key.
* Valid country codes can be obtained using the list_country_codes() function/method.
* Do not include the _id property, it will be assigned by the controller and returned upon success.
* return true on success
*/
public function set_site_country($country_id, $setting)
{
if (!$this->is_loggedin) return false;
$this->request_type = 'PUT';
$json = json_encode($setting);
$response = $this->exec_curl('/api/s/'.$this->site.'/rest/setting/country/'.trim($country_id), 'json='.$json);
return $this->process_response_boolean($response);
}
/**
* Set site locale
* ---------------
* required parameter <setting> = stdClass object or associative array containing the configuration to apply to the network, must be a (partial)
* object structured in the same manner as is returned by list_settings() for the "locale" key.
* Do not include the _id property, it will be assigned by the controller and returned upon success.
* return true on success
*/
public function set_site_locale($locale_id, $setting)
{
if (!$this->is_loggedin) return false;
$this->request_type = 'PUT';
$json = json_encode($setting);
$response = $this->exec_curl('/api/s/'.$this->site.'/rest/setting/locale/'.trim($locale_id), 'json='.$json);
return $this->process_response_boolean($response);
}
/**
* Set site snmp
* -------------
* required parameter <setting> = stdClass object or associative array containing the configuration to apply to the network, must be a (partial)
* object structured in the same manner as is returned by list_settings() for the "snmp" key.
* Do not include the _id property, it will be assigned by the controller and returned upon success.
* return true on success
*/
public function set_site_snmp($snmp_id, $setting)
{
if (!$this->is_loggedin) return false;
$this->request_type = 'PUT';
$json = json_encode($setting);
$response = $this->exec_curl('/api/s/'.$this->site.'/rest/setting/snmp/'.trim($snmp_id), 'json='.$json);
return $this->process_response_boolean($response);
}
/**
* Set site mgmt
* -------------
* required parameter <setting> = stdClass object or associative array containing the configuration to apply to the network, must be a (partial)
* object structured in the same manner as is returned by list_settings() for the "mgmt" key.
* Do not include the _id property, it will be assigned by the controller and returned upon success.
* return true on success
*/
public function set_site_mgmt($mgmt_id, $setting)
{
if (!$this->is_loggedin) return false;
$this->request_type = 'PUT';
$json = json_encode($setting);
$response = $this->exec_curl('/api/s/'.$this->site.'/rest/setting/mgmt/'.trim($mgmt_id), 'json='.$json);
return $this->process_response_boolean($response);
}
/**
* Set site guest access
* ---------------------
* required parameter <setting> = stdClass object or associative array containing the configuration to apply to the network, must be a (partial)
* object structured in the same manner as is returned by list_settings() for the "guest_access" key.
* Do not include the _id property, it will be assigned by the controller and returned upon success.
* return true on success
*/
public function set_site_guest_access($guest_access_id, $setting)
{
if (!$this->is_loggedin) return false;
$this->request_type = 'PUT';
$json = json_encode($setting);
$response = $this->exec_curl('/api/s/'.$this->site.'/rest/setting/guest_access/'.trim($guest_access_id), 'json='.$json);
return $this->process_response_boolean($response);
}
/**
* Set site ntp
* ------------
* required parameter <setting> = stdClass object or associative array containing the configuration to apply to the network, must be a (partial)
* object structured in the same manner as is returned by list_settings() for the "ntp" key.
* Do not include the _id property, it will be assigned by the controller and returned upon success.
* return true on success
*/
public function set_site_ntp($ntp_id, $setting)
{
if (!$this->is_loggedin) return false;
$this->request_type = 'PUT';
$json = json_encode($setting);
$response = $this->exec_curl('/api/s/'.$this->site.'/rest/setting/ntp/'.trim($ntp_id), 'json='.$json);
return $this->process_response_boolean($response);
}
/**
* Set site connectivity
* ---------------------
* required parameter <setting> = stdClass object or associative array containing the configuration to apply to the network, must be a (partial)
* object structured in the same manner as is returned by list_settings() for the "connectivity" key.
* Do not include the _id property, it will be assigned by the controller and returned upon success.
* return true on success
*/
public function set_site_connectivity($connectivity_id, $setting)
{
if (!$this->is_loggedin) return false;
$this->request_type = 'PUT';
$json = json_encode($setting);
$response = $this->exec_curl('/api/s/'.$this->site.'/rest/setting/connectivity/'.trim($connectivity_id), 'json='.$json);
return $this->process_response_boolean($response);
}
/**
* List admins
* -----------
@@ -876,6 +1029,89 @@ class Client
return $this->process_response($response);
}
/**
* List all admins
* ---------------
* returns an array containing administrator objects for all sites
*/
public function list_all_admins()
{
if (!$this->is_loggedin) return false;
$response = $this->exec_curl('/api/stat/admin');
return $this->process_response($response);
}
/**
* Invite a new admin for access to the current site
* -------------------------------------------------
* returns true on success
* required parameter <name> = string, name to assign to the new admin user
* required parameter <email> = email address to assign to the new admin user
* optional parameter <enable_sso> = boolean, whether or not SSO will be allowed for the new admin
* default value is true which enables the SSO capability
* optional parameter <readonly> = boolean, whether or not the new admin will have readonly
* permissions, default value is true which gives the new admin
* administrator permissions
* optional parameter <device_adopt> = 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 <device_restart> = 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 <admin_id> = 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
* ----------------
@@ -1076,6 +1312,22 @@ class Client
return $this->process_response($response);
}
/**
* 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()
{
if (!$this->is_loggedin) return false;
$response = $this->exec_curl('/api/s/'.$this->site.'/stat/ccode');
return $this->process_response($response);
}
/**
* List port forwarding settings
* -----------------------------
@@ -1101,8 +1353,8 @@ class Client
}
/**
* List port configuration
* -----------------------
* List port configurations
* ------------------------
* returns an array of port configurations
*/
public function list_portconf()
@@ -1253,6 +1505,9 @@ class Client
* required parameter <ht>(default=20)
* required parameter <tx_power_mode>
* required parameter <tx_power>(default=0)
*
* NOTES:
* - only supported on pre-5.X.X controller versions
*/
public function set_ap_radiosettings($ap_id, $radio, $channel, $ht, $tx_power_mode, $tx_power)
{
@@ -1323,6 +1578,20 @@ class Client
return $this->process_response_boolean($response);
}
/**
* Update guestlogin settings, base
* ------------------------------------------
* return true on success
* required parameter <network_settings> = stdClass object or associative array containing the configuration to apply to the guestlogin, must be a (partial)
* object/array structured in the same manner as is returned by list_settings() for the guest_access.
*/
public function set_guestlogin_settings_base($guestlogin_settings) {
if (!$this->is_loggedin) return false;
$json = json_encode($guestlogin_settings, JSON_UNESCAPED_SLASHES);
$response = $this->exec_curl('/api/s/'.$this->site.'/set/setting/guest_access', 'json='.$json);
return $this->process_response_boolean($response);
}
/**
* Rename access point
* -------------------
@@ -1338,6 +1607,35 @@ class Client
return $this->process_response_boolean($response);
}
/**
* Move a device to another site
* -----------------------------
* return true on success
* required parameter <mac> = string; MAC address of the device to move
* required parameter <site_id> = 24 char string; _id of the site to move the device to
*/
public function move_device($mac, $site_id)
{
if (!$this->is_loggedin) return false;
$json = json_encode(['site' => $site_id, 'mac' => $mac, 'cmd' => 'move-device']);
$response = $this->exec_curl('/api/s/'.$this->site.'/cmd/sitemgr', 'json='.$json);
return $this->process_response_boolean($response);
}
/**
* Delete a device from the current site
* -------------------------------------
* return true on success
* required parameter <mac> = string; MAC address of the device to delete
*/
public function delete_device($mac)
{
if (!$this->is_loggedin) return false;
$json = json_encode(['mac' => $mac, 'cmd' => 'delete-device']);
$response = $this->exec_curl('/api/s/'.$this->site.'/cmd/sitemgr', 'json='.$json);
return $this->process_response_boolean($response);
}
/**
* List network settings (using REST)
* ----------------------------------
@@ -1544,7 +1842,7 @@ class Client
* required parameter <wlan_id>
* required parameter <mac_filter_policy> = string, "allow" or "deny"; default MAC policy to apply
* required parameter <mac_filter_enabled> = boolean; true enables the policy, false disables it
* required parameter <macs> = array; must contain MAC strings to be placed in the MAC filter list,
* required parameter <macs> = array; must contain valid MAC strings to be placed in the MAC filter list,
* replacing existing values. Existing MAC filter list can be obtained
* through list_wlanconf().
*/
@@ -1656,6 +1954,38 @@ class Client
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
* -------------------------------------------
@@ -1941,7 +2271,7 @@ class Client
/**
* Process regular responses where output is the content of the data array
*/
private function process_response($response_json)
protected function process_response($response_json)
{
$response = json_decode($response_json);
$this->catch_json_last_error();
@@ -1967,7 +2297,7 @@ class Client
/**
* Process responses where output should be boolean (true/false)
*/
private function process_response_boolean($response_json)
protected function process_response_boolean($response_json)
{
$response = json_decode($response_json);
$this->catch_json_last_error();
@@ -2091,7 +2421,7 @@ class Client
/**
* Execute the cURL request
*/
private function exec_curl($path, $data = '')
protected function exec_curl($path, $data = '')
{
$url = $this->baseurl.$path;