<?xml version="1.0" encoding="UTF-8" ?>

<node name="/org/chromium/debugd"
      xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
  <interface name="org.chromium.debugd">
    <method name="PingStart">
      <tp:docstring>
        Starts pinging the specified hostname with the specified options, with
        output directed to the given output file descriptor. The returned opaque
        string functions as a handle for this particular ping. Multiple pings
        can be running at once.
      </tp:docstring>
      <arg name="outfd" type="h" direction="in">
        <tp:docstring>
          File descriptor to send output to.
        </tp:docstring>
      </arg>
      <arg name="destination" type="s" direction="in">
        <tp:docstring>
          Destination host to connect to.
        </tp:docstring>
      </arg>
      <arg name="options" type="a{sv}" direction="in">
        <tp:docstring>
          Options to pass to the ping command. Accepted keys include:
            broadcast (bool): Send broadcast pings.
            count (int default 4): Number of packets to send.
            interval (int): Time to wait between packets.
            numeric (bool): Print numeric remote hosts.
            packetsize (int): Size of each packet sent.
            v6 (bool): True for ipv6.
            waittime (int): Time to wait for a response.
          Unrecognized keys return a DBus error and print no output to the
          supplied file descriptor.
        </tp:docstring>
      </arg>
      <arg name="handle" type="s" direction="out">
        <tp:docstring>
          Opaque handle for this ping.
        </tp:docstring>
      </arg>
    </method>
    <method name="PingStop">
      <tp:docstring>
        Stops a running ping.
      </tp:docstring>
      <arg name="handle" type="s" direction="in">
        Handle to the ping to stop. If an empty string is passed, stops all
        running pings.
      </arg>
    </method>
    <method name="SystraceStart">
      <tp:docstring>
        Start system/kernel tracing.  If tracing is already enabled it is
        stopped first and any collected events are discarded.  The kernel
        must have been configured to support tracing.
      </tp:docstring>
      <arg name="categories" type="s" direction="in">
        <tp:docstring>
          Trace event categories to enable.  If none are specified then
          all known events are enabled.  Multiple categories are specified
          separated by spaces.
        </tp:docstring>
      </arg>
    </method>
    <method name="SystraceStop">
      <tp:docstring>
        Stop system/kernel tracing and write the collected event data.
      </tp:docstring>
      <arg name="outfd" type="h" direction="in">
        <tp:docstring>
          File descriptor to send event data to.
        </tp:docstring>
      </arg>
    </method>
    <method name="SystraceStatus">
      <tp:docstring>
        Return current status for system/kernel tracing including whether it
        is enabled, the tracing clock, and the set of events enabled.
      </tp:docstring>
      <arg name="status" type="s" direction="out">
        Free-form text reporting status.
      </arg>
    </method>
    <method name="TracePathStart">
      <arg name="outfd" type="h" direction="in">
        <tp:docstring>
          File descriptor to send output to.
        </tp:docstring>
      </arg>
      <arg name="destination" type="s" direction="in">
        <tp:docstring>
          Destination host[/port] to trace a path to.
        </tp:docstring>
      </arg>
      <arg name="options" type="a{sv}" direction="in">
        <tp:docstring>
          Options to pass to the tracepath command:
            numeric (bool): Print numeric remote hosts.
            v6 (bool): True for ipv6.
          Unrecognized keys return a DBus error and print no output to the
          supplied file descriptor.
        </tp:docstring>
      </arg>
      <arg name="handle" type="s" direction="out">
        <tp:docstring>
          Opaque handle for this ping.
        </tp:docstring>
      </arg>
    </method>
    <method name="TracePathStop">
      <tp:docstring>
        Stops a running tracepath.
      </tp:docstring>
      <arg name="handle" type="s" direction="in">
        <tp:docstring>
          Handle to the tracepath to stop. If an empty string is passed, stops
          all running tracepaths.
        </tp:docstring>
      </arg>
    </method>
    <method name="GetRoutes">
      <tp:docstring>
        Returns the routing table.
      </tp:docstring>
      <arg name="options" type="a{sv}" direction="in">
        <tp:docstring>
          Options:
            numeric (bool): Deprecated, numeric hosts are always given.
            v6 (bool): True for ipv6.
        </tp:docstring>
      </arg>
      <arg name="result" type="as" direction="out">
        <tp:docstring>
          The list of routes.
        </tp:docstring>
      </arg>
    </method>
    <method name="GetModemStatus">
      <tp:docstring>
        Returns modem information as a JSON string. See the design document for
        a rationale.
      </tp:docstring>
      <arg name="status" type="s" direction="out">
        <tp:docstring>
          Modem information as a JSON string.
        </tp:docstring>
      </arg>
    </method>
    <method name="RunModemCommand">
      <tp:docstring>
        Runs the specified command through the modem serial interface and
        returns the output.
      </tp:docstring>
      <arg name="command" type="s" direction="in">
        <tp:docstring>
          Supported commands: get-oma-status, start-oma, get-prl, ciprl-update,
          get-service.
        </tp:docstring>
      </arg>
      <arg name="status" type="s" direction="out" />
    </method>
    <method name="GetNetworkStatus">
      <tp:docstring>
        Returns network information as a JSON string. See the design document
        for a rationale.
      </tp:docstring>
      <arg name="status" type="s" direction="out">
        <tp:docstring>
          Network information as a JSON string.
        </tp:docstring>
      </arg>
    </method>
    <method name="GetWiMaxStatus">
      <tp:docstring>
        Returns WiMAX information as a JSON string. See the design document for
        a rationale.
      </tp:docstring>
      <arg name="status" type="s" direction="out">
        <tp:docstring>
          WiMAX information as a JSON string.
        </tp:docstring>
      </arg>
    </method>
    <method name="GetPerfOutput">
      <tp:docstring>
        Runs system-wide perf profiling. The profile parameters are selected by
        perf_args.
      </tp:docstring>
      <arg name="duration_sec" type="u" direction="in">
        <tp:docstring>
          Duration to run perf in seconds.
        </tp:docstring>
      </arg>
      <arg name="perf_args" type="as" direction="in">
        <tp:docstring>
          The perf parameters to pass to quipper, which will forward them to
          perf after checking they are safe.
        </tp:docstring>
      </arg>
      <arg name="status" type="i" direction="out">
        <tp:docstring>
          Status code from running perf and serializing the output.
        </tp:docstring>
      </arg>
      <arg name="perf_data" type="ay" direction="out">
        <tp:docstring>
          Perf report output data as a protobuf.
        </tp:docstring>
      </arg>
      <arg name="perf_stat" type="ay" direction="out">
        <tp:docstring>
          Perf stat output data as a protobuf.
        </tp:docstring>
      </arg>
    </method>
    <method name="GetRandomPerfOutput">
      <tp:docstring>
        Runs system-wide perf profiling. It can can profile events other than
        cycles (example: iTLB-misses), and can collect branch profiles. It can
        also return raw counter values. The exact profile or counters to be
        collected is chosen at random and depends on what CPU is used by the
        system (certain CPUs do not support certain profiling modes).
      </tp:docstring>
      <arg name="duration_sec" type="u" direction="in">
        <tp:docstring>
          Duration to run perf in seconds.
        </tp:docstring>
      </arg>
      <arg name="status" type="i" direction="out">
        <tp:docstring>
          Status code from running perf and serializing the output.
        </tp:docstring>
      </arg>
      <arg name="perf_data" type="ay" direction="out">
        <tp:docstring>
          Perf report output data as a protobuf.
        </tp:docstring>
      </arg>
      <arg name="perf_stat" type="ay" direction="out">
        <tp:docstring>
          Perf stat output data as a protobuf.
        </tp:docstring>
      </arg>
    </method>
    <method name="GetRichPerfData">
      <tp:docstring>
        Returns perf event data. Does systemwide profiling. It can profile
        events other than cycles (example: iTLB-misses), and can collect branch
        profiles. The exact profile to be collected is chosen at random
        and depends on what CPU is used by the system (certain CPUs do not
        support certain profiling modes).
      </tp:docstring>
      <arg name="duration_sec" type="u" direction="in">
        <tp:docstring>
          Duration to run perf in seconds.
        </tp:docstring>
      </arg>
      <arg name="status" type="ay" direction="out">
        <tp:docstring>
          Perf event data as a protobuf.
        </tp:docstring>
      </arg>
    </method>
    <method name="GetDebugLogs">
      <tp:docstring>
        DEPRECATED: Use DumpDebugLogs instead.
        Packages up system logs into a .tar.gz and returns it over the supplied
        file descriptor.
      </tp:docstring>
      <arg name="outfd" type="h" direction="in">
        <tp:docstring>
          File descriptor to emit the .tar.gz file over.
        </tp:docstring>
      </arg>
    </method>
    <method name="DumpDebugLogs">
      <tp:docstring>
        Packages up system logs into a .tar(.gz) and returns it over the
        supplied file descriptor.
      </tp:docstring>
      <arg name="is_compressed" type="b" direction="in">
        <tp:docstring>
          If true, output content should be compressed (.tar.gz), otherwise
          output content is uncompressed (.tar).
        </tp:docstring>
      </arg>
      <arg name="outfd" type="h" direction="in">
        <tp:docstring>
          File descriptor to emit the .tar.gz file over.
        </tp:docstring>
      </arg>
    </method>
    <method name="SetDebugMode">
      <tp:docstring>
        Enables or disables debug mode for a specified subsystem.
      </tp:docstring>
      <arg name="subsystem" type="s" direction="in">
        <tp:docstring>
          Subsystem to change the debug mode of. One of "cellular", "wifi",
          "wimax", "ethernet" or "none".
        </tp:docstring>
      </arg>
    </method>
    <method name="GetLog">
      <tp:docstring>
        Fetches the contents of a single system log, identified by name. See
        /src/log_tool.cc for a list of valid names.
      </tp:docstring>
      <arg name="log" type="s" direction="in" />
      <arg name="contents" type="s" direction="out" />
    </method>
    <method name="GetAllLogs">
      <tp:docstring>
        Returns all the system logs.
      </tp:docstring>
      <arg name="logs" type="a{ss}" direction="out" />
    </method>
    <method name="GetFeedbackLogs">
      <tp:docstring>
        Returns system logs for feedback reports.
      </tp:docstring>
      <arg name="logs" type="a{ss}" direction="out" />
    </method>
    <method name="GetUserLogFiles">
      <tp:docstring>
        Returns list of User log file names that Chrome itself must collect.
        These logfiles are relative to the user's profile path and must be
        collected separately for each user.
      </tp:docstring>
      <arg name="user_log_files" type="a{ss}" direction="out" />
    </method>
    <method name="GetExample">
      <tp:docstring>
        Example method. See /doc/hacking.md.
      </tp:docstring>
      <arg name="result" type="s" direction="out" />
    </method>
    <method name="GetInterfaces">
      <tp:docstring>
        Returns information about network interfaces as a JSON string.
      </tp:docstring>
      <arg name="result" type="s" direction="out" />
    </method>
    <method name="TestICMP">
      <tp:docstring>
        Tests ICMP connectivity to a specified host.
      </tp:docstring>
      <arg name="host" type="s" direction="in" />
      <arg name="result" type="s" direction="out" />
    </method>
    <method name="TestICMPWithOptions">
      <tp:docstring>
        Tests ICMP connectivity to a specified host (with options).
      </tp:docstring>
      <arg name="host" type="s" direction="in" />
      <arg name="options" type="a{ss}" direction="in" />
      <arg name="result" type="s" direction="out" />
    </method>
    <method name="BatteryFirmware">
      <tp:docstring>
        Runs BatteryFirmware utility.
      </tp:docstring>
      <arg name="option" type="s" direction="in">
        <tp:docstring>
          Option to pass to the BatteryFirmware command:
            info: Get Battery Firmware Info.
            check: Check if AC Adapter is connected.
            update: Trigger Battery Firmware Update.
        </tp:docstring>
      </arg>
      <arg name="result" type="s" direction="out">
        <tp:docstring>
          Battery command output.
        </tp:docstring>
      </arg>
    </method>
    <method name="Smartctl">
      <tp:docstring>
        Runs Smartctl utility.
      </tp:docstring>
      <arg name="option" type="s" direction="in">
        <tp:docstring>
          Option to pass to the Smartctl command:
            abort_test: aborts the offline test.
            attributes: prints device attributes.
            capabilities: prints generic smart capabilities.
            error: prints device error messages.
            health: prints device health status.
            selftest: prints offline test results.
            short_test: starts a short offline test.
        </tp:docstring>
      </arg>
      <arg name="result" type="s" direction="out">
        <tp:docstring>
          Smartctl command output.
        </tp:docstring>
      </arg>
    </method>
    <method name="MemtesterStart">
      <tp:docstring>
        Starts running memtester.
      </tp:docstring>
      <arg name="outfd" type="h" direction="in">
        <tp:docstring>
          File descriptor to send output to.
        </tp:docstring>
      </arg>
      <arg name="memory" type="u" direction="in">
        <tp:docstring>
          The amount of memory to allocate and test in megabytes.
        </tp:docstring>
      </arg>
      <arg name="status" type="s" direction="out">
        <tp:docstring>
          Opaque handle to the memtester.
        </tp:docstring>
      </arg>
    </method>
    <method name="MemtesterStop">
      <tp:docstring>
        Stops running memtester.
      </tp:docstring>
      <arg name="handle" type="s" direction="in">
        <tp:docstring>
          Handle to the memtester to stop. If an empty string is passed, stops
          all running memtests.
        </tp:docstring>
      </arg>
    </method>
    <method name="BadblocksStart">
      <tp:docstring>
        Starts running badblocks test.
      </tp:docstring>
      <arg name="outfd" type="h" direction="in">
        <tp:docstring>
          File descriptor to send output to.
        </tp:docstring>
      </arg>
      <arg name="status" type="s" direction="out">
        <tp:docstring>
          Opaque handle to the badblocks.
        </tp:docstring>
      </arg>
    </method>
    <method name="BadblocksStop">
      <tp:docstring>
        Stops running badblocks.
      </tp:docstring>
      <arg name="handle" type="s" direction="in">
        <tp:docstring>
          Handle to the badblocks to stop. If an empty string is passed, stops
          all running badblocks.
        </tp:docstring>
      </arg>
    </method>
    <method name="PacketCaptureStart">
      <tp:docstring>
        Starts a packet capture with the specified options, with diagnostic
        status directed to the "statfd" file descriptor and packet capture
        data sent to the "outfd" file descriptor.  The returned opaque string
        functions as a handle for this particular packet capture.  Multiple
        captures can be running at once.  Captures can be initiated on
        Ethernet-like devices or WiFi devices in "client mode" (showing only
        Ethernet frames) by specifying the "device" parameter (see below).
        By specifying a channel, the script will find or create a "monitor
        mode" interface if one is available and produce an "over the air"
        packet capture.  The name of the output packet capture file is sent
        to the output file descriptor.
      </tp:docstring>
      <arg name="statfd" type="h" direction="in">
        <tp:docstring>
          File descriptor to send status information to.
        </tp:docstring>
      </arg>
      <arg name="outfd" type="h" direction="in">
        <tp:docstring>
          File descriptor to send packet capture output to.
        </tp:docstring>
      </arg>
      <arg name="options" type="a{sv}" direction="in">
        <tp:docstring>
          Options to pass to the packet capture command. Accepted keys include:
            device (string): An existing device to perform a packet capture on.
            frequency (int): Radio frequency (in MHz) to perform capture on.
            ht_location (string): The string "above" or "below", representing
                the offset of any secondary channel used in a 40 MHz HT
                (high throughput) caputre.
            monitor_connection_on (string): Instead of providing the "frequency"
                and "ht_location" parameters above, this paramter specifies the
                name of a currently connected 802.11 interface.  A packet
                capture is initated on the same channel as this connection.
          Unrecognized keys return a DBus error and print no output to the
          supplied file descriptor.
        </tp:docstring>
      </arg>
      <arg name="handle" type="s" direction="out">
        <tp:docstring>
          Opaque handle for this packet capture.
        </tp:docstring>
      </arg>
    </method>
    <method name="PacketCaptureStop">
      <tp:docstring>
        Stops a running packet capture.
      </tp:docstring>
      <arg name="handle" type="s" direction="in">
        Handle to the packet capture to stop. If an empty string is passed,
        stops all running packet captures.
      </arg>
    </method>
    <method name="LogKernelTaskStates">
      <tp:docstring>
        Triggers show-task-states(T) SysRq.
        See https://www.kernel.org/doc/Documentation/sysrq.txt.
      </tp:docstring>
    </method>
    <method name="UploadCrashes">
      <tp:docstring>
        Triggers uploading of system crashes (the crash_sender program).
      </tp:docstring>
    </method>
    <method name="RemoveRootfsVerification">
      <tp:docstring>
        Removes rootfs verification. Requires a system reboot before it will
        take effect. Restricted to pre-owner dev mode.
      </tp:docstring>
    </method>
    <method name="EnableBootFromUsb">
      <tp:docstring>
        Enables OS booting from a USB image. Restricted to pre-owner dev mode.
      </tp:docstring>
    </method>
    <method name="ConfigureSshServer">
      <tp:docstring>
        Sets up sshd to provide an SSH server immediately and on future reboots.
        Also installs the test SSH keys to allow access by cros tools. Requires
        that rootfs verification has been removed. Restricted to pre-owner dev
        mode.
      </tp:docstring>
    </method>
    <method name="SetUserPassword">
      <tp:docstring>
        Sets both the system and dev mode password for the indicated account.
        Restricted to pre-owner dev mode.
      </tp:docstring>
      <arg name="username" type="s" direction="in">
        <tp:docstring>
          Username to set the new password for.
        </tp:docstring>
      </arg>
      <arg name="password" type="s" direction="in">
        <tp:docstring>
          Password to assign.
        </tp:docstring>
      </arg>
    </method>
    <method name="EnableChromeRemoteDebugging">
      <tp:docstring>
        Sets up Chrome for remote debugging. It will take effect after a reboot
        and using port 9222.
        Requires that rootfs verification has been removed. Restricted to
        pre-owner dev mode.
      </tp:docstring>
    </method>
    <method name="EnableChromeDevFeatures">
      <tp:docstring>
        Convenience function to enable a predefined set of tools from the Chrome
        UI. Equivalent to calling these functions in order:
          1. EnableBootFromUsb()
          2. ConfigureSshServer()
          3. SetUserPassword("root", root_password)
        Requires that rootfs verification has been removed. If any sub-function
        fails, this function will exit with an error without attempting any
        further configuration or rollback. Restricted to pre-owner dev mode.
      </tp:docstring>
      <arg name="root_password" type="s" direction="in">
        <tp:docstring>
          Password to assign to the root user. If the string is empty, it will
          default to "test0000".
        </tp:docstring>
      </arg>
    </method>
    <method name="QueryDevFeatures">
      <tp:docstring>
        Queries which dev features have been enabled. Each dev feature will be
        indicated by a bit flag in the return value. Flags are defined in the
        DevFeatureFlag enumeration. If the dev tools are unavailable (system is
        not in dev mode/pre-login state), the DEV_FEATURES_DISABLED flag will be
        set and the rest of the bits will always be set to 0.
      </tp:docstring>
      <arg name="features" type="i" direction="out">
        <tp:docstring>
          Feature enabled flags or DEV_FEATURES_DISABLED flag.
        </tp:docstring>
      </arg>
    </method>
    <tp:enum name="DevFeatureFlag" type="i">
      <tp:docstring>
        Bit flags representing individual development features. Currently
        dbusxx-xml2cpp does not extract enum values, so any changes here should
        be manually flushed to platform/system_api/dbus/service_constants.h.
      </tp:docstring>
      <tp:enumvalue suffix="DEV_FEATURES_DISABLED" value="0x0001">
        <tp:docstring>
          Dev features query is unavailable due to access restrictions.
        </tp:docstring>
      </tp:enumvalue>
      <tp:enumvalue suffix="DEV_FEATURE_ROOTFS_VERIFICATION_REMOVED"
                    value="0x0002">
        <tp:docstring>
          Rootfs verification has been removed, including the required system
          reset.
        </tp:docstring>
      </tp:enumvalue>
      <tp:enumvalue suffix="DEV_FEATURE_BOOT_FROM_USB_ENABLED" value="0x0004">
        <tp:docstring>
          Booting from USB has been enabled.
        </tp:docstring>
      </tp:enumvalue>
      <tp:enumvalue suffix="DEV_FEATURE_SSH_SERVER_CONFIGURED" value="0x0008">
        <tp:docstring>
          The SSH server has been configured to auto-start on boot and the test
          SSH keys have been installed. Both of these conditions must be met
          for this flag to be signaled.
        </tp:docstring>
      </tp:enumvalue>
      <tp:enumvalue suffix="DEV_FEATURE_DEV_MODE_ROOT_PASSWORD_SET"
                    value="0x0010">
        <tp:docstring>
          The devmode root account password has been set.
        </tp:docstring>
      </tp:enumvalue>
      <tp:enumvalue suffix="DEV_FEATURE_SYSTEM_ROOT_PASSWORD_SET"
                    value="0x0020">
        <tp:docstring>
          The system root account password has been set.
        </tp:docstring>
      </tp:enumvalue>
      <tp:enumvalue suffix="DEV_FEATURE_CHROME_REMOTE_DEBUGGING_ENABLED"
                    value="0x0040">
        <tp:docstring>
          The Chrome remote debugging feature has been enabled. Chrome will
          be listening on port 9222. The port is not publicly accessible. User
          needs to use SSH port forwarding to be able to access it.
        </tp:docstring>
      </tp:enumvalue>
    </tp:enum>
    <method name="EnableDevCoredumpUpload">
      <tp:docstring>
        Allow uploading of device coredump files.
      </tp:docstring>
    </method>
    <method name="DisableDevCoredumpUpload">
      <tp:docstring>
        Disallow uploading of device coredump files.
      </tp:docstring>
    </method>
  </interface>
</node>
