ÿØÿà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@`sddlmZddlmZddlmZddlZddlZddlZddlmZddlm Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlmZmZddlmZdd lmZdd lmZmZdd lmZmZmZmZmZmZm Z dd l!m"Z"m#Z#dd l$m%Z%m&Z&ddl'm(Z(m)Z)ddl*m+Z+ddlm,Z,m-Z-m.Z.ddlm/Z/m0Z0m1Z1m2Z2ddlm3Z3m4Z4e j5e6Z7e7j8e j9e j:e;ddZ<e7j=e<dZ>dZ?dZ@dZAdZBdZCdZDdZEdZFdZGd ZHd!ZId"ZJd#ZKd$ZLd%ZMd&ZNd'ZOd(ZPd)ZQd*ZRd+ZSd,ZTd-ZUeVddeEdd.ZXd/ZYddd0ZZd1Z[eEd2Z\d3Z]dd4Z^d5Z_d6Z`dd7Zad8Zbd9Zcd:Zdd;Zed<ZfdS(=i(tabsolute_import(tprint_function(tdivisionN(tdatetime(t iteritems(t clcaptaintutils(t userdomains(t*get_file_system_in_which_file_is_stored_on(tget_file_linestwrite_file_lines(t QuotaWrappertNoSuchUserExceptiontInsufficientPrivilegesExceptiontIncorrectLimitFormatExceptiontGeneralExceptiontNoSuchPackageExceptiontQuotaDisabledException(tPyLvet PyLveError(t set_user_permt set_root_perm(tDicttUnioni(tClSelectExcept(tfile_readlinest file_writet s_partition(t get_abs_reltmkdir_pt file_readtfile_writelines(tget_using_realpath_keystrealpaths_are_equals /dev/nulltws9# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGINs7# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION ENDs config.rusapp = proc do |env| message = "It works!\n" version = "Ruby %s\n" % RUBY_VERSION response = [message, version].join("\n") [200, {"Content-Type" => "text/plain"}, [response]] end run app stmp/restart.txtspassenger_wsgi.pysMimport os import sys sys.path.insert(0, os.path.dirname(__file__)) def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) message = 'It works!\n' version = 'Python %s\n' % sys.version.split()[0] response = '\n'.join([message, version]) return [response.encode()] sapp.jssCvar http = require('http'); var server = http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); var message = 'It works!\n', version = 'NodeJS ' + process.versions.node + '\n', response = [message, version].join('\n'); res.end(response); }); server.listen(); cC`s,tj|}t|j|jdtdS(Ntexit(tpwdtgetpwnamRtpw_uidtpw_gidtFalse(tusertuserpwd((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pytdrop_root_perm]scC`sIy0t||}tj|jtj|SWntk rDdSXdS(N(topentfcntltflocktfilenotLOCK_EXtIOErrortNone(t config_pathtmodet conf_file((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pytget_config_lockbs  cC`sy|jWnnXdS(N(tclose(t lock_file((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyt release_lockkscC`st}tjdks*tjdkr=t|t}nd}zyLt|t|d}t j }|j |t j ||j WnDt ttjtjfk r}tjtjdj||nXWdt||rtdtnXdS(sS Write config with locking. Drop permissions if method called as root. itrsCan't write {}: {}NR#(R(tostgetegidtgeteuidR+tTrueR2tcheck_and_createdirR6tStringIOtwriteRtgetvalueR1tOSErrorRtUnableToSaveDataRtExternalProgramFailedtsyslogt LOG_WARNINGtformatR9R(R)R3tconfigtpermissions_droppedt config_filet file_contentte((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyt write_configrs$$     !  cC`sstjj|}tjj|soytj|Wqottjt jfk rk}tj ||qoXndS(N( R;tpathtdirnametisdirRtmkdirRCRRERRD(ROtuser_backup_pathRM((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyR?s cC`s(tj|}tjj|jddS(Ns .cl.selectorthtaccess_cache(R$R%R;ROtjointpw_dir(R)R*((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pytget_htaccess_cache_pathscC`sd}d}i}tjj|ry9tj|}|j|d<|j|d<|j|d}|j||d <|j| d |j||d We cannot get lve limits for user with uid "%s". Exception: %sR`( tdictRt initializetlve_infotls_cput ls_cpu_weightt ls_memory_phyt ls_memorytls_iotls_iopst ls_enterstls_nprocR(tuser_uidtresulttpy_lvet user_limitsRv((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyt_get_user_lve_limitss"        c C`st}t|}y&t}|j||}|}Wn?tttttt t t fk r|}d||f|d(R)R3RvRst debug_infoR((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyt*_log_debug_info_about_user_and_config_files"      cC`stj}t|}t|d}|dk rzy|j|Wnwttfk rr}t|||nOtj tj fk rt |t j t j dj|tj}nXWdt|Xn||fS(NR:sConfig {} is broken.(t ConfigParsertRawConfigParserRWR6R2RnR1RCRt ParsingErrortMissingSectionHeaderErrort_unlinkRFRGRHR9(R)RIR3RKRv((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyt read_config!s      cC`sct|\}}|j|r_y#|j|djd}|SWq_tjk r[dSXndS(Nt htaccess_listt,(Rt has_sectiontgettsplitRt NoOptionErrorR2(R)tdoc_rootRIt_R((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pytget_htaccess_cache8scC`s|jd}ttt|}t|\}}|j|sU|j|n|j|ddj|t |||dS(Ns RR( RtlisttfiltertboolRRt add_sectiontsetRURN(R)RtdataRIR3((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pytwrite_htaccess_cacheCscC`st|\}}|j|r?|j|djd}n&|j||j|ddg}||kr|j|ttt |}|j|ddj |t |||ndS(NRRt( RRRRRRtappendRRRRURN(R)RpRRIR3R((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pytupdate_htaccess_cacheOs   cC`st|}g}t}xW|D]O}|jtr=t}n|jtrXt}qn|s|j|qqWt|}t||ddS(s Removes clpassenger lines from .htaccess to stop application :param htaccess_filename: Application .htaccess path :return: None R"N( R R(t startswithtHTACCESS_BEGINR>t HTACCESS_ENDRtrm_double_empty_linesR (thtaccess_filenametlinest new_linest in_configtline((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyt$remove_passenger_lines_from_htaccess^s    c C`sct||\} } tjj| rLtjj|  rLtjdn|dkrntjd|nt|} yt ||| } Wn3t k r|dkrtj d|qn@X|dkr| d}tjd |n|s| d }n|d kr&tjj |}nt|tjj||\}} tjj|d }t}tjj|r;t|}t|kr,x| jD]}tjj |d tj}tjjtjj||tjgd kr|d}|| krtjd|q%t}qqWn|j}ng}|r@|jd |jt|jd| |jd||jd|j|f|dkr|jd|jd|n| r|dkr|jd| n|jtt|}t|t|d|Dt|||n|r_t|||d|ndS(sX Configure passenger application :param user: name of unix user :param directory: name of dir in user home :param alias: alias of application :param interpreter: interpreter which execute application :param binary: binary of interpreter that execute application :param populate: True if application have to be be populated :param action: action with apllication. can be transit or None :param doc_root: doc_root :param startup_file: start application file :param passenger_log_file: Passenger log filename to write to app's .htaccess :return: None s,Destination exists and it is not a directorytpythontrubytnodejssUnsupported interpreter ('%s')s8No such application (or application not configured) "%s"ttransitt directorys(Specified directory already used by '%s'tdocrootRs .htaccesstaliasshSpecified alias is already used by the other application: '%s'. Please, specify another application url.sPassengerAppRoot "%s"sPassengerBaseURI "/%s"sPassenger%s "%s"sPassengerAppType nodesPassengerStartupFile %ssPassengerAppLogFile "%s"cs`s|]}d|VqdS(s%s N((t.0R((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pys st startup_fileN(RRR(RR( RR;RORcRQRt WebAppErrortInterpreterErrortsummaryR RR2tNoSuchApplicationtnormpathRUR>RRtvaluestsepRPt commonprefixR(t splitlinesRttitleRRRRRt populate_app(R)RRt interpretertbinarytpopulatetactionRRtpassenger_log_filetabs_dirRt user_summaryt app_summaryt exists_dirt abs_aliasthtaccessthtaccess_needs_updatet htaccess_rawtitemt item_aliasR((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyt configureusp%         $  1          c C`s xtt|D]\}}|\}}tjj|d|df}t|d|\}}}tjj|d}tjj|d}t||\}}} tjjt || d|} |d} t | t ||||d| d|dqWdS(NRRiRRRR( Rt_summaryR;RORRRPtbasenameRURt _unconfigureR( R)t domain_aliasRRRtold_homeRt binary_dirt binary_namet_binaryRt htaccess_path((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyt fix_homedirs  "  c C`st||t|}|p%|d}|p1|}tjj||}tjj|d}tjj||} tjj| d} t||| st|t|} t|dj t | | dt || |ndS(NRs .htaccessR"ta( R RR;RORUR!RRR,R7RR( R)Rt old_aliast new_aliast old_doc_roott new_doc_roottapp_datat old_abs_aliast old_htaccesst new_abs_aliast new_htaccessR((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pytmoves   cC`s(x!t|D]}t||q WdS(N(Rt unconfigure(R)R((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pytpurgescC`s<t||\}}tjj|d}tjj|d}t|t|tjj|t}tjj|t} tjj||} tjj|} tjj| } tjj| } | rt|t k}n| rt| t k}n| rt| t k}n|dkra| s;t | t n| r+|r+t |t | q+n|dkr| st |t dn| r+|r+t | t | q+n|dkr+| stjj| }tjj|stj|dnt | t n| r+|r+t |t | q+nt||dS( s Populate application :param user: name of unix user :param directory: application path in user's home :param interpreter: interpreter which run application :param startup_file: main application file :return: None tpublicttmpRRR"RiN(RR;RORURt RACK_PATHt WSGI_PATHtisfileRt RACK_TEMPLATEt WSGI_TEMPLATEtAPPJS_TEMPLATERRRPRQtmakedirstrestart(R)RRRRtrel_dirt app_publictapp_tmpt app_configrutapp_wsgitapp_jstconfigru_installedtwsgi_installedtappjs_installedtconfigru_unchangedtwsgi_unchangedtappjs_unchangedtdir_path((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyRsN            cC`s)ytj|Wntk r$nXdS(N(R;tunlinkRC(RO((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyR2s c C`s$|dkrt|n|}g}x|D]\}}|dkrIq+nt||}|stjd|ddgdtjdtj}|j\}} t|||t||}n|dkrq+nx?|D]7} | rtj j | } |j || |fqqWq+Wt ||S(Ns /bin/finds-names .htaccesststdouttstderr( R2RRt subprocesstPopentPIPEt communicateRR;RORPRt_htaccess_summary( R)tuserdomains_datatdomain_docroot_pairstdomain_alias_docroottdomainRRTtpt stdoutdataRtht_pathR((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyR9s$ -  !cC`si}x|D]\}}}tjj|d}yt|}Wnttfk r]q nXtjd|tj}|sq ntjd|tj} | sq nt ||\} } t ||\} } t | | \} } }|j tj }||f} tjd|tj}|rDt |jd| rDq ni|d6|d6|d6|jd d 6| jd jd 6| jd d 6|| .+?)"?$sD^Passenger(?PPython|Ruby|Nodejs)\s+"?(?P.+?)"?$s(^PassengerBaseURI\s+"?(?P.+?)"?$tappuriRR RRRR(R;RORURR1RCtretsearcht MULTILINERRtlstripRtcompare_aliasest groupdicttlower(R)RtsummR RRRRtapprootRt alias_absRt doc_root_absRR$((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyRVsD   cC`s4tjj|jdtjj|jdkS(Nt/(R;RORtstrip(talias1talias2((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyR)sc C`si}xtt|d|D]\}}|\}}|d}yt||\}} WnEtjk rtjtjdjtj j |d|qnX||dsR"( RRR(RR>RRRR(RRRRRR((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyRs       cc`s;x4|jtjD] }tjj||}|VqWdS(N(RR;RRORU(troottsubR!((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyt iter_pathscC`st||\}}tjj|sDtjdi|d6ntjj|d}tjj|s{tj|ntjj|t}tjj|rtj |dnt |dj dS(NsMissing directory %(abs_dir)sRRR( RR;RORcRtMissingApprootDirectoryRURRt RESTART_PATHtutimeR2R,R7(R)RRRttmp_dirt app_restart((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyRscC`scg}t}xB|D]:}|jr.t}n|r:qnt}|j|qW|r_|d S|S(Ni(R>R1R(R(Rt_linest empty_lineR((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyRs   (gt __future__RRRR-R$RFRt future.utilsRRR@tloggingR;R%RtclcommonRRtclcommon.cpapiRtclcommon.utilsRR R tclquotaR R R RRRRtlveapiRRtsecureioRRttypingRRtclselectexceptRRRRRRRRR R!t getLoggert__name__RtsetLeveltERRORt StreamHandlerR,t null_handlert addHandlerRRRRR=RRt APPJS_PATHRR+R6R9RNR?RWRwRRRRRRRRR>R2RRRRRRRRR)RRRR;RR(((sE/opt/alt/python27/lib/python2.7/site-packages/clselect/clpassenger.pyts         4"        -      [   7   -  !