miércoles, 15 de junio de 2011

Remasterizar con Remastersys

Este mini-manual está hecho para las distribuciones Ubuntu Lucid/Maverick, y se utiliza con línea de comandos sobre la terminal y con programas de interfaz gráfica.

Remasterización es un término que se utiliza en la edición de audio y vídeo cuando se vuelve a grabar un master (conjunto de pistas o grabaciones que se unen en estereo o merdiante multipistas) y se mejora su calidad de sonido.
En las distribuciones de GNU/Linux se utiliza este término cuando se vuelve a empaquetar una distribución.
Primero lo primero, configuramos una distribución con los paquetes que se desean, en otras palabras, se instala una máquina con ubuntu, se instala o quita los paquetes que se quiere, se modifica la apariecia y listo.


Instalar Remastersys


Remastersys es un software que se utiliza para "remasterizar" distribuciones basadas en Debian o Ubuntu. Para poder instalarlo en nuestra máquina primero se debe agregar los repositorios. Para esto se escribe en la línea de comandos:
# add-apt-repository deb http://www.geekconnection.org/remastersys/repository ubuntu/

Luego se actualiza la lista de paquetes para que cargue los del nuevo repositorio.
# apt-get update

Con esto hecho se procede a instalar el programa
# apt-get install remastersys


Utilizar Remastersys

Respaldando completamente el sistema (Backup)


Remastersys nos permite crear un respaldo instalable de toda nuestra máquina, incluyendo la información contenida en nuestro directorio "/home". Esto es muy útil si se quiere instalar máquinas clones, con usuarios y configuraciones iguales, a esta opción se le llama "backup". Para realizar un respaldo completo del sistema utilizamos la opción 'backup' de la siguiente manera:
# remastersys backup

Con esto se crea la estructura de directorio y la imagen ISO del disco con la distribución. En otras palabras, todos los directorios y archivos necesarios para el arranque desde el liveCD/DVD junto con la imagen ISO lista para quemar. Con esto tendríamos una distribución lista para instalar una vez quemada la imagen ISO generada, pero con un menú genérico que trae Remastersys por defecto.

Si se quiere modificar este menú de arranque, archivos, configuraciones o agregar/quitar paquetería, se deben modificar los archivos que se crean en la carpeta "/home/remastersys/". Pero antes de eso se genera únicamente la estructura de directorio, esto con el comando:
# remastersys backup cdfs

CDfs: viene del inglés CD File System.

Con esto se crea la estructura de archivos y directorios que tendrá nuestro LiveCD/DVD, y podemos hacer las modificaciones que deseemos. la estructura de directorios en el liveCD/DVD se encuentra en la ruta "/home/remastersys/remastersys/ISOTMP" y es la siguiente:

(Raíz del CD/DVD)
|-------+casper
| |-------filesystem.${FORMAT}
| |-------filesystem.manifest (Opcional)
| |-------filesystem.manifest-desktop (Opcional)
|
|-------+boot
| |--------+grub
| | |--------menu.lst
| | |--------stage2_eltorito
| |
| |-------vmlinuz
| |-------initrd.gz
| |-------memtest86+
|
|--------md5sum.txt

Seguido se presenta una lista con las principales características de cada uno de los ítemes.
  • /casper/filesystem.${FORMAT}: Este es el contenedor del sistema de archivos Linux que vamos a copiar de nuestro disco duro. Por lo general, un sistema de archivos comprimidos con squahsfs.Pero puede ser un sistema de archivos UNIX comunes como ext2.
  • /casper/filesystem.manifest: Este archivo es opcional. Sólo se necesita si usted decide incluir el instalador de Ubuntu en el CD.
  • /casper/filesystem.manifest-desktop: Este archivo es opcional. Sólo se necesita si usted decide incluir el instalador de Ubuntu en el CD.
  • /boot/grub/menu.lst: Archivo que contiene las opciones de arranque para el LiveCD/DVD.
  • /boot/grub/stage2_eltorito: Es el cargador de arranque del CD/DVD. (stage2 del grub).
  • /boot/vmlinuz: El kernel linux. Es una copia del sistema de directorios de linux.
  • /boot/initrd.gz: Es el initramfs es el que contienen las personalizaciones necesarias para el live CD / DVD.
  • /boot/memtest86+: Archivo opcional que se utiliza para hacer una prueba de la RAM de la máquina desde el live CD/DVD.
  • /md5sum.txt: Archivo opcional que contiene el checksums para todos los archivos del CD/DVD.

En esa estructura se pueden modificar cosas, con cuidado de no tocar archivos importantes, y personalizar más el live CD/DVD como venimos diciendo, una vez que tengamos todos listo (en otras entregas daré más información y cosas que se pueden hacer).

