DBus is a system that permits different applications to exchange information. Tutorial Reference Other Reference.
Sometimes, DBus crashes upon restart from a suspend or hibernation. These bash commands will help you figure out if it has crashed, and how to restart it.
$ps -e | grep `cat /var/run/dbus/pid` # Confirm if DBus is running by checking for the PID number in the list of live processes. # If DBus is running, this will return the process number. # If not, it will return nothing. $sudo rm /var/run/dbus/pid # Remove the stale pid file so DBus can be restarted. $sudo dbus-daemon # Start DBus again.
A python script uses DBus to see if the network connection is available by asking Network Manager:
#! /usr/bin/env python import dbus bus = dbus.SystemBus() item = 'org.freedesktop.NetworkManager' eth0_path = '/org/freedesktop/NetworkManager/Devices/eth0' eth1_path = '/org/freedesktop/NetworkManager/Devices/eth1' interface = 'org.freedesktop.NetworkManager.Devices' # There are two possible network interfaces: eth0 (wired) and eth1 (wireless). eth0 = dbus.Interface(bus.get_object(item, eth0_path), interface) if eth0.getLinkActive(): print('The wired network is up') # getLinkActive() is a boolean, TRUE if the network link is active eth1 = dbus.Interface(bus.get_object(item, eth1_path), interface) if eth1.getLinkActive(): print('The wireless network is up')This shell script does exactly the same thing, using the same DBus call:
# This shell script checks Network Manager if the network is up, using dbus as the communications medium. # There are two possible network interfaces: eth0 (wired) and eth1 (wireless). Of course, you may need to alter these to meet your own circumstances. # The basic format of dbus-send is: dbus-send --system --dest=org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/Devices/eth0 --print-reply org.freedesktop.NetworkManager.Devices.eth0.getLinkActive DEST='org.freedesktop.NetworkManager' PPATH='/org/freedesktop/NetworkManager/Devices' DEVICE='org.freedesktop.NetworkManager.Devices' result_eth0=`dbus-send --system --dest=$DEST $PPATH'/eth0' --print-reply $DEVICE'.eth0.getLinkActive'` shaved_eth0=`echo $result_eth0 | cut -d ' ' -f8` if [ $shaved_eth0 = 'true' ]; then echo 'The wired network is up'; fi result_eth1=`dbus-send --system --dest=$DEST $PPATH'/eth1' --print-reply $DEVICE'.eth1.getLinkActive'` shaved_eth1=`echo $result_eth1 | cut -d ' ' -f8` if [ $shaved_eth1 = 'true' ]; then echo 'The wireless network is up'; fi
A Python script that queries Network Manager to get the list of wireless networks.
import dbus item = 'org.freedesktop.NetworkManager' path = '/org/freedesktop/NetworkManager' interface = item + '.Device' network_list = [] bus = dbus.SystemBus() # Create a Network Manager interface and get the list of network devices event = dbus.Interface(bus.get_object(item, path), interface) # Create an interface for each device # Query each interface to see if it's wireless # Query each wireless interface for the networks it sees for device in event.getDevices(): device_interface = dbus.Interface(bus.get_object(item, device), interface) if device_interface.getType() == 2: # 0 unknown, 1 wired, 2 wireless network_list.extend(device_interface.getNetworks()) # Reformat the network names in the list to be more readable if network_list: for entry in network_list: #print entry # String of path/to/network_name entry_list = entry.split('/') print entry_list[-1] # String of network_name
A Python listener that catches the changes in wireless signal strength using both available methods.
import dbus, gobject from dbus.mainloop.glib import DBusGMainLoop def print_device_strength1(*args): #Use the received signals signal_strength = args[1] print ('Signal Strength (Method 1): ' + str(signal_strength) + '%') def print_device_strength2(*args, **kwargs): #Use the received signals signal_strength = args[1] print ('Signal Strength (Method 2): ' + str(signal_strength) + '%') DBusGMainLoop(set_as_default=True) # Set up the event loop before connecting to the bus bus_object = dbus.SystemBus() # The variables you need. I used the shell command 'dbus-monitor --system' to find this information sender = 'org.freedesktop.NetworkManager' path = '/org/freedesktop/NetworkManager' interface = sender member = 'DeviceStrengthChanged' # Method 1 - bus_object.proxy_object.connect_to_signal(method, action, filter, message_parts) proxy_object = bus_object.get_object(sender, path) proxy_object.connect_to_signal(member, print_device_strength1, dbus_interface = interface) # Method 2 - bus_object.add_signal_receiver(action, [filters]) bus_object.add_signal_receiver(print_device_strength2, dbus_interface = interface, member_keyword = member) # Start the loop loop = gobject.MainLoop() loop.run()
Thunar responds beautifully to D-Bus. Introspection is fully set up, so it's easy to use with the
d-feet
application. Useful for launching programs, opening folders and windows, and manipulating the trash. Launching a program by this method means that the the window manager launches the program, not the script or terminal, so the program can remain open after the script or terminal terminates.#!/usr/bin/env python import dbus item = ('org.xfce.Thunar') path = ('/org/xfce/FileManager') interface = ('org.xfce.FileManager') event = dbus.Interface(dbus.SessionBus().get_object(item, path), interface) # These three lines at the end of the script open the file's 'properties' window display = (':0') # The current session screen uri = ('/home/me/dbus_test.py') event.DisplayFileProperties(uri, display) # These three lines at the end of the script launch a new application display = (':0') # The current session screen uri = ('/usr/bin/gftp-gtk') event.Launch(uri, display) # These four lines at the end of the script open a folder window and optionally select a file display = (':0') # The current session screen uri = ('/home/me/.cron') filename = ('anacrontab.daily') event.DisplayFolderAndSelect(uri, filename, display)
A sample hal script.
#!/usr/bin/python """This python 2.5 script uses dbus to check if the lid switch is open. Based on an original python script at http://schurger.org/wordpress/?p=49""" import dbus dest = 'org.freedesktop.Hal' hal_path = '/org/freedesktop/Hal/Manager' hal_interface = 'org.freedesktop.Hal.Manager' udi_interface = 'org.freedesktop.Hal.Device' # Get the list of possible input switches. The return is a list of paths. bus = dbus.SystemBus() hal = dbus.Interface(bus.get_object(dest, hal_path), hal_interface) list_of_udi_paths = hal.FindDeviceByCapability('input.switch') # Filter the list for the word 'lid'. Print the status for each one. for udi_path in list_of_udi_paths: udi = dbus.Interface(bus.get_object(dest, udi_path), udi_interface) if udi.GetProperty('button.type') == "lid": # The button.state.value is FALSE if the lid is open. if udi.GetProperty('button.state.value'): print ('Lid is closed') else: print ('Lid is open') else: print ('Problem: I could not find the lid switch. Sorry.')
Notes:
- The D-feet application is very handy for exploring DBus, and figuring out how to communicate with it. It's available in the Ubuntu repositories.
- More information on the destination/path/interface settings is available from each application's XML config files, found in the
/etc/dbus-1/system.d and /session.d
directories. - The system-tools-backends DBus interfaces look promising, with methods for network interfaces, time, users and groups, and more. But I couldn't get any of it to work. One hint suggested that the DBus message must be sent by root instead of user.
- xfce4-terminal has a
Launch
method, seemingly for launching items in the terminal (source code). I can see how that would be handy, but I couldn't get it to work.
No comments:
Post a Comment