Arrancando Múltiples Sesiones SSH Usando DCOP

Introducción a DCOP

DCOP (Desktop COmmunications Protocol) es un mecanismo de IPC/RPC que se usa KDE para las comunicaciones entre aplicaciones del escritorio.

Las aplicaciones KDE proveen una o varias interfaes DCOP las cuales a su vez proveen métodos/funciones que pueden ser llamadas asíncronamente por otras aplicaciones.

El programa dcop nos proporciona acceso al sistema DCOP desde la línea de comandos. La sintaxis de la llamada al programa es la siguiente:

  dcop [options] [application [object [function [arg1] [arg2] ... ] ] ]

También puede usarse la versión gráfica kdcop. Para comprobar que aplicaciones están disponibles, escribe dcop sin argumentos

lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ dcop
kwin
kicker
konsole-10818
guidance-10871
konsole-10832
kded
adept_notifier
kmix
knotify
kio_uiserver
konqueror-10903
minirok
klauncher
katapult
knotes
khotkeys
kdesudo-12981
kdesktop
klipper
ksmserver
knetworkmanager

Las aplicaciones que abren mas de una ventana de una vez aparecen como <application>-PID. Es posible usar el comodín *:

casiano@europa:~$ dcop konsole*
konsole-16440
konsole-16444
konsole-16445
konsole-16447
konsole-16493
konsole-16450
¿En cual de estas consolas estoy ahora? Se puede obtener una referencia

casiano@europa:~$ echo $KONSOLE_DCOP
DCOPRef(konsole-16444,konsole)

Esa referencia puede ser usada para llamar a los métodos públicos del objeto. Por ejemplo, podemos abrir una nueva pestaña con una sesión escribiendo:

casiano@europa:~$ dcop $KONSOLE_DCOP newSession
session-8
Vamos a echar un vistazo a los objetos en konsole-10832:

lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ dcop konsole-10832
KBookmarkManager-/home/lusasoft/.kde/share/apps/konsole/bookmarks.xml
KBookmarkNotifier
KDebug
MainApplication-Interface
konsole-mainwindow#1
ksycoca
session-10
session-11
session-2
session-3
session-4
session-5

Podemos asumir que konsole-mainwindow#1 es el objeto que estamos buscando; el objeto por defecto (es decir, el que estamos buscando para controlar la aplicación) tiene normalmente el mismo nombre que la aplicación

lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ dcop konsole-10832 konsole-mainwindow#1
QCStringList interfaces()
QCStringList functions()
QVariant property(QCString property)
bool setProperty(QCString name,QVariant property)
QValueList<QCString> propertyNames(bool super)
QCString name()
void setName(QCString name)
bool isTopLevel()
bool isDialog()
bool isModal()
bool isPopup()
bool isDesktop()
bool enabled()
void setEnabled(bool enabled)
QRect geometry()
void setGeometry(QRect geometry)
QRect frameGeometry()
int x()
int y()
QPoint pos()
void setPos(QPoint pos)
QSize frameSize()
QSize size()
void setSize(QSize size)
int width()
int height()
QRect rect()
QRect childrenRect()
QRegion childrenRegion()
QSizePolicy sizePolicy()
void setSizePolicy(QSizePolicy sizePolicy)
QSize minimumSize()
void setMinimumSize(QSize minimumSize)
QSize maximumSize()
void setMaximumSize(QSize maximumSize)
int minimumWidth()
void setMinimumWidth(int minimumWidth)
int minimumHeight()
void setMinimumHeight(int minimumHeight)
int maximumWidth()
void setMaximumWidth(int maximumWidth)
int maximumHeight()
void setMaximumHeight(int maximumHeight)
QSize sizeIncrement()
void setSizeIncrement(QSize sizeIncrement)
QSize baseSize()
void setBaseSize(QSize baseSize)
BackgroundMode backgroundMode()
void setBackgroundMode(BackgroundMode backgroundMode)
QColor paletteForegroundColor()
void setPaletteForegroundColor(QColor paletteForegroundColor)
QColor paletteBackgroundColor()
void setPaletteBackgroundColor(QColor paletteBackgroundColor)
QPixmap paletteBackgroundPixmap()
void setPaletteBackgroundPixmap(QPixmap paletteBackgroundPixmap)
QBrush backgroundBrush()
QColorGroup colorGroup()
QPalette palette()
void setPalette(QPalette palette)
BackgroundOrigin backgroundOrigin()
void setBackgroundOrigin(BackgroundOrigin backgroundOrigin)
bool ownPalette()
QFont font()
void setFont(QFont font)
bool ownFont()
QCursor cursor()
void setCursor(QCursor cursor)
bool ownCursor()
QString caption()
void setCaption(QString caption)
QPixmap icon()
void setIcon(QPixmap icon)
QString iconText()
void setIconText(QString iconText)
bool mouseTracking()
void setMouseTracking(bool mouseTracking)
bool underMouse()
bool isActiveWindow()
bool focusEnabled()
FocusPolicy focusPolicy()
void setFocusPolicy(FocusPolicy focusPolicy)
bool focus()
bool updatesEnabled()
void setUpdatesEnabled(bool updatesEnabled)
bool visible()
QRect visibleRect()
bool hidden()
void setHidden(bool hidden)
bool shown()
void setShown(bool shown)
bool minimized()
bool maximized()
bool fullScreen()
QSize sizeHint()
QSize minimumSizeHint()
QRect microFocusHint()
bool acceptDrops()
void setAcceptDrops(bool acceptDrops)
bool autoMask()
void setAutoMask(bool autoMask)
bool customWhatsThis()
bool inputMethodEnabled()
void setInputMethodEnabled(bool inputMethodEnabled)
double windowOpacity()
void setWindowOpacity(double windowOpacity)
bool rightJustification()
void setRightJustification(bool rightJustification)
bool usesBigPixmaps()
void setUsesBigPixmaps(bool usesBigPixmaps)
bool usesTextLabel()
void setUsesTextLabel(bool usesTextLabel)
bool dockWindowsMovable()
void setDockWindowsMovable(bool dockWindowsMovable)
bool opaqueMoving()
void setOpaqueMoving(bool opaqueMoving)
QCStringList actions()
bool activateAction(QCString action)
bool disableAction(QCString action)
bool enableAction(QCString action)
bool actionIsEnabled(QCString action)
QCString actionToolTip(QCString action)
DCOPRef action(QCString name)
QMap<QCString,DCOPRef> actionMap()
int getWinID()
void grabWindowToClipBoard()
void hide()
void maximize()
void minimize()
void resize(int newWidth,int newHeight)
void move(int newX,int newY)
void setGeometry(int newX,int newY,int newWidth,int newHeight)
void raise()
void lower()
void restore()
void show()
void close()

