From d7827fdbf18e454f876bba514a6175a32160d669 Mon Sep 17 00:00:00 2001 From: malle-pietje Date: Sat, 24 Mar 2018 10:46:42 +0100 Subject: [PATCH] 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 --- README.md | 10 + examples/README.md | 6 - examples/ap_upgrade_firmware.php | 38 +- examples/extend_guest_auth.php | 36 +- examples/list_ap_connected_users.php | 8 +- examples/list_site_health.php | 2 +- examples/provision.php | 389 ----------------- examples/settings.template.php | 195 --------- examples/site_provisioning_example/README.md | 10 + .../config.template.php | 24 ++ .../site_provisioning_example/provision.php | 396 ++++++++++++++++++ .../settings.template.php | 197 +++++++++ examples/update_ac-iw_ports.php | 14 +- src/Client.php | 115 ++--- 14 files changed, 751 insertions(+), 689 deletions(-) mode change 100644 => 100755 examples/ap_upgrade_firmware.php delete mode 100644 examples/provision.php delete mode 100644 examples/settings.template.php create mode 100755 examples/site_provisioning_example/README.md create mode 100755 examples/site_provisioning_example/config.template.php create mode 100755 examples/site_provisioning_example/provision.php create mode 100755 examples/site_provisioning_example/settings.template.php mode change 100644 => 100755 src/Client.php diff --git a/README.md b/README.md index c2bc547..db74825 100755 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ The class currently supports the following functions/methods to get/post/put/del - list_alarms() - list_aps() (deprecated but still available as alias) - list_clients() +- list_country_codes() - list_current_channels() - list_dashboard() - list_devices() @@ -73,9 +74,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() diff --git a/examples/README.md b/examples/README.md index 1bba36a..319e47b 100755 --- a/examples/README.md +++ b/examples/README.md @@ -13,9 +13,3 @@ 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! - -## Provisioning script - -The example provision script easily creates a large number of sites with comparable network configuration. 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. diff --git a/examples/ap_upgrade_firmware.php b/examples/ap_upgrade_firmware.php old mode 100644 new mode 100755 index 6ce0e5d..4f598aa --- a/examples/ap_upgrade_firmware.php +++ b/examples/ap_upgrade_firmware.php @@ -1,33 +1,37 @@ '; /** - * 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) + * device MAC address formatted with colons, e.g. 'de:ad:be:ef:01:23' */ +$device_mac = ''; +/** + * 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 +/** + * 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); - -?> +echo json_encode($results, JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/examples/extend_guest_auth.php b/examples/extend_guest_auth.php index d1fff47..a6780e8 100755 --- a/examples/extend_guest_auth.php +++ b/examples/extend_guest_auth.php @@ -26,25 +26,25 @@ $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 "
"; print_r ($guestlist); print "
"; - // loop thru all known guests - foreach ($guestlist as $guest) { - // print "
"; print_r ($guest); print "
"; - print "
" . $guest->_id . " (" . $guest->mac . "), valid until " . date (DATE_ATOM, $guest->end) . " (" . $guest->end . ")
"; + $guestlist = $unifi_connection->list_guests(); + // print "
"; print_r ($guestlist); print "
"; + // loop thru all known guests + foreach ($guestlist as $guest) { + // print "
"; print_r ($guest); print "
"; + print "
" . $guest->_id . " (" . $guest->mac . "), valid until " . date (DATE_ATOM, $guest->end) . " (" . $guest->end . ")
"; - // 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(); } \ No newline at end of file diff --git a/examples/list_ap_connected_users.php b/examples/list_ap_connected_users.php index a07ebb7..e87b331 100755 --- a/examples/list_ap_connected_users.php +++ b/examples/list_ap_connected_users.php @@ -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 @@ */ header('Content-Type: text/html; charset=utf-8'); foreach ($aps_array as $ap) { - if ($ap->type === 'uap') { - echo 'AP name:' . $ap->name . ' model:' . $ap->model . ' # connected clients:' . $ap->num_sta . '
'; - } + if ($ap->type === 'uap') { + echo 'AP name:' . $ap->name . ' model:' . $ap->model . ' # connected clients:' . $ap->num_sta . '
'; + } } \ No newline at end of file diff --git a/examples/list_site_health.php b/examples/list_site_health.php index 4ea10dd..a7e0159 100755 --- a/examples/list_site_health.php +++ b/examples/list_site_health.php @@ -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 */ diff --git a/examples/provision.php b/examples/provision.php deleted file mode 100644 index b6f5519..0000000 --- a/examples/provision.php +++ /dev/null @@ -1,389 +0,0 @@ -"; -// 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; -} -?> \ No newline at end of file diff --git a/examples/settings.template.php b/examples/settings.template.php deleted file mode 100644 index f16a2b9..0000000 --- a/examples/settings.template.php +++ /dev/null @@ -1,195 +0,0 @@ - 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, - ); - - -?> \ No newline at end of file diff --git a/examples/site_provisioning_example/README.md b/examples/site_provisioning_example/README.md new file mode 100755 index 0000000..e5f028f --- /dev/null +++ b/examples/site_provisioning_example/README.md @@ -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! \ No newline at end of file diff --git a/examples/site_provisioning_example/config.template.php b/examples/site_provisioning_example/config.template.php new file mode 100755 index 0000000..1052620 --- /dev/null +++ b/examples/site_provisioning_example/config.template.php @@ -0,0 +1,24 @@ +"; +// 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; +} +?> \ No newline at end of file diff --git a/examples/site_provisioning_example/settings.template.php b/examples/site_provisioning_example/settings.template.php new file mode 100755 index 0000000..d4c3a1b --- /dev/null +++ b/examples/site_provisioning_example/settings.template.php @@ -0,0 +1,197 @@ + 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, +); \ No newline at end of file diff --git a/examples/update_ac-iw_ports.php b/examples/update_ac-iw_ports.php index fd5aeb4..391fd5c 100755 --- a/examples/update_ac-iw_ports.php +++ b/examples/update_ac-iw_ports.php @@ -3,9 +3,9 @@ * PHP API usage example * * contributed by: Art of WiFi - * description: example basic PHP script to update the port settings of an AC-IW device when using a controller + * 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 version 5.5.X or higher (to be verified) + * note: requires controller version 5.5.X or higher (to be verified) */ /** @@ -25,19 +25,19 @@ $site_id = ''; /** - * the MAC address of the AC-IW device to modify + * the MAC address of the AC-IW device to re-configure */ $device_mac = ''; /** - * port configuration to apply to port #1 of the AC-IW device - * NOTE: available port configurations are available through list_portconf() + * 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 to apply to port #2 of the AC-IW device - * NOTE: available port configurations are available through list_portconf() + * 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>'; diff --git a/src/Client.php b/src/Client.php old mode 100644 new mode 100755 index 933947e..ede22fc --- a/src/Client.php +++ b/src/Client.php @@ -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; /** @@ -43,12 +42,12 @@ class Client * return a new class instance * required parameter = string; user name to use when connecting to the UniFi controller * required parameter = string; password to use when connecting to the UniFi controller - * optional parameter = string; base URL of the UniFi controller, must include "https://" prefix and port suffix (:8443) + * optional parameter = string; base URL of the UniFi controller, *must* include "https://" prefix and port suffix (:8443) * optional parameter = string; short site name to access, defaults to "default" * optional parameter = string; the version number of the controller, defaults to "5.4.16" * optional parameter = 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 (false) is to - * not validate the controller certificate + * 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) { @@ -883,11 +882,11 @@ public function delete_site($site_id) /** * Change a site's name - * ------------- + * -------------------- * return true on success - * required parameter = the long name for the site + * required parameter = 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 + * 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) { @@ -899,120 +898,121 @@ public function set_site_name($site_name) /** * Set site country - * ----------- - * required parameter = 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_networkconf() for the specific network type. - * Do not include the _id property, it will be assigned by the controller and returned upon success. + * ---------------- + * required parameter = 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); + $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 = 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_networkconf() for the specific network type. - * Do not include the _id property, it will be assigned by the controller and returned upon success. + * --------------- + * required parameter = 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); + $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 = 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_networkconf() for the specific network type. - * Do not include the _id property, it will be assigned by the controller and returned upon success. + * ------------- + * required parameter = 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); + $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 = 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_networkconf() for the specific network type. - * Do not include the _id property, it will be assigned by the controller and returned upon success. + * ------------- + * required parameter = 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); + $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 = 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_networkconf() for the specific network type. - * Do not include the _id property, it will be assigned by the controller and returned upon success. + * --------------------- + * required parameter = 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); + $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 = 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_networkconf() for the specific network type. - * Do not include the _id property, it will be assigned by the controller and returned upon success. + * ------------ + * required parameter = 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); + $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 = 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_networkconf() for the specific network type. - * Do not include the _id property, it will be assigned by the controller and returned upon success. + * --------------------- + * required parameter = 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); + $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); } @@ -1241,6 +1241,18 @@ public function list_current_channels() return $this->process_response($response); } + /** + * List country codes + * ------------------ + * returns an array of available country codes + */ + 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 * ----------------------------- @@ -1491,7 +1503,6 @@ public function set_guestlogin_settings( return $this->process_response_boolean($response); } - /** * Update guestlogin settings, base * ------------------------------------------ @@ -1501,7 +1512,7 @@ public function set_guestlogin_settings( */ public function set_guestlogin_settings_base($guestlogin_settings) { if (!$this->is_loggedin) return false; - $json = json_encode($guestlogin_settings); + $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); }