/ swarm_simple.py
swarm_simple.py
  1  #!/usr/bin/env python3
  2  """
  3  SIMPLE SWARM - Working Kali Linux Version
  4  No external dependencies needed
  5  """
  6  
  7  import json
  8  import socket
  9  import threading
 10  import time
 11  import hashlib
 12  import sys
 13  import os
 14  import base64
 15  from typing import Dict, List
 16  import urllib.request
 17  
 18  class SimpleSwarm:
 19      def __init__(self, node_id=None):
 20          self.node_id = node_id or self.generate_id()
 21          self.peers: Dict[str, Dict] = {}
 22          self.tasks = []
 23          self.running = True
 24          
 25          print(f"""
 26  ╔══════════════════════════════════╗
 27  ║   SIMPLE SWARM - Node: {self.node_id[:8]}   ║
 28  ╚══════════════════════════════════╝
 29  """)
 30      
 31      def generate_id(self) -> str:
 32          """Generate unique node ID"""
 33          import uuid
 34          hostname = socket.gethostname()
 35          timestamp = str(time.time())
 36          unique = f"{hostname}_{timestamp}_{uuid.getnode()}"
 37          return f"node_{hashlib.md5(unique.encode()).hexdigest()[:12]}"
 38      
 39      def simple_encrypt(self, text: str, key: str = "swarm") -> str:
 40          """Simple XOR encryption for demo"""
 41          encrypted = []
 42          for i, char in enumerate(text):
 43              key_char = key[i % len(key)]
 44              encrypted.append(chr(ord(char) ^ ord(key_char)))
 45          return base64.b64encode(''.join(encrypted).encode()).decode()
 46      
 47      def simple_decrypt(self, encrypted: str, key: str = "swarm") -> str:
 48          """Simple XOR decryption"""
 49          try:
 50              decoded = base64.b64decode(encrypted).decode()
 51              decrypted = []
 52              for i, char in enumerate(decoded):
 53                  key_char = key[i % len(key)]
 54                  decrypted.append(chr(ord(char) ^ ord(key_char)))
 55              return ''.join(decrypted)
 56          except:
 57              return encrypted
 58      
 59      def discover_peers_local(self) -> List[Dict]:
 60          """Discover peers on local network"""
 61          peers = []
 62          
 63          # Get local IP range
 64          try:
 65              s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 66              s.connect(("8.8.8.8", 80))
 67              local_ip = s.getsockname()[0]
 68              s.close()
 69              
 70              # Simple broadcast
 71              broadcast_ip = '.'.join(local_ip.split('.')[:3]) + '.255'
 72              
 73              # Send discovery
 74              sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 75              sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
 76              sock.settimeout(2)
 77              
 78              discovery_msg = json.dumps({
 79                  'type': 'discovery',
 80                  'node_id': self.node_id,
 81                  'action': 'ping'
 82              }).encode()
 83              
 84              sock.sendto(discovery_msg, (broadcast_ip, 8888))
 85              
 86              # Listen
 87              start = time.time()
 88              while time.time() - start < 3:
 89                  try:
 90                      data, addr = sock.recvfrom(1024)
 91                      response = json.loads(data.decode())
 92                      if response.get('type') == 'response':
 93                          peers.append({
 94                              'ip': addr[0],
 95                              'port': response.get('port', 8888),
 96                              'node_id': response.get('node_id'),
 97                              'timestamp': time.time()
 98                          })
 99                  except:
