import os
import urllib.request
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

def get_external_ip():
    """Obtém o IP Externo automaticamente no Google Cloud"""
    try:
        # Tenta o servidor de metadados do Google Cloud (Mais rápido e confiável no GCP)
        url = "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip"
        req = urllib.request.Request(url)
        req.add_header("Metadata-Flavor", "Google")
        with urllib.request.urlopen(req, timeout=2) as response:
            return response.read().decode('utf-8')
    except:
        # Fallback caso não esteja no GCP ou falhe (usa serviço externo)
        try:
            return urllib.request.urlopen('https://ident.me', timeout=2).read().decode('utf8')
        except:
            return "127.0.0.1"

def main():
    # --- CONFIGURAÇÕES ---
    USUARIO = "admin"
    SENHA = "12345"
    PORTA = 2121
    PASTA_RAIZ = "/home/jrussi/ftp/"
    IP_EXTERNO = get_external_ip()
    
    print(f"IP Externo detectado: {IP_EXTERNO}")

    # Garante que a pasta existe
    if not os.path.exists(PASTA_RAIZ):
        os.makedirs(PASTA_RAIZ)
        print(f"Pasta criada: {PASTA_RAIZ}")

    # 1. Configura permissões
    authorizer = DummyAuthorizer()
    # Permissão total para o usuário
    authorizer.add_user(USUARIO, SENHA, PASTA_RAIZ, perm="elradfmwMT")

    # 2. Configura o manipulador (Handler)
    handler = FTPHandler
    handler.authorizer = authorizer
    
    # Configurações cruciais para Google Cloud (NAT/Firewall)
    handler.masquerade_address = IP_EXTERNO
    handler.passive_ports = range(60000, 60500)

    # 3. Inicia o servidor
    address = ("0.0.0.0", PORTA)
    server = FTPServer(address, handler)

    print(f"Servidor FTP pronto!")
    print(f"Endereço: ftp://{USUARIO}:{SENHA}@{IP_EXTERNO}:{PORTA}")
    
    server.serve_forever()

if __name__ == "__main__":
    main()