domingo, octubre 31, 2010

Alternativa de Crear Reportes - Guia de inicio para Ireport

Tomado de:
Documentaciòn de IREPORTS

Como ya lo había prometido, a continuación un post sobre el diseñador Ireport para JasperReports. Trataré de describir la funcionalidad de este sin que este se vea comprometido con un solo sistema operativo.

OBJETIVO:
  • Conocer la utilidad de esta
  • Tener una perspectiva de manera rápida aunque no definitiva de las cosas que se pueden hacer con Ireport
  • Tener una solución bajo la manga
  • Que esta guía sea una referencia para alguien en este Cyberespacio

INTRODUCCION

¿Qué es Ireport?

  • Diseñador de reportes gráficos muy complejos si así lo requerimos para JasperReports
  • Un programa OpenSource (GPL)
  • Esta escrito al 100% en Java
  • La versión comercial de esta y la que se recomienda para la producción se llama JasperStudio la cual es mantenida por la empresa JasperSoft Corporation
  • Esta integrada en la Jasper Bussines Intelligence Suite
  • Sitio WEB

Algunas Características

  • Categoría: Bussines Intelligence
  • Soporte para TrueType
  • Manejo de múltiples fuentes de datos como: todas las bases de datos soportadas por JDBC, archivos XML, CSV, Hibernate entre otros…
  • Soporta SQL, HQL, EJBQL, MDX y Xpath
  • Wizard para la creación de reportes y sub-reportes
  • Más de 30 elementos para formatear el reporte (lineas, elipses, TextFields, charts,código de barras, etc.)
  • El núcleo de este es una biblioteca llamada JasperReports, la cual fue desarrollada por Teodor Danclu de JasperSoft Corporation
  • Los reportes generados se puede pre visualizar y/o exportar en PDF, HTML, RTF, XLS, CSV, TXT y más...

Example2

Desarrollo

Para poder ejecutar el Ireport se necesita el SDK 1.5.0 o superior, 256MB de RAM y al menos 20 megas de espacio en disco.

Estructura de los reportes

La estructura de los reportes se encuentra dividida por secciones horizontales llamadas "Bandas", las cuales son rellenadas con los datos que requerimos en una posición especifica, es aquí donde se definen las reglas del reporte

Esta divida en 9 bandas, en las cuales se pueden removidas o agregadas en el reporte, por default se muestran:

  • Titulo
  • Header de pagina
  • Header de columnas
  • Detalle
  • Pie de columna
  • Pie de pagina
  • Ultimo pie de pagina
  • Sumario




JRXML y archivos jasper

Un reporte es guardado en un archivo tipo XML el cual cada una de sus secciones se encuentra definido por jasperreport.dtd, es por eso que el archivo fuente tiene la extensión "*.JRXML" el cual contiene la configuración del reporte físicamente, las dimensiones de la pagina entre otras.

Si la compilación de este archivo se realiza de manera correcta genera entre otros un archivo con extensión "Jasper" el cual puede ser interpretado por la JVM.

Elementos y letras

Los elementos contenidos en un reporte pueden ser:

  • Lineas
  • Elipses
  • Texto estático
  • Texto Dinámico
  • Imagenes
  • Rectangulos con/sin relleno
  • Sub-reportes
  • Codigo de Barras
  • Graficas
  • HyperLink
  • etc.

Esta se encuentra en la barra de herramientas

BarraIreport

Expresiones dentro del reporte

Las expresiones que se pueden manejar dentro de un reporte son instrucciones en lenguaje Java siempre y cuando el resultado sea un objeto (Que extienda de Object pues).

Entonces desde una expresión se puede referir a parámetros, variables fields y lo que se encuentre definido dentro del reporte, aquí algunas sintaxis:


$F{field}       Especifica el nombre de un Field
$V{variable}    Especifica el nombre de una Variable
$P{parametro}   Especifica el nombre de un Parametro
$P!{parametro}  Una sintaxis especial usada en una consulta SQL, indica que
                       el parametro no debe de ser tratado como un valor por ejemplo:

                       SELECT * FROM empleado $P!(ID)}
                       Que equivale a decir dado que ID=5
                       SELECT *FROM empleado WHERE ID = 5

Además se puede usar Groovy como lenguaje dentro de las expresiones

Creación de una conexión con JDBC (Datasources)

Ireport tiene la capacidad de soportar lenguajes de consulta como: SQL, HQL, EJBL, MDX y XPath. Ahora que si no se va a utilizar una consulta a la Base de Datos, no necesitas una consulta dentro del reporte; sino un DATASOURCE

Un datasource es un objeto que itera sobre un record parecido a una tabla. JasperReport provee algunas implementaciones de DataSources que pueden ser envueltas en estructuras de datos genericas como: Arrays o Colecciones de javaBeans, result sets, table models, CSV y archivos XML.

Aquí una lista de datasource y conexiones provistas por Ireport



Plugin para NetBeans

Aqui un tutorial para poder agregar y configurar el plugin necesario para poder trabajar con Ireport desde Netbeans, el ejemplo esta basado en la distro GNU/Linux Ubuntu [2] y aqui otro hecho desde MAC [3].

CONCLUSIÓN

Espero haber logrado los objetivos planeados.

REFERENCIAS

[1] http://jasperforge.org/plugins/project/project_home.php?group_id=83
[2] http://wiki.netbeans.org/Avbravotutorialbasiconetbeansreports
[3] http://wiki.netbeans.org/NBDemoIReport


Reportes desde SCCM con Ireport

Hace mucho q no les doy una mano para SCCM 2007. Hoy voy a explicarles en simples pasos como podemos programar reportes automáticos con SCCM 2007 SP2. Esto lo podemos realizar gracias a Reporting Services que viene con MsSQL 2005. Si no tenemos este feature instalado debemos instalarlo en el servidor. Quizas tengan algún inconveniente al tratar de correr el instalador del SQL 2005 nuevamente pero tocando un poco la registry sale andando. Prometo buscar eso y postearlo cuando lo encuentre... lo perdí.Les paso el link de los prerrequisitos: link.
Deben montar el cd de SQL 2005 en el servidor o la version q hayan instalado. En ni caso particular trabaje con MsSql 2005 SP2 x64 y SCCM 2007 SP2. Deben pasar los prerrequisitos.