Una vez hechos los cambios deseados procedemos a crear la imagen del nuestra nueva distribución, esto mediante el comando:
# remastersys backup iso _/ruta


Ahora "quemamos" la imagen del ISO, que se encuentra en la ruta establecida en el comando anterior, con toda la información de nuestro home, configuraciones. nuestra red ;).

Haciendo una distribución para un amigo (dist)

La otra opción es remasterizar un distro instalable, solo con los archivos de configuración y paquetes que deseemos, sin tocar los datos de la carpeta "/home". Esto para facilitarle la tarea a nuestros amigos, o bien, ahorrarnos trabajo a la hora de tener que instalar muchas máquinas con la misma paquetería en una red corporativa. Esto se hace mediante el comando:

# remastersys dist


Al igual que con "backup", "dist" nos permite utilizar las opciones "cdsf" e "iso". As&'iacute; que si desean personalizar algo de la distro siguen los pasos que se describieron arriba.

domingo, 8 de mayo de 2011

Modificación básica del instalador de Ubuntu mediante Ubiquity

Ubuntu para su instalador utiliza el paquete ubiquity (basado en debian installer) el cual nos brinda la todas las opciones y vistas de instalación que se presentan en este proceso.


Obtención del paquete ubiquity


Ubuntu tiene una muy amplia gama de paquetes que proporcionan herramientas de software de todo tipo. Si se quiere obtener información sobre un paquete o descargarlos se puede recurrir al sitio web http://packages.ubuntu.com/.

Para buscar el paquete que se desea, en nuestro caso y como el nombre del artículo lo dice es ubuquity, se digita en la sección de búsqueda, previamente seleccionada la distribución respectiva, como lo vemos a continuación:



Esto nos genera una lista con los paquetes encontrados y seleccionamos el que buscamos, para este ejemplo:



Lo interesante de esto es que, en la gran mayoría de paquetes, se puede descargar el código fuente, normalmente a la derecha del sitio web, para su modificación, haciendo valer uno de los derechos fundamentales del software libre. En este paquete no es la excepción, por lo cual bajamos el archivo que tiene la extención "tar.bz2" (recordar descargarlo en un lugar donde se pueda accesar para modificar luego sus archivos):




Una vez descargado el archivo lo descomprimimos mediante el siguiente comando:

$ tar jvxf /ruta/archivo.tar.bz2

Lo mismo va para el paquete "ubiquity-slideshow-ubuntu" el cual descargamos siguiendo los pasos antes descritos. Y estamos listos para empezar a trabajar.


Modificación de los contenidos del paquete



Este punto es muy relevante, y me quiero detener un poco para recalcar la importancia de ser perseverantes y traviesos, como niños que desarman las cosas para saber como funcionan, pues eso exactamente es lo que hay que hacer, desarmar el paquete, que es ese conjunto de archivos y carpetas que a la hora de compilarse dan vida a uno o varios programas, y ver cada parte, estudiarla y aprender como funciona. Para esto está la documentación que los desarrolladores dejaron.

Paquete Ubiquity

Lo primero que hacemos es ver el árbol de directorios con que cuenta el paquete. esto mediante el comando:
$ ls /ruta/directorio_paquete
Este comando lo que hace es mostrar los elementos presentes en una carpeta, y nos ofrece el siguiente resultado:



(las letras azules representa que el elemento es una carpeta, y las verdes que son ejecutables) Entre las cosas que nos interesa cambiar, está el nombre de la distribución, agregar a los colaboradores que están modificando el paquete en la documentación (mérito a quien mérito merece), cambiar imágenes, etc. Por lo tanto describiré el contenido de algunas carpetas:

  • debian: En esta carpeta se encuentran los archivos de configuración donde se describen las rutas de instalación del paquete una vez que se compile, además de las traducciones según el idioma que se elija
  • d-i: En esta carpeta se encuentra el instalador de debian a modo texto, todos sus archivos de configuración y los archivos necesarios para su compilación
  • doc: Acá se encuentran los archivos de documentación del paquete ubiquity
  • gui: En ella se definen las pantallas de la interface gráfica de usuario, cada componente y texto que en ella se muestra.
  • pixmaps: Dentro están los íconos e imágenes que se utilizan en las pantallas de instalación.
  • po: En la carpeta se encuentran algunas opciones de traducción de la aplicación (cualquier carpeta con el nombre "po" nos da esas opciones en este paquete)
  • ubiquity: Acá es donde está el código fuente de la instalación mediante ubiquity.
