Ir al contenido principal

Recuperar permisos de un espacio de Alfresco

Recientemente me he encontrado con un nuevo problema con Alfresco. De buenas a primeras habían desaparecido todos los permisos asignado a un espacio, y dicho espacio tenía cientos de subespacios con sus permisos y roles. En este caso se pudo salir al paso recuperando la mayor parte de los permisos de un entorno de preproducción.

La forma de hacerlo fue recorriendo de forma recursiva el espacio del entorno de preproducción y guardando sus permisos en un fichero. Este fichero es parseado posteriormente obteniendo un nuevo fichero con las sentencias necesarias para aplicar los permisos sobre el espacio que los había perdido.

Expongo los scripts:

- backup_permisos.js

//Obtiene el path del espacio

var ruta_origen = (space.displayPath + "/" + space.name).replace("/Empresa/","");


//Crea log en el espacio personal de quien se loga.
var nombre = space.name + "_permisos.log"
var logFile = userhome.childByNamePath(nombre);

if (logFile == null)

{

logFile = userhome.createFile(nombre);

}

logFile.content ="";

var log = "";



//Funcion que recorre un espacio para obtener sus permisos.

function recorre(doc)

{

for each (n in doc.children)

{

if (n.isContainer)

{
cadena_origen = n.displayPath + "/" + n.name;
cadena_destino = cadena_origen.replace("/Empresa/", "");
log += cadena_destino;

if (n.inheritsPermissions())

{

log += ";" + "true" + ";" ;

}
else
{
log += ";" + "false" + ";" ;
}



var cadena = n.getPermissions();

for each (k in cadena)

{

var permisos = k.split(';');
log += permisos[2] + "," + permisos[1] + "|" ;


}
log = log.substring(0, log.length-1);
log += "\n";

recorre (n);

}

}

}



//Comienza main.



//Se obtien los ScriptNode a partir de la ruta de los espacios.

var espacio_origen = companyhome.childByNamePath(ruta_origen);



//Recorremos el espacio origen para dar los permisos al destino.

recorre(espacio_origen);

//Permisos del espacio
cadena_origen = espacio_origen.displayPath + "/" + espacio_origen.name;
cadena_destino = cadena_origen.replace("/Empresa/", "");
log += cadena_destino;
if (espacio_origen.inheritsPermissions())
{
log += ";" + "true" + ";" ;

}
else
{
log += ";" + "false" + ";" ;
}

var cadena_permisos = espacio_origen.getPermissions();
for each (k in cadena_permisos)
{
var permisos = k.split(';');
log += permisos[2] + "," + permisos[1] + "|" ;

}
log = log.substring(0, log.length-1);
log += "\n";


logFile.content += log;

//FIN



Este script lo ejecutaremos como una acción sobre el espacio del cual queremos obtener los permisos asignados. Una vez ejecutado (puede tardar un buen rato, depende de la cantidad de documentos que se tenga) obtendremos en nuestro espacio personal un fichero que recoge los permisos para cada espacio y documento incluido el espacio sobre el que se ha lanzado.

Ese fichero lo parsearemos con el siguiente script en python, el cual nos devolverá un js que podremos ejecutar en alfresco para asignar esos permisos sobre el espacio original en caso de pérdida de permisos.

- crea_script_permisos.py

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import os, string, sys
#Variables
entrada=sys.argv[1]
script=entrada + "_script.js"

fichero01 = open(entrada, 'r')
fichero02 = open(script, 'w')
for linea_fichero01 in fichero01:
linea=linea_fichero01.split(';')
espacio=linea[0].strip()
herencia=linea[1].strip()
try:
permisos=linea[2].strip()
except:
permisos=""
cadena1="var espacio = companyhome.childByNamePath(" + "\"" + espacio + "\"" + ");"
estructura_if="if ( espacio != null) {"
fin_estructura_if="}"
cadena2="espacio.setInheritsPermissions(" + herencia + ");"
fichero02.write(cadena1 + '\n')
fichero02.write(estructura_if + '\n')
fichero02.write(cadena2 + '\n')
if permisos != "":
lista=permisos.split('|')
for perm in range(len(lista)):
grup=lista[perm].split(',')
permis=grup[0].strip()
user=grup[1].strip()
cadena="espacio.setPermission(" + "\"" + permis + "\"" + "," + "\"" + user + "\"" + ");"
fichero02.write(cadena + '\n')
fichero02.write(fin_estructura_if + '\n')

