Recovering a Zope or Plone site that you can't access
Editing the ZODB via a python shell
Recently we had a case where someone changed the encoding on their Plone site using the portal_properties tool. This resulted in the site being unaccessible, even via the ZMI.
So, for posterity, here's how to recover from a fatal property setting:
1) Stop the instance (bin/instance stop or whatever)
2) Attach a python shell to the instance. There are a number of ways but in recent Zopes that ship with Plone (in this case Plone 3.3.1) the easiest is this:
bin/instance debug
This should run up a few lines and then settle down to a >>> prompt where you can type some python. You're now in a python shell and the ZODB is directly accessible via the "app" object.
3) Start a transaction. The right syntax had me foxed for a while, as it seems to have changed along the way, but the way to do it in recent zopes is like this:
>>> import transaction
It's important to do this before you start fiddling.
4) Make any changes you want. There are a few pages on things you might like to do to delete rogue objects etc, such as these:
http://www.zopelabs.com/cookbook/1054240694
http://wiki.zope.org/zope2/DebuggingWithIPythonAndOtherTips
However these are a bit old and don't help so much in this case as we need to change a property. So we do this:
>>> obj= app.unrestrictedTraverse("/Plone/portal_properties")
We can then look at a property like so:
>>> print obj.site_properties.default_charset ASCII
Aha, so this is wrong. Let's change it:
>>> obj.site_properties.default_charset="utf-8"
And see if it's changed:
>>> print obj.site_properties.default_charset utf-8
5) Very important step - if all went well don't quit the shell at this point, we need to commit like so:
>>> transaction.commit()
[If all didn't go well, then best to quit and not commit. That should leave things as they were before you started.]
6) You can then detach from the python shell with ctrl-d and see if your Plone site now works again.



