<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux, Java y programación &#187; linux</title>
	<atom:link href="http://casidiablo.net/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Mon, 08 Mar 2010 03:41:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Vino oficial de Debian</title>
		<link>http://casidiablo.net/vino-oficial-de-debian/</link>
		<comments>http://casidiablo.net/vino-oficial-de-debian/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 23:54:14 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[off-topic]]></category>
		<category><![CDATA[vino]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3647</guid>
		<description><![CDATA[

Esta pequeña entrada la pongo porque me pareció bastante curioso&#8230; se trata de un vino oficial de Debian que, por cierto, se ve delicioso. Según me cuentan, el vino lo presentaron en el Debconf que se hizo en extremadura españa.

Aunque la foto de la derecha me deja algo desconcertado&#8230; ¿por qué le toman la foto [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fvino-oficial-de-debian%2F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FaHkubO%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Vino%20oficial%20de%20Debian%22%20%7D);"></div>
<p>Esta pequeña entrada la pongo porque me pareció bastante curioso&#8230; se trata de un vino oficial de Debian que, por cierto, se ve delicioso. Según me cuentan, el vino lo presentaron en el <a href="http://www.debian.org/News/2009/20090722">Debconf que se hizo en extremadura españa</a>.</p>
<p align="center"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/debian-vino.jpg" title="debian vino" width="300" height="450" /><a href="http://www.flickr.com/photos/aigarius/3745140041/"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/vino-debian.jpg" title="vino debian" width="300" height="450" /></a></p>
<p>Aunque la foto de la derecha me deja algo desconcertado&#8230; ¿por qué le toman la foto al lado de un Mac Book? En fin&#8230; <a href="http://www.cafe-libertad.de/shop/essen-trinken/wein-rum/debian-wein.html?id=271&#038;category=17&#038;___store=english&#038;___from_store=espanol">puedes adquirir tu propio vino por 5.8 euros</a> más costes de envío (supongo).</p>
<p> Gracias a petox que me lo envió por correo <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Más información: http://wiki.debian.org/DebianWine</p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/debian/" rel="tag nofollow">Debian</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/vino/" rel="tag nofollow">vino</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/vino-oficial-de-debian/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Usando el System Tray desde Java</title>
		<link>http://casidiablo.net/systray-java-ejemplo/</link>
		<comments>http://casidiablo.net/systray-java-ejemplo/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 13:55:04 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[area]]></category>
		<category><![CDATA[awt]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[jpoupmenu]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[notificacion]]></category>
		<category><![CDATA[system tray]]></category>
		<category><![CDATA[systray]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3625</guid>
		<description><![CDATA[

En esta ocasión vamos a aprender usar el System Tray desde una aplicación hecha en Java. El System Tray o área de notificaciones, es el espacio en el escritorio en donde &#8216;residen&#8217; aplicaciones que el sistema está ejecutando, pero que no tienen en foco de lo que estamos haciendo.
Antes se usaban librerías nativas + JNI [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fsystray-java-ejemplo%2F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FckC2zY%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Usando%20el%20System%20Tray%20desde%20Java%22%20%7D);"></div>
<p style="text-align: justify;">En esta ocasión vamos a aprender usar el System Tray desde una aplicación hecha en Java. El System Tray o área de notificaciones, es el espacio en el escritorio en donde &#8216;residen&#8217; aplicaciones que el sistema está ejecutando, pero que no tienen en foco de lo que estamos haciendo.</p>
<p style="text-align: justify;"><strong>Antes</strong> se usaban librerías nativas + JNI para lograr esto, pero desde hace un tiempo se incluyeron en el API de Java 6 las clases SystemTray y TrayIcon (dentro del paquete java.awt) lo cual nos facilita mucho las cosas.</p>
<p style="text-align: center;"><img class="size-full wp-image-3638 aligncenter" title="windowsxp" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/windowsxp.png" alt="" width="325" height="173" /></p>
<h3>0. Entendiendo las clases SystemTray y TrayIcon + Prerrequisitos</h3>
<p style="text-align: justify;">Antes que nada, debes tener instalada una versión reciente del JDK6. La clase <code><a href="http://java.sun.com/javase/6/docs/api/java/awt/SystemTray.html">java.awt.SystemTray</a> </code>representa el System Tray del escritorio. Para manipular dicha clase es necesario obtener un objeto estático de esta usando el método <code>SystemTray.getSystemTray() </code> (es decir, no es posible crear instancias de dicha clase). Además, es necesario verificar que el uso de esta clase sea soportada en el sistema donde se ejecuta. Esto lo hacemos usando el método estático <code>SystemTray.isSupported()</code>. Si no hay soporte, este método retornará false. Si haces un llamado al método <code>getSystemTray</code> y tu sistema no está soportado, se lanzará la excepción <code>java.lang.UnsupportedOperationException</code>.</p>
<p style="text-align: justify;">La instancia de <code>SystemTray</code> contiene uno o más <code>TrayIcons</code>, los cuales son añadidos usando el método <code>add(java.awt.TrayIcon)</code>, y son eliminados con el método <code>remove(java.awt.TrayIcon)</code>.</p>
<p><span id="more-3625"></span></p>
<h3>1. Ejemplo de uso</h3>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java; highlight: [8,10,46,50];">import java.awt.*;
import java.awt.event.*;
public class EjemploSystemTray {
    public EjemploSystemTray() {
        //se declara el objeto tipo icono
        final TrayIcon iconoSystemTray;
        //se verifica que el SystemTray sea soportado
        if (SystemTray.isSupported()) {
            //se obtiene una instancia estática de la clase SystemTray
            SystemTray tray = SystemTray.getSystemTray();
            //esta es la imagen de icono
            Image imagenIcono = Toolkit.getDefaultToolkit().getImage(&quot;icono.png&quot;);
            //este listener nos permite capturar cualquier tipo de evento
            //que se haga con el mouse sobre el icono
            MouseListener mouseListener = new MouseListener() {
                public void mouseClicked(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse clicked!&quot;);
                }
                public void mouseEntered(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse entered!&quot;);
                }
                public void mouseExited(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse exited!&quot;);
                }
                public void mousePressed(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse pressed!&quot;);
                }
                public void mouseReleased(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse released!&quot;);
                }
            };
            //este listener se asociara con un item del menu contextual
            //que aparece al hacer click derecho sobre el icono
            ActionListener escuchadorSalir = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println(&quot;Saliendo...&quot;);
                    System.exit(0);
                }
            };
            //menu que aparece al hacer click derecho
            PopupMenu popup = new PopupMenu();
            MenuItem item = new MenuItem(&quot;Exit&quot;);
            item.addActionListener(escuchadorSalir);
            popup.add(item);
            //iniciamos el objeto TrayIcon
            iconoSystemTray = new TrayIcon(imagenIcono, &quot;Prueba System Tray&quot;, popup);
            //este tipo de listener captura el doble click sobre el icono
            ActionListener accionMostrarMensaje = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    iconoSystemTray.displayMessage(&quot;Titulo mensaje&quot;,
                            &quot;Este es el contenido del mensaje!&quot;,
                            TrayIcon.MessageType.INFO);
                }
            };

            iconoSystemTray.setImageAutoSize(true);
            iconoSystemTray.addActionListener(accionMostrarMensaje);
            iconoSystemTray.addMouseListener(mouseListener);

            //se debe capturar una excepción en caso que falle la adicion de un icono
            try {
                tray.add(iconoSystemTray);
            } catch (AWTException e) {
                System.err.println(&quot;No es posible agregar el icono al System Tray&quot;);
            }
        }
        else
            System.err.println(&quot;Tu sistema no soporta el System Tray&quot;);
    }
    public static void main(String[] args) {
        new EjemploSystemTray();
    }
}</pre>
<p><!--INFOLINKS_ON--><br />
Así se ve en Linux (usando Gnome) y en Windows7:</p>
<p style="text-align: center;"><img title="en gnome" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/gnome.png" alt="" /> <img title="en-windows7" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/windows7.png" alt="" /></p>
<p style="text-align: justify;">Del ejemplo anterior veamos las líneas más importantes:</p>
<ul>
<li style="text-align: justify;">Línea 8: verificamos que tengamos soporte.</li>
<li style="text-align: justify;">Línea 10: obtenemos una instancia de la clase SystemTray.</li>
<li style="text-align: justify;">Línea 46: creamos el icono que vamos a añadir.</li>
<li style="text-align: justify;">Línea 50: invocación del método displayMessage para mostrar globos de notificación.</li>
<li style="text-align: justify;">Línea 62: añadimos el icono al systray.</li>
</ul>
<h3>2. ¿Cómo usar Swing en vez de AWT?</h3>
<p style="text-align: justify;">Si te fijaste bien, el SystemTray es una clase que pertenece al paquete AWT&#8230; por alguna razón no se tuvo en cuenta Swing en todo esto. Es por ello que no podemos usar directamente <code>JPopupMenu</code> en vez de <code>PopupMenu</code>. Además, <code>JPopupMenu</code> tampoco es una subclase de <code>PopupMenu</code> por lo cual no podemos usar polimorfismo <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley' /> </p>
<p style="text-align: justify;">Afortunadamente hay algunos trucos para hacerlo funcionar con Swing que nos proporciona varias ventajas: la apariencia del menú sería igual en cualquier sistema operativo, podemos añadir iconos a los items, etc.</p>
<p style="text-align: justify;">El truco más sencillo del cual tengo conocimiento lo leí en el blog de Artem Ananiev, en un post llamado <a href="http://weblogs.java.net/blog/2006/05/04/using-jpopupmenu-trayicon">Using JPopupMenu in TrayIcon</a>. He preparado entonces otro ejemplo sencillo en donde se muestra cómo lograr esto:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java; highlight: [40,41,42,43,44];">import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EjemploSystemTraySwing {
    public EjemploSystemTraySwing() {
        //se declara el objeto tipo icono
        final TrayIcon iconoSystemTray;
        //se verifica que el SystemTray sea soportado
        if (SystemTray.isSupported()) {
            //se obtiene una instancia estática de la clase SystemTray
            SystemTray tray = SystemTray.getSystemTray();
            //esta es la imagen de icono
            Image imagenIcono = Toolkit.getDefaultToolkit().getImage(&quot;icono.png&quot;);
            //este listener se asociara con un item del menu contextual
            //que aparece al hacer click derecho sobre el icono
            ActionListener escuchadorSalir = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println(&quot;Saliendo...&quot;);
                    System.exit(0);
                }
            };
            //menu que aparece al hacer click derecho
            final JPopupMenu popup = new JPopupMenu();

            //aniadir un menu con icono (swing)
            JMenuItem carita = new JMenuItem(&quot;casidiablo.net&quot;,  new ImageIcon(&quot;carita.png&quot;));
            popup.add(carita);
            popup.addSeparator();

            //aniadir el item de salir
            JMenuItem item = new JMenuItem(&quot;Exit&quot;, new ImageIcon(&quot;salir.png&quot;));
            item.addActionListener(escuchadorSalir);
            popup.add(item);
            //iniciamos el objeto TrayIcon
            iconoSystemTray = new TrayIcon(imagenIcono, &quot;Prueba System Tray&quot;, null);
            iconoSystemTray.setImageAutoSize(true);
            //iconoSystemTray.addMouseListener(mouseListener);
            iconoSystemTray.addMouseListener(new MouseAdapter() {
                public void mouseReleased(MouseEvent e) {
                    if (e.isPopupTrigger()) {
                        popup.setLocation(e.getX(), e.getY()-50);
                        popup.setInvoker(popup);
                        popup.setVisible(true);
                    }
                }
            });
            //se debe capturar una excepción en caso que falle la adicion de un icono
            try {
                tray.add(iconoSystemTray);
            } catch (AWTException e) {
                System.err.println(&quot;No es posible agregar el icono al System Tray&quot;);
            }
        }
        else
            System.err.println(&quot;Tu sistema no soporta el System Tray&quot;);
    }
    public static void main(String[] args) {
        new EjemploSystemTraySwing();
    }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">El resultado es algo como lo que aparece en la primera imagen que acompaña esta entrada. Importante tener en cuenta las líneas resaltadas (40 a 44) que es donde se hace la <em>magia</em> <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Como siempre, puedes descargar el código y probar tú mismo:</p>