Importante, si ya poseen alguna base les va a pedir que corran el setup con una línea desde el cmd y el parámetro: SKUUPGRADE=1. Esto upgradeara la base de datos en cuestión.

Una vez pasado los chequeos debemos seleccionar Reporting Services para instalar y seguir los pasos del Wizard. Más datos en este link.
Una vez instalado el feature en el server deben correr el Wizard para configurarlo: "Reporting Services Configuration". Aquí les va a tirar un error poco común que se van a volver locos buscándole solución pero lo que ocurre es q al tener instalado el SP2 del MSSQL el cd quiere instalar una version anterior de Reporting Services. Entonces, antes de configurarlo debemos correr el instalador del SP2 nuevamente para que quede todo actualizado. Una vez corrido el SP2 ahora si podemos correr el Wizard de configuración sin problemas. Entre otras cosas se crean los sites para los reportes, se definen los usuarios, se crea la base de datos y otro par de temas como configuración del servidor de smtp para mandar los emails.
Luego, una vez terminado de configurar debemos instalar el role en nuestro site de SCCM. Elegimos el server y lo instalamos con el wizard. Nada dificil.

Una vez instalado podremos ingresar al apartado de Reporting Services debajo de Reports ya conocido y habilitado por default.

Allí debemos elegir el servidor al cual conectarnos y con un click derecho podremos importar desde Reports todos los reportes que ya conocemos para poder ponerlos en el site de Reporting Services y poder programarlos. Se pueden configurar totalmente, fecha, iteración, permisos, etc.
Este es un ejemplo de como se vería el site de Reporting Services de nuestro Site SCCM.

viernes, octubre 29, 2010

Copiar archivos utilizando SFTP con un SHEL Script.

Tomado de:
Crear Script para utilizar SFTP

A diario hago backup en mis servers pero los archivos quedan residentes en las mismas máquinas. Obviamente mientras el backup esté mas lejos de los datos originales menores son las probabilidades de no recuperarse de un desastre computacional.
Lo ideal seria hacer una transmisión FTPS o SFTP si estás preocupado por algun sniffer o similar, pero bueno, aquí vamos a ver la solución fácil y rápida con un shell script muy sencillo.
  1. #!/bin/sh  
  2. HOST='www.myserver.com'  
  3. USER='myuser'  
  4. PASS='mypassword'  
  5. #voy a hacer backup del folder creado ayer  
  6. YESTERDAY=$(date --date='1 day ago' +%Y%m%d)  
  7.   
  8. # pensemos que dejamos los backups diariamente en este path  
  9. # los cuales estan en folders con formato fecha cual  
  10. 20100227 (YYYYMMDD)  
  11. cd /home/myuser/backups/  
  12. # creo localmente un folder con el mismo nombre  
  13. mkdir $YESTERDAY  
  14. cd $YESTERDAY  
  15.   
  16. ftp -n $HOST <<END_SCRIPT  
  17. quote USER $USER  
  18. quote PASS $PASS  
  19. # aca vamos a la misma locacion pero en el server  
  20. cd /home/myuser/backups/$YESTERDAY  
  21. # aca es donde bajamos el archivo que queremos backupear  
  22. get backup.tar  
  23. quit  
  24. END_SCRIPT  
  25. exit 0  
Y listo, solo nos falta una entrada en el cron para correr esto a diario. Para ello:
  1. crontab -e  
Entonces agregamos el script para ser llamado diariamente
  1. 0 1 * * * /usr/share/scripts/mybackupscript.sh  
Esto soluciona grandes dolores de cabeza con mínimo esfuerzo. Que lo disfruten!

jueves, octubre 28, 2010

Copiar Archivos desde Windows/Linux a Linux con SSH o SFTP - Varias Opciones

Tomado de:
Crear un Script para copiar automaticamente

Automatizar la conexión a sFTP

En este artículo os voy a contar cómo descargar ficheros mediante sFTP (FTP encriptado) de manera automatizada; es decir, sin tener que andar ejecutando el comando ni tener que meter la clave a mano cada vez.
El script es bien sencillito:
#!/bin/bash 
# Aquí ponemos los datos de conexión
USUARIO=usuario
CLAVE=clave
HOST=miftp.com
PUERTO=22  

lftp -p${PUERTO} -u ${USUARIO},${CLAVE} sftp://${HOST} << CMD
get copia_seguridad.bz2 copia_seguridad.bz2
bye
CMD
 
Basta con que sustituyas estos datos por los de tu servidor:
USUARIO=usuario
CLAVE=clave
HOST=miftp.com
PUERTO=22
El puerto se puede dejar el de ssh por defecto, pero en varios servidores me he encontrado que usan uno distinto así que la opción para especificar el puerto es muy útil para mí.
lftp (sophisticated file transfer program) es el que se va a encargar de identificarse en el servidor mediante sftp. Todo lo que escribamos entre <
Me he pasado un buen rato hasta que he conseguido ponerlo en marcha así que lo dejo aquí por si a alguien le puede servir de ayuda.

Damos permisos de ejecucion:
chmod +x copiador.sh

Luego ejecutamos ./copiador.sh

Tambien podriamos crear una entrada en crontab


Aquí podéis ver otra forma de hacerlo

Conectar por ssh sin password


Vamos a explicar rápidamente como conectarte por ssh sin contraseña. Sera necesario copiar tu clave (la publica) al servidor, de tal forma que no sea necesario el logearte cada vez que te conectes.
Generamos la key:
ssh-keygen
Nos generara esto:
/home/myname/.ssh/id_rsa.pub
Ahora copiamos:
ssh-copy-id -i ~/.ssh/id_rsa.pub usuario_remoto@192.168.1.4
Te pedirá una vez la password del usuario_remoto y no tendrás que volver a meterla. Me parece mas seguro que escribir los datos en un script sobre todo la password ;p
Ahora con realizar esto es suficiente:
ssh usuario_remoto@192.168.1.4


Pagina Oficial del utilitario solo para Windows:


Utilitarios para acceso a Linux via SSH, que permite copiar desde Windows a computadoras con Linux.
Regularmente utilizo scripts escritos en Linux para la realizacion automatica de mis backups. Pero en esta oportunidad debo de mover los backups de MSSQL desde una pc con Windows XP hacia mi servidor de backups. Para esta tarea me recomendaron utilizar el programada PSCP, el cual es desarrollado por los mismos de mi cliente favorito de ssh para windows: putty.


