ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ iB^c@`s*ddlmZddlmZddlmZddlZddlZddlZddlZddlZddl Z ddl m Z m Z m Z mZddlmZddlmZdd lmZdd lmZmZdd lmZdd lmZdd lmZdefdYZdS(i(tprint_function(tabsolute_import(tdivisionN(tS_IRUSRtS_IWUSRtS_IRGRPtS_IROTH(t iteritemsi(tClSelect(tClSelectExcept(tClPwdt clcaptain(tclprint(tutils(tExternalProgramFailedt ClUserSelectcB`seZdZdZdZdZdZd%dZe e e dZ dZ dd%d Z ed Zd Zd Zd ZdZeee dZedZdZdZdZdZdZdZd%d%edZe eZdZdZdZdZ dZ!dZ"e e"Z"dZ#dZ$e e$Z$e d Z%d!Z&d"Z'e e'Z'd#Z(d$Z)RS(&s /var/cagefss'/usr/share/cagefs-skeleton/usr/selectors /usr/selectors/etc/cagefs/excludes.cl.selector/selector.pathcC`stjjdsdSx|D]}|jj|}tjj|jd}tjj|s|j|}zCytj |Wn+t t fk r}t j ||nXWdtj|XqqWdS(s Creates flags mod_lsapi_reset_me in users' home directories in order to recreate CRIU images when php version/extensions/options have changed For details see LVEMAN-1210 :param users: list of usernames (strings) s/var/run/mod_lsapi/criu.enabledNtmod_lsapi_reset_me(tostpathtisfilet_clpwdtget_pw_by_nametjointpw_dirt _change_uidR twritetOSErrorRR tUnableToSaveDataRt _restore_uid(tselftuserstusertpwRtprevious_user_datate((sF/opt/alt/python27/lib/python2.7/site-packages/clselect/cluserselect.pytclean_crui_images%s c C`sCyBdtjkr%tjjdnddlm}m}m}Wn5tk rytd|rrtj dqzt SnX|r|r|}|ryD|d}|j dstd|rtj dqt SnWqt k rqXqn|||d t d tjdkd |} | r?|r?tj dn| S( s Switch symlink for alt php. Create .cagefs directory if not created Rerurn True if error has occured s/usr/share/cagefsi(tconfigure_alt_phptis_ea4_enabledtread_cpanel_ea4_php_confsERROR: CageFS not installed.itdefaultsea-phpslERROR: system default PHP version is alt-php. PHP Selector is disabled. Use cPanel MultiPHP manager instead.t write_logt drop_permtconfigure_multiphp(tsysRtappendt cagefsctlR$R%R&t ImportErrortprinttexittTruet startswithtKeyErrortFalseRtgeteuid( tversionR t exit_on_errorR*R$R%R&tconft default_phpterror((sF/opt/alt/python27/lib/python2.7/site-packages/clselect/cluserselect.pytswitch_symlink_for_alt_php;s2         - cC`s|jr#tdtjdntjdkrOtdtjdn|j}xUt|D]G\}}td||jj |}t j ||dt dt qhWdS(NsPERROR: this option does not work in "single user" mode (when CageFS is disabled)iisERROR: root privileges requiredsProcessing userR7R*( twithout_cagefsR/R+R0RR5tget_user_version_mapRRRRR;R4(Rtusers_vers_dictRR6R ((sF/opt/alt/python27/lib/python2.7/site-packages/clselect/cluserselect.pytapply_symlinks_rulesds     tphpcC`sGtj||t|_t|_|r:||_n g|_dS(N(Rt__init__R Rtsett_user_excludestexclude_pid_list(RtitemRD((sF/opt/alt/python27/lib/python2.7/site-packages/clselect/cluserselect.pyRAqs    c`sfj|j|}j|}tjj|sA|Sjtjj|j}tjj |s{|Stj |j rj sj jnj jkr|Sntjjjkr|Sy\ttfdtjd}||d|djfSWnttfk ra|SXdS(sl Returns alternative version for a user @param user: string @return: string c`s|djkS(Ntdata(t_item(ti(t alternativestlink_dstR(sF/opt/alt/python27/lib/python2.7/site-packages/clselect/cluserselect.pytsiR6RFN(t_check_user_in_cagefst_compose_user_alt_patht_compose_native_infoRRtisdirtget_all_alternatives_dataRRGtislinktreadlinkR<t_native_contentst_load_native_contentstdirnamet SELECTOR_PATHtlisttfiltertkeyst IndexErrorR3(RRtshow_native_versiontalt_pathtnativet full_pathR6((RIRJRsF/opt/alt/python27/lib/python2.7/site-packages/clselect/cluserselect.pyt get_versionzs4     cC`s|tjj|sx|j|}zCytj|Wn+ttfk rb}tj ||nXWdt j |XndS(N( RRRORR tmkdirRRR RRR(RRRR!R"((sF/opt/alt/python27/lib/python2.7/site-packages/clselect/cluserselect.pyt create_dirscC`s|jj|}tjj||j}|j|}|j|||jd|ddt |jd|ddt |j |dS(s\ Creates additional directory and symlinks for use in "without CageFS" mode s ../php-clis/phptcheck_existences../phps/php-cgiN( Rt get_homedirRRRt SELECTOR2_DIRRRat_create_symlinkR1R(RRthomedirt path_in_hometcur_user((sF/opt/alt/python27/lib/python2.7/site-packages/clselect/cluserselect.pytcreate_selector_symlinksscC`sWtjjtjrSy|jjd|jSWqStj t t fk rOdSXndS(NtversionsR]( RRRRt DEFAULTS_PATHt_dhtgetRGt ConfigParsertErrortIOErrorR3(R((sF/opt/alt/python27/lib/python2.7/site-packages/clselect/cluserselect.pytget_default_versions cC`stjj|jj|dd}tjj|sO|j||jnty2|j|}|j||j d|j Wn?t j t tfk r}tdt|tjdnXdS(Ns .cl.selectors defaults.cfgRjs*Error while restoring settings from backupi(RRRRRcRt set_versionRqt_get_default_config_handlerRmRGRnRoRpR3R/tstrR+R0(RRtuser_backup_pathtdhR"((sF/opt/alt/python27/lib/python2.7/site-packages/clselect/cluserselect.pytset_version_from_backups$#cC`s|jr|j|}n|j||j|}tjj|sw|jre|j||qwtj |n|j }|j ||j j |} |dkr4|jr|js|j|jnx[t|jD]*\} } |j| |d| ||qWqd} t} tjjd|jf| }tjj|rtjjd|j| }tjj|| }|j||||t} nxtj|jD]y}|j|krqn|jdr| rqntjj||}tjj|j|}|j||||qWnh||krRtj|nxGt||dD]1\} }|j|tjj|| ||qgW|jrtj|n&tj|| d||j|||j ||j!||r |j"||SdS( sg Sets alternative version for a user @param user: string @return: None R]t/sphp.inis%s.etcs.iniRFR7N(#R<RRLRMRRRORaR tNoUserSelectorRPt_remove_alternatives_linksRRRSRTRGRReR4Rt NATIVE_PATHtexistsRVR1tlistdirtendswithtNoSuchAlternativeVersionRRR;t_switch_php_da_ispt_reload_processest_backup_settingst get_summary(RRR6treturn_summaryR[R7R!R\RIR REt native_pathtinitnew_ini_createdt new_ini_pathtsrctdsttfilenameR((sF/opt/alt/python27/lib/python2.7/site-packages/clselect/cluserselect.pyRrsZ        %  !)   c C`s |j||j}|j|}iitd6td6td6d6}t|j}|jd|j|d}xn|D]f}||kri||}y|j|td||s"      "