#!/usr/bin/env python3
"""
修复 docker-compose.yml 中 REDIS_URL 默认值的 URL-encode 问题。

背景:
- 2026-06-15 故障:REDIS_URL 里的密码 R3d!s@2026#Secure 含 @ # 两个 URL 保留字符,
  Python redis 库解析时密码被截断成 R3d!s,导致鉴权失败 → Redis 连接超时
- 修复:把密码 URL-encode(@→%40, #→%23, !→%21)
- ⚠️ 关键: 只 URL-encode REDIS_URL 那行的密码,redis-server --requirepass
  和 healthcheck 的 redis-cli -a 都必须保持**明文**(否则 Redis 容器启动失败/鉴权失败)

用法:
    sudo python3 /tmp/patch-redis-url.py
"""
fp = '/opt/wecom-it-desk/docker-compose.yml'

# 读取当前内容
with open(fp, encoding='utf-8') as f:
    c = f.read()

# 旧值(精确匹配 REDIS_URL 那一行,带 redis://://@ 上下文,避免误改 --requirepass)
old = 'REDIS_URL=redis://:${REDIS_PASSWORD:-R3d!s@2026#Secure}@redis:6379/0'

# 新值:URL-encode 后的密码(!→%21, @→%40, #→%23),仅 REDIS_URL 这一行
new = 'REDIS_URL=redis://:${REDIS_PASSWORD:-R3d%21s%402026%23Secure}@redis:6379/0'

# 检查是否已经修复过(幂等性)
if old in c:
    print('[OK] 检测到未编码版本,准备修复...')
    c2 = c.replace(old, new, 1)  # 只替换第一次出现(更安全)
    with open(fp, 'w', encoding='utf-8') as f:
        f.write(c2)
    delta = len(c2) - len(c)
    print('[OK] 已修复:REDIS_URL 行的密码已 URL-encode')
    print(f'[OK] 文件长度变化:{delta:+d} 字节')
elif new in c:
    print('[OK] 已经修复过,跳过(幂等性 OK)')
else:
    print('[ERROR] 既没找到旧值也没找到新值,请人工检查 docker-compose.yml')
    print('---')
    print('当前 REDIS_URL 相关配置:')
    import subprocess
    result = subprocess.run(['grep', '-n', 'REDIS_URL\\|REDIS_PASSWORD\\|--requirepass\\|redis-cli', fp],
                            capture_output=True, text=True)
    print(result.stdout)
    exit(1)

# 验证:确保 --requirepass 和 redis-cli 仍然是明文(没被误改)
import subprocess
result = subprocess.run(['grep', '-nE', 'REDIS_URL|--requirepass|redis-cli.*-a', fp],
                        capture_output=True, text=True)
print('---')
print('当前所有密码相关行(应只有 REDIS_URL 一行是 URL-encoded,其他保持明文):')
print(result.stdout)
