B
    u&ù`Q[  ã               @   s’  d dl mZ d dl mZ d dl mZ d dl mZ d dlmZ e ¡  d dlT d dl	Z	d dl
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	lmZ d
ZdZdZdZdZdZdZdZdZdd„ ZdZdZdd„ Z dd„ Z!dd„ Z"dd„ Z#dZ$e$d  Z%e$d! Z&d"d#„ Z'd$d%„ Z(d&d'„ Z)d(d)„ Z*d*d+„ Z+d,d-„ Z,d.d/„ Z-d0d1„ Z.d2d3„ Z/d4d5„ Z0dBd7d8„Z1d9d:„ Z2d;d<„ Z3d=d>„ Z4d?d@„ Z5e6dAkrŽe4ƒ  dS )Cé    )Úprint_function)Úabsolute_import)Údivision)Úunicode_literals)Ústandard_library)Ú*N)Úmod_makedirs)Úprint_errorz"/usr/share/cagefs/repair_homes.logz/homez/etc/passwdz!/usr/local/apache/conf/httpd.confz%/usr/local/cpanel/bin/userdata_updatez/usr/sbin/usermodz/var/cpanel/userdataz/etc/cagefs.etcÚ c           	   C   sÆ   yt  tt ¡} W n tk
r&   d S X x˜| D ]}td | }tt d | }t j |¡s\q.yt  |¡ W n tk
rˆ   td|ƒ Y nX yt  	||¡ W q. tk
r¼   td|d|ƒ Y q.X q.W d S )Nz/etc/ú/zWarning: failed to removezWarning: failed to moveÚto)
ÚosÚlistdirÚDEBUG_PREFIXÚ
CAGEFS_ETCÚOSErrorÚpathÚislinkÚunlinkÚprintÚrename)ZdirListÚ_fileÚtargetÚorigin© r   ú!/usr/share/cagefs/repair_homes.pyÚuninstall_cagefs_etc*   s"    
r   z/bin/umountz/var/cagefs/c             C   s2   |   ¡  |  ¡  x| D ]}t td|g¡ qW d S )Nz-l)ÚsortÚreverseÚ
subprocessÚcallÚUMOUNT)Ú_listÚliner   r   r   Úumount_listG   s    
r$   c              C   sV   t ddƒ ¡ } g }x>| D ]6}| ¡ d }| t¡dkr| || d¡d … ¡ qW |S )Nz/proc/mountsÚré   éÿÿÿÿr   )ÚopenÚ	readlinesÚsplitÚfindÚBASEDIRÚappend)Úmountsr"   r#   Ú
mountpointr   r   r   Úget_mounted_dirsM   s    
r0   c             C   s~   t d | dd …  d |  d }tddƒ ¡ }g }x>|D ]6}| ¡ d }| |¡dkr8| || d¡d … ¡ q8W t|ƒ d S )Nr   éþÿÿÿz/proc/mountsr%   r&   r'   )r,   r(   r)   r*   r+   r-   r$   )ÚuserZsubdirr.   Zmylistr#   r/   r   r   r   ÚumountV   s     
r3   c              C   s"   t ƒ } t| ƒdkrt| ƒ dS dS )Nr   TF)r0   Úlenr$   )Údirsr   r   r   Ú
umount_alla   s
    r6   z/etc/cagefs/zusers.disabledzusers.enabledc             C   sâ   |dd … }d| d | }|rvyt  | | ¡ W n tk
rF   Y nX yt  | d | ¡ W qÞ tk
rr   Y qÞX nhyt| d | dƒ W n tk
r    Y nX y&t| | dƒ ¡  t  | | d¡ W n tk
rÜ   Y nX d S )Nr1   r   ié  Úwi¤  )r   Úremover   Úrmdirr   r(   ÚcloseÚchmod)Z_dirÚusernameÚenableÚprefixZfnamer   r   r   Útoggle_fileq   s(    r?   c             C   s6   t j t¡rtt| |ƒ t j t¡r2tt| | ƒ d S )N)r   r   ÚisdirÚdisabled_dirr?   Úenabled_dir)r<   r=   r   r   r   Útoggle_user‹   s    rC   c             C   s   t | dƒ t| ƒ d S )NF)rC   r3   )r2   r   r   r   Údisable_user“   s    
rD   c             C   s   t | dƒ d S )NT)rC   )r2   r   r   r   Úenable_user˜   s    rE   c             C   s@   t j | ¡r<tjdd| gtjdd}| ¡ \}}d|kr<dS dS )NÚfilez-biT)ÚstdoutÚtextrH   F)r   r   Úisfiler   ÚPopenÚPIPEÚcommunicate)r   ÚpÚoutÚ_r   r   r   Úis_text_filež   s    rP   c             C   sP   t | ddd x<tj ¡ }|dkr&P n|dkr@t dƒ t d¡ t dƒ qW d S )	Nú T)ÚendÚflushzyes
zno
ZAbortingr   zPlease, reply with yes or no)r   ÚsysÚstdinÚreadlineÚexit)Úmessager#   r   r   r   Úconfirm©   s    

rY   c              C   s*   t  ¡ } x| D ]}|j d¡rdS qW dS )Nz/var/cagefs/TF)ÚpwdÚgetpwallÚpw_dirÚ
startswith)Úpwr#   r   r   r   Úinvalid_homes_exist¸   s
    
r_   c             G   s@   x&|D ]}t |dd t |d| d qW t dƒ t d| d d S )NrQ   )rR   )rR   rF   r
   )rF   )r   )ÚlogZmessagesÚmsgr   r   r   Ú	print_logÄ   s
    
rb   c          
   C   sb   y6t  td|| g¡}|dkr4t|dtd|| dƒ dS W n& tk
r\   t|dtd|| ƒ dS X dS )Nz-dr   zError:ZfailedTzError: failed to runF)r   r    ÚUSERMODrb   r   )r2   Zhome_dirr`   Zretr   r   r   ÚusermodÏ   s    rd   c             C   s†   d}yXt j|t jt jdd}| ¡ \}}|d kr:t| |ƒ |d krLt| |ƒ |jdkrZd}W n$ tk
r€   t| d|ƒ d}Y nX |S )NFT)rG   ÚstderrrH   r   zError: failed to run)r   rJ   rK   rL   rb   Ú
returncoder   )r`   Zcommand_line_listÚerrorrM   Z
stdoutdataZ
stderrdatar   r   r   Úrun_subprocessß   s"    



rh   Tc             C   sx  t tdƒ}tƒ s&t|dƒ | ¡  d S tdƒ tdƒ tdt d ƒ tdƒ tdtƒ td	ƒ td
ƒ | rttdƒ t 	dt 
¡ ¡}t|d|ƒ t ttd ¡ t|dtd ƒ t ttd ¡ t|dtd ƒ t|dtdƒ t tdƒ}| ¡ }| ¡  t ¡ }x|D ]}|j d¡rt|d|jdƒ tj |j¡}||jkr^t|d|jd|jƒ qtj |j¡}tj |¡}	yt |	¡}
W nX tk
rÞ } z8t|d|jd|jƒ t|d|	dƒ t|t|ƒƒ wW d d }~X Y nX |
j}| d¡røt}ntj |¡}t|d|ƒ |d |	 d | }|d | }tj |¡sptj |¡snt|d|dƒ t|d|d|ƒ qnþt|ƒ tj |¡}tj |¡r¼yt  |¡ W n t!t"fk
rº   Y nX tj #|¡sNyt $||¡ W n6 t!t"fk
r   t|d |d!|ƒ t%|ƒ wY nX tj |¡r.tj #|¡rnt|d"|d!|d#ƒ t%|ƒ qn t|d$|d%|d&ƒ t|d'|d(ƒ t&|||ƒrˆt%|ƒ qxTt't(|ƒƒD ]D}||  )d¡d)kr–||  *|j|¡}| )d¡d)kr–|||< q–W xt +tj ,t-|¡¡D ]}tj ,t-|¡d | }t.|ƒröd*}t |dƒ}| ¡ }| ¡  xlt't(|ƒƒD ]\}||  )d¡d)krH||  *|j|¡}| )d¡d)kr|||< d+}nt|d,|ƒ d*}P qHW |röt ||d ¡ t|d|d ƒ t |d-ƒ}x|D ]}| /|¡ qÞW | ¡  qöW t%|ƒ t|d.|d/ƒ qW t|d0tdƒ t td-ƒ}x|D ]}| /|¡ q:W | ¡  t|d1ƒ t0|t1gƒ | ¡  d S )2Nza+z:Users with invalid pathes to home directories do NOT existz8Users that have invalid path to home directory are foundzC(users that have path to home directory starting with /var/cagefs).z+This script will move home directories to "z'" and change pathes to home directorieszJin /etc/passwd, /var/cpanel/userdata and /usr/local/apache/conf/httpd.confz(Log of all operations will be written toz&Backups will be created automatically.r
   z"Do you want to continue (yes/no)? z%Y-%m-%d %H:%M:%Sz*** Repair startedz.repair.bakzCreated backupZReadingz...r%   z/var/cagefs/zRepairing userzError: Cannot repair home pathzfor userzCannot repair home pathzError: "Parent" userzdoes NOT existzBase home directory:r   zError: home directory of userzis NOT foundzSearched locations:ÚandzError while movingr   zError: movingzwas NOT successfullzWarning: home directoryzof userzalready existszWarning: home directory of userzis NOT movedr'   FTzError: cannot repairr7   ÚUserzhas been repaired SUCCESSFULLY!ZWrittingz"Rebuilding /var/cpanel/userdata...)2r(   ÚLOGFILEr_   rb   r:   r   ÚBASE_HOME_DIRrY   ÚtimeÚstrftimeÚgmtimeÚshutilZcopyfileÚPASSWDÚ
HTTPD_CONFr)   rZ   r[   r\   r]   Úpw_namer   r   ÚbasenameÚdirnameÚgetpwnamÚ	ExceptionÚstrr@   rD   Úrealpathr   r   r   ÚIOErrorÚexistsr   rE   rd   Úranger4   r+   Úreplacer   ÚjoinÚUSERDATArP   Úwriterh   ÚUSERDATA_UPDATE)Zaskr`   Úcur_timer   Z
httpd_confr^   r#   Úinvalid_userÚvar_cagefs_home_of_parentÚparentÚpw_lineÚeÚparent_homeÚ	base_homeÚsrcÚdestZindZtempZ	next_fileZ	file_pathZmodifiedZuserdata_fileZuserdataZ	next_liner   r   r   Úrepair_homesø   sä    











