jueves, 15 de marzo de 2012

Servidor KMKey de Debian Lenny a Squeeze

Hace algunas semanas dejó de soportarse Debian Lenny.  Para aquellos que tengais KMKey en esta versión y deseis subir a Debian Squeeze, aquí teneis los pasos a seguir:

1) Verificar y copiar fuera del servidor el último backup de los datos

    su zope
    cd /var/zope/storages/kmkey/backups
    cp * /mnt/algun_sitio_externo


2) Hacer copia de los fuentes de KMKey y duplicarlos fuera del servidor

    su zope
    cd /usr/local/kmkey/
    tar czf kmkey_source.tgz source/
    cp kmkey_source.tgz /mnt/algun_sitio_externo


3) Ponerse a la última en Lenny antes de actualizar

    su
    apt-get update
    apt-get upgrade
    apt-get dist-upgrade


4) Comprobar que no tenemos paquetes problemáticos o bloqueados

    su
    dpkg --audit
    dpkg --get-selections | grep hold

    aptitude
    # pulsar g y solucionar hasta que diga que todo está OK


5) Editar el sources.list y poner los repositorios de Squeeze

    su
    vi /etc/apt/sources.list
    # Por ejemplo:
    deb http://ftp.es.debian.org/debian/ squeeze main contrib non-free
    deb-src http://ftp.es.debian.org/debian/ squeeze main contrib non-free
    deb http://security.debian.org/ squeeze/updates main contrib non-free
    deb-src http://security.debian.org/ squeeze/updates main contrib non-free


5) Actualizar paquetes y cambiar kernel y grub, para reiniciar

    su
    apt-get update
    apt-get upgrade
    update-grub
    apt-get install udev
    reboot


6) Actualizamos versión y reniciamos

    su
    apt-get -d dist-upgrade
    apt-get dist-upgrade
    # Hay un warning de dpkg-reconfigure sysv-rc relativo a kmkey pero se puede ignorar
    reboot

    # Entramos con primera opción del Gurb
    su
    upgrade-from-grub-legacy
    reboot


7) Instalar psycopg2 para python2.4 (éste no se pierde)

    su
    apt-get install dpkg-dev libpq-dev
    apt-get source python-psycopg2
    cd psycopg2-2.2.1/
    python2.4 setup.py install

   
8) Si teníamos ZPsycopgDA, lo cambiamos:
       
    mv /usr/local/kmkey/zope/Products/ZPsycopgDA /usr/local/kmkey/zope/Products/ZPsycopgDA.old
    cp -a ZPsycopgDA /usr/local/kmkey/zope/Products
    chown -R zope.zope /usr/local/kmkey/zope/Products/ZPsycopgDA
    su zope
    /usr/local/kmkey/zope/bin/zopectl restart

   
9) Si se desea cambiar de postgres 8.3 a 8.4 (opcional):
   
    su
    apt-get install postgresql-8.4
    pg_dropcluster --stop 8.4 main
    /etc/init.d/kmkey stop
    pg_upgradecluster -v 8.4 8.3 main
    pg_dropclustere 8.3 main
    /etc/init.d/postgresql start
    /etc/init.d/kmkey start

Schema kmkey_document en SQL

Algunas configuraciones de KMKey, especialmente de calidad, tienen el schema kmkey_document en SQL. Hemos detectado que eso, junto con el uso de DiskFile, puede provocar serios problemas en la gestión de las transacciones, que además no resultan fácilmente reproducibles. Es por ello que aconsejamos a todos los usuarios que cambien su configuración, si se dá el caso descrito. Básicamente la solución consiste en separar el schema kmkey_document en dos, uno sin Diskfile y en SQL, y otro con Diskfile y sin SQL. Para un entorno en producción se requieren algunos pasos más a fin de conservar los datos. Son los que detallamos a continuación:

1- Añadir un schema kmkey_document_file, con un campo 'file' de tipo CPS Disk File, con una write expresion python:file

2- NO eliminar aún el campo file de kmkey_document

3- Añadir al portal_type el schema, pero ojo, el primero:

metadata common kmkey_document_file kmkey_document

4- Regrabar todos los documentos, por consola (via kmkey/zope/bin/zopectl debug):

site = app.kmkey
site._p_jar.cacheGC()
site._p_jar.sync()
from AccessControl.SecurityManagement import newSecurityManager
from Testing.makerequest import makerequest
user = site.acl_users.getUser('manager').__of__(site.acl_users)
newSecurityManager({}, user)
app = makerequest(app)
site = app.kmkey
cat = site.portal_catalog
site._p_jar.cacheGC()
site._p_jar.sync()
brains = cat(meta_type='KM Document')
erronis=[]
i=0
for brain in brains:
  i=i+1
  ob = brain.getObject().getContent()
  try:
      dm = ob.getDataModel()
  except 'StorageError':
     erronis.append(brain)
  dm._commit()
  if i%5==0 or i>=len(brains):
     get_transaction().commit()
     site._p_jar.sync()
     i

5- Ir al schema kmkey_document_file y eliminar la write expression

6- Eliminar el campo file del schema kmkey_document

7- Eliminar el campo file de la tabla SQL

psql kmkey_zodb
alter table kmkey_document add column file_old text;
update kmkey_document set file_old = file;
alter table kmkey_document drop column file;