ÿØÿà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@`sddlmZddlmZddlmZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl mZmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZmZddlmZmZddlm Z m!Z!ddl"m#Z#m$Z$ddl%Z&ddl'Z'dZ(dZ)dZ*dZ+e,dZ-dZ.dZ/dZ0de(dZ1de(dZ2dZ3dZ4dZ5dZ6dZ7d Z8e9d!Z:e,e;d"Z<e,d#Z=d$Z>d%Z?d&Z@d'ZAd(ZBd)ZCdd*ZDd+ZEd,ZFd-ZGeHd.kreGndS(/i(tprint_function(tabsolute_import(tdivisionN(tmapi(tClSelect(t ClExtSelecttdepend_modules_dict(t ClUserSelect(tClUserExtSelect(tClUserOptSelect(tclprint(tClPwd(t SysCtlConftSYSCTL_CL_CONF_FILE(t run_commandtExternalProgramFailed(t in_cagefst make_symlink(tClSelectExcepttBaseClSelectExceptions/usr/sbin/cagefsctlcC`stdtdtdtdtdtdtdtdtd td td td td tdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtd td!td"td#td$td%td&td'td(td)jttd*td+td,td-td.td/td0td1td2dS(3Ns? -v | --version : Specify alternative versions, -u | --user : UsernamesE -l | --list : List alternatives for interpretersQ -G | --list-extensions : List global set of extensions for alternatives@ -S | --summary : List summary of alternativessE -s | --user-summary : List user summary of alternativessG -C | --current : Show currently selected alternativesR -c | --user-current : Show currently selected alternative for a usersE -B | --set-current : Set alternative as global defaultsC -b | --set-user-current : Set alternative as user defaults? -Y | --enable-alternative : Enable alternative globallys@ -N | --disable-alternative : Disable alternative globallysd -E | --enable-extensions : Enable comma-separated list of extensions globally for a versionse -D | --disable-extensions : Disable comma-separated list of extensions globally for a versions_ -R | --replace-extensions : Replace extensions with comma-separated list of extensions s: for a version globallysX -e | --enable-user-extensions : Enable comma-separated list of extensions for a usersY -d | --disable-user-extensions : Disable comma-separated list of extensions for a usersc -r | --replace-user-extensions : Replace user extensions with comma-separated list of extensionss[ -t | --reset-user-extensions : Replace user extensions with version default extensionssk -g | --list-user-extensions : List enabled extensions for a user. With key --all shows all extensionss7 -a | --all : Show all extensionssf -p | --print-summary : If specified along with setting an alternative prints user summarysb -V | --show-native-version : Shows native version while showing summary or selected versionsN -L | --list-users : List users who use a specified alternativesg -T | --change-to-version : Changes to a specified version all users who have a certain versionsO -k | --add-options : Add comma-separated list options for a users] -m | --replace-options : Replace user options with comma-separated list of optionssR -x | --delete-options : Delete comma-separated list options for a usersY -Q | --base64 : Expects data as comma-separated base64-encoded stringsL -q | --quiet : Suppress errors messages for wrong inputsX -P | --print-options : Prints user options. By default prints as plain textsg --print-options-safe : Prints user options. By default prints as plain text (safe strings)sV --apply-symlinks-rules : Recreate symlinks to php extensions for all users sQ based on /etc/cl.selector/symlinks.rules filesk --exclude-pid-list : Specify list of PIDs of processes that should not be signaled by SIGHUPs6 -j | --json : Print data as JSONs5 -w | --csv : Print data as CSVs@ -W | --perl : Print data as perl structuresW --api-version : Integer, representing specific api version to use. s2 Defaults to {}se -z | --reset-options : Deletes all user custom options. Range can be narrowed with user s6 or version optionss< --update-backup : write settings to backupsh --apply-global-php-ini : use with 0, 1 or 2 arguments from the list: error_log, date.timezonesh without arguments applies all global php options including two abovesE --setup-without-cagefs : setup PHP Selector without CageFSsY --revert-to-cagefs : revert to default setup of PHP Selector (with CageFS)sV --for-all-users : applies specified action for all users in CageFS. sU Available only for enable/disable user extensions(tprinttformattAPI_0(((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytusage-sd                                                cC`sDd}|rd|df}ntjj||tjddS(s5 Prints to stderr @param message: string s%s s%s:%s s%siN(tsyststderrtwritetexit(tmessagetprefixtfmt((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytprint_error_and_exitbs cC`s&ttjdkr"tdndS(s\ Checks presence of command line arguments and exits with usage info if missing isFCommand line arguments expected. For help use '-h' or '--help' optionsN(tlenRtargvR(((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytcheck_args_presencenscC`sd}|jdd}||d}d}tjj|r{yt|djj}Wq{ttfk rwdSXn|S(s s /opt/alt/phpt.ts/name_modifiertr( treplacetostpathtisfiletopentreadlinetstriptOSErrortIOError(tversiont BASE_ALT_DIRtvertname_modifier_filet name_modifier((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytget_name_modifieryscC`s$|dkrdS|dkr dSdS(Nt-tdisabledtetenabled((tletter((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytletter_to_statuss  ttextc `s|tkrd}d}n d}d}dddgg}ig|6}x0|D](td}d jd g|d}d g} | jttfd t|td } | d krd jd g|d}| j| n|dkr'|j|t | nd| krD| d ||R$R$iR;R/tstatusR3tjsons ( RR tjointextendtlistRtrangeR4tappendttupleR:RHtdumps( tdataRt api_versiontavailable_versions_keytdefault_version_keyt text_linest json_dictt row_lengthRtrow_dataR3((RDREsH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytformat_summarys@              cC`s t|||}t|dS(s% Prints alternatives summary N(RXR(RPRRQ((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pyt print_summaryscC`sBx;|D]3}||ks)||dkrtd|qqWdS(sC Check that config has param_list and this params not None sError: %s must be specifiedN(tNoneR(tconfigt param_listtparam((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pyt check_paramss cC`s(|dkrdS|dkr dSdSdS(Nt~sbuild-int+R8R6((R9((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytext_letter_to_statuss   cC`sd}t|}|j}WdQXi}x5|D]-}|jd}|dj||d/dev/nullis&Error while executing: sysctl --systemi( R'R(R)R R tsettstrtinttsystemRRR(tenabletnew_conftconft sysctl_cfg((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytswitch_linksafes  c C`s|dkrtd}n|j|}|d}dtjd}t|d}|d|k}WdQX|r|st|d}|jd|dWdQXqn|rtjj||n|j |dS( s[ Add path to PATH variable in ~/.bashrc :param user: name of user :type user: string :param homedir: path to home directory :type homedir: string :param obj: instance of ClUserSelect class :type obj: instance of ClUserSelect class :param add: add path to .bashrc when True, remove otherwise :type obj: bool tphps/.bashrcs PATH=$HOME/s:$HOME/.cl.selector:$PATHR%s Nta( RZRt _change_uidt SELECTOR2_DIRR*Rtclcommontutilstdelete_line_from_filet _restore_uid( Rythomedirtobjtaddtcur_usertbashrcRmRjtfound((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytmodify_search_path_in_bashrc s  !c `sfd}|dkr*td}n|d}|tjd|dkrdtjdn|j|}tjjdt d|d d }xB|D]:} |d | d } |d | d} t j | | qW|j |t j |dt|j||dS(s Restore (apply) settings for PHP Selector from backup :param user: name of user :type user: string :param homedir: path to user's home directory :type homedir: string :param uid: user's uid :type uid: int :param alt_dirs: list of alt-php directories like ['php51', 'php52'] :type alt_dirs: list :param obj: instance of ClUserSelect class :type obj: ClUserSelect object c`sMtjtjjdtdttjdttjdtdS(Ns /var/cagefsis/usr/share/cagefs/etcs/usr/share/cagefs/etc.new(tshutiltrmtreeR'R(RIRtTrue((tuid(sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytcleanup4s)Rs /.cl.selectors0/usr/sbin/cagefsctl --silent --force-update-etc iis /var/cagefsitetcscl.php.ds/alt-s /alt_php.inis/alt_s.inis/.cagefsN(RZRR'RRRRR(RIRRtcopytset_version_from_backupRRR( RyRRtalt_dirsRRtbase_dest_pathRt base_src_pathtalt_dirtsrc_patht dest_path((RsH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytrestore_settings_from_backup&s"  (   cC`sZtjjdr<tjdtjdtjdntjdtjddS(Ns/usr/bin/systemctls!/usr/bin/systemctl disable cagefss/usr/bin/systemctl stop cagefss/usr/bin/systemctl mask cagefss&/sbin/service cagefs stop &> /dev/nulls/sbin/chkconfig cagefs off(R'R(R)R(((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytdisable_cagefs_serviceOs    cC`sZtjjdr<tjdtjdtjdntjdtjddS(Ns/usr/bin/systemctls /usr/bin/systemctl unmask cagefss /usr/bin/systemctl enable cagefss/usr/bin/systemctl start cagefss/sbin/chkconfig cagefs ons'/sbin/service cagefs start &> /dev/null(R'R(R)R(((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytenable_cagefs_serviceYs    c C`stjjdyddl}Wn(tk rJtdtjdnX|j}|swtdtjdn|r|d}t|nUt }|stdtdtjdnt jj t j st|ntddl}|j|}|j}x;|D]3}d |d }|d |d } t| |qWtd } t|||j|| | j|t||| tt jdt|jdt|jddS(s+ Setup PHP Selector without CageFS s/usr/share/cagefsiNsError: CageFS is not installedisalt-php not foundsVError: failed to detect cpanel account. Please specify name of an account as argument:s'selectorctl --setup-without-cagefs USERs /opt/alt/s/link/conf/alt_php.inis/.cl.selector/alt_s.iniRs/usr/sbin/lvectl destroy s% &>/dev/null; /usr/sbin/lvectl apply s &>/dev/null(RR(RMt cagefslibt ImportErrorRRt get_alt_dirsR}RzR'RwRRtRRxtgetpwnamtpw_dirRRRtpw_uidtcreate_selector_symlinksRRRR( targsRRRyRxtpwRRtalt_patht user_pathR((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytsetup_without_cagefscsD               c C`stjjtjs/tdtjdntjjdyddl }Wn(t k rytdtjdnX|j }|stdtjdnt dt x>|D]6}d |d }tjj|rtj|qqWt}|std tjdnddl}|j|}|j}td }t|||d ttjd|ttjtjtjdt|jdt|jddS(s: Revert to default PHP Selector setup with CageFS s<PHP Selector is in default mode already ("with CageFS" mode)is/usr/share/cagefsiNsError: CageFS is not installedsalt-php not foundRs /opt/alt/s/link/conf/alt_php.inisError: failed to detect userRRs0/usr/sbin/cagefsctl --silent --force-update-etc s/usr/sbin/lvectl destroy s% &>/dev/null; /usr/sbin/lvectl apply s &>/dev/null(R'R(RwRRtRRRRMRRRRRtislinktunlinkRzRxRRRRtFalseRRRR( RRRRRyRxRRR((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytrevert_to_cagefss>            cC`sztjjdyddl}ddl}Wn(tk rVtdtjdnX|jrv|j d|ndS(s Apply "global" php.ini settings to all alt-php versions :param args: list of command line parameters (names of php.ini options) :type args: list s/usr/share/cagefsiNsError: CageFS is not installeditoptions( RR(RMRtcagefsreconfigureRRRtget_alt_versionstreplace_alt_settings(RRR((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytapply_global_php_inis    cC`s{ttrwt}x1tjD]#\}}|jd||fq"Wtj|idd6|dj|d6ndS(Ns '%s' is required for '%s'tWARNRGt,R(R RRKtitemsRMR t print_diagRI(t print_formatt print_messaget modules_listt module_namet dep_module((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pyt"_check_depencies_and_print_messages   cC`s%t|j|}t|||S(N(Rtlist_extensionstparse_extensions(t interpreterR/Rtext_list((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytget_extensionsscC`sg}x|D]}d}|dtkr2d}n|dtkrKd}n|dkrq|j||dfq |ji|dd6dd 6t|d 6t|}q W|d kri|d 6|d 6}|S|S(NR_iR`R5R;iRcR$RdtstateRHR/t extensions(RRRMRaRp(RR/Rt json_listtexttactionRr((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pyRs    , cC`sd}d}y=ttdgj}|dkr7gS|jddSWnUtk r}||jkrwtdn||jkrtdnt|nXd S( s Return list of users that are in CageFS If CageFS is not installed or initialized throws exception and prints it :return: sNo such file or directorysCageFS is not initializeds--list-enabledR$s isERROR: CageFS not installed.sWError: CageFS is not initialized. Use "/usr/sbin/cagefsctl --init" to initialize CageFSN(RtCAGEFSCTL_COMMANDR,RfRRR(tnot_installed_msgtnot_initialized_msgtusersR7((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytget_cagefs_userss   c1C`si}d|d|dY|dD]7}d}|drod}ntd||d=fqPWq8xt=|d|j?|dY|dD]}t|d=qWngdv|krt2|dtj@|dYj d?} xf| D]^} t=|d|}|j5dY| d|ddtt6d|dvj d?dtqW|j<| ndy|kr t2|dtj@|dYj d?} xW| D]O} t=|d|}|j7| |dtt6d|dyj d?qW|j<| nd||krt2|dtj@x`|j| D]O} t=|d|}|j:| |dtt6d|d|j d?qSW|j<|j| nyd(|krQt2|dtj@x@|j| D]/} t=|d|}|jA| |d}qW|j<|j| td?j|nd)|krt2|dt|d|jB|d} td?j| nd|krt2|dt|d|jC|d|dnWd|krt2|dtj@xV|j| D]E} tD|d|}|jE| |d|d|dt|d qW|j<|j| |d d2kr8tFjG|d iq8nd|krYt2|dtj@xV|j| D]E} tD|d|}|jE| |d|d|dt|d qW|j<|j| |d d2kr8tFjG|d iq8nd|krt2|dtj@xS|j| D]B} tD|d|}|jH| |d|d|d|d qW|j<|j| |d d2kr8tFjG|d iq8n&d6|krd} d}dY|krL|dYj d?} n|drl|dj d?}ntD|d|}|jI| ||j<| |d d2kr8tFjG|d iq8nrd0|krt2|dtFjG|d tD|d|jJ|dY|dn!d1|krnt2|dtFjG|d tD|d|jJ|dY|ddtnd7|kr8t}x|jKjLD]} y4tjM| tjN| tDjO| WqtPjQk rqtPjRk r0} |d s1tFjS|d idd6t#| d6q1qXqWnWntTk r}tFjS|d idd6|jUd6tjdndtVtWfk rt$dnDtXk r} tYjZ| }tFjS|d idd6|d6nXdS(NRRR/sshow-alls print-summarysshow-native-versiontplaintdecodertquietR;Rs api-versions7selectorctl does not work in CageFS for PHP interpreteris6hi:lSsCcB:Y:N:E:D:R:v:Gu:b:ge:d:r:atpVLT:k:m:x:QqPjwWzthelpssetup-without-cagefssrevert-to-cagefss interpreter=RKtsummarys user-summarytcurrents user-currents set-current=senable-alternative=sdisable-alternative=senable-extensions=sdisable-extensions=sreplace-extensions=sversion=slist-extensionssuser=sset-user-current=slist-user-extensionssenable-user-extensions=sdisable-user-extensions=sreplace-user-extensions=tallsreset-user-extensionss list-usersschange-to-version=s add-options=sreplace-options=sdelete-options=tbase64sapply-symlinks-ruless print-optionssprint-options-safeRHtcsvtperls api-version=s reset-optionss update-backupsapply-global-php-inisexclude-pid-list=s for-all-userss-hs--helpis--exclude-pid-listRs--apply-symlinks-ruless--setup-without-cagefss--revert-to-cagefss--apply-global-php-inis-ls--listslist-alternativess-Ss --summarys show-summarys-ss--user-summarysshow-user-summarys-Cs --currents show-currents-cs--user-currentsshow-user-currents-as--alls-vs --versions-us--userRys s-Bs --set-currents set-currents-bs--set-user-currentsset-user-currents-Ys--enable-alternativesenable-alternatives-Ns--disable-alternativesdisable-alternatives-Gs--list-extensionss-gs--list-user-extensionss-Es--enable-extensionssenable-extensionss-Ds--disable-extensionssdisable-extensionss-Rs--replace-extensionssreplace-extensionss-es--enable-user-extensionssenable-user-extensionss-ds--disable-user-extensionssdisable-user-extensionss-rs--replace-user-extensionssreplace-user-extensionss-ts--reset-user-extensionss-ps--print-summarys-Vs--show-native-versions-Ls --list-userss-Ts--change-to-versionschange-to-versions-ks --add-optionss add-optionss-ms--replace-optionssreplace-optionss-xs--delete-optionssdelete-optionss-Qs--base64s-qs--quiets-Ps--print-optionss--print-options-safes-js--jsons-ws--csvs --api-versions-Ws--perls-zs--reset-optionss--update-backups--for-all-userss--for-all-users and --user options are mutually exclusive options and cannot be used simultaneously. Use --for-all-user OR --user instead.s=No changes were made: there are no users with cagefs enabled sWrong set of optionstERRORs%s %s %sRqRGRPtshorttfulliR(s%s %scS`s |jS(N(R,(RC((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pyRFR$cS`s |jS(N(R,(RC((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pyRF R$sModules left by dependencies:cS`s |jS(N(R,(RC((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pyRFR$s#Modules left/added by dependencies:R5R`RcS`s |jS(N(R,(RC((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pyRFKR$t check_extcS`s |jS(N(R,(RC((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pyRFWR$cS`s |jS(N(R,(RC((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pyRFaR$tescapeRs(Incomplete or incorrect set of arguments(s-hs--help(s--exclude-pid-list(s--apply-symlinks-rules(s--setup-without-cagefs(s--revert-to-cagefs(s--apply-global-php-ini(s-ls--list(s-Ss --summary(s-ss--user-summary(s-Cs --current(s-cs--user-current(s-as--all(s-vs --version(s-us--user(s-Bs --set-current(s-bs--set-user-current(s-Ys--enable-alternative(s-Ns--disable-alternative(s-Gs--list-extensions(s-gs--list-user-extensions(s-Es--enable-extensions(s-Ds--disable-extensions(s-Rs--replace-extensions(s-es--enable-user-extensions(s-ds--disable-user-extensions(s-rs--replace-user-extensions(s-ts--reset-user-extensions(s-ps--print-summary(s-Vs--show-native-version(s-Ls --list-users(s-Ts--change-to-version(s-ks --add-options(s-ms--replace-options(s-xs--delete-options(s-Qs--base64(s-qs--quiet(s-Ps--print-options(s--print-options-safe(s-js--json(s-ws--csv(s --api-version(s-Ws--perl(s-zs--reset-options(s--update-backup(s--for-all-users(RR/(RR/(RR/(RR/(RRy(RRy(R(RRy(RRy(RR/Ry(RR/Ry(RR/Ry(RR/Ry(RR/(RR/(RR/Ry(RR/Ry(RR/Ry(RRy(RRy([RZRRR"RRRRtgetoptR!t GetoptErrorRRfRMRt ValueErrorRRRRR Rtwork_without_cagefstget_uidRKR R'tgeteuidt get_namesRtcagefs_copy_etcRItNoSuchUserExceptionRRRRRtget_native_versiont TypeErrortlist_alternativesRHROt get_summaryRYt get_versiont set_versionRstenable_versiontdisable_versionR^RRtenable_extensionsRtdisable_extensionsRRtreplace_extensionstapply_symlinks_rulestclean_crui_imagesRtlist_all_extensionstlist_enabled_extensionst%check_multiphp_system_default_versiontreset_extensionst list_userstchange_to_versionR tinsert_optionsR t print_datatdelete_optionst reset_optionst get_optionsRvtkeyst_check_user_in_cagefst_backup_settingstbackup_php_optionsRt NotCageFSUsertUnableToSaveDataRRRRgtUnboundLocalErrort Exceptiont tracebackt format_exc(R[tactionstexclude_pid_listtoptsRtoRtpidtclpwdRRt user_listRyR7RDtalternatives_dictRPRRotcRRRR/terrtmsg((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pytmainsx                                           #                                                                    #"  6              )  &   &                         %     *   *                               % t__main__(It __future__RRRRRR'RRtbuiltinsRtclselectRt clextselectRRt cluserselectRtcluserextselectRtcluseroptselectR t clselectprintR R tclcommon.sysctlR R tclcommon.utilsRRRRRtclselectexceptRRt simplejsonRHRRtAPI_1RRRZRR"R4R:RXRYR^RaRpRsRzR}RRRRRRRRRRRRRRRt__name__(((sH/opt/alt/python27/lib/python2.7/site-packages/clselect/clselectctlphp.pyt sj        5  '     ) . *