Package: collective.runhook
Implement your script in some module shipping in your package as a named
function accepting context and request as its arguments:defwhoami(context,request):fromAccessControl.SecurityManagementimportgetSecurityManageruser=getSecurityManager().getUser()return{'absolute_url':context.absolute_url(),'context':context.__repr__(),'user':user.__repr__(),'getId':user.getId(),'getUserName':user.getUserName(),'getRoles':user.getRoles(),'getRolesInContext':user.getRolesInContext(context)}Remember to include transaction commit when your scripts modifies the
database (the example above does not):importtransactiontransaction.commit()Register your function as a named set’uptools entry point forcollective.runhook*in your package’ssetup.py:fromsetuptoolsimportsetupsetup(# ...entry_points="""
    # -*- Entry points: -*-
    # ...
    [collective.runhook]
    whoami = my.package:whoami
    """)Addcollective.runhookas a dependency of your package, or include it in
your buildout’s instance part:[buildout]parts=instance# ...[instance]recipe=plone.recipe.zope2instance# ...eggs=Plone#   ...collective.runhookRun the buildout and execute your script:$bin/instancerunhookwhoami...{'absolute_url':'http://nohost/Plone','context':'<Application at >','getId':None,'getRoles':('manage','Authenticated'),'getRolesInContext':['manage','Authenticated'],'getUserName':'System Processes','user':"<UnrestrictedUser 'System Processes'>"}collective.runhookobeys the same instance script arguments as
the run command:$bin/instance-OPlonerunhookwhoami...{'absolute_url':'http://nohost/Plone','context':'<PloneSite at /Plone>','getId':None,'getRoles':('manage','Authenticated'),'getRolesInContext':['manage','Authenticated'],'getUserName':'System Processes','user':"<UnrestrictedUser 'System Processes'>"}As a bonus,collective.runhookcan authenticate the script as any existing
user given withZOPE_USERenvironment variable (but be aware that the
authentication is only done after-O-traverse):$ZOPE_USER=datakurrebin/instance-OPlonerunhookwhoami...{'absolute_url':'http://nohost/Plone','context':'<PloneSite at /Plone>','getId':'datakurre','getRoles':['Member','Reviewer','Site Administrator','Authenticated'],'getRolesInContext':['Member','Reviewer','Site Administrator','Authenticated'],'getUserName':'datakurre','user':"<PloneUser 'datakurre'>"}And we do support URLs with VirtualHostBase:$ZOPE_USER=datakurrebin/instance-O/VirtualHostBase/http://example.com:80/Plone/VirtualHostRoot/Plonerunhookwhoami...{'absolute_url':'http://example.com','context':'<PloneSite at /Plone>','getId':'datakurre','getRoles':['Member','Reviewer','Site Administrator','Authenticated'],'getRolesInContext':['Member','Reviewer','Site Administrator','Authenticated'],'getUserName':'datakurre','user':"<PloneUser 'datakurre'>"}Changelog0.9.5 (2014-09-28)Fix to iterate through all entrypoints with the same name to support multiple
scripts with the same hook name
[datakurre]Fix to pprint script return value to not require script to print by itself
[datakurre]0.9.4 (2014-09-26)Fix to print hooks’ results (when non-False)
[datakurre]0.9.3 (2014-09-25)Add support for VirtualHostMonster URLs
[datakurre]0.9.2 (2014-09-25)Fix issue where wrong attribute from entrypoint was read
[datakurre]0.9.1 (2014-09-24)Update README
[datakurre]0.9.0 (2014-09-24)First release.