fix(domains): provision routes when domains are linked
Build and publish Docker image / build-and-publish (push) Successful in 10s
Build and publish Docker image / build-and-publish (push) Successful in 10s
This commit is contained in:
1 parent
8cb6820bea
commit
9822e43592
3 files changed
+131
-154
No files matched your search
+44
-81
@@ -822,83 +822,6 @@ async def handle_websocket(websocket):
|
||||
|
||||
if client_id in connected_clients:
|
||||
del connected_clients[client_id]
|
||||
# Domain WebSocket handlers
|
||||
# Replace the domain WebSocket handlers in app.py with these fixed versions:
|
||||
|
||||
# Domain WebSocket handlers
|
||||
"""Handle create domain request"""
|
||||
client_info = connected_clients.get(client_id)
|
||||
if not client_info or not client_info['authenticated']:
|
||||
await send_message(client_id, {'type': 'error', 'error': 'Not authenticated'})
|
||||
return
|
||||
|
||||
user_id = client_info['user_id']
|
||||
username = client_info['username']
|
||||
subdomain_name = data.get('subdomain')
|
||||
server_id = data.get('serverId')
|
||||
|
||||
logger.info(f"DEBUG: Creating domain for user {username}, subdomain: {subdomain_name}")
|
||||
|
||||
if not subdomain_name:
|
||||
await send_message(client_id, {'type': 'error', 'error': 'Subdomain name required'})
|
||||
return
|
||||
|
||||
if not domain_manager:
|
||||
logger.error("Domain manager not initialized!")
|
||||
await send_message(client_id, {'type': 'error', 'error': 'Domain service not available'})
|
||||
return
|
||||
|
||||
# Add API token check
|
||||
if not domain_manager.desesec_api_token:
|
||||
logger.warning("Using default API token - this might not work!")
|
||||
|
||||
try:
|
||||
# Check if subdomain is available
|
||||
availability_result = domain_manager.check_domain_availability(subdomain_name, username)
|
||||
logger.info(f"DEBUG: Availability check: {availability_result}")
|
||||
|
||||
if not availability_result.get('available', False):
|
||||
await send_message(client_id, {'type': 'error', 'error': availability_result.get('message', 'Domain not available')})
|
||||
return
|
||||
|
||||
# Create the subdomain
|
||||
result = domain_manager.create_subdomain(username, subdomain_name)
|
||||
logger.info(f"DEBUG: Create subdomain result: {result}")
|
||||
|
||||
if result.get('success') and result.get('domain_data'):
|
||||
# Save to database
|
||||
domain_record = {
|
||||
'user_id': user_id,
|
||||
'subdomain': result['domain_data']['subdomain'],
|
||||
'full_domain': result['domain_data']['domain'],
|
||||
'record_type': result['domain_data']['record_type'],
|
||||
'ip_address': result['domain_data']['ip_address'],
|
||||
'ttl': result['domain_data'].get('ttl', 3600),
|
||||
'server_id': server_id,
|
||||
'created_at': result['domain_data'].get('created_at', datetime.now().isoformat())
|
||||
}
|
||||
|
||||
db_domain = create_domain_record(domain_record)
|
||||
|
||||
if db_domain:
|
||||
await send_message(client_id, {
|
||||
'type': 'domain_created',
|
||||
'domain': db_domain,
|
||||
'message': result.get('message', 'Domain created successfully')
|
||||
})
|
||||
else:
|
||||
logger.error("Failed to save domain to database!")
|
||||
await send_message(client_id, {
|
||||
'type': 'error',
|
||||
'error': 'Domain created in DNS but failed to save to database'
|
||||
})
|
||||
else:
|
||||
await send_message(client_id, {'type': 'error', 'error': result.get('message', 'Failed to create domain')})
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error creating domain: {e}", exc_info=True)
|
||||
await send_message(client_id, {'type': 'error', 'error': str(e)})
|
||||
|
||||
async def handle_delete_domain(client_id, data):
|
||||
"""Handle delete domain request - FIXED VERSION with proper domain type handling"""
|
||||
client_info = connected_clients.get(client_id)
|
||||
@@ -1384,7 +1307,21 @@ async def handle_create_domain(client_id, data):
|
||||
user_id = client_info['user_id']
|
||||
username = client_info['username']
|
||||
subdomain_name = '' if data.get('useUsernameDomain') is True else data.get('subdomain')
|
||||
server_id = data.get('serverId')
|
||||
server_id = data.get('serverId') or None
|
||||
|
||||
if server_id:
|
||||
if not isinstance(server_id, str):
|
||||
await send_message(client_id, {'type': 'error', 'error': 'Server ID must be a string'})
|
||||
return
|
||||
server = get_server_by_id(server_id)
|
||||
requester = get_user_by_id(user_id)
|
||||
owner_id = str(server.get('owner_id') or '') if server else ''
|
||||
if not server or (owner_id != str(user_id) and (not requester or requester.get('role') != 'admin')):
|
||||
await send_message(client_id, {'type': 'error', 'error': 'Server not found or access denied'})
|
||||
return
|
||||
if server.get('type') not in ('website', 'vps'):
|
||||
await send_message(client_id, {'type': 'error', 'error': 'Domain can only be linked to Website or VPS servers'})
|
||||
return
|
||||
|
||||
logger.info(f"DEBUG: Creating domain for user {username}, subdomain: {subdomain_name}")
|
||||
|
||||
@@ -1444,10 +1381,15 @@ async def handle_create_domain(client_id, data):
|
||||
db_domain = create_domain_record(domain_record)
|
||||
|
||||
if db_domain:
|
||||
routing_ready = not server_id or db_domain.get('server_id') == server_id
|
||||
await send_message(client_id, {
|
||||
'type': 'domain_created',
|
||||
'domain': db_domain,
|
||||
'message': result.get('message', 'Domain created successfully')
|
||||
'message': result.get('message', 'Domain created successfully') if routing_ready else (
|
||||
'Domain created, but routing could not be provisioned. '
|
||||
'It remains unlinked; retry linking it after checking Kubernetes.'
|
||||
),
|
||||
'routingReady': routing_ready
|
||||
})
|
||||
else:
|
||||
logger.error("Failed to save domain to database!")
|
||||
@@ -3635,7 +3577,21 @@ async def handle_create_custom_domain(client_id, data):
|
||||
|
||||
user_id = client_info['user_id']
|
||||
domain = data.get('domain')
|
||||
server_id = data.get('serverId')
|
||||
server_id = data.get('serverId') or None
|
||||
|
||||
if server_id:
|
||||
if not isinstance(server_id, str):
|
||||
await send_message(client_id, {'type': 'error', 'error': 'Server ID must be a string'})
|
||||
return
|
||||
server = get_server_by_id(server_id)
|
||||
requester = get_user_by_id(user_id)
|
||||
owner_id = str(server.get('owner_id') or '') if server else ''
|
||||
if not server or (owner_id != str(user_id) and (not requester or requester.get('role') != 'admin')):
|
||||
await send_message(client_id, {'type': 'error', 'error': 'Server not found or access denied'})
|
||||
return
|
||||
if server.get('type') not in ('website', 'vps'):
|
||||
await send_message(client_id, {'type': 'error', 'error': 'Domain can only be linked to Website or VPS servers'})
|
||||
return
|
||||
|
||||
if not domain:
|
||||
await send_message(client_id, {'type': 'error', 'error': 'Domain required'})
|
||||
@@ -3691,10 +3647,17 @@ async def handle_create_custom_domain(client_id, data):
|
||||
db_domain = create_custom_domain_record(domain_record)
|
||||
|
||||
if db_domain:
|
||||
routing_ready = not server_id or db_domain.get('server_id') == server_id
|
||||
await send_message(client_id, {
|
||||
'type': 'custom_domain_created',
|
||||
'domain': db_domain,
|
||||
'message': f'Custom domain {domain} added successfully'
|
||||
'message': (
|
||||
f'Custom domain {domain} added successfully'
|
||||
if routing_ready else
|
||||
f'Custom domain {domain} was added but routing could not be provisioned. '
|
||||
'It remains unlinked; retry linking it after checking Kubernetes.'
|
||||
),
|
||||
'routingReady': routing_ready
|
||||
})
|
||||
else:
|
||||
await send_message(client_id, {'type': 'error', 'error': 'Failed to create custom domain'})
|
||||
|
||||
Reference in new issue
Block a user