02.04.2013 Views

DBUS – Linux Desktop Hacking - Mid-Hudson Valley Linux Users ...

DBUS – Linux Desktop Hacking - Mid-Hudson Valley Linux Users ...

DBUS – Linux Desktop Hacking - Mid-Hudson Valley Linux Users ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Sean Dague<br />

<strong>DBUS</strong> <strong>–</strong> <strong>Linux</strong> <strong>Desktop</strong> <strong>Hacking</strong><br />

With Ruby Examples<br />

MHVLUG Meeting<br />

Feb 6 th 2008<br />

Sean Dague<br />

sean * dague * net<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

1


Sean Dague<br />

Returning to the <strong>Desktop</strong>...<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

2


Sean Dague<br />

What is <strong>DBUS</strong>?<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

3


Sean Dague<br />

G<strong>DBUS</strong><br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

4


Sean Dague<br />

Ruby Quick Introduction<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

5


Sean Dague<br />

“I wanted a scripting language that was more powerful than Perl,<br />

and more object-oriented than Python.”<br />

#!/usr/bin/ruby<br />

puts “Hello World”<br />

-Yukihiro “matz” Matsumoto (Ruby Creator)<br />

def repeat<br />

5.times do<br />

puts “Try not to repeat yourself”<br />

end<br />

end<br />

repeat<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

6


Sean Dague<br />

Ruby Language Features<br />

● Lots of ideas borrowed from Perl (regex is first class<br />

language contruct)<br />

● Got rid of the semi-colon like Python, but didn't make<br />

white space important<br />

● Everything is an object<br />

● Lisp inspired “do block”<br />

● Mixins<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

7


Sean Dague<br />

Ruby Gymnastics<br />

@strips = @user.<br />

comics.<br />

collect {|c|<br />

c.strips.find(:all, :conditions => [”date > ?“, 7.days.ago])<br />

}.<br />

flatten.<br />

delete_if {|c| c == nil}.<br />

sort_by {|c| c.date}<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

8


Sean Dague<br />

Learning more on Ruby<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

9


Sean Dague<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

10


Sean Dague<br />

#!/usr/bin/ruby<br />

# From the ruby-dbus project<br />

require “dbus”<br />

Getting on the Bus<br />

# System Bus is for OS events, shared for all users<br />

system_bus = <strong>DBUS</strong>::SystemBus.instance<br />

# Session Bus is per desktop instance<br />

session_bus = DBus::SessionBus.instance<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

11


Sean Dague<br />

Connecting to Pidgin<br />

def connect_pidgin(session_bus)<br />

# Get the pidgin service<br />

pidgin_dbus = session_bus.service("im.pidgin.purple.PurpleService")<br />

# Get the object from this service<br />

pidgin = pidgin_dbus.object("/im/pidgin/purple/PurpleObject")<br />

# Introspect it<br />

pidgin.introspect<br />

if pidgin.has_iface? "im.pidgin.purple.PurpleInterface"<br />

pidgin.default_iface = "im.pidgin.purple.PurpleInterface"<br />

puts "We have Pidgin interface"<br />

end<br />

return pidgin<br />

end<br />

pidgin = connect_pidgin(session_bus)<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

12


Sean Dague<br />

Talking to Pidgin<br />

def recycle_pidgin(pidgin)<br />

accounts = pidgin.PurpleAccountsGetAll<br />

for account in accounts[0]<br />

if pidgin.PurpleAccountIsConnected(account)[0] > 0<br />

pidgin.PurpleAccountDisconnect(account)<br />

end<br />

pidgin.PurpleAccountConnect(account)<br />

end<br />

end<br />

def set_status(pidgin, type, name, message)<br />

status = pidgin.PurpleSavedstatusFind(name)[0]<br />

if not status > 0<br />

status = pidgin.PurpleSavedstatusNew(name, type)[0]<br />

end<br />

pidgin.PurpleSavedstatusSetMessage(status, message)<br />

pidgin.PurpleSavedstatusActivate(status)<br />

end<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

13


Sean Dague<br />

Listening for Events<br />

pidgin.on_signal("SentImMsg") { set_active(pidgin) }<br />

screensaver.on_signal("ActiveChanged") {|s|<br />

if s<br />

mute<br />

set_away(pidgin)<br />

else<br />

unmute<br />

end<br />

}<br />

main = DBus::Main.new<br />

main


Sean Dague<br />

Without Introspection<br />

def connect_netman(bus)<br />

n_dbus = bus.service("org.freedesktop.NetworkManager")<br />

netman = n_dbus.object("/org/freedesktop/NetworkManager")<br />

poi = DBus::ProxyObjectInterface.new(netman,<br />

"org.freedesktop.NetworkManager")<br />

return poi<br />

end<br />

netman = connect_netman(system_bus)<br />

netman.on_signal(system_bus, "DeviceNowActive") { |device, network|<br />

pp device # "/org/freedesktop/NetworkManager/Devices/wlan0"<br />

pp network # “szj”<br />

recycle_pidgin(pidgin)<br />

}<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

15


Sean Dague<br />

Possibilities Galore<br />

● Make Pidgin Idle Aware based on other device activity<br />

● Connect Pidgin to Twitter for Status<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

16


Sean Dague<br />

MHVLUG Upcoming<br />

● Join the mailing list - http://mhvlug.org<br />

● Come join us at Ruby Tuesday's <strong>–</strong> 8pm<br />

● MHVLUG Turns 5 next Month<br />

● Upcoming Meetings<br />

<strong>–</strong> March - ?<br />

<strong>–</strong> April <strong>–</strong> Configuring your kernel<br />

<strong>–</strong> May <strong>–</strong> Small Office <strong>Linux</strong><br />

● Hopefully back to regular venue next Month<br />

<strong>–</strong> Thanks to Porkchop and Greg for finding alternate venues for the<br />

past 2 months<br />

<strong>Mid</strong>-<strong>Hudson</strong> <strong>Valley</strong> <strong>Linux</strong> <strong>Users</strong> Group<br />

17

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!