Mon Jun 27 16:50:54 2011

Asterisk developer's documentation


func_sysinfo.c

Go to the documentation of this file.
00001 /*
00002  * Asterisk -- An open source telephony toolkit.
00003  *
00004  * Copyright (C) 2007, Digium, Inc.
00005  *
00006  * See http://www.asterisk.org for more information about
00007  * the Asterisk project. Please do not directly contact
00008  * any of the maintainers of this project for assistance;
00009  * the project provides a web site, mailing lists and IRC
00010  * channels for your use.
00011  *
00012  * This program is free software, distributed under the terms of
00013  * the GNU General Public License Version 2. See the LICENSE file
00014  * at the top of the source tree.
00015  */
00016 
00017 /*! \file
00018  *
00019  * SYSINFO function to return various system data.
00020  * 
00021  * \note Inspiration and Guidance from Russell
00022  *
00023  * \author Jeff Peeler
00024  *
00025  * \ingroup functions
00026  */
00027 
00028 #include "asterisk.h"
00029 
00030 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 87233 $")
00031 
00032 #if defined(HAVE_SYSINFO)
00033 #include <sys/sysinfo.h>
00034 #endif
00035 
00036 #include "asterisk/module.h"
00037 #include "asterisk/pbx.h"
00038 
00039 /*** DOCUMENTATION
00040    <function name="SYSINFO" language="en_US">
00041       <synopsis>
00042          Returns system information specified by parameter.
00043       </synopsis>
00044       <syntax>
00045          <parameter name="parameter" required="true">
00046             <enumlist>
00047                <enum name="loadavg">
00048                   <para>System load average from past minute.</para>
00049                </enum>
00050                <enum name="numcalls">
00051                   <para>Number of active calls currently in progress.</para>
00052                </enum>
00053                <enum name="uptime">
00054                   <para>System uptime in hours.</para>
00055                   <note><para>This parameter is dependant upon operating system.</para></note>
00056                </enum>
00057                <enum name="totalram">
00058                   <para>Total usable main memory size in KiB.</para>
00059                   <note><para>This parameter is dependant upon operating system.</para></note>
00060                </enum>
00061                <enum name="freeram">
00062                   <para>Available memory size in KiB.</para>
00063                   <note><para>This parameter is dependant upon operating system.</para></note>
00064                </enum>
00065                <enum name="bufferram">
00066                   <para>Memory used by buffers in KiB.</para>
00067                   <note><para>This parameter is dependant upon operating system.</para></note>
00068                </enum>
00069                <enum name="totalswap">
00070                   <para>Total swap space still available in KiB.</para>
00071                   <note><para>This parameter is dependant upon operating system.</para></note>
00072                </enum>
00073                <enum name="freeswap">
00074                   <para>Free swap space still available in KiB.</para>
00075                   <note><para>This parameter is dependant upon operating system.</para></note>
00076                </enum>
00077                <enum name="numprocs">
00078                   <para>Number of current processes.</para>
00079                   <note><para>This parameter is dependant upon operating system.</para></note>
00080                </enum>
00081             </enumlist>
00082          </parameter>
00083       </syntax>
00084       <description>
00085          <para>Returns information from a given parameter.</para>
00086       </description>
00087    </function>
00088  ***/
00089 
00090 static int sysinfo_helper(struct ast_channel *chan, const char *cmd, char *data,
00091                                char *buf, size_t len)
00092 {
00093 #if defined(HAVE_SYSINFO)
00094    struct sysinfo sys_info;
00095    if (sysinfo(&sys_info)) {
00096       ast_log(LOG_ERROR, "FAILED to retrieve system information\n");
00097       return -1;
00098    }
00099 #endif
00100    if (ast_strlen_zero(data)) {
00101       ast_log(LOG_WARNING, "Syntax: ${SYSINFO(<parameter>)} - missing argument!)\n");
00102       return -1;
00103    } else if (!strcasecmp("loadavg", data)) {
00104       double curloadavg;
00105       getloadavg(&curloadavg, 1);
00106       snprintf(buf, len, "%f", curloadavg);
00107    } else if (!strcasecmp("numcalls", data)) {
00108       snprintf(buf, len, "%d", ast_active_calls());
00109    }
00110 #if defined(HAVE_SYSINFO)
00111    else if (!strcasecmp("uptime", data)) {             /* in hours */
00112       snprintf(buf, len, "%ld", sys_info.uptime/3600);
00113    } else if (!strcasecmp("totalram", data)) {         /* in KiB */
00114       snprintf(buf, len, "%ld",(sys_info.totalram * sys_info.mem_unit)/1024);
00115    } else if (!strcasecmp("freeram", data)) {          /* in KiB */
00116       snprintf(buf, len, "%ld",(sys_info.freeram * sys_info.mem_unit)/1024);
00117    } else if (!strcasecmp("bufferram", data)) {        /* in KiB */
00118       snprintf(buf, len, "%ld",(sys_info.bufferram * sys_info.mem_unit)/1024);
00119    } else if (!strcasecmp("totalswap", data)) {        /* in KiB */
00120       snprintf(buf, len, "%ld",(sys_info.totalswap * sys_info.mem_unit)/1024);
00121    } else if (!strcasecmp("freeswap", data)) {         /* in KiB */
00122       snprintf(buf, len, "%ld",(sys_info.freeswap * sys_info.mem_unit)/1024);
00123    } else if (!strcasecmp("numprocs", data)) {
00124       snprintf(buf, len, "%d", sys_info.procs);
00125    }
00126 #endif
00127    else {
00128       ast_log(LOG_ERROR, "Unknown sysinfo parameter type '%s'.\n", data);
00129       return -1;
00130    }
00131       
00132    return 0;
00133 }
00134 
00135 static struct ast_custom_function sysinfo_function = {
00136    .name = "SYSINFO",
00137    .read = sysinfo_helper,
00138    .read_max = 22,
00139 };
00140 
00141 static int unload_module(void)
00142 {
00143    return ast_custom_function_unregister(&sysinfo_function);
00144 }
00145 
00146 static int load_module(void)
00147 {
00148    return ast_custom_function_register(&sysinfo_function);
00149 }
00150 
00151 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "System information related functions");
00152 

Generated on Mon Jun 27 16:50:54 2011 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7