Compare commits

...
25 Commits
Author SHA1 Message Date
Patrick McCarty 8c65e96479 Bump version for release
This release fixes some compiler warnings and the distcheck target, and
addresses a recurrent 404 issue by avoiding a download attempt for
".tar" from the root debuginfo directory.
2015-09-29 12:32:23 -07:00
Patrick McCarty 7ea9a50b19 Avoid attempt to download {lib,src}/debug
The associated cache directories in /var/cache/debuginfo/{lib,src}
already exist, and the tar for / is not created on the server, so avoid
downloading it altogether.
2015-09-29 12:25:13 -07:00
Patrick McCarty e16ab76926 Refresh version in configure.ac
The configure.ac version was falling behind the tagged version...
2015-09-28 14:02:03 -07:00
Patrick McCarty 090cb27a34 Fix distcheck target
Adding two --with-* configure options for the systemd pkgconfig-defined
variables gives opportunity for distcheck to succeed; the variables use
hardcoded paths to /usr/lib/systemd/... without a PREFIX, so the paths
need to be relocated to $dc_install_base, a variable distcheck uses for
the normal variables that begin with PREFIX.
2015-09-28 13:52:24 -07:00
Patrick McCarty cbaf943fca Convert server to use modern Glib Thread API
Using a GStaticMutex and associated functions are deprecated, since
a GMutex can be statically allocated now (as of glib 2.32).
2015-09-25 14:20:22 -07:00
Patrick McCarty 32ae400e7d Update gitignore 2015-09-25 14:19:56 -07:00
Patrick McCarty 82f03f8e22 Fix build warning for implicitly included header 2015-09-25 14:00:33 -07:00
Arjan van de Ven c1f45d9f3c https 2015-07-20 23:02:09 -04:00
Arjan van de Ven bcff8fae39 default to the other server for now 2015-04-24 17:55:53 -04:00
Arjan van de Ven 66bab25bcd implement multi-url setup 2015-03-23 14:45:00 -04:00
Arjan van de Ven 49ac392f01 move logging up 2015-03-23 14:37:26 -04:00
Arjan van de Ven 71f4e789c4 better logging 2015-03-23 14:17:30 -04:00
Arjan van de Ven f776162882 few more checks 2015-03-23 14:15:42 -04:00
Arjan van de Ven a2abd8d2a9 put memory optimizations back 2015-03-23 14:12:31 -04:00
Arjan van de Ven 8844b0b0e1 Revert "Wait with curl init until the first connection comes in"
This reverts commit 6fb3c6f193.
2015-03-05 18:00:06 -05:00
Arjan van de Ven ca63e1be25 Wait with curl init until the first connection comes in
this should save a bunch of memory for the common case
2015-02-16 18:12:45 -05:00
Dimitri John Ledkov 078e9987d5 clr-debug-info: Use well known install paths.
systemd pkgconfig module is already required, which will have system
paths defined as pkg-config variables. This simplifies autofoo, and
installs tmpfile.d into a system location under /usr, rather than
admin location under /etc.
2015-02-02 10:30:49 +00:00
Arjan van de Ven 97431314b5 use the non-staging URL 2015-01-31 13:48:44 -05:00
Arjan van de Ven 07e1f033e1 version 11 2014-12-26 11:28:04 -05:00
Arjan van de Ven 45f22398ca don't "system" unless it's really really needed 2014-12-26 11:26:36 -05:00
Arjan van de Ven b538b457ce one more typo 2014-12-26 10:48:24 -05:00
Arjan van de Ven 09affa9bf5 make systemd not complain 2014-12-26 10:32:42 -05:00
Arjan van de Ven 2a217476f7 move the cache dir to /var/cache
for proper stateless operation
2014-12-26 10:32:05 -05:00
Arjan van de Ven 4d6639148f release 8 2014-12-25 19:29:02 -05:00
Arjan van de Ven 83509e34c7 XFS does nto support DT_DIR 2014-12-26 00:15:36 -05:00
8 changed files with 91 additions and 48 deletions
+2
View File
@@ -4,10 +4,12 @@ clr_debug_fuse
clr_debug_daemon
clr_debug_prepare
.deps/
.dirstamp
Makefile
Makefile.in
aclocal.m4
autom4te.cache/
compile
config.h
config.h.in
config.log
+6 -5
View File
@@ -1,5 +1,9 @@
EXTRA_DIST = COPYING clr_debug_fuse.service clr_debug_daemon.service debuginfo.conf
DISTCHECK_CONFIGURE_FLAGS = \
--with-systemdsystemunitdir=$$dc_install_base/$(systemdsystemunitdir) \
--with-systemdtmpfilesdir=$$dc_install_base/$(tmpfilesdir)
bin_PROGRAMS = clr_debug_fuse clr_debug_daemon clr_debug_prepare
clr_debug_fuse_SOURCES = src/fuse.c src/client.c
@@ -14,9 +18,6 @@ clr_debug_fuse_LDADD = ${fuse_LIBS} $(glib_LIBS)
clr_debug_daemon_LDADD = $(glib_LIBS) ${curl_LIBS}
clr_debug_prepare_LDADD = $(glib_LIBS)
systemdsystemunit_DATA = clr_debug_fuse.service clr_debug_daemon.service
systemdunitdir = @SYSTEMD_UNITDIR@
systemdunit_DATA = clr_debug_fuse.service clr_debug_daemon.service
tmpwatchdir = /etc/tmpfiles.d
tmpwatch_DATA = debuginfo.conf
tmpfiles_DATA = debuginfo.conf
-1
View File
@@ -4,7 +4,6 @@ Description=Clear Linux debuginfo daemon
[Service]
Type=simple
ExecStart=/usr/bin/clr_debug_daemon
ExecStopPost=umount /run/user/0/debug-lib ; umount /run/user/0/debug-src
[Install]
WantedBy=multi-user.target
+15 -10
View File
@@ -2,8 +2,8 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.66])
AC_INIT(clr-debug-info, 7, arjan@linux.intel.com)
AM_INIT_AUTOMAKE([foreign -Wall -W])
AC_INIT(clr-debug-info, 21, arjan@linux.intel.com)
AM_INIT_AUTOMAKE([foreign -Wall -W subdir-objects])
AM_SILENT_RULES([yes])
AC_PROG_CC
AC_LANG(C)
@@ -13,14 +13,19 @@ PKG_CHECK_MODULES([curl], [libcurl])
PKG_CHECK_MODULES([fuse], [fuse])
PKG_CHECK_MODULES([SYSTEMD], [systemd])
AC_ARG_WITH([systemdunitdir], AC_HELP_STRING([--with-systemdunitdir=DIR],
[path to systemd service directory]), [path_systemdunit=${withval}],
[path_systemdunit="`$PKG_CONFIG --variable=systemdsystemunitdir systemd`"])
if (test -n "${path_systemdunit}"); then
SYSTEMD_UNITDIR="${path_systemdunit}"
AC_SUBST(SYSTEMD_UNITDIR)
AM_CONDITIONAL(SYSTEMD, test -n "${path_systemdunit}")
fi
dir=""
AC_ARG_WITH([systemdsystemunitdir], AS_HELP_STRING([--with-systemdsystemunitdir=DIR],
[path to systemd system service dir @<:@default=/usr/lib/systemd/system@:>@]), [dir=${withval}],
[dir="$($PKG_CONFIG --variable=systemdsystemunitdir systemd)"])
test -z "${dir}" && dir=/usr/lib/systemd/system
AC_SUBST(systemdsystemunitdir, [${dir}])
dir=""
AC_ARG_WITH([systemdtmpfilesdir], AS_HELP_STRING([--with-systemdtmpfilesdir=DIR],
[path to systemd tmpfiles dir @<:@default=/usr/lib/tmpfiles.d@:>@]), [dir=${withval}],
[dir="$($PKG_CONFIG --variable=tmpfilesdir systemd)"])
test -z "${dir}" && dir=/usr/lib/tmpfiles.d
AC_SUBST(tmpfilesdir, [${dir}])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
+2 -2
View File
@@ -8,5 +8,5 @@
# See tmpfiles.d(5) for details
# Clear tmp directories separately, to make them easier to override
d /usr/lib/.debug 755 root root 10d
d /usr/src/.debug 755 root root 1d
d /var/cache/debuginfo/lib 755 root root 10d
d /var/cache/debuginfo/src 755 root root 1d
+12 -5
View File
@@ -34,6 +34,7 @@ Original copyright notice follows:
#include <malloc.h>
#include <fuse.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
@@ -608,18 +609,24 @@ int main(int argc, char *argv[])
{
char * fake_argv[20];
char *dir = "/usr/src/debug";
char *shadowdir = "/usr/src/.debug";
char *shadowdir = "/var/cache/debuginfo/src";
umask(0);
/* give the system some time to boot before we go active; this is a background task */
sleep(1);
system("modprobe fuse");
if (access("/sys/module/fuse/", F_OK))
system("modprobe fuse");
signal(SIGPIPE,SIG_IGN);
system("mkdir -p /usr/lib/.debug &> /dev/null");
system("mkdir -p /usr/src/.debug &> /dev/null");
if (access("/var/cache/debuginfo/lib/", F_OK))
system("mkdir -p /var/cache/debuginfo/lib &> /dev/null");
if (access("/var/cache/debuginfo/src/", F_OK))
system("mkdir -p /var/cache/debuginfo/src &> /dev/null");
if (fork() == 0) {
dir = "/usr/lib/debug";
shadowdir = "/usr/lib/.debug";
shadowdir = "/var/cache/debuginfo/lib";
prefix = "lib";
}
+13 -11
View File
@@ -161,10 +161,11 @@ out:
static void recurse_dir(char *base1, char *base2, char *path)
{
DIR *dir;
char *fullpath1, *newpath;
char *fullpath1, *fullpath2, *newpath;
struct dirent *entry;
fullpath1 = NULL;
fullpath2 = NULL;
if (asprintf(&fullpath1, "%s%s", base1, path) < 0)
@@ -184,20 +185,21 @@ static void recurse_dir(char *base1, char *base2, char *path)
continue;
if (strcmp(entry->d_name, "..") == 0)
continue;
if (entry->d_type == DT_DIR) {
newpath = NULL;
if (asprintf(&newpath, "%s/%s", path, entry->d_name) >= 0) {
newpath = NULL;
fullpath2 = NULL;
asprintf(&fullpath2, "%s/%s", fullpath1, entry->d_name);
if (asprintf(&newpath, "%s/%s", path, entry->d_name) >= 0) {
struct stat sb;
stat(fullpath2, &sb);
if (entry->d_type == DT_DIR || S_ISDIR(sb.st_mode)) {
do_one_file(base1, base2, newpath, 1);
recurse_dir(base1, base2, newpath);
free(newpath);
}
} else {
newpath = NULL;
if (asprintf(&newpath, "%s/%s", path, entry->d_name) >= 0) {
} else {
do_one_file(base1, base2, newpath, 0);
free(newpath);
}
free(newpath);
}
}
closedir(dir);
+41 -14
View File
@@ -36,11 +36,15 @@
#include <string.h>
#include <pthread.h>
#include <sys/stat.h>
#include <malloc.h>
#include <curl/curl.h>
#include <glib.h>
GStaticMutex dupes_mutex = G_STATIC_MUTEX_INIT;
static GMutex dupes_mutex;
char *urls[2] = {"https://debuginfo.clearlinux.org/debuginfo/", "http://debuginfo.fenrus.org/debuginfo/" };
int urlcounter = 1;
static GHashTable *hash;
@@ -49,7 +53,7 @@ static int avoid_dupes(const char *url)
{
int retval = 0;
void *value;
g_static_mutex_lock(&dupes_mutex);
g_mutex_lock(&dupes_mutex);
if (hash == NULL)
hash = g_hash_table_new(g_str_hash, g_str_equal);
@@ -67,7 +71,7 @@ static int avoid_dupes(const char *url)
g_hash_table_replace(hash, strdup(url), data);
}
g_static_mutex_unlock(&dupes_mutex);
g_mutex_unlock(&dupes_mutex);
return retval;
}
@@ -118,13 +122,16 @@ static int curl_get_file(const char *url, const char *prefix, time_t timestamp)
fflush(file);
// printf("HTTP return code is %i\n", ret);
if (ret != 200 && ret != 404)
urlcounter++;
if (ret == 200) {
char *command = NULL;
// printf("Filename is %s\n", filename);
memset(&statbuf, 0, sizeof(statbuf));
stat(filename, &statbuf);
if (statbuf.st_size > 0 && asprintf(&command, "tar -C /usr/%s/.debug --no-same-owner -xf %s", prefix, filename) >= 0) {
if (statbuf.st_size > 0 && asprintf(&command, "tar -C /var/cache/debuginfo/%s --no-same-owner -xf %s", prefix, filename) >= 0) {
system(command);
free(command);
}
@@ -184,8 +191,16 @@ static void *server_thread(void *arg)
*path = 0;
path++;
/* GDB and elfutils both stat /usr/lib/debug directly when looking up
* debuginfo, so avoid the download for "/.tar"; the associated cache
* directories already exist by this point.
*/
if (strlen(path) == 1 && strcmp(path, "/") == 0) {
close(fd);
return NULL;
}
if (strstr(path, "..") || strstr(prefix, "..")) {
if (strstr(path, "..") || strstr(prefix, "..") || strstr(path, "'") || strstr(path, ";")) {
close(fd);
return NULL;
}
@@ -196,7 +211,7 @@ static void *server_thread(void *arg)
return NULL;
}
url = NULL;
if (asprintf(&url, "http://localhost/debuginfo/%s%s.tar", prefix, path) < 0) {
if (asprintf(&url, "%s%s%s.tar", urls[urlcounter % 2], prefix, path) < 0) {
close(fd);
return NULL;
}
@@ -204,14 +219,19 @@ static void *server_thread(void *arg)
// printf("Getting url %s %i:%06i\n", url, before.tv_sec, before.tv_usec);
ret = curl_get_file(url, prefix, timestamp);
/* tell the other side we're done with the download */
write(fd, "ok", 3);
close(fd);
if (ret != 200)
printf("Request for %s resulted in error %i\n", url, ret);
gettimeofday(&after, NULL);
if (timedelta(before, after) > 0.6)
printf("Request for %s took %5.2f seconds (%i - %i)\n", url,
after.tv_sec - before.tv_sec + (1.0*after.tv_usec - before.tv_usec) / 1000000.0, ret, (int)timestamp);
/* tell the other side we're done with the download */
write(fd, "ok", 3);
close(fd);
free(url);
return NULL;
}
@@ -222,18 +242,19 @@ int main(int argc, char **argv)
int sockfd;
struct sockaddr_un sun;
int ret;
int curl_done = 0;
if (argc < -1)
(void)argv;
curl_global_init(CURL_GLOBAL_ALL);
signal(SIGPIPE,SIG_IGN);
system("mkdir -p /usr/lib/.debug &> /dev/null");
system("mkdir -p /usr/src/.debug &> /dev/null");
if (access("/var/cache/debuginfo/lib/", F_OK))
system("mkdir -p /var/cache/debuginfo/lib/ &> /dev/null");
if (access("/var/cache/debuginfo/src/", F_OK))
system("mkdir -p /var/cache/debuginfo/src/ &> /dev/null");
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sockfd < 0)
return EXIT_FAILURE;
@@ -258,8 +279,14 @@ int main(int argc, char **argv)
int clientsock;
pthread_t thread;
malloc_trim(0);
clientsock = accept(sockfd, NULL, NULL);
if (!curl_done) {
curl_global_init(CURL_GLOBAL_ALL);
curl_done = 1;
}
pthread_create(&thread, NULL, server_thread, (void *)(unsigned long)clientsock);
pthread_detach(thread);
}