
    2h&                         d Z ddlZddlZddlZddlZddlZddlmZ ddZd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zedk(  r e        yy)uO   
Flask应用深度诊断工具
用于诊断Gunicorn启动失败的具体原因
    N)datetimec                     	 t        j                  | ddd|      }|j                  |j                  |j                  fS # t
        $ r}ddt        |      fcY d}~S d}~ww xY w)u!   执行系统命令并返回结果T)shellcapture_outputtextcwd    N)
subprocessrun
returncodestdoutstderr	Exceptionstr)cmdr   resultes       /var/www/html/run.pyrun_commandr      sa    

   &-->> "c!f}s   <? 	A AA A c                      g d} | D ]3  }t         j                  j                  |      s#t        d|        |c S  t        d       y)u   查找Flask应用入口文件)zrun.pyzapp.pyzmain.pyzwsgi.pyzapplication.pyz	server.pyu   ✓ 找到应用文件: u$   ✗ 未找到Flask应用入口文件N)ospathexistsprint)possible_filesfilenames     r   find_flask_app_filer      sM    N
 # 77>>(#,XJ78O
 

01    c                    t        d|  d       	 t        j                  j                  t        j                  j	                  |             xs d}t
        j                  j                  d|       t        j                  j                  d|       }t        j                  j                  |      }|j                  j                  |       d}t        |      D ]9  }t        ||      }t        |d      st        |d      s)|}t        d	|         n |t        d
       yt        d       d|fS # t         $ r7}t        d|        t        d       t#        j$                          Y d}~yd}~ww xY w)u   测试导入Flask应用u   测试导入 z ....r   test_appNimport_nameurl_mapu   ✓ 找到Flask应用实例: u   ✗ 未找到Flask应用实例)FNu!   ✓ Flask应用语法检查通过Tu   ✗ 导入应用失败: u   详细错误信息:)r   r   r   dirnameabspathsysinsert	importlibutilspec_from_file_locationmodule_from_specloaderexec_moduledirgetattrhasattrr   	traceback	print_exc)app_fileapp_dirspecmodule	flask_app	attr_nameattrr   s           r   test_import_appr;   +   s>   	M(4
() ''//"''//(";<C7# ~~55j(K006 	' 	V 	I69-Dt]+i0H 	5i[AB	 2356?" (,-#$	s*   C"D1 4D1  D1 "D1 1	E1:-E,,E1c                     t        d       d} t        j                  j                  |       rt        d       t	        | d      5 }|j                         j                         j                  d      }t        dt        |D cg c]5  }|j                         s|j                         j                  d      r4|7 c}              ddd       nt        d	       g d
}g }|D ],  }t        d| d      \  }}}|dk7  s|j                  |       . |rt        d|        yt        d       yc c}w # 1 sw Y   bxY w)u   检查依赖包u   检查依赖包...zrequirements.txtu   ✓ 找到requirements.txtr
u     依赖包数量: #Nu   ✗ 未找到requirements.txt)flaskgunicornpymysqlzflask-sqlalchemyzpython -c 'import 'r   u   ✗ 缺少依赖包: Fu%   ✓ 所有关键依赖包都已安装T)r   r   r   r   openreadstripsplitlen
startswithr   append)	req_filefreqsr=   required_packagesmissing_packagespackagecode_s	            r   check_dependenciesrS   P   s8   	
 "H	ww~~h*+(C  	qA668>>#))$/D',l1	RSRYRYR[RfRfgjRkQ,l(m'nop	q 	q 	-. M$ - #5gYa!@A
a19##G,-
 %&6%78956% -m	q 	qs*   =D5D0D07D0;D50D55D>c                      t        d       g d} g }| D ]A  }t        j                  j                  |      s#|j	                  |       t        d|        C |st        d       |S )u   检查配置文件u   检查配置文件...)	config.pysettings.py.envzgunicorn.conf.pyu   ✓ 找到配置文件: u   ✗ 未找到常见配置文件)r   r   r   r   rJ   )config_filesfound_configsconfig_files      r   check_config_filesr[   n   sf    	
!"KLM# <77>>+&  -,[M:;<
 /0r   c                  L   t        d       t               } | st        d       y| j                  dd      }d| d}t        d|        t        |      \  }}}|d	k(  rt        d
       yt        d| d       t        d       t        |       t        d       t        |       y)u   测试Gunicorn启动u   测试Gunicorn启动...u3   ✗ 无法找到应用文件，跳过Gunicorn测试Fz.pyr
   z\gunicorn --bind 127.0.0.1:5001 --workers 1 --timeout 30 --log-level debug --error-logfile - z:appu   执行命令: r   u   ✓ Gunicorn启动测试成功Tu+   ✗ Gunicorn启动测试失败 (退出码: )u   标准输出:u   错误输出:)r   r   replacer   )r4   
