j_=ddlmZddlmZddlmZddlZddlZddlmZddlmZddlm Z m Z m Z m Z m Z dd lmZd Zd Zd Zd ZdZdZ ddZdS))absolute_import)print_function)divisionN)docopt) DocoptExit)SchemaAndUseOr SchemaError)CloudlinuxSelectorLibnodejspythonrubyphpc@|s;t|d|d|d|dgrtdd|tkr&t|dgrtdd|tkr4t|d |d |d grtdd |ttfvrzt|d|d|d |d|d|d|d|d|d|d|d|d|dg rtdd|tkr(|ds|drtddtz|sBt|d|d|d|d|dgrtdd|tkr&t|dgrtdd|ttfvr(|d s"|s"t stdd!dSdSdSdS)"z Do some additional checks to restrict commands not available for current user or interpreter or whatever and do this only after args parsing install-versionuninstall-versionenable-versiondisable-versionNz2This command should be run from administrator onlychange-version-multiplez)This command is supported only for NodeJSimport-applicationsmigrateuninstall-modulesz)This command is supported only for Pythoncreate read-config save-configstartrestartstopdestroyinstall-modules run-scriptz4This command is supported only for NodeJS and Pythonmake-defaults-configsetupz%This command is supported only for %s--selector-status--default-version--supported-versionsz!Specified option(s) only for root --entry-pointzThis options(s) only for PythongetzSelector is disabled)anyr NODEJSPYTHONPHP_run_from_admin) interpreterargs as_from_rootselector_statuss W/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselector/cl_selector_arg_parse.py_ensure_command_allowedr6s HC  !   !H  FHH Hf &'&""$ KLLLf "# Y !&"" $ KLLL66***s   X ] ]  ! W  Y V  Y  \400*$ VWWWct$:;tG}$ G# MNNN EC #$ W  ! ! #$ !E$ CDDDf _&""$ ABBBvv&&&tE{&?&[j[l[l&$ 6777'&&&&&&&c  tjtjdt tjjdkS#t$rYdSwxYw)z Check who is owner of the parent process. if owner is root - return True if parent process can't be found - return True :return: z/proc/rT)osstatpathjoinstrgetppidst_uidOSErrorr7r5r0r0[s_wrw||Hc"*,,.?.?@@AAHAMM ttsAA A)(A)FTcz d}d|} t||n #t$rd}|s|d|zz }d|fcYSwxYwdfd}t dt t d t t t|d }d }d } tidtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtidtd td!td"td#t dtd$td%td&tdt dttttd'td(td)td*td+td,t dt t t|| d,z d-|d.|id/t dt t d0d1 d2|d3t dt t t|| d3z d4t dt t t|| d4z d5t dt d6t dt d7t dt d8t dt d9t dt d:t dt d;t dt d d?t dt d@t dt dAt dt dBt dt dCt dt t dt t dt t dt t dt t dt t dt t dDdE tt dt dF} fdG} | n(#t $r} dt | fcYd} ~ Sd} ~ wwxYwd%s dsdHS tfvr td<d} nntfvrdI}d|fSttfvrNt#d}t|dJ} t)| | n(#t $r} dt | fcYd} ~ Sd} ~ wwxYwdKfS)La Parse arguments for cloudlinux-selector command :param argv: sys.argv :param _is_json_need: sys.argv contains --json key :param as_from_root: True if we assume that root has called this util :return cortege: (error_flag, s_message) zcloudlinux-selectoraoUtility to get/set Cloudlinux selector options Usage: {0} [get] [--json] [--interpreter ] [(--get-supported-versions | --get-default-version | --get-selector-status)] [(--user | --domain )] {0} get [--json] [--interpreter ] [--get-current-version] [--user ] [--domain ] {0} set [--json] [--interpreter ] (--selector-status | --default-version | --supported-versions | --current-version ) [--user ] [--domain ] {0} set [--json] [--interpreter ] --version (--extensions | --options ) [(--user | --domain )] {0} set [--json] [--interpreter ] [(--user | --domain )] --app-root [--app-mode ] [--new-app-root ] [--new-domain ] [--new-app-uri ] [--new-version ] [--startup-file ] [--env-vars ] [--skip-web-check] [--entry-point ] [--config-files ] [--passenger-log-file ] {0} create [--json] [--interpreter ] [(--user | --domain )] --app-root --app-uri [--version ] [--app-mode ] [--startup-file ] [--entry-point ] [--env-vars ] [--passenger-log-file ] {0} set [--json] [--interpreter ] --reset-extensions --version [(--user | --domain )] {0} (enable-version | disable-version) [--json] [--interpreter ] --version {0} install-modules [--json] [--interpreter ] [(--user | --domain )] --app-root [(--requirements-file | --modules )] [--skip-web-check] {0} uninstall-modules [--json] [--interpreter ] [(--user | --domain )] --app-root --modules {0} install-version [--json] [--interpreter ] --version {0} uninstall-version [--json] [--interpreter ] --version {0} read-config [--json] [--interpreter ] [(--user | --domain )] --app-root --config-file {0} save-config [--json] [--interpreter ] [(--user | --domain )] --app-root --config-file --content {0} (start | restart | stop | destroy) [--json] [--interpreter ] [(--user | --domain )] --app-root {0} run-script [--json] [--interpreter ] [(--user | --domain )] --app-root --script-name {0} run-script [--json] [--interpreter ] [(--user | --domain )] --app-root --script-name -- ... {0} change-version-multiple --json --interpreter --from-version --new-version {0} make-defaults-config [--json] [--interpreter ] {0} import-applications [--json] --interpreter {0} migrate [--json] --interpreter --user --app-root {0} setup [--json] --interpreter {0} (-h | --help) Options: --json Return data in JSON format. --interpreter One of php/nodejs/python, default is php --get-supported-versions Return info about supported versions --get-current-version Return current version of interpretator for user --get-default-version Return info about default version only --get-selector-status Return info about selector status --reset-extensions Replace user extensions with version default extensions --supported-versions Set supported versions of interpreter --default-version Set default version of interpreter --current-version Set alternative as user default --selector-status Set selector status enabled or disabled --version Version of interpreter --extensions JSON dict with extensions and their status --options JSON dict with options and their values --user Username to operate on --app-root Root of an application to be created --domain Domain to work in --app-uri URI path to get the application being created --config-file path to config file to be read or saved --config-files names of config files (such as requirements.txt or etc) (only for python interpreter) --content Base64-encoded config file contents to be saved --app-mode Application mode --startup-file Startup application file --env-vars Environment variable as json string --new-app-root Set new application directory --new-app-uri Set new application uri --new-domain Set new domain for application --new-version Set new nodejs version for application --from-version Old NodeJS version for group change version operations --script-name Command for an npm script to be run --skip-web-check Skip check web application after change it's properties --entry-point Use the specified entrypoint for application (only for python interpeter) --requirements-file Use the specified file for install required modules --modules Install comma-separated list of modules --passenger-log-file Set passenger log full filename -h, --help Show this help message and exit zERROR: Invalid parameter passedz F --interpreterc"|d}tkr"tt|dStkr3|}t |dkr|ddd}|St|S)zAFor the NodeJS, ignore all the version parts except the major one.rr )splitr-r=intr.lenrsplitfloat)xpartsverr1s r5_convert_versionz8parse_cloudlinux_selector_opts.._convert_versions|  & s58}}%% % & C5zzQhhsA&&q)JQxxr7Nc|dkS)NnativerArLs r5z0parse_cloudlinux_selector_opts..s Q(]r7z4Version must be Interpreter version number or native)errorcptj|}t||SN)jsonloadslistkeys)s_jsonj_dicts r5_json_string_to_dictz._json_string_to_dicts.F## V[[]] r7z%%s option should contain a valid JSONr+setrrrrrrrr#rrr r!r"rrr$rr%r&z z--z--jsonz--helpz--get-supported-versionsz--get-current-versionz--get-default-versionz--get-selector-statusz--reset-extensionsr)r(z--current-versionr'c |dvS)N)enableddisabledrArRs r5rSz0parse_cloudlinux_selector_opts..s >U9Ur7z+Selector status must be enabled or disabledz --versionz --extensionsz --options--userz --app-root--domainz --app-uriz --config-filez --content --app-mode--startup-filec|dkS)Nz package.jsonrArRs r5rSz0parse_cloudlinux_selector_opts..s a>6Ir7z)Cannot set "package.json" as startup filez --env-varsz--config-filesz--new-app-rootz --new-app-uriz --new-domainc t|SrV)boolrRs r5rSz0parse_cloudlinux_selector_opts..s ar7z4modules should be a comma-separated list of packages)z --new-versionz--from-versionz --script-namer*z--requirements-filez --modulesz--skip-web-checkz--passenger-log-filec $ttfvrdSrut|d|d|d|d|d|d|d|d |d |d f r |d s|d stdddtkr drdstdddr!dtkrtdddr!dtkrtdddSdS)z Check args for existing of mandatory arguments :param _args: parsed arguments from command line :return: True if checking passed, False - not passed Nrrrr#rr!r rr"r$rbrczFDomain or user argument is mandatory while calling selector under rootrCr*rezM--entry-point option is requires --startup-file option for interpreter pythonrdz9--app-mode option is requires only for interpreter nodejsz<--entry-point option is requires only for interpreter python)r-r.r,r )_argsr2r3r1s r5_check_users_part_cliz=parse_cloudlinux_selector_opts.._check_users_part_clis_ vv. . . F  nChm$m$'()*f i gi l# !   n(O n(-Z'8 nd$lmm m  F * *tO/D *TRbMc *d$stt t   a$"76"A"Ad$_`` `   dT/%:f%D%Dd$bcc c d d%D%Dr7)Fz4use --json option, other modes currently unsupportedz?ruby interpreter currently unsupported. Use selectorctl insteadrT)formatrrr+r r r=r rrhrYr/r.RUBYr-validater rget_selector_statusvaluesr6)argv _is_json_needr3 prog_name docstrings_error_stringrO_version_validatorr] s_json_errorsrker4msglibr2r1s ` @@r5parse_cloudlinux_selector_optsr|hsz&I@@ F9AB%i&& %%%: 1 fy0 0Nn$$$$ % ((?++K     D#c+B+B"C"CScRbNcNcEdEdTVVV;LB tB tB tB 4 B $ B t B $B 4B tB 4B TB B 4B B 4B 4!B" T#BB$ d%B& "4'B( )B* +B, D$-B. d/B0 $1B2 $3B4 D#vtV<<5B6 #D7B8 9B: ;B< =B> d?B@ 4S#6J2K2K)L)L)58N)N!P!P!PABD /EBF /GBBBH Rc#/U/U&V&V&SUUUIBL 'MBN 4S#.B*C*C!D!D!-!>@@@OBR Rc#s+?'@'@AA!- !;===SBV "T3--WBX bsmmYBZ BtSMM[B\ Rc]]]B^ D#_B` Rc]]aBb bsmmcBd "T3s,I,I#J#J#NPPPeBh bsmmiBj "T3--kBl "T3--mBn D#oBp 4 qBBrD#T3--D#D#!$}}c#'8'899TVVV "4 CBBBB B AHddddddd:zz$ c!ff} >M$'<"=MLLkcW44 #_   Ocz ( ( (#D$9::s6688??AABB1E T<QQQd#### c!ff} :sK-A  A R11 S;S SS3V V6V1+V61V6)FT) __future__rrrrWr9rrschemarr r r r selectorlibrr-r.rmr/r6r0r|rAr7r5rs'&&&&&%%%%%% 44444444444444......    =8=8=8@   8=04ddddddr7