How do I use PackageKit? |
Back to the main page
If you are writing an application that wants to install packages on demand, and don't care about the low level details, there's a session helper API that you should use. It's much simpler than using PackageKit directly.
The pkcon
text-mode program allows you to interact with
PackageKit on the command line. For example:
[hughsie@laptop ~]$ pkcon get-updates [hughsie@hughsie-work PackageKit]$ pkcon get-updates security bluez-utils-3.35-3.fc9 Bluetooth utilities bugfix xterm-236-1.fc9 Terminal emulator for the X Window System bugfix kernel-devel-2.6.25.14-108.fc9 Development package for building kernel modules to match the kernel enhancement kde-filesystem-4-17.fc9 KDE filesystem layout enhancement subversion-1.5.1-1.fc9 Modern Version Control System designed to replace CVS
or
[hughsie@hughsie-work PackageKit]$ pkcon --filter=~devel search name power installed DeviceKit-power-001-0.8.20080811git.fc9 Power Management Service installed gnome-power-manager-2.23.4-1.118.20080801svn.fc9.hughsie GNOME Power Manager installed powerman-2.1-1.fc9 PowerMan - Power to the Cluster installed powertop-1.9-3.fc9 Power consumption monitor available gnome-power-manager-2.22.1-1.fc9 GNOME Power Manager available kadu-powerkadu-0.6.0-3.fc9 PowerKadu available kadu-powerkadu-0.6.0.1-1.fc9 PowerKadu available kpowersave-0.7.3-3.fc9 KPowersave is the KDE frontend for powermanagement available powerman-1.0.32-5.fc9 PowerMan - Power to the Cluster available powermanga-0.90-3 Arcade 2D shoot-them-up game
The pkmon
program allows you to monitor what PackageKit is
doing on the command line and is mainly used for debugging.
The pkgenpack
program allows you to generate
Service Packs with a package and its dependencies.
gnome-software
and gnome-packagekit
provide a rich
set of GTK tools for automatically updating your computer and installing software.
The libpackagekit gobject library wraps the DBus interface in a nice glib-style API. This makes designing programs that use libpackagekit can concentrate on core functionality rather that the DBus and PackageKit internals. PkTask in libpackagekit can be used as easily as:
GError *error = NULL; PkError *error_code = NULL; PkResults *results = NULL; GPtrArray *array = NULL; PkPackage *item; gchar **values = NULL; gchar **package_ids = NULL; uint i; PkTask *task; task = pk_task_new (); /* resolve the package name */ values = g_new0 (gchar*, 1 + 1); values[0] = g_strdup ("openoffice-clipart"); values[1] = NULL; results = pk_task_resolve_sync (task, PK_FILTER_ENUM_NOT_INSTALLED, values, NULL, NULL, NULL, &error); /* check error code */ error_code = pk_results_get_error_code (results); if (error_code != NULL) { g_printerr ("%s: %s, %s\n", "Resolving of packages failed", pk_error_enum_to_string (pk_error_get_code (error_code)), pk_error_get_details (error_code)); goto out; } /* get the packages returned */ array = pk_results_get_package_array (results); package_ids = g_new0 (gchar *, array->len+1); for (i = 0; i < array->len; i++) { item = g_ptr_array_index (array, i); package_ids[i] = g_strdup (pk_package_get_id (item)); } /* install the packages */ results = pk_task_install_packages_sync (task, package_ids , NULL, NULL, NULL, &error); /* check error code */ error_code = pk_results_get_error_code (results); if (error_code != NULL) { g_printerr ("%s: %s, %s\n", _("Error installing package(s)!"), pk_error_enum_to_string (pk_error_get_code (error_code)), pk_error_get_details (error_code)); goto out; } out: g_strfreev (values); g_object_unref (task); if (error_code != NULL) g_object_unref (error_code); if (array != NULL) g_ptr_array_unref (array); if (package_ids != NULL) g_strfreev (package_ids); if (results != NULL) g_object_unref (results);
Using the PackageKit DBus methods and signals directly means that no glib or gobject dependency is needed, although this means you will have to manage the transaction_id multiplexing in any client program. This is not difficult, although does require more code than just using libpackagekit.
Back to the main page