100                      continue
101                      
102              sock.close()
103              
104          except Exception as e:
105              print(f"⚠️ Discovery error: {e}")
106          
107          return peers
108      
109      def start_server(self, port=8888):
110          """Start UDP server for peer communication"""
111          def server_loop():
112              sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
113              sock.bind(('0.0.0.0', port))
114              sock.settimeout(1)
115              
116              print(f"📡 Listening on port {port}")
117              
118              while self.running:
119                  try:
120                      data, addr = sock.recvfrom(1024)
121                      message = json.loads(data.decode())
122                      
123                      if message.get('type') == 'discovery':
124                          # Respond to discovery
125                          response = json.dumps({
126                              'type': 'response',
127                              'node_id': self.node_id,
128                              'port': port,
129                              'status': 'active'
130                          }).encode()
131                          sock.sendto(response, addr)
132                          print(f"📡 Discovery request from {addr[0]}")
133                      
134                      elif message.get('type') == 'message':
135                          # Handle encrypted message
136                          encrypted = message.get('data', '')
137                          decrypted = self.simple_decrypt(encrypted)
138                          print(f"📨 Message from {addr[0]}: {decrypted[:50]}...")
139                          
140                          # Echo back
141                          response = json.dumps({
142                              'type': 'ack',
143                              'node_id': self.node_id
144                          }).encode()
145                          sock.sendto(response, addr)
146                          
147                  except socket.timeout:
148                      continue
149                  except Exception as e:
150                      print(f"⚠️ Server error: {e}")
151              
152              sock.close()
153          
154          threading.Thread(target=server_loop, daemon=True).start()
155      
156      def send_message(self, peer_ip: str, message: str, port=8888):
157          """Send message to peer"""
158          try:
159              encrypted = self.simple_encrypt(message)
160              
161              data = json.dumps({
162                  'type': 'message',
163                  'node_id': self.node_id,
164                  'data': encrypted,
165                  'timestamp': time.time()
166              }).encode()
167              
168              sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
169              sock.sendto(data, (peer_ip, port))
170              sock.close()
171              
172              print(f"📤 Sent message to {peer_ip}")
173              return True
174              
175          except Exception as e:
176              print(f"❌ Send failed: {e}")
177              return False
178      
179      def query_ai(self, prompt: str):
180          """Use Groq API for AI tasks"""
181          try:
182              api_key = "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"
183              url = "https://api.groq.com/openai/v1/chat/completions"
184              
185              data = json.dumps({
186                  "model": "llama-3.3-70b-versatile",
187                  "messages": [{"role": "user", "content": prompt}],
188                  "max_tokens": 500
189              }).encode()
190              
191              req = urllib.request.Request(
192                  url,
193                  data=data,
194                  headers={
195                      'Authorization': f'Bearer {api_key}',
196                      'Content-Type': 'application/json'
197                  }
198              )
199              
200              with urllib.request.urlopen(req, timeout=10) as response:
201                  result = json.loads(response.read().decode())
202                  return result['choices'][0]['message']['content']
203                  
204          except Exception as e:
205              return f"AI Error: {str(e)}"
206      
207      def distribute_task(self, task: str):
208          """Distribute task to peers"""
209          print(f"🔧 Distributing task: {task[:50]}...")
210          
211          # First, discover peers
212          peers = self.discover_peers_local()
213          
214          if not peers:
215              print("⚠️ No peers found, processing locally")
216              result = self.query_ai(task)
217              print(f"🤖 Local AI Result: {result[:100]}...")
218              return result
219          
220          # Send to first peer
221          peer = peers[0]
222          self.send_message(peer['ip'], f"AI_TASK:{task}")
223          
224          # Also process locally
225          local_result = self.query_ai(task)
226          
227          return f"Distributed to {len(peers)} peers. Local: {local_result[:100]}..."
228      
229      def start_interactive(self):
230          """Start interactive mode"""
231          self.start_server()
232          
233          print("\n💬 Interactive Swarm Mode")
234          print("Commands:")
235          print("  discover   - Find peers")
236          print("  peers      - List known peers")
237          print("  send IP    - Send message to IP")
238          print("  task PROMPT - Distribute AI task")
239          print("  quit       - Exit")
240          print("=" * 50)
241          
242          while self.running:
243              try:
244                  cmd = input("\nswarm> ").strip()
245                  
246                  if cmd == "quit":
247                      self.running = False
248                      print("👋 Goodbye!")
249                      break
250                      
251                  elif cmd == "discover":
252                      print("🔍 Discovering peers...")
253                      peers = self.discover_peers_local()
254                      if peers:
255                          print(f"📡 Found {len(peers)} peers:")
256                          for p in peers:
257                              print(f"  • {p['node_id'][:8]} @ {p['ip']}")
258                      else:
259                          print("❌ No peers found")
260                  
261                  elif cmd == "peers":
262                      print(f"📊 Known peers: {len(self.peers)}")
263                      for peer_id, info in self.peers.items():
264                          print(f"  • {peer_id[:8]} @ {info.get('ip', 'unknown')}")
265                  
266                  elif cmd.startswith("send "):
267                      parts = cmd.split()
268                      if len(parts) >= 3:
269                          ip = parts[1]
270                          message = ' '.join(parts[2:])
271                          self.send_message(ip, message)
272                      else:
273                          print("Usage: send IP MESSAGE")
274                  
275                  elif cmd.startswith("task "):
276                      task = cmd[5:]
277                      result = self.distribute_task(task)
278                      print(f"📋 Task Result: {result}")
279                  
280                  elif cmd == "help":
281                      print("Commands: discover, peers, send IP MSG, task PROMPT, quit")
282                  
283                  else:
284                      print("❌ Unknown command. Type 'help' for commands.")
285                      
286              except KeyboardInterrupt:
287                  print("\n👋 Goodbye!")
288                  self.running = False
289                  break
290              except Exception as e:
291                  print(f"❌ Error: {e}")
292  
293  def main():
294      import argparse
295      
296      parser = argparse.ArgumentParser(description="Simple Swarm for Kali")
297      parser.add_argument('--node-id', help='Custom node ID')
298      parser.add_argument('--discover', action='store_true', help='Discover peers and exit')
299      parser.add_argument('--send', nargs=2, metavar=('IP', 'MESSAGE'), help='Send message to IP')
300      parser.add_argument('--task', help='Process AI task')
301      
302      args = parser.parse_args()
303      
304      swarm = SimpleSwarm(args.node_id)
305      
306      if args.discover:
307          peers = swarm.discover_peers_local()
308          print(f"Found {len(peers)} peers:")
309          for p in peers:
310              print(f"  {p['ip']} - {p.get('node_id', 'unknown')}")
311      
312      elif args.send:
313          ip, message = args.send
314          swarm.send_message(ip, message)
315          print(f"Message sent to {ip}")
316      
317      elif args.task:
318          result = swarm.distribute_task(args.task)
319          print(f"Task Result: {result}")
320      
321      else:
322          swarm.start_interactive()
323  
324  if __name__ == "__main__":
325      main()