A menudo necesitamos proveer a nuestros scripts cierta interacción con el usuario, kdialog es un comando que podemos utilizar en nuestros shell scripts para interactuar gráficamente con el usuario. La idea básica es que provee una entrada gráfica interactiva con el script.

Hasta hace poco utilizaba kommander, una potente herramienta para crear programas mediante scripting gráfico, lamentablemente por falta de programadores en el proyecto aún no fue portado a KD4.

Kdialog es un programa que se llama desde la línea de comandos y abre una ventana en modo gráfico según la opción que le suministremos en la llamada. Por ejemplo: kdialog –title “Mi ventana” –msgbox “Hola Mundo” abriría una ventana de mensaje titulada “Mi ventana” y con el texto “Hola Mundo”.

Kdialog no es tan potente y flexible como kommander pero tiene una buena cantidad de controles. Los usuarios de Gnome cuentan con Zenity, aunque no tiene tantos controles como Kdialog.

Cuando se ejecuta kdialog se abre una nueva ventana (evidentemente se trata de una ventana KDE) que presenta al usuario un mensaje, permite introducir un texto, seleccionar un archivo, elegir entre aceptar o cancelar, etc.

En cada caso, kdialog retorna la respuesta del usuario en su salida estándard o bien mediante el código de retorno $? indicando si el usuario a aceptado o cancelado el diálogo.

Ejemplos que podemos probar en una terminal:
Popup pasivo que desaparece:  kdialog –passivepopup “Mensaje” 5 

Solicitud de clave:  kdialog –password “por favor escriba su clave:” 

Lista equivalente a radio-button:  kdialog –radiolist “Elige:” 1 “Uno” on 2 “Dos” on 3 “Tres” off 

Advertencia, continuar – cancelar:  kdialog –warningcontinuecancel “Mensaje” 

Caja de texto:  kdialog –textbox NOMBRE-DE-ARCHIVO 

Selector:  kdialog –combobox “Seleccione el color:” “Uno” “Dos” “Tres” “Negro” 

Opciones de kdialog:

  --yesno             Cuadro de interrogación con botones de sí/no
  --yesnocancel       Cuadro de interrogación con botones de sí/no/cancelar
  --warningyesno      Cuadro de aviso con botones de sí/no
  --warningcontinuecancel  Cuadro de aviso con botones de continuar/cancelar
  --warningyesnocancel  Cuadro de aviso con botones de sí/no/cancelar
  --yes-label         Usar texto como etiqueta del botón «Sí»
  --no-label          Usar texto como etiqueta del botón «No»
  --cancel-label      Usar texto como etiqueta del botón «Cancelar»
  --continue-label    Usar texto como etiqueta del botón «Continuar»
  --sorry             Cuadro de mensaje «Disculpe»
  --error             Cuadro de mensaje «Error»
  --msgbox            Ventana de mensaje
  --inputbox    Ventana de introducción de datos
  --password          Ventana de contraseña
  --textbox  [width] [height] Ventana de texto
  --textinputbox   [width] [height] Ventana de introducción de texto
  --combobox  item [item] [item] ... Ventana con lista desplegable
  --menu  [tag item] [tag item] ... Ventana de menú
  --checklist  [tag item status] ... Ventana de lista de selección
  --radiolist  [tag item status] ... Ventana de lista de selecciones excluyentes
  --passivepopup   Ventana emergente pasiva
  --getopenfilename [startDir] [filter] Ventana de archivo para abrir un archivo ya existente
  --getsavefilename [startDir] [filter] Ventana de archivo para guardar un archivo
  --getexistingdirectory [startDir] Ventana de archivo para seleccionar un directorio ya existente
  --getopenurl [startDir] [filter] Ventana de archivo para abrir un URL ya existente
  --getsaveurl [startDir] [filter] Ventana de archivo para guardar un URL
  --geticon [group] [context] Ventana de selección de iconos
  --progressbar  [totalsteps] Ventana de barra de progreso, devuelve una referencia D-BUS para comunicarse
  --getcolor                Diálogo de color para seleccionar un color
  --title             Título de la ventana
  --default           Entrada predefinida en las listas desplegables, menús y color
  --multiple                Permitir que las opciones --getopenurl y --getopenfilename que devuelvan varios archivos
  --separate-output         Devolver los elementos de la lista en líneas separadas (para la opción de lista de selección y abrir archivo con --multiple)
  --print-winid             Muestra el winId de cada ventana
  --dontagain   El archivo de configuración y el nombre de la opción para guardar el estado «no-mostrar/volver-a-preguntar»
  --slider  [minvalue] [maxvalue] [step] Cuadro de diálogo con un componente deslizante, devuelve el valor seleccionado
  --calendar          Cuadro de diálogo de calendario, devuelve el estado actual
  --attach           Convierte el cuadro de diálogo en transitorio para una aplicación X indicada por winid

