mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-11-17 18:45:10 +00:00
make default gateway information accessible
* gw_iface prints the interface having a default gateway * gw_ip prints the gatway's ip * if_gw jumps if no default gateway exists * when there are multiple gateways, gw_iface and gw_ip only print "multiple" when they are different (allows basic debugging of ones networking setup) git-svn-id: https://conky.svn.sourceforge.net/svnroot/conky/trunk/conky1@1031 7f574dfc-610e-0410-a909-a81674777703
This commit is contained in:
parent
1fa2c2f809
commit
8fd27c0026
12
doc/conky.1
12
doc/conky.1
@ -756,6 +756,14 @@ File system used space
|
|||||||
\fB\*(T<\fBgoto\fR\*(T>\fR \*(T<\fBx\fR\*(T>
|
\fB\*(T<\fBgoto\fR\*(T>\fR \*(T<\fBx\fR\*(T>
|
||||||
The next element will be printed at position 'x'.
|
The next element will be printed at position 'x'.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
\fB\*(T<\fBgw_iface\fR\*(T>\fR
|
||||||
|
Displays the default route's interface or "multiple"/"none" accordingly.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
\fB\*(T<\fBgw_ip\fR\*(T>\fR
|
||||||
|
Displays the default gateway's IP or "multiple"/"none" accordingly.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
\fB\*(T<\fBhddtemp\fR\*(T>\fR \*(T<\fBdev, (host,(port))\fR\*(T>
|
\fB\*(T<\fBhddtemp\fR\*(T>\fR \*(T<\fBdev, (host,(port))\fR\*(T>
|
||||||
Displays temperature of a selected hard disk drive as reported by the hddtemp daemon running on host:port.
|
Displays temperature of a selected hard disk drive as reported by the hddtemp daemon running on host:port.
|
||||||
@ -861,6 +869,10 @@ if PROCESS is running, display everything $if_running and the matching $endif
|
|||||||
\fB\*(T<\fBif_existing\fR\*(T>\fR \*(T<\fBfile (string)\fR\*(T>
|
\fB\*(T<\fBif_existing\fR\*(T>\fR \*(T<\fBfile (string)\fR\*(T>
|
||||||
if FILE exists, display everything between if_existing and the matching $endif. The optional second paramater checks for FILE containing the specified string and prints everything between $if_existing and the matching $endif.
|
if FILE exists, display everything between if_existing and the matching $endif. The optional second paramater checks for FILE containing the specified string and prints everything between $if_existing and the matching $endif.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
\fB\*(T<\fBif_gw\fR\*(T>\fR
|
||||||
|
if at least one default gateway exists, display everything between $if_gw and the matching $endif
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
\fB\*(T<\fBif_mounted\fR\*(T>\fR \*(T<\fB(mountpoint)\fR\*(T>
|
\fB\*(T<\fBif_mounted\fR\*(T>\fR \*(T<\fB(mountpoint)\fR\*(T>
|
||||||
if MOUNTPOINT is mounted, display everything between $if_mounted and the matching $endif
|
if MOUNTPOINT is mounted, display everything between $if_mounted and the matching $endif
|
||||||
|
@ -839,6 +839,24 @@
|
|||||||
<para></para></listitem>
|
<para></para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term>
|
||||||
|
<command><option>gw_iface</option></command>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
Displays the default route's interface or "multiple"/"none" accordingly.
|
||||||
|
<para></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term>
|
||||||
|
<command><option>gw_ip</option></command>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
Displays the default gateway's IP or "multiple"/"none" accordingly.
|
||||||
|
<para></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>
|
<term>
|
||||||
<command><option>hddtemp</option></command>
|
<command><option>hddtemp</option></command>
|
||||||
@ -1071,6 +1089,15 @@
|
|||||||
<para></para></listitem>
|
<para></para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term>
|
||||||
|
<command><option>if_gw</option></command>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
if there is at least one default gateway, display everything between $if_gw and the matching $endif
|
||||||
|
<para></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>
|
<term>
|
||||||
<command><option>if_running</option></command>
|
<command><option>if_running</option></command>
|
||||||
|
@ -311,6 +311,9 @@ void update_stuff()
|
|||||||
if (NEED(INFO_USERS)) {
|
if (NEED(INFO_USERS)) {
|
||||||
update_users();
|
update_users();
|
||||||
}
|
}
|
||||||
|
if (NEED(INFO_GW)) {
|
||||||
|
update_gateway_info();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int round_to_int(float f)
|
int round_to_int(float f)
|
||||||
|
41
src/conky.c
41
src/conky.c
@ -1144,6 +1144,9 @@ enum text_object_type {
|
|||||||
OBJ_ibm_volume,
|
OBJ_ibm_volume,
|
||||||
OBJ_ibm_brightness,
|
OBJ_ibm_brightness,
|
||||||
OBJ_if_up,
|
OBJ_if_up,
|
||||||
|
OBJ_if_gw,
|
||||||
|
OBJ_gw_iface,
|
||||||
|
OBJ_gw_ip,
|
||||||
OBJ_pb_battery,
|
OBJ_pb_battery,
|
||||||
OBJ_voltage_mv,
|
OBJ_voltage_mv,
|
||||||
OBJ_voltage_v,
|
OBJ_voltage_v,
|
||||||
@ -2047,6 +2050,20 @@ static void free_text_objects(unsigned int count, struct text_object *objs)
|
|||||||
free(objs[i].data.ifblock.s);
|
free(objs[i].data.ifblock.s);
|
||||||
free(objs[i].data.ifblock.str);
|
free(objs[i].data.ifblock.str);
|
||||||
break;
|
break;
|
||||||
|
case OBJ_if_gw:
|
||||||
|
free(objs[i].data.ifblock.s);
|
||||||
|
free(objs[i].data.ifblock.str);
|
||||||
|
case OBJ_gw_iface:
|
||||||
|
case OBJ_gw_ip:
|
||||||
|
if (info.gw_info.iface) {
|
||||||
|
free(info.gw_info.iface);
|
||||||
|
info.gw_info.iface = 0;
|
||||||
|
}
|
||||||
|
if (info.gw_info.ip) {
|
||||||
|
free(info.gw_info.ip);
|
||||||
|
info.gw_info.ip = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef XMMS2
|
#ifdef XMMS2
|
||||||
case OBJ_xmms2_artist:
|
case OBJ_xmms2_artist:
|
||||||
@ -2452,6 +2469,13 @@ static struct text_object *construct_text_object(const char *s,
|
|||||||
blockstart[blockdepth] = object_count;
|
blockstart[blockdepth] = object_count;
|
||||||
obj->data.ifblock.pos = object_count + 2;
|
obj->data.ifblock.pos = object_count + 2;
|
||||||
blockdepth++;
|
blockdepth++;
|
||||||
|
END OBJ(if_gw, 0)
|
||||||
|
if (blockdepth >= MAX_IF_BLOCK_DEPTH) {
|
||||||
|
CRIT_ERR("MAX_IF_BLOCK_DEPTH exceeded");
|
||||||
|
}
|
||||||
|
blockstart[blockdepth] = object_count;
|
||||||
|
obj->data.ifblock.pos = object_count + 2;
|
||||||
|
blockdepth++;
|
||||||
END OBJ(pb_battery, 0)
|
END OBJ(pb_battery, 0)
|
||||||
if (arg && strcmp(arg, "status") == 0) {
|
if (arg && strcmp(arg, "status") == 0) {
|
||||||
obj->data.i = PB_BATT_STATUS;
|
obj->data.i = PB_BATT_STATUS;
|
||||||
@ -3455,6 +3479,9 @@ static struct text_object *construct_text_object(const char *s,
|
|||||||
END OBJ(user_times, INFO_USERS)
|
END OBJ(user_times, INFO_USERS)
|
||||||
END OBJ(user_terms, INFO_USERS)
|
END OBJ(user_terms, INFO_USERS)
|
||||||
END OBJ(user_number, INFO_USERS)
|
END OBJ(user_number, INFO_USERS)
|
||||||
|
END OBJ(gw_iface, INFO_GW)
|
||||||
|
END OBJ(gw_ip, INFO_GW)
|
||||||
|
END OBJ(if_gw, INFO_GW)
|
||||||
#ifndef __OpenBSD__
|
#ifndef __OpenBSD__
|
||||||
END OBJ(adt746xcpu, 0)
|
END OBJ(adt746xcpu, 0)
|
||||||
END OBJ(adt746xfan, 0)
|
END OBJ(adt746xfan, 0)
|
||||||
@ -4387,6 +4414,20 @@ static void generate_text_internal(char *p, int p_max_size,
|
|||||||
if_jumped = 0;
|
if_jumped = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
OBJ(if_gw) {
|
||||||
|
if (!cur->gw_info.count) {
|
||||||
|
i = obj->data.ifblock.pos;
|
||||||
|
if_jumped = 1;
|
||||||
|
} else {
|
||||||
|
if_jumped = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OBJ(gw_iface) {
|
||||||
|
snprintf(p, p_max_size, "%s", cur->gw_info.iface);
|
||||||
|
}
|
||||||
|
OBJ(gw_ip) {
|
||||||
|
snprintf(p, p_max_size, "%s", cur->gw_info.ip);
|
||||||
|
}
|
||||||
OBJ(pb_battery) {
|
OBJ(pb_battery) {
|
||||||
get_powerbook_batt_info(p, p_max_size, obj->data.i);
|
get_powerbook_batt_info(p, p_max_size, obj->data.i);
|
||||||
}
|
}
|
||||||
|
10
src/conky.h
10
src/conky.h
@ -252,6 +252,12 @@ struct usr_info {
|
|||||||
int number;
|
int number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct gateway_info {
|
||||||
|
char *iface;
|
||||||
|
char *ip;
|
||||||
|
int count;
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef TCP_PORT_MONITOR
|
#ifdef TCP_PORT_MONITOR
|
||||||
#include "libtcp-portmon.h"
|
#include "libtcp-portmon.h"
|
||||||
#define MAX_PORT_MONITOR_CONNECTIONS_DEFAULT 256
|
#define MAX_PORT_MONITOR_CONNECTIONS_DEFAULT 256
|
||||||
@ -299,6 +305,7 @@ enum {
|
|||||||
INFO_SMAPI = 25,
|
INFO_SMAPI = 25,
|
||||||
#endif
|
#endif
|
||||||
INFO_USERS = 26,
|
INFO_USERS = 26,
|
||||||
|
INFO_GW = 27
|
||||||
};
|
};
|
||||||
|
|
||||||
/* get_battery_stuff() item selector */
|
/* get_battery_stuff() item selector */
|
||||||
@ -361,6 +368,7 @@ struct information {
|
|||||||
struct bmpx_s bmpx;
|
struct bmpx_s bmpx;
|
||||||
#endif
|
#endif
|
||||||
struct usr_info users;
|
struct usr_info users;
|
||||||
|
struct gateway_info gw_info;
|
||||||
struct process *cpu[10];
|
struct process *cpu[10];
|
||||||
struct process *memu[10];
|
struct process *memu[10];
|
||||||
struct process *first_process;
|
struct process *first_process;
|
||||||
@ -537,6 +545,8 @@ char get_voltage(char *, size_t, char *, int, unsigned int); /* ptarjan */
|
|||||||
void update_load_average();
|
void update_load_average();
|
||||||
int interface_up(const char *dev);
|
int interface_up(const char *dev);
|
||||||
|
|
||||||
|
void update_gateway_info(void);
|
||||||
|
|
||||||
int open_sysfs_sensor(const char *dir, const char *dev, const char *type, int n,
|
int open_sysfs_sensor(const char *dir, const char *dev, const char *type, int n,
|
||||||
int *div, char *devtype);
|
int *div, char *devtype);
|
||||||
|
|
||||||
|
58
src/linux.c
58
src/linux.c
@ -51,6 +51,8 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <linux/sockios.h>
|
#include <linux/sockios.h>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <linux/route.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#ifdef HAVE_IWLIB
|
#ifdef HAVE_IWLIB
|
||||||
@ -188,6 +190,62 @@ int interface_up(const char *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define COND_FREE(x) if(x) free(x); x = 0
|
||||||
|
#define SAVE_SET_STRING(x, y) \
|
||||||
|
if (x && strcmp((char *)x, (char *)y)) { \
|
||||||
|
free(x); \
|
||||||
|
x = strdup("multiple"); \
|
||||||
|
} else if (!x) { \
|
||||||
|
x = strdup(y); \
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_gateway_info()
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
struct in_addr ina;
|
||||||
|
char iface[64];
|
||||||
|
unsigned long dest, gate, mask;
|
||||||
|
unsigned int flags;
|
||||||
|
short ref, use, metric, mtu, win, irtt;
|
||||||
|
|
||||||
|
struct gateway_info *gw_info = &info.gw_info;
|
||||||
|
|
||||||
|
COND_FREE(gw_info->iface);
|
||||||
|
COND_FREE(gw_info->ip);
|
||||||
|
gw_info->count = 0;
|
||||||
|
|
||||||
|
if ((fp = fopen("/proc/net/route", "r")) == NULL) {
|
||||||
|
perror("fopen()");
|
||||||
|
goto FAIL;
|
||||||
|
}
|
||||||
|
if (fscanf(fp, "%*[^\n]\n") == EOF) {
|
||||||
|
perror("fscanf()");
|
||||||
|
goto CLOSE_FAIL;
|
||||||
|
}
|
||||||
|
while (!feof(fp)) {
|
||||||
|
// Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT
|
||||||
|
if(fscanf(fp, "%63s %lx %lx %x %hd %hd %hd %lx %hd %hd %hd\n",
|
||||||
|
iface, &dest, &gate, &flags, &ref, &use,
|
||||||
|
&metric, &mask, &mtu, &win, &irtt) != 11) {
|
||||||
|
perror("fscanf()");
|
||||||
|
goto CLOSE_FAIL;
|
||||||
|
}
|
||||||
|
if (flags & RTF_GATEWAY && dest == 0 && mask == 0) {
|
||||||
|
gw_info->count++;
|
||||||
|
SAVE_SET_STRING(gw_info->iface, iface)
|
||||||
|
ina.s_addr = gate;
|
||||||
|
SAVE_SET_STRING(gw_info->ip, inet_ntoa(ina))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
return;
|
||||||
|
CLOSE_FAIL:
|
||||||
|
fclose(fp);
|
||||||
|
FAIL:
|
||||||
|
info.gw_info.iface = info.gw_info.ip = strdup("failed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
inline void update_net_stats()
|
inline void update_net_stats()
|
||||||
{
|
{
|
||||||
FILE *net_dev_fp;
|
FILE *net_dev_fp;
|
||||||
|
Loading…
Reference in New Issue
Block a user