Lo que se hace una vez se conoce la estructura de un paquete es empezar a modificarlo, para cambiar las imágenes se modificaría la carpeta pixmaps por ejemplo, si se quiere cambiar de posición de esta imágen nos iríamos al formulario descrito en la carpeta "gui".

Al confeccionar una distribución nueva se tiene que identificar en cada parte del código y documentación, pero dejando créditos a quien créditos merece, osea, dejar los créditos de las personas que han participado en el desarrollo del paquete con anterioridad.


Paquete ubiquity-slideshow-ubuntu



Al igual que con el paquete anterior se empieza por ver el contenido del paquete, para lo cual utilizamos el comando:
$ ls /ruta/directorio_paquete

lo cual nos muestra el siguiente resultado:


Este paquete es un poco más complicado, pues tiene ejemplos de slideshows (tiras de imágenes) de varias distribuciones, y nos brinda herramientas para probar como va quedando el trabajo realizado. En la raíz del paquete los elementos que nos interesan por ahora serían:

  • debian: Carpeta donde se encuentran todos los archivos necesarios para la compilación del paquete.
  • po: Carpeta donde se encuentran todos los archivos de traducciones según la distribución
  • slideshows: Carpeta que contiene los archivos de configuración, contenido e imágenes presentes en la instalación de la distribución.
  • AUTHORS: Archivo donde se encuentran los nombres de las personas que participaron en la modificación del paquete.
  • slideshow.ui: Archivo que establece la estructura de la ventana de slideshow
  • test-slideshow.sh : Archivo que nos permite ver el resultado de las modificaciones realizadas.
  • update-launchpad-translation.sh Archivo que refresca la carpeta build, que es la que tiene la compilación del paquete.


Haciendo los slideshows



Si observamos dentro de la carpeta slideshows, nos encontramos muchas carpetas con nombres de distribuciones. Estos son los slideshows que aparecen en cada distribución. Para nuestro caso, debemos crear una carpeta dentro, junto a las otras distribuciones, con el nombre de nuestro proyecto:
$ mkdir /ruta/ubiquity-slideshow-ubuntu/slideshows/Nombre_Distribucion


dentro de esta carpeta creamos un archivo llamado "slideshow.conf",donde se establece el tamaño de la tira de imágenes. Se puede hacer con un editor de texto y guardarlo dentro de la siguiente manera:
$ nano /ruta/ubiquity-slideshow-ubuntu/slideshows/Nombre_Distribucion/slideshow.conf
y dentro del archivo:
[Slideshow]
width:752
height:530


Luego creamos la carpeta "slides", que contendrá todos los archivos que se mostrarán al usuario final:
$ mkdir /ruta/ubiquity-slideshow-ubuntu/slideshows/Nombre_Distribucion/slides
Seguido a esto nos posicionamos en la recién creada carpeta:
$ cd /ruta/ubiquity-slideshow-ubuntu/slideshows/Nombre_Distribucion/slides
La estructura que debe tener la carpeta "slides" es la siguiente:
  • icons: Carpeta donde se guardan todos los iconos que se utilizaran en los slides.
  • link: Carpeta donde se guardan imagens y las hojas de estilo que se utilizan los slides
  • link-core: Carpeta donde se guardan los scripts que manejan la operabilidad de los slides
  • screenshots: Carpeta donde se guardan las capturas de pantalla que se muestran en cada slide.
  • index.html: archivo donde se establecen cuales slides se mostrarán durante la instalación, el tiempo que durará cada slide y los scripts utilizados y otras cosas. En resumen es el archivo que ordena que y como se verá.
  • _slides.html: representa los slides, tiene que haber un archivo html con una estructura determinada para cada slide que se quiera mostrar. Esta estructura será necesaria para que se muestren los slides en el pase de imágenes.



Para ahorrarnos el esfuerzo, podemos copiar copiar de los slideshows de otra distribución las carpetas: icons, link, link-core, y screenshots; además del archivo index.html. Con esto solo queda modificar cada elemento según nuestra necesidad.

Ahora haremos un slide, este recomiendo que sea la versión en inglés (más adelante en el tutorial se mostrará como crear la traducción), para ello creamos un archivo con un nombre descriptivo a lo que queramos mostrar, por ejemplo music.html:
$ nano music.html


Este es una simple página web que se muestra en el slideshow, y como toda página web su estructura se puede definir con una hoja de estilos (en nuestro caso la ubicamos en /link/general.css según lo copiado anteriormente). Es bueno definir bien la estructura que se desea seguir y hacerlo un estandar para el diseño de todas las slides. El slide que creamos queda así:
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  <title></title>
  <link href="link/general.css" rel="stylesheet" type="text/css">
</head>

<body>

<div class="header">
<h1 class="slidetitle">Make your sounds</h1>
</div>

<div class="main">

