2
* HardInfo - Displays System Information
3
* Copyright (C) 2003-2008 Leandro A. F. Pereira <leandro@hardinfo.org>
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation, version 2.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26
#include <sys/utsname.h>
30
#include <iconcache.h>
35
static GHashTable *moreinfo = NULL;
38
gchar *callback_network();
39
gchar *callback_route();
40
gchar *callback_dns();
41
gchar *callback_connections();
42
gchar *callback_shares();
43
gchar *callback_arp();
44
gchar *callback_statistics();
47
void scan_network(gboolean reload);
48
void scan_route(gboolean reload);
49
void scan_dns(gboolean reload);
50
void scan_connections(gboolean reload);
51
void scan_shares(gboolean reload);
52
void scan_arp(gboolean reload);
53
void scan_statistics(gboolean reload);
55
static ModuleEntry entries[] = {
56
{"Interfaces", "network-interface.png", callback_network, scan_network},
57
{"IP Connections", "network-connections.png", callback_connections, scan_connections},
58
{"Routing Table", "network.png", callback_route, scan_route},
59
{"ARP Table", "module.png", callback_arp, scan_arp},
60
{"DNS Servers", "dns.png", callback_dns, scan_dns},
61
{"Statistics", "network-statistics.png", callback_statistics, scan_statistics},
62
{"Shared Directories", "shares.png", callback_shares, scan_shares},
66
#include <arch/this/samba.h>
67
#include <arch/this/nfs.h>
68
#include <arch/this/net.h>
70
void scan_shares(gboolean reload)
73
scan_samba_shared_directories();
74
scan_nfs_shared_directories();
78
static gchar *__statistics = NULL;
79
void scan_statistics(gboolean reload)
88
__statistics = g_strdup("");
90
if ((netstat_path = find_program("netstat"))) {
91
gchar *command_line = g_strdup_printf("%s -s", netstat_path);
93
if ((netstat = popen(command_line, "r"))) {
94
while (fgets(buffer, 256, netstat)) {
95
if (!isspace(buffer[0]) && strchr(buffer, ':')) {
98
tmp = g_ascii_strup(strend(buffer, ':'), -1);
100
__statistics = h_strdup_cprintf("[%s]\n",
105
} else if (isdigit(buffer[4])) {
106
gchar *tmp1 = buffer + 4,
109
while (*tmp2 && !isspace(*tmp2)) tmp2++;
113
*tmp2 = toupper(*tmp2);
115
__statistics = h_strdup_cprintf("%s=%s\n",
125
g_free(command_line);
126
g_free(netstat_path);
132
static gchar *__nameservers = NULL;
133
void scan_dns(gboolean reload)
140
g_free(__nameservers);
141
__nameservers = g_strdup("");
143
if ((resolv = fopen("/etc/resolv.conf", "r"))) {
144
while (fgets(buffer, 256, resolv)) {
145
if (g_str_has_prefix(buffer, "nameserver")) {
146
__nameservers = h_strdup_cprintf("%s=\n",
148
g_strstrip(buffer + sizeof("nameserver")));
157
void scan_network(gboolean reload)
160
scan_net_interfaces();
164
static gchar *__routing_table = NULL;
165
void scan_route(gboolean reload)
173
g_free(__routing_table);
174
__routing_table = g_strdup("");
176
if ((route_path = find_program("route"))) {
177
gchar *command_line = g_strdup_printf("%s -n", route_path);
179
if ((route = popen(command_line, "r"))) {
180
/* eat first two lines */
181
fgets(buffer, 256, route);
182
fgets(buffer, 256, route);
184
while (fgets(buffer, 256, route)) {
190
__routing_table = h_strdup_cprintf("%s / %s=%s|%s|%s\n",
192
g_strstrip(buffer), g_strstrip(buffer + 16),
193
g_strstrip(buffer + 72),
194
g_strstrip(buffer + 48),
195
g_strstrip(buffer + 32));
201
g_free(command_line);
208
static gchar *__arp_table = NULL;
209
void scan_arp(gboolean reload)
217
__arp_table = g_strdup("");
219
if ((arp = fopen("/proc/net/arp", "r"))) {
221
fgets(buffer, 256, arp);
223
while (fgets(buffer, 256, arp)) {
227
__arp_table = h_strdup_cprintf("%s=%s|%s\n",
230
g_strstrip(buffer + 72),
231
g_strstrip(buffer + 41));
240
static gchar *__connections = NULL;
241
void scan_connections(gboolean reload)
249
g_free(__connections);
250
__connections = g_strdup("");
252
if ((netstat_path = find_program("netstat"))) {
253
gchar *command_line = g_strdup_printf("%s -an", netstat_path);
255
if ((netstat = popen("netstat -an", "r"))) {
256
while (fgets(buffer, 256, netstat)) {
261
if (g_str_has_prefix(buffer, "tcp") || g_str_has_prefix(buffer, "udp")) {
262
__connections = h_strdup_cprintf("%s=%s|%s|%s\n",
264
g_strstrip(buffer + 20), /* local address */
265
g_strstrip(buffer), /* protocol */
266
g_strstrip(buffer + 44), /* foreign address */
267
g_strstrip(buffer + 68)); /* state */
274
g_free(command_line);
275
g_free(netstat_path);
281
gchar *callback_arp()
283
return g_strdup_printf("[ARP Table]\n"
286
"ReloadInterval=3000\n"
287
"ColumnTitle$TextValue=IP Address\n"
288
"ColumnTitle$Value=Interface\n"
289
"ColumnTitle$Extra1=MAC Address\n"
290
"ShowColumnHeaders=true\n",
294
gchar *callback_shares()
296
return g_strdup_printf("[SAMBA]\n"
299
"%s", smb_shares_list, nfs_shares_list);
302
gchar *callback_dns()
304
return g_strdup_printf("[Name servers]\n"
305
"%s\n", __nameservers);
308
gchar *callback_connections()
310
return g_strdup_printf("[Connections]\n"
313
"ReloadInterval=3000\n"
314
"ColumnTitle$TextValue=Local Address\n"
315
"ColumnTitle$Value=Protocol\n"
316
"ColumnTitle$Extra1=Foreign Address\n"
317
"ColumnTitle$Extra2=State\n"
318
"ShowColumnHeaders=true\n",
322
gchar *callback_network()
324
return g_strdup_printf("%s\n"
326
"ReloadInterval=3000\n"
328
"ColumnTitle$TextValue=Device\n"
329
"ColumnTitle$Value=IP Address\n"
330
"ColumnTitle$Extra1=Sent\n"
331
"ColumnTitle$Extra2=Received\n"
332
"ShowColumnHeaders=true\n"
338
gchar *callback_route()
340
return g_strdup_printf("[IP routing table]\n"
344
"ReloadInterval=3000\n"
345
"ColumnTitle$TextValue=Destination / Gateway\n"
346
"ColumnTitle$Value=Interface\n"
347
"ColumnTitle$Extra1=Flags\n"
348
"ColumnTitle$Extra2=Mask\n"
349
"ShowColumnHeaders=true\n",
353
gchar *callback_statistics()
355
return g_strdup_printf("%s\n"
357
"ReloadInterval=3000\n",
361
gchar *hi_more_info(gchar * entry)
363
gchar *info = (gchar *) g_hash_table_lookup(moreinfo, entry);
366
return g_strdup(info);
368
return g_strdup_printf("[%s]", entry);
371
ModuleEntry *hi_module_get_entries(void)
376
gchar *hi_module_get_name(void)
378
return g_strdup("Network");
381
guchar hi_module_get_weight(void)
386
void hi_module_init(void)
389
g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
392
ModuleAbout *hi_module_get_about(void)
394
static ModuleAbout ma[] = {
396
.author = "Leandro A. F. Pereira",
397
.description = "Gathers information about this computer's network connection",
399
.license = "GNU GPL version 2"}