<?xml version='1.0'?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" >
<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->

<refentry id="org.freedesktop.portable1" conditional='ENABLE_PORTABLED'
    xmlns:xi="http://www.w3.org/2001/XInclude">
  <refentryinfo>
    <title>org.freedesktop.portable1</title>
    <productname>systemd</productname>
  </refentryinfo>

  <refmeta>
    <refentrytitle>org.freedesktop.portable1</refentrytitle>
    <manvolnum>5</manvolnum>
  </refmeta>

  <refnamediv>
    <refname>org.freedesktop.portable1</refname>
    <refpurpose>The D-Bus interface of systemd-portabled</refpurpose>
  </refnamediv>

  <refsect1>
    <title>Introduction</title>

    <para>
    <citerefentry><refentrytitle>systemd-portabled.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
    is a system service that may be used to attach, detach and inspect portable services. This page describes the
    D-Bus interface.</para>
  </refsect1>

  <refsect1>
    <title>The Manager Object</title>

    <para>The service exposes the following interfaces on the Manager object on the bus:</para>

    <programlisting executable="systemd-portabled" node="/org/freedesktop/portable1" interface="org.freedesktop.portable1.Manager">
node /org/freedesktop/portable1 {
  interface org.freedesktop.portable1.Manager {
    methods:
      GetImage(in  s image,
               out o object);
      ListImages(out a(ssbtttso) images);
      GetImageOSRelease(in  s image,
                        out a{ss} os_release);
      GetImageMetadata(in  s image,
                       in  as matches,
                       out s image,
                       out ay os_release,
                       out a{say} units);
      GetImageMetadataWithExtensions(in  s image,
                                     in  as extensions,
                                     in  as matches,
                                     in  t flags,
                                     out s image,
                                     out ay os_release,
                                     out a{say} extensions,
                                     out a{say} units);
      GetImageState(in  s image,
                    out s state);
      AttachImage(in  s image,
                  in  as matches,
                  in  s profile,
                  in  b runtime,
                  in  s copy_mode,
                  out a(sss) changes);
      AttachImageWithExtensions(in  s image,
                                in  as extensions,
                                in  as matches,
                                in  s profile,
                                in  s copy_mode,
                                in  t flags,
                                out a(sss) changes);
      DetachImage(in  s image,
                  in  b runtime,
                  out a(sss) changes);
      DetachImageWithExtensions(in  s image,
                                in  as extensions,
                                in  t flags,
                                out a(sss) changes);
      ReattachImage(in  s image,
                    in  as matches,
                    in  s profile,
                    in  b runtime,
                    in  s copy_mode,
                    out a(sss) changes_removed,
                    out a(sss) changes_updated);
      ReattachImageWithExtensions(in  s image,
                                  in  as extensions,
                                  in  as matches,
                                  in  s profile,
                                  in  s copy_mode,
                                  in  t flags,
                                  out a(sss) changes_removed,
                                  out a(sss) changes_updated);
      RemoveImage(in  s image);
      MarkImageReadOnly(in  s image,
                        in  b read_only);
      SetImageLimit(in  s image,
                    in  t limit);
      SetPoolLimit(in  t limit);
    properties:
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly s PoolPath = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly t PoolUsage = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly t PoolLimit = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly as Profiles = ['...', ...];
  };
  interface org.freedesktop.DBus.Peer { ... };
  interface org.freedesktop.DBus.Introspectable { ... };
  interface org.freedesktop.DBus.Properties { ... };
};
    </programlisting>

    <!--Autogenerated cross-references for systemd.directives, do not edit-->

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.portable1.Manager"/>

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.portable1.Manager"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetImage()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ListImages()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetImageOSRelease()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetImageMetadata()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetImageMetadataWithExtensions()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetImageState()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="AttachImage()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="AttachImageWithExtensions()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="DetachImage()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="DetachImageWithExtensions()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ReattachImage()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ReattachImageWithExtensions()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="RemoveImage()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="MarkImageReadOnly()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetImageLimit()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetPoolLimit()"/>

    <variablelist class="dbus-property" generated="True" extra-ref="PoolPath"/>

    <variablelist class="dbus-property" generated="True" extra-ref="PoolUsage"/>

    <variablelist class="dbus-property" generated="True" extra-ref="PoolLimit"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Profiles"/>

    <!--End of Autogenerated section-->

    <refsect2>
      <title>Methods</title>

      <para><function>GetImage()</function> may be used to get the image object path of the image with the
      specified name.</para>

      <para><function>ListImages()</function> returns an array of all currently known images. The
      structures in the array consist of the following fields: image name, type, read-only flag, creation
      time, modification time, current disk space, usage and image object path.</para>

      <para><function>GetImageOSRelease()</function> retrieves the OS release information of an image.
      This method returns an array of key value pairs read from the
      <citerefentry><refentrytitle>os-release</refentrytitle><manvolnum>5</manvolnum></citerefentry> file in
      the image and is useful to identify the operating system used in a portable service.</para>

      <para><function>GetImageMetadata()</function> retrieves metadata associated with an image.
      This method returns the image name, the image's <citerefentry><refentrytitle>os-release</refentrytitle>
      <manvolnum>5</manvolnum></citerefentry> content in the form of a (streamable) array of bytes,
      and a list of portable units contained in the image, in the form of a string (unit name) and
      an array of bytes with the content.</para>

      <para><function>GetImageMetadataWithExtensions()</function> retrieves metadata associated with an
      image. This method is a superset of <function>GetImageMetadata()</function> with the addition of a list
      of extensions as input parameter, which were overlaid on top of the main image via
      <function>AttachImageWithExtensions()</function>. The path of each extension and an array of bytes with
      the content of the respective extension-release file are returned, one such structure for each
      extension named in the input arguments.</para>

      <para><function>GetImageState()</function> retrieves the image state as one of the following
      strings:
      <itemizedlist>
        <listitem><para>detached</para></listitem>

        <listitem><para>attached</para></listitem>

        <listitem><para>attached-runtime</para></listitem>

        <listitem><para>enabled</para></listitem>

        <listitem><para>enabled-runtime</para></listitem>

        <listitem><para>running</para></listitem>

        <listitem><para>running-runtime</para></listitem>
      </itemizedlist></para>

      <para><function>AttachImage()</function> attaches a portable image to the system.
      This method takes an image path or name, a list of strings that will be used to search for
      unit files inside the image (partial or complete matches), a string indicating which
      portable profile to use for the image (see <varname>Profiles</varname> property for
      a list of available profiles), a boolean indicating whether to attach the image only
      for the current boot session, and a string representing the preferred copy mode
      (whether to copy the image or to just symlink it) with the following possible values:
      <itemizedlist>
        <listitem><para>(null)</para></listitem>

        <listitem><para>copy</para></listitem>

        <listitem><para>symlink</para></listitem>
      </itemizedlist>
      This method returns the list of changes applied to the system (for example, which unit was
      added and is now available as a system service). Each change is represented as a triplet of
      strings: the type of change applied, the path on which it was applied, and the source
      (if any). The type of change applied will be one of the following possible values:
      <itemizedlist>
        <listitem><para>copy</para></listitem>

        <listitem><para>symlink</para></listitem>

        <listitem><para>write</para></listitem>

        <listitem><para>mkdir</para></listitem>
      </itemizedlist>
      Note that an image cannot be attached if a unit that it contains is already present
      on the system.</para>

      <para><function>AttachImageWithExtensions()</function> attaches a portable image to the system.
      This method is a superset of <function>AttachImage()</function> with the addition of
      a list of extensions as input parameter, which will be overlaid on top of the main
      image. When this method is used, detaching must be done by passing the same arguments via the
      <function>DetachImageWithExtensions()</function> method. For more details on this functionality,
      see the <varname>MountImages=</varname> entry on
      <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
      and <citerefentry><refentrytitle>systemd-sysext</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
      The <varname>flag</varname> parameter is currently unused and reserved for future purposes.</para>

      <para><function>DetachImage()</function> detaches a portable image from the system.
      This method takes an image path or name, and a boolean indicating whether the image to
      detach was attached only for the current boot session or persistently. This method
      returns the list of changes applied to the system (for example, which unit was removed
      and is no longer available as a system service). Each change is represented as a triplet of
      strings: the type of change applied, the path on which it was applied, and the source
      (if any). The type of change applied will be one of the following possible values:
      <itemizedlist>
        <listitem><para>unlink</para></listitem>
      </itemizedlist>
      Note that an image cannot be detached if a unit that it contains is running.</para>

      <para><function>DetachImageWithExtensions()</function> detaches a portable image from the system.
      This method is a superset of <function>DetachImage()</function> with the addition of
      a list of extensions as input parameter, which were overlaid on top of the main
      image via <function>AttachImageWithExtensions()</function>.
      The <varname>flag</varname> parameter is currently unused and reserved for future purposes.</para>

      <para><function>ReattachImage()</function> combines the effects of the
      <function>AttachImage()</function> method and the <function>DetachImage()</function> method.
      The difference is that it is allowed to reattach an image while one or more of its units
      are running. The reattach operation will fail if no matching image is attached.
      The input parameters match the <function>AttachImage()</function> method, and the return
      parameters are the combination of the return parameters of the
      <function>DetachImage()</function> method (first array, units that were removed) and the
      <function>AttachImage()</function> method (second array, units that were updated or added).</para>

      <para><function>ReattachImageWithExtensions()</function> reattaches a portable image to the system.
      This method is a superset of <function>ReattachImage()</function> with the addition of
      a list of extensions as input parameter, which will be overlaid on top of the main
      image. For more details on this functionality, see the <varname>MountImages=</varname> entry on
      <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
      and <citerefentry><refentrytitle>systemd-sysext</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
      The <varname>flag</varname> parameter is currently unused and reserved for future purposes</para>

      <para><function>RemoveImage()</function> removes the image with the specified name.</para>

      <para><function>MarkImageReadOnly()</function> toggles the read-only flag of an image.</para>

      <para><function>SetPoolLimit()</function> sets an overall quota limit on the pool of images.</para>

      <para><function>SetImageLimit()</function> sets a per-image quota limit.</para>

      <para>The <function>AttachImageWithExtensions()</function>,
      <function>DetachImageWithExtensions()</function> and
      <function>ReattachImageWithExtensions()</function> methods take in options as flags instead of
      booleans to allow for extendability, defined as follows:</para>

      <programlisting>
