from flask import Flask, jsonify, Blueprint from pyzabbix import ZabbixAPI from .auth import token_required from flask_mysqldb import MySQL from datetime import datetime zabbix = Blueprint('zabbix', __name__) mysql = MySQL() # Função para formatar uptime (segundos → dias, horas, minutos, segundos) def formatar_tempo(segundos): try: segundos = int(segundos) dias = segundos // 86400 horas = (segundos % 86400) // 3600 minutos = (segundos % 3600) // 60 segundos = segundos % 60 return f"{dias}d {horas}h {minutos}m {segundos}s" except (ValueError, TypeError): return "N/A" # Função para converter timestamp para data legível def formatar_data(timestamp): try: timestamp = int(timestamp) return datetime.utcfromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S') except (ValueError, TypeError): return "N/A" # Função para conectar ao Zabbix e obter os dados tratados def get_zabbix_data(group_name_filter=None): data = [] try: zabbix = ZabbixAPI("https://mimir.itguys.com.br/zabbix/api_jsonrpc.php") zabbix.login('vitoria.oliveira', '123Mudar') groups = zabbix.hostgroup.get(output="extend") for group in groups: if group_name_filter and group_name_filter.lower() not in group['name'].lower(): continue group_data = { 'group_id': group['groupid'], 'group_name': group['name'], 'hosts': [] } hosts = zabbix.host.get(groupids=group['groupid'], output="extend") for host in hosts: host_data = { 'host_name': host['name'], 'metrics': [] } items = zabbix.item.get( hostids=host['hostid'], output=["itemid", "name", "key_", "lastvalue", "lastclock"] ) for item in items: key = item.get('key_', 'N/A') value = item.get('lastvalue', 'N/A') timestamp = item.get('lastclock', 'N/A') if key == "system.uptime": value = formatar_tempo(value) metric = { 'key': key, 'value': value, 'last_update': formatar_data(timestamp) } host_data['metrics'].append(metric) network_packet_loss = zabbix.item.get( hostids=host['hostid'], filter={"key_": "net.ping.loss"}, output=["lastvalue", "lastclock"] ) for loss in network_packet_loss: host_data['metrics'].append({ 'key': 'net.ping.loss', 'value': loss.get('lastvalue', 'N/A'), 'last_update': formatar_data(loss.get('lastclock', 'N/A')) }) group_data['hosts'].append(host_data) data.append(group_data) return data # Retorna os dados coletados except Exception as e: print(f"Erro ao obter dados do Zabbix: {str(e)}") raise # Re-raise the exception # Rota para obter dados do Zabbix @zabbix.route('/metrics', methods=['POST']) @token_required def get_data(data): try: domain = data.get('domain') cur = mysql.connection.cursor() cur.execute("SELECT grupo_zabbix FROM empresa WHERE dominio = %s", (domain,)) result = cur.fetchone() cur.close() if result: group_name_filter = result['grupo_zabbix'] print(f"Grupo Zabbix encontrado no banco: {group_name_filter}") else: return jsonify({"error": "Grupo Zabbix não encontrado para o domínio."}), 404 # Coletar os dados do Zabbix zabbix_data = get_zabbix_data(group_name_filter=group_name_filter) return jsonify({"message": "Dados obtidos com sucesso.", "data": zabbix_data}) except Exception as e: print(f"Erro ao processar a solicitação: {str(e)}") return jsonify({"error": str(e)}), 500