Browse Source

Merge branch 'pu/systemd-inhibitor' into 'master'

Prevent shutdown while running dpkg

See merge request apt-team/apt!60
tags/devuan/2.0.1+devuan1
Julian Andres Klode 1 year ago
parent
commit
9ada8cb08b
9 changed files with 103 additions and 0 deletions
  1. +24
    -0
      CMake/FindSystemd.cmake
  2. +3
    -0
      CMake/config.h.in
  3. +5
    -0
      CMakeLists.txt
  4. +2
    -0
      apt-pkg/CMakeLists.txt
  5. +48
    -0
      apt-pkg/contrib/fileutl.cc
  6. +2
    -0
      apt-pkg/contrib/fileutl.h
  7. +15
    -0
      apt-pkg/deb/dpkgpm.cc
  8. +1
    -0
      debian/control
  9. +3
    -0
      doc/examples/configure-index

+ 24
- 0
CMake/FindSystemd.cmake View File

@@ -0,0 +1,24 @@
# - Try to find SYSTEMD
# Once done, this will define
#
# SYSTEMD_FOUND - system has SYSTEMD
# SYSTEMD_INCLUDE_DIRS - the SYSTEMD include directories
# SYSTEMD_LIBRARIES - the SYSTEMD library
find_package(PkgConfig)

pkg_check_modules(SYSTEMD_PKGCONF libsystemd)

find_path(SYSTEMD_INCLUDE_DIRS
NAMES systemd/sd-bus.h
PATHS ${SYSTEMD_PKGCONF_INCLUDE_DIRS}
)

find_library(SYSTEMD_LIBRARIES
NAMES systemd
PATHS ${SYSTEMD_PKGCONF_LIBRARY_DIRS}
)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Systemd DEFAULT_MSG SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES)

mark_as_advanced(SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES)

+ 3
- 0
CMake/config.h.in View File

@@ -20,6 +20,9 @@
/* Define if we have the zstd library for zst */
#cmakedefine HAVE_ZSTD

/* Define if we have the systemd library */
#cmakedefine HAVE_SYSTEMD

/* Define if we have the udev library */
#cmakedefine HAVE_UDEV



+ 5
- 0
CMakeLists.txt View File

@@ -117,6 +117,11 @@ if (UDEV_FOUND)
set(HAVE_UDEV 1)
endif()

find_package(Systemd)
if (SYSTEMD_FOUND)
set(HAVE_SYSTEMD 1)
endif()

find_package(Seccomp)
if (SECCOMP_FOUND)
set(HAVE_SECCOMP 1)


+ 2
- 0
apt-pkg/CMakeLists.txt View File

@@ -48,6 +48,7 @@ target_include_directories(apt-pkg
${LZ4_INCLUDE_DIRS}
$<$<BOOL:${ZSTD_FOUND}>:${ZSTD_INCLUDE_DIRS}>
$<$<BOOL:${UDEV_FOUND}>:${UDEV_INCLUDE_DIRS}>
$<$<BOOL:${SYSTEMD_FOUND}>:${SYSTEMD_INCLUDE_DIRS}>
${ICONV_INCLUDE_DIRS}
)

@@ -60,6 +61,7 @@ target_link_libraries(apt-pkg
${LZ4_LIBRARIES}
$<$<BOOL:${ZSTD_FOUND}>:${ZSTD_LIBRARIES}>
$<$<BOOL:${UDEV_FOUND}>:${UDEV_LIBRARIES}>
$<$<BOOL:${SYSTEMD_FOUND}>:${SYSTEMD_LIBRARIES}>
${ICONV_LIBRARIES}
)
set_target_properties(apt-pkg PROPERTIES VERSION ${MAJOR}.${MINOR})


+ 48
- 0
apt-pkg/contrib/fileutl.cc View File

@@ -70,6 +70,9 @@
#ifdef HAVE_ZSTD
#include <zstd.h>
#endif
#ifdef HAVE_SYSTEMD
#include <systemd/sd-bus.h>
#endif
#include <endian.h>
#include <stdint.h>

@@ -3369,3 +3372,48 @@ bool OpenConfigurationFileFd(std::string const &File, FileFd &Fd) /*{{{*/
return true;
}
/*}}}*/
int Inhibit(const char *what, const char *who, const char *why, const char *mode) /*{{{*/
{
#ifdef HAVE_SYSTEMD
sd_bus_error error = SD_BUS_ERROR_NULL;
sd_bus_message *m = NULL;
sd_bus *bus = NULL;
int fd;
int r;

r = sd_bus_open_system(&bus);
if (r < 0)
goto out;

r = sd_bus_call_method(bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
"Inhibit",
&error,
&m,
"ssss",
what,
who,
why,
mode);
if (r < 0)
goto out;

r = sd_bus_message_read(m, "h", &fd);
if (r < 0)
goto out;

// We received a file descriptor, return it - systemd will close the read fd
// on free, so let's duplicate it here.
r = dup(fd);
out:
sd_bus_error_free(&error);
sd_bus_message_unref(m);
sd_bus_unref(bus);
return r;
#else
return -ENOTSUP;
#endif
}
/*}}}*/

+ 2
- 0
apt-pkg/contrib/fileutl.h View File

@@ -283,4 +283,6 @@ bool Popen(const char *Args[], FileFd &Fd, pid_t &Child, FileFd::OpenMode Mode,

APT_HIDDEN bool OpenConfigurationFileFd(std::string const &File, FileFd &Fd);

APT_HIDDEN int Inhibit(const char *what, const char *who, const char *why, const char *mode);

#endif

+ 15
- 0
apt-pkg/deb/dpkgpm.cc View File

@@ -1448,6 +1448,21 @@ bool pkgDPkgPM::ExpandPendingCalls(std::vector<Item> &List, pkgDepCache &Cache)
}
bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
{
struct Inhibitor
{
int Fd = -1;
Inhibitor()
{
if (_config->FindB("DPkg::Inhibit-Shutdown", true))
Fd = Inhibit("shutdown", "APT", "APT is installing or removing packages", "block");
}
~Inhibitor()
{
if (Fd > 0)
close(Fd);
}
} inhibitor;

// explicitly remove&configure everything for hookscripts and progress building
// we need them only temporarily through, so keep the length and erase afterwards
decltype(List)::const_iterator::difference_type explicitIdx =


+ 1
- 0
debian/control View File

@@ -21,6 +21,7 @@ Build-Depends: cmake (>= 3.4),
liblz4-dev (>= 0.0~r126),
liblzma-dev,
libseccomp-dev [amd64 arm64 armel armhf i386 mips mips64el mipsel ppc64el s390x hppa powerpc powerpcspe ppc64 x32],
libsystemd-dev [linux-any],
libudev-dev [linux-any],
libzstd-dev (>= 1.0),
ninja-build,


+ 3
- 0
doc/examples/configure-index View File

@@ -503,6 +503,9 @@ DPkg
progress-bg "<STRING>";
progress-bar "<BOOL>";
};

// Set a shutdown block inhibitor on systemd systems while running dpkg
Inhibit-Shutdown "<BOOL>";
}

/* Options you can set to see some debugging text They correspond to names


Loading…
Cancel
Save