#!/usr/bin/env python3
"""
Сбор листингов папок и анализ FileZilla сервера
"""
import ftplib
import socket
from pathlib import Path
from datetime import datetime

def collect_ftp_listing(host, port, username, password, output_dir):
    """Собрать листинг папок с FTP сервера"""
    try:
        # Подключаемся к FTP серверу
        ftp = ftplib.FTP()
        ftp.connect(host, port, timeout=10)
        ftp.login(username, password)
        
        # Получаем приветственное сообщение
        welcome = ftp.getwelcome()
        
        # Получаем системную информацию
        try:
            syst_response = ftp.sendcmd('SYST')
            print(f"SYST response: {syst_response}")
        except:
            syst_response = "SYST not supported"
        
        # Получаем текущую директорию
        current_dir = ftp.pwd()
        
        # Получаем листинг корневой директории
        listing = []
        ftp.retrlines('LIST', listing.append)
        
        # Получаем листинг первого уровня папок
        first_level_dirs = []
        for line in listing:
            parts = line.split()
            if len(parts) >= 9 and parts[0].startswith('d'):
                dir_name = ' '.join(parts[8:])
                if dir_name not in ['.', '..']:
                    first_level_dirs.append(dir_name)
        
        # Сохраняем результаты
        result = {
            'host': host,
            'username': username,
            'welcome': welcome,
            'syst_response': syst_response,
            'current_dir': current_dir,
            'root_listing': listing,
            'first_level_dirs': first_level_dirs,
            'total_items': len(listing),
            'total_dirs': len(first_level_dirs)
        }
        
        # Сохраняем в файл
        output_file = output_dir / f"{username}_ftp_listing.txt"
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write(f"=== FTP Listing for {username}@{host} ===\n")
            f.write(f"Welcome: {welcome}\n")
            f.write(f"SYST: {syst_response}\n")
            f.write(f"Current directory: {current_dir}\n")
            f.write(f"Total items: {len(listing)}\n")
            f.write(f"Total directories: {len(first_level_dirs)}\n\n")
            f.write("=== Root directory listing ===\n")
            for line in listing:
                f.write(line + '\n')
            f.write("\n=== First level directories ===\n")
            for dir_name in first_level_dirs:
                f.write(dir_name + '\n')
        
        ftp.quit()
        return result
        
    except Exception as e:
        print(f"Error collecting listing for {username}: {e}")
        return None

def analyze_filezilla_version(welcome_message):
    """Анализ версии FileZilla из приветственного сообщения"""
    if 'FileZilla Server' in welcome_message:
        # Извлекаем версию
        parts = welcome_message.split('FileZilla Server')
        if len(parts) > 1:
            version_part = parts[1].strip()
            # Ищем версию в формате X.XX.XX
            import re
            version_match = re.search(r'(\d+\.\d+\.\d+)', version_part)
            if version_match:
                return version_match.group(1)
    return "Unknown"

def analyze_os_info(syst_response, welcome_message):
    """Анализ информации об операционной системе"""
    os_info = {
        'os_type': 'Unknown',
        'os_version': 'Unknown',
        'details': []
    }
    
    # Анализ SYST response
    if 'UNIX' in syst_response.upper():
        os_info['os_type'] = 'UNIX/Linux'
    elif 'WINDOWS' in syst_response.upper():
        os_info['os_type'] = 'Windows'
    elif 'NT' in syst_response.upper():
        os_info['os_type'] = 'Windows NT'
    
    # Анализ welcome message
    if 'beta' in welcome_message.lower():
        os_info['details'].append('Beta version detected')
    
    return os_info

def main():
    print("=== Сбор листингов папок и анализ FileZilla ===\n")
    
    # FTP credentials
    ftp_creds = [
        {
            'db': '2210PIGOTTOILUAP01',
            'username': 'marketmax',
            'password': 'IMP$1220mm',
            'host': 'ftp.imperialtrading.com',
            'type': 'ftp_vendor'
        },
        {
            'db': '2610PIGOTTOILUAP01',
            'username': 'marketmaxinv',
            'password': 'IMP$0606ma',
            'host': 'ftp.imperialtrading.com',
            'type': 'ftp_vendor'
        }
    ]
    
    output_dir = Path('/root/ir-assessment/redteam/irelydata/ftp_analysis')
    output_dir.mkdir(exist_ok=True)
    
    all_listings = []
    
    # Собираем листинги
    for cred in ftp_creds:
        print(f"Collecting listing for {cred['username']}@{cred['host']}...")
        
        result = collect_ftp_listing(
            cred['host'], 
            21, 
            cred['username'], 
            cred['password'],
            output_dir
        )
        
        if result:
            all_listings.append(result)
            print(f"  ✓ Collected {result['total_items']} items, {result['total_dirs']} directories")
        else:
            print(f"  ✗ Failed to collect listing")
    
    # Анализ версии FileZilla
    print("\n=== Анализ версии FileZilla ===")
    if all_listings:
        welcome_msg = all_listings[0]['welcome']
        version = analyze_filezilla_version(welcome_msg)
        print(f"FileZilla Server version: {version}")
        
        # Анализ ОС
        os_info = analyze_os_info(all_listings[0]['syst_response'], welcome_msg)
        print(f"OS Type: {os_info['os_type']}")
        print(f"OS Version: {os_info['os_version']}")
        if os_info['details']:
            print(f"Details: {', '.join(os_info['details'])}")
    
    # Сравнение первого уровня папок
    print("\n=== Сравнение первого уровня папок ===")
    if len(all_listings) >= 2:
        listing1 = set(all_listings[0]['first_level_dirs'])
        listing2 = set(all_listings[1]['first_level_dirs'])
        
        common_dirs = listing1.intersection(listing2)
        unique1 = listing1 - listing2
        unique2 = listing2 - listing1
        
        print(f"Общих папок: {len(common_dirs)}")
        print(f"Уникальных для {all_listings[0]['username']}: {len(unique1)}")
        print(f"Уникальных для {all_listings[1]['username']}: {len(unique2)}")
        
        if common_dirs:
            print(f"\nОбщие папки:")
            for dir_name in sorted(common_dirs):
                print(f"  - {dir_name}")
        
        if unique1:
            print(f"\nУникальные для {all_listings[0]['username']}:")
            for dir_name in sorted(unique1):
                print(f"  - {dir_name}")
        
        if unique2:
            print(f"\nУникальные для {all_listings[1]['username']}:")
            for dir_name in sorted(unique2):
                print(f"  - {dir_name}")
    
    # Сохраняем анализ
    analysis_file = output_dir / 'ftp_analysis_summary.txt'
    with open(analysis_file, 'w', encoding='utf-8') as f:
        f.write("=== FTP Analysis Summary ===\n")
        f.write(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
        f.write(f"FileZilla Version: {version if all_listings else 'Unknown'}\n")
        f.write(f"OS Type: {os_info['os_type'] if all_listings else 'Unknown'}\n")
        f.write(f"Total listings collected: {len(all_listings)}\n")
        if all_listings:
            f.write(f"Total items: {sum(l['total_items'] for l in all_listings)}\n")
            f.write(f"Total directories: {sum(l['total_dirs'] for l in all_listings)}\n")
    
    print(f"\n=== Анализ сохранен ===")
    print(f"Файл анализа: {analysis_file}")
    print(f"Листинги: {output_dir}")

if __name__ == '__main__':
    main()