<p><a href="http://casidiablo.net/descargar/Ejemplos+System+Tray+Java" class="descargacodigo">Descargar ZIP con ejemplos</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/area/" rel="tag nofollow">area</a>, <a href="http://casidiablo.net/tag/awt/" rel="tag nofollow">awt</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/jpoupmenu/" rel="tag nofollow">jpoupmenu</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/mac/" rel="tag nofollow">mac</a>, <a href="http://casidiablo.net/tag/notificacion/" rel="tag nofollow">notificacion</a>, <a href="http://casidiablo.net/tag/system-tray/" rel="tag nofollow">system tray</a>, <a href="http://casidiablo.net/tag/systray/" rel="tag nofollow">systray</a>, <a href="http://casidiablo.net/tag/windows/" rel="tag nofollow">Windows</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/systray-java-ejemplo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Códigos de shell script útiles en cualquier programa</title>
		<link>http://casidiablo.net/codigos-de-shell-script-utiles/</link>
		<comments>http://casidiablo.net/codigos-de-shell-script-utiles/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 03:23:46 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Arch Linux]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[comandos]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3588</guid>
		<description><![CDATA[

A continuación voy a poner algunos snippets de código de shell script que me han sido siempre útiles cuando escribo algún script. La mayoríá funcinoan en cualquier shell de Unix, aunque algunos requieren que sean ejecutados por Bash.
Evitar que usuarios sin privilegios ejecuten el script
Algunos scripts realizan tareas administrativas por lo cual podríamos querer que [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fcodigos-de-shell-script-utiles%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22C%C3%B3digos%20de%20shell%20script%20%C3%BAtiles%20en%20cualquier%20programa%22%20%7D);"></div>
<p style="text-align: justify;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/01/bash.png" alt="shell script" title="shell script" width="80" height="80" style="float:left;padding:5px;" />A continuación voy a poner algunos snippets de código de shell script que me han sido siempre útiles cuando escribo algún script. La mayoríá funcinoan en cualquier shell de Unix, aunque algunos requieren que sean ejecutados por <strong>Bash</strong>.</p>
<h3>Evitar que usuarios sin privilegios ejecuten el script</h3>
<p style="text-align: justify;">Algunos scripts realizan tareas administrativas por lo cual podríamos querer que solo el usuario root ejecute el script. En ese caso podemos usar algo como esto:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo &quot;Este script debe ser ejecutado por el usuario root&quot; 1&gt;&amp;2
    exit 1
fi</pre>
<p><!--INFOLINKS_ON--></p>
<h3>Permitir la ejecución del script solo a un usuario específico</h3>
<p style="text-align: justify;">De manera similar al código anterior, podríamos querer que solo un usuario específico ejecute el script. Lo hacemos así:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/bin/bash
AUTHORIZED_USER=&quot;usuario_permitido&quot;
if [ $USER != $AUTHORIZED_USER ]; then
    echo &quot;Este script debe ser ejecutado por el usuario $AUTHORIZED_USER&quot; 1&gt;&amp;2
    exit 1
fi</pre>
<p><!--INFOLINKS_ON--></p>
<h3>Verificar que un servicio/proceso se está ejecutando</h3>
<p style="text-align: justify;">Si queremos saber si existen procesos de algún servicio o programa ejecutándose podríamos usar este script (en este caso verifica que el demonio de Apache esté corriendo):</p>
<p><span id="more-3588"></span></p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/bin/sh
SERVICE='httpd'
if ps ax | grep -v grep | grep $SERVICE &gt; /dev/null
then
    echo &quot;El servicio $SERVICE esta ejecutandose&quot;
else
    echo &quot;Chanfle! El servicio $SERVICE esta detenido&quot;
fi</pre>
<p><!--INFOLINKS_ON--></p>
<h3>Verificar que una variable esté asignada/tenga datos</h3>
<p style="text-align: justify;">Hay bastantes maneras de hacer esto en shell script&#8230; la que considero más sencilla y concisa es esta:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/bin/bash
FOO=
: ${FOO:?&quot;No existe la variable FOO o no tiene datos&quot;}
echo &quot;esto nunca se va a imprimir&quot;</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">El anterior script verifica si una variable existe y tiene datos; si esto no se cumple, el script se cierra. Podemos usar esta variación en donde solo comprobamos que la variable exista, sin importar si tiene datos o no:</code></p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/bin/bash
FOO=
: ${FOO?&quot;No existe la variable FOO&quot;}
echo &quot;esto si se va a imprimir&quot;</pre>
<p><!--INFOLINKS_ON--></p>
<h3>Crear un archivo de bloqueo</h3>
<p style="text-align: justify;">A veces debemos asegurarnos que el script no se ejecute dos o más veces simultáneas. Para ello podemos hacer uso de los archivos de bloqueo. Esta es una versión sencilla de un script que nos permite hacer esto:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/bin/bash
lockfile=/var/lock/loquesea.lock
if [ ! -e $lockfile ]; then
   touch $lockfile
   echo &quot;hago muchas cosas importantes aqui&quot;
   rm $lockfile
else
   echo &quot;ya hay otro proceso corriendo&quot;
fi</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">En este caso, se verifica que el archivo loquesea.lock exista. En caso de que exista, el script NO ejecuta sus tareas. Si no existe, crea el archivo, ejecuta las tareas que deba ejecutar y lo elimina.</p>
<p style="text-align: justify;">Pero, esto no es del todo fiable. ¿Qué pasaría si mientras nuestro script se está ejecutando es cerrado abruptamente (con Ctrl^c por ejemplo)? En ese caso el archivo de bloqueo no se borraría, y por lo tanto, no nos permitiría ejecutar el script de nuevo.</p>
<p style="text-align: justify;">Para cubrir esos casos, podríamos hacer uso del comando <strong><code>trap</code></strong> que nos permite ejecutar comandos en caso que nuestro script termine de manera inesperada. Esta es una versión más avanzada que además guarda dentro del archivo de bloqueo el PID del script que lo ejecuta:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/bin/bash
lockfile=/var/lock/loquesea.lock
if ( set -o noclobber; echo &quot;$$&quot; &gt; &quot;$lockfile&quot;) 2&gt; /dev/null;
then
    trap 'rm -f &quot;$lockfile&quot;; exit $?' INT TERM EXIT
    echo &quot;hago muchas cosas aqui tranquilamente&quot;
    rm -f &quot;$lockfile&quot;
    trap - INT TERM EXIT
else
    echo &quot;Ya hay otro proceso de este script ejecutandose&quot;
    echo &quot;corriendo con el PID: $(cat $lockfile)&quot;
fi</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Entendamos un poco mejor el comando <strong><code>trap</code></strong>. La sintaxis del mismo es básicamente esta: <code>trap <strong>comando</strong> signal [signal ...]</code>; donde signal es la señal de terminación que quieres atrapar. Si quieres ver una lista de los signals disponibles puedes ejecutar el comando kill -l. Para el caso anterior se usaron los signals <code><strong>INT</strong></code> (captura la terminación producida por un Ctrl^c), <code><strong>TERM</strong></code> (terminación producida por el comando kill) y <code><strong>EXIT</strong></code> (terminación normal de un script, bien sea porque ya no hay más líneas que ejecutar o porque se encuentra con el comando exit).</p>
<h3>Menú de opciones</h3>
<p style="text-align: justify;">Para hacer un menú en donde permitimos al usuario seleccionar una serie de opciones podemos usar el siguiente esquema:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/bin/bash
clear
while :
do
 echo &quot; Escoja una opcion &quot;
 echo &quot;1. quien soy?&quot;
 echo &quot;2. cuanto espacio tengo&quot;
 echo &quot;3. que es esto?&quot;
 echo &quot;4. Salir&quot;
 echo -n &quot;Seleccione una opcion [1 - 4]&quot;
 read opcion
 case $opcion in
  1) echo &quot;este eres:&quot;;
     whoami;;
  2) echo &quot;tienes esto&quot;;
     df;;
  3) uname -r;;
  4) echo &quot;chao pues parcero&quot;;
     exit 1;;
  *) echo &quot;$opc es una opcion invalida. Es tan dificil?&quot;;
     echo &quot;Presiona una tecla para continuar...&quot;;
     read foo;;