Pagina Oficial del Putty

Descargar binario de PSCP

Para descargar el instalador de PSCP asi como el de putty pueden hacerlo en la pagina oficial. Para la instalacion tan solo se necesita moverlo a X carpeta.

Uso y parametros de pscp

Ya con nuestro ejecutable pscp descargado en nuestro sistema Windows, lo ejecutamos abriendo el command prompt y tecleando:
C:\Documents and Settings\Administrador\pscp
PuTTY Secure Copy client
Release 0.60
Usage: pscp [options] [user@]host:source target
       pscp [options] source [source...] [user@]host:target
       pscp [options] -ls [user@]host:filespec
Options:
  -V        print version information and exit
  -pgpfp    print PGP key fingerprints and exit
  -p        preserve file attributes
  -q        quiet, don't show statistics
  -r        copy directories recursively
  -v        show verbose messages
  -load sessname  Load settings from saved session
  -P port   connect to specified port
  -l user   connect with specified username
  -pw passw login with specified password
  -1 -2     force use of particular SSH protocol version
  -4 -6     force use of IPv4 or IPv6
  -C        enable compression
  -i key    private key file for authentication
  -noagent  disable use of Pageant
  -agent    enable use of Pageant
  -batch    disable all interactive prompts
  -unsafe   allow server-side wildcards (DANGEROUS)
  -sftp     force use of SFTP protocol
  -scp      force use of SCP protocol
Como podran ver, al teclear el comando sin ningun parametro este nos mostrara la ayuda. Entonces siguiendo las instrucciones anteriores podemos hacer nuestra copia de seguridad remota utilizando el canal encriptado de ssh que nos brinda pscp. Como ejemplo, para mi solucion utilizo
temp>pscp -r -pw contraseña C:\backups usuario@miservidor:/home/backups/
 
Donde,
  • -r , copiar los directorios recursivamente
  • -pw, password
  • C:\backups, directorios a transmitir
  • usuario, nombre del usuario en ele servidor remoto
  • miservidor, ip o nombre del servidor con el camino a donde copiar la información.
Traer archivos 
temporal>pscp -r -pw contraseña usuario@miservidor:*.doc c:\datos 

Programar el backup automaticamente en Windows XP

Para poder crear la tarea automatiza para la transferenicia segura de los archivos de la copia de seguridad, seguimos los siguientes pasos:
  1. Luego nos vamos a Inicio –> Todos los Programas –> Accesorios  –> Herramientas –> Tareas Programadas.
  2. Hacemos clic en Agregar Tarea Programada
  3. Luego clic en Examinar donde buscamos el ejecutable pscp.exe
  4. Lean y sigan los pasos del wizard.
  5. Antes de terminar la creacino de la tarea chequeamos la casilla de abrir propiedades avanzadas.
  6. En la nueva ventana, dentro de la casilla de ejecutar agregamos los parametros propios de nuestra configuracion al comando pscp.

Comentarios finales

En la casilla de ejecutar, hay que dejar los parametros fuera de las comillas dobles. Estas comillas solo deben de contener el path del comando.
Ya que no utilizo Windows Vista ni tengo acceso a Windows 7 no he puesto como programarle backup, pero ha de ser muy similar.

COMANDOS BASICOS DE SSH.

Comandos básicos de ssh

Tomado de:  

Copiar Datos

SSH es un programa que permite acceder a otro ordenador a través de la red, ejecutar comandos en la máquina remota y mover ficheros entre dos máquinas. Provee autenticación y comunicaciones seguras sobre canales inseguros. Es un reemplazo de rlogin, rsh y rcp.
Vamos a ver estos usos básicos del SSH.

ssh

El comando ssh ofrece comunicación encriptada y segura entre dos sistemas sobre una red no segura. Este comando reemplaza al telnet, rlogin, rsh.
Para iniciar una sesión en otra máquina usando ssh:
[usuario1@localhost usuario1]$ ssh usuario1@servidor.dominio.es
The authenticity of host 'servidor.dominio.es (192.168.0.2)' can't be established.
RSA key fingerprint is 97:4f:66:f5:96:ba:6d:b2:ef:65:35:45:18:0d:cc:29.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'servidor.dominio.es' (RSA) to the list of known hosts.
usuario1@servidor.dominio.es's password:
[usuario1@servidor.dominio.es usuario1]$
    
NotaLa primera vez que realizas la conexión debes aceptar la firma del otro host. De esta manera se establece una relación de confianza que se traduce en archivar la clave pública de este servidor en el fichero $HOME/.ssh/known_hosts.
La sintaxis básica del comando ssh es:
ssh user@hostname [command]
    
El comando es opcional. Si se especifica en lugar de obtener un shell se ejecuta el comando en la máquina remota. Por ejemplo podríamos hacer un ls en la máquina remota y observar su salida:
ssh usuario1@servidor.dominio.es ls
    
O realizar alguna operación mas elaborada como realizar una copia en local de un directorio remoto, como en el ejemplo:
ssh usuario1@servidor.dominio.es "tar cf - /home/usuario1" |\
                                  tar xvf -
    
Una de las funcionalidades que le da mayor potencia al ssh es la redirección de las X. Si observas la variable de entorno DISPLAY observarás que tiene la forma localhost:n.n, esta permite que al abrir cualquier aplicación gráfica su salida se redirija al display del cliente.
[usuario1@localhost usuario1]$ ssh usuario1@servidor.dominio.es
[usuario1@servidor usuario1]$ echo $DISPLAY
localhost:11.0
[usuario1@servidor usuario1]$ xeyes&
[usuario1@servidor usuario1]$
    

scp

El comando scp permite copiar ficheros entre dos máquinas. Utiliza ssh para la transmisión de la información, por lo que ofrece la misma seguridad que el ssh. De la misma manera utiliza los métodos de autenticación de ssh. Este comando reemplaza al rcp, ftp.
Este es un ejemplo de uso del scp para copiar desde la máquina local a una remota:
[usuario1@localhost]scp /tmp/file usuario1@servidor.dominio.es:/tmp
    
También podemos copiar ficheros entre dos máquinas remotas:
[usuario1@localhost]scp usuario1@anotherhost:/tmp/file \
                        usuario1@servidor.dominio.es:/tmp
    
