0

我想从我的克隆网站检查互联网连接。我在 python 脚本中尝试了 ping

## Script (Python) "pwreset_action.cpy"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##title=Reset a user's password
##parameters=randomstring, userid=None, password=None, password2=None
from Products.CMFCore.utils import getToolByName
from Products.PasswordResetTool.PasswordResetTool import InvalidRequestError, ExpiredRequestError
import ping, socket



status = "success"
pw_tool = getToolByName(context, 'portal_password_reset')
try:
    pw_tool.resetPassword(userid, randomstring, password)

except ExpiredRequestError:
    status = "expired"
except InvalidRequestError:
    status = "invalid"
except RuntimeError:
    status = "invalid"

context.plone_log("TRYING TO PING")
try :



 ping.verbose_ping('www.google.com' , run=3)
   context.plone_log("PING DONE")
except socket.error, e:
    context.plone_log("PING FAILED")


return state.set(status=status)

我收到了这些错误:

2012-07-20T11:37:08 INFO SignalHandler Caught signal SIGTERM
------
2012-07-20T11:37:08 INFO Z2 Shutting down fast
------
2012-07-20T11:37:08 INFO ZServer closing HTTP to new connections
------
2012-07-20T11:37:42 INFO ZServer HTTP server started at Fri Jul 20 11:37:42 2012
    Hostname: 0.0.0.0
    Port: 8080
------
2012-07-20T11:37:42 WARNING SecurityInfo Conflicting security declarations for "setText"
------
2012-07-20T11:37:42 WARNING SecurityInfo Class "ATTopic" had conflicting security declarations
------
2012-07-20T11:37:46 INFO plone.app.theming Patched Zope Management Interface to disable theming.
------
2012-07-20T11:37:48 INFO PloneFormGen Patching plone.app.portlets ColumnPortletManagerRenderer to not catch Retry exceptions
------
2012-07-20T11:37:48 INFO Zope Ready to handle requests
------
4

2 回答 2

3

Zope 中的 Python 脚本是沙盒化的(通过RestrictedPython,这意味着必须首先将任何模块导入声明为安全的。除非您知道自己在做什么,否则将模块添加到声明安全列表通常是一个坏主意。

要将模块声明为可导入 Python 脚本,您需要创建一个 python 包,然后将以下代码添加到其中,以便在 Zope 启动时执行:

from Products.PythonScripts.Utility import allow_module

allow_module('ping')

这将允许从该模块进行任何导入(谨慎使用)!

最好只允许模块中的特定方法和类;为此使用ModuleSecurity声明:

from AccessControl import ModuleSecurityInfo

ModuleSecurityInfo('ping').declarePublic('verbose_ping')
ModuleSecurityInfo('socket').declarePublic('error')

这记录在Zope 开发人员指南的安全章节中,特别是关于模块安全断言的部分。

请注意,在不受限制的代码(例如,常规的 python 包)中以严格约束的方法完成所有这些工作几乎总是一个更好的主意,然后允许从 python 脚本中使用该方法。

于 2012-07-22T10:34:09.663 回答
1

它行不通。

不能在 RestrictedPython 脚本中导入任意 Python 模块,就像昨天告诉您的答案一样:

https://stackoverflow.com/a/11568316/315168

如果您需要使用任意 Python 模块,您需要为此编写自己的 Plone 插件并为此使用 BrowserView。RestrictedPython through-the-web-browser 开发是不够的:

http://collective-docs.readthedocs.org/en/latest/getstarted/index.html

于 2012-07-20T09:55:01.923 回答