Vamos a minimizarla:

lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ dcop konsole-10832 konsole-mainwindow#1 minimize

Cambiando el Color de Fondo

Otro ejemplo. Cambiemos el color de fondo:

casiano@europa:~$ dcop kdesktop KBackgroundIface  setWallpaper /tmp/393_5052_2.jpg
casiano@europa:~$ dcop kdesktop KBackgroundIface setColor '#E444F2' true
casiano@europa:~$ dcop kdesktop KBackgroundIface setColor '#68F20B' true

Ejemplo: knotes

He aqui un ejemplo que ilustra como establecer notas post-it con knotes desde la shell:

$dcop knotes KNotesIface
QCStringList interfaces()
QCStringList functions()
int newNote(QString name,QString text)
int newNoteFromClipboard(QString name)
ASYNC showNote(int noteId)
ASYNC hideNote(int noteId)
ASYNC killNote(int noteId)
QMap notes()
ASYNC setName(int noteId,QString newName)
ASYNC setText(int noteId,QString newText)
QString text(int noteId)
ASYNC sync(QString app)
bool isNew(QString app,int noteId)
bool isModified(QString app,int noteId)

Vamos a añadir una nota:

dcop knotes KNotesIface newNote "Titulo de la Nota" "Corregir exámenes"

Ahora veamos las notas que tenemos disponibles:

lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ dcop knotes KNotesIface notes
libkcal-2096876672.442->Titulo de la Nota
libkcal-461202155.843->03-05-09 15:06
libkcal-962646955.232->Una nota

Conexiones SSH con konsole

lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ cat -n dcop_control.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  use Log::Log4perl qw(:easy);
 4  use Time::HiRes qw(usleep);
 5  use Backtick::AutoChomp;
 6
 7  Log::Log4perl->easy_init($DEBUG);
 8  my $logger = Log::Log4perl->get_logger();
 9
10  my @servers = qw{orion beowulf europa};
11
12  my $konsole= `dcopstart konsole-script`;
13
14  $logger->warn("can't maximize window\n") if system("dcop $konsole konsole-mainwindow#1 maximize");
15
16  my $thissession= qx{dcop $konsole konsole currentSession};
17
18  # rename this window/session
19  system qq{dcop $konsole $thissession renameSession "init"};
20
21  # start a new session tab for each server
22  for  (@servers) {
23    # this output is displayed on the terminal which is running your script
24    $logger->debug("connecting to server: $_");
25
26    # create another konsole tab and save handle in $newsession
27    my $newsession=`dcop $konsole konsole newSession "ssh $_"`;
28
29    # wait for shell startup - raise if needed
30    usleep(1000) while `dcop $konsole $newsession sessionPID` eq 0;
31
32    # rename the new session
33    !system(qq{dcop $konsole $newsession renameSession $_}) or $logger->warn("can't rename new session to $_\n");
34
35    # and start the ssh session
36    !system(qq{dcop $konsole $newsession sendSession "exec ssh $_ @ARGV"}) or $logger->warn("can't exec ssh  $_ @ARGV\n");
37
38  }
39
40  # close the first session window
41  !system(qq{dcop $konsole $thissession closeSession > /dev/null}) or $logger->warn("can't close intial session\n");
42
43  __END__

Véase También



Subsecciones
Casiano Rodríguez León
2012-02-29