§ ½@¾j†ãó€—ddlZddlZddlZddlmZmZmZddlmZm Z m Z ddl m Z m Z ddlmZmZGd„d¦«ZdS) éN)ÚDictÚAnyÚOptional)Ú ModuleStatusÚMODULES_STATUS_FILEÚ MAIN_LOG_PATH)Ú atomic_writeÚ setup_loggeré)Ú NoSuchModuleÚMalformedConfigErrorcó°—eZdZdZd„Zd„Zed„¦«Zd„Zd„Z d„Z d„Z ed „¦«Z e j d „¦«Z d „Zd „Zd „Zd„Zed„¦«ZdS)ÚConfigz; Low-level logic of interaction with 'states' file cóŠ—Gd„d¦«}||_tdt¦«|_| ¦«dS)Ncó—eZdZdZiZdS)úConfig.__init__..CfgN)Ú__name__Ú __module__Ú __qualname__Ú worker_pidÚmodules©óúpy/clwizard/config/config.pyÚCfgrs€€€€€ØˆJ؈GˆGˆGrrz wizard.config)rr rÚlogÚreload)Úselfrs rÚ__init__zConfig.__init__sU€ð ð ð ð ð ñ ô ð ðˆŒÝ µÑ?Ô?ˆŒà � Š ‰ Œ ˆ ˆ ˆ rcó²—i|j_| ¦«D]5\}}tj| di¦«dœ|jj|<Œ6dS)aÉ Forget about the previous config and create a new one with specified modules and instructions. {'cagefs': {'options': {'enable_for_new_users': True, 'enable_for_existing_users': True}}, 'mod_lsapi': {'options': {'use_beta_for_da': True}}, 'mysql_governor': {'options': {'mode': 'single'}}, 'php': {'options': {'install_versions': ['5.2', '5.3'], 'install_modules': False, 'default_version': '5.3'}}, 'nodejs': {'options': {'versions': ['7.4', '8.9'], 'default_version': '8.9'}}, 'python': {'options': {'versions': ['2.7', '3.6']}}, 'ruby': {'options': {'versions': ['2.7']}}} Úoptions)Ústatusr!N)rrÚitemsrÚPENDINGÚget)rrÚ module_nameÚ instructionss rÚ set_moduleszConfig.set_modules&sf€ðˆŒÔØ)0¯ª©¬ð ð Ñ %ˆK˜å&Ô.Ø'×+Ò+¨I°rÑ:Ô:ð-ð-ˆDŒHÔ ˜[Ñ )Ð )ð ð rcóR—d„|jj ¦«D¦«S)z$Get dictionary with modules statusescó&—i|]\}}||d“ŒS)r"r)Ú.0Úmoduler!s rú z#Config.statuses..@s#€ÐZÐZÐZ©o¨f°g�˜ Ô)ÐZÐZÐZr)rrr#©rs rÚstatuseszConfig.statuses<s*€ð[ÐZÀÄÔAQ×AWÒAWÑAYÔAYÐZÑZÔZÐZrcó”— |jj| di¦«S#t$r}t |¦«|‚d}~wwxYw)z Get modules options (dictionary)r!N©rrr%ÚKeyErrorr ©rr&Úes rÚget_module_optionszConfig.get_module_optionsBsV€ð 3Ø”8Ô# KÔ0×4Ò4°YÀÑCÔCÐ CøÝð 3ð 3ð 3ݘ{Ñ+Ô+°Ð 2øøøøð 3øøøs‚%(¨ A²AÁAcóx— |jj|dS#t$r}t|¦«|‚d}~wwxYw)ú/Get modules states in format (see ModuleStatus)r"N)rrr2r r3s rÚget_module_statuszConfig.get_module_statusJsK€ð 3Ø”8Ô# KÔ0°Ô:Ð :øÝð 3ð 3ð 3ݘ{Ñ+Ô+°Ð 2øøøøð 3øøøs‚š 9¤4´9có’— |jj| d¦«S#t$r}t |¦«|‚d}~wwxYw)r7Ú status_timeNr1r3s rÚget_module_status_timezConfig.get_module_status_timeRsT€ð 3Ø”8Ô# KÔ0×4Ò4°]ÑCÔCÐ CøÝð 3ð 3ð 3ݘ{Ñ+Ô+°Ð 2øøøøð 3øøøs‚$'§ A±AÁAcó¶—||jjvrt|¦«‚||jj|d<tj¦«|jj|d<dS)zSet new module stater"r:N)rrr Útime)rr&Ú new_states rÚset_module_statuszConfig.set_module_statusZsV€ð ˜dœhÔ.Ð .Ð .ݘ{Ñ+Ô+Ð +Ø2;ˆŒÔ˜Ô% hÑ/Ý7;´y±{´{ˆŒÔ˜Ô% mÑ4Ð4Ð4rcó—|jjS)z Get background worker process id©rrr.s rrzConfig.worker_pidbs€ðŒxÔ"Ð"rcó—||j_dS)z$Set new background worker process idNrA)rÚnew_pids rrzConfig.worker_pidhs€ð&ˆŒÔÐÐrcó¼—|jj ¦«D]0\}}| d¦«st |j|d¦«Œ1i|j_dS)z Reset self.Cfg object to default values before it will be loaded from file as a part of self.reload() Ú__N)rÚ__dict__r#Ú startswithÚsetattrr)rÚkÚvs rÚ _reset_cfgzConfig._reset_cfgnsa€ð ”HÔ%×+Ò+Ñ-Ô-ð +ð +‰DˆAˆqØ—<’< Ñ%Ô%ð +ݘœ ! TÑ*Ô*Ð*øØˆŒÔÐÐrcóB—| ¦«| ¦«}|€dS|d|j_|d ¦«D]E\}}|d| d¦«| di¦«dœ|jj|<ŒFdS)z… Reset config object and load data from json config. :raises MalformedConfigError: cannot parse json config NÚpidrr"r:r!)r"r:r!)rKÚ_read_json_configrrr#r%r)rÚ json_datar&Úinfos rrz Config.reloadys®€ð �ŠÑÔÐà×*Ò*Ñ,Ô,ˆ Ø Ð Ø ˆFà'¨Ô.ˆŒÔØ!*¨9Ô!5×!;Ò!;Ñ!=Ô!=ð ð Ñ ˆK˜à˜xœ.Ø#Ÿxšx¨ Ñ6Ô6ØŸ8š8 I¨rÑ2Ô2ð-ð-ˆDŒHÔ ˜[Ñ )Ð )ð ð rcób—|jj|jjdœ}| |¦«dS)z Dump python object state to file)rMrN)rrrÚ_write_json_config)rÚstates rÚsavez Config.save�s<€ð”8Ô&Ø”xÔ'ð ð ˆð ×Ò Ñ&Ô&Ð&Ð&Ð&rcó —tj t¦«sdS t td¬¦«5}t j|¦«cddd¦«S#1swxYwYdS#ttf$r3}|j   dt|¦«¦«Yd}~dSd}~wttf$rC}|j   dt|¦«¦«tt¬¦«|‚d}~wwxYw)z{ Load state config and parse it using json :raises MalformedConfigError: cannot parse json config Nzutf-8)Úencodingz*Unable to load config file due to error %sz#Unable to load json config file, %s)Ú config_path)ÚosÚpathÚexistsrÚopenÚjsonÚloadÚIOErrorÚOSErrorrÚerrorÚstrÚ TypeErrorÚ ValueErrorr )rÚfr4s rrNzConfig._read_json_config•sD€õŒw�~Š~Õ1Ñ2Ô2ð Ø�4ð OÝÕ)°GÐ<Ñ<Ô<ð $ÀÝ”y ‘|”|ð $ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð $ð $øå�Ð!ð ð ð Ø ŒH�NŠNÐGÍÈQÉÌÑ PÔ PÐ PØ�4�4�4�4�4øøøøÝ�:Ð&ð Oð Oð OØ ŒH�NŠNÐ@Å#ÀaÁ&Ä&Ñ IÔ IÐ IÝ&Õ3FÐGÑGÔGÈQÐ Nøøøøð OøøøsF¨A,¾AÁ A,ÁA#Á#A,Á&A#Á'A,Á,DÁ=(B+Â+DÂ?>C=Ã=DcóŽ—tt¦«5}tj||d¬¦«ddd¦«dS#1swxYwYdS)z%Write data to file using atomic writeé)ÚindentN)r rr\Údump)Úschemards rrRzConfig._write_json_config©s‹€õÕ-Ñ .Ô .ð +°!Ý ŒI�f˜a¨Ð *Ñ *Ô *Ð *ð +ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +ð +ð +s •:º>Á>N)rrrÚ__doc__rr(Úpropertyr/r5r8r;r?rÚsetterrKrrTrNÚ staticmethodrRrrrrrs-€€€€€ððððððððð,ð[ð[ñ„Xð[ð 3ð3ð3ð3ð3ð3ð3ð3ð3ðCðCðCðð#ð#ñ„Xð#ð Ôð&ð&ñÔð&ð ð ð ðððð('ð'ð'ðOðOðOð(ð+ð+ñ„\ð+ð+ð+rr)r\rXr=ÚtypingrrrÚclwizard.constantsrrrÚclwizard.utilsr r Ú exceptionsr r rrrrúrrsÚðð € € € Ø € € € Ø € € € Ø&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&àOÐOÐOÐOÐOÐOÐOÐOÐOÐOØ5Ð5Ð5Ð5Ð5Ð5Ð5Ð5ððððððððð W+ðW+ðW+ðW+ðW+ñW+ôW+ðW+ðW+ðW+r