a i%"2@s`ddlZddlZddlZddlmZmZmZmZmZddl m Z dZgdZeZddZd d dedd d eedeeeeeeeeed d eeeeeeed d ejdd dd ejdejdd dd eeeeejddejedd eddeed1ZddZddZGdddeZddZddZddZd d!Z ej!ej"d"d#d$Z#ej!ej"d"d%d&Z$dS)'N)config constants http_utils log_utilsutils) ConfigParserz/etc/sysconfig/kcare/kcare.conf)USE_CONTENT_FILE_V3FORCE_JSON_SIG_V3ENABLE_CRASHREPORTER KCORE_OUTPUT KMSG_OUTPUTSEND_PERF_METRICSKERNEL_ANOMALY_REPORT_ENABLEcCs |dvS)N)1TRUEYESY)upper)valuer5/usr/libexec/kcare/python/kcarectl/config_handlers.pybool_converter!srcCs|SNstripvrrr'rcCs|Srrrrrrr+rcCs |dSN/rstriprrrrr8rcCs|pdSrrrrrrr@rcCs |dSr r"rrrrrBrcCs |dSr r"rrrrrCrcCs |dSr r"rrrrrGrcCs |dSr r"rrrrrHrcCsdd|dDS)NcSsg|]}|qSr)rlower).0ptchrrr Rrz..,)splitrrrrrRr)1AFTER_UPDATE_COMMANDAUTO_STICKY_PATCHSET AUTO_UPDATEAUTO_UPDATE_DELAYBEFORE_UPDATE_COMMANDCHECK_SSL_CERTSr FORCE_GID FORCE_IPV4 FORCE_IPV6r HTTP_TIMEOUTHTTP_UPLOAD_TIMEOUTIGNORE_FEATURE_FLAGSIGNORE_UNKNOWN_KERNELr KCORE_OUTPUT_SIZE KDUMPS_DIRr$KERNEL_ANOMALY_REPORT_MAX_SIZE_BYTESr 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_TIMEOUTrc Kstt}|}||D]\}}d}|d}|d}tt|D]P}|||sh|||rH|durx||=n|dt|d||<d}qqH|s | |dt|dq t td |dS)NF= z =  T) openCONFIG readlinescloseitemsrangelen startswithstrappendr atomic_writejoin) kwargsZcflinesZproprupdatedZprop_eqZprop_spirrr update_config[s"rhc Csi}td}|D]<}||}|r:|\}}|sFd}n td||||<qt|tt}|rztddt|| D]R\}}t|} |dus| durqz | |Wqt ytd||fYq0qt fi|dS)Nz^([^=]+)=([^=]*)$z8Invalid parameter format: %s. Format should be KEY=VALUEzUnknown parameter: %sz, zBad value for %s: %s) recompilematchgroups SystemExitsetPOSSIBLE_CONFIG_OPTIONSrcsortedr\ Exceptionrh) paramsZparams_for_updatepatternparamrkkeyrZunknown_paramsvar_nameconvertrrrupdate_config_from_argsps,       rxc@s$eZdZddZddZddZdS) FakeSecHeadcCs||_d|_dS)Nz [asection] )fpsechead)selfrzrrr__init__szFakeSecHead.__init__cCs.|jr z|jWd|_Sd|_0n |jSdSr)r{rzreadline)r|rrrr~s zFakeSecHead.readlineccs*|jr|jVd|_|jD] }|VqdSr)r{rz)r|linerrr__iter__s  zFakeSecHead.__iter__N)__name__ __module__ __qualname__r}r~rrrrrrys rycsitddddz,ttt}tjr4|n |WntyViYS0d fdd }dD],\}}t |sl d|}|rl|t j |<qltD]\}}|||dqS) NrW) HTTP_PROXY HTTPS_PROXY)defaultscsHzd|}Wnty&|}Yn0|durD|r<||}||<dS)Nasection)getrq)namedefaultrwrZcpresultrrread_vars  z%get_config_settings..read_var))httpr)httpsrr)rw)NN)rryrXrYrPY2readfp read_filerqrget_proxy_from_envrosenvironror\)rrschemevariableproxyrvrwrrrget_config_settingss$        rcCs(tt}tj|t|dSr)_CONFIG_OPTIONSclearrr__dict__update)Zsettingsrrrset_settings_from_config_files rc Cszi}|D]h\}}|}|ds(q |dddd}ztt|||<Wq tyrtj d||Yq 0q |S)ak 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 checked in upper case. For example: 'KC-Flag-Some-Value' -> 'SOME_VALUE' :return: dict {'SOME_VALUE': bool, ...} zKC-FLAG-rW-_z(Invalid feature flag header value %s: %s) r\rr_replaceboolint ValueErrorrkcarelogerror)headersflagsZhdr_nameZ hdr_value param_namerrr convert_headers_to_feature_flagss   rcCst|tjstdSr)save_feature_flags_cacherr5set_feature_flags_from_cache)rrrrset_feature_flags_from_headerssr)loggercCs"t|}tjtjt|ddS)N)content)rrrbrFEATURE_FLAGS_CACHEjsondumps)r feature_flagsrrrrsrcCstjtjsdSttj}t|}Wdn1s<0Y|D]6\}}|t vr`qN|t vrjqN|t j |<t jd||qNdS)z Set global variables using feature flag from cached values received with patchserver headers. Checks that option is allowed by whitelist and update global variable using globals() :return: None Nz$feature flags config override: %s=%s)rpathexistsrrrXrloadr\FEATURE_FLAGS_WHITELISTrrrrrinfo)frrurrrrrs ( r)%rrrirWrrrrrpy23rDictListOptionalSetrYrrnrrrr`rr$rorhrxobjectryrrrr catch_errorslogwarnrrrrrrs 6%