dbfdg 3 wh-@s@ddlZddlZddlmZddlmZddlmZddlmZddlmZddlm Z d Z d d d d dgZ e Z ddZdddedddeedeeeeeeeddeeeeeddejddddejdejddddeeeeejddejeddedded,ZddZddZGd d!d!eZd"d#Zd$d%Zd&d'ZdS)(N) constants) log_utils)utils)config) http_utils) ConfigParserz/etc/sysconfig/kcare/kcare.confUSE_CONTENT_FILE_V3FORCE_JSON_SIG_V3ENABLE_CRASHREPORTER KCORE_OUTPUT KMSG_OUTPUTcCs |jdkS)N1TRUEYESY)rrrr)upper)valuer5/usr/libexec/kcare/python/kcarectl/config_handlers.pybool_converter srcCs|jS)N)strip)vrrr&srcCs|jS)N)r)rrrrr*scCs |jdS)N/)rstrip)rrrrr5scCs|pdS)Nr)rrrrr;scCs |jdS)Nr)r)rrrrr=scCs |jdS)Nr)r)rrrrr>scCs |jdS)Nr)r)rrrrrBscCs |jdS)Nr)r)rrrrrCscCsdd|jdDS)NcSsg|]}|jjqSr)rlower).0ptchrrr Msz..,)split)rrrrrMs),AFTER_UPDATE_COMMANDAUTO_STICKY_PATCHSET AUTO_UPDATEAUTO_UPDATE_DELAYBEFORE_UPDATE_COMMANDCHECK_SSL_CERTSr FORCE_GID FORCE_IPV4 FORCE_IPV6r HTTP_TIMEOUTIGNORE_UNKNOWN_KERNELr KCORE_OUTPUT_SIZE KDUMPS_DIRr LIBCARE_DISABLED!LIBCARE_PIDLOGS_MAX_TOTAL_SIZE_MBLIBCARE_SOCKET_TIMEOUTLIB_AUTO_UPDATE PATCH_LEVEL PATCH_METHOD PATCH_SERVERPATCH_SERVER_IPV6 PATCH_TYPEPREFIXPREV_PATCH_TYPEREGISTRATION_URLREGISTRATION_URL_IPV6 PRINT_LEVEL REPORT_FQDNSILENCE_ERRORSSTATUS_CHANGE_GAP STICKY_PATCHSTICKY_PATCHSET UPDATE_DELAY UPDATE_POLICYUPDATE_SYSCTL_CONFIGUSERSPACE_PATCHESr KERNEL_VERSION_FILEKCARE_UNAME_FILESUCCESS_TIMEOUTc Kstt}|j}|jx|jD]\}}d}|d}|d}x^tt|D]N}||j|sl||j|rL|dkr|||=n|dt|d||<d}PqLW|s"|j |dt|dq"Wt j tdj |dS)NF= z =  T) openCONFIG readlinescloseitemsrangelen startswithstrappendr atomic_writejoin) kwargsZcflinesZproprupdatedZprop_eqZprop_spirrr update_configUs"r]c Csi}tjd}xD|D]<}|j|}|r<|j\}}|sHd}n td||||<qWt|tt}|r~tddjt|x`|j D]T\}}t|} |dks| dkrqy | |Wqt k rtd||fYqXqWt f|dS)Nz^([^=]+)=([^=]*)$z8Invalid parameter format: %s. Format should be KEY=VALUEzUnknown parameter: %sz, zBad value for %s: %s) recompilematchgroups SystemExitsetPOSSIBLE_CONFIG_OPTIONSrXsortedrQ Exceptionr]) paramsZparams_for_updatepatternparamr`keyrZunknown_paramsvar_nameconvertrrrupdate_config_from_argsjs,       rmc@s$eZdZddZddZddZdS) FakeSecHeadcCs||_d|_dS)Nz [asection] )fpsechead)selfrorrr__init__szFakeSecHead.__init__c Cs&|jrz|jSd|_Xn |jjSdS)N)rproreadline)rqrrrrss  zFakeSecHead.readlineccs.|jr|jVd|_x|jD] }|VqWdS)N)rpro)rqlinerrr__iter__s  zFakeSecHead.__iter__N)__name__ __module__ __qualname__rrrsrurrrrrns rnc stjitddddy,ttt}tjr<j|n j |Wnt k r\iSXd fdd }x4dD],\}}t j |stj d |}|rt|tj|<qtWx tjD]\}}|||d qWS)NrL) HTTP_PROXY HTTPS_PROXY)defaultsc sTyjd|}Wntk r(|}YnX|dk rP|r>||}||<tj|dS)Nasection)getrfCONFIG_OPTIONSadd)namedefaultrlr)cpresultrrread_vars z%get_config_settings..read_varhttpryhttpsrzr|)rl)NNrryrrz)rr)r~clearrrnrMrNrPY2readfp read_filerfrget_proxy_from_envr}osenvironrdrQ)rrschemevariableproxyrkrlr)rrrget_config_settingss&     rcCsPi}xF|jD]:\}}|j}|jdr|jddjddj}|||<qW|S)ao Checking headers for feature flags which start with 'KC-Flag-' and reformat it to dictionary with keys in upper case and without 'KC-Flag-' prefix and dashes replaced with underscores. For unification all header keys are checking in upper case. For example: 'KC-Flag-Some-Value' -> 'SOME_VALUE' :return: dict {'SOME_VALUE': 'value', ...} zKC-FLAG-rL-_)rQrrTreplace)headersflagsrjrZ key_upperZ formatted_keyrrr%get_config_options_from_feature_flagss   rc Cst|}xz|jD]n\}}|tkr$q|dk r|tkry&tt|tj|<tj j d||Wqt k r~tj j d||YqXqWdS)z Set global variables using feature flag from patchserver headers. Checks that option is allowed by whitelist and update global variable using globals() :param headers: Response headers from patchserver :return: None Nz'patchserver config override: %s with %szGInvalid value during attempt to override config from patchserver %s: %s) rrQFEATURE_FLAGS_WHITELISTr~boolintr__dict__rkcareloginfo ValueErrorerror)rZoptions_from_psrjrrrrset_config_from_patchserversr)rr^rLrrrrrpy23rrNrrcr~rrrUrrrdr]rmobjectrnrrrrrrrs      (