La sintaxis del comando es:
scp [-pqrvBC46] [-F ssh_config] [-S program] [-P port] [-c cipher]
         [-i identity_file] [-o ssh_option] [[user@]host1:]file1 [...]
         [[user@]host2:]file2
    
Puedes consultar las opciones en la página man de scp, estas son las más habituales:
  • -p: conserva las propiedades del archivo. Permisos del archivo, fecha de última de modificación.
  • -r: copia recursiva de directorios
La sintaxis para especificar el origen o destino de los archivos tiene la forma [[user@]host:]file donde:
  • user: es el usuario de la máquina. Si no se especifica es el actual.
  • host: es la máquina origen o destino del archivo. Si no se informa es la máquina local.
  • file: fichero o directorio a copiar. Por defecto es el directorio HOME del usuario. En caso de ser un directorio deberás especificar la opción -r.

    Ejemplos tomado de:
    Ejemplos de SCP

    Utilizando SSH


    SCP para copiar archivos

    Una de las herramientas de las que dispone OpenSSH para transmitir archivos entre dos equipos remotos es scp, su nombre proviene de "Secure CoPy". Su manejo es bastante sencillo, básicamente hay que especificarle una lista de archivos origen y al final el archivo o ruta destino, de la siguiente manera:
    scp [[usuario@]máquina:]ruta ... [[usuario@]máquina:]ruta
    Como se puede apreciar, el formato en el que se indican los archivos a copiar es: usuario@máquina:ruta, el primer parámetro (usuario) indica el nombre de la cuenta de usuario que se quiere usar en el sistema remoto, en el caso de no espeficicarlo, se asumirá el usuario que se está empleando en el sistema local. El parámetro máquina es el nombre o la IP del equipo remoto, en caso de que sea el equipo que estamos usando omitimos este campo. Finalmete el parámetro ruta no es más que la ruta hacia el archivo que queremos copiar. A modo de ejemplo, imaginemos que queremos bajarnos el archivo a.tar.gz que esta en el directorio del usuario manolo en el equipo remoto.ejemplo.com, podríamos invocar al scp de la siguiente manera:
    [hell@local] $ scp manolo@remoto.ejemplo.com:a.tar.gz .
    manolo@remoto.ejemplo.com's password:
    a.tar.gz                100%    5008KB   1.6MB/s   00:03
    [hell@local] $
    Ahora imaginemos que queremos subir ese mismo archivo que nos hemos bajado a la carpeta personal del usuario hell en el equipo remoto.ejemplo.com, serviría algo como:
    [hell@local] $ scp a.tar.gz remoto.ejemplo.com:
    hell@remoto.ejemplo.com's password:
    a.tar.gz                100%    5008KB   1.6MB/s   00:03
    [hell@local] $
    Con scp tambíen podemos copiar archivos de varias máquinas remotas, por ejemplo, si quisiéramos bajarnos el archivo a.tar.gz del equipo remoto.ejemplo.com y el archivo b.tar.gz del equipo remoto2.ejemplo.com, asumiendo que la cuenta de usuario a usar en ambos equipos es la que estamos empleando en el equipo local, nos bastaría con:
    [hell@local] $ scp remoto.ejemplo.com:a.tar.gz remoto2.ejemplo.com:b.tar.gz .
    hell@remoto.ejemplo.com's password:
    a.tar.gz                100%    5008KB   1.6MB/s   00:03
    hell@remoto2.ejemplo.com's password:
    b.tar.gz                100%    5203KB   1.6MB/s   00:04
    [hell@local] $

    :

sftp

El comando sftp transfiere archivos entre máquinas de forma interactiva.
Los comandos interactivos son similares al clásico ftp:
[usuario1@localhost usuario1]$ sftp servidor.dominio.es
Connecting to servidor.dominio.es...
usuario1@servidor's password:
sftp> help
Available commands:
cd path                       Change remote directory to 'path'
lcd path                      Change local directory to 'path'
chgrp grp path                Change group of file 'path' to 'grp'
chmod mode path               Change permissions of file 'path' to 'mode'
chown own path                Change owner of file 'path' to 'own'
help                          Display this help text
get remote-path [local-path]  Download file
lls [ls-options [path]]       Display local directory listing
ln oldpath newpath            Symlink remote file
lmkdir path                   Create local directory
lpwd                          Print local working directory
ls [path]                     Display remote directory listing
lumask umask                  Set local umask to 'umask'
mkdir path                    Create remote directory
put local-path [remote-path]  Upload file
pwd                           Display remote working directory
exit                          Quit sftp
quit                          Quit sftp
rename oldpath newpath        Rename remote file
rmdir path                    Remove remote directory
rm path                       Delete remote file
symlink oldpath newpath       Symlink remote file
version                       Show SFTP version
!command                      Execute 'command' in local shell
!                             Escape to local shell
?                             Synonym for help
sftp>
      
Un ejemplo de uso:
[usuario1@localhost]sftp usuario1@servidor.dominio.es
sftp> get fichero
      

jueves, octubre 21, 2010

Graficas con Jfreechart.

Tomado de:  jfreechart
Documentación
Otro Espacio para leer Documentación

En los proximos dias estaremos subiendo información de como habilitar este tipo de graficas desde GENEXUS con el generador JAVA.

viernes, octubre 15, 2010

Como restaurar el panel y la barra de menú en Gnome

Tomado de: Cambiar Gnome

Hace un tiempo me decidí a tunear la apariencia del escritorio de mi Fedora 11, cosa que nunca hago porque la verdad me gusta la apariencia minimalista de gnome y prefiero dedicarle ese tiempo de configuraciones a la optimización para que esté más rápida mi compu, pero esta vez no se porque se me ocurrió hacer la salvajada de modificar los paneles y cambiar algunas opciones de nautilus. Les cuento que no me fue nada bién se desconfiguraron mis paneles, cuando minimizaba cualquier ventana, ya fuera del navegador, la terminal, nautilus, etc., se desaparecian y no aparecian en el panel, solo podia volver a ellas usando ctrl + tab, además de que se crearon enlaces físicos en el escritorio de todo el contenido de mi directorio /home/mi_usuario . Surfeando por la red encontré tres comandos que me ayudaron a resetear los paneles a su estado inicial. Aquí se los dejo:
[acho@Machine-Gun ~]$ gconftool-2 --shutdown
[acho@Machine-Gun ~]$ rm -rf ~/.gconf/apps/panel
[acho@Machine-Gun ~]$ pkill gnome-panel
Los introducen y listo, sus paneles regresan a su estado original.

