📄 monitor.c
字号:
{ "disk", update_disk, serve_disk_data, serve_disk_setup };static GkrellmdMonitor *init_disk_monitor(void) { if (gkrellm_sys_disk_init()) return &disk_monitor; return NULL; }/* ======================================================= */#include "../src/inet.h"typedef struct { ActiveTCP tcp; gboolean alive, new_connection; } InetData;static GList *inet_list, *inet_dead_list;static gboolean inet_unsupported, inet_new;voidgkrellm_inet_log_tcp_port_data(gpointer data) { GList *list; InetData *in; ActiveTCP *tcp, *active_tcp = NULL; gchar *ap, *aap; gint slen; tcp = (ActiveTCP *) data; for (list = inet_list; list; list = list->next) { in = (InetData *) list->data; active_tcp = &in->tcp; if (tcp->family == AF_INET) { ap = (char *)&tcp->remote_addr; aap = (char *)&active_tcp->remote_addr; slen = sizeof(struct in_addr); }#if defined(INET6) else if (tcp->family == AF_INET6) { ap = (char *)&tcp->remote_addr6; aap = (char *)&active_tcp->remote_addr6; slen = sizeof(struct in6_addr); }#endif else return; if ( memcmp(aap, ap, slen) == 0 && active_tcp->remote_port == tcp->remote_port && active_tcp->local_port == tcp->local_port ) { in->alive = TRUE; /* Old alive connection still alive */ return; } } inet_new = TRUE; in = g_new0(InetData, 1); in->tcp = *tcp; in->alive = TRUE; in->new_connection = TRUE; inet_list = g_list_append(inet_list, in); }static voidupdate_inet(GkrellmdMonitor *mon, gboolean first_update) { GList *list; InetData *in; static gint check_tcp; if (!first_update && !GK.second_tick) return; if (first_update || check_tcp == 0) { gkrellm_free_glist_and_data(&inet_dead_list); inet_new = FALSE; for (list = inet_list; list; list = list->next) { in = (InetData *) list->data; in->alive = FALSE; in->new_connection = FALSE; } gkrellm_sys_inet_read_tcp_data(); for (list = inet_list; list; ) { in = (InetData *) list->data; if (!in->alive) { if (list == inet_list) inet_list = inet_list->next; list = g_list_remove(list, in); inet_dead_list = g_list_append(inet_dead_list, in); } else list = list->next; } if (inet_new || inet_dead_list) gkrellmd_need_serve(mon); } check_tcp = (check_tcp + 1) % _GK.inet_interval; }static voidserve_inet_data(GkrellmdMonitor *mon, gboolean first_serve) { InetData *in; ActiveTCP *tcp; GList *list; gchar buf[128], *cp;#if defined(INET6) && defined(HAVE_GETADDRINFO) struct sockaddr_in6 sin6; char addrbuf[NI_MAXHOST];#endif if (inet_new || first_serve) { gkrellmd_set_serve_name(mon, "inet"); for (list = inet_list; list; list = list->next) { in = (InetData *) list->data; tcp = &in->tcp; if ( tcp->family == AF_INET && (in->new_connection || first_serve) ) { cp = inet_ntoa(tcp->remote_addr); sprintf(buf, "+0 %x %s:%x\n", tcp->local_port, cp, tcp->remote_port); }#if defined(INET6) && defined(HAVE_GETADDRINFO) else if (tcp->family == AF_INET6 && (in->new_connection || first_serve)) { memset(&sin6, 0, sizeof(sin6)); memcpy(&sin6.sin6_addr, &tcp->remote_addr6, sizeof(struct in6_addr)); sin6.sin6_family = AF_INET6;#ifdef SIN6_LEN sin6.sin6_len = sizeof(struct sockaddr_in6);#endif if (getnameinfo((struct sockaddr *)&sin6, sizeof(struct sockaddr_in6), addrbuf, sizeof(addrbuf), NULL, 0, NI_NUMERICHOST|NI_WITHSCOPEID) != 0) continue; snprintf(buf, sizeof(buf), "+6 %x [%s]:%x\n", tcp->local_port, addrbuf, tcp->remote_port); }#endif else continue; gkrellmd_serve_data(mon, buf); } } if (!first_serve) { gkrellmd_set_serve_name(mon, "inet"); for (list = inet_dead_list; list; list = list->next) { in = (InetData *) list->data; tcp = &in->tcp; if (tcp->family == AF_INET) { cp = inet_ntoa(tcp->remote_addr); sprintf(buf, "-0 %x %s:%x\n", tcp->local_port, cp, tcp->remote_port); }#if defined(INET6) && defined(HAVE_GETADDRINFO) else if (tcp->family == AF_INET6) { memset(&sin6, 0, sizeof(sin6)); memcpy(&sin6.sin6_addr, &tcp->remote_addr6, sizeof(struct in6_addr)); sin6.sin6_family = AF_INET6;#ifdef SIN6_LEN sin6.sin6_len = sizeof(struct sockaddr_in6);#endif if (getnameinfo((struct sockaddr *)&sin6, sizeof(struct sockaddr_in6), addrbuf, sizeof(addrbuf), NULL, 0, NI_NUMERICHOST|NI_WITHSCOPEID) != 0) continue; snprintf(buf, sizeof(buf), "-6 %x [%s]:%x\n", tcp->local_port, addrbuf, tcp->remote_port); }#endif else continue; gkrellmd_serve_data(mon, buf); } } }static voidserve_inet_setup(GkrellmdMonitor *mon) { GkrellmdClient *client = mon->privat->client; if (inet_unsupported) gkrellmd_send_to_client(client, "<inet_setup>\ninet_unsupported\n"); }static GkrellmdMonitor inet_monitor = { "inet", update_inet, serve_inet_data, serve_inet_setup };static GkrellmdMonitor *init_inet_monitor(void) { if (_GK.inet_interval > 0 && gkrellm_sys_inet_init()) return &inet_monitor; inet_unsupported = TRUE; return NULL; }/* ======================================================= */#define TIMER_TYPE_NONE 0#define TIMER_TYPE_PPP 1#define TIMER_TYPE_IPPP 2typedef struct { gchar *name; gboolean changed, up, up_prev, up_event, down_event; gboolean timed_changed; time_t up_time; gulong rx, tx; } NetData;static NetData *net_timer;static GList *net_list, *net_sys_list;static time_t net_timer0;static gint net_timer_type;static gboolean net_use_routed;gchar *gkrellm_net_mon_first(void) { gchar *name = NULL; net_sys_list = net_list; if (net_sys_list) { name = ((NetData *) (net_sys_list->data))->name; net_sys_list = net_sys_list->next; } return name; }gchar *gkrellm_net_mon_next(void) { gchar *name = NULL; if (net_sys_list) { name = ((NetData *) (net_sys_list->data))->name; net_sys_list = net_sys_list->next; } return name; }voidgkrellm_net_use_routed(gboolean real_routed /* not applicable in server */) { net_use_routed = TRUE; }static NetData *net_new(gchar *name) { NetData *net; net = g_new0(NetData, 1); net->name = g_strdup(name); net_list = g_list_append(net_list, net); if (net_timer_type != TIMER_TYPE_NONE && !strcmp(_GK.net_timer, net->name)) net_timer = net; return net; }voidgkrellm_net_assign_data(gchar *name, gulong rx, gulong tx) { GList *list; NetData *net; for (list = net_list; list; list = list->next) { net = (NetData *) list->data; if (!strcmp(net->name, name)) { if (net->rx != rx || net->tx != tx) net->changed = TRUE; else net->changed = FALSE; break; } } if (!list) net = net_new(name); if (GK.second_tick && !net_use_routed) net->up = TRUE; net->rx = rx; net->tx = tx; }voidgkrellm_net_routed_event(gchar *name, gboolean routed) { GList *list; NetData *net; for (list = net_list; list; list = list->next) { net = (NetData *) list->data; if (!strcmp(net->name, name)) break; } if (!list) net = net_new(name); if (routed) net->up_event = TRUE; else net->down_event = TRUE; net->up = routed; }voidgkrellm_net_add_timer_type_ppp(gchar *name) { if (!_GK.net_timer) return; if (name && !strncmp(_GK.net_timer, name, strlen(name) - 1)) net_timer_type = TIMER_TYPE_PPP; }voidgkrellm_net_add_timer_type_ippp(gchar *name) { if (!_GK.net_timer) return; if (name && !strncmp(_GK.net_timer, name, strlen(name) - 1)) net_timer_type = TIMER_TYPE_IPPP; }voidgkrellm_net_set_lock_directory(gchar *dir) { /* Not supported remotely */ }static voidupdate_net(GkrellmdMonitor *mon, gboolean first_update) { GList *list; NetData *net; gint up_time = 0; if (GK.second_tick) { if (!net_use_routed) { for (list = net_list; list; list = list->next) { net = (NetData *) list->data; net->up_prev = net->up; net->up = FALSE; } } else gkrellm_sys_net_check_routes(); } gkrellm_sys_net_read_data(); if (GK.second_tick && !net_use_routed) { for (list = net_list; list; list = list->next) { net = (NetData *) list->data; if (net->up && !net->up_prev) net->up_event = TRUE; else if (!net->up && net->up_prev) net->down_event = TRUE; } } if (net_timer && GK.second_tick) { if (net_timer_type == TIMER_TYPE_PPP) { struct stat st; gchar buf[256]; if (net_timer->up_event) { snprintf(buf, sizeof(buf), "/var/run/%s.pid", net_timer->name); if (stat(buf, &st) == 0) net_timer0 = st.st_mtime; else time(&net_timer0); } if (net_timer->up) up_time = (int) (time(0) - net_timer0); } else if (net_timer_type == TIMER_TYPE_IPPP) { /* get all isdn status from its connect state because the | net_timer->up can be UP even with isdn line not connected. | Can't get time history if gkrellmd started after connects. */ static gboolean old_connected; gboolean connected; connected = gkrellm_sys_net_isdn_online(); if (connected && !old_connected) time(&net_timer0); /* New session just started */ old_connected = connected; up_time = (int) (time(0) - net_timer0); } if (up_time != net_timer->up_time) net_timer->timed_changed = TRUE; net_timer->up_time = up_time; } gkrellmd_need_serve(mon); /* serve func checks for changed */ }static voidserve_net_data(GkrellmdMonitor *mon, gboolean first_serve) { NetData *net; GList *list; gchar buf[128]; gboolean fake_up_event; gkrellmd_set_serve_name(mon, "net"); for (list = net_list; list; list = list->next) { net = (NetData *) list->data; if (net->changed || first_serve) { sprintf(buf, "%s %lu %lu\n", net->name, net->rx, net->tx); gkrellmd_serve_data(mon, buf); } } /* Since the server transmits changes only, use the routed interface | to the client regardless if the sysdep code uses routed. */ if (GK.second_tick || first_serve) { gkrellmd_set_serve_name(mon, "net_routed"); for (list = net_list; list; list = list->next) { net = (NetData *) list->data; fake_up_event = (first_serve && net->up); if (net->up_event || net->down_event || fake_up_event) { sprintf(buf, "%s %d\n", net->name, fake_up_event ? TRUE : net->up_event); gkrellmd_serve_data(mon, buf); } if (mon->privat->client->last_client) net->up_event = net->down_event = FALSE; } } if (net_timer && GK.second_tick) { if (net_timer->timed_changed || first_serve) { gkrellmd_set_serve_name(mon, "net_timer"); sprintf(buf, "%s %d\n", net_timer->name, (gint)net_timer->up_time); gkrellmd_serve_data(mon, buf); } } }static voidserve_net_setup(GkrellmdMonitor *mon) { GkrellmdClient *client = mon->privat->client; gchar buf[128]; /* The client <-> server link always uses routed mode, but the client | needs to know if server sysdep uses routed for config purposes. */ if (net_use_routed) gkrellmd_send_to_client(client, "<net_setup>\nnet_use_routed\n"); if (net_timer_type != TIMER_TYPE_NONE) { snprintf(buf, sizeof(buf), "<net_setup>\nnet_timer %s\n", _GK.net_timer); gkrellmd_send_to_client(client, buf); } }static GkrellmdMonitor net_monitor = { "net", update_net, serve_net_data, serve_net_setup };static GkrellmdMonitor *init_net_monitor(void) { net_timer_type = TIMER_TYPE_NONE; if (gkrellm_sys_net_init()) return &net_monitor; return NULL; }/* ======================================================= */struct { gboolean mem_changed; guint64 total, used, free, shared, buffers, cached; gboolean swap_changed; guint64 swap_total,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -