Added all of the existing code
This commit is contained in:
263
extreme_stress.py
Normal file
263
extreme_stress.py
Normal file
@@ -0,0 +1,263 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
EXTREME TechIRCd Stress Testing Tool
|
||||
BRUTAL IRC server stress testing designed to break things
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import random
|
||||
import string
|
||||
import time
|
||||
import logging
|
||||
import socket
|
||||
import sys
|
||||
from typing import List
|
||||
import threading
|
||||
|
||||
class ExtremeIRCClient:
|
||||
def __init__(self, client_id: int):
|
||||
self.client_id = client_id
|
||||
self.nick = f"EXTREME{client_id:05d}"
|
||||
self.reader = None
|
||||
self.writer = None
|
||||
self.connected = False
|
||||
self.message_count = 0
|
||||
|
||||
async def connect(self):
|
||||
try:
|
||||
self.reader, self.writer = await asyncio.wait_for(
|
||||
asyncio.open_connection('localhost', 6667),
|
||||
timeout=5.0
|
||||
)
|
||||
self.connected = True
|
||||
return True
|
||||
except Exception as e:
|
||||
return False
|
||||
|
||||
async def register(self):
|
||||
if not self.connected or self.writer is None:
|
||||
return False
|
||||
try:
|
||||
self.writer.write(f"NICK {self.nick}\r\n".encode())
|
||||
self.writer.write(f"USER {self.nick} 0 * :Extreme Client {self.client_id}\r\n".encode())
|
||||
await self.writer.drain()
|
||||
# Don't wait for response - BRUTAL mode
|
||||
return True
|
||||
except:
|
||||
return False
|
||||
|
||||
async def spam_messages(self, count: int, delay: float = 0.001):
|
||||
"""Send messages as fast as possible"""
|
||||
if not self.connected or self.writer is None:
|
||||
return
|
||||
|
||||
messages = [
|
||||
f"PRIVMSG #extreme :SPAM MESSAGE {i} FROM {self.nick} - " + "X" * 100
|
||||
for i in range(count)
|
||||
]
|
||||
|
||||
try:
|
||||
for msg in messages:
|
||||
self.writer.write(f"{msg}\r\n".encode())
|
||||
self.message_count += 1
|
||||
if delay > 0:
|
||||
await asyncio.sleep(delay)
|
||||
await self.writer.drain()
|
||||
except:
|
||||
pass
|
||||
|
||||
async def chaos_commands(self):
|
||||
"""Send random commands rapidly"""
|
||||
commands = [
|
||||
"JOIN #extreme",
|
||||
"PART #extreme",
|
||||
"JOIN #chaos1,#chaos2,#chaos3,#chaos4,#chaos5",
|
||||
"LIST",
|
||||
"WHO #extreme",
|
||||
"VERSION",
|
||||
"TIME",
|
||||
"ADMIN",
|
||||
"INFO",
|
||||
"LUSERS",
|
||||
f"NICK {self.nick}_CHAOS_{random.randint(1000,9999)}",
|
||||
"PING :test",
|
||||
]
|
||||
|
||||
try:
|
||||
if self.writer is not None:
|
||||
for _ in range(50): # 50 rapid commands
|
||||
cmd = random.choice(commands)
|
||||
self.writer.write(f"{cmd}\r\n".encode())
|
||||
await asyncio.sleep(0.01) # 10ms between commands
|
||||
await self.writer.drain()
|
||||
except:
|
||||
pass
|
||||
|
||||
async def disconnect(self):
|
||||
if self.writer:
|
||||
try:
|
||||
self.writer.write(b"QUIT :EXTREME TEST COMPLETE\r\n")
|
||||
await self.writer.drain()
|
||||
self.writer.close()
|
||||
await self.writer.wait_closed()
|
||||
except:
|
||||
pass
|
||||
self.connected = False
|
||||
|
||||
class ExtremeStressTester:
|
||||
def __init__(self):
|
||||
self.clients = []
|
||||
self.total_connections = 0
|
||||
self.successful_connections = 0
|
||||
self.total_messages = 0
|
||||
self.start_time = None
|
||||
|
||||
async def extreme_connection_bomb(self, count: int):
|
||||
"""Connect as many clients as possible simultaneously"""
|
||||
print(f"🔥 EXTREME: Launching {count} connections simultaneously...")
|
||||
|
||||
tasks = []
|
||||
for i in range(count):
|
||||
client = ExtremeIRCClient(i)
|
||||
self.clients.append(client)
|
||||
tasks.append(self.connect_and_register(client))
|
||||
|
||||
# Launch ALL connections at once - BRUTAL
|
||||
results = await asyncio.gather(*tasks, return_exceptions=True)
|
||||
|
||||
self.successful_connections = sum(1 for r in results if r is True)
|
||||
print(f"💀 Connection bomb result: {self.successful_connections}/{count} successful")
|
||||
|
||||
async def connect_and_register(self, client):
|
||||
try:
|
||||
if await client.connect():
|
||||
await client.register()
|
||||
return True
|
||||
except:
|
||||
pass
|
||||
return False
|
||||
|
||||
async def extreme_message_hurricane(self, messages_per_client: int = 200):
|
||||
"""Send massive amounts of messages from all clients"""
|
||||
print(f"🌪️ EXTREME: Message hurricane - {messages_per_client} msgs per client...")
|
||||
|
||||
connected_clients = [c for c in self.clients if c.connected]
|
||||
print(f"💀 Using {len(connected_clients)} connected clients")
|
||||
|
||||
tasks = []
|
||||
for client in connected_clients:
|
||||
tasks.append(client.spam_messages(messages_per_client, delay=0.001)) # 1ms delay
|
||||
|
||||
await asyncio.gather(*tasks, return_exceptions=True)
|
||||
|
||||
total_msgs = sum(c.message_count for c in connected_clients)
|
||||
print(f"💀 Hurricane complete: {total_msgs} total messages sent")
|
||||
|
||||
async def extreme_chaos_mode(self):
|
||||
"""Every client sends random commands rapidly"""
|
||||
print(f"🔥 EXTREME: CHAOS MODE ACTIVATED...")
|
||||
|
||||
connected_clients = [c for c in self.clients if c.connected]
|
||||
tasks = []
|
||||
for client in connected_clients:
|
||||
tasks.append(client.chaos_commands())
|
||||
|
||||
await asyncio.gather(*tasks, return_exceptions=True)
|
||||
print(f"💀 Chaos mode complete")
|
||||
|
||||
async def rapid_fire_connections(self, total: int, batch_size: int = 50):
|
||||
"""Connect clients in rapid batches"""
|
||||
print(f"⚡ EXTREME: Rapid fire - {total} clients in batches of {batch_size}")
|
||||
|
||||
for batch_start in range(0, total, batch_size):
|
||||
batch_end = min(batch_start + batch_size, total)
|
||||
batch_clients = []
|
||||
|
||||
# Create batch
|
||||
for i in range(batch_start, batch_end):
|
||||
client = ExtremeIRCClient(i + 10000) # Offset IDs
|
||||
batch_clients.append(client)
|
||||
self.clients.append(client)
|
||||
|
||||
# Connect batch simultaneously
|
||||
tasks = [self.connect_and_register(c) for c in batch_clients]
|
||||
results = await asyncio.gather(*tasks, return_exceptions=True)
|
||||
|
||||
successful = sum(1 for r in results if r is True)
|
||||
print(f"💀 Batch {batch_start//batch_size + 1}: {successful}/{len(batch_clients)} connected")
|
||||
|
||||
# Tiny delay between batches
|
||||
await asyncio.sleep(0.1)
|
||||
|
||||
async def cleanup(self):
|
||||
"""Disconnect all clients"""
|
||||
print("🧹 Cleaning up connections...")
|
||||
tasks = []
|
||||
for client in self.clients:
|
||||
if client.connected:
|
||||
tasks.append(client.disconnect())
|
||||
|
||||
if tasks:
|
||||
await asyncio.gather(*tasks, return_exceptions=True)
|
||||
|
||||
print(f"💀 Cleanup complete. Total clients created: {len(self.clients)}")
|
||||
|
||||
async def run_extreme_test():
|
||||
"""Run the most brutal stress test possible"""
|
||||
print("💀💀💀 EXTREME STRESS TEST STARTING 💀💀💀")
|
||||
print("⚠️ WARNING: This test is designed to break things!")
|
||||
print()
|
||||
|
||||
tester = ExtremeStressTester()
|
||||
start_time = time.time()
|
||||
|
||||
try:
|
||||
# Phase 1: Connection bomb
|
||||
await tester.extreme_connection_bomb(150)
|
||||
await asyncio.sleep(2)
|
||||
|
||||
# Phase 2: Message hurricane
|
||||
await tester.extreme_message_hurricane(100)
|
||||
await asyncio.sleep(1)
|
||||
|
||||
# Phase 3: Chaos mode
|
||||
await tester.extreme_chaos_mode()
|
||||
await asyncio.sleep(1)
|
||||
|
||||
# Phase 4: More connections while under load
|
||||
await tester.rapid_fire_connections(100, 25)
|
||||
await asyncio.sleep(2)
|
||||
|
||||
# Phase 5: Final message barrage
|
||||
await tester.extreme_message_hurricane(50)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print("\n🛑 Test interrupted by user")
|
||||
except Exception as e:
|
||||
print(f"\n💥 Test crashed: {e}")
|
||||
finally:
|
||||
# Always cleanup
|
||||
await tester.cleanup()
|
||||
|
||||
end_time = time.time()
|
||||
duration = end_time - start_time
|
||||
|
||||
print(f"\n💀 EXTREME STRESS TEST COMPLETE 💀")
|
||||
print(f"Duration: {duration:.2f} seconds")
|
||||
print(f"Total clients: {len(tester.clients)}")
|
||||
print(f"Successful connections: {tester.successful_connections}")
|
||||
total_messages = sum(c.message_count for c in tester.clients)
|
||||
print(f"Total messages sent: {total_messages}")
|
||||
if duration > 0:
|
||||
print(f"Messages per second: {total_messages/duration:.2f}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("💀 EXTREME STRESS TESTER 💀")
|
||||
print("This will attempt to overwhelm the IRC server")
|
||||
print("Make sure TechIRCd is running!")
|
||||
print()
|
||||
|
||||
try:
|
||||
asyncio.run(run_extreme_test())
|
||||
except KeyboardInterrupt:
|
||||
print("\n🛑 Aborted by user")
|
||||
Reference in New Issue
Block a user