From 8e8c865414e841945a67e7f4ed298ac7c23488e5 Mon Sep 17 00:00:00 2001 From: mvanbaak Date: Tue, 16 Dec 2008 20:08:34 +0000 Subject: introduce 'core show sysinfo' for systems that dont have the Linux-ish sysinfo stuff but do have sysctl. (closes issue #13433) Reported by: mvanbaak Patches: 2008121300_sysinfosysctl.diff.txt uploaded by mvanbaak (license 7) with two free calls replaced with ast_free based on feedback on reviewboard Review: http://reviewboard.digium.com/r/91/ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@164802 f38db490-d61c-443f-a65b-d21fe96a405b --- main/asterisk.c | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 118 insertions(+), 13 deletions(-) (limited to 'main/asterisk.c') diff --git a/main/asterisk.c b/main/asterisk.c index 8fe421dde..1c41b8a4e 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -78,6 +78,10 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include #if defined(HAVE_SYSINFO) #include +#elif defined(HAVE_SYSCTL) +#include +#include +#include #endif #include @@ -497,11 +501,114 @@ static char *handle_show_threads(struct ast_cli_entry *e, int cmd, struct ast_cl return CLI_SUCCESS; } -#if defined(HAVE_SYSINFO) +#if defined (HAVE_SYSCTL) && defined(HAVE_SWAPCTL) +/* + * swapmode is rewritten by Tobias Weingartner + * to be based on the new swapctl(2) system call. + */ +static int swapmode(int *used, int *total) +{ + struct swapent *swdev; + int nswap, rnswap, i; + + nswap = swapctl(SWAP_NSWAP, 0, 0); + if (nswap == 0) + return 0; + + swdev = ast_calloc(nswap, sizeof(*swdev)); + if (swdev == NULL) + return 0; + + rnswap = swapctl(SWAP_STATS, swdev, nswap); + if (rnswap == -1) { + ast_free(swdev); + return 0; + } + + /* if rnswap != nswap, then what? */ + + /* Total things up */ + *total = *used = 0; + for (i = 0; i < nswap; i++) { + if (swdev[i].se_flags & SWF_ENABLE) { + *used += (swdev[i].se_inuse / (1024 / DEV_BSIZE)); + *total += (swdev[i].se_nblks / (1024 / DEV_BSIZE)); + } + } + ast_free(swdev); + return 1; +} +#elif defined(HAVE_SYSCTL) +static int swapmode(int *used, int *total) +{ + used = total = 0; + return 1; +} +#endif + /*! \brief Give an overview of system statistics */ static char *handle_show_sysinfo(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { + int64_t physmem, freeram; + int totalswap, freeswap, nprocs; + long uptime = 0; +#if defined(HAVE_SYSINFO) struct sysinfo sys_info; + sysinfo(&sys_info) + uptime = sys_info.uptime/3600; + physmem = sys_info.totalram * sys_info.mem_unit; + freeram = (sys_info.freeram * sys_info.mem_unit) / 1024; + totalswap = (sys_info.totalswap * sys_info.mem_unit) / 1024; + freeswap = (sys_info.freeswap * sys_info.mem_unit) / 1024; + nprocs = sys_info.nprocs; +#elif defined(HAVE_SYSCTL) + static int pageshift; + struct vmtotal vmtotal; + struct timeval boottime; + time_t now; + int mib[2], pagesize, usedswap; + size_t len; + /* calculate the uptime by looking at boottime */ + time(&now); + mib[0] = CTL_KERN; + mib[1] = KERN_BOOTTIME; + len = sizeof(boottime); + if (sysctl(mib, 2, &boottime, &len, NULL, 0) != -1) { + uptime = now - boottime.tv_sec; + } + uptime = uptime/3600; + /* grab total physical memory */ + mib[0] = CTL_HW; + mib[1] = HW_PHYSMEM64; + len = sizeof(physmem); + sysctl(mib, 2, &physmem, &len, NULL, 0); + + pagesize = getpagesize(); + pageshift = 0; + while (pagesize > 1) { + pageshift++; + pagesize >>= 1; + } + + /* we only need the amount of log(2)1024 for our conversion */ + pageshift -= 10; + + /* grab vm totals */ + mib[0] = CTL_VM; + mib[1] = VM_METER; + len = sizeof(vmtotal); + sysctl(mib, 2, &vmtotal, &len, NULL, 0); + freeram = (vmtotal.t_free << pageshift); + /* generate swap usage and totals */ + swapmode(&usedswap, &totalswap); + freeswap = (totalswap - usedswap); + /* grab number of processes */ + mib[0] = CTL_KERN; + mib[1] = KERN_NPROCS; + len = sizeof(nprocs); + sysctl(mib, 2, &nprocs, &len, NULL, 0); +#endif + switch (cmd) { case CLI_INIT: e->command = "core show sysinfo"; @@ -512,22 +619,20 @@ static char *handle_show_sysinfo(struct ast_cli_entry *e, int cmd, struct ast_cl case CLI_GENERATE: return NULL; } - if (sysinfo(&sys_info)) { - ast_cli(a->fd, "FAILED to retrieve system information\n\n"); - return CLI_FAILURE; - } + ast_cli(a->fd, "\nSystem Statistics\n"); ast_cli(a->fd, "-----------------\n"); - ast_cli(a->fd, " System Uptime: %ld hours\n", sys_info.uptime/3600); - ast_cli(a->fd, " Total RAM: %ld KiB\n", (sys_info.totalram * sys_info.mem_unit)/1024); - ast_cli(a->fd, " Free RAM: %ld KiB\n", (sys_info.freeram * sys_info.mem_unit)/1024); + ast_cli(a->fd, " System Uptime: %ld hours\n", uptime); + ast_cli(a->fd, " Total RAM: %ld KiB\n", (long)physmem/1024); + ast_cli(a->fd, " Free RAM: %ld KiB\n", (long)freeram); +#if defined(HAVE_SYSINFO) ast_cli(a->fd, " Buffer RAM: %ld KiB\n", (sys_info.bufferram * sys_info.mem_unit)/1024); - ast_cli(a->fd, " Total Swap Space: %ld KiB\n", (sys_info.totalswap * sys_info.mem_unit)/1024); - ast_cli(a->fd, " Free Swap Space: %ld KiB\n\n", (sys_info.freeswap * sys_info.mem_unit)/1024); - ast_cli(a->fd, " Number of Processes: %d \n\n", sys_info.procs); +#endif + ast_cli(a->fd, " Total Swap Space: %ld KiB\n", (long)totalswap); + ast_cli(a->fd, " Free Swap Space: %ld KiB\n\n", (long)freeswap); + ast_cli(a->fd, " Number of Processes: %d \n\n", nprocs); return CLI_SUCCESS; } -#endif struct profile_entry { const char *name; @@ -1913,7 +2018,7 @@ static struct ast_cli_entry cli_asterisk[] = { #if !defined(LOW_MEMORY) AST_CLI_DEFINE(handle_show_version_files, "List versions of files used to build Asterisk"), AST_CLI_DEFINE(handle_show_threads, "Show running threads"), -#if defined(HAVE_SYSINFO) +#if defined(HAVE_SYSINFO) || defined(HAVE_SYSCTL) AST_CLI_DEFINE(handle_show_sysinfo, "Show System Information"), #endif AST_CLI_DEFINE(handle_show_profile, "Display profiling info"), -- cgit v1.2.3