\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
| Path : /var/www/html/yedekledb24/DatabaseBackupMaster/ |
|
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 %}""")