rework update
This commit is contained in:
		
							parent
							
								
									58d70409b5
								
							
						
					
					
						commit
						e1fccca2f4
					
				
					 1 changed files with 0 additions and 218 deletions
				
			
		
							
								
								
									
										218
									
								
								install.sh
									
										
									
									
									
								
							
							
						
						
									
										218
									
								
								install.sh
									
										
									
									
									
								
							|  | @ -295,8 +295,6 @@ get_custom_wireguard_details() { | ||||||
|     echo "" |     echo "" | ||||||
|     read -p "Allow direct access to server IP (bypass killswitch)? (Y/n): " -n 1 -r |     read -p "Allow direct access to server IP (bypass killswitch)? (Y/n): " -n 1 -r | ||||||
|     echo "" |     echo "" | ||||||
|         WG_DNS="1.1.1.1,1.0.0.1" |  | ||||||
|     fi |  | ||||||
|      |      | ||||||
|     # AllowedIPs |     # AllowedIPs | ||||||
|     read -p "Route all traffic through VPN? (Y/n): " -n 1 -r |     read -p "Route all traffic through VPN? (Y/n): " -n 1 -r | ||||||
|  | @ -762,222 +760,6 @@ EOFAPP | ||||||
|      |      | ||||||
|     log "Backend installed" |     log "Backend installed" | ||||||
| } | } | ||||||
| #!/usr/bin/env python3 |  | ||||||
| 
 |  | ||||||
| from flask import Flask, request, jsonify, send_from_directory |  | ||||||
| from flask_cors import CORS |  | ||||||
| import subprocess |  | ||||||
| import json |  | ||||||
| import os |  | ||||||
| import re |  | ||||||
| import requests |  | ||||||
| import time |  | ||||||
| import logging |  | ||||||
| from pathlib import Path |  | ||||||
| 
 |  | ||||||
| app = Flask(__name__) |  | ||||||
| CORS(app) |  | ||||||
| 
 |  | ||||||