#define SD_SYSTEMD_PORTABLE_RUNTIME  (UINT64_C(1) &lt;&lt; 0)
      </programlisting>
    </refsect2>

    <refsect2>
      <title>Properties</title>

      <para><varname>PoolPath</varname> specifies the file system path where images are written to.</para>

      <para><varname>PoolUsage</varname> specifies the current usage size of the image pool in bytes.</para>

      <para><varname>PoolLimit</varname> specifies the size limit of the image pool in bytes.</para>

      <para><varname>Profiles</varname> specifies the available runtime profiles for portable services.</para>
    </refsect2>
  </refsect1>

  <refsect1>
    <title>The Image Object</title>

    <para>The service exposes the following interfaces on the Image object on the bus:</para>

    <programlisting executable="systemd-portabled" node="/org/freedesktop/portable1" interface="org.freedesktop.portable1.Image">
node /org/freedesktop/portable1 {
  interface org.freedesktop.portable1.Image {
    methods:
      GetOSRelease(out a{ss} os_release);
      GetMetadata(in  as matches,
                  out s image,
                  out ay os_release,
                  out a{say} units);
      GetMetadataWithExtensions(in  as extensions,
                                in  as matches,
                                in  t flags,
                                out s image,
                                out ay os_release,
                                out a{say} extensions,
                                out a{say} units);
      GetState(out s state);
      Attach(in  as matches,
             in  s profile,
             in  b runtime,
             in  s copy_mode,
             out a(sss) changes);
      AttachWithExtensions(in  as extensions,
                           in  as matches,
                           in  s profile,
                           in  s copy_mode,
                           in  t flags,
                           out a(sss) changes);
      Detach(in  b runtime,
             out a(sss) changes);
      DetachWithExtensions(in  as extensions,
                           in  t flags,
                           out a(sss) changes);
      Reattach(in  as matches,
               in  s profile,
               in  b runtime,
               in  s copy_mode,
               out a(sss) changes_removed,
               out a(sss) changes_updated);
      ReattacheWithExtensions(in  as extensions,
                              in  as matches,
                              in  s profile,
                              in  s copy_mode,
                              in  t flags,
                              out a(sss) changes_removed,
                              out a(sss) changes_updated);
      Remove();
      MarkReadOnly(in  b read_only);
      SetLimit(in  t limit);
    properties:
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly s Name = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly s Path = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly s Type = '...';
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly b ReadOnly = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly t CreationTimestamp = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly t ModificationTimestamp = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly t Usage = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly t Limit = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly t UsageExclusive = ...;
      @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
      readonly t LimitExclusive = ...;
  };
  interface org.freedesktop.DBus.Peer { ... };
  interface org.freedesktop.DBus.Introspectable { ... };
  interface org.freedesktop.DBus.Properties { ... };
};
    </programlisting>

    <!--method GetOSRelease is not documented!-->

    <!--method GetMetadata is not documented!-->

    <!--method GetMetadataWithExtensions is not documented!-->

    <!--method GetState is not documented!-->

    <!--method Attach is not documented!-->

    <!--method AttachWithExtensions is not documented!-->

    <!--method Detach is not documented!-->

    <!--method DetachWithExtensions is not documented!-->

    <!--method Reattach is not documented!-->

    <!--method ReattacheWithExtensions is not documented!-->

    <!--method Remove is not documented!-->

    <!--method MarkReadOnly is not documented!-->

    <!--method SetLimit is not documented!-->

    <!--Autogenerated cross-references for systemd.directives, do not edit-->

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.portable1.Image"/>

    <variablelist class="dbus-interface" generated="True" extra-ref="org.freedesktop.portable1.Image"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetOSRelease()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetMetadata()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetMetadataWithExtensions()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="GetState()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Attach()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="AttachWithExtensions()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Detach()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="DetachWithExtensions()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Reattach()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="ReattacheWithExtensions()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="Remove()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="MarkReadOnly()"/>

    <variablelist class="dbus-method" generated="True" extra-ref="SetLimit()"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Name"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Path"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Type"/>

    <variablelist class="dbus-property" generated="True" extra-ref="ReadOnly"/>

    <variablelist class="dbus-property" generated="True" extra-ref="CreationTimestamp"/>

    <variablelist class="dbus-property" generated="True" extra-ref="ModificationTimestamp"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Usage"/>

    <variablelist class="dbus-property" generated="True" extra-ref="Limit"/>

    <variablelist class="dbus-property" generated="True" extra-ref="UsageExclusive"/>

    <variablelist class="dbus-property" generated="True" extra-ref="LimitExclusive"/>

    <!--End of Autogenerated section-->

    <refsect2>
      <title>Methods</title>

      <para>The following methods implement the same operation as the respective methods on the
      <interfacename>Manager</interfacename> object (see above). However, these methods operate on the image
      object and hence does not take an image name parameter. Invoking the methods directly on the Manager
      object has the advantage of not requiring a <function>GetImage()</function> call to get the image object
      for a specific image name. Calling the methods on the Manager object is hence a round trip
      optimization. List of methods:
      <itemizedlist>
        <listitem><para>GetOSRelease()</para></listitem>

        <listitem><para>GetMetadata()</para></listitem>

        <listitem><para>GetMetadataWithExtensions()</para></listitem>

        <listitem><para>GetState()</para></listitem>

        <listitem><para>Attach()</para></listitem>

        <listitem><para>AttachWithExtensions()</para></listitem>

        <listitem><para>Detach()</para></listitem>

        <listitem><para>DetachWithExtensions()</para></listitem>

        <listitem><para>Reattach()</para></listitem>

        <listitem><para>ReattacheWithExtensions()</para></listitem>

        <listitem><para>Remove()</para></listitem>

        <listitem><para>MarkReadOnly()</para></listitem>

        <listitem><para>SetLimit()</para></listitem>
      </itemizedlist></para>
    </refsect2>

    <refsect2>
      <title>Properties</title>

      <para><varname>Name</varname> specifies the image name.</para>

      <para><varname>Path</varname> specifies the file system path where image is stored.</para>

      <para><varname>Type</varname> specifies the image type.</para>

      <para><varname>ReadOnly</varname> specifies whether the image is read-only.</para>

      <para><varname>CreationTimestamp</varname> specifies the image creation timestamp.</para>

      <para><varname>ModificationTimestamp</varname> specifies the image modification timestamp.</para>

      <para><varname>Usage</varname> specifies the image disk usage.</para>

      <para><varname>Limit</varname> specifies the image disk usage limit.</para>

      <para><varname>UsageExclusive</varname> specifies the image disk usage (exclusive).</para>

      <para><varname>LimitExclusive</varname> specifies the image disk usage limit (exclusive).</para>
    </refsect2>
  </refsect1>

  <refsect1>
    <title>Versioning</title>

    <para>These D-Bus interfaces follow <ulink url="http://0pointer.de/blog/projects/versioning-dbus.html">
    the usual interface versioning guidelines</ulink>.</para>
  </refsect1>
</refentry>