A continuación pego el código de un script para realizar conexiones de escritorio remoto mediante RDP. Podemos pegar el archivo php en la ruta $HOME/bin y llamarlo mediante un lanzador en el escritorio con la ruta php $HOME/bin/rdesktop.php.

Este script está escrito en PHP simplemente porque me resulta más sencillo manejar cadenas de texto en este lenguaje, pero tranquilamente podría haber utilizado bash scripting u otro lenguaje de script con posibilidad de ejecutar comandos del sistema.

En php tenemos las funciones system() y exec() para acceder a los comandos del sistema. System devuelve la última línea de la salida del comando en caso de tener éxito, y FALSE si ocurre un error.

Modificamos los valores de los arrays $rdp y $server para adaptarlo a nuestras necesidades:

< ?php

/* OPCIONES */
$rdp = array(
'kb'   => "es", //keyboard es,en,fr,de
'xy'   => "1024x768", //screen size
'bit'  => 15, //color depth
'name'  => "usuario", //user name
'dc'   => true, //domain controller true,false
'domain' => "dominio", //valid if dc is true
'title'  => "RDP:", //window title
'deco'   => true  //show window decoration
);

/* SERVIDORES */
$server = array( // name, server or ip : port
array('servidor1','servidor1.dyndns.org'), //default port
array('servidor2','servidor2.dyndns.org:2500'),
array('servidor3','servidor3.dyndns.org:2500')
);

echo var_dump($rdp); //solo visible por consola
echo var_dump($server); //solo visible por consola

$cnf = "Parametros preconfigurados de rdesktop:\n";
    foreach($rdp as $key => $value)
        $cnf.="\n $key = $value";
$abt = "RDesktop PHP/Kdialog v0.1\n\nAutor: Martin A. Gonzalez (magtec)\nWeb: www.animacionyweb.com.ar\n";

do{
    if($result!='rdp') $result = menu();
    switch($result){
        case 'rdp': $result = rdp($rdp,$server); break;
        case 'cnf': system("kdialog --title \"rdesktop\" --msgbox \"$cnf\""); break;
        case 'abt': system("kdialog --title \"rdesktop\" --msgbox \"$abt\""); break;
        default : break;
    }
}while($result != -1);

function menu(){
    $option = system("kdialog --title \"rdesktop\" --menu \"Opciones del asistente\" rdp \"Listado de servidores\" cnf \"Configuracion\"  abt \"Creditos\" ", $error);
    if($error==0) return $option;
    else return -1;
}

function rdp($rdp,$server){
    $line = "kdialog --title \"rdesktop\" --menu \"Listado de servidores\" ";
    $max = count($server);
    for($i=0;$i< $max;$i++)
        $line.= $i." \"".$server[$i][0]."\" ";
    $option = system( $line, $error);    
    if($error==0){
        $line = "rdesktop -5 -k ".$rdp['kb'];
        $line.= " -g ".$rdp['xy'];
        $uniq = date('y').intval(date('z')/100);
        $line.= " -n ".$rdp['name'].$uniq;
        $line.= " -u ".$rdp['name'];
        if($rdp['dc']==true) $line.= "@".$rdp['domain'];
        $line.= " -a ".$rdp['bit'];
        $line.= " -T ".$rdp['title'].$server[$option][0];
        if($rdp['deco']==false) $line.= " -D ";
        else $line.= " ";
        $line.= $server[$option][1];
        
        echo $line;
        echo system( $line, $error);
        $line = "kdialog --passivepopup \"La conexion a ".$rdp['title'].$server[$option][0]."\nha sido cerrada o interrumpida.\" 10";
        echo system( $line, $error);
        return 'rdp';
    }
    else return 'back';
}

?>


Deja un comentario

Desarrollado por AnimacionyWeb     Stats