<div class="text">

<div>
<p>With Audacity you can edit audio like a professional. With a variety of
effects, versatility and intuitive way to work the audio editing is easy and
fun. </p>
</div>

<div class="featured">
<h2 class="subtitle">Included software</h2>
<ul>
  <li><img class="icon" src="icons/audacity.png">
    <p class="caption">Audacity Audio Editor</p>
  </li>
</ul>
</div>
</div>
<img class="screenshot" src="screenshots/music.jpeg"> </div>
</body>
</html>
Este paso se repite por cada slide que queramos mostrar en la instalación..


Por haber hecho los slides lo siguiente es configurar el archivo "index.html", este a diferencia del anterior si tiene que tener una estructura, pues usaremos los scripts que copiamos en la carpeta "link-core". A continuación muestro un ejemplo, con resaltado sin negrita el donde ubicamos los slides que habíamos creado:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  <title>ubiquity-slideshow-innovaOS</title>
  <link href="link/general.css" rel="stylesheet" type="text/css">
  <base target="_blank">
  <script type="text/javascript" src="link-core/jquery.js">
 </script>
  <script type="text/javascript" src="link-core/jquery.cycle.all.js">
 </script>
  <script type="text/javascript" src="directory.js">
 </script>
  <script type="text/javascript">
                 SLIDESHOW_OPTIONS = {
                         timeout:50000,
                         speed:600,
                 }
  </script>
  <script type="text/javascript" src="link-core/slideshow.js">
 </script>
</head>

<body>

<div id="slideshow">

<div>
<a href="welcome.html"></a></div>

<div>
<a href="usc.html"></a></div>

<div>
<a href="photos.html"></a></div>

<div>
<a href="music.html"></a></div>

<div>
<a href="education.html"></a></div>

<div>
<a href="office.html"></a></div>

<div>
<a href="gethelp.html"></a></div>
</div>

<div id="controls">
<a class="control-arrow" id="prev-slide"></a> <a class="control-arrow"
id="next-slide"></a> <input type="hidden" id="current-slide"> </div>
</body>
</html>


Ahora que tenemos configurados los slides (hechos en inglés para nuestro ejemplo) nos dispondremos a traducir los slides. Para ello nos dirigimos al la carpeta ubicada en "/ruta/paquete/po":
$ cd /ruta/paquete/po


Dentro de ella encontramos carpetas con los nombres de varias distribuciones, entonces debemos crear una para la nuestra:
$ mkdir nombre_distribucion
Y nos posicionamos en ella:
$ cd nombre_distribucion


Dentro se crean archivos de traducción por cada idioma que se desee, nosotros solo haremos un archivo para el idioma español, Ahora bien, el nombre del archivo se define con la abreviatura en 2 letras del idioma más la extención "po".
$ nano es.po
Para más información y ver el funcionamiento de este tipo de archivos pueden consultar el blog de "120% linux" en el artículo: http://120linux.com/traduciendo-aplicaciones-editando-archivos-po/.


Con esto tenemos "casi" terminada esta pequeña travesía, para acabar debemos actualizar los archivos de contrucción. Ejecutamos el archivo "update-launchpad-translations.sh":
$ sh /ruta/paquete/update-launchpad-translations.sh



Para probar nuestro trabajo podemos utilizar el archivo "test-slideshow.sh", él nos dará una lista con las distribuciones y escojemos la nuestra.
y una vez escogido vemos nuestro resultado:

miércoles, 6 de abril de 2011

Configuarión de gnome desde consola con el comando gconftool-2


Para establecer por defecto siertos valores como el fondo de pantalla, iconos y themas del gdk, se utiliza el comando “gconftools-2″ de consola, lo cual afecta a cada usuario presente o nuevo usuario dependiendo del caso.

el comando se compone de varias partes:

  • gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory \  = Define el recurso que se quiera modificar, además si es por defecto o reglamentario
  • –type string \  = Define el tipo de la entrada
  • –set /desktop/gnome/background/picture_filename nombre-de-archivo.png  = define la entrada a modificar y el valor que se quiere modificar.

Así entonces, si se quiere definir por defecto un fondo de pantalla el comando en la consola, como super usuario, sería:

gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \

–type string \

–set /desktop/gnome/background/picture_filename nombre-de-archivo.png

Si se quiere modificar el paquete de íconos por defecto en nuestra distro entonces pondríamos:
gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \

–type string \

–set /desktop/gnome/interface/icon_theme nombre-de-tema

O bien si se quiere modificar el thema del gtk:
gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \

–type string \

–set /desktop/gnome/interface/gtk_theme nombre-del-tema

Crear tema de Plymouth para el arranque del sistema