rŒ   c               C   s   t dƒ t dƒ t dƒ d S )NzGPlease, rename or remove /var/cagefs directory of old version of CageFSz7in order to correct operation of new version of CageFS.z8New /var/cagefs directory will be created automatically.)r   r   r   r   r   Úprint_warningÁ  s    r   c            	   C   s¬   t j d¡r¨tƒ s¢y4t j d¡r:t j d¡s:t dd¡ n
t  d¡ W n t	t
fk
r^   Y nX yt  dd¡ tdƒ W q¨ t	t
fk
rž   tdƒ tƒ  Y q¨X ntƒ  d S )Nz/var/cagefsz/var/cagefs.oldTz//var/cagefs has been renamed to /var/cagefs.oldz/failed to rename /var/cagefs to /var/cagefs.old)r   r   r{   r_   r@   r   rp   Zrmtreer   r   rz   r   r   r	   r   r   r   r   r   Úrename_var_cagefsÈ  s    rŽ   c           	   C   s  y*t   tjdd … ddddddg¡\} }W n( t jk
rR   tdƒ t d¡ Y nX t ¡ d	krrtd
ƒ t d¡ x–| D ]Ž\}}|dkrœt	dƒ t d	¡ qx|dkr¶t
ƒ  t d	¡ qx|dkrÐtƒ  t d	¡ qx|dkrìtdƒ t d	¡ qx|dkrxtdƒ t d	¡ qxW t	dƒ d S )Nr&   Úfz
do-not-askzrename-var-cagefsr   zadd-syslog-socketzremove-syslog-socketzUsage errorr   z root privileges required. Abort.)z-fz--do-not-askF)z--rename-var-cagefs)z--uninstall_cagefs_etc)z--add-syslog-socketzZInvalid option.
Use /usr/share/cagefs-plugins/install-cagefs-plugin.py --add-syslog-socket)z--remove-syslog-socketz]Invalid option.
Use /usr/share/cagefs-plugins/install-cagefs-plugin.py --remove-syslog-socketT)ÚgetoptrT   ÚargvZGetoptErrorr   rW   r   Úgeteuidr	   rŒ   rŽ   r   )ZoptsrO   Úor   r   r   ÚmainÞ  s4    
r”   c              C   sN  t dƒ t dƒ t dƒ t dƒ t dƒ tdƒ ttdƒ} t dt ¡ ¡}t| d	|ƒ tƒ srt| d
ƒ |  	¡  d S t
 ¡ }xÄ|D ]º}|j d¡r‚tj |j¡rºt| d|jd|jdƒ q‚t| d|jdƒ tj |j¡}||jkrøt| d|jd|jƒ q‚tj |j¡}tj |¡}yt
 |¡}W nV tk
