- automatically detect interface name from program name
- fix config output - set resolution to 5 seconds - fork program with "acquire" as first parameter - implement "fetch()"
This commit is contained in:
parent
63a4e521cd
commit
45cd9e8de3
86
ifstatd.c
86
ifstatd.c
@ -62,7 +62,8 @@ struct iftot {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Globals
|
// Globals
|
||||||
char *interface="bge1";
|
char *program_name = "ifstatd_";
|
||||||
|
char *interface="em0";
|
||||||
char* pid_filename;
|
char* pid_filename;
|
||||||
char* cache_filename;
|
char* cache_filename;
|
||||||
|
|
||||||
@ -110,23 +111,23 @@ fill_iftot(struct iftot *st)
|
|||||||
int config(char *iface)
|
int config(char *iface)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
"graph_order rbytes obytes"
|
"graph_order rbytes obytes\n"
|
||||||
"graph_title %s Interface (HighRes)\n"
|
"graph_title %s Interface (HighRes)\n"
|
||||||
"graph_category network::10sec\n"
|
"graph_category network\n"
|
||||||
"graph_vlabel bits per second\n"
|
"graph_vlabel bits per second\n"
|
||||||
"update_rate 10\n"
|
"update_rate 5\n"
|
||||||
"graph_data_size custom 1d, 10s for 1w, 1m for 1t, 5m for 1y\n"
|
"graph_data_size custom 1d, 5s for 1w, 1m for 1t, 5m for 1y\n"
|
||||||
"rbytes.label received"
|
"rbytes.label received\n"
|
||||||
"rbytes.type DERIVE"
|
"rbytes.type DERIVE\n"
|
||||||
"rbytes.graph no"
|
"rbytes.graph no\n"
|
||||||
"rbytes.cdef rbytes,8,*"
|
"rbytes.cdef rbytes,8,*\n"
|
||||||
"rbytes.min 0"
|
"rbytes.min 0\n"
|
||||||
"obytes.label bps"
|
"obytes.label bps\n"
|
||||||
"obytes.type DERIVE"
|
"obytes.type DERIVE\n"
|
||||||
"obytes.negative rbytes"
|
"obytes.negative rbytes\n"
|
||||||
"obytes.cdef obytes,8,*"
|
"obytes.cdef obytes,8,*\n"
|
||||||
"obytes.min 0"
|
"obytes.min 0\n"
|
||||||
"obytes.draw AREA"
|
"obytes.draw AREA\n"
|
||||||
,iface
|
,iface
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -159,19 +160,19 @@ int acquire()
|
|||||||
tot = &ift;
|
tot = &ift;
|
||||||
|
|
||||||
/* fork ourselves if not asked otherwise */
|
/* fork ourselves if not asked otherwise */
|
||||||
// char* no_fork = getenv("no_fork");
|
char* no_fork = getenv("no_fork");
|
||||||
// if (! no_fork || strcmp("1", no_fork)) {
|
if (! no_fork || strcmp("1", no_fork)) {
|
||||||
// if (fork()) return(0);
|
if (fork()) return(0);
|
||||||
/* we are the child, complete the daemonization */
|
/* we are the child, complete the daemonization */
|
||||||
|
|
||||||
/* Close standard IO */
|
/* Close standard IO */
|
||||||
// fclose(stdin);
|
fclose(stdin);
|
||||||
// fclose(stdout);
|
fclose(stdout);
|
||||||
// fclose(stderr);
|
fclose(stderr);
|
||||||
|
|
||||||
/* create new session and process group */
|
/* create new session and process group */
|
||||||
// setsid();
|
setsid();
|
||||||
// }
|
}
|
||||||
|
|
||||||
/* persist pid */
|
/* persist pid */
|
||||||
FILE* pid_file = fopen(pid_filename, "w");
|
FILE* pid_file = fopen(pid_filename, "w");
|
||||||
@ -181,11 +182,11 @@ int acquire()
|
|||||||
FILE* cache_file = fopen(cache_filename, "a");
|
FILE* cache_file = fopen(cache_filename, "a");
|
||||||
|
|
||||||
|
|
||||||
/* looping to collect traffic stat every 10 seconds */
|
/* looping to collect traffic stat every 5 seconds */
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
|
|
||||||
epoch=wait_for(10);
|
epoch=wait_for(5);
|
||||||
|
|
||||||
flock(fileno(cache_file), LOCK_EX);
|
flock(fileno(cache_file), LOCK_EX);
|
||||||
|
|
||||||
@ -203,6 +204,19 @@ int acquire()
|
|||||||
int fetch()
|
int fetch()
|
||||||
{
|
{
|
||||||
/* this should return data from cache file */
|
/* this should return data from cache file */
|
||||||
|
FILE* cache_file = fopen(cache_filename, "r+");
|
||||||
|
|
||||||
|
/* lock */
|
||||||
|
flock(fileno(cache_file), LOCK_EX);
|
||||||
|
|
||||||
|
/* cat the cache_file to stdout */
|
||||||
|
char buffer[1024];
|
||||||
|
while (fgets(buffer, 1024, cache_file)) {
|
||||||
|
printf("%s", buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
ftruncate(fileno(cache_file), 0);
|
||||||
|
fclose(cache_file);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
@ -210,6 +224,26 @@ int fetch()
|
|||||||
int
|
int
|
||||||
main(int argc, char* argv[])
|
main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
if (argv[0] && argv[0][0])
|
||||||
|
program_name = argv[0];
|
||||||
|
|
||||||
|
/* figure out program name */
|
||||||
|
while (strchr(program_name, '/')) {
|
||||||
|
program_name=strchr(program_name, '/')+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* extract interface name from plugin name */
|
||||||
|
if (strchr(program_name,'_')) {
|
||||||
|
interface=strchr(program_name,'_')+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* program should always run with a valid
|
||||||
|
executable name */
|
||||||
|
if (! interface) {
|
||||||
|
printf("please run from symlink\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
/* resolve paths */
|
/* resolve paths */
|
||||||
char *MUNIN_PLUGSTATE = getenv("MUNIN_PLUGSTATE");
|
char *MUNIN_PLUGSTATE = getenv("MUNIN_PLUGSTATE");
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user