fichero01.close()
fichero02.close()

Comentarios

Publicar un comentario

Entradas populares de este blog

Conexión a bbdd oracle desde python

Para poder acceder a una bbdd oracle desde python tan sólo necesitaremos tener instalado: - cliente oracle (lo puedes obtener de la página de oracle y registrándote en la misma) - extensión cx_Oracle (lo puedes descargar desde la página http://cx-oracle.sourceforge.net/) La forma de utilizarlo lo podemos ver en el siguiente ejemplo: Con este script se pretende actualizar el campo de una tabla pasándole tres argumentos, dos para filtrar el dato y uno que será el nuevo valor. También hacemos uso de optparse para pasear los argumentos. #!/usr/bin/python # -*- coding: iso-8859-15 -*- import cx_Oracle, sys, os, datetime from optparse import OptionParser conn_str='usuario/pass@host:port/bbdd' log = '/ruta/para/log/script.log' #Fucion para escribir log def log (texto):         now = datetime.datetime.now()         f = open(log_propio, 'a')         f.write(str (now.ctime()) + ' -> ' + texto + '\n')         f.close() #Se parsea

Curso Django Segunda Parte

Continuamos con la segunda parte del mini curso de django. Respecto a la primera parte, he añadido una par de cosas: - La instalación de un paquete más: python-pygraphviz - Y la aplicación de un parche para django-smart-selects: https://github.com/GrAndSE/django-smart-selects/commit/7e2a8d572b3615cc39a3c9f9d60e1b60de06f46f Pues bien, ya tenemos creado un proyecto llamado misitio. Ahora es el momento de crear nuestra aplicación, la cual llamaremos inventario. Para crear un aplicación, simplemente hacemos: cd /opt/djcode/misitio python manage.py startapp inventario Tras la ejecución de este comando (que no devuelve nada por pantalla), tendremos un nuevo directorio bajo el proyecto misitio: ls -l inventario/ -rw-r--r-- 1 root root   0 mar 11 12:27 __init__.py -rw-r--r-- 1 root root  57 mar 11 12:27 models.py -rw-r--r-- 1 root root 383 mar 11 12:27 tests.py -rw-r--r-- 1 root root  26 mar 11 12:27 views.py De los ficheros que nos podemos encontrar, tenemos:

Configurar Nano Wifi TL-WN725N en Raspberry pi

Hace poco me regalaron una raspberry pi, y junto con ella, un dongle wifi usb TP-LINK, modelo TL-WN725N. En principio se supone que no debe haber problemas de compatibilidad entre este dongle wifi y nuestra raspberry, pero si la versión de nuestro dongle wifi es la 2 (en la caja viene como Ver:2.0) la cosa cambia. En mi caso tenía instada la última versión de raspbian, la cual traía una versión de kernel superior a la 3.10.18. Esta versión de kernel es la que funciona con nuestra modelo de dongle wifi (al menos según he podido averiguar). De modo que para poder reconocer el dongle wifi, tendremos que bajar a esta versión del kernel: sudo rpi-update 8fd111f77895450323abc5b34efde19548ffc480 Tras reiniciar, tendremos el siguiente kernel: Linux raspberrypi 3.10.18+ #587 Ahora sólo nos queda instalar el driver: wget https://dl.dropboxusercontent.com/u/80256631/8188eu-20131110.tar.gz tar -zxvf 8188eu-20131110.tar.gz                                          cat README