summaryrefslogtreecommitdiffstats
path: root/mesh_chat.py
blob: f44edc9239e40a7ff3069c0586794caf2e8cbf27 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121

import os
import sys
import asyncio
import logging
import socket
from network.tor_manager import TorManager
from network.mesh import MeshNetwork
from ui.chat_window import ChatWindow
from security.memory import SecureMemory
from security.crypto import CryptoManager

class MeshChat:
    def __init__(self):
        # Configure logging
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        )
        self.logger = logging.getLogger('MeshChat')

        # Initialize components
        self.tor_manager = TorManager()
        self.mesh_network = MeshNetwork(base_port=12345, max_retry_ports=5)
        self.crypto = CryptoManager()
        self.secure_memory = SecureMemory()

    async def _verify_network(self) -> bool:
        """Verify network components are running"""
        try:
            # Try connecting to health check endpoint
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.connect(('127.0.0.1', 12345))
            sock.close()
            self.logger.info("Network connectivity verified")
            return True
        except Exception as e:
            self.logger.error(f"Network verification failed: {str(e)}")
            return False

    async def start(self):
        """Start application with robust error handling"""
        try:
            # Start Tor
            self.logger.info("Starting Tor...")
            await self.tor_manager.start()
            self.logger.info(f"Tor started with onion address: {self.tor_manager.onion_address}")

            # Initialize mesh network with retries
            max_retries = 3
            retry_delay = 2
            last_error = None

            for attempt in range(max_retries):
                try:
                    self.logger.info(f"Starting mesh network (attempt {attempt + 1}/{max_retries})...")
                    await self.mesh_network.start()

                    # Verify network is running
                    if await self._verify_network():
                        self.logger.info("Mesh network started and verified")
                        break
                    else:
                        raise Exception("Network verification failed")

                except Exception as e:
                    last_error = e
                    self.logger.warning(f"Attempt {attempt + 1} failed: {str(e)}")
                    if attempt < max_retries - 1:
                        await asyncio.sleep(retry_delay)
                    else:
                        raise Exception(f"Failed to start mesh network after {max_retries} attempts: {str(last_error)}")

            # Start GUI
            self.logger.info("Initializing GUI...")
            self.window = ChatWindow(
                self.mesh_network,
                self.tor_manager,
                self.crypto,
                self.secure_memory
            )

            self.logger.info("Application fully started")
            await self.window.run()

        except Exception as e:
            self.logger.error(f"Fatal error: {str(e)}")
            await self.cleanup()
            sys.exit(1)

    async def cleanup(self):
        """Cleanup with proper error handling"""
        self.logger.info("Starting cleanup...")

        cleanup_tasks = []

        # Stop Tor
        if hasattr(self, 'tor_manager'):
            cleanup_tasks.append(self.tor_manager.stop())

        # Stop mesh network
        if hasattr(self, 'mesh_network'):
            cleanup_tasks.append(self.mesh_network.stop())

        # Wipe sensitive data
        if hasattr(self, 'secure_memory'):
            self.secure_memory.wipe_all()

        # Wait for all cleanup tasks
        if cleanup_tasks:
            await asyncio.gather(*cleanup_tasks, return_exceptions=True)

        self.logger.info("Cleanup completed")

if __name__ == "__main__":
    app = MeshChat()
    try:
        asyncio.run(app.start())
    except KeyboardInterrupt:
        app.logger.info("Received shutdown signal")
        asyncio.run(app.cleanup())