Crear archivos .iso. Programa hecho en java

Hace unos días mientras no había nada que hacer en mi escuela se me ocurrió diseñar este programa que al principio lo vi fácil de hacer, pero que por motivos raros y que aun no encuentro respuesta me llevo mas de lo esperado. Aun que no tanto, lo termine en el transcurso del día con alguna cuantas mañas xD.

El programa solo funciona en Linux tengo que aclarar.

Bueno la idea era simple crear un programa en java que me permitiera crear archivos.iso desde un CD, básicamente consistía en obtener la ubicación de la unidad de CD, elegir el nombre del archivo y crearlo en la carpeta /home/usuario/archivo.iso, donde usuario era el nombre de las carpetas de usuarios que estuvieran en el sistema y que se puede escoger a voluntad.

Todo el proceso se iba a crear mediante una orden en la consola del tipo:

dd if=/dev/cdrom of=/home/usuario/archivo.iso

Hasta ahí todo sencillo únicamente tenia que obtener la unidad de CD seleccionada en la interfaz, la carpeta de usuario y el nombre de archivo escrito, y con ello completar la orden y ejecutarla en la consola de esta manera en java:

Process p;

 p = Runtime.getRuntime().exec("dd if=/dev/cdrom of=/home/usuario/archivo.iso");

Obviamente algo mas complejo pero ese String dentro de la función exec fue el causante de todo mi problema ya que tal y como esta no se ejecuta no tengo idea de por que, con comando mas simples si que se hace una ejecución en consola pero con eso no.

Bueno después de darle vueltas al asunto y buscar en varios foros y no saber el motivo de esto, la solución aun que no tan simple y elegante fue utilizar diversos trucos que se me ocurrieron luego de comer una Wooper JR y tomarme una pepsi (y aclaro no es comercial, ojala y lo fuera y me pagaran).

La solución fue (no se por que primero pienso de maneras muy complejas): crear un programa en C que pudiera leer mediante la entrada estándar un archivo de texto, el cual va a contener toda la orden para crear un archivo iso, (la que esta mas arriba). y después mediante la función system(), que en C sirve para ejecutar un comando, todo ese texto se pasara a esa función y con eso ejecutaría el comando. Listo una solución. A mi archivo lo llame comando, y al programa en C lo llame iso.

Ahora el problema radicaba en como hacer que ese programa se ejecutara y a la vez le pasara el archivo de texto para que lo procesara, en linux podemos hacer esto para pasar mediante la entrada estándar un archivo de texto a un programa:

$ iso < comando

Eso es todo y como ya tenia las dos cosas era simple ejecutar esa instrucción dentro de java con el mismo código que puse arriba. Pero tuve el mismo problema que no se ejecutaba no se la verdad si es por que utilizo < , lo mas seguro es por eso.

Aquí otro problema, ¿como rayos ejecuto eso desde java?, bueno si nos ponemos a pensar que eso fue lo que hice un rato mientras rellenaba mi vaso de pepsi y me percataba de como una chava me veía con ojos de: “este wey que tanto hará en su lap, ¿estará pelando con su novia por que solo se agarra los ojos y ve al cielo?”.

Bueno dije pensemos ¿como ejecutar algo en consola? y dije un script esa es la solución, manos a la obra, un scrip era simple de ejecutar desde java solo tenia que poner: sh script y listo y eso fue lo que hice a mi scrip lo llame comand. Dentro de ese archivo van a ir solo dos lineas:

#! /bin/bash
/home/usuario/carpeta-programa/iso < comand

La creación del script fue entre sencilla y compleja, de echo se me paso decirlo pero cree una clase llamada Herramientas, en la cual hay una función llamada EscribeComando para crear el archivo comand, la cual recibe dos String, uno de tipo String[] que es un arreglo donde va cada linea del archivo y el otro es para el nombre del archivo, de echo muy útil para otras tareas que ya se me ocurrieron.

Pues bien con esa misma función cree el script, al cual le pase las dos lineas, pero tenia un problema ¿como saber toda esa ruta de la segunda linea? (un usuario final guardara la carpeta del programa donde mejor le parezca).

