Ir al contenido principal

Entradas

Mostrando entradas de 2010

Administración de usuarios/grupos en alfresco (I)

Debido a que la administración de usuarios y grupos en alfresco no ofrece demasiadas posibilidades , estuve indagando un poco en la forma de realizar tareas que eran muy repetitivas con ayuda de javascript. He de agredecer a Pedro Jimenez Caracuel que fue quien me ayudó en un comienzo con esto (estaba bastante perdido....). De modo que voy a mostrar una serie de scripts que en mi caso son bastante útiles (algunos más que otros). - anade_user_group.js (añade un usuario a un grupo, puede parecer una tontería, pero nos servirá para extenderlo a varios usuarios y ver de una manera más clara su funcionamiento): //Variables a completar var nombregrupo="Nombre del Grupo"; var user="Nombre del usuario"; var groupPrefix="GROUP_"; //Fichero de log var logFile = space.childByNamePath("documento_salida.txt"); if (logFile == null) { logFile = space.createFile("documento_salida.txt"); } logFile.content =""; var log = ""; //Obten

Variables jvm

A raíz de una auditoría realizada sobre varios entornos de Alfresco, nos aconsejaron una serie de valores a indicar en la máquina virtual de java. Aprovecho para aclarar algunas de estas variables. Una posible configuración: JAVA_OPTS='-Xms1024m -Xmx1536m -Xmn256m -Xss128k -server -d64 -Xloggc:/opt/alfresco/tomcat/logs/gc.log -Xcheck:jni -Xconcurrentio -XX: +UseParNewGC -XX:+CMSPermGenSweepingEnabled -Dsun.rmi.dgc.server.gcInterval=600000 -Dsun.rmi.dgc.client.gcInterval=600000 -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31 -XX:+UseParNewGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled' Significado: -server , solo puede haber una opción en la variable, de esta manera activamos Server Hotspot VM. -d32/-d64 , activa el modelo de datos de 32/64bits, por lo que en un entorno de pruebas puede confirmarse la mejor configuración para nuestros entornos con una JVM, recomendable siempre la última revisión (para solución de incidencias detectadas

Decompilador Java

Por si tenéis que decompilar algún class de java.... http://jdec.sourceforge.net/ Lo descomprimís en alguna carpeta y le dais permiso de ejecución a su contenido, luego ejecutáis ./Jdec-UI.sh Hay unos parámetros que se tienen que cambiar, una vez abierta la aplicación, presionad Alt+Mays+A, y en el listado podéis poner algo así: Output_Mode file Log_Mode file Output_Folder_Path /home/rafa/Escritorio Output_File_Extension java LOG_LEVEL 2 Log_File_Path /opt/jdec/log.txt UI_LOG_FILE_PATH /opt/jdec/log2.txt JAVA_CLASS_FILE /opt/jdec/ JAR_FILE_PATH /opt/jdec/ Show_Imports true JDec_Option dc Temp_Dir /home/rafa/Escritorio Inner_Depth 2 Inline_Anonymous_Inner_Class_Content false Interpret_Exception_Table false Interpret_Non_ASCII true Force_Non_ASCII true Skip_Class_Version_Check true int_local_var_prefix aInt byte_local_var_prefix aByte short_local_var_prefix aShort char_local_var_prefix aChar float_local_var_prefix aFloat double_local_var_prefix aDouble long_local_var_prefix aLong boolean

Volcado de memoria (hprof)

Debido a los errores de memoria cada vez más frecuentes (tipo java.lang.OutOfMemoryError: PermGen space failure) en las aplicaciones java que administramos en entornos de producción y a que en la mayoría de los casos se debe a un error de programación, java nos da la posibilidad de añadir una variable para realizar un volcado de la memoria. Con esto obtenemos en un fichero una copia exacta del contenido de la memoria de la jvm en el momento del error. Este fichero nos servirá para tener una base sobre la cual estudiar el origen del problema (hay herramientas para procesar este tipo de ficheros, como jvisualvm). Dicha variable sería: -XX:HeapDumpPath=/ruta/donde/guardar/el/fichero/ -XX: +HeapDumpOnOutOfMemoryError Sólo es factible sobre la versión de java 1.6 (por lo que no se podría aplicar a todas las aplicaciones). Este fichero puede ser analizado con distintas herramientas: JVisualVM, Eclipse Memory Analyzer... Si además quieres que ser avisado por correo cuando esto se produzca, s

alf_bootstrap_lock

Se trata de un error muy típico de Alfresco (al menos en versiones 2.1) cuando se produce alguna complicación de actualización o un reinicio inesperado. Es una medida de seguridad que deja bloqueado el sistema mostrando el siguiente mensaje de error: Caused by: org.alfresco.error.AlfrescoRuntimeException: A previous schema upgrade failed. Revert to the original database before attempting the upgrade again. Si se ha producido por algún reinicio inesperado, la solución es simplemente elminar la tabla: alf_bootstrap_lock Tras esto, arrancaremos alfresco sin ningún problema.

Balanceo con mod_proxy_balancer

Una opción de balanceo de carga que nos ofrece apache a partir de la versión 2.1 es mod_proxy_balancer. Hoy he realizado una pequeña configuración para balancear una aplicación que correo sobre dos tomcat. Básicamente la configuración consiste en lo siguiente (esto lo configuro dentro de un virtual): <VirtualHost *:80> ServerName prueba.dominio.es ErrorLog logs/error.log CustomLog logs/access.log common RewriteEngine On ProxyPreserveHost on <Proxy balancer://cluster> BalancerMember http://tomcat1:8080 loadfactor=1 route=clustnode1 BalancerMember http://tomcat2:8080 loadfactor=1 route=clustnode2 Order Deny,Allow Allow from all </Proxy> <Location /aplicacion> ProxyPass balancer://cluster/aplicacion stickysession=JSESSIONID ProxyPassReverse balancer://cluster/aplicacion Order Deny,Allow Allow from all </Location> <Location /balancer-manager> SetHandler balancer-manager Order Deny,Allow Allow from all </Location> </VirtualHost> Por partes: Pr

Exámenes LPIC

Buenas, para aquellos que estén interesados, para marzo del año que viene se realizan los exámenes del LPIC en la ETSII de Sevilla. Aquí tenéis el enlace: http://www.concursosoftwarelibre.org/1011/certificado-lpi Nos vemos allí ;)

Manipular pdf's desde la línea de comandos

Si necesitas extraer páginas de un pdf, unir varios pdf en uno, obtener metadatos ... una forma muy fácil y efectiva de hacerlo en con pdftk. En el siguiente post viene muy bien expliado: http://danubuntu.wordpress.com/2008/04/05/manipular-archivos-pdf-con-pdftk/ Ejemplo: queremos extraer las páginas 25 a 36 de un archivo PDF $ pdftk A=documento1.pdf cat A25-36 output documento_nuevo_pag_25_a_36.pdf Ejemplo: obtener informe con los metadatos de un pdf $ pdftk documento.pdf dump_data output informe.txt

Contar número de documentos en un espacio de Alfresco

Siguiendo la mísma línea que en el script para dar permisos a un espacio copiado en alfresco, podemos recorrer un espacio de forma recursiva para obtener otros datos que nos pueden ser muy útiles. En este caso, obtenemos el número de documentos que contiene el espacio y el peso de este: //Crea log en el espacio personal de quien se loga. var logFile = userhome.childByNamePath("recorre.log"); if (logFile == null) { logFile = userhome.createFile("recorre.log"); } logFile.content =""; var log = ""; //Funcion que cuenta los docuementos y obtiene el peso de un espacio de forma recursiva. function cuenta(doc) { for each (n in doc.children) { if (n.isContainer) { cuenta(n); } else { total += 1; peso += n.size; } } } //Comienza main. var total = 0; var peso = 0; cuenta(space); log += "El total de documentos del espacio " + space.name + "es: " + total + "\n"; log += "El tamaño del espacio es: " + space.name +

Screen para no perder sesiones...

Ya me ha pasado más de una vez que mientras ejecuto algún trabajo a través de ssh, por algún motivo he perdido la conexión y también lo que estaba haciendo en el servidor sobre el que trabajaba. Para evitar estas situaciones podemos hacer uso de screen . screen es un manejador de sesiones que nos permite tener en segundo plano la ejecución de un programa. No sólo sirve para trabajar sobre ssh, también lo podemos usar en local. Su uso es muy sencillo. Una vez conectados, simplemente tenemos que ejecutar: rafa@rafa-laptop:~$ screen A partir de ahora todo lo que ejecutemos estará asociado a este "screen". Si la conexión se cierra, podemos recuperar lo que teníamos en ese screen con: rafa@rafa-laptop:~$ screen -rx Y aparecerá la ejecución que teníamos. screen admite muchas más opciones, como por ejemplo: Si queremos dejar un screen abierto ejecutando algún comando, pulsaremos: ^a d (CTRL+A D). Para abrir una nueva ventana: ^a c (CTRL+A C). para más info, ya sabéis: man screen

Añadir nuevas versiones de java a alternatives

Muchas veces necesitamos trabajar con distintas versiones de java. Podemos tener instaladas todas las versiones que queramos y utilizar en cada momento la que nos convenga. Para instalar una nueva versión haríamos lo siguiente: Descargas el .bin de la versión de java que queramos, le das permisos de ejecución y lo ejecutas. Una vez aceptadas las condiciones, se habrá creado una carpeta con el nombre de la versión. Mueves la carpeta a /usr/lib/jvm/. Ahora lo añadimos a alternatives: update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/version_que_sea/bin/java" 1 Para usar esta versión tan sólo tenemos que indicar lo siguiente: update-alternatives --set java /usr/lib/jvm/version_que_sea/bin/java Y listo. También podemos ver las distintas versiones que tenemos: update-alternatives --list java En mi caso, la salida sería la siguiente:

Mantener los permisos al copiar un espacio en Alfresco 3.2r

Buenas, supongo que más de uno se habrá encontrado con este bug de alfresco: http://issues.alfresco.com/jira/browse/ALF-2638 La cosa es que al copiar un espacio, se copia correctamente su contenido, pero no mantiene los permisos que tenga aplicados (lo cual es un verdadero problema cuando se trata de espacios con una estructura compleja y muchos grupos). Como de momento parece que no hay solución para este bug (si existe, por favor que me lo indiquen ;) ), he confeccionado un js para que una vez se ha hecho la copia de un espacio, se apliquen los permisos. El proceso sería: copiar y pegar el espacio, renombrarlo por "NombreDeEspacioOriginal"_COPIA (es decir, el nombre original con el sufijo _COPIA) y aplicarle una acción para que ejecute el script. //Obtiene el path del espacio _COPIA y genera el path del origen. var ruta_destino = (space.displayPath + "/" + space.name).replace("/Empresa/",""); var ruta_origen = ruta_destino.replace(&