g^nddlZddlZddlZddlZddlmZmZddlmZddl m Z ddl m Z ddl mZmZddlmZddlmZmZdd lmZdd lmZdd lmZmZd d lmZmZd dlm Z d dl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)d dl*m+Z+Gdde Z,GddeZ-Gdde-Z.Gdde-Z/dS)N)ABCabstractmethod)cpapi)FormattedException)Feature)is_adminis_panel_feature_supported)is_litespeed_running)print_dictionaryreplace_params)CloudlinuxLicenseLib) ClQuotaLib)is_active_reseller_limitslve)db_governor_lib ui_config_lib)parse_cloudlinux_config_opts)boolean_to_0_1boolean_to_on_offboolean_to_yes_nois_intis_positive_int is_stringis_string_or_nonetime_unit_to_letter) MysqlInfoceZdZdS)ValidateDataExceptionN)__name__ __module__ __qualname__py/clconfig/config.pyrr)sDr$rcBeZdZdZedZd dZd dZd d ZdS) ClConfingBasec"d|_i|_dS)NF)_is_json_optsselfs r%__init__zClConfingBase.__init__/s  r$cdS)zM Return list of pairs (input_dict_keys, validator_function). Nr#r+s r%_get_data_listzClConfingBase._get_data_list3s r$Fsuccessct|tr)||tjdt ||jp|dS)z Output data wrapper :param: `dict` data - data for output to stdout :param: `bool` force_json - always output json format result timestampN) isinstancedictupdatetimer r))r,data force_jsonr3s r% _print_datazClConfingBase._print_data:sT dD ! ! F KK6 DD E E Et}: ;;;;;r$rc~|jr9|dtjit|dnh t t |d|dizn-#t$r }t d|d|dYd}~nd}~wwxYwtj |dS) z Print error and exit :param message: Dictionary with keys "result" as string and optional "context" as dict r4Tr3contextError: z []N) r)r7r8r printstrgetKeyErrorsysexit)r,message error_codees r%_error_and_exitzClConfingBase._error_and_exitDs = 1 NNK5 6 6 6 Wd + + + + 1c'(+,,w{{9b/I/IIJJJJ 1 1 1///W///00000000 1 s9A<< B&B!!B&Nch|}|D]} |\}}|ddddddd}td|}||t dd |id #t $rYwxYwdS) z4 Validate config single parameters. ['r?/ data_dictNz*Value error in JSON key(s) options/%(key)skey)rFr=)r/replacerstripevalrrC) r,rOresellercontrol_data_listcontrol_data_iteminput_dict_keysvalidator_functionkey_name_for_exception input_values r%_validate_parameters_singlez)ClConfingBase._validate_parameters_singleSs !//11!2    6G3!3*9WS"%%WT2&&WS#&&VC[[ ' ##@#@#@AA %%k22:/>) $ $ - - MMOOOOO MMOOOOOr$ci} tj|jdd}n.#ttf$r|ddiYnwxYw ||n1#t$r$}|dd|iYd}~nd}~wwxYwdtjid}i}d |vr |d |d < tj |nT#tj $rB}|dxx|j d zz cc<|d  |jYd}~nd}~wwxYw|dsd |d<t|d d kr|d =t!|ddS)A Set parameters from self._opts :return: r9optionsr3/ERROR: Invalid JSON string passed in --data keyr>NrLr3r4r= uiSettings; r=r0rT)jsonloadsr* ValueErrorrCrI_validate_input_dictionaryrr8r set_ui_configUIConfigExceptionrFr7r=lenr )r,rOrHr3 ui_parameterss r%rgzClConfigWithoutLve._set_runs   ` 4:f#566yAIIH% ` ` `  (,]!^ _ _ _ _ _ ` <  + +I 6 6 6 6$ < < <  (MaMM!: ; ; ; ; ; ; ; ; <TY[[RHH 9 $ $*3L*AM, ' 0  ' 6 6 6 6. 0 0 0 8    D 0 0    9  $ $QY / / / / / / / / 0 h )(F8  vi ! !Q & &y!&&&&&s?%*(AAA// B9BB CD/-8D**D/cdtjd}i}|tj||d<dt jD|d<|d}tr-tj |vr| tj t||j dS)# Run 'get' command r0r2rocg|] \}}|| Sr#r#.0 component is_supporteds r% z/ClConfigWithoutLve._get_run..2+++1)\+ +++r$supported_cl_featuresN) r8r7r get_ui_configrget_supported_cl_featuresitemsr rLSAPIremover r))r,r3 full_configsupported_cl_features_lists r%rhzClConfigWithoutLve._get_runs&DIKK@@ =688999'y++  + - - 3 3 5 5+++&'&,,C%D"  ! ! =gm7Q&Q&Q & - -gm < < </////r$ctjdd}|dd}|dd |d d }|d d d||\}}|S)% Parse CLI arguments zcloudlinux-configz'Utility to get/set Cloudlinux UI config)prog descriptioncommandsrb)titledestrBz get UI config)helprcz set UI config--dataTz data to set)requiredr)argparseArgumentParseradd_subparsers add_parser add_argumentparse_known_args)r,argvparser subparsers set_subparserrk_s r%rezClConfigWithoutLve._parse_argss($A   **9+..  e/:::"--e/-JJ ""8d"OOO))$//a r$c0||dS)z Check data validity in data_dict. For CL OS Solo we check only single parameters. :param data_dict: Dictionary with input data :return: None, throws ValidateDataException if any error detected N)r[)r,rOs r%rwz-ClConfigWithoutLve._validate_input_dictionarys ((33333r$cvdtfdtfdtfdtfdtfdtfdtfgS)N['uiSettings']['hideRubyApp']['uiSettings']['hidePythonApp']['uiSettings']['hideNodeJsApp']#['uiSettings']['hidePHPextensions']!['uiSettings']['hideLVEUserStat']['uiSettings']['hideXrayApp']%['uiSettings']['hideAccelerateWPApp'])rr+s r%r/z!ClConfigWithoutLve._get_data_listsF-n = . ? . ? 2N C 0. A ,n = 4n E  r$N) r r!r"__doc__rlrgrhrerwr/r#r$r%r^r^lsy   "'"'"'H000&$444      r$r^c>eZdZdZdZdZdZdZd dZdZ d Z dS) ClConfigzT Perform cloudlinux-config utility for CloudLinux OS Shared and Shared Pro. ct}|sd|_|ddiSd|v|_|||_|jdr*t js|ddi|jdr|dS| dS)NTr3r`ra--for-resellerzLERROR: reseller limits are not supported, can not use --for-reseller option.rB) r rdr)rIrer*rreseller_limit_supportedrhrg)r,rirjs r%rlz ClConfig.runs&(())++ V DM''3S(TUU U D( %%d++ :& ' 0L0N0N   h"    :e   MMOOOOO MMOOOOOr$c|jdd}|8t|s)t|s|dd|id|jdrz||ddit }|sd }nd }|t|tj d d dS|jd s|ddii} tj |jd d}n'#t$r|ddiYnwxYw | ||n1#t$r$}|dd|iYd}~nd}~wwxYwdtj id}d\}}}} |Zddlm} ||| h} t#| t'|dkr|dd|dinddlm} i} ||vr ||| |<||vr ||| |< t+j| nT#t*j$rB}|dxx|jdzz cc<|d|jYd}~nd}~wwxYw||vrn | |||nO#| j$rB}|dxx|jdzz cc<|d|jYd}~nd}~wwxYw| |vrp t;j|| nT#t:j$rB}|dxx|jdzz cc<|d|jYd}~nd}~wwxYw|dsd |d<t#|ddkr|d=t|d dS)rnrNz5ERROR: reseller limits for %(reseller)s are disabled.rT)r3r=z--reset-inodes-limitr3z2ERROR: cannot reset inode limits for reseller userzERROR: quota isn't activatedr0r2Trz)ERROR: You must provide parameters to setrorp)rTr>rLrq) inodeLimitsrrfaultsNotificationmySQLGovSettingsrlve_stats2_reseller_librzError: can only configure z for resellerlve_stats2_librsr=) r*rBrrrIris_clquota_activatedreset_inodes_limitsr r8rtru ExceptionrwrrLrrz intersectionrcrrrxryrFr7r=set_notificationLveStats2Exceptionrset_db_gov_configDBGovernorException) r,rTcl_quotar3rOrH inode_limits ui_settingsfaults_notification mysql_govlve_stats2_notifadmin_only_settingsr{s r%rgzClConfig._set_runs# :>>"2D99  !! (22   Q&1""    :, - #$$R& "||H0022 /7",,... TY[[II4 P P P Fz(# Z  (,W!X Y Y Y  ` 4:h#788CII ` ` `  (,]!^ _ _ _ _ _ ` <  + +I + I I I I$ < < <  (MaMM!: ; ; ; ; ; ; ; ; <TY[[RHHG C{$7   E E E E E E#/i"H &33C NNCCDDII$$];N]]]& = < < < < < 9 $ $*3L*AM, ' ) # #)2;)?M+ & 0  ' 6 6 6 6. 0 0 0 8    D 0 0    9  $ $QY / / / / / / / / 0 ) + + 4 11)#tj$r,}d|d <i|d <t||d d <Yd}~nd}~wwxYw|d t!inCt t jr*|| |d ||d<dt%jD|d<|d}t+r-t j|vr|t jt1||jdS)r}r0r2NrrrrerrormySqlGoverrorsdbInfoT)rTdefaultsrocg|] \}}|| Sr#r#rs r%rz%ClConfig._get_run..{rr$r)r8r*rLrrr rLVEr7get_notificationrrrget_db_gov_configrrArrBrrrr rrr r))r,r3rrTrrHrs r%rhzClConfig._get_runXs?&DIKK@@  :& ' =z"23H E E E E E E E < < < < < <  )'+66 H""#3#D#D#F#FGGG   }:<< = = = 6""?#D#F#FGGGG"6 6 6 6%,z"#%x /21vvx ,,,,,, 6   )++//*;*;< = = = =)'+66 h""#3#D#Dhae#D#f#fggg'y++  + - - 3 3 5 5+++&'&,,C%D"  ! ! =gm7Q&Q&Q & - -gm < < </////s,&CD""D  Dc~t||j\}}|s"|t||S)r)rr)rIr )r,rstatusr9s r%rezClConfig._parse_argssB4D$-HH  7  !5!5 6 6 6 r$Nc\|||||dS)z Checks data validity in data_dict :param data_dict: Dictionary with input data :param str reseller: Reseller name to validate to config reseller :return: None, throws ValidateDataException if any error detected N)r[_validate_parameters_pairs)r,rOrTs r%rwz#ClConfig._validate_input_dictionarys4 ((H=== '' 22222r$cgdtfdtfdtfdtfdtfdtfdtfdtfd tfd tfd tfd tfd tfdtfdtfdtfdtfdtfdtfdtfdtfdtfdtfdtfdt fdt fdt fdt fd tfd tfd tfd tfd tfdtfdtfdtfdtfd tfd!tfd"tfd#tfd$tfdtfdtfd%t fd&t fd'tfd(tfd)tfd*t fd+t fd,t fd-t fd.t fd/tfd0tfd1t fd2t fd3tfd4t fd5tfd6t fd7tfd8t fd9tfd:t fd;tfdNz&['inodeLimits']['showUserInodesUsage']rrrrrrrz0['faultsNotification']['faultsToInclude']['cpu']z2['faultsNotification']['faultsToInclude']['nproc']z/['faultsNotification']['faultsToInclude']['io']z0['faultsNotification']['faultsToInclude']['mem']zB['faultsNotification']['faultsToInclude']['concurrentConnections']z1['faultsNotification']['faultsToInclude']['iops']3['faultsNotification']['notify']['admin']['period']7['faultsNotification']['notify']['admin']['unitOfTime']2['faultsNotification']['notify']['user']['period']6['faultsNotification']['notify']['user']['unitOfTime']z%['faultsNotification']['notifyAdmin']z@['faultsNotification']['minimumNumberOfFaultsToNotify']['admin']z?['faultsNotification']['minimumNumberOfFaultsToNotify']['user']z)['faultsNotification']['notifyCustomers']z)['faultsNotification']['notifyResellers']z1['faultsNotification']['notifyResellerCustomers']z2['faultsNotification']['email']['notifyFromEmail']z0['faultsNotification']['email']['notifySubject']z2['faultsNotification']['email']['reportAdminMail']z0['faultsNotification']['email']['notifyCharset']z6['faultsNotification']['notify']['reseller']['period']z:['faultsNotification']['notify']['reseller']['unitOfTime']z6['faultsNotification']['notify']['customer']['period']z:['faultsNotification']['notify']['customer']['unitOfTime']z3['faultsNotification']['notifyResellerOnCustomers']zC['faultsNotification']['minimumNumberOfFaultsToNotify']['reseller']zC['faultsNotification']['minimumNumberOfFaultsToNotify']['customer']z(['faultsNotification']['notifyReseller']z'['mySQLGovSettings']['modeOfOperation']z"['mySQLGovSettings']['scriptPath']z*['mySQLGovSettings']['userMaxConnections']z1['mySQLGovSettings']['logRestrictedUsersQueries']z2['mySQLGovSettings']['gatherDataForDetailedStats']z.['mySQLGovSettings']['restrictLog']['logPath']z-['mySQLGovSettings']['restrictLog']['format']z+['mySQLGovSettings']['errorLog']['logPath']z)['mySQLGovSettings']['errorLog']['level']z.['mySQLGovSettings']['slowQueries']['logPath']z+['mySQLGovSettings']['slowQueries']['kill']z.['mySQLGovSettings']['slowQueries']['timeout']z,['mySQLGovSettings']['restrictType']['mode']z-['mySQLGovSettings']['unlimit']['unitOfTime']z)['mySQLGovSettings']['unlimit']['period']E['mySQLGovSettings']['restrictedTimePeriods']['level1']['unitOfTime']A['mySQLGovSettings']['restrictedTimePeriods']['level1']['period']E['mySQLGovSettings']['restrictedTimePeriods']['level2']['unitOfTime']A['mySQLGovSettings']['restrictedTimePeriods']['level2']['period']E['mySQLGovSettings']['restrictedTimePeriods']['level3']['unitOfTime']A['mySQLGovSettings']['restrictedTimePeriods']['level3']['period']E['mySQLGovSettings']['restrictedTimePeriods']['level4']['unitOfTime']A['mySQLGovSettings']['restrictedTimePeriods']['level4']['period']F['mySQLGovSettings']['restrictedTimePeriods']['timeout']['unitOfTime']B['mySQLGovSettings']['restrictedTimePeriods']['timeout']['period'])rrrrrrrrr+s r%r/zClConfig._get_data_lists Q 6~ FQ -n = Q / ? Q / ? Q 3N CQ 1. AQ -n =Q 5n EQ @AR SQ BCT UQ ?@Q RQ @AR S!Q "RSd e#Q $ABS T%Q &CO T'Q (GH[ \)Q *B? S+Q ,FGZ [-Q .56G H/Q 0PQW X1Q 2OPV W3Q 49:K L5Q 69:K L7Q 8ABS T9Q >BCT U?Q @@AR SAQ BBCT UCQ D@AR SEQ L@AR SMQ NBCT UOQ P?@Q RQQ R@AR SSQ TRSd eUQ VABS TWQ XF WYQ ZJK^ _[Q \F W]Q ^JK^ __Q `CDU VaQ bSTZ [cQ dSTZ [eQ f89J KgQ h9:K LiQ j9:K LkQ p7 BqQ r29 =sQ t:6 BuQ vABS TwQ xBCT UyQ z>y I{Q |=i H}Q ~;I FQ @9) DAQ B>y ICQ D;v FGQ Hrsj ########333333""""""????????//////66666666******++++++44444444,,,,,,,,======                    #"""""     .   <<<<<C<<<~o o o o o o o o drqrqrqrqrq}rqrqrqrqrqr$