esac
done</pre>
<p><!--INFOLINKS_ON--></p>
<h3>Pedir confirmación antes de ejecutar un script</h3>
<p>A veces es útil hacer que el usuario confirme la ejecución de un lote de sentencias, es decir, el típico mensaje que pide al usuario escribir <code><strong>yes</strong></code> o <code><strong>no</strong></code>. Esto lo podemos hacer así:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">#!/bin/bash
while true; do
    echo
    read -p &quot;esta seguro de hacer lo que sea que vaya a hacer &quot; yn
    case $yn in
        yes ) break;;
        no ) exit;;
        * ) echo &quot;por favor responda yes o no&quot;;;
    esac
done
echo &quot;si se ejecuta esto es que aceptaste&quot;
</pre>
<p><!--INFOLINKS_ON--></p>
<h3>Fuentes de información</h3>
<ul>
<li><a href="http://stackoverflow.com/">StackOverflow - La más valiosa sin duda alguna</a></li>
<li><a href="http://www.davidpashley.com/articles/writing-robust-shell-scripts.html">Writing Robust Bash Shell Scripts</a></li>
<li><a href="http://www.cyberciti.biz/tips/shell-root-user-check-script.html">nixCraft</a></li>
</ul>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/comandos/" rel="tag nofollow">comandos</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/script/" rel="tag nofollow">script</a>, <a href="http://casidiablo.net/tag/shell/" rel="tag nofollow">shell</a>, <a href="http://casidiablo.net/tag/unix/" rel="tag nofollow">unix</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/codigos-de-shell-script-utiles/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Montar particiones/slices de *BSD en Linux</title>
		<link>http://casidiablo.net/montar-particione-bsd-linux/</link>
		<comments>http://casidiablo.net/montar-particione-bsd-linux/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 05:03:03 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[netbsd]]></category>
		<category><![CDATA[openbsd]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3556</guid>
		<description><![CDATA[


A veces es necesario trabajar con el sistema de archivos UFS (el que viene por defecto en FreeBSD, OpenBSD, NetBSD, etc.) desde Linux. En este pequeño artículo explicaré cómo configurar el kernel de tal manera que quede habilitado el soporte de lectura y escritura de UFS. Me enfocaré en FreeBSD, que es donde hice las [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fmontar-particione-bsd-linux%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Montar%20particiones%2Fslices%20de%20%2ABSD%20en%20Linux%22%20%7D);"></div>
<p style="text-align: center;"><img class="size-full wp-image-3547 aligncenter" title="tux_beastie" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/tux_beastie.png" alt="" width="450" height="243" /></p>
<p style="text-align: justify;">A veces es necesario trabajar con el sistema de archivos UFS (el que viene por defecto en FreeBSD, OpenBSD, NetBSD, etc.) desde Linux. En este pequeño artículo explicaré cómo configurar el kernel de tal manera que quede habilitado el soporte de lectura y escritura de UFS. Me enfocaré en FreeBSD, que es donde hice las pruebas.</p>
<p style="text-align: justify;">Tengamos en cuenta además que el esquema de particiones de FreeBSD es distinto al de Linux. Este solo necesita una &#8216;partición&#8217; primaria (llamadas slices en BSD) para administrar las particiones que utilizará el sistema, y cada una de esas particiones tiene un esquema de nombres en particular. Puesto que dicho esquema algunas veces no es soportado por nuestro kernel, activaremos también esta opción (de lo contrario solo podremos montar la raiz del sistema FreeBSD mas no sus particiones).</p>
<p style="text-align: justify;">
<h3>0. Preparando el kernel</h3>
<p style="text-align: justify;">Tal vez ya tengas soporte para UFS, pero para esta entrada asumiré que no es así.</p>
<p style="text-align: justify;">Así que, vamos a la configuración del kernel (en este momento estoy usando Linux kernel 2.6.32):</p>
<p><span id="more-3556"></span></p>
<div class="consola">cd /usr/src/linux<br />
make menuconfig</div>
<p style="text-align: justify;">Ahora, vamos a activar estas opciones:</p>
<div class="consola">-&gt; File systems<br />
-&gt; Miscellaneous filesystems<br />
&lt;*&gt; UFS file system support (read only)<br />
[*] UFS file system write support</div>
<p style="text-align: justify;">Verás algo como esto:</p>
<p style="text-align: center;"><img title="linux-kernel-menuconfig-ufs" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/linux-kernel-menuconfig-ufs.png" alt="linux-kernel-menuconfig-ufs" /></p>
<div class="nota"><strong>Importante:</strong> el soporte para escritura en UFS2 está en desarrollo y puede ser peligroso. Úsalo bajo tu propio riesgo <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </div>
<p style="text-align: justify;">Ahora, habilitaremos el soporte para FreeBSD disklabel:</p>
<div class="consola">-&gt; File systems<br />
-&gt; Partition Types<br />
[*] Advanced partition selection<br />
[*] PC BIOS (MSDOS partition tables) support<br />
[*]    BSD disklabel (FreeBSD partition tables)</div>
<p style="text-align: justify;">Verás algo como esto:</p>
<p style="text-align: center;"><img title="linux-kernel-menuconfig-ufs" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/linux-kernel-menuconfig-ufs-2.png" alt="linux-kernel-menuconfig-ufs" /></p>
<p style="text-align: justify;">Bien, con estas opciones habilitadas solo nos queda compilar e instalar el kernel:</p>
<div class="consola">make &amp;&amp; cp arch/x86_64/boot/bzImage /boot/kernel-2.6.32</div>
<div class="nota"><strong>Nota:</strong> Estoy asumiendo que ya te desenvuelves perfectamente con el kernel, es decir, que tienes experiencia compilando y configurándolo. Si no es el caso, deberías aprender: es divertido.</div>
<p style="text-align: justify;">
<h3>1. Buscando los nombres de las particiones</h3>
<p style="text-align: justify;">Cuando estamos trabajando con FreeBSD, los nombres que se asignan a las particiones son del tipo: /dev/ad0s3a. Pero, como estamos trabajando con Linux, en realidad seguiremos usando nombres del tipo /dev/sda* o /dev/hda*. Así que, gracias al soporte para FreeBSD Disklabel que hemos habilitado, podemos trabajar con los nombres convencionales:</p>
<div class="consola">cat /proc/partitions</div>
<p style="text-align: justify;">Verás algo como esto:</p>
<div class="consola">major minor  #blocks  name<br />
8        0  244198584 sda<br />
8        1   41624383 sda1<br />
8        2  158497290 sda2<br />
8        3   39076695 sda3<br />
8        4    5000184 sda4<br />
8        5     524288 sda5<br />
8        6    4194304 sda6<br />
8        7    5223424 sda7<br />
8        8     524288 sda8<br />
8        9   28610391 sda9</div>
<p style="text-align: justify;">
<h3>2. Montando las particiones UFS</h3>
<p style="text-align: justify;">Para montar una partición UFS ejecutaremos el siguiente comando (supongamos que /dev/sda7 es una de las particiones *BSD):</p>
<div class="consola">mount -t ufs -o ufstype=ufs2 /dev/sda7 /media/freebsd</div>
<p style="text-align: justify;">Por supuesto, podemos añadir una entrada al archivo /etc/fstab para que la partición se monte automáticamente al iniciar el sistema operativo:</p>
<div class="consola">/dev/sda7        /media/freebsd    ufs        ufstype=ufs2    0 0</div>
<p style="text-align: justify;">¡Eso es todo! Si tienes algún problema o sugerencia no dudes en comentar.</p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/bsd/" rel="tag nofollow">bsd</a>, <a href="http://casidiablo.net/tag/freebsd/" rel="tag nofollow">FreeBSD</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/netbsd/" rel="tag nofollow">netbsd</a>, <a href="http://casidiablo.net/tag/openbsd/" rel="tag nofollow">openbsd</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/montar-particione-bsd-linux/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Mounting *BSD partitions/slices on Linux</title>
		<link>http://casidiablo.net/mount-freebsd-partition-slice-linux/</link>
		<comments>http://casidiablo.net/mount-freebsd-partition-slice-linux/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 05:02:03 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[netbsd]]></category>
		<category><![CDATA[openbsd]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3544</guid>
		<description><![CDATA[


Some times it&#8217;s necessary to work with UFS (the default filesystem on FreeBSD, OpenBSD, NetBSD, etc.) from your linux box. Here I&#8217;ll explain how to do so by configuring your kernel in order to enable UFS read/write support. We&#8217;ll focus on FreeBSD.
Also, as you should know, FreeBSD uses its own hard disk partition scheme on [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fmount-freebsd-partition-slice-linux%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Mounting%20%2ABSD%20partitions%2Fslices%20on%20Linux%22%20%7D);"></div>
<p style="text-align: center;"><img class="size-full wp-image-3547 aligncenter" title="tux_beastie" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/tux_beastie.png" alt="" width="450" height="243" /></p>
<p style="text-align: justify;">Some times it&#8217;s necessary to work with UFS (the default filesystem on FreeBSD, OpenBSD, NetBSD, etc.) from your linux box. Here I&#8217;ll explain how to do so by configuring your kernel in order to enable UFS read/write support. We&#8217;ll focus on FreeBSD.</p>
<p style="text-align: justify;">Also, as you should know, FreeBSD uses its own hard disk partition scheme on your PC. It requires only one entry in the primary partition table of your disk and manages it similarly to DOS extended partitions, putting in its first sector a new partition table in BSD disklabel format. So we&#8217;ll enable support for reading these disklabels; otherwise we just will be able to mount the root &#8217;slice&#8217; of FreeBSD but not the partitions &#8216;inside&#8217;.</p>
<p style="text-align: justify;">
<h3>0. Preparing your kernel</h3>
</p>
<p style="text-align: justify;">You may already have support for UFS and BSD disklabel format, but I&#8217;ll assume that you have built your kernel by your self and/or don&#8217;t have those options enabled.</p>
<p style="text-align: justify;">So, let&#8217;s get into the menu configuration of your kernel (I&#8217;m using Linux kernel 2.6.32):</p>
<p><span id="more-3544"></span></p>
<div class="consola">cd /usr/src/linux<br />
make menuconfig</div>
<p style="text-align: justify;">Now, we are going to activate these options:</p>
<div class="consola">-&gt; File systems<br />
-&gt; Miscellaneous filesystems<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;*&gt; UFS file system support (read only)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[*] UFS file system write support</div>
<p style="text-align: justify;">It&#8217;ll look like this:</p>
<p style="text-align: center;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/linux-kernel-menuconfig-ufs.png" alt="linux-kernel-menuconfig-ufs" title="linux-kernel-menuconfig-ufs" />
</p>
<div class="nota"><strong>Important:</strong> write support for UFS2 is on development and could be dangerous. Use it at your own risk <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </div>
<p style="text-align: justify;">Now, we&#8217;ll enable the FreeBSD disklabel support:</p>
<div class="consola">-&gt; File systems<br />
&nbsp;&nbsp;&nbsp;&nbsp;-&gt; Partition Types<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[*] Advanced partition selection<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[*] PC BIOS (MSDOS partition tables) support<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[*]&nbsp;&nbsp;&nbsp;&nbsp;BSD disklabel (FreeBSD partition tables)</div>
<p style="text-align: justify;">It&#8217;ll look like this:</p>
<p style="text-align: center;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/linux-kernel-menuconfig-ufs-2.png" alt="linux-kernel-menuconfig-ufs" title="linux-kernel-menuconfig-ufs" />
</p>
<p style="text-align: justify;">OK&#8230; with these options enabled we just need to compile our kernel and install it:</p>
<div class="consola">make &amp;&amp; cp arch/x86_64/boot/bzImage /boot/kernel-2.6.32</div>
<div class="nota"><strong>Note:</strong> I&#8217;m assuming you already know how to work with the kernel&#8230; the line above will work fine for me, but some of you guys will use other kind of settings for your boot loader (for instance, those of you who use initramfs). In conclusion: I expect you know how to compile and configure your kernel for this kind of situations.</div>
<p style="text-align: justify;">
<h3>1. Looking for partitions names</h3>
</p>
<p style="text-align: justify;">When working with FreeBSD, the disks device names are like this: /dev/ad0s3a. But, as we are working with Linux, we&#8217;ll have the traditional /dev/sda* or /dev/hda* names. So, thanks to the FreeBSD Disklabel support that we&#8217;ve just added, we can do this in order to know the devices names:</p>
<div class="consola">cat /proc/partitions</div>
<p style="text-align: justify;">You&#8217;ll get something like this:</p>
<div class="consola">major minor  #blocks  name<br />
8        0  244198584 sda<br />
8        1   41624383 sda1<br />
8        2  158497290 sda2<br />
8        3   39076695 sda3<br />
8        4    5000184 sda4<br />
8        5     524288 sda5<br />
8        6    4194304 sda6<br />
8        7    5223424 sda7<br />
8        8     524288 sda8<br />
8        9   28610391 sda9</div>
<p style="text-align: justify;">
<h3>2. Mounting UFS</h3>
</p>
<p style="text-align: justify;">In order to mount a UFS partition you&#8217;ll need to type this (suppose /dev/sda7 is one of the *BSD partitions):</p>
<div class="consola">mount -t ufs -o ufstype=ufs2 /dev/sda7 /media/freebsd</div>
<p style="text-align: justify;">Of course, you can add an entry to your /etc/fstab file so the partition get mounted each time you boot your system:</p>
<div class="consola">/dev/sda7        /media/freebsd    ufs        ufstype=ufs2    0 0</div>
<p style="text-align: justify;">That&#8217;s it. Let me know if you have any problem. And sorry for my English, I&#8217;m just learning <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/bsd/" rel="tag nofollow">bsd</a>, <a href="http://casidiablo.net/tag/freebsd/" rel="tag nofollow">FreeBSD</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/netbsd/" rel="tag nofollow">netbsd</a>, <a href="http://casidiablo.net/tag/openbsd/" rel="tag nofollow">openbsd</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/mount-freebsd-partition-slice-linux/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Configurar GRUB y GRUB2 para cargar FreeBSD</title>
		<link>http://casidiablo.net/modificar-grub-iniciar-bsd/</link>
		<comments>http://casidiablo.net/modificar-grub-iniciar-bsd/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 03:53:09 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[grub]]></category>
		<category><![CDATA[how-to]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3534</guid>
		<description><![CDATA[

Al instalar sistemas operativos adicionales a los que tenemos generalmente nos dan la opción de instalar un boot loader en el MBR. Esto sobre escribe nuestro anterior boot loader (GRUB o Lilo en la mayoría de los casos), así que es preferible no tocar el MBR.
En este pequeño tip les mostraré cómo configurar GRUB para [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fmodificar-grub-iniciar-bsd%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Configurar%20GRUB%20y%20GRUB2%20para%20cargar%20FreeBSD%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float: left;" title="freebsd-linux" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/freebsd-linux.jpg" alt="linux freebsd" />Al instalar sistemas operativos adicionales a los que tenemos generalmente nos dan la opción de instalar un boot loader en el MBR. Esto sobre escribe nuestro anterior boot loader (GRUB o Lilo en la mayoría de los casos), así que es preferible no tocar el MBR.</p>
<p style="text-align: justify;">En este pequeño tip les mostraré cómo configurar GRUB para iniciar aquel hermoso sistema FreeBSD que acabas de instalar junto a tu Linux. La verdad es muy sencillo, lo único que debes hacer es añadir lo siguiente al archivo <strong>/boot/grub/menu.lst</strong>:</p>
<div class="consola">title  FreeBSD 8.0<br />
root   (hd0,a)<br />
kernel /boot/loader</div>
<p style="text-align: justify;">Una breve explicación:</p>
<ul>
<li style="text-align: justify;"><strong>title  FreeBSD 8.0 </strong>: Crea un nuevo ítem en el menú y le pone el título &#8216;FreeBSD 8.0&#8242; (en realidad puedes colocar lo que quieras).</li>
<li style="text-align: justify;"><strong>root   (hd0,a)</strong> : Seleccionamos la partición raíz donde se encuentra FreeBSD. En el ejemplo hd0 es el primer disco duro (hda en Linux). En GRUB hda es hd0. Así, por ejemplo, hda2 (segunda partición del primer disco) es hd0,1 en Grub. Además, recuerda que FreeBSD usa nombres del tipo a, b, c para representar los nombres de las particiones. Si tuvieras instalado FreeBSD en la tercera partición entonces tendrías que usar:<strong> root   (hd0,2,a)</strong></li>
<li style="text-align: justify;"><strong>kernel /boot/loader</strong> : Se usa para cargar la imagen de boot principal. FreeBSD usa /boot/loader para cargar el resto del kernel y OS.</li>
</ul>
<p style="text-align: justify;">
<h3>Actualizaci&oacute;n: entrada para GRUB2</h3>
</p>
<p style="text-align: justify;">Si est&aacute;s usando GRUB2 entonces deber&aacute;s modificar tu archivo <code>/boot/grub/grub.cfg</code> y a&ntilde;adir esto:</p>
<div class="consola">menuentry &#8220;FreeBSD 8.0&#8243; {<br />
	set root=(hd0,1,a)<br />
	chainloader +1<br />
}</div>
<p>Fuente: <a href="http://lists.freebsd.org/pipermail/freebsd-hackers/2004-May/006944.html">Lista de correo FreeBSD</a> | <a href="http://forums.freebsd.org/showthread.php?t=5918">Foros FreeBSD</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/bsd/" rel="tag nofollow">bsd</a>, <a href="http://casidiablo.net/tag/freebsd/" rel="tag nofollow">FreeBSD</a>, <a href="http://casidiablo.net/tag/grub/" rel="tag nofollow">grub</a>, <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/tips/" rel="tag nofollow">tips</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/modificar-grub-iniciar-bsd/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Instalar/reinstalar VMware 7 en Linux con el kernel 2.6.32</title>
		<link>http://casidiablo.net/error-vmware-linux-kernel/</link>
		<comments>http://casidiablo.net/error-vmware-linux-kernel/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 18:19:07 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[2.6.32]]></category>
		<category><![CDATA[compilación]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[módulos]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3520</guid>
		<description><![CDATA[

Si has intentado instalar VMware 7 sobre una máquina Linux corriendo el kernel 2.6.32 tal vez hayas tenido problemas. También, como en mi caso, tener VMware instalado con el kernel 2.6.31 y actualizar a 2.6.32 resulta en problemas al recompilar los módulos (específicamente el vmnet y el vmci).
Los errores que arroja VMware al momento de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Ferror-vmware-linux-kernel%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Instalar%2Freinstalar%20VMware%207%20en%20Linux%20con%20el%20kernel%202.6.32%22%20%7D);"></div>
<p style="text-align: justify;">Si has intentado instalar VMware 7 sobre una máquina Linux corriendo el kernel 2.6.32 tal vez hayas tenido problemas. También, como en mi caso, tener VMware instalado con el kernel 2.6.31 y actualizar a 2.6.32 resulta en problemas al recompilar los módulos (específicamente el vmnet y el vmci).</p>
<p style="text-align: justify;">Los errores que arroja VMware al momento de tratar de recompilar los módulos son similares a esto:</p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/error-vmware.png"><img class="size-full wp-image-3522 aligncenter" title="error-vmware" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/error-vmware.png" alt="error-vmware" width="382" height="341" /></a></p>
<p style="text-align: justify;">Errores con el vmnet que se muestran en consola:</p>
<div class="consola">CC [M]  /tmp/vmware-root/modules/vmnet-only/vnetUserListener.o<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: En la función ‘VNetUserListenerEventHandler’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: (Cada identificador no declarado solamente se reporta una vez<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: para cada funcion en la que aparece.)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: En la función ‘VNetUserListenerRead’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: declaración implícita de la función ‘signal_pending’<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: declaración implícita de la función ‘schedule’<br />
make[2]: *** [/tmp/vmware-root/modules/vmnet-only/vnetUserListener.o] Error 1<br />
make[1]: *** [_module_/tmp/vmware-root/modules/vmnet-only] Error 2<br />
make[1]: se sale del directorio `/usr/src/linux-2.6.32&#8242;<br />
make: *** [vmnet.ko] Error 2</div>
<p style="text-align: justify;">Errores con el vmci (Virtual Machine Communication Interface) que se muestran en consola:</p>
<div class="consola">CC [M]  /tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.o<br />
In file included from /tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:48:<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h: En la función ‘PgtblVa2MPN’:<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h:301: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h: En la función ‘PgtblVa2Page’:<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h:373: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCIHost_SignalCall’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:328: error: ‘TASK_NORMAL’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:328: error: (Cada identificador no declarado solamente se reporta una vez<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:328: error: para cada funcion en la que aparece.)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCIHost_WaitForCallLocked’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:370: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:370: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:378: error: declaración implícita de la función ‘schedule’<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:386: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:386: error: ‘TASK_RUNNING’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:390: error: declaración implícita de la función ‘signal_pending’<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCI_SignalEvent’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:682: error: ‘TASK_NORMAL’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCI_WaitOnEventInterruptible’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:739: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:739: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:751: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:751: error: ‘TASK_RUNNING’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCIHost_GetUserMemory’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1438: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1440: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1459: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1487: error: puntero deferenciado a tipo de dato incompleto<br />
make[2]: *** [/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.o] Error 1<br />
make[1]: *** [_module_/tmp/vmware-root/modules/vmci-only] Error 2<br />
make[1]: se sale del directorio `/usr/src/linux-2.6.32&#8242;<br />
make: *** [vmci.ko] Error 2</div>
<p style="text-align: justify;">La <a href="http://blog.chmouel.com/2009/12/05/vmware-vmplayer-and-kernel-2-6-32/">solución</a> la comentan en Chmouel Blog y me la a sugerido <a href="http://casidiablo.net/author/c0rtex/">Cortex</a>, aunque hablan solamente de errores en el vmnet y no en el vmci. De cualquier forma, la solución prácticamente la misma:</p>
<ul>
<li><code>cd /tmp</code></li>
<li><code>tar xf /usr/lib/vmware/modules/source/vmnet.tar</code></li>
<li>Entramos al directorio (<code>cd vmnet-only</code>)</li>
<li>Abrimos el archivo <code>vnetUserListener.c</code> con un editor de texto</li>
<li>Añadimos esto al final de todos los <em>includes</em>:<br />
<!--INFOLINKS_OFF-->
<pre class="brush: cpp; pad-line-numbers: false; toolbar: false;">add this line #include &quot;compat_sched.h&quot;</pre>
<p><!--INFOLINKS_ON-->
</li>
<li>Salimos del directorio (cd /tmp)</li>
<li>Reemplazamos el arvhivo vmnet de vmware con el que hemos editado:<br />
<code>sudo tar cf /usr/lib/vmware/modules/source/vmnet.tar vmnet-only</code></li>
</ul>
<p>Lo anterior es para evitar el problema con vmnet&#8230; con esto puedes intentar correr de nuevo VMWare. Si lo que ahora falla es el vmci puedes hacer lo mismo pero con el archivo <code>/usr/lib/vmware/modules/source/vmci.tar</code>.<br />
Luego de esto, intentamos iniciar VMware o VMplayer los cuales recompilarán los módulos esta vez sin problemas:</p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/vmware-compilacion-correcta.png"><img class="size-full wp-image-3523 aligncenter" title="vmware-compilacion-correcta" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/vmware-compilacion-correcta.png" alt="vmware-compilacion-correcta" width="382" height="341" /></a></p>
<h3>SEO thing XD&#8230;</h3>
<p>Pongo los errores como salen en inglés por si alguien los busca así <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<div class="consola">CC [M] /tmp/vmware-root/modules/vmnet-only/vnetEvent.o<br />
CC [M] /tmp/vmware-root/modules/vmnet-only/vnetUserListener.o<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: In function ‘VNetUserListenerEventHandler’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: (Each undeclared identifier is reported only once<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: for each function it appears in.)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: In function ‘VNetUserListenerRead’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: implicit declaration of function ‘signal_pending’<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: implicit declaration of function ‘schedule’<br />
make[2]: *** [/tmp/vmware-root/modules/vmnet-only/vnetUserListener.o] Error 1<br />
make[1]: *** [_module_/tmp/vmware-root/modules/vmnet-only] Error 2<br />
make[1]: Leaving directory `/opt/temp/linux-2.6.32′<br />
make: *** [vmnet.ko] Error 2<br />
Failed to compile module vmci</div>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/2-6-32/" rel="tag nofollow">2.6.32</a>, <a href="http://casidiablo.net/tag/compilacion/" rel="tag nofollow">compilación</a>, <a href="http://casidiablo.net/tag/error/" rel="tag nofollow">error</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/modulos/" rel="tag nofollow">módulos</a>, <a href="http://casidiablo.net/tag/vmware/" rel="tag nofollow">vmware</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/error-vmware-linux-kernel/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Recuperar archivos eliminados usando Foremost [configuración manual]</title>
		<link>http://casidiablo.net/restaurar-archivos-eliminados-accidentalmente/</link>
		<comments>http://casidiablo.net/restaurar-archivos-eliminados-accidentalmente/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 05:58:39 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[archivos]]></category>
		<category><![CDATA[carving]]></category>
		<category><![CDATA[eliminados]]></category>
		<category><![CDATA[ext2]]></category>
		<category><![CDATA[ext3]]></category>
		<category><![CDATA[ext4]]></category>
		<category><![CDATA[foremost]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[ntfs]]></category>
		<category><![CDATA[recovery]]></category>
		<category><![CDATA[recuperar]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[undelete]]></category>
		<category><![CDATA[videos]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3487</guid>
		<description><![CDATA[


¡Hola a todos! Hace un par de días perdí la partición donde tenía mi /home. Afortunadamente pude recuperar el 98% de los archivos que necesitaba. Es decir, en realidad no me interesaba recuperar imágenes, música, etc&#8230; lo único importante era recuperar los archivos PHP con los que había estado trabajando.
Aclaro esto puesto que esta entrada [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Frestaurar-archivos-eliminados-accidentalmente%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Recuperar%20archivos%20eliminados%20usando%20Foremost%20%5Bconfiguraci%C3%B3n%20manual%5D%22%20%7D);"></div>
<p style="text-align: justify;">
<p style="text-align: justify;">¡Hola a todos! Hace un par de días perdí la partición donde tenía mi /home. Afortunadamente pude recuperar el 98% de los archivos <em>que necesitaba</em>. Es decir, en realidad no me interesaba recuperar imágenes, música, etc&#8230; lo único importante era recuperar los archivos PHP con los que había estado trabajando.</p>
<p style="text-align: justify;">Aclaro esto puesto que esta entrada se va a enfocar en la configuración manual de <a href="http://foremost.sourceforge.net/">Foremost</a>, un programa para hacer carving, de tal manera que rescatemos solamente aquello que realmente nos interesa. Existen otros programas, pero este fue el que realmente me ayudó en esos momentos de pánico.</p>
<p style="text-align: justify;">¿Cómo funciona? Foremost trabaja con imágenes generadas con dd o particiones directamente, y se basa en el análisis de encabezados y footers de los archivos para &#8216;extraer&#8217; lo que se pueda salvar.</p>
<div class="nota"><strong>Importante:</strong> si has eliminado accidentalmente algún archivo lo primero, después de blasfemar un rato, es evitar hacer cualquier tipo de escritura de datos sobre la misma. Esto es porque tus datos en realidad aún están allí, y el único riesgo que tienen de ser eliminados es que se sobrescriban datos en el mismo sector en donde se encuentran.</div>
<p><span id="more-3487"></span></p>
<p style="text-align: justify;">Dicho esto, tienes dos opciones:</p>
<ul style="text-align: justify;">
<li>Si tienes otra partición con suficiente espacio para almacenar un backup de la partición a ser tratada, puedes usar el comando dd y luego trabajar sobre esa imagen. <a href="http://casidiablo.net/crear-un-backup-o-imagen-del-disco-duro/">En esta entrada se explica con más detalle cómo hacer esto</a>.</li>
<li style="text-align: justify;">Si no tienes espacio (tal como me ocurrió a mi), puedes trabajar directamente sobre la partición (i.e. el archivo /dev/sdaX ó /dev/hdbX, etc.). Solo ten en mente que NO deberías montar dicha partición, al menos no en modo de lectura-escritura.</li>
</ul>
<p style="text-align: justify;">
<h3>Instalación de Foremost</h3>
<p style="text-align: justify;">La instalación es bastante sencilla ya que Foremost se incluye en prácticamente todos los repositorios de cualquier distribución. Así que puedes usar tu gestor de paquetes preferido. Siendo tan sencilla la instalación por repositorios, solo me queda mostrar la instalación manual que es incluso más sencilla&#8230; descargamos la última versión de Foremost (1.5.6 al momento de escribir esta entrada), descomprimimos, compilamos e instalamos:</p>
<div class="consola">wget http://foremost.sourceforge.net/pkg/foremost-1.5.6.tar.gz<br />
tar xfzv foremost-1.5.6.tar.gz<br />
cd foremost-1.5.6<br />
make &amp;&amp; make install</div>
<p style="text-align: justify;">
<h3>Ejemplo básico de uso de Foremost</h3>
<p style="text-align: justify;">El siguiente comando de ejemplo es un de los tantos cientos de miles que te encontrarás en la red&#8230; no me enfocaré mucho en este aspecto porque ya se encuentra muy bien documentado:</p>
<div class="consola">foremost -t pdf -i imagen.iso -o pdfs-recuperados</div>
<p style="text-align: justify;">Básicamente le estamos diciendo al Foremost que busque archivos de tipo PDF en el archivo de imagen (creado con dd) imagen.iso y que los guarde en pdfs-recuperados. Lo único que nos interesa recalcar en este punto es que Foremost tiene un set de archivos predefinidos de los cuales conoce su header y footer (como los PDFs en este caso); este set se compone de los archivos más comunes (imágenes  y videos en diferentes formatos, archivos de office, zips, etc.) Pero&#8230; ¿qué pasa con otro tipo de archivos menos comunes? Tranquilo, ya vamos para allá <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;">
<h3>Ejemplo de configuración del Foremost</h3>
<p style="text-align: justify;">Foremost puede ser configurado mediante un archivo (por defecto: <code>/etc/foremost.conf</code>) de tal manera que no tengamos que especificar el tipo de archivo a buscar y, lo que es mejor, podemos definir nuestros propios tipos de archivos. En nuestro ejemplo, te meterás en mis zapatos, te imaginarás que has perdido el trabajo de tres días y que tu objetivo es rescatar unos cuantos archivos de PHP.</p>
<p style="text-align: justify;">Entonces&#8230; ¿por donde comenzar? Bien&#8230; lo primero es echar un vistazo al archivo /etc/foremost.conf en donde puedes encontrar patrones de búsqueda para diferentes tipos de archivo (de hecho, son las que usa Foremost cuando usamos el flag <code>-t</code>). La sintáxis de estos patrones es sencilla y consta de una sola línea; esta línea tiene los siguientes parámetros separados por espacios o tabulaciones:</p>
<ul>
<li>Extensión del archivo&#8230; ¿debo explicar esto?</li>
<li>Definir si se debe hacer distinción entre mayúsculas y minúsculas al buscar el header y footer del archivo. Pon &#8216;y&#8217; si deseas que sea case-sensitive o &#8216;n&#8217; en caso contrario.</li>
<li>Tamaño máximo del archivo.</li>
<li>Encabezado: lo que se debe buscar en los encabezados de los archivos; puede ser especificado en texto plano o, mejor aún, en hexadecimal.</li>
<li>Footer (opcional): lo que se debe buscar al final de los archivos; puede ser especificado en texto plano o, mejor aún, en hexadecimal.</li>
</ul>
<p style="text-align: justify;">Por ejemplo, este es uno de los que se encuentra configurados por defecto en el Foremost:</p>
<p><code>jpg          y          20000000          \xff\xd8\xff\xe1          \xff\xd9</code></p>
<p style="text-align: justify;">Básicamente busca archivos con extensión .jpg y con un tamaño máximo de 20000000 bytes. Además especifica uno de los posibles encabezados que un archivo tipo JPEG puede tener (<code>\xff\xd8\xff\xe1</code>) y su footer (<code>\xff\xd9</code>).</p>
<p style="text-align: justify;">Como puedes ver, el encabezado y el footer pueden ser especificados en hexadecimal. Esto es bastante útil ya que en muchos casos no necesitamos simples archivos de texto sino que podríamos querer recuperar uno binario. En cualquier caso, es recomendable usar hexadecimal&#8230; pero ¿cómo se qué debo poner? Bien&#8230; recuerda que tu misión es recuperar los archivos PHP, así que&#8230; ¿qué tal si creamos uno para ver cómo se ve en hexadecimal?</p>
<p style="text-align: justify;">Creamos entonces un archivo con el siguiente contenido y lo guardamos como <em>test.php</em>:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: php;">&lt;?php
if($meLoTire){
	echo &quot;o_O mode-panic:on&quot;;
}
?&gt;</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Ahora debemos abrir este archivo con algún editor hexadecimal. Si usas Gnome, Ghex es una buena opción (sino, también)&#8230; lo instalas desde los repositorios y con él abres el archivo que acabas de crear&#8230; este lucirá así:</p>
<p><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/ghex.png"><img class="aligncenter size-full wp-image-3499" title="ghex" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/ghex.png" alt="ghex" width="640" height="469" /></a></p>
<p style="text-align: justify;">¡Ahora ya podemos configurar Foremost como expertos, puesto que ya sabemos qué hexadecimales poner! Cada caracter del archivo que creamos equivale a un valor en hexadecimal y nos interesa enfocarnos en la representación hexadecimal de &#8220;&lt;?php&#8221; puesto que así comienzan los archivos en los que estamos interesados.</p>
<p style="text-align: justify;">Así que para este caso, los hexadecimales son 3C, 3F, 70, 68 y 70. Por lo tanto podemos crear un nuevo patrón dentro de /etc/foremost.conf que luzca algo así:</p>
<p><code>php y 100000 \x3C\x3F\x70\x68\x70</code></p>
<p style="text-align: justify;">Si queremos ser más precisos podemos especificar el footer:</p>
<p><code>php y 100000 \x3c\x3f\x70\x68\x70 \7d\0a\3f\x3e</code></p>
<p style="text-align: justify;">Fíjate que he definido un footer bastante concreto que hará que Foremost busque archivos que finalicen con un &#8216;}&#8217; seguido de un &#8216;Enter&#8217; (retorno de carro) y finalmente con &#8220;?&gt;&#8221;. Una vez hayamos terminado de configurar los patrones con los que queramos iniciar la búsqueda, guardamos y cerramos el archivo.</p>
<p style="text-align: justify;">Puesto que es el archivo por defecto no es necesario especificarlo al momento de ejecutar Foremost. Esto por supuesto implica que puedes crear un archivo con patrones en cualquier otro lado, y en tales casos debes referencialo con el flag -c. ¡Que comience el carving!</p>
<div class="consola">foremost -i /dev/sda1 -o ~/recuperados/</div>
<p style="text-align: justify;">Como puedes ver, no especificamos ningún tipo  de archivo así que Foremost se enfocará en aquellos configurados en el archivo .conf. Además, en este caso estamos especificando directamente la partición. Esto podría llevar un rato, así que tienes tiempo de leer algo entretenido ¿qué tal esta bonita <a href="http://www.gentoo.org/doc/en/vi-guide.xml">guía sobre Vi</a>? ¿o esta otra sobre un hermoso <a href="http://www.gentoo.org/doc/en/gentoo-freebsd.xml">Gentoo/BSD</a>?</p>
<p style="text-align: justify;">Una vez Foremost haya terminado su trabajo&#8230; el tuyo apenas comienza. Aunque Foremost es un excelente programa, los resultados no pueden ser 100% confiables (¿hay algo que lo sea?). Y para empeorar las cosas, Foremost NO recupera los nombres de los archivos. En vez de ello, crea una secuencia de archivos numéricos con la extensión; cosas como 8392383874.php ó 239492782.php ¿chévere, no?</p>
<p style="text-align: justify;">Todo parece que pasaremos un buen rato jugando con nuestro querido amigo GREP; y es que este maravilloso comando puede ser realmente útil en estos casos. Así que aquí van algunos comandos que te podrían servir:</p>
<ul>
<li style="text-align: justify;"><code>grep busqueda changos.ext</code><br />
Busca la cadena &#8216;busqueda&#8217; dentro del archivo changos.ext</li>
<li style="text-align: justify;">¿qué tal una búsqueda en todos los archivos? Esto podría servir para nuestro caso de los PHP:<br />
<code>cat *.php | grep -l cosa_a_buscar</code></li>
<li style="text-align: justify;">¿y si queremos buscar un string en varios archivos que se encuentran en diferentes directorios? Este comando es de los que más uso a diario:<br />
<code>find /ruta/ -exec grep -l cosa_a_buscar {} \;</code></li>
</ul>
<p style="text-align: justify;">
<h3>Cosas por considerar</h3>
</p>
<p style="text-align: justify;">
<ul>
<li style="text-align: justify;">Existe una gran probabilidad que los datos recuperados no estén del todo bien formados. Por ejemplo, podrían tener &#8220;basura&#8221; dentro. Esto es posible de corregir en archivos de texto, ya que solo necesitas un editor decente y un par de minutos para &#8220;ver qué te sirve&#8221;.</li>
<li style="text-align: justify;">Si los archivos recuperados tienen basura dentro, es mejor usar editores de texto en consola que no se quejan tanto al momento de editarlos. Gedit simplemente no los abre.</li>
<li style="text-align: justify;">Algunas veces los archivos quedan fragmentados; esto es, en un archivo recuperado queda una parte de lo que buscas, y en otro queda el restante. Por esto, es bastante útil que uses herramientas como Meld (excelente por cierto).  Considera este ejemplo de la vida real: en el archivo blablaa.php tenía parte inicial del archivo mientras que en blebelbel.php tenía el resto:</li>
</ul>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/meld_1280.png"><img class="size-full wp-image-3501 aligncenter" title="meld_640" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/meld_640.png" alt="meld_640" width="640" height="331" /></a></p>
<p style="text-align: justify;">Esto es difícil de notar &#8216;a ojo&#8217;, por lo que puedo decir que Meld me salvó el trasero una vez más (y de paso se ganó una donación). Así, combinando el trabajo de Foremost y la ayuda de Meld pude recuperar prácticamente todo lo que necesitaba.</p>
<p style="text-align: justify;">Pero, te repito, si fuesen archivos binarios los que quieres rescatar la cosa sería mucho más difícil. En este caso, &#8216;la basura&#8217; se puede identificar fácilmente dentro del archivo, y de la misma manera se puede eliminar. En una archivo binario sin embargo es un poco más difícil.</p>
<p style="text-align: justify;">
<h3>Otros buenos programas con propósitos similares</h3>
</p>
<p style="text-align: justify;">
<ul>
<li><a href="http://www.cgsecurity.org/wiki/PhotoRec">TestDisk (aka, PhotoRec)</a></li>
<li><a href="http://www.digitalforensicssolutions.com/Scalpel/">Scalpel</a></li>
<li><a href="http://www.student.dtu.dk/~s042078/magicrescue/">Magic Rescue</a></li>
<li><a href="http://www.sleuthkit.org/autopsy/desc.php">Sleuth Kit y Autopsy</a></li>
<li><a href="http://www.sleuthkit.org/">Sleuthkit</a></li>
</ul>
<p><br/><br/><br/></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/archivos/" rel="tag nofollow">archivos</a>, <a href="http://casidiablo.net/tag/carving/" rel="tag nofollow">carving</a>, <a href="http://casidiablo.net/tag/eliminados/" rel="tag nofollow">eliminados</a>, <a href="http://casidiablo.net/tag/ext2/" rel="tag nofollow">ext2</a>, <a href="http://casidiablo.net/tag/ext3/" rel="tag nofollow">ext3</a>, <a href="http://casidiablo.net/tag/ext4/" rel="tag nofollow">ext4</a>, <a href="http://casidiablo.net/tag/foremost/" rel="tag nofollow">foremost</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/ntfs/" rel="tag nofollow">ntfs</a>, <a href="http://casidiablo.net/tag/recovery/" rel="tag nofollow">recovery</a>, <a href="http://casidiablo.net/tag/recuperar/" rel="tag nofollow">recuperar</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/undelete/" rel="tag nofollow">undelete</a>, <a href="http://casidiablo.net/tag/videos/" rel="tag nofollow">videos</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/restaurar-archivos-eliminados-accidentalmente/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Usando b43 para tarjetas inalámbricas BCM43xx en Linux</title>
		<link>http://casidiablo.net/usando-b43-para-tarjetas-inalambricas-bcm4312-en-linux/</link>
		<comments>http://casidiablo.net/usando-b43-para-tarjetas-inalambricas-bcm4312-en-linux/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 02:40:36 +0000</pubDate>
		<dc:creator>Cortex</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[noticias]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[b43]]></category>
		<category><![CDATA[broadcom]]></category>
		<category><![CDATA[inalambrica]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3476</guid>
		<description><![CDATA[

Hola a todos!
Otra vez Cortex, que llevaba un buen rato sin pasarse por aquí.
Para los que aún no se han enterado, el día de hoy se hizo estable la versión 2.6.32 del kernel Linux. Como siempre, incluyendo múltiples mejoras, varios añadidos y correcciones. Por mencionar algunas de las cosas nuevas, encontraremos soporte 3D para los [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fusando-b43-para-tarjetas-inalambricas-bcm4312-en-linux%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Usando%20b43%20para%20tarjetas%20inal%C3%A1mbricas%20BCM43xx%20en%20Linux%22%20%7D);"></div>
<p>Hola a todos!</p>
<p>Otra vez <strong>Cortex</strong>, que llevaba un buen rato sin pasarse por aquí.</p>
<p>Para los que aún no se han enterado, el día de hoy se hizo <strong>estable la versión 2.6.32 del kernel Linux</strong>. Como siempre, <a title="What's new in Linux 2.6.32" href="http://www.h-online.com/open/features/What-s-new-in-Linux-2-6-32-872271.html">incluyendo múltiples mejoras, varios añadidos y correcciones</a>. Por mencionar algunas de las cosas nuevas, encontraremos soporte 3D para los chips gráficos Radeon más nuevos (algo que sé que muchos estaban esperando) así como soporte para KMS, Devtmpfs con lo cual se pretende tener un Linux independiente de Udev, mejoras en el sistema de archivos Btrfs, mejor manejo de memoria y mucho más.</p>
<p>Algo que todos los usuarios de tarjetas inalámbricas <strong>BCM43xx</strong> estabamos esperando, era el soporte de éste chipset por el driver <strong>b43.</strong> ¿Motivos? Muchos. Por ejemplo, no podíamos poner nuestra tarjeta en modo monitor y eso ya es mucho que decir.</p>
<p>En ésta nueva versión del kernel, ya hay soporte para éste tipo de chipsets y lo más recomendable es hacer la migración inmediata. No hay comparación alguna con el driver <strong>broadcom-sta</strong>, se nota un mejor funcionamiento, algo que los usuarios Windows podían disfrutar desde hace un buen rato ya.</p>
<p>Veamos como podemos disfrutar de éste driver.</p>
<p>Lo primero, es decir, que se necesita hacer uso de la versión <strong>2.6.32</strong> de Linux; ninguna versión anterior servirá. Si aún no te animas a compilar tus kernel personalizados (algo de lo que habíamos hablado <a title="Trabajando con el Kernel Linux (I)" href="http://casidiablo.net/trabajando-con-el-kernel-linux-i/">I</a> <a title="Trabajando con el Kernel Linux (II)" href="http://casidiablo.net/trabajando-con-el-kernel-linux-ii/">II</a> <a title="Trabajando con el Kernel Linux (III) – Buscando drivers de dipositivos PCI" href="http://casidiablo.net/identificando-drivers-pci-kernel-linux/">III</a>), la opción que te queda es esperar a que los desarrolladores de tu distribución incluyan el paquete precompilado con ésta versión. Si usas la ramas estables, probablemente pasará un buen tiempo antes de que ésto ocurra.</p>
<div class="nota">Éste driver <strong>sólo</strong> soporta los nuevos dispositivos <em>BCM43xx IEEE 802.11G,</em> pero no los viejos <em>IEEE 802.11B. </em>Éstos son soportados por el driver <strong>b43legacy</strong>. Para saber si tu tarjeta broadcom ya es soportada por éste driver, <a title="B43 PCI Devices" href="http://wireless.kernel.org/en/users/Drivers/b43#Known_PCI_devices">revisa aquí.</a></div>
<p>El proceso lo llevaré acabo desde mi <strong>Gentoo</strong>.</p>
<p>1. Instalamos <strong>gentoo-sources-2.6.32</strong></p>
<div class="consola">emerge &#8211;sync<br />
ACCEPT_KEYWORDS=&#8221;~arch&#8221; emerge -av gentoo-sources</div>
<p>2. Configuramos el kernel normalmente y agregamos el soporte</p>
<pre> Device Drivers --&gt;
   Network device support --&gt;
     Wireless LAN
       [*] Wireless LAN (IEEE 802.11)
       &lt;*&gt;   Broadcom 43xx wireless support (mac80211 stack)
       [ ]     Broadcom 43xx PCMCIA device support
       [*]     Broadcom 43xx debugging</pre>
<p>3. Compilamos, copiamos kernel a /boot y modificamos GRUB</p>
<div class="consola">make &amp;&amp; make modules_install<br />
mount /boot<br />
cp arch/x86_64/bzImage /boot/gentoo-2.6.32<br />
vim /boot/grub/grub.conf</div>
<p>4. Una vez instalado el kernel, procedemos a instalar <strong>b43-fwcutter</strong> y el firmware. La versión que incluye <strong>hoy</strong>, tu distribución, no te servirá. Descarguemos la versión en desarrollo</p>
<div class="consola">git clone http://git.bu3sch.de/git/b43-tools.git<br />
cd b43-tools/fwcutter<br />
make<br />
cd ..</div>
<div class="nota"><strong>Nota:</strong> En caso de que recibas un error, debido a la falta de la librería cURL, recompila <em>dev-util/git</em> con el USE flag <strong>curl</strong>.</div>
<p>5. Descarguemos e instalemos el firmware</p>
<div class="consola">export FIRMWARE_INSTALL_DIR=&#8221;/lib/firmware&#8221;<br />
wget http://downloads.openwrt.org/sources/broadcom-wl-4.178.10.4.tar.bz2<br />
tar xjf broadcom-wl-4.178.10.4.tar.bz2<br />
cd broadcom-wl-4.178.10.4/linux<br />
sudo ../../fwcutter/b43-fwcutter -w &#8220;$FIRMWARE_INSTALL_DIR&#8221; wl_apsta.o</div>
<p>6. Reiniciamos</p>
<p>Una vez hayamos terminado de reiniciar, como root comprobamos que la interfaz esté funcionando:</p>
<div class="consola">iwconfig<br />
ifconfig wlan1 up<br />
iwlist wlan1 scan</div>
<p>¡Eso es todo! ¡A disfrutar <em>sanamente</em> del modo monitor!</p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/b43/" rel="tag nofollow">b43</a>, <a href="http://casidiablo.net/tag/broadcom/" rel="tag nofollow">broadcom</a>, <a href="http://casidiablo.net/tag/gentoo/" rel="tag nofollow">gentoo</a>, <a href="http://casidiablo.net/tag/inalambrica/" rel="tag nofollow">inalambrica</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/usando-b43-para-tarjetas-inalambricas-bcm4312-en-linux/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Ejecutar aplicación Java como servicio &#8211; Integración básica</title>
		<link>http://casidiablo.net/correr-programa-java-como-demonio/</link>
		<comments>http://casidiablo.net/correr-programa-java-como-demonio/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 01:16:20 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[demonio]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[servicio]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3407</guid>
		<description><![CDATA[

En esta entrada abordaremos un tema bastante interesante: cómo correr un programa en Java como servicio en Windows o demonio en UNIX/Linux. Puesto que el API de Java no proporciona nada para estos casos, utiliza
remos una librería llamada Java Service Wrapper. Dicha librería nos ofrece una serie de scripts y binarios preparados para diferentes sistemas [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fcorrer-programa-java-como-demonio%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ejecutar%20aplicaci%C3%B3n%20Java%20como%20servicio%20-%20Integraci%C3%B3n%20b%C3%A1sica%22%20%7D);"></div>
<p style="text-align: justify;">En esta entrada abordaremos un tema bastante interesante: <strong>cómo correr un programa en Java como servicio en Windows o demonio en UNIX/Linux</strong>. Puesto que el API de <a href="http://casidiablo.net/java/">Java</a> no proporciona nada para estos casos, utiliza</p>
<p style="text-align: justify;">remos una librería llamada <a href="http://wrapper.tanukisoftware.org/">Java Service Wrapper</a>. Dicha librería nos ofrece una serie de scripts y binarios preparados para diferentes sistemas operativos y arquitecturas, que nos permitirán correr nuestros programas como un servicio; además ofrece diferentes versiones: Profesional, Estándar y Comunity. En este caso usaremos la versión Comunity que es libre y gratuita.</p>
<p style="text-align: justify;">La mejor manera de aprender a usar dicha librería es con un pequeño laboratorio, así que he preparado uno en donde explico la integración más simple que existe con Java Service Wrapper (existen 4 métodos; unos más avanzados que otros). La integración sencilla que he escogido nos permitirá ejecutar como servicio una aplicación que ya esté creada (probablemente ya empaquetada en un .jar) y a la que no podemos o es difícil hacerle modificaciones. Esta es la manera más sencilla de hacerlo, sin embargo tiene una desventaja: al detener el servicio se envía directamente un System.exit() a la JVM por lo que la aplicación no se cerrará limpiamente.</p>
<p style="text-align: justify;">Si quieres integrar tu aplicación de una manera más segura y estás en la capacidad de prepararla para ello, podrías intentar la integración avanzada en la que utilizas el API de Java Service Wrapper para implementar métodos de inicio, pausa y detención del servicio [<a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Avanzado+Java+src&#8220;>descargar un ejemplo</a>].</p>
<h3>Laboratorio 1 &#8211; Integración Simple (Linux/Windows/Solaris)</h3>
<p style="text-align: justify;">Para este caso utilizaremos una aplicación de ejemplo que recibe un archivo como parámetro y escribe en él <a href="http://casidiablo.net/capturar-informacion-sistema-operativo-java/">información sobre la memoria del sistema</a>, cada 60 segundos. He escogido este ejemplo porque posee varios aspectos interesantes: requiere de librerías externas (tanto JARs como librerías nativas [.so, dll, etc.]) y recibe parámetros.</p>
<p style="text-align: justify;">Puedes descargar la aplicación de ejemplo de haciendo <a class="tooltip" title="Descargar los binarios del ejemplo" href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+bin">clic aquí</a>. Si la ejecutáramos de manera convencional veríamos algo de este tipo:</p>
<div class="consola">gentookde@larry bin % java -jar servicio.jar /tmp/log<br />
^C<br />
gentookde@larry bin % cat /tmp/log<br />
======Mon Oct 05 09:42:05 COT 2009=======<br />
Cantidad de memoria RAM: 3952MB<br />
Total: 4042664<br />
Usada: 3509516<br />
Disponible: 533148<br />
Memoria SWAP total: 1052248<br />
Memoria SWAP usada: 0<br />
Memoria SWAP libre: 1052248</div>
<p style="text-align: justify;">Como puedes ver se trata de una aplicación de consola común y corriente. La aplicación consta básicamente de:</p>
<ul style="text-align: justify;">
<li>El ejecutable servicio.jar ubicado en el directorio bin/</li>
<li>La librería sigar.jar en el directorio lib/</li>
<li style="text-align: justify;">Las librerías específicas de cada arquitectura de sigar en lib/</li>
</ul>
<h3>Pasos para la integración</h3>
<p style="text-align: justify; ">Lo primero es descargar el paquete de <a href="http://wrapper.tanukisoftware.org/doc/english/download.jsp">Java Service Wrapper</a> y descomprimirlo<span style="background-color: #ffffff;">. Supondremos que el directorio donde se encuentra Java Service Wrapper es $RUTA_JSW y que el directorio de la aplicación que  vamos a convertir en servicio es </span><span style="background-color: #ffffff;">$RUTA_APP</span><span style="background-color: #ffffff;">.</span></p>
<h4>1. Copiamos los siguentes archivos al directorio bin de nuestra aplicación de ejemplo&#8230;</h4>
<p style="text-align: justify; "><span style="background-color: #ffffff;"><strong>UNIX/Linux</strong><br />
</span></p>
<div class="consola">cp $RUTA_JSW/bin/wrapper $RUTA_APP/bin/<br />
cp $RUTA_JSW/src/bin/sh.script.in $RUTA_APP/bin/<br />
cp $RUTA_JSW/lib/* $RUTA_APP/bin/</div>
<p style="text-align: justify; ">El archivo $RUTA_JSW/bin/wrapper podría no existir; por lo tanto lo que debes copiar es el archivo wrapper-xxx específico para tu plataforma. Por ejemplo, en este caso estoy usando Gentoo Linux de 64bits por lo tanto copiaré el archivo $RUTA_JSW/bin/wrapper-linux-x86-64.</p>
<p style="text-align: justify; "><strong><span style="background-color: #ffffff;">Windows</span></strong></p>
<div class="consola">copy $RUTA_JSW/bin/ wrapper-windows-x86-32.exe $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ App.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ InstallApp-NT.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ UninstallApp-NT.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/lib/* $RUTA_APP/bin/</div>
<h4>2. Renombramos algunos archivos&#8230;</h4>
<p><strong>UNIX/Linux&#8230;</strong></p>
<p style="text-align: justify;">Ahora debes renombrar el script sh.script.in con el nombre de la aplicación con la que haremos la integración y darle privilegios de ejecución. En este casó se llama simplemente &#8220;servicio&#8221;:</p>
<div class="consola">cd $RUTA_APP/bin<br />
mv sh.script.in servicio<br />
chmod a+x servicio</div>
<p><strong>Windows</strong></p>
<p style="text-align: justify;">Ahora debes renombrar los archivos .bat  para que concuerden con el nombre de la aplicación con la que haremos la integración. En este casó se llama simplemente &#8220;servicio&#8221; (lo puedes hacer usando el explorador si no te gusta usar la consola, pero a mi me daría pena):</p>
<div class="consola">cd $RUTA_APP/bin<br />
move App.bat.in servicio.bat<br />
move InstallApp-NT.bat.in InstallServicio-NT.bat<br />
move UninstallApp-NT.bat.in UninstallServicio-NT.bat</div>
<h4>3. editar archivo de configuración</h4>
<p style="text-align: justify;">Editamos el archivo wrapper.conf y lo dejamos en el directorio $RUTA_APP/conf/. El archivo para este ejemplo tendrá el siguiente contenido (<strong>importante</strong>! lee la explicación si usas Windows):</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: plain;"># Comando de Java
wrapper.java.command=java
# Clase que ejecutara el Wrapper
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
# Librerias necesarias para ejecutar el programa
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=servicio.jar
# Java Library Path (ubicacion de las librerias wrapper.dll o wrapper.so)
wrapper.java.library.path.1=../lib
# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE
# Parametros del programa
wrapper.app.parameter.1=net.casidiablo.servicio.Servicio
wrapper.app.parameter.2=/tmp/log
#********************************************************************
# Wrapper General Properties
#********************************************************************
# Allow for the use of non-contiguous numbered properties
wrapper.ignore_sequence_gaps=TRUE
# Title to use when running as a console
wrapper.console.title=servicio
#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# Name of the service
wrapper.name=jgossip
# Display name of the service
wrapper.displayname=Servicio
# Description of the service
wrapper.description=Monitor de memoria
# Mode in which the service is installed. AUTO_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START
# Allow the service to interact with the desktop.
wrapper.ntservice.interactive=false</pre>
<p><!--INFOLINKS_ON--></p>
<p>Explicación del archivo de configuración:</p>
<ul>
<li style="text-align: justify;"><code>wrapper.java.command=java</code> es el comando para ejecutar java. En este caso es simplemente java porque estoy en Linux y además tengo configurado correctamente el path. En Windows podría ser algo como: c:\archivos de programa\java\jdk1.6\bin\java.exe</li>
<li style="text-align: justify;"><code>wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp</code> indica el archivo a ejecutar es la clase WrapperSimpleApp que se usa en la integración sencilla. Esta clase envoltorio es la que permite ejecutar la aplicación como servicio.</li>
<li style="text-align: justify;"><code>wrapper.java.classpath.1=../lib/wrapper.jar<br />
wrapper.java.classpath.2=servicio.jar</code> indican las rutas o archivos del classpath.</li>
<li style="text-align: justify;"><code>wrapper.java.library.path.1=../lib</code> indica el directorio donde se encuentran las librerías a usar.</li>
<li style="text-align: justify;"><code>wrapper.app.parameter.1=net.casidiablo.servicio.Servicio<br />
wrapper.app.parameter.2=/tmp/log</code> estos son los parámetros que se pasarán al programa. <strong>Importante</strong>: como estamos haciendo la integración simple, el primer parámetro debe ser la clase que contiene el método main de nuestra aplicación.</li>
<li style="text-align: justify;"><code>wrapper.name=jgossip</code> esta opción es para Windows y define el nombre del servicio en el sistema.</li>
<li style="text-align: justify;"><code>wrapper.ntservice.starttype=AUTO_START</code> si estás en windows, define si el servicio quedará configurado para iniciar automáticamente.</li>
</ul>
<h4>4. Probar/Instalar el servicio&#8230;</h4>
<p style="text-align: justify;">Ahora veremos cómo podemos probar la aplicación para asegurarnos que ha quedado bien configurada antes de proceder con la instalación.</p>
<p><strong>UNIX/Linux</strong></p>
<p style="text-align: justify;">Ejecutamos el script &#8217;servicio&#8217; que configuramos en el paso 1 y 2 con el parámetro console:</p>
<div class="consola">./servicio console</div>
<p>Deberías ver algo como:</p>
<div class="consola">Running un servicio que escribe cosas&#8230;<br />
wrapper  | &#8211;&gt; Wrapper Started as Console<br />
wrapper  | Java Service Wrapper Community Edition 64-bit 3.3.6<br />
wrapper  |   Copyright (C) 1999-2009 Tanuki Software, Ltd.  All Rights Reserved.<br />
wrapper  |     http://wrapper.tanukisoftware.org<br />
wrapper  |<br />
wrapper  | Launching a JVM&#8230;<br />
jvm 1    | WrapperManager: Initializing&#8230;</div>
<p style="text-align: justify;">Lo detienes presionando Ctrl+C. Ahora, si queremos probarlo como demonio basta con ejecutar los comandos típicos de un demonio en UNIX/Linux:</p>
<div class="consola">$ ./servicio start<br />
Starting un servicio que escribe cosas&#8230;<br />
$ ./servicio stop<br />
Stopping un servicio que escribe cosas&#8230;<br />
Stopped un servicio que escribe cosas.</div>
<p style="text-align: justify;">Para instalarlo basta con crear un enlace simbólico del script en el directorio /etc/init.d y añadirlo al listado de servicios a iniciar; por ejemplo:</p>
<div class="consola">sudo ln -sv $RUTA_APP/bin/servicio /etc/init.d/servicio<br />
sudo rc-update add servicio default</div>
<p><strong>Windows</strong></p>
<p style="text-align: justify;">Para instalarlo en Windows basta con ejecutar el archivo InstallServicio-NT.bat. Puedes verificar que fue instalado correctamente accediendo a la consola de administración de servicios de NT (ejecutas el comando services.msc):</p>
<p><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_001.png"><img class="aligncenter size-full wp-image-3460" title="servicio windows java" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_001.png" alt="servicio windows java" width="778" height="566" /></a></p>
<h3>Fuentes y descargas</h3>
<p>Aunque en esta entrada no explico cómo hacer la integración avanzada, he preparado un ejemplo completo que puedes descargar en el listado de abajo.<strong><br />
</strong></p>
<ul>
<li><a href="http://wrapper.tanukisoftware.org/doc/">Puedes encontrar más documentación en la página oficial del proyecto</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+bin">Descargar el laboratorio de esta entrada</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+src">Descargar el código fuente del laboratorio</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Avanzado+Java+src"><strong>Descargar código fuente y laboratorio de la integración avanzada</strong></a></li>
</ul>
<p><br/><br/><br/></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/daemon/" rel="tag nofollow">daemon</a>, <a href="http://casidiablo.net/tag/demonio/" rel="tag nofollow">demonio</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/servicio/" rel="tag nofollow">servicio</a>, <a href="http://casidiablo.net/tag/solaris/" rel="tag nofollow">solaris</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/unix/" rel="tag nofollow">unix</a>, <a href="http://casidiablo.net/tag/windows/" rel="tag nofollow">Windows</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/correr-programa-java-como-demonio/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
