- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Error Code 400 - PUT Script
HI All,
When I applied the script for replacing "RADIUS Servers", I encountered the following error code. However, It is working as expected on the "Sandbox".
Updated RADIUS server radius1 for SSID ONE-1900
Updated RADIUS server radius2 for SSID ONE-1900
Updated RADIUS server radius3 for SSID ONE-1900
Failed to update SSID configuration for ONE-1900. Status code: 400
Script:-
import requests
# Define your API key, network ID, and base URL
API_KEY = 'YOUR_API_KEY'
NETWORK_ID = 'YOUR_NETWORK_ID'
BASE_URL = 'https://api.meraki.com/api/v1'
# Define the old and new radius server values
OLD_RADIUS_SERVERS = {
'radius1': 'OLD_RADIUS_SERVER_IP_1',
'radius2': 'OLD_RADIUS_SERVER_IP_2',
'radius3': 'OLD_RADIUS_SERVER_IP_3'
}
NEW_RADIUS_SERVERS = {
'radius1': 'NEW_RADIUS_SERVER_IP_1',
'radius2': 'NEW_RADIUS_SERVER_IP_2',
'radius3': 'NEW_RADIUS_SERVER_IP_3'
}
# Define headers with API key
headers = {
'X-Cisco-Meraki-API-Key': API_KEY,
'Content-Type': 'application/json'
}
# Function to update RADIUS server configuration
def update_radius_config(ssid_config):
# Check if RADIUS servers are configured
if 'radiusServers' in ssid_config:
radius_servers = ssid_config['radiusServers']
updated = False
for server in radius_servers:
for old_name, old_host in OLD_RADIUS_SERVERS.items():
if server['host'] == old_host:
new_host = NEW_RADIUS_SERVERS[old_name]
server['host'] = new_host
updated = True
print(
f"Updated RADIUS server {old_name} for SSID {ssid_config['name']}"
)
if updated:
# Make a PUT request to update the SSID configuration
ssid_config_url = f"{BASE_URL}/networks/{NETWORK_ID}/wireless/ssids/{ssid_config['number']}"
put_response = requests.put(ssid_config_url,
json=ssid_config,
headers=headers)
if put_response.status_code == 200:
print(
f"SSID configuration updated successfully for {ssid_config['name']}"
)
else:
print(
f"Failed to update SSID configuration for {ssid_config['name']}. Status code: {put_response.status_code}"
)
# Get SSIDs of the network
url = f"{BASE_URL}/networks/{NETWORK_ID}/wireless/ssids"
response = requests.get(url, headers=headers)
if response.status_code == 200:
ssids = response.json()
for ssid in ssids:
update_radius_config(ssid)
else:
print("Failed to retrieve SSIDs.")
Solved! Go to solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
@Vmadathil That did work for me. Just add a line before the put operation.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I think you need to include a variable in your script to include the following information.
authMode ,encryptionMode and wpaEncryptionMode
https://developer.cisco.com/meraki/api-v1/update-network-wireless-ssid/
Please, if this post was useful, leave your kudos and mark it as solved.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I tested the script using the following parameters. But no luck. Got the same error.
{'host': 'radius_server_1_ip', 'port': radius_server_1_port, 'secret': 'radius_server_1_secret'},
{'host': 'radius_server_2_ip', 'port': radius_server_2_port, 'secret': 'radius_server_2_secret'},
{'host': 'radius_server_3_ip', 'port': radius_server_3_port, 'secret': 'radius_server_3_secret'}
]
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
My guess is that ssid_config contains a parameter that you got with f"{BASE_URL}/networks/{NETWORK_ID}/wireless/ssids" that can not be "put".
Have you considered using the Meraki Python SDK? It makes stuff so much easier ...
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
It is working on Sandbox environment without any issues. I haven't used Python SDK.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
On the basis of your message, I believe the issue is with the following part of the script.
if updated:
# Make a PUT request to update the SSID configuration
ssid_config_url = f"{BASE_URL}/networks/{NETWORK_ID}/wireless/ssids/{ssid_config['number']}"
put_response = requests.put(ssid_config_url,
json=ssid_config,
headers=headers)
if put_response.status_code == 200:
print(
f"SSID configuration updated successfully for {ssid_config['name']}"
)
else:
print(
f"Failed to update SSID configuration for {ssid_config['name']}. Status code: {put_response.status_code}"
)
I changed many things but no luck. Could you please correct the script..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Agreed with Philip that there might be something unexpected in the ssid_config from the GET call.
In your case, as you are updating the RadiusServers only, a more efficient way is to just include the updated RadiusSevers parameter in the json body instead of including the entire ssid_config.
For example, if I want to update the SSID name, I can only have one parameter in the json body in the API PUT operation. Those other parameters not in the body will remain unchanged. Hopefully, this is helpful.{{baseUrl}}/networks/:networkId/wireless/ssids/:number
{
"name": "UPDATED-SSID-NAME"
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I modified the line as follows. but no luck..
ssid_config_url = BASE_URL + "/networks/" + NETWORK_ID + "/wireless/ssids/" + str(ssid_config['number'])
Do you have any other recommendation.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Let me briefly explain the requirement here.
We recently migrated our "RADIUS Servers" and IP got changed. So, we need to replace old RADIUS with new one. We have networks in all regions. According to the region (US, EMEA, APAC), the order of the RADIUS servers will be changed. We are using the same port and Radius key. Hence, the script should be capable of replacing given old radius servers with the new one in each ssids under a particular network. We are using same RADIUS servers in multiple SSIDs.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Interesting. I was testing with Postman and everything was fine. But when using your code, I actually can reproduce the 400 error. You can edit the following line to get the error details.
print(
f"Failed to update SSID configuration for {ssid_config['name']}. Status code: {put_response.status_code}. Errors: {put_response.text}"
)
The error I got was "{"errors":["'encryptionMode' must be one of: 'wep' or 'wpa'"]}"
There were some discussions about this.
https://community.meraki.com/t5/Wireless/API-problems-with-update-SSID/m-p/199648
https://community.meraki.com/t5/Wireless/quot-Update-the-attributes-of-an-SSID-quot-AP-endpoint-brok...
Looks like the solution is to modify the 'encryptionMode' to either 'wep' or 'wpa'. Not sure why your script works in the sandbox environment. If there are further questions, I would suggest file a support case.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I tested this today, I am also getting the same error on the production network.
Updated RADIUS server radius1 for SSID ONE-1900
Updated RADIUS server radius2 for SSID ONE-1900
Updated RADIUS server radius3 for SSID ONE-1900
Failed to update SSID configuration for ONE-1900. Status code: 400. Errors: {"errors":["'encryptionMode' must be one of: 'wep' or 'wpa'"]}
>>>
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Anybody could add the encryption mode and make it work. Please let me know if yes.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
@Vmadathil That did work for me. Just add a line before the put operation.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