jueves, octubre 14, 2010

Software para la auditoria de sistemas

Tomado de:Aplicaciones para auditoria de Red

Aqui les dejo una lista de software que les ayudara en la auditoria de sistemas, servidores, ordenadores….
Copypastea el siguiente comando en una sola linea:
yum -y install netcat hping3 kismet tcpdump ettercap nikto dsniff p0f ntop tripwire ngrep xprobe2 etherape lsof rkhunter chkrootkit yersinia nmap nmapfe wireshark aircrack-ng airsnort john kismet

*** si algun programa te dice que no lo encuentra .. eliminalo de la lista y copia y pega la misma orden sin ellos, es posible que con nuevas versiones de Centos, cambien algunos nombres.
Con esta orden de arriba se instalar los siguientes programas en vuestro servidor Centos, con lo que abreis transformado de una forma muy simple vuestro equipo en una sofisticada maquina para auditar vulnerabilidades y posibles fallos en sistemas.
Explicacion de lo que se instala :
Netcat: Utilidad que te permite abrir puertos, leer y escribir en conexiones TCP o UDP, asociar una shell a un puerto. A menudo se usa para abrir backdoors en sistemas remotos.
Hping3: Utilidad capaz de enviar cualquier tipo de paquetes ICMP/UDP/TCP y mostrar la respuesta de la máquina de destino.
ettercap: Es un sniffer que puede capturar contraseñas y producir ataques de man-in-the-middle de forma sencilla.
nikto: Escáner de servidores web que identifica versiones y detecta vulnerabilidades.

dsniff:
Sniffer especializado en la captura de passwords transmitidos a través de varios protocolos. Incluye herramientas adicionales que permiten llevar a cabo ataques de spoofing y man-in-the-middle.
p0f: Utilidad que identifica sistemas operativos de forma pasiva, es decir, escuchando el tráfico que generan sin introducir paquetes en la red.
ntop: Muestra estadisticas de uso de la red. Es como el top de unix pero aplicado a las comunicaciones en red.
tripwire: Verifica la integridad de los archivos del sistema. Detecta cambios en los ficheros ejecutables a fin de informar sobre posibles acciones no autorizadas como la instalación de backdoors.
ngrep: Es un sniffer que implementa el tradicional grep pero buscando en los paquetes que se escuchan en la red.
xprobe2: Identifica sistemas operativos de forma activa, es decir, enviando una serie de tests al sistema remoto y determinando su tipo en base a las respuestas recibidas.
etherape: Muestra graficamente estadísticas sobre la actividad de la red.
lsof: Muestra una lista de los archivos abiertos en el sistema. Util para detectar arccesos no autorizados o para ver qué ficheros está utilizando una aplicación determinada.
rkhunter: Es un detector de rootkits.
chkrootkit: Otro detector de rootkits.
yersinia: Utilidad que se aprovecha de diversas flaquezas en algunos protocols de red (STP, CDP, DTP, DHCP, HSRP. ISL, VTP…) para provocar ataques de diversos tipos.
nmap: Es el mejor escáner de puertos que existe. Implementa una gran variedad de técnicas y un excelente sistema de deteccion de sistemas operativos y versiones. Para el que no la conozca , es “LA HERRAMIENTA QUE UTILIZABA TRINITY, EN LA PELICULA MATRIX, para hackear uno de los sistemas”.
nmapfe: Front-end para nmap. Una interfaz gráfica basada en GTK.
wireshark: (antes se llamaba ethereal). Es el mejor sniffer en modo gráfico que existe. Es muy potente y sus capacidades para filtrar el tráfico lo hacen indispensable para cualquier administrador de red. Tambien hay version para Windows.
aircrack: Suite de utilidades para crackear las claves WEP utilizadas en las redes 802.11. Permiten la escucha del tráfico de la red, la inyección de paquetes y el crackeo de claves WEP de cualquier longitud.
airsnort: Utilidad para crackear claves WEP, similar a aircrack.
john: (John the Ripper) Es un excelente crackeador de contraseña. Soporta un gran numero de formatos distintos y permite bien el uso de diccionarios o el crackeo por fuerza bruta.
kismet: Identifica redes inalambricas de forma pasiva recolectando paquetes, detecta redes ocultas, clientes asociados y es capaz de sniffar el tráfico de las redes no encriptadas. Kismet es el sistema de monitorización de redes inalambricas más potente que existe en la actualidad.

Buenas Prácticas de programación en GeneXus

Tomado de: Buenas Practicas

Las Buenas prácticas de programación en GeneXus sirven para mejorar la comprensión y claridad del código, aparte de permitir unificar criterios entre los distintos programadores de la comunidad.

Las Buenas prácticas de programación en GeneXus parten de la base que el código es la mejor documentación que puede tener un sistema, por esto también es la mejor herramienta que tiene un programador de comunicar su trabajo con el resto de los programadores.

Al utilizar las Buenas prácticas de programación en GeneXus el código de la KB obtiene un valor agregado ya que adquiere:


  • Fácil integración y reutilización
  • Fácil comprensión por parte del programador
  • Unificación de criterios
  • Eliminación de zonas oscuras de código
  • Fácil comunicación entre programadores
  • Claridad y correctitud en el código
  • Incremento significable en la mantención del Software

(Ver tambien Design Tips por recomendaciones de design).

Las Buenas prácticas de programación en GeneXus están compuestas por reglas y recomendaciones.

Reglas

  • Al nombrar atributos se debe utilizar la nomenclatura GIK

  • Los atributos deben tener descripción y Help

Nombre: CliCod
     Descripción: Código de Cliente
     Help: Identificador del Cliente en el Sistema


  • Las Tablas deben tener nombres que representen la realidad y no el nombre heredado por la transacción que las crea.

Trn:  Cli2SisPro
     Tabla: Clientes


  • Las variables que hagan referencia a un atributo deben ser basadas en el mismo y tener el mismo nombre del Atributo, si la lógica lo permite.