Bien lo primero que hice y se darán cuenta en el código es que mediante mi función EscribeComando, cree el archivo comand vació, para que posteriormente mediante una simple instrucción en java que es:

java.io.File f = new java.io.File("comand"); //en esta parte ya esta creado el archivo comand 
f.getAbsolutePath()

Con f.getAbsolutePath(), obtengo la ruta absoluta del archivo comand que se supone tiene que ser la misma para la carpeta del programa y donde se supone que esta el ejecutable iso, obteniendo eso cree otra función que me descompone la ruta absoluta y le quita al final el nombre del archivo comand y sustituye por iso < comando, con lo que el texto obtenido pasara de:

/home/usuario/carpeta-programa/comand

a esto:

/home/usuario/carpeta-programa/iso < comand

Y escribimos ese String con mi función EscribeComando y listo ya quedo, ahora simplemente le pasamos la orden sh comand y listo ya se esta creando nuestro archivo.iso.

Como ven en la captura el programa es bastante simple, solo escogen la unidad de CD la carpeta de usuario escriben el nombre y le dan al botón.

El programa tiene bastante que mejorar aun que es simple y pequeño tiene algunos bugs y cosas que ya se me ocurrieron hacerle para que sea un programa que nada tenga que envidiar a otros que hacen lo mismo. Aquí las enumero.

  1. El programa no tiene botón de stop, esto hace que una vez comience a crear un iso no se puede parar, a menos que se mate manualmente el proceso dd en consola, una mejora seria hacer un botón que haga lo mismo. Como el botón no esta en un hilo aparte también hace que el programa no responda hasta la finalizar el iso, esto lo deje así ya que si se cerrara el programa se confundiría y no se sabría si ya termino el proceso dd o no, en cambio mientras sigue sin responder sabemos que el proceso no termina aun. Se me ocurren muchas mejoras para esto.
  2. No reconoce la unidades de CD como tal, las que muestra el programa son unidades basadas en mi lógica y conocimientos del sistema. Yo supongo que cdrom sea /dev/cdrom y cdrom1 sea /dev/cdrom1, en caso de haber mas unidades. de momento esto funciona bien.
  3. Se me ocurrió dejar de utilizar el programa echo en C y hacer todo el proceso en un script es mas sencillo y el programa deja de depender de alguien mas, y ya podríamos decir que esta totalmente echo en java.
  4. Estaría bien colocar alguna barra de progreso, aun que no se bien como podría hacer esto, ya que ejecuto procesos fuera del programa y no tengo idea aun de como saber el transcurso del comando dd.
  5. No hice algo para borrar los archivos comando y comand, estaría bien hacerlo para que todo fuera transparente para el usuario.
  6. Las carpetas de usuario solo están basadas en las carpetas que hay dentro de /home y no se puede modificar la ruta a guardar mas que la carpeta de usuario especificada, estaría bien hacer que se pueda guardar el archivo en donde uno quisiera.
  7. Ponerle mis créditos al programa haha.

Bueno estas son algunas ideas, no estoy haciendo nada nuevo pero es un buen ejercicio para no olvidar algunas practicas. Les adjunto el programa en una carpeta donde estará un .jar que es el programa principal y el programa iso, los dos tienen que estar en la misma carpeta para funcionar.

También les adjunto el código fuente de los dos programas, es un proyecto en Eclipse, y el programa en C es bastante sencillo.

Para el archivo .jar deberán tener la maquina virtual de java, si no igualmente viene un ejecutable para 64 bits que se llama cd-iso, lo compile nativo para los que no tienen java, aun que los dos están para 64 bits (de ahí la idea de dejar de usar el programa en C), para todos los archivos tanto el .jar como los dos ejecutables deberán darle permiso de ejecución:

sudo chmod +x cd-iso.jar
sudo chmod +x cd-iso
sudo chmod +x iso

cd-iso

Fuentes

Actualizado

cd-iso-v0.4

2 comentarios en “Crear archivos .iso. Programa hecho en java

  1. Pingback: Crear archivos .iso. Programa echo en java V0.04 | 80 Bits
  2. Pingback: Shutdown. Programa tu equipo para que se apaga en X minutos. Código Fuente | 80 Bits

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s