Este mini-manual está hecho para las distribuciones Ubuntu Lucid/Maverick, y se utiliza con línea de comandos sobre la terminal.


Antes de empezar se debe descargar el paquete simply_line que se encuentra en gnome-look.org, donde escogemos la versión de plymouth. Esto nos descargará un ".deb", el cual debemos abrir con el gestor de archivadores (como file-roller que es el que viene por defecto en Ubuntu). Nos posicionamos en de la ruta /lib/plymouth/themes/ dentro del paquete .deb y copiamos en el Escritorio (por cuestiones prácticas en este lugar es donde se realizarán los trabajos) la carpeta simply_line/, la cual es el tema que vamos a trabajar. Se procede seguido a cambiar el nombre de la carpeta por uno nuevo, el cual será el nombre del nuevo tema, en nuestro caso "innovaOS". Para esto utilizamos el comando mv desde la consola de comandos:
mv /home/usuario/Escritorio/simply_line /home/usuario/Escritorio/innovaOS

Entonces se debería tener una ruta como /home/usuario/Escritorio/innovaOS/ y dentro de ella unos archivos que en transcurso del manual se detallará para qué sirven.
Como se puede hacer notar el método de utilización para la creación del tema en este mini-manual es "La modificación" (gracias al software libre y sus libertades ;)). El tema a realizar se llamará InnovaOS.


Partes de un tema Plymouth

Un thema en plymouth es básicamente una serie de archivos en una carpeta, la carpeta tiene el nombre del tema que quiere crear. Esta carpeta se encuentra en una ruta específica que se verá más adelante, pero para su trabajo y modificación se puede hacer desde cualquier parte (como el escritorio /home/usuario/Escritorio). Para nuestro ejemplo del tema innovaOS la ruta sería: /home/usuario/Escritorio/innovaOS
Normalmente lleva el nombre del tema más la extensión "plymouth" (ejemplo simply_line.plymouth). En la configuración de un tema nuevo mediante el método de modificación, como es nuestro caso, se le cambiaría el nombre respetando la extensión (ejempo tu_tema.plymouth).
En el contenido de este archivo se establece el nombre, la descripción y las características de los archivos de script. Posee 2 características:


  • ImageDir: carpeta donde se encuentran las imágenes a utilizar en el tema
  • ScriptFile: se establece la ruta y nombre del archivo de script que tiene la programación del tema Plymouth.

El contenido del archivo sería:
[Plymouth Theme]
Name=Nombre del Tema
Description= Descripción que deseamos mostrar en el tema

ModuleName=script
[script]
ImageDir=/lib/plymouth/themes/nombre_del_tema
ScriptFile=/lib/plymouth/themes/nombre_del_tema/script.script


Archivos de imágenes.


Son todos los archivos de imágenes que se utilizarán para hacer nuestras animaciones, la ruta donde se encuentran se establece en el archivo de configuración. Pero a la hora de trabajar y modificar el thema lo trabajaremos en la carpeta que creamos al principio (en nuestro ejempo /home/usuario/Escritorio/innovaOS).


Archivo del script de programación.


El archivo que tiene todas las tareas y procedimientos que realizará plymouth según nosotros lo definamos. Este se encuentra en la ruta establecida en el archivo de configuración de plymouth, igual el nombre que debe tener
Antes de continuar se debe conocer un poco sobre el lenguaje de script utilizado por plymouth, para esto se debe leer el artículo publicado en freedesktop.org sobre el como programar en el lenguaje de script de plymouth.





Modificando nuestro tema



Primero cambiamos el nombre de la carpeta que anteriormente sacamos del paquete del tema de "simply_line" por "innovaOS". Esto se puede hacer en la linea de comandos con el comando mv:


# mv -R /home/usuario/Escritorio/simply_line /home/usuario/Escritorio/innovaOS




 nos posicionamos dentro de la carpeta del tema:



# cd /home/usuario/Escritorio/innovaOS



Editamos el archivo de configuración del plymouth, lo primero es cambiar el nombre del archivo por "innovaOS.plymouth". 


# mv simply_line.plymouth innovaOS.plymouth

Luego el contenido con un editor de texto (usaremos nano, pero pueden utilizar gedit, vi,kate o el que quieran):


# nano innovaOS.plymouth

quedando de la siguiente manera:

[Plymouth Theme]
Name=InnovaOS


Description= Innovando para vos


ModuleName=script



[script]

ImageDir=/lib/plymouth/themes/innovaOS

ScriptFile=/lib/plymouth/themes/innovaOS/script.script