Atributo: CliCod - C(20)  - Código de Cliente    
     Variable: &CliCod - C(20)  - Código de Cliente


  • Las variables que hagan referencia a un atributo deben ser basadas en el mismo y tener el mismo nombre del Atributo, agregando uno más sufijos para calificarla en el caso que sea necesario (Agregado AdeL 05jul08).

     Atributo: CliCod - C(20) - Código de Cliente
     Variable: &CliCodOri - C(20) - Código de Cliente de Origen      <-----  Correcto
     Variable: &CliCodDst - C(20) - Código de Cliente de Destino     <-----  Correcto
     Variable: &CliDstCod - C(20) - Código de Cliente de Destino     <-----  Incorrecto

  • Definición de Subtipos
Se recomienda que al definir subtipos estos pertenezcan a un grupo especifico y no sean definidos en el grupo "None"

Cada grupos de subtipos debería tomar el nombre del Atributo Subtipo que identifica al Grupo (primario), o una concatenación de nombres si hay varios primarios, como en el siguiente ejemplo (Agregado AdeL 05jul08)
Nombre del Grupo:  BancoCodOrigen
Subtipos                                Supertipo

     BancoCodOrigen                          BancoCod
     BancoNombreOrigen                       BancoNombre

  • Reporte de Especificación
Se considera una buena práctica que el Analista GeneXus revise con atención el reporte de especificación ya que está es la principal herramienta que tiene para detectar errores en el código.
  • Definición de Reglas

En ocasiones al no existir un criterio dentro de la comunidad para definir las Rules el código queda bastante "duro" para entender y difícil de buscar el comportamiento que se programo para un atributo en particular.

Ej:
Parm(in:EmpCod, in:&Usuario, in:&CliCod, in:&Mode);

noaccept(CiuCod);

&CliSaldoAux = udp(PcalcSaldo, EmpCod, &CliCod, CliSaldo);

error('Mensaje') If Null(&Usuario);

allownulls(EmpCod, LocCod ) ;

Call(PActInfo, EmpCod, CliCod) if <cond>;

error('Mensaje') IF CliDir = nullvalue(CliDir ) and after(CliDir) ;

prompt(Wclientes, EmpCod, CliCod);

default(CliFchCrea, Now() ) ;

noaccept(EmpCod);

Call(PInfoUsr, EmpCod,&Usuario) if <cond>;

nocheck(EmpCod, LocCod);

msg('Saldo menor que cero') if CliSaldo < 0;

Refcall(Wclientes, EmpCod, CliCod);

Call(Pprocedure, EmpCod, CliCod) if <cond>;

default(CliArea, 'A' ) ;


Si observamos este código nos damos cuenta que para buscar algo tenemos que recorrer hasta el final ya que no muestra ningún criterio a seguir. Existen muchas maneras de definir las rules para que sean fáciles de entender, pero vamos a tomar dos criterios que serán vistos como buenas prácticas.

Criterio Nro. 1

Definir las rules agrupadas por atributo:
De está manera podemos seguir el comportamiento que se programo para un atributo o variable en particular.

Ej:
Parm(in:EmpCod, in:&Usuario, in:&CliCod, in:&Mode);

error('Mensaje') If Null(&Usuario);
Call(PInfoUsr, EmpCod,&Usuario) if <cond>;

allownulls(EmpCod, LocCod ) ;
nocheck(EmpCod, LocCod);

Call(PActInfo, EmpCod, CliCod) if <cond>;
Call(Pprocedure, EmpCod, CliCod) if <cond>;
prompt(Wclientes, EmpCod, CliCod);
Refcall(Wclientes, EmpCod, CliCod);

error('Mensaje') IF CliDir = nullvalue(CliDir ) and after(CliDir) ;

default(CliFchCrea, Now() ) ;
default(CliArea, 'A' ) ;

noaccept(EmpCod);
noaccept(CiuCod);

msg('Saldo menor que cero') if CliSaldo < 0;
&CliSaldoAux = udp(PcalcSaldo, EmpCod, &CliCod, CliSaldo);

Criterio Nro. 2 (Recomendado)

Agrupar las Rules por comportamiento

De está manera podemos ir directamente al sector del código en donde detectamos que está el error o para agregar comportamiento.
Ej:
Parm(in:EmpCod, in:&Usuario, in:&CliCod, in:&Mode);
noaccept(EmpCod);
noaccept(CiuCod);

allownulls(EmpCod, LocCod ) ;
nocheck(EmpCod, LocCod);

default(CliFchCrea, Now() ) ;
default(CliArea, 'A' ) ;

error('Mensaje') If Null(&Usuario);
error('Mensaje') IF CliDir = nullvalue(CliDir ) and after(CliDir) ;
msg('Saldo menor que cero') if CliSaldo < 0;


Call(PInfoUsr, EmpCod,&Usuario) if <cond>;
Call(PActInfo, EmpCod, CliCod) if <cond>;
Call(Pprocedure, EmpCod, CliCod) if <cond>;
&CliSaldoAux = udp(PcalcSaldo, EmpCod, &CliCod, CliSaldo);

prompt(Wclientes, EmpCod, CliCod);
Refcall(Wclientes, EmpCod, CliCod);


/* Comentario: Andrés Cuñarro
Para el caso de agrupar las reglas por comportamiento resulta práctico indicar el cometido ya que algunas veces se deben utilizar rules distintas para cumplir un cometido.
Si se incluyen éstas (u otras) secciones en un style, se define un criterio standard para una Kb.*/

Por ejemplo:

parm( parm1, parm2, ...);

//INSTANCIAR REGISTRO (PARAMETRO)

//VALORES POR DEFECTO
default(CliFchCrea, Now() ) ;

//INTERFASE
noaccept(EmpCod);

//DEPENDENCIAS FUNCIONALES
CliEdad = Age(CliFchNac);

//INTEGRIDAD REFERENCIAL
allownulls(EmpCod, LocCod ) ;
nocheck(EmpCod, LocCod);

//VALIDACION DE CAMPO
error("Nombre de cliente incorrecto.") if null(CliNom);

//VALIDACION DE REGISTRO
error("La fecha de vencimiento no puede ser menor a la del documento.") if DocFchVenc < DocFch;

//PROMPTS
prompt(WClientes, CliCod);

//ACCIONES
Call(PInfoUsr, EmpCod,&Usuario) if <cond>;



Recomendaciones

  • La descripción de los objetos de la KB debe ser clara independientemente del nombre del mismo.

Nombre: ModCliDeuda
     Descripción: Modificación de Cliente con Deuda


  • Se debe tener un método para dar nombre a los objetos. Esto depende mucho del tamaño de la(s) KB(s), tipo de instalación, criterios heredados y otra cantidad de factores, pero algunas cosas a tener en cuenta serían (Agregado por AdeL 05jul08).
    • Al principio del objeto, un par de letras que identificara la aplicación (p.e. 'PE' para una aplicación de Personal, 'CO' para una aplicación de Compras). Esto podría ser opcional, dependiendo del ambiente.
    • Un identificador de la Entidad sobre la cual trabaja el objeto (p.e. Clientes, Facturas, Impuestos), la cual también podría ser nemotécnica (p.e. Cli, Fact, Imp)
    • Uno o más verbos, combinados con palabras o abreviaturas que identiquen someramente qué hace el objeto (Calcular, Borrar, Modificar, Crear).
  • La descripción de los objetos debe contener primero el objeto y después la acción que se ejecuta.
Nombre                      Descripción     
CliDeudaModificar           Cliente con Deuda - Modificar
FactIngresar                Factura - Ingresar
COOrdenCompraImpCalcular    Orden de Compra - Impuestos - Calcular     (este sería un objeto de la KB de Compras, p.e. en un ambiente de desarrollo distribuido)
VEClientesTrabCon           Clientes - Trabajar con                    (este sería un objeto de la KB de Ventas, p.e. en un ambiente de desarrollo distribuido)



  • Utilizar nombres nemotécnicos para las variables que no correspondan a ningún atributo del sistema.

Se quiere cargar en una variable la existencia de un cliente.
     Forma correcta: ExisteCliente
     Forma Incorrecta: Flag


  • Utilizar nombres nemotécnicos para los objetos de la KB

TrabajarConClientes


  • En el encabezado de los programas se debe hacer un cuadro con una pequeña descripción del propósito del mismo y datos útiles.

/* 
       Autor: Cristhián Gómez (urulinux@adinet.com.uy)
       Fecha de Creación: 26-06-2004
       Ultima modificación:  27-06-2004
       Versión: 1.2
       Descripción: Cambia el estado de los movimientos luego de la autorización del Usuario
     */


  • Colocar una línea en blanco entre las definiciones de eventos o subrutinas para separar los mismos y hacer más comprensibles los programas.

  • Dentro de los eventos se debe comenzar a escribir código luego de hacer un tab., esto facilita la visualización del código

// Forma incorrecta:
     Event 'NuevoCli'
     If &CliCod = &Cliente
         //Codigo
     Endif
     EndEvent

     // Forma Correcta:
     Event 'NuevoCli'
         If &CliCod = &Cliente
             //Codigo
         Endif
     EndEvent


  • Para que los ForEach queden más claros y fáciles de identificar dentro de los eventos o del código en general, se recomienda que se escriban de la siguiente manera:

// Forma Incorrecta:
     Event 'NuevoCli'
     For Each
     where CliCod = &CliCod
     //Còdigo
     EndFor
     EndEvent 

     // Forma correcta:
     Event 'NuevoCli'
         For Each
             where CliCod = &CliCod
             //Còdigo
         EndFor
     EndEvent 


  • Para que los filtros de los ForEach queden más claros se recomienda tener un where para cada condición y no utilizar AND.

//Forma incorrecta:
     For Each
         where CliCod = &CliCod and CliStatus = &CliStatus and CliTipo = &CliTipo
         //Còdigo
     EndFor

     // Forma correcta:
     For Each
         where CliCod = &CliCod
         where CliStatus = &CliStatus
         where CliTipo = &CliTipo

        //Código
     EndFor
 


/* Comentario de Gabriel Icasuriaga
Otra opcion es definir toda la declaracion del for each sin indentar y recien indentar cuando comienza el codigo
aparte de eso, prefiero poner todos los atributos aunque esto sea redundante, asi de esta forma, cuando otra persona ve el codigo
la comprension es mas rapida. Tambien me gusta como quedan los "=" a la misma altura.
For Each Clicod, CliStatus
Where CliCod    = &CliCod
Where CliStatus = &CliStatus
Where CliTipo    = &CliTipo
   
         //Codigo 

 EndFor


/* Comentario de Nicolas Jodal: me gusta mas la version original */

