LINUX.ORG.RU

dbus

 ,


0

1

С помощью шела вообще реально работать с dbus?

кое как парсить вывод dbus-monitor ещё получается, а вот как создать то что мониторить с помощью шела? К примеру, notification-deamon если не запущен, то отправляя notify-send ololo я не вижу никакой реакции в dbus-monitor, т.е. надо что-то создавать - а как это сделать средствами bash/dbus-send и прочей дбасохрени я хз. Подскажите, плз

★★★

На чистом баше - примерно так и пилить, на клею и с костылями.

Вот например обрезанная версия моего «бота» поверх пиджина:

$ cat ./pbot.sh
#!/bin/bash
lock=0
cd ~/scripts/
PRPL="dbus-send --type=method_call --dest=im.pidgin.purple.PurpleService --print-reply /im/pidgin/purple/PurpleObject"

while read data
do

	if [[ `echo "$data" | grep -e "ReceivedImMsg"` ]]; then
		i=5
		lock=1
	fi

	
	while [[ "$i" -gt 0 ]]
	do
		case "$i" in
			2 ) str=${data/string/};;
			1 ) target=`echo "$data" | awk '{print $2}'`
				let target+=1;;
		esac
		let i-=1
		read data
	done
	
	if [[ "$lock" -ne 0 ]]; then
		$PRPL im.pidgin.purple.PurpleInterface.PurpleConvImSend int32:$target string:"something to send"
		lock=0
	fi
	
done


$ dbus-monitor "type=signal,sender=im.pidgin.purple.PurpleService,interface=im.pidgin.purple.PurpleInterface,member=ReceivedImMsg" | ./pbot.sh
Кстати notify-send из дбаса у меня работает и возвращает такое:
method call sender=:1.6883 -> dest=:1.0 serial=7 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=Notify
   string "notify-send"
   uint32 0
   string ""
   string "ololo"
   string ""
   array [
   ]
   array [
      dict entry(
         string "urgency"
         variant             byte 1
      )
   ]
   int32 -1
Короче, что-нибудь запилить таким образом можно, но не нужно.

cx ★★ ()
Ответ на: комментарий от erfea

ну напиши мне простую консольную утилитку для создания на твоем нормальном ЯП

вот dbus-send написали уже, а как его заюзать (и может ли он вообще сие) мне неведомо

muhas ★★★ ()
Ответ на: комментарий от muhas

dbus-send --type=method_call --dest=olol шлет в уже созданное а как создать неведомо

muhas ★★★ ()

нашел dbus-shell-service.pl но оно на перле, хотя вариант неплохой

muhas ★★★ ()
Ответ на: комментарий от muhas

Дык в чём блин у тебя проблема? Нужен dbus сервис? Бери любой годный ЯП и вперед. У меня на сервачке один такой болтается, реализован на Qt. На баше у меня есть over9000 сриптов использующих qdbus (аналог dbus-send), для раздачи распоряжений по dbus.

erfea ★★★★★ ()

Что-то мутно совсем, надо через d-bus отправить мелкое окошко с текстом, которое повисит 5 сек и пропадет что-ли ? На «с» могу поделиться , если оно.

anonymous ()
Ответ на: комментарий от erfea

проблема в том что хочется на sh

выше я уже привел на перле, ещё выше rdfs привели в пример, да import dbus тоже не проблема. но в баше нельзя - dbus видимо излишне Ъ я после него к named pipe стал лучше относиться

muhas ★★★ ()
Ответ на: комментарий от anonymous

эту задачу notification-daemon делает вполне. на c можно и из него выковырять пример создания org.freedesktop.Notifications

muhas ★★★ ()
Ответ на: комментарий от muhas

//gcc notify.c -o notify `pkg-config glib-2.0 dbus-glib-1 --cflags --libs`

#define DBUS_API_SUBJECT_TO_CHANGE

#include <glib.h> #include <dbus/dbus.h> #include <dbus/dbus-glib.h> #include <dbus/dbus-glib-bindings.h>

int main (int argc, char **argv) { DBusGConnection *connection; GError *error; DBusGProxy *proxy; char **device_list; char **device_list_ptr; int return_value; // char *icon; // char *summary; // char *description; GHashTable * hash; char description[]=«Это описание»; char summary[] = «Это саммари»; char icon[] = «/home/vik/Install/ico-login.png»; g_type_init(); error = NULL; connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); if (connection == NULL) { g_printerr(«Failed to open connection to bus: %s\n», error->message); g_error_free(error); return 0; } g_print(«ok connection\n»); proxy = dbus_g_proxy_new_for_name (connection, «org.freedesktop.Notifications», «/org/freedesktop/Notifications», «org.freedesktop.Notifications»);

hash = g_hash_table_new (g_str_hash, g_str_equal); if(proxy) g_print(«ok proxy\n»);

error = NULL;

if (!dbus_g_proxy_call (proxy, «Notify», &error, G_TYPE_STRING, «minha-app-c», G_TYPE_UINT, 0, G_TYPE_STRING, icon, G_TYPE_STRING, summary, G_TYPE_STRING, description, G_TYPE_STRV, NULL, dbus_g_type_get_map(«GHashTable», G_TYPE_STRING,G_TYPE_VALUE), hash, G_TYPE_INT, 1, G_TYPE_INVALID, G_TYPE_UINT, &return_value, G_TYPE_INVALID))

{

if (error->domain == DBUS_GERROR && error->code == DBUS_GERROR_REMOTE_EXCEPTION) g_printerr («Caught remote method exception %s: %s», dbus_g_error_get_name(error), error->message); else g_printerr(«Error %s\n», error->message);

g_error_free(error); return 0; } g_hash_table_destroy (hash); g_print(«%d\n», return_value); g_object_unref(proxy);

return 0; }

Ну скомпиляй , да вставь вызов в баш, никак не врублюсь в чем проблема

ilovewindows ★★★★★ ()
Ответ на: комментарий от ilovewindows

проблема в том что сам dbus не предоставляет такой возможности своими утилитами (да и вывод dbus-monitor, мягко говоря странноватый для его безгеморного разбора из core-utils)

muhas ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.