mirror of https://github.com/Aidaho12/haproxy-wi
80 lines
2.8 KiB
Python
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_by_id(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'
|