OpenMandriva: Mageia (Mageia 9) 20/Agosto/2023 - Anuncio, Descargas.
Blogdrake recomienda descargar las imágenes de instalación (iso) vía torrent para evitar corrupción de datos, aprovechar mejor su ancho de banda y mejorar la difusión de las distribuciones.
Como construir nuestro asistente Drake
Como todos sabrán, los asistentes del MCC (o drakconf), se los suele denominar Drakes. Sobre estos asistentes tenemos una clase especial llamada drakewizards, como bien lo explican en la documentación oficial, http://wiki.mandriva.com/en/Writing_a_drakwizard_module.
Peero, esta documentación no ayuda demasiado a la hora de crear nuestro propio Drake. Lo que intentare aquí, es escribir un manual basándome en lo poco que expresa la documentación antes mencionada, lo que he aprendido leyendo en las librerías y, por el viejo método de la prueba y error.
NOTA: Este manual no se encuentra terminado. Debo agregar mas cosas y seguro deberé corregir otras. Si tienen sugerencias, agregados y correcciones, agradecería me lo comuniquen XD.
Comencemos con algunos conceptos generales.
Según la documentación oficial, al agregar nuestro drake, este se agrega en una nueva sección especial llamada "Asistentes adicionales".
Principalmente nuestro asistente se basara en los siguientes ficheros:
- Un archivo que contendrá la mínima información del asistente. Sera de extensión .conf, se aloja en /etc/wizard.d/ y contendrá los siguientes paramentos:
NAME = "[nombre del asistente]" DESCRIPTION = "[breve descripcion]" ICON = "[ruta del icono ]" LONG_DESCRIPTION = "[descripcion mas larga]"
- Un icono que se alojara preferentemente en /usr/share/mcc/themes/default/
- El archivo escrito en perl (de extensión .pm) que tendrá una estructura determinada que ahora paso a explicar. Este se aloja en /usr/lib/perl5/vendor_perl/5.10.0/MDK/Wizard/
Formato y escritura de nuestro modulo de asistente. (que lindo suena XD)
El archivo define como sera nuestro asistente. Primero cargamos las librerías y definimos la parte principal de nuestro modulo. Luego se incluyen las paginas. Estas son las que se muestran cada vez que presionamos atrás o siguiente.
Primeramente incluimos la información del asistente y cargamos las librerías necesarias. Quedando algo así en nuestro código:
#!/usr/bin/perl -w # # version [que version es] # Copyright (C) [Año] [nombre] # Author: [nombre de autor, emaill] # # [La licencia. Generalmente GPL ;)] # [Alguna otra cosa que pueda ser de interes] package MDK::Wizard::[nombre del drake]; use lib qw(/usr/lib/libDrakX); use strict; use MDK::Wizard::Wizcommon; my $wiz = new MDK::Wizard::Wizcommon; my $in = interactive->vnew;
Luego debemos especificar un objeto con las características del asistente. Para eso:
my $o = { name => 'titulo', var => { var_numero => 0, var_file => "", var_letra => "a", }, allow_user => "", defaultimage => "/usr/share/mcc/themes/default/file-sharing-mdk.png", needed_rpm => [ 'paquete','paquete2' ], init => sub { codigo }, };
Es importante notar que para separar los elementos se utiliza el carácter ','.
Como verán se encuentran disponibles varios parámetros, aunque no todos son obligatorios.
- name
- Titulo que tengra nuestro asistente
- var
- Es un hash con las variables que tendremos disponibles. No es obligatorio, aunque si muy util en algunas ocaciones ;)
- defaultimage
- Es el icono o imagen que se mostrara en el MCC
- needed_rpm
- Es la lista de paquetes que necesita tener el sistema instalado para que nuestro asistente se ejecute correctamente. Esto lo corrobora antes de iniciarse, instalando los paquetes de forma automatica. Si estos no pueden instalarse, la eecucoin del drake se cancela.
- allow_user
- Usuarios que tienen permitido ejecutar el asistente. Si se deja vario indica que solo root tiene acceso.
- init
- Ejecuta el codigo dentro de la subrutina al inicio del asistente.
Ahora lo mas importante es agregar las paginas al objeto antes definido. Esto lo hacemos asi:
$o->{pages} = { welcome => { name => "Bienvenidos", no_back => 1, data => [ { label => "msj bienvenida." }, ], next => 'bye_page' }, bye_page => { name => "Chao", data => [ { label => "msj de despedida.", } ], no_back => 1, end => 1, next => 0, }, };
Asi podemos agregar cuantas paginas queramos, siempre y cuando cumplamos ciertas reglas ;).
Cada pagina comenzara con su nombre, que debe ser unico. La primera SIEMPRE se llamara welcome.
Cada una la separaremos con el caracter ",", ya que estamos manejando hash's de perl ;).
Ahora, como en el caso de la def principal del objeto, aqui tenemos varios parametros que podemos utilizar:
- name
- Titulo de la pagina. SI supera las 2 lineas, se mostrara de forma distinta. Ver figura mas abajo.
- data
- Es lo que contendra. Pude que sea un checkbox, un radiobox, etc. Veremos sus posibilidades mas adelante
- no_back
- Indica que no debe aparecer el boton Atras. (Por ejemplo en la primera page)
- no_cancel
- Igual que el anterior, solo que con el boton cancelar.
- end
- Indica que es la ultima pagina.
- pre
- Es una subrutina que se ejecuta cuando se vuelve una pagina atras.
- post
- Similar a pre, solo que se ejecuta cuando se avanza. Este reemplaza al parametro next por medio de un return.
- complete
- Similar a post. La diferencia radica que, en lugar de avanzar devuelve por medio de un return un 0 si todo esta en orden o un 1 en caso contrario. Es util para chequear que una entrada sea valida por ejemplo.
- next
- Indica a que pagina ira luego al presionar siguiente.
- ignore
- Este ignora a la pagina en caso de que su subsiguiente presione atras. Muy util para dar mensajes de advertencia y similares.
- default
- Da una respuesta automatica para preguntas del tipo si/nom o cuando el parametro data no tiene campo alguno.
Los objetos no son nada si no los creamos. Todos los drakes deben devolver un 1 al final. Esto sirve para que MCC sepa que se cargo todo correctamente y que no hay error de sintaxis.
El final seria algo asi:
sub new { my ($class) = @_; bless $o, $class; } 1;
Como mencione con anterioridad, el parametro data de las paginas permiten agregar varios "widgets" a nuestro drake. Estos son otorgados por la libreria interactive.
Ahora veremos los mas comunes.
- Una etiqueta simple:
-
data => [{ label => "texto aqui"},]
- Una etiqueta con un checkbox:
-
data => [{ label => "texto aqui", type => 'bool', val => valor_de_salida },]
- Una lista de etiquetas con varios radiobox:
-
data => [ {label => "texto aqui",type => "list", val => valor_seleccion, list => ["elemto1","elemento2"], boolean_list => "", }]
- Un textfield para completar:
-
data => [{ label => "texto aqui ",val => Valor_ingresado},]
- Advertencia
-
$in->ask_warn("Titulo","mensaje");
- Pregunta (yes/no)
-
$in->ask_yesorno("Titulo","mensaje");
Esta devuelve un valor verdader si se escoje si y falso en caso contrario
- Mesj Ok/Cancelar
-
$in->ask_okcancel("Titulo","mensaje","ruta a icono");
- Seleccion archivo
-
$in->ask_filename();
Devuelve la ruta del archivo seleccionado.
- Seleccion directorio
-
$in->ask_directory();
Idem anterior solo que con directorios
Ventanas modales:
Las ventanas modales nos permitiran crear un cuadro de msj de advertencia, pregunta, error, progreso, o incluso seleccionar un archivo o directorio.
Estas se suelen utilizar en las subrutinas en pre. post y complete.
Pueden aprender mucho viendo como estan construidos otros drakes. SI instalan el paquete drakwizard, veran muchos en el directorio /usr/lib/perl5/vendor_perl/5.10.0/MDK/Wizard/.
Terminado con la teoria, incursionamos en la practica con unos ejemplos.
Primero, el .conf.
Por ejemplo llamaremos tuto a este drake. (como podan notar tengo problemas para poner nombres originales XD )
Entonces crearmos el archivo tuto.conf con el siguiente contenido:
NAME="tuto" DESCRIPTION="Drake de ejemplo" ICON = "/usr/share/mcc/themes/default/news-mdk.png" LONG_DESCRIPTION = "Drake de ejemplo para el manual de blogdrake.net (tm)(r)(c)"
Luego lo movemos a /etc/wizard.d/
Ahora viene la parte importante, el asistente en si mismo. El mismo tendra nombre tuto.pm y lo ubicaremos en /usr/lib/perl5/vendor_perl/5.10.0/MDK/Wizard/
#!/usr/bin/perl -w # # version 0.1 # Copyright (C) 2010 Pipo Pescador # Author: Pipo pescador < pipo@jotmeil.com > # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package MDK::Wizard::tuto; use lib qw(/usr/lib/libDrakX); use strict; use MDK::Wizard::Wizcommon; my $wiz = new MDK::Wizard::Wizcommon; my $in = interactive->vnew; my $o = { name => 'TutoDrake', # El titulo que usaremos defaultimage => "/usr/share/mcc/themes/default/news-mdk.png", #Aca el icono allow_user => "", # Aca le indicamos que debe ser root para ejecutarse. }; $o->{pages} = { welcome => { name => "Bienvenidos a tutoDrake", no_back => 1, data => [ { label => "Hola mundo!!!!." }, ], next => 'bye_page' }, bye_page => { name => "Chao", data => [ { label => "Hasta otra.", } ], no_back => 1, end => 1, next => 0, }, };
Explicacion:
Comenzamos creando el archivo con el encabezado:
#!/usr/bin/perl -w # # version 0.1 # Copyright (C) 2010 Pipo Pescador # Author: Pipo pescador < pipo@jotmeil.com > # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package MDK::Wizard::tuto; use lib qw(/usr/lib/libDrakX); use strict; use MDK::Wizard::Wizcommon; my $wiz = new MDK::Wizard::Wizcommon; my $in = interactive->vnew;
La licencia completa solo la pondre ahora como ejemplo. En los proximos ejemplo la obviare ;)
Ahora continuamos agregando el resto de la informacion de nuestro asistente como una primer pagina y el saludo de salida.
La primera pagina solo mostrar un mensaje.
Definimos la estructura principal del objeto o, que contendra la informacion del asistente en cuestion
my $o = { name => 'TutoDrake', # El titulo que usaremos defaultimage => "/usr/share/mcc/themes/default/news-mdk.png", #Aca el icono allow_user => "", # Aca le indicamos que debe ser root para ejecutarse. };
Como vemos no utilizaremos varibles en esta primera parte.
Ahora agregaremos a nuestro objeto, las paginas que necesitamos
$o->{pages} = { welcome => { name => "Bienvenidos a tutoDrake", no_back => 1, data => [ { label => "Hola mundo!!!!." }, ], next => 'bye_page' }, bye_page => { name => "Chao", data => [ { label => "Hasta otra.", } ], no_back => 1, end => 1, next => 0, }, };
Y culminamos con la subrutina de creacion y la devoluvion del 1 para indicar que todo se inicio sin problemas
sub new { my ($class) = @_; bless $o, $class; } 1;
- Blog de Drakor
- Entra a tu cuenta o crea una para poder comentar.
BOFH
# 100323 ...
/etc/wizard.d/ no existe ¿se debe instalar algo o solo lo creo?
¿Quien es Jesucristo?
# 100325 Instala el paquete drakwizard
Instala el paquete drakwizard
¿lo usas?, ¿la lees?, ¿las conoces?,Herramienta útil
BOFH
# 100327 Ya esta instalado
Ya esta instalado, tampoco veo el directorio /usr/lib/perl5/vendor_perl/5.10.0/MDK/Wizard/
¿Quien es Jesucristo?
BOFH
# 100328 Mi error
Estaba viendo en /usr/lib/perl5/vendor_perl/5.10.1
¿Quien es Jesucristo?
# 100348 .
Hay que crearlo. :P
En la semana tratare de ampliar mas y ordenar el contenido del manual.
Otro apunte que omití es el hecho de que, aunque la documentación oficial lo asegura, no se crea la nueva sección en el MCC.
Estuve mirando el code del que se ocupa de eso, pero por mi triste conocimiento en perl, no puede encontrar el error. El code es /usr/sbin/drakconf.real aprox en la linea 557.
Para poder ejecutar el drake que escribes, por ahora debes recurrir a ejecutar drakwizard como root. (previamente instalado)
Este muestra todos los asistentes creados con el modulo wizard en un combobox para poder ejecutarlos.
Saludos
"Cuando hay libertad, todo lo demás sobra."
Participa de la comunidad!!
Visita Ardriva, la comunidad Argentina de Mandriva