Задать вопрос
FreeTibet
@FreeTibet
dharma supplier

Perl, Net::DBus, использование сессионной шины?

Разбираюсь с Net::DBus, для пробы хочу написать две простенькие программы, одна предоставляет интерфейс, другая его использует.


Написал простой тестовый код:



#!/usr/bin/perl
use strict;
use warnings;

package MyObj;
use Net::DBus::Exporter qw(org.example.Tao);
use base qw(Net::DBus::Object);

sub new {
    my $class = shift;
    my $service = shift;
    my $self = $class->SUPER::new($service, '/MyObj');
    bless $self, $class;
    return $self;
}

dbus_method("Hello", ["string"]);

sub Hello {
    return 'Hello';
}

package main;
use Net::DBus;
use Net::DBus::Reactor;

my $bus = Net::DBus->session;
my $service = $bus->export_service("org.example.Tao");
my $object = MyObj->new($service);
my $reactor = Net::DBus::Reactor->main();
$reactor->run();

return 0;



Подробности об моём окружении:

Работаю по ssh, и использую:
Perl, v5.8.8 built for x86_64-linux-thread-multi<br/>
Linux example.com 2.6.32.19-0.2.99.17.22250fd-xen #1 SMP 2010-09-13 10:16:50 +0200 x86_64 x86_64 x86_64 GNU/Linux<br/>
CentOS release 5.4 (Final)<br/>



Когда я пыталюсь запустить test.pl получаю ошибку:
org.freedesktop.DBus.Error.Spawn.ExecFailed:<br/>
Failed to execute dbus-launch to autolaunch D-Bus session<br/>



Строка, которая вызывает ошибку:

my $bus = Net::DBus->session;


Поискал в гугле, нашел что для счастья нужен dbus-launch.

Сделал yum install dbus-x11.

Вопрос первый: почему пакет из x11?


Попытался снова запустить мой, test.pl. Получил другую ошибку:
org.freedesktop.DBus.Error.Spawn.ExecFailed: <br/>
dbus-launch failed to autolaunch D-Bus session: <br/>
Autolaunch error: X11 initialization failed.<br/>



Снова почитал мануалы, понял, что у меня не установлена переменная DBUS_SESSION_BUS_ADDRESS и вообще сессионная шина не запущена.

DBUS_SESSION_BUS_ADDRESS is empty:<br/>
[root@zion perl]# ps ax|grep dbus|grep -v grep<br/>
1019 ? Ss 0:00 dbus-daemon --system<br/>


Хотя в той же вики сказана, что сессионная шина стартует для каждого пользователя.


Попробовал запустить её с помощью dbus-launch
[root@zion perl]# dbus-launch --sh-syntax<br/>
DBUS_SESSION_BUS_ADDRESS='unix:abstract=/tmp/dbus-smHadq6yxV,guid=101ccd74fb75ae501485ed004e2a9043';<br/>
export DBUS_SESSION_BUS_ADDRESS;<br/>
DBUS_SESSION_BUS_PID=5037;<br/>
[root@zion perl]# ps ax|grep dbus|grep -v grep<br/>
1019 ? Ss 0:00 dbus-daemon --system<br/>
5037 ? Ss 0:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session<br/>



Но DBUS_SESSION_BUS_ADDRESS всё равно пустая.


Так вот, вопрос:

Какие подготовительные действия нужно провести для того, чтобы моя программа работала от имени любого пользователя в системе Net::DBus и использовала его сессионную шину. Или может быть можно ничего не делать, а стартовать шину прям из моей программы?


Вообще, как правильно работать с DBus?
  • Вопрос задан
  • 3209 просмотров
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы