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 ...
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