app_moduler   rQ   r   r   s         r   test_gunicorn_startr`      s    	
#$"$HCD !!%,Jhishttx
yC	N3%
 !&s+D&&qy./;D6CDofofr   c                     t        d       	 ddl} t        d       g d}d}|D ]z  }t        j                  j                  |      s#t        |d      5 }|j                         }d	|v sd
|j                         v rt        d| d       d}	 ddd        n	 ddd       | |st        d       yy# t        $ r t        d       Y yw xY w# 1 sw Y   xY w)u   检查数据库连接u   检查数据库连接...r   Nu   ✓ PyMySQL模块可用u   ✗ 缺少PyMySQL模块F)rU   rV   rW   r=   SQLALCHEMY_DATABASE_URImysqlu   ✓ 在 u    中找到数据库配置Tu   ✗ 未找到数据库配置)	r   rB   ImportErrorr   r   r   rD   rE   lower)rB   rX   db_config_foundrZ   rL   contents         r   check_database_connectionrh      s    	
$%'( 8LO# 77>>+&k3' 1&&(,77gmmo;UH[M1JKL&*O ;U  ,-+  '( s   B0 9C
0CC
C	c                     t        d       d} t        j                  j                  |       rt        d|         t	        | d      5 }|j                         }t        d       t        d       t        |       t        d       d|j                         v rt        d       nt        d	       d
|v rt        d       nt        d       d|v rt        d       nt        d       ddd       yt        d|         y# 1 sw Y   yxY w)u   分析服务配置u   分析服务配置...z&/etc/systemd/system/linguotree.serviceu   ✓ 找到服务配置文件: r=   u   服务配置内容:z(----------------------------------------rA   u   ✓ 服务使用Gunicornu   ? 服务可能不使用GunicornWorkingDirectoryu   ✓ 设置了工作目录u   ? 未设置工作目录Environmentu   ✓ 设置了环境变量u   ? 未设置环境变量Nu!   ✗ 未找到服务配置文件: FT)r   r   r   r   rD   rE   re   )service_filerL   rg   s      r   analyze_service_configrm      s    	
!";L	ww~~l#.|n=>,$ 	1ffhG'((O'N(O W]]_,0178!W,12/0'12/0+	14  	1,@A1	14 s   BC;;Dc                     t        d       t        d       t        dt        j                         j                  d              t        d       t	               } t               }t               }| rt        |       \  }}nd}d}t               }t               }t        d       t        d       t        d       g }|s|j                  d	       |s| r|j                  d
       |s|j                  d       |s|j                  d       t        d| rdnd d| xs d        t        d|rdnd        t        d|rdnd        t        d|rdnd        t        d|rdnd        |rt        dt        |       d       t        |d      D ]  \  }}	t        | d|	         t        d       t        d       t        d       t        d       t        d       t        d       |S t        d        t        d!       t                |S )"u   全面诊断<============================================================u   Flask应用深度诊断u   诊断时间: z%Y-%m-%d %H:%M:%SFN=
============================================================u   诊断总结:u   依赖包缺失u   应用导入失败u   数据库连接问题u   服务配置问题u   应用文件: u   ✓u   ✗ u	   未找到u   依赖检查: u   导入测试: u   数据库连接: u   服务配置: u   
发现 u    个问题:r	   z. u   
建议解决步骤:uE   1. 检查并安装缺失的依赖包: pip install -r requirements.txtu   2. 修复应用代码错误u   3. 检查数据库连接配置u   4. 验证服务配置文件u   5. 重新启动服务u   
✓ 未发现明显问题u)   尝试手动启动Gunicorn进行测试...)r   r   nowstrftimer   rS   r[   r;   rh   rm   rJ   rH   	enumerater`   )
r4   deps_okconfigs	import_okr8   db_ok
service_okissuesiissues
             r   diagnose_comprehensiver}      s   	&M	
#$	N8<<>223FGH
IJ	&M #$H !"G !"G .x8	9		 &'E ()J 
-	/	&MF'(*+-.*+	NH5%8(:Qk9R
ST	NG57
89	NI559
:;	ue%8
9:	NJ5E:
;<	#f+k23!&!, 	#HAuQCr%/"	# 	%&UV+,./+,%& M	 	+,9:Mr   c                  \    t        d       t        d       t        d       t        d       y)u   建议修复方案rp   u   修复建议:ro   u  
1. 检查应用文件:
   - 确认入口文件（如run.py）存在且语法正确
   - 确认Flask应用实例名称正确

2. 检查依赖:
   - 运行: pip install -r requirements.txt
   - 或安装缺失包: pip install flask gunicorn pymysql flask-sqlalchemy

3. 检查数据库配置:
   - 确认数据库服务运行: systemctl status mysql
   - 检查数据库连接字符串是否正确

4. 检查环境变量:
   - 确认数据库密码等敏感信息正确配置

5. 临时测试启动:
   - cd /var/www/html
   - source venv/bin/activate
   - python run.py  # 直接运行测试
   - gunicorn run:app  # Gunicorn测试

6. 修复服务文件后重启:
   - systemctl daemon-reload
   - systemctl restart linguotree.service
    N)r    r   r   suggest_fixesr   $  s&    	-	/	&M	  	r   c                  r    t        d       t               } t                t        dt        |        d       y)u	   主函数u   Flask应用深度诊断工具u   
诊断完成，发现 u
    个问题N)r   r}   r   rH   )rz   s    r   mainr   E  s2    	
)* $%F O	$S[M
<=r   __main__)N)__doc__r   r'   r   importlib.utilr)   r2   r   r   r   r;   rS   r[   r`   rh   rm   r}   r   r   __name__r   r   r   <module>r      sn   
 
 
    #J<"6>!FFP	B
> zF r   