a ˆ#½es2ã@sfddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl mZddlmZddlmZddlmZddlmZe d ¡ZejejvrÀej ej¡d d „Zd d „Zdd„Zdd„Zdd„Zdd„Z dd„Z!da"dd„Z#dd„Z$d2dd„Z%d3d d!„Z&d"d#„Z'd$d%„Z(d4d&d'„Z)d(d)„Z*d*d+„Z+d,d-„Z,d.d/„Z-d0d1„Z.dS)5éN©Úreduce)ÚTemplate)Ú HttpResponse)ÚPlugin)ÚSetting)Úsettings)Úpath_traversal_checkz app.loggerc CsÄtj tƒ¡st tƒ¡tj tj tƒd¡¡s®zDttj tƒd¡dƒ}| d¡Wdƒn1sj0YWn6t y¬}zt   dt |ƒ¡WYd}~n d}~00t ƒtƒtƒdS)Nú __init__.pyÚwÚ zCannot create __init__.py: %s)ÚosÚpathÚexistsÚget_plugins_persistent_pathÚmkdirÚisfileÚjoinÚopenÚwriteÚ ExceptionÚloggerÚwarningÚstrÚ build_pluginsÚsync_plugin_dbÚregister_plugins)ÚfÚe©rú /webodm/app/plugins/functions.pyÚ init_pluginss ,(r!csÄtjr dStƒtj ¡}tƒ}|D]F‰t‡fdd„|Dƒdƒ}|s$tjjˆj d  ¡t   d  ˆj ¡¡q$tƒD]L}| d¡}tj |¡}tjj| ¡d| id\}}|rrt   d   |¡¡qrdS) zc Creates db entries for undiscovered plugins to keep track of enabled/disabled plugins Nc3s |]}ˆj| ¡kr|VqdS©N)ÚnameÚget_name)Ú.0Z fs_plugin©Z db_pluginrr Ú <óz!sync_plugin_db..©r#zfr(zbuild_plugins..FcSstjjSr")r rrrBrrr rEgr(Úappr<Ú templateszwebpack.config.js.tmplÚ.Z entry_jsonzpublic/webpack.config.jsr z?Cannot generate webpack.config.js for {}, a path is missing: {}ú éz#Running webpack with watcher for {}z webpack-cliz--watchz public/buildzRunning webpack for {}zwebpack-cli.cmdz2webpack-cli is not installed, plugin will not work)#r1Ú path_existsrr5r6ÚplatformÚsystemÚ subprocessÚcallr7ÚFileNotFoundErrorÚwarnÚlenÚbuild_jsx_componentsÚmapr rrrÚBASE_DIRrrÚreadÚsplitextÚbasenameÚ substituteÚjsonÚdumpsrrÚDEVÚwebpack_watch_process_countÚDEV_WATCH_PLUGINSr$ÚPopen) r=Z build_pathsZpaths_okZwpc_pathrÚtmplÚentryrZ wpc_contentZwebpackrrDr rTsT        , ÿLÿ  rc CsŠd}zjdd„t d¡Dƒ}|D]L}z0dttj d|d¡dƒ ¡ d¡vrP|d 7}WqtyhYqYq0qWnt  d ¡Yn0|S) NrcSsg|]}| ¡r|‘qSr)Úisdigit)r%Úpidrrr Ú r(z/webpack_watch_process_count..z/procz/usr/bin/webpack-cliZcmdlineÚrúéz>webpack_watch_process_count is not supported on this platform.) r ÚlistdirrrrrVÚsplitÚIOErrorrr)ÚcountZpidsrcrrr r]s$  r]c CsttƒD]h}z| ¡t d |¡¡Wqtyl}z.t| ¡ƒt d |t |ƒ¡¡WYd}~qd}~00qdS)Nz Registered {}zCannot register {}: {}) Úget_active_pluginsÚregisterrr5r6rÚdisable_pluginr$rr)r9rrrr rs  rcCsNtj |d¡}tj |d¡}tj |d¡}tj |¡oLtj |¡oLtj |¡S)Nr z plugin.pyú manifest.json)r rrr)Ú plugin_pathZ initpy_pathZ pluginpy_pathÚ manifest_pathrrr Ú valid_plugin¦srrc CsÖtdkr tStƒ}ga|D]´}tj |¡s.qt |¡D]”}tj ||¡}tj |¡ d¡rft j sfq8tj |¡dkrxq8t |ƒs‚q8zz8t j r t   d |¡¡}nt   d |¡¡}t|dƒƒ}Wn2ttfyðt   d |¡¡}t|dƒƒ}Yn0| ¡}d|vrH|d}tj |d ¡}t|ƒtt jƒkrHt d  ||t j¡¡Wq8| ¡t jvr\Wq8| ¡d d „tDƒvrˆt d  |¡¡Wq8t |¡Wq8tyÌ} zt d || ¡¡WYd} ~ q8d} ~ 00q8qtS)z9 :return: all plugins instances (enabled or not) NÚtestz .gitignorezapp.media_test.plugins.{}z plugins.{}rzcoreplugins.{}ZwebodmMinVersionrozgIn {} webodmMinVersion is set to {} but WebODM version is {}. Plugin will not be loaded. Update WebODM.cSsg|] }| ¡‘qSr©r$©r%rCrrr rdêr(zget_plugins..z+Duplicate plugin name found in {}, skippingz#Failed to instantiate plugin {}: {})r<Úget_plugins_pathsr rÚisdirrhrrXÚendswithrÚTESTINGrrÚ importlibÚ import_moduler6ÚgetattrÚ ImportErrorÚAttributeErrorÚ get_manifestÚ versionToIntÚVERSIONrrr$ÚPLUGINS_BLACKLISTÚappendr) Z plugins_pathsZ plugins_pathÚdirrpÚmoduler9ÚmanifestÚ min_versionrqrrrr r1­sV    ÿÿ,r1c CsŒtjr gSg}zBdd„tjjdd ¡Dƒ}tƒD]}| ¡|vr2| |¡q2Wn6t y†}zt   dt |ƒ¡WYd}~n d}~00|S)NcSsg|] }|j‘qSrr)rurrr rdúr(z&get_active_plugins..T)r+zFCannot get active plugins. If running a migration this is expected: %s) rr-rr/r3r0r1r$rƒrrrr)r<Zenabled_pluginsr9rrrr rlõs   (rlTFcs`|r tƒ}ntƒ}tt‡fdd„|ƒƒ}|r4|dnd}|rX|durXtƒtˆ|ddS|SdS)Ncs | ¡ˆkSr"rtrBr)rr rE r(z$get_plugin_by_name..rF)Ú only_activeÚrefresh_cache_if_none)rlr1Úlistr3r.Úget_plugin_by_name)r#rˆr‰r<Úresrr)r r‹s r‹cCsht ¡dd}tƒD]L}tj ||¡}d|vr2q| tj¡}t|ƒdkr|d}t ||dSqdS)z¡ When called from a python module inside a plugin's directory, it returns the plugin that this python module belongs to :return: Plugin instance éþÿÿÿrú..©rˆN) Ú tracebackÚ extract_stackrvr rÚrelpathriÚseprRr‹)rˆZcaller_filenamerCZrelpÚpartsÚ plugin_namerrr Úget_current_plugins   r–c Cs<tj tj t¡¡}tj tƒ¡tj tj |ddd¡¡gS)NrŽZ coreplugins)r rÚdirnameÚrealpathÚ__file__Úabspathrr)Ú current_pathrrr rv(s þrvcGs*ttjjtjdg|¢RŽtj tjd¡ƒS)Nr<)r r rrrÚ MEDIA_ROOT)Úpathsrrr r/src s‡‡‡fdd„}|S)Nc sȈdur&ˆ|fiˆ¤Ž}|s*tdƒSnˆ}tˆƒ‚}t| ¡ƒ}zt| |¡ƒWWdƒSty¤}z.td t|ƒ|¡ƒWYd}~WdƒSd}~00Wdƒn1sº0YdS)NÚz0Template substitution failed with params: {}. {})rrrrVrYÚ TypeErrorr6r)ÚrequestÚtemplate_paramsrr`r©ÚcallbackÚkwargsÚ script_pathrr Ú handleRequest3s   z1get_dynamic_script_handler..handleRequestr)r¥r£r¤r¦rr¢r Úget_dynamic_script_handler2sr§cCs*t|dd}| ¡tjj|d ¡|S©NFr©Úpk)r‹rmrr/ÚgetÚenable©r•rCrrr Ú enable_pluginDs r®cCs"t|dd}tjj|d ¡|Sr¨)r‹rr/r«Údisabler­rrr rnJs rncCs:tjj|d ¡tj t|ƒ¡r0t  t|ƒ¡t ƒdS)Nr©) rr/r«r4r rrrÚshutilÚrmtreer.)r•rrr Ú delete_pluginOsr²cCs tj ¡Sr")rr/Úfirstrrrr Úget_site_settingsUsr´c Cs>z*tdd„tgd¢tt| d¡ƒƒDƒƒWSYdS0dS)a Converts a WebODM version string (major.minor.build) to a integer value for comparison >>> versionToInt("1.2.3") 100203 >>> versionToInt("1") 100000 >>> versionToInt("1.2.3.4") 100203 >>> versionToInt("wrong") -1 cSsg|]}tdd„|ƒ‘qS)cSs||Sr"r)ÚmultÚverrrr rEgr(z)versionToInt...r)r%Úirrr rdgr(z versionToInt..)i †édrgrHéÿÿÿÿN)ÚsumÚziprTÚintri)Úversionrrr r€Xs*r€)TF)F)N)/r ÚsysÚloggingrzrNrrLrZr°Ú functoolsrÚstringrÚ django.httprÚ app.modelsrrÚ django.confrÚ app.securityr Ú getLoggerrrœrrƒr!rr.rr]rrrr<r1rlr‹r–rvrr§r®rnr²r´r€rrrr ÚsL         "9 H