Hi - This change was suggested by fedora fesco folks, to make it easier for for auxiliary system daemons to use debuginfod by default.
commit 4db2eba32aaed7d567f5ebea6b2eb7a6dc4b4b36 Author: Frank Ch. Eigler <f...@redhat.com> Date: Thu Apr 29 11:49:14 2021 -0400 PR27783 debuginfod: fetch default DEBUGINFOD_URLS from systemwide file Introduce use of a systemwide config file /etc/debuginfod_urls for a fallback default for an unset $DEBUGINFOD_URLS. $DEBUGINFOD_URLS_FILE overrides the default location of that file, which is probably mainly useful for testing. Deprecate the similar /etc/profile.d/debuginfod* mechanism that affected only login shells. OTOH, setting ANY of the following to be an empty string will disable debuginfod-client capability: - env var $DEBUGINFOD_URLS - env var $DEBUGINFOD_URLS_FILE - the file named by $DEBUGINFOD_URLS_FILE Signed-off-by: Frank Ch. Eigler <f...@redhat.com> diff --git a/ChangeLog b/ChangeLog index e18746fb9771..4057e19a87ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2021-04-29 Frank Ch. Eigler <f...@redhat.com> + + PR27783 + * configure.ac (enable-debuginfod-urls): Tweak AC_CONFIG_FILE. + 2021-03-30 Frank Ch. Eigler <f...@redhat.com> * configure.ac: Look for pthread_setname_np. diff --git a/NEWS b/NEWS index 038c6019f572..5f4b0992b629 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,8 @@ Version 0.184 +debuginfod-client: DEBUGINFOD_URLS_FILE (default /etc/debuginfod_urls) + is consulted for DEBUGINFOD_URLS if that is unset. + debuginfod: Use libarchive's bsdtar as the .deb-family file unpacker. Version 0.183 diff --git a/config/ChangeLog b/config/ChangeLog index 0e179cbc673b..ab13c4a80586 100644 --- a/config/ChangeLog +++ b/config/ChangeLog @@ -1,3 +1,12 @@ +2021-04-29 Frank Ch. Eigler <f...@redhat.com> + + PR27783 + * profile.*: Drop these. + * debuginfod_urls.in: New file. + * elfutils.spec.in: Adjust accordingly. + * debuginfod.sysconfig: Add blurb to unset upstream links by default. + * Makefile.am: dist it. + 2021-02-17 Timm Bäder <tbae...@redhat.com> * eu.am (NO_PACKED_NOT_ALIGNED_WARNING): New variable. diff --git a/config/Makefile.am b/config/Makefile.am index a66f54904991..1b6cdcc8fa8b 100644 --- a/config/Makefile.am +++ b/config/Makefile.am @@ -30,7 +30,7 @@ ## EXTRA_DIST = elfutils.spec.in known-dwarf.awk 10-default-yama-scope.conf \ libelf.pc.in libdw.pc.in libdebuginfod.pc.in \ - debuginfod.service debuginfod.sysconfig profile.sh.in profile.csh.in + debuginfod.service debuginfod.sysconfig debuginfod_urls.in pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libelf.pc libdw.pc @@ -38,11 +38,10 @@ if LIBDEBUGINFOD pkgconfig_DATA += libdebuginfod.pc install-data-local: - $(INSTALL_DATA) profile.sh -D $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.sh - $(INSTALL_DATA) profile.csh -D $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.csh + $(INSTALL_DATA) debuginfod_urls -D $(DESTDIR)$(sysconfdir)/debuginfod_urls uninstall-local: - rm -f $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.sh $(DESTDIR)$(sysconfdir)/profile.d/debuginfod.csh + rm -f $(DESTDIR)$(sysconfdir)/debuginfod_urls endif if MAINTAINER_MODE diff --git a/config/debuginfod.sysconfig b/config/debuginfod.sysconfig index 446038742bae..bb0c84f3d4d5 100644 --- a/config/debuginfod.sysconfig +++ b/config/debuginfod.sysconfig @@ -8,7 +8,10 @@ DEBUGINFOD_PATHS="-t43200 -F -R /usr/lib/debug /usr/bin /usr/libexec /usr/sbin / # prefer reliability/durability over performance #DEBUGINFOD_PRAGMAS="-D 'pragma synchronous=full;'" -# upstream debuginfods +# set it to empty to avoid accidental recursive reference +DEBUGINFOD_URLS="" +DEBUGINFOD_URLS_FILE="" +# or specify upstream debuginfods #DEBUGINFOD_URLS="http://secondhost:8002 http://thirdhost:8002" #DEBUGINFOD_TIMEOUT="5" #DEBUGINFOD_CACHE_DIR="" diff --git a/config/debuginfod_urls.in b/config/debuginfod_urls.in new file mode 100644 index 000000000000..5a5fa815d2e9 --- /dev/null +++ b/config/debuginfod_urls.in @@ -0,0 +1 @@ +@DEBUGINFOD_URLS@ diff --git a/config/elfutils.spec.in b/config/elfutils.spec.in index 9df92b3815e7..ba06480c71c1 100644 --- a/config/elfutils.spec.in +++ b/config/elfutils.spec.in @@ -298,7 +298,7 @@ fi %{_libdir}/libdebuginfod.so.* %{_bindir}/debuginfod-find %{_mandir}/man1/debuginfod-find.1* -%config(noreplace) %{_sysconfdir}/profile.d/* +%config(noreplace) %{_sysconfdir}/debuginfod_urls %files debuginfod-client-devel %defattr(-,root,root) diff --git a/config/profile.csh.in b/config/profile.csh.in deleted file mode 100644 index 0a2d6d162019..000000000000 --- a/config/profile.csh.in +++ /dev/null @@ -1,11 +0,0 @@ -if ("@DEBUGINFOD_URLS@" != "") then - if ($?DEBUGINFOD_URLS) then - if ($%DEBUGINFOD_URLS) then - setenv DEBUGINFOD_URLS "$DEBUGINFOD_URLS @DEBUGINFOD_URLS@" - else - setenv DEBUGINFOD_URLS "@DEBUGINFOD_URLS@" - endif - else - setenv DEBUGINFOD_URLS "@DEBUGINFOD_URLS@" - endif -endif diff --git a/config/profile.sh.in b/config/profile.sh.in deleted file mode 100644 index aa228a0dcd16..000000000000 --- a/config/profile.sh.in +++ /dev/null @@ -1,4 +0,0 @@ -if [ -n "@DEBUGINFOD_URLS@" ]; then - DEBUGINFOD_URLS="${DEBUGINFOD_URLS-}${DEBUGINFOD_URLS:+ }@DEBUGINFOD_URLS@" - export DEBUGINFOD_URLS -fi diff --git a/configure.ac b/configure.ac index ad046bc27ac1..1ce280513e73 100644 --- a/configure.ac +++ b/configure.ac @@ -781,10 +781,10 @@ AS_IF([test "x$enable_debuginfod" != "xno"], [ AS_IF([test "x$enable_debuginfod" != "xno"],AC_DEFINE([ENABLE_DEBUGINFOD],[1],[Build debuginfod])) AM_CONDITIONAL([DEBUGINFOD],[test "x$enable_debuginfod" = "xyes"]) -dnl for /etc/profile.d/elfutils.{csh,sh} +dnl for /etc/debuginfod_urls default_debuginfod_urls="" AC_ARG_ENABLE(debuginfod-urls, - [AS_HELP_STRING([--enable-debuginfod-urls@<:@=URLS@:>@],[add URLS to profile.d DEBUGINFOD_URLS])], + [AS_HELP_STRING([--enable-debuginfod-urls@<:@=URLS@:>@],[set systemwide default DEBUGINFOD_URLS])], [if test "x${enableval}" = "xyes"; then default_debuginfod_urls="https://debuginfod.elfutils.org/"; elif test "x${enableval}" != "xno"; then @@ -792,7 +792,7 @@ AC_ARG_ENABLE(debuginfod-urls, fi], [default_debuginfod_urls=""]) AC_SUBST(DEBUGINFOD_URLS, $default_debuginfod_urls) -AC_CONFIG_FILES([config/profile.sh config/profile.csh]) +AC_CONFIG_FILES([config/debuginfod_urls]) AC_OUTPUT diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog index 3909100903cb..20744497e383 100644 --- a/debuginfod/ChangeLog +++ b/debuginfod/ChangeLog @@ -1,3 +1,12 @@ +2021-04-29 Frank Ch. Eigler <f...@redhat.com> + + PR27783 + * debuginfod-client.c (xstr_readfile, xstr_readline): New helpers. + (debuginfod_begin): In absence of $DEBUGINFOD_URLS, read + $DEBUGINFOD_URLS_FILE for default urls. + * Makefile.am (CFLAGS): Pass $SYSCONFDIR. + * debuginfod.h (DEBUGINFOD_URLS_FILE_ENV_VAR): New variable. + 2021-04-26 Frank Ch. Eigler <f...@redhat.com> PR27571 diff --git a/debuginfod/Makefile.am b/debuginfod/Makefile.am index 3adb27559c9c..0b61f4b1cb69 100644 --- a/debuginfod/Makefile.am +++ b/debuginfod/Makefile.am @@ -80,6 +80,9 @@ noinst_LIBRARIES = libdebuginfod.a noinst_LIBRARIES += libdebuginfod_pic.a endif +# expand $sysconfdir with embedded $prefix if any +SYSCONFDIR=$(shell prefix="$(prefix)"; sysconfdir="$(sysconfdir)"; echo $$sysconfdir) +AM_CFLAGS += -DSYSCONFDIR='"$(SYSCONFDIR)"' libdebuginfod_a_SOURCES = debuginfod-client.c libdebuginfod_pic_a_SOURCES = debuginfod-client.c am_libdebuginfod_pic_a_OBJECTS = $(libdebuginfod_a_SOURCES:.c=.os) diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c index 374989e26d43..e65aac8b4c1c 100644 --- a/debuginfod/debuginfod-client.c +++ b/debuginfod/debuginfod-client.c @@ -1122,6 +1122,53 @@ debuginfod_query_server (debuginfod_client *c, +/* Read given file into malloc()d buffer, if possible. Caller to free. */ +static char* +xstr_readfile (const char *file) +{ + char* buf = NULL; + struct stat st; + int fd = open (file, O_RDONLY); + if (fd < 0) goto out; + int rc = fstat(fd, &st); + if (rc < 0) goto out1; + off_t sz = st.st_size; + buf = malloc (sz+1); + if (buf == NULL) goto out1; + off_t i = 0; + while (i < sz) /* loop to read the whole thing */ + { + ssize_t s = read(fd, & buf[i], sz-i); + if (s <= 0) break; + i += s; + } + + /* NUL-terminate */ + buf[i] = '\0'; + + out1: + close (fd); + + out: + return buf; +} + + +/* Return the first line of given file, with no \n but a \0. + Caller to free(). */ +static char* +xstr_readline (const char *file) +{ + char *f = xstr_readfile (file); + if (f == NULL) + return f; + char *ret = index (f, '\n'); + if (ret) + *ret = '\0'; + return f; +} + + /* See debuginfod.h */ debuginfod_client * debuginfod_begin (void) @@ -1130,7 +1177,8 @@ debuginfod_begin (void) size_t size = sizeof (struct debuginfod_client); const char* server_urls = NULL; client = (debuginfod_client *) calloc (1, size); - + char* default_urls = NULL; + if (client != NULL) { if (getenv(DEBUGINFOD_PROGRESS_ENV_VAR)) @@ -1144,6 +1192,21 @@ debuginfod_begin (void) /* Count the DEBUGINFOD_URLS and create the long-lived curl handles. */ client->num_urls = 0; server_urls = getenv (DEBUGINFOD_URLS_ENV_VAR); + /* Fall back to fetching default from a system file. */ + if (server_urls == NULL) + { + const char* server_urls_file = getenv (DEBUGINFOD_URLS_FILE_ENV_VAR); + if (server_urls_file == NULL) server_urls_file = SYSCONFDIR "/debuginfod_urls"; + default_urls = xstr_readline (server_urls_file); + if (default_urls != NULL) + { + server_urls = default_urls; + /* Save it to the environment so this file opening dance is + not repeated for this process. */ + setenv ("DEBUGINFOD_URLS", default_urls, 1 /* overwrite */); + } + } + if (server_urls != NULL) for (int i = 0; server_urls[i] != '\0'; i++) if (server_urls[i] != url_delim_char @@ -1184,7 +1247,8 @@ debuginfod_begin (void) free (client); client = NULL; - out: + out: + free (default_urls); /* ok even if NULL */ return client; } diff --git a/debuginfod/debuginfod.h.in b/debuginfod/debuginfod.h.in index 559ea9479349..891cdf0da0cc 100644 --- a/debuginfod/debuginfod.h.in +++ b/debuginfod/debuginfod.h.in @@ -31,6 +31,7 @@ /* Names of environment variables that control the client logic. */ #define DEBUGINFOD_URLS_ENV_VAR "DEBUGINFOD_URLS" +#define DEBUGINFOD_URLS_FILE_ENV_VAR "DEBUGINFOD_URLS_FILE" #define DEBUGINFOD_CACHE_PATH_ENV_VAR "DEBUGINFOD_CACHE_PATH" #define DEBUGINFOD_TIMEOUT_ENV_VAR "DEBUGINFOD_TIMEOUT" #define DEBUGINFOD_PROGRESS_ENV_VAR "DEBUGINFOD_PROGRESS" diff --git a/doc/ChangeLog b/doc/ChangeLog index 05fcd23d5465..2703bd7d2d0f 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,8 @@ +2021-04-29 Frank Ch. Eigler <f...@redhat.com> + + PR27783 + * debuginfod*: Document new $DEBUGINFOD_URLS_FILE variable. + 2021-04-23 Frank Ch. Eigler <f...@redhat.com> PR27701 diff --git a/doc/debuginfod-find.1 b/doc/debuginfod-find.1 index 12d4ec2d32fe..1e14b992ddc6 100644 --- a/doc/debuginfod-find.1 +++ b/doc/debuginfod-find.1 @@ -132,6 +132,12 @@ proxy server could.) This environment variable contains a list of URL prefixes for trusted debuginfod instances. Alternate URL prefixes are separated by space. +.TP 21 +.B DEBUGINFOD_URLS_FILE +If $DEBUGINFOD_URLS is unset, the file named by this environment variable +is read, and its first line is used as $DEBUGINFOD_URLS. The default file +is under the system configuration directory (usually \fB/etc/debuginfod_urls\fP). + .TP 21 .B DEBUGINFOD_TIMEOUT This environment variable governs the timeout for each debuginfod HTTP diff --git a/doc/debuginfod.8 b/doc/debuginfod.8 index 1ba42cf65ffa..9408aff0193d 100644 --- a/doc/debuginfod.8 +++ b/doc/debuginfod.8 @@ -416,6 +416,12 @@ debuginfod instances. Alternate URL prefixes are separated by space. Avoid referential loops that cause a server to contact itself, directly or indirectly - the results would be hilarious. +.TP 21 +.B DEBUGINFOD_URLS_FILE +If $DEBUGINFOD_URLS is unset, the file named by this environment variable +is read, and its first line is used as $DEBUGINFOD_URLS. The default file +is under the system configuration directory (usually \fB/etc/debuginfod_urls\fP). + .TP .B DEBUGINFOD_TIMEOUT This environment variable governs the timeout for each debuginfod HTTP diff --git a/doc/debuginfod_find_debuginfo.3 b/doc/debuginfod_find_debuginfo.3 index 5ae44a9834be..2cee2ef1c9d9 100644 --- a/doc/debuginfod_find_debuginfo.3 +++ b/doc/debuginfod_find_debuginfo.3 @@ -248,6 +248,12 @@ proxy server could.) This environment variable contains a list of URL prefixes for trusted debuginfod instances. Alternate URL prefixes are separated by space. +.TP 21 +.B DEBUGINFOD_URLS_FILE +If $DEBUGINFOD_URLS is unset, the file named by this environment variable +is read, and its first line is used as $DEBUGINFOD_URLS. The default file +is under the system configuration directory (usually \fB/etc/debuginfod_urls\fP). + .TP 21 .B DEBUGINFOD_TIMEOUT This environment variable governs the timeout for each debuginfod HTTP diff --git a/tests/ChangeLog b/tests/ChangeLog index 0712417fa6cd..bc2016f40203 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,8 @@ +2021-04-29 Frank Ch. Eigler <f...@redhat.com> + + PR27783 + * run-debuginfod-find.sh: Add a $DEBUGINFOD_URLS_FILE test. + 2021-04-26 Frank Ch. Eigler <f...@redhat.com> PR27571 diff --git a/tests/run-debuginfod-find.sh b/tests/run-debuginfod-find.sh index 7ad2a45d3aac..9a217121b7e2 100755 --- a/tests/run-debuginfod-find.sh +++ b/tests/run-debuginfod-find.sh @@ -497,9 +497,17 @@ testrun ${abs_top_builddir}/debuginfod/debuginfod-find debuginfo $BUILDID # test parallel queries in client export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache3 mkdir -p $DEBUGINFOD_CACHE_PATH -export DEBUGINFOD_URLS="BAD http://127.0.0.1:$PORT1 127.0.0.1:$PORT1 http://127.0.0.1:$PORT2 DNE" -testrun ${abs_builddir}/debuginfod_build_id_find -e F/prog2 1 +# test URLs in file +urlfile=${PWD}/debuginfod_urls +tempfiles $urlfile +echo "BAD http://127.0.0.1:$PORT1 127.0.0.1:$PORT1 http://127.0.0.1:$PORT2 DNE" > $urlfile + +# NB: instead of this, use a nested env/stuff goo, avoid affecting valgrind itself +# hiding under testrun() from being affected by these settings. +#unset DEBUGINFOD_URLS +#export DEBUGINFOD_URLS_FILE=$urlfile +testrun env -u DEBUGINFOD_URLS env DEBUGINFOD_URLS_FILE=$urlfile ${abs_builddir}/debuginfod_build_id_find -e F/prog2 1 ######################################################################## @@ -615,7 +623,7 @@ local_dir=${PWD}/mocktree/buildid/aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd/sourc mkdir -p ${local_dir} echo "int main() { return 0; }" > ${local_dir}/main.c -# first test that is doesn't work, when no DEBUGINFOD_URLS is set +# first test that is doesn't work, when DEBUGINFOD_URLS is empty DEBUGINFOD_URLS="" testrun ${abs_top_builddir}/debuginfod/debuginfod-find source aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd /my/path/main.c && false || true