Con respecto a las imágenes el tema que estamos modificando trae algunas interesantes, como las referentes a la barra de carga, estas imágenes se pueden sobrescribir por otras y así de fácil ya cambiamos un poco la apariencia de nuestra animación de arranque, eso sí, se debe respetar completamente el nombre que ya trae por defecto, caso contrario no aparecería y se tendría que modificar el script de programación. Para sobrescribir el archivo de imagen se puede hacer con un "cp" desde la línea de comandos:

# cp /ruta/imagen.png /home/usuario/Escritorio/innovaOS/progress_bar.png

Para agregar más imágenes en caso necesario se pueden también copiar dentro, por ejemplo:

# cp /ruta/logo.png /home/usuario/Escritorio/innovaOS/



Cuando agregamos una imagen nueva, o queremos hacer un cambio en la animación, se debe modificar el archivo de script que se encuentra dentro de la carpeta del tema que se está trabajando. Tomando el ejemplo anterior donde se agregó la imagen logo.png que no se encuentra dentro de la animación se puede agregar en el archivo (recordemos que el nombre del archivo es script.script y se establece en la propiedad ScriptFile del archivo de configuración), manteniendo cierta proporción entre el ancho y el alto, mediante el script:

#-------------------------------------- Logo --------------------------------

logo.original_image = Image("logo.png");

relacion =  (Window.GetWidth() / 4) / logo.original_image.GetWidth() ;

logo.image = Image("logo.png").Scale(Window.GetWidth() / 4 , logo.original_image.GetHeight() * relacion);
logo.sprite = Sprite(logo.image);
logo.sprite.SetOpacity(0);
logo.x = Window.GetX() + Window.GetWidth() / 2 - logo.image.GetWidth() / 2;
logo.y = Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2;
logo.sprite.SetPosition(logo.x, logo.y, 200);

Es muy importante tener orden, y documentar bien todos los cambios y partes del código, como son las buenas prácticas de cualquier lenguaje de programación, para su mantenimiento y que cualquier persona que quiera modificar luego el tema pueda hacerlo sin mayor inconveniente. Así el contenido del archivo script.script que agrega "logo.png" puede quedar:



# This is an example plymouth plugin script



Window.SetBackgroundTopColor(0.0, 0.0, 0.0);



#-------------------------------- Dialogue --------------------------------



status = "normal";



fun dialog_setup()

  {

    local.box;

    local.lock;

    local.entry;

    

    box.image = Image("box.png");

    lock.image = Image("lock.png");

    entry.image = Image("entry.png");
    
    box.sprite = Sprite(box.image);
    box.x = Window.GetX() + Window.GetWidth()  / 2 - box.image.GetWidth ()/2;
    box.y = Window.GetY() + Window.GetHeight() / 2 - box.image.GetHeight()/2;
    box.z = 10000;
    box.sprite.SetPosition(box.x, box.y, box.z);
    
    lock.sprite = Sprite(lock.image);
    lock.x = box.x + box.image.GetWidth()/2 - (lock.image.GetWidth() + entry.image.GetWidth()) / 2;
    lock.y = box.y + box.image.GetHeight()/2 - lock.image.GetHeight()/2;
    lock.z = box.z + 1;
    lock.sprite.SetPosition(lock.x, lock.y, lock.z);
    
    entry.sprite = Sprite(entry.image);
    entry.x = lock.x + lock.image.GetWidth();
    entry.y = box.y + box.image.GetHeight()/2 - entry.image.GetHeight()/2;
    entry.z = box.z + 1;
    entry.sprite.SetPosition(entry.x, entry.y, entry.z);
    
    global.dialog.box = box;
    global.dialog.lock = lock;
    global.dialog.entry = entry;
    global.dialog.bullet_image = Image("bullet.png");
    dialog_opacity (1);
  }
    
fun dialog_opacity(opacity)
  {
    dialog.box.sprite.SetOpacity (opacity);
    dialog.lock.sprite.SetOpacity (opacity);
    dialog.entry.sprite.SetOpacity (opacity);
    for (index = 0; dialog.bullet[index]; index++)
      {
        dialog.bullet[index].sprite.SetOpacity(opacity);
      }
  }

fun display_normal_callback ()
  {
    global.status = "normal";
    if (global.dialog)
      dialog_opacity (0);
  }

