gluon-debug: add new package to debug process runtime
This commit is contained in:
parent
37cdea9733
commit
3e4d6fe863
29
package/gluon-debug/Makefile
Normal file
29
package/gluon-debug/Makefile
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
PKG_NAME:=gluon-debug
|
||||||
|
PKG_VERSION:=1
|
||||||
|
|
||||||
|
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||||
|
|
||||||
|
include $(GLUONDIR)/include/package.mk
|
||||||
|
|
||||||
|
|
||||||
|
define Package/gluon-debug
|
||||||
|
SECTION:=gluon
|
||||||
|
CATEGORY:=Gluon
|
||||||
|
TITLE:=Provides process runtime information to the network
|
||||||
|
DEPENDS:=+libgluonutil +respondd
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Prepare
|
||||||
|
mkdir -p $(PKG_BUILD_DIR)
|
||||||
|
$(CP) ./src/* $(PKG_BUILD_DIR)/
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/gluon-debug/install
|
||||||
|
$(CP) ./files/* $(1)/
|
||||||
|
$(INSTALL_DIR) $(1)/lib/gluon/respondd
|
||||||
|
$(CP) $(PKG_BUILD_DIR)/respondd.so $(1)/lib/gluon/respondd/debug.so
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call BuildPackage,gluon-debug))
|
1
package/gluon-debug/files/lib/gluon/respondd/proc.cache
Normal file
1
package/gluon-debug/files/lib/gluon/respondd/proc.cache
Normal file
@ -0,0 +1 @@
|
|||||||
|
10000
|
6
package/gluon-debug/src/Makefile
Normal file
6
package/gluon-debug/src/Makefile
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
all: respondd.so
|
||||||
|
|
||||||
|
CFLAGS += -Wall
|
||||||
|
|
||||||
|
respondd.so: respondd.c
|
||||||
|
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -shared -fPIC -D_GNU_SOURCE -o $@ $^ $(LDLIBS) -lgluonutil
|
101
package/gluon-debug/src/respondd.c
Normal file
101
package/gluon-debug/src/respondd.c
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2016, Leonardo Mörlein <git@irrelefant.net>
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <respondd.h>
|
||||||
|
#include <glob.h>
|
||||||
|
#include "json-c/json.h"
|
||||||
|
#include <libgluonutil.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <sys/vfs.h>
|
||||||
|
|
||||||
|
static struct json_object * respondd_provider_statistics(void) {
|
||||||
|
struct json_object *proc = json_object_new_object();
|
||||||
|
|
||||||
|
glob_t globbuf;
|
||||||
|
int ret = glob("/proc/[0-9]*/stat", 0, NULL, &globbuf);
|
||||||
|
if (ret != 0)
|
||||||
|
// we don't really care about the reason and simply return {}
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
for(int i=0; i < globbuf.gl_pathc; i++) {
|
||||||
|
FILE* f = fopen(globbuf.gl_pathv[i], "r");
|
||||||
|
if (!f)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int pid = 0;
|
||||||
|
unsigned long utime = 0;
|
||||||
|
unsigned long stime = 0;
|
||||||
|
long cutime = 0;
|
||||||
|
long cstime = 0;
|
||||||
|
|
||||||
|
char name[64];
|
||||||
|
|
||||||
|
int cnt = fscanf(f, "%d %63s "
|
||||||
|
"%*c "
|
||||||
|
"%*d %*d %*d %*d %*d "
|
||||||
|
"%*u %*u %*u %*u %*u "
|
||||||
|
"%lu %lu %ld %ld",
|
||||||
|
&pid, name, &utime, &stime, &cutime, &cstime);
|
||||||
|
if (cnt != 6)
|
||||||
|
goto next;
|
||||||
|
|
||||||
|
struct json_object *process = json_object_new_object();
|
||||||
|
|
||||||
|
json_object_object_add(process, "n", gluonutil_wrap_string(name));
|
||||||
|
json_object_object_add(process, "u", json_object_new_int(utime));
|
||||||
|
json_object_object_add(process, "s", json_object_new_int(stime));
|
||||||
|
json_object_object_add(process, "cu", json_object_new_int(cutime));
|
||||||
|
json_object_object_add(process, "cs", json_object_new_int(cstime));
|
||||||
|
|
||||||
|
char pidstr[8];
|
||||||
|
snprintf(pidstr, 7, "%d", pid);
|
||||||
|
json_object_object_add(proc, pidstr, process);
|
||||||
|
|
||||||
|
next:
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
// Normally this should fit in 1280 bytes (compressed).
|
||||||
|
// - Otherwise it will be fragmented.
|
||||||
|
if(i>80)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
globfree(&globbuf);
|
||||||
|
return proc;
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct respondd_provider_info respondd_providers[] = {
|
||||||
|
{"proc", respondd_provider_statistics},
|
||||||
|
{}
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user