| # Setup logging |  | ||||||
| logging.basicConfig( |  | ||||||
|     level=logging.INFO, |  | ||||||
|     format='%(asctime)s - %(levelname)s - %(message)s', |  | ||||||
|     handlers=[ |  | ||||||
|         logging.FileHandler('/var/log/vpn-gateway.log'), |  | ||||||
|         logging.StreamHandler() |  | ||||||
|     ] |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| MULLVAD_SERVERS = {} |  | ||||||
| LAST_SERVER_UPDATE = 0 |  | ||||||
| VPN_STATUS = { |  | ||||||
|     'connected': False, |  | ||||||
|     'server': None, |  | ||||||
|     'ip': None, |  | ||||||
|     'location': None, |  | ||||||
|     'start_time': None |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| def update_mullvad_servers(): |  | ||||||
|     global MULLVAD_SERVERS, LAST_SERVER_UPDATE |  | ||||||
|     try: |  | ||||||
|         response = requests.get('https://api.mullvad.net/www/relays/all/', timeout=10) |  | ||||||
|         servers = response.json() |  | ||||||
|          |  | ||||||
|         organized = {} |  | ||||||
|         for server in servers: |  | ||||||
|             if server.get('type') == 'wireguard' and server.get('active'): |  | ||||||
|                 country = server.get('country_name', 'Unknown') |  | ||||||
|                 city = server.get('city_name', 'Unknown') |  | ||||||
|                  |  | ||||||
|                 if country not in organized: |  | ||||||
|                     organized[country] = {} |  | ||||||
|                 if city not in organized[country]: |  | ||||||
|                     organized[country][city] = [] |  | ||||||
|                  |  | ||||||
|                 organized[country][city].append({ |  | ||||||
|                     'hostname': server['hostname'], |  | ||||||
|                     'ipv4': server['ipv4_addr_in'], |  | ||||||
|                     'type': 'WireGuard' |  | ||||||
|                 }) |  | ||||||
|          |  | ||||||
|         global MULLVAD_SERVERS |  | ||||||
|         MULLVAD_SERVERS = organized |  | ||||||
|         LAST_SERVER_UPDATE = time.time() |  | ||||||
|         return True |  | ||||||
|     except Exception as e: |  | ||||||
|         logging.error(f"Failed to update servers: {e}") |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
| def generate_wireguard_config(server_hostname): |  | ||||||
|     try: |  | ||||||
|         server_info = None |  | ||||||
|         for country in MULLVAD_SERVERS.values(): |  | ||||||
|             for city in country.values(): |  | ||||||
|                 for server in city: |  | ||||||
|                     if server['hostname'] == server_hostname: |  | ||||||
|                         server_info = server |  | ||||||
|                         break |  | ||||||
|          |  | ||||||
|         if not server_info: |  | ||||||
|             return False |  | ||||||
|          |  | ||||||
|         with open('/etc/wireguard/mullvad_private.key', 'r') as f: |  | ||||||
|             private_key = f.read().strip() |  | ||||||
|          |  | ||||||
|         # Mullvad public key |  | ||||||
|         mullvad_pubkey = "g+9JNZp3SvLPvBb+PzXHyOPHhqNiUdATrz1YdNEPvWo=" |  | ||||||
|          |  | ||||||
|         config = f"""[Interface] |  | ||||||
| PrivateKey = {private_key} |  | ||||||
| Address = 10.64.0.2/32,fc00:bbbb:bbbb:bb01::2/128 |  | ||||||
| DNS = 100.64.0.1 |  | ||||||
| 
 |  | ||||||
| PreUp = iptables -F OUTPUT |  | ||||||
| PreUp = iptables -F FORWARD |  | ||||||
| PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT |  | ||||||
| PostUp = iptables -I FORWARD -i __LAN_INTERFACE__ -o %i -j ACCEPT |  | ||||||
| PostUp = iptables -t nat -A POSTROUTING -o %i -j MASQUERADE |  | ||||||
| PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT |  | ||||||
| PostDown = iptables -t nat -D POSTROUTING -o %i -j MASQUERADE |  | ||||||
| 
 |  | ||||||
| [Peer] |  | ||||||
| PublicKey = {mullvad_pubkey} |  | ||||||
| AllowedIPs = 0.0.0.0/0,::/0 |  | ||||||
| Endpoint = {server_info['ipv4']}:51820 |  | ||||||
| PersistentKeepalive = 25 |  | ||||||
| """ |  | ||||||
|          |  | ||||||
|         # Add firewall exception for this server |  | ||||||
|         subprocess.run([ |  | ||||||
|             'iptables', '-I', 'OUTPUT', '1', '-p', 'udp', |  | ||||||
|             '--dport', '51820', '-d', server_info['ipv4'], '-j', 'ACCEPT' |  | ||||||
|         ]) |  | ||||||
|          |  | ||||||
|         with open('/etc/wireguard/wg0.conf', 'w') as f: |  | ||||||
|             f.write(config) |  | ||||||
|         os.chmod('/etc/wireguard/wg0.conf', 0o600) |  | ||||||
|          |  | ||||||
|         return True |  | ||||||
|     except Exception as e: |  | ||||||
|         logging.error(f"Failed to generate config: {e}") |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
| def check_vpn_status(): |  | ||||||
|     global VPN_STATUS |  | ||||||
|     try: |  | ||||||
|         result = subprocess.run(['wg', 'show', 'wg0'], capture_output=True, text=True) |  | ||||||
|          |  | ||||||
|         if result.returncode == 0: |  | ||||||
|             VPN_STATUS['connected'] = True |  | ||||||
|              |  | ||||||
|             # Get public IP |  | ||||||
|             try: |  | ||||||
|                 response = requests.get('https://am.i.mullvad.net/json', timeout=5) |  | ||||||
|                 data = response.json() |  | ||||||
|                 VPN_STATUS['ip'] = data.get('ip') |  | ||||||
|                 VPN_STATUS['location'] = f"{data.get('city')}, {data.get('country')}" |  | ||||||
|             except: |  | ||||||
|                 pass |  | ||||||
|         else: |  | ||||||
|             VPN_STATUS['connected'] = False |  | ||||||
|             VPN_STATUS['server'] = None |  | ||||||
|             VPN_STATUS['ip'] = None |  | ||||||
|             VPN_STATUS['location'] = None |  | ||||||
|     except: |  | ||||||
|         VPN_STATUS['connected'] = False |  | ||||||
| 
 |  | ||||||
| @app.route('/') |  | ||||||
| def index(): |  | ||||||
|     return send_from_directory('__INSTALL_DIR__/static', 'index.html') |  | ||||||
| 
 |  | ||||||
| @app.route('/api/servers') |  | ||||||
| def get_servers(): |  | ||||||
|     global LAST_SERVER_UPDATE |  | ||||||
|     if time.time() - LAST_SERVER_UPDATE > 3600: |  | ||||||
|         update_mullvad_servers() |  | ||||||
|     return jsonify({'servers': MULLVAD_SERVERS}) |  | ||||||
| 
 |  | ||||||
| @app.route('/api/status') |  | ||||||
| def get_status(): |  | ||||||
|     check_vpn_status() |  | ||||||
|     uptime = None |  | ||||||
|     if VPN_STATUS['connected'] and VPN_STATUS['start_time']: |  | ||||||
|         uptime_seconds = int(time.time() - VPN_STATUS['start_time']) |  | ||||||
|         hours = uptime_seconds // 3600 |  | ||||||
|         minutes = (uptime_seconds % 3600) // 60 |  | ||||||
|         uptime = f"{hours}h {minutes}m" |  | ||||||
|      |  | ||||||
|     return jsonify({ |  | ||||||
|         'connected': VPN_STATUS['connected'], |  | ||||||
|         'server': VPN_STATUS['server'], |  | ||||||
|         'ip': VPN_STATUS['ip'], |  | ||||||
|         'location': VPN_STATUS['location'], |  | ||||||
|         'uptime': uptime |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
| @app.route('/api/connect', methods=['POST']) |  | ||||||
| def connect_vpn(): |  | ||||||
|     data = request.json |  | ||||||
|     server = data.get('server') |  | ||||||
|      |  | ||||||
|     try: |  | ||||||
|         subprocess.run(['wg-quick', 'down', 'wg0'], capture_output=True) |  | ||||||
|          |  | ||||||
|         if not generate_wireguard_config(server): |  | ||||||
|             return jsonify({'success': False, 'error': 'Failed to generate config'}) |  | ||||||
|          |  | ||||||
|         result = subprocess.run(['wg-quick', 'up', 'wg0'], capture_output=True, text=True) |  | ||||||
|          |  | ||||||
|         if result.returncode == 0: |  | ||||||
|             VPN_STATUS['start_time'] = time.time() |  | ||||||
|             VPN_STATUS['server'] = server |  | ||||||
|             return jsonify({'success': True}) |  | ||||||
|         else: |  | ||||||
|             return jsonify({'success': False, 'error': result.stderr}) |  | ||||||
|     except Exception as e: |  | ||||||
|         return jsonify({'success': False, 'error': str(e)}) |  | ||||||
| 
 |  | ||||||
| @app.route('/api/disconnect', methods=['POST']) |  | ||||||
| def disconnect_vpn(): |  | ||||||
|     try: |  | ||||||
|         result = subprocess.run(['wg-quick', 'down', 'wg0'], capture_output=True, text=True) |  | ||||||
|         VPN_STATUS['start_time'] = None |  | ||||||
|         return jsonify({'success': result.returncode == 0}) |  | ||||||
|     except Exception as e: |  | ||||||
|         return jsonify({'success': False, 'error': str(e)}) |  | ||||||
| 
 |  | ||||||
| if __name__ == '__main__': |  | ||||||
|     update_mullvad_servers() |  | ||||||
|     app.run(host='0.0.0.0', port=5000) |  | ||||||
| EOFAPP |  | ||||||
|      |  | ||||||
|     # Replace placeholders |  | ||||||
|     sed -i "s|__LAN_INTERFACE__|$LAN_INTERFACE|g" "$INSTALL_DIR/app.py" |  | ||||||
|     sed -i "s|__INSTALL_DIR__|$INSTALL_DIR|g" "$INSTALL_DIR/app.py" |  | ||||||
|      |  | ||||||
|     log "Backend installed" |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| # Setup nginx (placeholder function) | # Setup nginx (placeholder function) | ||||||
| setup_nginx() { | setup_nginx() { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue