a n,h)@s@dZddlZddlZddlmZddlmZddlmZddl Z ddl Z ddl Z ddl m Z mZmZddlmZmZddlmZdd lmZddlZe jdd ddlZdd lmZdd lmZmZed rd Z nedrdZ ndZ eGdddZ!e!dddZ"e#e#dddZ$e#edddZ%d;e e#e&dddZ'e e#e#e&ddd Z(e e#eedfe&d!d"d#Z)e e#ee#dfe&d$d%d&Z*e eee#dfe&d'd(d)Z+e!ee#ee,e#d*d+d,Z-eee.e#efddfd-d.d/Z/d0d1Z0e1e#e,e#fd2d3d4Z2e,e#d5d6d7Z3e,e#d5d8d9Z4e5d:krdszget_args..z/var/cpanel/packagesz--pkgz-pz-PZPKGrzSet a package type )metavarr&choicesr(rz4Path to the backup file or directory of backup files)r'r(z2 --newuser invalid when restoring from a directoryFz /home/t1binz/var/log/t1bin)argparseArgumentParserr add_argument arg_typesZvalid_usernamerr existing_reseller HOSTFILEMODSZ ipaddressriterdirrestorable_path parse_argsris_dirrZ print_helpsysexitrrr)parserZpackagesargsr!r!r"get_args/s        rC)userr#cCs|s td|dkr|St|s2td|dzbtdddB}|D],}||drF|Wd WSqFWd n1s0YWn tytd tjd Yn0t|d d S) zDArgparse type: validate a user as existing with reseller permissionszcannot be blankrootz reseller z does not existz/var/cpanel/resellersascii)encoding:Nz$/var/cpanel/resellers does not existfilez not setup as a reseller) BadArgrads is_cpuseropen startswithFileNotFoundErrorprintr?stderr)rDhandleliner!r!r"r9s < r9)str_pathr#c Csvz t|WStyYn0zt|}Wn.ty\}ztd|WYd}~n d}~00|tdkrrtd|S)zSArgparse type: validates a path as either a cpmove file or a directory in /homez9not a cPanel backup or directory in /home containing themNz/homezQinvalid path; when restoring from a directory, it must be a subdirectory of /home)r8Zcpmove_file_typerKZ path_in_homer)rUrexcr!r!r"r<s"   r<TrSmsgZshowcCs2|ds|d}|||r.t|dddS)z$Writes to a log and prints to stdout )endN)endswithwriterQrWr!r!r" log_prints    r^)log_filerDrr#c Csn|dkr dSt|d|d|zt||Wn6tyh}zt|d|WYd}~dSd}~00dS)zChange a user's ownerrETzsetting owner of  to zmodifyacct failed: NF)r^r set_ownerr )r_rDrrVr!r!r"rasra)r_rDrr#c Csn|sdSt|d|d|zt|t|Wn6tyh}zt|d|WYd}~dSd}~00dS)zSet a user's IPTzsetting IP of r`zsetsiteip failed: NF)r^rZ setsiteiprr )r_rDrrVr!r!r"set_ipsrb)r_rDpkgr#c Csj|sdSt|d|d|zt||Wn6tyd}zt|d|WYd}~dSd}~00dS)zSet a user's cPanel packageTzsetting package of r`zchangepackage failed: NF)r^rZ changepackager )r_rDrcrVr!r!r" set_packagesrd)r_cpmoverr,cCsddg}|r|d|g||d}t|tddtjtjd4}|jD]}t|||d|vrLd }qLWd n1s~0Y| d |j d krt|d |j d }|S)zExecute restorepkgz$/usr/local/cpanel/scripts/restorepkgz --skipresr%Tutf-8replace)ZlimrGerrorsstdoutrRzAccount Restore FailedFNrYrzrestorepkg exit code was ) extendappendr os cpu_countPIPEZSTDOUTrir^r] returncode)r_rerr,cmdsuccessprocrTr!r!r" restorepkgs.   $  rs)rBrerDlogr#cCs|jp|}|j|kr*t|jddgSt|rJt|dtjddgStd||jddd}t|||j|j sdgWd Sg}t |||js| d |jt |||j s| d |j t|||js| d |jWd n1s0Y|S) zgRestore a user (restorepkg + set owner/ip/package) and return a list of task(s) that failed, if anyz-: You cannot set a reseller to own themselvesrszalready existsrIz Logging to:arf)moderGNz set owner to z set ip to zset package to )rrrQrLrMr?rRrNrsr,rarkrbrrdr)rBrerDrtr_failedr!r!r" restore_users&    2rx)rr#ccs2|D]$}t|j}r|d|fVqdS)z)Iterate over backups found in a directoryN)r;r matchr/group)rentryrzr!r!r" iter_backupss r}c Cs`t}i}|jjddd|jrtt|j}|sHtd|jt d|D]\}}t ||ddqT|j r~t dnt d std |D](\}}|j|d }t||||}q|D]\}}|||<qnJt|jjd }|jr|jn|}|j|d }t||j||||<t|d d|D}|jrLt||jr\t|dS)z"Wrapper around cPanel's restorepkgiT)rvexist_okzNo backups in z'The following backups will be restored:: sepzWould you like to proceed?rz .restore.logrycSsg|]\}}|dgkr|qS)rsr!)r0kvr!r!r" 7zmain..N)rCrmkdirrr>listr}r?r@rQrtimesleeprLZ prompt_y_njoinpathrxr rzr/r{r print_resultsitemsrrprint_host_mods) rB user_failsZbackupsrDrrtrwZ orig_userrestoredr!r!r"mains:        r)rcCsPtd|D]:\}}|rs rrcCs|sdStddg|dS)zRuns fixperms on restored usersNz/usr/bin/fixpermsr+) subprocesscallrr!r!r"rIsrcCs$td|D]}tt|gq dS)z$Runs the command at ``HOSTFILEMODS``z4Host file mod entries for all restored cPanel users:N)rQrrr:)rrDr!r!r"rQsr__main__)T)6rrlr5Z dataclassesrrrKpathlibrrr?rtypingrrrZcpapisrr Zcprocr Znetaddrr rLrinsertr8r Zserverr rr.r:rrCrr9r<r r^rarbrdrsrrxtupler}rdictrrrrr!r!r!r"sR        V    "&