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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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!