fun display_password_callback (prompt, bullets)
  {
    global.status = "password";
    if (!global.dialog)
dialog_setup();
    else
dialog_opacity(1);
    for (index = 0; dialog.bullet[index] || index < bullets; index++)
      {
        if (!dialog.bullet[index])
          {
            dialog.bullet[index].sprite = Sprite(dialog.bullet_image);
            dialog.bullet[index].x = dialog.entry.x + index * dialog.bullet_image.GetWidth();
            dialog.bullet[index].y = dialog.entry.y + dialog.entry.image.GetHeight() / 2 - dialog.bullet_image.GetHeight() / 2;
            dialog.bullet[index].z = dialog.entry.z + 1;
            dialog.bullet[index].sprite.SetPosition(dialog.bullet[index].x, dialog.bullet[index].y, dialog.bullet[index].z);
          }
        if (index < bullets)
          dialog.bullet[index].sprite.SetOpacity(1);
        else progress_box.image = Image("progress_box.png");
progress_box.sprite = Sprite(progress_box.image);
          dialog.bullet[index].sprite.SetOpacity(0);
      }
  }

Plymouth.SetDisplayNormalFunction(display_normal_callback);
Plymouth.SetDisplayPasswordFunction(display_password_callback);



#-------------------------------- Progress Bar --------------------------------

progress_box.image = Image("progress_box.png");
progress_box.sprite = Sprite(progress_box.image);

progress_box.x = Window.GetX() + Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;
progress_box.y = Window.GetY() + Window.GetHeight() * 0.75 - progress_box.image.GetHeight() / 2;
progress_box.sprite.SetPosition(progress_box.x, progress_box.y, 100);

progress_bar.original_image = Image("progress_bar.png");
progress_bar.sprite = Sprite();

progress_bar.x = Window.GetX() + Window.GetWidth()  / 2 -        progress_bar.original_image.GetWidth() / 2;
progress_bar.y = Window.GetY() + Window.GetHeight() / 2 * 1.5  - progress_box.image.GetHeight() / 2 + (progress_box.image.GetHeight() - progress_bar.original_image.GetHeight()) / 2;
progress_bar.sprite.SetPosition(progress_bar.x, progress_bar.y, 1);

fun progress_callback (duration, progress)
  {
    if (progress_bar.image.GetWidth () != Math.Int (progress_bar.original_image.GetWidth () * progress))
      {
        progress_bar.image = progress_bar.original_image.Scale(progress_bar.original_image.GetWidth(progress_bar.original_image) * progress, progress_bar.original_image.GetHeight());
        progress_bar.sprite.SetImage (progress_bar.image);
      }
  }

Plymouth.SetBootProgressFunction(progress_callback);




#--------------------------------- Background ---------------------------------

background.image = Image("background.png").Scale(Window.GetWidth() , Window.GetHeight());
background.sprite = Sprite(background.image);
background.x = Window.GetX() + Window.GetWidth() / 2 - background.image.GetWidth() / 2;
background.y = Window.GetY() + Window.GetHeight() / 2 - background.image.GetHeight() / 2;
background.sprite.SetPosition(background.x, background.y, 0);



#-------------------------------------- Logo --------------------------------

logo.original_image = Image("logo.png");

relacion =  (Window.GetWidth() / 4) / logo.original_image.GetWidth() ;

logo.image = Image("logo.png").Scale(Window.GetWidth() / 4 , logo.original_image.GetHeight() * relacion);
logo.sprite = Sprite(logo.image);
logo.sprite.SetOpacity(0);
logo.x = Window.GetX() + Window.GetWidth() / 2 - logo.image.GetWidth() / 2;
logo.y = Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2;
logo.sprite.SetPosition(logo.x, logo.y, 200);



#---------------------------------------- Quit --------------------------------

fun quit_callback ()
{
  logo.sprite.SetOpacity (1);
}

Plymouth.SetQuitFunction(quit_callback);

#----------------------------------- Message --------------------------------

message_sprite = Sprite();
message_sprite.SetPosition(10, 10, 10000);

fun message_callback (text)
{
  my_image = Image.Text(text, 1, 1, 1).Scale(Window.GetWidth() * 0.75, Window.GetHeight() * 0.035);
  message_sprite.SetImage(my_image);
}

Plymouth.SetMessageFunction(message_callback);
Una vez terminado de modificar el script procedemos a mostrarlo en el arranque de nuestro ordenador para ver el resultado. Nos posicionamos en la ruta que contiene la carpeta del tema:
# cd /home/usuario/Escritorio

Se copia la carpeta del tema en la ruta por defecto para temas de plymouth (en el caso de ubuntu lucid/Maverick sería):
# cp -R innovaOS/ /lib/plymouth/themes/
Ahora se establecerá nuestro tema innovaOS como tema predeterminado, el que aparecerá cada vez que se inicie la máquina. Esto  mediante el comando update-alternatives, que es un script que nos permite definir las aplicaciones por defecto. primero se instala el tema en las opciones de plymouth:
# update-alternatives --install /lib/plymouth/themes/default.plymouth default.plymouth /lib/plymouth/themes/InnovaOS/InnovaOS.plymouth 100
Se configura las opciones de plymouth para establecer la opción predeterminada a la hora del arranque:

# update-alternatives --config default.plymouth
lo cual genera la siguiente salida:

Hay 2 opciones para la alternativa default.plymouth (proporcionando /lib/plymouth/themes/default.plymouth)

  Selección   Ruta                                                   Prioridad  Estado
------------------------------------------------------------
  0            /lib/plymouth/themes/innovaOS/innovaOS.plymouth         100       modo automático
  1            /lib/plymouth/themes/innovaOS/innovaOS.plymouth         100       modo manual
  *2            /lib/plymouth/themes/ubuntu-logo/ubuntu-logo.plymouth   100       modo manual

Pulse <Intro> para mantener el valor por omisión [*] o pulse un número de selección: 


Se escoge en este caso la opción 1 que es la de nuestro tema.

# update-initramfs -u





Como hacer un buen tema en plymouth



Plymouth es un programa configurable por medio de scripting. Lo cual quiere decir que se tiene que, como se diría en mi tierra, programar. y la única forma de aprender a programar en cualquier lenguaje, es programando, así que ha hecharce la soga al cuello y practicar.
>
Entonces, para poder hacer un buen tema en plymouth se necesita:

  • Un editor de texto
  • Un editor de imágenes
  • Constancia
  • Perseverancia
  • Paciencia
  • Ingenio
  • Innovación
  • Imaginación
  • demás cosas que se te ocurra
  • y más paciencia ;)



Para un poco más de información se puede consultar:

miércoles, 23 de marzo de 2011

Modificación de la ventana Login del nuevo GDM de Ubuntu

Este mini-manual está hecho para las distribuciones Ubuntu Lucid/Maverick, y se utiliza con línea de comandos sobre la terminal.


Configuración de la apariencia


Lo mejor es antes de empezar guardar la imágen de fondo que desamos utilizar en una zona neutral, como la ruta /usr/share/backgrounds que es donde se guardan los fondos de escritorio por defecto en Ubuntu, esto lo podemos hacer mediante el comando "cp" de la siguiente manera:
# cp /ruta/imagen_a_copiar.png /usr/share/backgrounds

El GDM funciona totalmente bajo gnome, siendo una pequeña instancia de este. Por tanto utiliza muchos de los sistemas de modificación como el gnome-appearance-properties. El usuario que maneja esta instancia se llama "gdm". Se puede sin embargo utilizar y hacer configuraciones desde nuestro usuario de escritorio, para poder hacer estas configuraciones que utilizan una sesión X (como gnome-appearance-properties) se le debe asignar permiso al usuario "gdm" de utilizarla. Esto se hace digitando desde la línea de comandos:
# xhost +SI:localuser:gdm

y se lanza el editor de propiedades de apariencia como si fuera el usuario gdm con el siguiente comando:
$ gksu -u gdm dbus-launch gnome-appearance-properties



una vez aparece la venta de configuraciones se procede modificar las propiedades de la apariencia, como el fondo, tipografías, temas, etc.







Cambiar la imágen del logo en la ventana de autenticación

Antes de hacer las configuraciones del caso debemos tener una imagen para reemplazar la que viene por defecto en la ventana de login. Esta imagen por defecto está en formato SVG y  tiene un tamaño de 64x64 px, sin envargo más adelante veremos como configurar la ventana para que acepte una imagen del tamaño que se desee, pero siempre se debe respetar el tipo de archivo.

Una vez tenemos la imagen del tamaño deseado, se procede a reemplazar la imagen que aparece en el la ventana de login mediante el siguiene comando:
# cp /ruta/imagen_a_reemplazar.svg /usr/share/icons/LoginIcons/apps/64/computer.svg



En este momento, si nuestra imagen es más grande que el valor por defecto de 64x64 px,  esta se reescalará a este tamaño. Para ello configuramos el archivo correspondiente a la ventana de login, ubicada en la ruta "/usr/share/gdm/", y el archivo lleva por nombre gdm-greeter-login-window.ui, el cual está basado en un lenguaje de marcado extensible (XML) , buscamos la línea del objeto "logo-image" y se modifica la propiedad "pixel_size" con el valor numérico deseado. En el caso de nuestro ejemplo se cambia a 300. Si lo notan, este valor solo influye en el ancho, dejando el alto del tamaño que tiene que ser . Para realizar estas configuraciones pueden utilizar cualquier editor de texto, para usos prácticos usaremos "nano" mediante los comandos:



nano /usr/share/gdm/gdm-greeter-login-window.ui





Se guarda el archivo, y si se desea se cierra sesión para ver los resultados. Siendo el resultado final de nuestra travesía por la modificación del GDM el siguiente: