haproxy-wi/app/modules/service/udp.py

80 lines
2.8 KiB
Python

import ast
from playhouse.shortcuts import model_to_dict
import app.modules.db.udp as udp_sql
import app.modules.db.server as server_sql
import app.modules.db.ha_cluster as ha_sql
import app.modules.server.server as server_mod
import app.modules.roxywi.common as roxywi_common
def get_listener_config(listener_id: int) -> dict:
listener = udp_sql.get_listener(listener_id)
listener_json = model_to_dict(listener, recurse=False)
listener_json['config'] = ast.literal_eval(listener_json['config'])
return listener_json
def get_slaves_for_udp_listener(cluster_id: int, vip: str) -> list:
servers = []
vips = ha_sql.select_cluster_vips(cluster_id)
for v in vips:
if v.vip == vip:
router_id = v.router_id
break
else:
raise ValueError("error: Cannot find VIP")
slaves = ha_sql.select_cluster_slaves(cluster_id, router_id)
for slave in slaves:
servers.append(slave[2])
return servers
def _return_listener_servers(listener_id: int, group_id=None):
servers = []
listener = udp_sql.get_listener(listener_id)
if group_id is not None and int(listener.group_id.group_id) != int(group_id):
raise ValueError("error: Invalid group")
if listener.cluster_id:
servers = get_slaves_for_udp_listener(listener.cluster_id, listener.vip)
elif listener.server_id:
server = server_sql.get_server(listener.server_id)
servers.append(server.ip)
if len(servers) < 1:
raise ValueError("error: Cannot find server")
return servers, listener
def listener_actions(listener_id: int, action: str, group_id: int) -> None:
cmd = f'sudo systemctl {action} keepalived-udp-{listener_id}.service'
try:
servers, listener = _return_listener_servers(listener_id, group_id)
except Exception as e:
raise e
for server_ip in servers:
try:
server_mod.ssh_command(server_ip, cmd)
roxywi_common.logging(listener.id, f'UDP listener {listener.name} has been {action} on {server_ip}', keep_history=1, roxywi=1, service='UDP Listener')
except Exception as e:
roxywi_common.handle_exceptions(e, 'Roxy-WI server', f'Cannot {action} for UDP balancer {listener.name}', roxywi=1)
def check_is_listener_active(listener_id: int) -> str:
try:
servers, listener = _return_listener_servers(listener_id)
except Exception as e:
raise Exception(e)
statuses = []
cmd = f'systemctl is-active keepalived-udp-{listener_id}.service'
for server_ip in servers:
status = server_mod.ssh_command(server_ip, cmd)
statuses.append(status.replace('\n', '').replace('\r', ''))
if 'inactive' in statuses and 'active' in statuses:
return 'warning'
elif 'inactive' in statuses and 'active' not in statuses:
return 'error'
return 'ok'