wo4ho%ddlZddlZddlZddlZddlmZddlmZddlm Z ddl m Z m Z m Z ddlZddlZddlmZejeZdZGdd e ZGd d eZGd d Zde ede efdZdedefdZdededefdZGddZGddeZGddeZ GddeZ!dS) N)abstractmethod)suppress)dedent)MappingOptionalProtocol)atomic_rewriteic~eZdZe d dedefdZededdfd Zed ee defd Z dS) IConfigProviderFT force_read ignore_errorsctNNotImplementedError)selfr r s ^/opt/imunify360/venv/lib/python3.11/site-packages/defence360agent/contracts/config_provider.pyread_config_filez IConfigProvider.read_config_files "!configreturnNctrr)rrs rwrite_config_filez!IConfigProvider.write_config_file!!r timestampctrrrrs rmodified_sincezIConfigProvider.modified_since rrFT) __name__ __module__ __qualname__rboolrrrrfloatrrrr r s>B"""7;"""^" ""D"""^"""D"""^"""rr ceZdZdS) ConfigErrorN)r r!r"r%rrr'r'%sDrr'ceZdZdZdZdZdS) JsonMessagezPretty-print given *obj* as JSON. To be used for logging. Example: logging.info("object: %s", JsonMessage(obj)) c||_dSr)_obj)robjs r__init__zJsonMessage.__init__2s  rc8tj|jdS)NT) sort_keys)jsondumpsr+rs r__str__zJsonMessage.__str__5sz$)t4444rN)r r!r"__doc__r-r3r%rrr)r))s<55555rr) prev_sectionsectionc^pipiz }z }fd|Dfd|DfdzDdS)z*Return difference between config sections.c"i|] }|| Sr%r%).0vr5s r z diff_section..@s ; ; ;Qaa ; ; ;rc"i|] }|| Sr%r%)r9r:r6s rr;z diff_section..As 4 4 4a 4 4 4rcVi|]%}||k|||f&Sr%r%)r9r:r5r6s rr;z diff_section..CsE   A'!*,,  Q,,,,r)-+?keys)r5r6removed_settingsadded_settingss`` r diff_sectionrE9s%2LmG#((**W\\^^;\\^^l&7&7&9&99N ; ; ; ;*: ; ; ; 4 4 4 4^ 4 4 4     "''))GLLNN:     r prev_confconfc#bKz }fd|DVz }fd|DVfdzDVdS)z,Compare *prev_conf* with the current *conf*.c"i|] }|| Sr%r%)r9r6rFs rr;zdiff_config..Ns G G G77Ig& G G Grc"i|] }|| Sr%r%)r9r6rGs rr;zdiff_config..Ps @ @ @g7DM @ @ @rcni|]1}||k|t||2Sr%)rE)r9r6rGrFs rr;zdiff_config..RsL     W g . . i0$w-@@ . . .rNrA)rFrGremoved_sectionsadded_sectionss`` r diff_configrNKs ~~''$))++5 G G G G6F G G GGGGYY[[9>>#3#33N @ @ @ @ @ @ @@@@     !((499;;6   r main_conf base_confrct||\}}}i}|D]\}}||vr|||<||vr||i||d||id||dD|S)a Return dict derived from *main_conf* excluding parts that are equal in *base_conf*. For example, >>> base_conf = { "SECTION1": {"OPTION1": "default", "OPTION2": "default"}, "SECTION2": {"OPTION1": "default"} } >>> main_conf = { "SECTION1": {"OPTION1": "value", "OPTION2": "default"}, "SECTION2": {"OPTION1": "default"} } >>> >>> exclude_equals(main_conf=main_conf, base_conf=base_conf) {'SECTION1': {'OPTION1': 'value'}} >>> r?c&i|]\}}||dS)r%)r9kr:s rr;z"exclude_equals..ss"CCCTQAaDCCCrr@)rNitemsrB setdefaultupdate)rOrP_addedchangedresultr6values rexclude_equalsr]Ys$$Iy99Aug F#//++ ejjll " "#F7O gllnn $ $   gr * * 1 1''2B32G H H H   gr * * 1 1CCWW%5c%:%@%@%B%BCCC    MrceZdZdZddZdZdZ dd ed ed efd Z d e d efdZ dZ dZ d e fdZdeed efdZdS) ConfigReaderzM ConfigFile file for settings page. Location config file is PATH Nc0||_||_||_dSr)path disclaimer permissions)rrbrcrds rr-zConfigReader.__init__~s $&rcNd|jj|jS)Nz<{classname}({path})>) classnamerb)format __class__r"rbr2s r__repr__zConfigReader.__repr__s+&--n1 .   rcd|jS)NzConfigReader at )rbr2s rr3zConfigReader.__str__s-$)---rFTr r rc2 tj|jtkrt d|j}t |d5}t d||}dddn #1swxYwYn/#t$r}t d|d}~wt$ricYSwxYw | |S#t$r*}t ||ricYd}~S|d}~wwxYw)zCRead config file into memory. Raises ConfigError. zConfig file is too largerzReading config file %sNzUnable to decode config file) osrbgetsize_MAX_CONFIG_SIZEr'openloggerinforeadUnicodeDecodeErrorFileNotFoundErrorload_config_bodyerror)rr r filename config_filetextes rrzConfigReader.read_config_filesu wty)),<<<!"<===yHh$$ *  4h???"'')) * * * * * * * * * * * * * * *" E E E<==1 D    III  ((.. .    LLOOO  G  sfAB0B BBBBB C 'B77C C  C"" D,D DDDrzc  tj|}n+#tj$r}td|d|d}~wwxYw|iSt |t s(td|j||S)Nz.Imunify360 config is not valid YAML document ()z;Imunify360 config is invalid or empty: path={!r}, text={!r})yaml safe_load YAMLErrorr' isinstancedictrgrb)rrzrr{s rrvzConfigReader.load_config_bodys ^D))FF~   EEEE   >I&$'' ))/ 4)@)@   s?:?cdSrr%r2s r _pre_writezConfigReader._pre_write rcdSrr%r2s r _post_writezConfigReader._post_writerrc |d}|jr|t|jz }|dz }|tj|dz }t |j|d|j||S)Nr` F)default_flow_style)backuprd) rrcrr~dumpr rbrdr)rr config_texts rrzConfigReader.write_config_files  ? 6$/22 2K 4 KtyEBBBB  I{5d>N     rrcdS)NTr%rs rrzConfigReader.modified_sincestrr`Nr)r r!r"r4r-rir3r#rrstrrvrrrrr$rr%rrr_r_xs ''''    ...?C7; 4ST&       3    Drr_cZeZdZd fd ZdZ ddedeffd Zd eed efd Z xZ S)CachedConfigReaderr`Nct||d|_d|_i|_||_dSr)superr-mtimesize_configrd)rrbrcrdrhs rr-zCachedConfigReader.__init__s@ z***&* %)  &rcfd|jj|j|j|jS)Nz9{classname} <'{path}', modified at {mtime}, {size} bytes>)rfrbrr)rgrhr"rbrrr2s rr3zCachedConfigReader.__str__s7 G N N.5YjY O   rFTr r c||js|r<|j} t||_|jWt t ||j}t|r&tj d|gtt|Rn]#t$rP}tj|td|t|j|s|Yd}~nd}~wwxYw t!j|j}|j|_|j|_n#t,$rd|_d|_YnwxYw|jS)z(Update config if config file is modified)r Nz-%s modified: removed=%s, added=%s, changed=%sz*%s is invalid, using previous settings: %s)rrrrrlistrNanyrqrrmapr)r' sentry_sdkcapture_exceptionwarningrmstatrbst_mtimest_sizerru)rr r prev_configdiffsrwrrhs rrz#CachedConfigReader.read_config_files   tz * *! j! ,K $ww77"/ 8   :) [$,!G!GHHE5zz K !e44 ,U333@ -- % K      * wty))!]  L $       |s*'B-- D7ADD 1D==EErrc|d} tj|j}|j|j}}n#t $rd\}}YnwxYw||kp ||jkS)zWhether the config has updated since *timestamp*. (as defined by its last modification time and size) :param timestamp: None means that the file has never been read before Nr)rr)rmrrbrrrur)rrrrrs rrz!CachedConfigReader.modified_since sz  I <749%%D!% t|gHH! ) ) ) ( Hggg ))#;w$)';;s.AArr) r r!r"r-r3r#rrr$r __classcell__rhs@rrrs''''''   ?C'''7;''''''R<rss  .......... 000000  8 $ $ " " " " "h " " "      )    5 5 5 5 5 5 5 5 x~$ 4 t    $4>TTTTTTTTnJ<J<J<J<J<J<J<J