/* Comentario de: Jorge Ronald Cribb - Vikam Corporation
Sugiero esta otra forma:
  • Las palabras reservadas de GENEXUS con MAYUSCULAS
  • Indentación de 4 caracteres para las opciones del FOR EACH.
  • Los conectores AND e OR indentados dentro de la opción WHERE.
FOR EACH Clicod, CliStatus
     WHERE CliCod    = &CliCod
         AND CliStatus = &CliStatus
         AND CliTipo    = &CliTipo
   
         //Codigo 

 ENDFOR


/* Comentario de Edson Geovane - Vikam Corporation
Eu só acrescentaria o uso da clausula 'defined by' após as sentenças WHERE. Acho importante porque define a tabela que será lida e ajuda ao programador identificar rapidamente esta tabela. Vamos incentivar os programadores ler os programas e entender como se fosse um idioma.

/* Comentario de: Jorge Ronald Cribb - Vikam Corporation
Para mejorar la compresión del programa sin embargo yo preferiría que el ESPECIFICADOR de Genexus escribiese al lado de cada FOR EACH (como comentario) la relación de TABLAS que está usando ese FOR EACH con toda la secuencia de JOINS e OPCIONES DE ORDER que será efectuada.
Ejemplo:
FOR EACH Clicod, CliStatus   // GX: CLIENTES
     WHERE CliCod    = &CliCod
         AND CliStatus = &CliStatus
         AND CliTipo    = &CliTipo
         //Codigo 
 ENDFOR

Nota: En este caso el comentario que dice "// GX: CLIENTES" seria colocado automaticamente por Genexus después de la especificación del objeto.
Aclarando un poco mas todavía: La información que sería colocada por Genexus en el fuente sería del mismo tipo que coloca en el informe/listado de navegación del objeto (pero un poco mas resumida).


/* Comentario de Demetrio Toledo.
Generalmente acostumbro identificar siempre a la tabla base donde voy a trabajar con el For Each utilizando la Sentencia Defined By, de la siguiente manera.
FOR EACH Clicod, CliStatus   // GX: CLIENTES
       Where CliCod    = &CliCod
       Where CliStatus = &CliStatus
       Where CliTipo    = &CliTipo
       Defined By CliEstReg
         //Codigo 
 ENDFOR

De esta manera se identifica correctamente la tabla base.
Lo cual definitivamente da la posibilidad de que cada tabla tenga por definicion un atributo que contemple la situacion del registro, en una especie de auditoria, en este caso el CliEstReg, no indicara la situacion del registro 2=MODIFICADO 4=ELIMINADO O 1=CREADO...

/* Comentario de Adilson Costa.
Aproveitando o comentário anterior onde é identificada a tabela base, além de informar o nome da tabela, identifico também a sua descrição.
Utilizo também a mesma informação no fechamento do For Each para facilitar quando estamos utilizando For Each aninhados.
For Each Order Clicod, CliStatus        // Clientes -> Tabela de Clientes
    Where CliCod    = &CliCod
    Where CliStatus = &CliStatus
    Where CliTipo    = &CliTipo

    //Codigo 

EndFor // Clientes -> Tabela de Clientes
/* Comentário de Fabiano Gorziza
Me parece que a boa prática aqui é, independente da forma escolhida, definir um padrão para toda a empresa.

/* Comentario de Andrés Rodríguez
Mi forma es parecida a estas últimas pero mientras genexus no describa automáticamente la tabla que se recorre, yo lo escribo manualmente para ayudar a otros que entiendan el código y para que, en el futuro al colocar cosas dentro del for each sea posible verificar que siga recorriendo lo mismo que antes. Estoy de acuerdo en poner los = a la misma altura y a indentar los where. En lo personal coloco un espacio en blanco luego de los where o defined by.

For Each Order Clicod, CliStatus        // TBL: CLIENTES
    Where CliCod    = &CliCod
    Where CliStatus = &CliStatus
    Where CliTipo   = &CliTipo

    //Codigo 
EndFor // TBL: CLIENTES 

  • Colocar un espacio después de cada coma(,) en las rules, call, udp,etc. para hacer los programas más fáciles de entender.

// Forma incorrecta:
     parm(&CliCod,&UsuCod,&Tipo);
     call(MiObjeto,CliCod,UsuCod,&Tipo)
     // Forma correcta:
     parm(&CliCod, &UsuCod, &Tipo);
     call(MiObjeto, CliCod, UsuCod, &Tipo)


  • Evitar abreviar excesivamente
Los nombres de las variables, subrutinas, objetos, etc deben de ser lo más claro posibles ya que si alguien externo debe trabajar con el código deberá, además de entender el código en general, deberá estar descifrando los nombres de cada variable, etc.
Ej: Se quiere cargar en una variable el cliente por proveedor
//Forma Incorrecta:
   &CPProv

   //Forma correcta:
   &ClientePorProveedor



  • Claridad en el código
La claridad en el código también se considera una buena práctica de programación, en muchos casos por costumbre los programadores abusan del uso del "if" olvidando que existe el comando "Do Case". En muchas ocasiones esto se debe a que las primeras versiones de GeneXus no soportaban este comando y la costumbre es más fuerte que el cambio.


  • Los atributos deben estar basados en Domains
Hay que tratar que todos los atributos estén siempre basados en algún Domain, de esta manera es más fácil adaptarse a los cambios de tipos o largos.

  • Utilización de Patterns
Se recomienda que toda aplicación web utilice Patterns, los patterns de GeneXus nos ofrecen una herramienta ideal para crear aplicaciones web. Facilitan la migración de ambiente win a web y nos ofrecen una forma práctica de solucionar problemas que antes nos llevaban mucho tiempo. Por más información leer Patterns.

  • Evitar constante en el codigo
Usar los enumerators en vez de constantes en el codigo. De esa manera si se cambia la constante no es necesario cambiar en todos los lados que se usa.

&Type = "CR" // BAD

&Type = BalanceType.Credit // GOOD


  • Mantenimiento de Kb´s

La naturaleza de la mayoría de los proyectos nos lleva a que estemos haciendo cambios constantemente en el conocimiento inicial que tenemos almacenado en una KB. Los cambios en los requerimientos de los clientes disparan un montón de acciones que en ocasiones hace que modifiquemos gran parte de nuestra lógica de negocio.

Esto lleva a que existan KB´s que tienen muchos objetos, atributos y tablas que no se utilizan o que se dejaron de utilizar por algún cambio o refactoring en el código. Esto hace que en la KB exista conocimiento duplicado o innecesario y a medida que una KB crece también crecen los tiempos de producción.

Existen tareas que se hacen a menudo que sin darnos cuenta podemos optimizar haciendo un mantenimiento del conocimiento existente en una KB. Haciendo un buen mantenimiento podemos bajar los tiempos de:

    • Build All

    • Copy Model

    • Update Model

    • Generate Help

    • Publicación de Información con GXPublic

    • Respaldos

Seria bueno si en ocasiones nos tomamos un tiempo para borrar todos los objetos, atributos, dominios, subtipos y tablas que no utilicemos. Esto mejorara los tiempos de producción y ayudara a que mi KB tenga el conocimiento que necesita para responder a mis necesidades.

Una de las cosas que hace que una KB crezca es tener modelos sin utilizar, en muchos casos no queda más remedio que tener varios
modelos de prototipo y producción. Como recomendación seria bueno eliminar todos los modelos que no se utilicen en una KB.


  • Encapsular código mediante el uso de Atributos Fórmula

Un aspecto muy relevante a la hora de mantener el software es tener centralizado la definición de los distintos cálculos que se realizan sobre los datos. Para ello lo recomendado es tener incorporado estos cálculos como Atributos Fórmula. De esta manera nos aseguramos que cuando cambia el cálculo que se requiere realizar para obtener una determinada información, se cambia el atributo fórmula y esto tiene incidiencia sobre TODO el sistema.

Por último una nomenclatura Propuesta para los casos en que la definición de un Att fórmula esté basada en un procedimiento Ej: CliSdoRes = udp(P...) el Nombre del Procedimiento debe ser igual al nombre del Atributo. Para el Ejemplo anterior quedaría CliSdoRes = udp(PCliSdoRes,...), otra opción es anteponer en el nombre del procedimiento la partícula "Frm", en el ejemplo citado quedaría CliSdoRes = udp(PFrmCliSdoRes,...)