# rpm-ostree D-Bus Interface ## Executive Summary rpm-ostree uses D-Bus as its primary inter-process communication mechanism, providing a standardized interface for client-daemon communication. The D-Bus interface enables secure, reliable communication between unprivileged clients and the privileged daemon. ## D-Bus Architecture ### Service Overview **Service Name**: `org.projectatomic.rpmostree1` **Purpose**: Provide system management interface for rpm-ostree operations **Architecture**: ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ CLI Client │ │ GUI Client │ │ API Client │ │ (rpmostree) │ │ (GNOME/KDE) │ │ (Python/Go) │ └─────────┬───────┘ └─────────┬───────┘ └─────────┬───────┘ │ │ │ └──────────────────────┼──────────────────────┘ │ ┌─────────────▼─────────────┐ │ D-Bus Interface │ │ (org.projectatomic.rpmo │ │ stree1) │ └─────────────┬─────────────┘ │ ┌─────────────▼─────────────┐ │ rpm-ostreed Daemon │ │ (Privileged Service) │ └───────────────────────────┘ ``` ### Design Principles 1. **Standard Interface**: Use standard D-Bus conventions and patterns 2. **Type Safety**: Strong typing for all method parameters and return values 3. **Error Handling**: Comprehensive error reporting and propagation 4. **Progress Reporting**: Real-time progress updates via signals 5. **Transaction Management**: Transaction-based operations with rollback support ## Interface Definition ### Main Objects #### `/org/projectatomic/rpmostree1/Sysroot` **Purpose**: System root management and deployment operations **Interface**: `org.projectatomic.rpmostree1.Sysroot` #### `/org/projectatomic/rpmostree1/OS` **Purpose**: Operating system operations and package management **Interface**: `org.projectatomic.rpmostree1.OS` ### Interface XML Definition ```xml ``` ## Method Details ### Sysroot Methods #### GetDeployments **Purpose**: Get list of available deployments **Parameters**: None **Returns**: Array of deployment information **Example**: ```cpp // Client call GVariant* result = g_dbus_connection_call_sync( connection, "org.projectatomic.rpmostree1", "/org/projectatomic/rpmostree1/Sysroot", "org.projectatomic.rpmostree1.Sysroot", "GetDeployments", nullptr, nullptr, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, nullptr ); // Parse result GVariantIter* iter; g_variant_get(result, "(a(sa{sv}))", &iter); ``` #### GetBootedDeployment **Purpose**: Get information about the currently booted deployment **Parameters**: None **Returns**: Deployment information for booted deployment **Example**: ```cpp GVariant* result = g_dbus_connection_call_sync( connection, "org.projectatomic.rpmostree1", "/org/projectatomic/rpmostree1/Sysroot", "org.projectatomic.rpmostree1.Sysroot", "GetBootedDeployment", nullptr, nullptr, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, nullptr ); ``` #### GetPendingDeployment **Purpose**: Get information about the pending deployment **Parameters**: None **Returns**: Deployment information for pending deployment ### OS Methods #### Upgrade **Purpose**: Upgrade system to latest version **Parameters**: - `options`: Dictionary of upgrade options **Options**: - `reboot`: Boolean - Automatically reboot after upgrade - `download-only`: Boolean - Download updates without installing - `allow-downgrade`: Boolean - Allow downgrading packages - `unchanged-exit-77`: Boolean - Exit with 77 if no changes **Returns**: Transaction address for tracking operation **Example**: ```cpp // Prepare options GVariantBuilder* builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); g_variant_builder_add(builder, "{sv}", "reboot", g_variant_new_boolean(TRUE)); g_variant_builder_add(builder, "{sv}", "download-only", g_variant_new_boolean(FALSE)); GVariant* options = g_variant_builder_end(builder); // Call method GVariant* result = g_dbus_connection_call_sync( connection, "org.projectatomic.rpmostree1", "/org/projectatomic/rpmostree1/OS", "org.projectatomic.rpmostree1.OS", "Upgrade", g_variant_new("(a{sv})", options), nullptr, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, nullptr ); // Get transaction address const char* transaction_address; g_variant_get(result, "(s)", &transaction_address); ``` #### Rollback **Purpose**: Rollback to previous deployment **Parameters**: - `options`: Dictionary of rollback options **Options**: - `reboot`: Boolean - Automatically reboot after rollback - `not-as-default`: Boolean - Don't set as default boot option **Returns**: Transaction address for tracking operation #### Deploy **Purpose**: Deploy specific version or commit **Parameters**: - `ref`: Deployment reference (version or commit hash) - `options`: Dictionary of deployment options **Options**: - `reboot`: Boolean - Automatically reboot after deployment - `not-as-default`: Boolean - Don't set as default boot option - `os`: String - Specify operating system name **Returns**: Transaction address for tracking operation #### Rebase **Purpose**: Switch to different base image **Parameters**: - `ref`: Base image reference - `options`: Dictionary of rebase options **Options**: - `reboot`: Boolean - Automatically reboot after rebase - `os`: String - Specify operating system name **Returns**: Transaction address for tracking operation #### PkgChange **Purpose**: Install or remove packages **Parameters**: - `packages`: Array of package names - `change_type`: Type of change ("install" or "remove") - `options`: Dictionary of package change options **Options**: - `reboot`: Boolean - Automatically reboot after package change - `allow-inactive`: Boolean - Allow installing on inactive deployment - `idempotent`: Boolean - Don't error if packages already installed/removed **Returns**: Transaction address for tracking operation **Example**: ```cpp // Prepare packages array GVariantBuilder* packages_builder = g_variant_builder_new(G_VARIANT_TYPE("as")); g_variant_builder_add(packages_builder, "s", "vim"); g_variant_builder_add(packages_builder, "s", "git"); GVariant* packages = g_variant_builder_end(packages_builder); // Prepare options GVariantBuilder* options_builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); g_variant_builder_add(options_builder, "{sv}", "reboot", g_variant_new_boolean(FALSE)); GVariant* options = g_variant_builder_end(options_builder); // Call method GVariant* result = g_dbus_connection_call_sync( connection, "org.projectatomic.rpmostree1", "/org/projectatomic/rpmostree1/OS", "org.projectatomic.rpmostree1.OS", "PkgChange", g_variant_new("(assa{sv})", packages, "install", options), nullptr, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, nullptr ); ``` #### KernelArgs **Purpose**: Manage kernel arguments **Parameters**: - `operation`: Operation type ("append", "delete", "replace", "show") - `args`: Array of kernel arguments - `options`: Dictionary of kernel argument options **Options**: - `reboot`: Boolean - Automatically reboot after changes **Returns**: Transaction address for tracking operation #### Cleanup **Purpose**: Clean up old deployments **Parameters**: - `options`: Dictionary of cleanup options **Options**: - `base`: Boolean - Clean up base images - `repomd`: Boolean - Clean up repository metadata - `rollback`: Boolean - Clean up rollback deployments **Returns**: Transaction address for tracking operation #### GetStatus **Purpose**: Get system status **Parameters**: None **Returns**: JSON-formatted status string **Example**: ```cpp GVariant* result = g_dbus_connection_call_sync( connection, "org.projectatomic.rpmostree1", "/org/projectatomic/rpmostree1/OS", "org.projectatomic.rpmostree1.OS", "GetStatus", nullptr, nullptr, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, nullptr ); const char* status; g_variant_get(result, "(s)", &status); printf("Status: %s\n", status); ``` #### GetPackages **Purpose**: Get list of installed packages **Parameters**: None **Returns**: Array of package names #### SearchPackages **Purpose**: Search for packages **Parameters**: - `query`: Search query string **Returns**: Array of matching package names #### GetPackageInfo **Purpose**: Get detailed package information **Parameters**: - `package`: Package name **Returns**: JSON-formatted package information ## Signals ### TransactionChanged **Purpose**: Report transaction state changes **Parameters**: - `transaction_address`: Transaction identifier - `state`: Transaction state ("preparing", "downloading", "installing", "finalizing") - `message`: Human-readable status message - `percentage`: Progress percentage (0-100) **Example**: ```cpp // Signal handler void handle_transaction_changed(GDBusConnection* connection, const char* sender, const char* object_path, const char* interface_name, const char* signal_name, GVariant* parameters, void* user_data) { const char* transaction_address; const char* state; const char* message; int percentage; g_variant_get(parameters, "(sssi)", &transaction_address, &state, &message, &percentage); printf("Transaction %s: %s - %s (%d%%)\n", transaction_address, state, message, percentage); } ``` ### TransactionCompleted **Purpose**: Report transaction completion **Parameters**: - `transaction_address`: Transaction identifier - `success`: Boolean indicating success or failure - `result`: Result message or error description **Example**: ```cpp void handle_transaction_completed(GDBusConnection* connection, const char* sender, const char* object_path, const char* interface_name, const char* signal_name, GVariant* parameters, void* user_data) { const char* transaction_address; gboolean success; const char* result; g_variant_get(parameters, "(sbs)", &transaction_address, &success, &result); if (success) { printf("Transaction %s completed successfully: %s\n", transaction_address, result); } else { printf("Transaction %s failed: %s\n", transaction_address, result); } } ``` ### StatusChanged **Purpose**: Report system status changes **Parameters**: - `status`: New system status ## Transaction Management ### Transaction Lifecycle 1. **Initiation**: Client calls method, receives transaction address 2. **Progress**: Daemon emits TransactionChanged signals 3. **Completion**: Daemon emits TransactionCompleted signal 4. **Cleanup**: Transaction resources are cleaned up ### Transaction States - **preparing**: Transaction is being prepared - **downloading**: Packages are being downloaded - **installing**: Packages are being installed - **finalizing**: Transaction is being finalized - **completed**: Transaction completed successfully - **failed**: Transaction failed ### Transaction Tracking **Example**: ```cpp // Start transaction const char* transaction_address; g_variant_get(result, "(s)", &transaction_address); // Subscribe to transaction signals g_dbus_connection_signal_subscribe( connection, "org.projectatomic.rpmostree1", "org.projectatomic.rpmostree1.OS", "TransactionChanged", "/org/projectatomic/rpmostree1/OS", nullptr, G_DBUS_SIGNAL_FLAGS_NONE, handle_transaction_changed, nullptr, nullptr ); g_dbus_connection_signal_subscribe( connection, "org.projectatomic.rpmostree1", "org.projectatomic.rpmostree1.OS", "TransactionCompleted", "/org/projectatomic/rpmostree1/OS", nullptr, G_DBUS_SIGNAL_FLAGS_NONE, handle_transaction_completed, nullptr, nullptr ); ``` ## Error Handling ### Error Types 1. **G_DBUS_ERROR_SERVICE_UNKNOWN**: Daemon service not available 2. **G_DBUS_ERROR_NO_REPLY**: Daemon not responding 3. **G_DBUS_ERROR_TIMEOUT**: Operation timed out 4. **G_DBUS_ERROR_FAILED**: General operation failure 5. **G_DBUS_ERROR_INVALID_ARGS**: Invalid method arguments ### Error Handling Example ```cpp GError* error = nullptr; GVariant* result = g_dbus_connection_call_sync( connection, "org.projectatomic.rpmostree1", "/org/projectatomic/rpmostree1/OS", "org.projectatomic.rpmostree1.OS", "Upgrade", g_variant_new("(a{sv})", options), nullptr, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, &error ); if (error != nullptr) { if (g_error_matches(error, G_DBUS_ERROR, G_DBUS_ERROR_SERVICE_UNKNOWN)) { fprintf(stderr, "Daemon is not running. Please start the rpm-ostreed service.\n"); } else if (g_error_matches(error, G_DBUS_ERROR, G_DBUS_ERROR_NO_REPLY)) { fprintf(stderr, "Daemon is not responding. Please check the service status.\n"); } else { fprintf(stderr, "Error: %s\n", error->message); } g_error_free(error); } ``` ## Security ### Authentication **PolicyKit Integration**: ```xml Upgrade system Authentication is required to upgrade the system auth_admin auth_admin auth_admin /usr/libexec/rpm-ostreed Install packages Authentication is required to install packages auth_admin auth_admin auth_admin /usr/libexec/rpm-ostreed ``` ### Access Control - **System Bus**: D-Bus system bus for privileged operations - **Service Activation**: Automatic service activation via systemd - **User Permissions**: PolicyKit-based user permission management ## Performance Considerations ### Connection Management **Connection Pooling**: ```cpp // Reuse connections when possible static GDBusConnection* get_connection() { static GDBusConnection* connection = nullptr; if (connection == nullptr) { connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, nullptr); } return connection; } ``` ### Async Operations **Non-blocking Calls**: ```cpp g_dbus_connection_call( connection, "org.projectatomic.rpmostree1", "/org/projectatomic/rpmostree1/OS", "org.projectatomic.rpmostree1.OS", "Upgrade", g_variant_new("(a{sv})", options), nullptr, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, handle_upgrade_response, nullptr ); ``` ## Monitoring and Debugging ### D-Bus Monitoring **Monitor D-Bus Traffic**: ```bash # Monitor all D-Bus traffic dbus-monitor --system # Monitor specific service dbus-monitor --system "destination='org.projectatomic.rpmostree1'" ``` ### Debugging Tools **D-Bus Introspection**: ```bash # Introspect service gdbus introspect --system --dest org.projectatomic.rpmostree1 --object-path /org/projectatomic/rpmostree1/OS ``` **D-Bus Call Testing**: ```bash # Test method call gdbus call --system --dest org.projectatomic.rpmostree1 --object-path /org/projectatomic/rpmostree1/OS --method org.projectatomic.rpmostree1.OS.GetStatus ``` ## Future Enhancements ### Planned Features 1. **Event Streaming**: Real-time event streaming for status updates 2. **Batch Operations**: Support for batch operations 3. **Advanced Filtering**: Enhanced filtering and querying capabilities 4. **Performance Optimization**: Further performance improvements ### Interface Improvements 1. **Versioning**: Interface versioning for backward compatibility 2. **Extensions**: Extensible interface for custom operations 3. **Validation**: Enhanced parameter validation 4. **Documentation**: Improved interface documentation