This file is indexed.

/usr/lib/plainbox-providers-1/checkbox/bin/udisks2_monitor is in plainbox-provider-checkbox 0.3-2.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/env python3
# Copyright 2012 Canonical Ltd.
# Written by:
#   Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3,
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

"""
Script that observes changes to various devices, as published by
UDisks2. Note: this script has no UDisks (one) equivalent.
"""

import errno
import logging
import sys

from checkbox_support.dbus import connect_to_system_bus, drop_dbus_type
from checkbox_support.dbus.udisks2 import UDisks2Observer

from dbus.exceptions import DBusException


def _print_interfaces_and_properties(interfaces_and_properties):
    """
    Print a collection of interfaces and properties exported by some object

    The argument is the value of the dictionary _values_, as returned from
    GetManagedObjects() for example. See this for details:
        http://dbus.freedesktop.org/doc/dbus-specification.html#
        standard-interfaces-objectmanager
    """
    for interface_name, properties in interfaces_and_properties.items():
        print("   - Interface {}".format(interface_name))
        for prop_name, prop_value in properties.items():
            prop_value = drop_dbus_type(prop_value)
            print("     * Property {}: {}".format(prop_name, prop_value))


def main():
    # Connect to the system bus, we also get the event
    # loop as we need it to start listening for signals.
    system_bus, loop = connect_to_system_bus()

    # Create an instance of the observer that we'll need for the model
    observer = UDisks2Observer()

    # Define all our callbacks in advance, there are three callbacks that we
    # need, for interface insertion/removal (which roughly corresponds to
    # objects/devices coming and going) and one extra signal that is only fired
    # once, when we get the initial list of objects.

    # Let's print everything we know about initially for the users to see
    def print_initial_objects(managed_objects):
        print("UDisks2 knows about the following objects:")
        for object_path, interfaces_and_properties in managed_objects.items():
            print(" * {}".format(object_path))
            _print_interfaces_and_properties(interfaces_and_properties)
        sys.stdout.flush()
    observer.on_initial_objects.connect(print_initial_objects)

    # Setup a callback for the InterfacesAdded signal. This way we will get
    # notified of any interface changes in this collection. In practice this
    # means that all objects that are added/removed will be advertised through
    # this mechanism
    def print_interfaces_added(object_path, interfaces_and_properties):
        print("The object:")
        print("  {}".format(object_path))
        print("has gained the following interfaces and properties:")
        _print_interfaces_and_properties(interfaces_and_properties)
        sys.stdout.flush()
    observer.on_interfaces_added.connect(print_interfaces_added)

    # Setup a callback on PropertiesChanged signal. This way we will get
    # notified on any changes to the values of properties exported by various
    # objects on the bus.
    def print_properties_changed(object_path, interface_name,
                                 changed_properties, invalidated_properties):
        print("The object")
        print("  {}".format(object_path))
        print("has changed the following properties")
        print("   - Interface {}".format(interface_name))
        for prop_name, prop_value in changed_properties.items():
            prop_value = drop_dbus_type(prop_value)
            print("     * Property {}: {}".format(prop_name, prop_value))
        for prop_name in invalidated_properties:
            print("     * Property {} (invalidated)".format(prop_name))
    observer.on_properties_changed.connect(print_properties_changed)

    # Again, a similar callback for interfaces that go away. It's not spelled
    # out explicitly but it seems that objects with no interfaces left are
    # simply gone. We'll treat them as such
    def print_interfaces_removed(object_path, interfaces):
        print("The object:")
        print("  {}".format(object_path))
        print("has lost the following interfaces:")
        for interface in interfaces:
            print(" * {}".format(interface))
        sys.stdout.flush()
    observer.on_interfaces_removed.connect(print_interfaces_removed)

    # Now that all signal handlers are set, connect the observer to the system
    # bus
    try:
        logging.debug("Connecting UDisks2 observer to DBus")
        observer.connect_to_bus(system_bus)
    except DBusException as exc:
        # Manage the missing service error if needed to give sensible error
        # message on precise where UDisks2 is not available
        if exc.get_dbus_name() == "org.freedesktop.DBus.Error.ServiceUnknown":
            print("You need to have udisks2 installed to run this program")
            print("It is only applicable to Ubuntu 12.10, or later")
            raise SystemExit(1)
        else:
            raise  # main_shield() will catch this one

    # Now start the event loop and just display any device changes
    print("=" * 80)
    print("Waiting for device changes (press ctlr+c to exit)")
    print("=" * 80)
    logging.debug("Entering event loop")
    sys.stdout.flush()  # Explicitly flush to allow tee users to see things
    try:
        loop.run()
    except KeyboardInterrupt:
        loop.quit()
    print("Exiting")


def main_shield():
    """
    Helper for real main that manages exceptions we don't recover from
    """
    try:
        main()
    except DBusException as exc:
        logging.exception("Caught fatal DBus exception, aborting")
    except IOError as exc:
        # Ignore pipe errors as they are harmless
        if exc.errno != errno.EPIPE:
            raise


if __name__ == "__main__":
    main_shield()