ÿØÿà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@`sTddlmZddlmZddlmZddlZddlZddlZddlZddlj Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lm Z m!Z!m"Z"ddl#m$Z$m%Z%ddl&m'Z'm(Z(ddl)m*Z*ddl+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2ddl3m4Z4ddl5m6Z6m7Z7m8Z8ddl5m9Z9ddl:m;Z;m<Z<m=Z=ddl>m=Z?dZ@dZAdeBfdYZCdS(i(tprint_function(tabsolute_import(tdivisionN(tAnyStr(t iteritems(tClPwd(tFormattedException(t MailHelper(tis_ascii_string(tCloudlinuxLicenseLib(t clselectctl(t get_abs_reltmkdir_ptrun_process_in_cagefs(tBaseSelectorErrortAcquireApplicationLockError(tprint_dictionarytreplace_params(t CONFIG_DIR(t PkgManager(tis_clpassenger_active(t defaultdict(tMIMEText(tmkstempi(tNODEJStPYTHONtPHP(tparse_cloudlinux_selector_opts(tCloudlinuxSelectorLibtOK_REStClSelectExcept(Rs.lockcC`s t||S(N(topen(t file_nametmode((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyt_open;stCloudlinuxSelectorcB`seZdZdZedZdZdZedZ dZ dZ dZ d Z d Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZddZedZeddZedZ edZ!dZ"e#j$d Z%d!Z&d"Z'd#Z(d$Z)d%Z*d&Z+d'Z,d(Z-d)Z.d*Z/d+Z0ed,Z1RS(-cC`spt|_i|_d|_tjdk|_d|_t|_ d|_ d|_ tj j td|_dS(Nis --backgroundtscloudlinux-selector_bkg.pid(tFalset_is_jsont_optstNonet _selector_libtostgeteuidt _is_root_usert_lockt_is_bkg_option_presentt _bkg_optiont_nj_ver_move_fromtpathtjoinRt_pid_file_name(tself((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyt__init__As       cC`s|jdttgkrtSt|jd|jdgrAtSt|jd|jd|jd|jd|jd|jd |jd |jd |jd |jd |jd|jd|jd|jd|jdgrtStS(sx Check if cloudlinux-selector called with application operations :return: True if lock is need s --interpreterschange-version-multipletcreatetstarttrestarttdestroytmigratetstopsinstall-modulessuninstall-moduless run-scripts --app-modes --env-varss--new-app-roots --new-domains --new-app-uris --new-versions--startup-file(R'RRR%tanytTrue(R4((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pytis_app_lock_neededMs,               c C`s|jsdS|jd|jd}}|jjj||d| d| \}}tjj|smdStjj|t }y9t |d|_ t j |j jt jt jBWnLtk r }|jtjkrd}t|d|nt|nXdS( s[ Acquire lock for application if this lock is needed :return: None Ns--users --app-roott chk_app_roottchk_envsa+s6Disk quota exceeded. Please, free space and try again.treason(R>R'R)t apps_managertget_app_foldersR*R1texistsR2tLOCKRR-tfcntltflocktfilenotLOCK_EXtLOCK_NBtIOErrorterrnotEDQUOTR( R4tignore_missing_app_roottusernametapp_roott_tapp_venvt lock_fileteRA((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pytacquire_app_lock_if_neededks"  'cC`s'|jr#|jdr#|jndS(Ns --new-version(R,R'tsend_notification(R4((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pytsend_notification_if_neededscC`sd}t||jd}d}d|jd|d<||d| } n| } |jtd| d(| nXWd|jrryt?j|j@WqrqrXnXd)S(*s$ Run command action s--jsonsCloudlinux license isn't validtresults --interpreters--usert returncodetoutputNtsudos-utenvRNR9s--passenger-log-filetOKtsetR:simport-applicationsR6R7R8R;s read-configs save-configsinstall-modulessuninstall-modulessinstall-versionsuninstall-versionsenable-versionsdisable-versions run-scripts --app-roots --script-names schange-version-multiplesmake-defaults-configtsuccesstcontexts tdetailsi(AR&R/R.tremoveR tget_license_statusR=t_error_and_exitt _parse_argsR'RR)tshould_be_runned_as_usert_lock_interpreter_if_neededR tCLOUDLINUX_SELECTOR_UTILITYt_print_raw_dataRWtshould_run_user_without_cagefst subprocesstPopent communicateRttselector_is_readytselector_error_reasonRUt!_passenger_log_filename_validatortdicttrun_settrun_migrate_applicationtrun_import_applicationst run_createt run_destroyt run_startt run_restarttrun_stoptrun_read_configtrun_save_configtrun_install_modulestrun_uninstall_modulestrun_manage_versiontrun_disable_or_enable_versiont _print_datat run_scriptt_start_change_all_apps_versionstreplace_mysqlitrun_getRtmessageR{tClSelectExcept_oldtConfigNotFoundt WrongDatatNoSuchAlternativeVersiontstrt Exceptiont tracebackt format_exctformat_exception_onlyttypet isinstancetlistR2R*R3(R4targvtlicenceRsRtt user_run_cmdtprocessRt log_filenameRTterrRht list_err_msgterr_msg((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pytruns                                               %  cC`sS|jddk r6|j|jj|jdn|jddk rl|j|jj|jdn|jdr|j|jj|jdn|jddk r|j|jj|jdn}|jddk r|j|jj|jdnG|jddk r[|jddk r[|j|jj |jd|jdn|jddk r|jddk r|j|jj |jd|jdn|j s|j rO|j |jd |jd |jd |jd |jd |jd|jd|jd|jd|jd|jd|jd|jd ndS(Ns--default-versions--current-versions--reset-extensionss --versions--selector-statuss--supported-versionss --extensionss --optionss--users --app-roots --app-modes --env-varss--new-app-roots --new-domains --new-app-uris --new-versions--startup-files--skip-web-checks --entry-points--config-filess--passenger-log-file(R'R(RR)tset_default_versiontset_current_versiontreset_extensionstset_selector_statustset_supported_versionstset_extensionst set_optionst _is_nodejst _is_pythont run_change(R4((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyRs*## ###&-&- c C`s|dkr#|jidd6n|dk r|jj|||}|}|djdkr|j|tjdqn|dk s|dk r|jj||||}|djdkr|j|tjdqnt ||| | | dk | dk fr| dk rSg| j dD]}|dkr2|^q2} n|jj ||||| | | | }|djdkr|j|tjdqn|dk r |jj |||| }|djdkr |j|tjdq n|jidS( s Call selectorctl to change application parameter :param config_files: names of config files (such as requirements.txt or etc) (only for python) :param entry_point: the specified entrypoint for application (only for python) :param user: application owner :param app_root: application main directory (application name) :param app_mode: application mode :param env_vars: dict with environment variables :param new_app_root: new application main directory (new application name) :param new_domain: new application domain :param new_app_uri: new application uri :param new_version: new version for nodejs interpreter :param startup_file: new startup file for application :param skip_web_check: skip check web application after change it's properties :param passenger_log_file: Passenger log filename :return: None sERROR: User is not specifiedRststatusRxiRmR$N( R(RR)trelocatetupperRtsystexitttransitR<Rot set_variablestchange_version(R4tuserRPtapp_modetenv_varst new_app_roott new_domaint new_app_urit new_versiont startup_filetskip_web_checkt entry_pointt config_filestpassenger_log_filetrtitem((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyR4s:      1   cC`s|j|jjdS(N(RR)R(R4((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyRmscC`s.|j|jj|jd|jddS(Ns--users --app-root(RR)RR'(R4((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyRpscC`s|jdr&|j|jjnh|jdrL|j|jjnB|jdrr|j|jjn|jdtkr|j|jjnitd6}|jdt kr%|j |jj |jd|j \}}|dk r[|dk r[||d<||d|jdr;|jjj|}n|jjj|}Wntk rr}t|}nX|dkr|jt n|j i|d6dS(Ns --versionsinstall-versionRs( RR'R)tselector_managertinstall_versiontuninstall_versionRR(RRR(R4tverRRT((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyRs  c C`st||jd|j\}}|s=|jt|n|ddkr|dryt}|j|dWqtjk rtidd6i|dd6d6qXn|St j j d  r|d s|d r|jid d 6dd6nt j |d|d\|d<}xddgD]}|j|sIq.nt|d||\}}ytj|Wn,tk r}|jtd |jnX|||s   ( cC`st|dS(s Print raw data. Function should be used in case if you want to print a json string as an output from other utilities N(R(R((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyRPs RzcC`st|tr|j}d|krGt|dtrG|d}n|jd||djdkrd|d<|jdtkr|jjrd|d/dev/nul &Ni( RR.R)RR/R*tsystemRRt_get_all_apps_by_versiont_write_pid_filet_move_apps_by_list(R4RRtcommandtusers_apps_listR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyRs   c C`sxt|D]\}}xx|D]p}|jjdddtd|d|d|g }tj|}|j|d8}|j|tj dq Wq Wd S( s Move applications from list from one NodeJS version to another :type dict :param apps_dict: Application list. List example: {'cltest1': [u'modjsapp_root'], 'cltest2': [u'app2', u'main_app']} :param to_version: Move applications to this version :param total_apps_count: Total applications count for move :return: None Rys--jsons --interpreters--users --app-roots --new-versioniiN( RR)RRRRRt_change_pid_fileRtsleep( R4t apps_dictRRt user_namet user_app_listRPtcmdR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyRs     c C`stt}|jjj}d}xt|D]\}}ys|jjj|j|j|j }xHt|D]:\}} | d|krq||j ||d7}qqqqWWq1t t t tfk rq1q1Xq1W||fS(sB Retrives list of all NodeJS applications for all users, which uses supplied version of NodeJS :param from_version: Required NodeJS version :return: Cortege: (application_list, application_count). Example: ({'cltest1': [u'modjsapp_root'], 'cltest2': [u'app2', u'main_app']}, 3) itnodejs_versioni(RRR)RBtget_users_dictRtread_user_selector_config_jsontpw_dirtpw_uidtpw_gidtappendRt TypeErrorRdtAttributeError( R4Rtusers_apps_dictt user_infoRR$t user_pw_entryt user_app_dataRPtapp_info((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyRs     cC`s>y0tjt|jd}|d|_tSWnnXtS(s] Determine is background process already working :return: True|False RR(tjsontloadR"R3R0R=R%(R4R((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyR s cC`sd|jdtkrtS|jj|}|jj|}|j}|r`||jkr`tStS(s Checks if NodeJS version blocked by background operation :param nj_version: NodeJS version to check :return: True - version is locked, False - not locked s --interpreter( R'RR%R)tresolve_versionRRR0R=(R4t nj_versiontis_bkg_process_present((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyRs cC`s{tjitjd6t|d6t|d6|d6|d6ttjd6t|jdtj |jdd S( s Creates pid file for background process move version from version to version :param from_version: Move from NJ version :param to_version: Move to NJ version :param total_apps_count: Total application count to move :return: None tpidRRRRRtwiN( R5tdumpR*tgetpidRtfloatRR"R3tchmod(R4RRR((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyR(s    cC`s/t|jd}tj|}|j|S(sc Reads pid file and returns it's content as dictionary :return: Dictionary R(R"R3R5R6tclose(R4tftpid_data((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyt_read_pid_file;s cC`syn|j}||dR%RURWRVt staticmethodRrRRRRRRRRRRRRRRRRRRRRRtpropertyRRRt contextlibtcontextmanagerRRRRRRRRRRCR!RR(((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyR#?sV     y  9    #         ;           (Dt __future__RRRRFRRRLtclcommon.cpapiR`RTR5R*RRttypingRt future.utilsRtclcommonRtclcommon.clexceptionRtclcommon.mail_helperRtclcommon.clfuncRt cllicenseR tclselectR tclselect.utilsR R R tclselect.baseclselectRRt cli_utilsRRtclselect.clselectnodejsRt"clselect.clselectnodejs.pkgmanagerRt clselector.clpassenger_detectlibRt collectionsRtemail.mime.textRttempfileRtcl_selector_arg_parseRRRRt selectorlibRRRtclselect.clselectexceptRRER"tobjectR#(((sG/opt/alt/python27/lib/python2.7/site-packages/clselector/cl_selector.pyt sH