from .models import SSHLog, Project from django.utils import timezone import logging import os import tempfile import requests from bs4 import BeautifulSoup logger = logging.getLogger(__name__) # Yardımcı fonksiyonlar buraya gelebilir def check_site_status(project): """ Projenin web sitesinin aktif olup olmadığını kontrol eder Aynı zamanda proje klasörünün disk kullanımını günceller """ from .ssh_client import SSHManager result_messages = [] # 1. Disk kullanımını güncelle try: if project.ssh_credential: ssh_manager = SSHManager(project.ssh_credential) if ssh_manager.check_connection(): # Proje klasörünün tam yolu base_path = project.ssh_credential.base_path.rstrip('/') folder_name = project.folder_name.strip('/') full_path = f"{base_path}/{folder_name}" # Debug bilgisi ekle result_messages.append(f"Kontrol edilen path: {full_path}") # Önce base path'in var olup olmadığını kontrol et base_check_command = f"test -d '{base_path}' && echo 'BASE_EXISTS' || echo 'BASE_NOT_EXISTS'" stdout_base, stderr_base, success_base = ssh_manager.execute_command(base_check_command) if success_base and stdout_base.strip() == 'BASE_EXISTS': # Base path var, şimdi proje klasörünü kontrol et # Önce base path içindeki klasörleri listele list_command = f"ls -la '{base_path}' | grep '^d'" stdout_list, stderr_list, success_list = ssh_manager.execute_command(list_command) if success_list: result_messages.append(f"Base path içindeki klasörler: {stdout_list.strip()[:200]}") # Proje klasörünü kontrol et check_command = f"test -d '{full_path}' && echo 'EXISTS' || echo 'NOT_EXISTS'" stdout_check, stderr_check, success_check = ssh_manager.execute_command(check_command) if success_check and stdout_check.strip() == 'EXISTS': # Disk kullanımını al command = f"du -sh '{full_path}' 2>/dev/null | cut -f1" stdout, stderr, success = ssh_manager.execute_command(command) if success and stdout.strip(): old_usage = project.disk_usage or "Bilinmiyor" project.disk_usage = stdout.strip() result_messages.append(f"Disk kullanımı güncellendi: {old_usage} → {project.disk_usage}") else: result_messages.append("Disk kullanımı komutu başarısız") else: result_messages.append(f"Proje klasörü bulunamadı: {full_path}") else: result_messages.append(f"Base path bulunamadı: {base_path}") ssh_manager.close() else: result_messages.append("SSH bağlantısı kurulamadı") else: result_messages.append("SSH bilgisi eksik") except Exception as e: result_messages.append(f"Disk kontrolü hatası: {str(e)}") # 2. Site durumunu kontrol et if not project.url: project.last_site_check = timezone.now() project.save() return False, "; ".join(result_messages + ["URL eksik"]) try: # URL'yi düzenle url = project.url if not url.startswith(('http://', 'https://')): url = f'http://{url}' # Site kontrolü headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } response = requests.get(url, headers=headers, timeout=10) if response.status_code == 200: # Site erişilebilir project.is_site_active = True project.last_site_check = timezone.now() project.save() result_messages.append(f"Site aktif (HTTP {response.status_code})") return True, "; ".join(result_messages) else: # Site erişilemez project.is_site_active = False project.last_site_check = timezone.now() project.save() result_messages.append(f"Site erişilemez (HTTP {response.status_code})") return False, "; ".join(result_messages) except requests.exceptions.Timeout: project.is_site_active = False project.last_site_check = timezone.now() project.save() result_messages.append("Site zaman aşımı") return False, "; ".join(result_messages) except requests.exceptions.ConnectionError: project.is_site_active = False project.last_site_check = timezone.now() project.save() result_messages.append("Site bağlantı hatası") return False, "; ".join(result_messages) except Exception as e: project.is_site_active = False project.last_site_check = timezone.now() project.save() result_messages.append(f"Site hatası: {str(e)}") return False, "; ".join(result_messages) def check_all_sites(): """Tüm projelerin site durumunu kontrol et""" projects = Project.objects.filter(url__isnull=False).exclude(url='') results = [] for project in projects: status, message = check_site_status(project) results.append({ 'project': project, 'status': status, 'message': message }) return results