rv } z6t| d|jd|jƒ t| d|dƒ t| t|ƒƒ w‚W d d }~X Y nX |j}	| |	¡sÎt| d|jd|jƒ t| dƒ t| d|ƒ t| d|	ƒ t| d|ƒ q‚|	 d¡ràt}
ntj |	¡}
|
d | d | }tj |¡s(t| d|d|
d | ƒ q‚|
d | }tj |¡rVt| d|d|dƒ q‚yt ||¡ W n, ttfk
r’   t| d|d |ƒ w‚Y nX tj |¡r°tj |¡rÄt| d!|d |d"ƒ q‚yt |¡ W n ttfk
rì   Y nX yt ||j¡ W n. ttfk
r.   t| d#|jd |ƒ w‚Y nX t| d$|d%ƒ q‚W |  	¡  d S )&NzZThis script repairs home directories of users that have invalid pathes to home directorieszB(users that have path to home directory starting with /var/cagefs)zDThis script will move home directories to proper location and createz"appropriate symlink in /var/cagefsr
   z"Do you want to continue (yes/no)? za+z%Y-%m-%d %H:%M:%Sz*** Repair startedz:Users with invalid pathes to home directories do NOT existz/var/cagefs/ZHomezfor userz is repaired already. Skipping...zRepairing userz...zError: Cannot repair home pathzCannot repair home pathzError: "Parent" userzdoes NOT existzGError: Path to home directory in /var/cagefs for parent user is invalidzParent user:zHome directory of parent user:z-Home directory of parent user in /var/cagefs:r   zError: home directory of userzis NOT found inzError: home directoryzof userzalready existszError while movingr   zError: movingzwas NOT successfullzError while creatimg symlinkrj   zhas been repaired SUCCESSFULLY!) r   rY   r(   rk   rm   rn   ro   rb   r_   r:   rZ   r[   r\   r]   r   r   r   rs   rt   ru   rv   rw   rx   Úendswithrl   r@   r{   r   r   rz   ÚmakedirsÚsymlink)r`   r‚   r^   r#   rƒ   r„   r…   r†   r‡   rˆ   r‰   rŠ   r‹   r   r   r   Úrepair_homes_old  sŽ    



r˜   Ú__main__)T)7Z
__future__r   r   r   r   Zfuturer   Zinstall_aliasesÚbuiltinsr   r   rZ   rp   r   rT   rm   Zclcommon.utilsr   Zsecureior	   rk   rl   rq   rr   r   rc   r   r   r   r   r!   r,   r$   r0   r3   r6   Z	INIPREFIXrA   rB   r?   rC   rD   rE   rP   rY   r_   rb   rd   rh   rŒ   r   rŽ   r”   r˜   Ú__name__r   r   r   r   Ú<module>   sh   	
 J/{
