HEX
Server: nginx/1.18.0
System: Linux mail.dakarash.co.id 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64
User: www-data (33)
PHP: 8.1.2-1ubuntu2.23
Disabled: NONE
Upload Files
File: //usr/local/CyberCP/install/setup_env.py
#!/usr/bin/env python3
"""
Environment setup script for CyberPanel
Automatically detects server IP and configures .env file
"""

import os
import socket
import urllib.request
import re
import shutil
from pathlib import Path

def get_public_ip():
    """Get the public IP address of the server using multiple methods"""
    methods = [
        'https://ipv4.icanhazip.com',
        'https://api.ipify.org',
        'https://checkip.amazonaws.com',
        'https://ipecho.net/plain'
    ]

    for url in methods:
        try:
            with urllib.request.urlopen(url, timeout=10) as response:
                ip = response.read().decode('utf-8').strip()
                # Validate IP format
                if re.match(r'^(\d{1,3}\.){3}\d{1,3}$', ip):
                    return ip
        except Exception:
            continue

    return None

def get_local_ip():
    """Get the local IP address of the server"""
    try:
        # Connect to a remote address to determine the local IP
        with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
            s.connect(("8.8.8.8", 80))
            return s.getsockname()[0]
    except Exception:
        return None

def setup_env_file(cyberpanel_root="/usr/local/CyberCP"):
    """Set up the .env file with auto-detected IP addresses"""
    env_template_path = os.path.join(cyberpanel_root, ".env.template")
    env_path = os.path.join(cyberpanel_root, ".env")

    # Get IPs
    public_ip = get_public_ip()
    local_ip = get_local_ip()

    # Build ALLOWED_HOSTS list
    allowed_hosts = ['localhost', '127.0.0.1']

    if local_ip and local_ip not in allowed_hosts:
        allowed_hosts.append(local_ip)

    if public_ip and public_ip not in allowed_hosts:
        allowed_hosts.append(public_ip)

    # For maximum compatibility, also include wildcard
    # This ensures the server works regardless of how it's accessed
    allowed_hosts.append('*')

    allowed_hosts_str = ','.join(allowed_hosts)

    print(f"Auto-detected public IP: {public_ip}")
    print(f"Auto-detected local IP: {local_ip}")
    print(f"Setting ALLOWED_HOSTS to: {allowed_hosts_str}")

    # If .env doesn't exist, copy from template
    if not os.path.exists(env_path):
        if os.path.exists(env_template_path):
            shutil.copy2(env_template_path, env_path)
            print(f"Created .env file from template")
        else:
            print(f"Warning: Template file not found at {env_template_path}")
            return False

    # Update ALLOWED_HOSTS in .env file
    try:
        with open(env_path, 'r') as f:
            content = f.read()

        # Update ALLOWED_HOSTS line
        content = re.sub(
            r'^ALLOWED_HOSTS=.*$',
            f'ALLOWED_HOSTS={allowed_hosts_str}',
            content,
            flags=re.MULTILINE
        )

        with open(env_path, 'w') as f:
            f.write(content)

        print(f"Updated ALLOWED_HOSTS in {env_path}")
        return True

    except Exception as e:
        print(f"Error updating .env file: {e}")
        return False

if __name__ == "__main__":
    import sys

    # Allow custom path as argument
    cyberpanel_root = sys.argv[1] if len(sys.argv) > 1 else "/usr/local/CyberCP"

    success = setup_env_file(cyberpanel_root)
    sys.exit(0 if success else 1)