⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 route_table.c

📁 gxsnmp SNMP MANAGER 的实现
💻 C
字号:
/***  GXSNMP -- An snmp management application**  Copyright (C) 1998 Gregory McLean****  This program is free software; you can redistribute it and/or modify**  it under the terms of the GNU General Public License as published by**  the Free Software Foundation; either version 2 of the License, or**  (at your option) any later version.****  This program is distributed in the hope that it will be useful,**  but WITHOUT ANY WARRANTY; without even the implied warranty of**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the**  GNU General Public License for more details.****  You should have received a copy of the GNU General Public License**  along with this program; if not, write to the Free Software**  Foundation, Inc.,  59 Temple Place - Suite 330, Cambridge, MA 02139, USA.****  plugin-sample.c -- A sample plugin, it don't do anything but its useful**                     for testing.*/#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <gnome.h>#include "menus.h"#include "main.h"#include "plugins.h"#include "gxsnmp_map.h"#include "gxsnmp_host.h"#include "route_dialog.h"#include "rfc1213.h"#include "debug.h"extern GtkWidget * host_popup_menu;/**************************************************************************** * Forward references ***************************************************************************/static void       menu_callback            (GtkWidget     *widget,					    gpointer      data);/*static gboolean   start_request            (rt_data       *rt); */static void       row_cb                   (GHashTable    *objs,                                            guint         indlen,					    gpointer      data);static void       error_cb                 (gpointer      data);static void       finish_cb                (gpointer      data);/**************************************************************************** *  Static data ***************************************************************************/static gchar * menu_location;static gulong destination[] = { IPROUTEDEST };static gulong protocol[]    = { IPROUTEPROTO };static gulong netmask[]     = { IPROUTEMASK };static gulong nexthop[]     = { IPROUTENEXTHOP };static gulong ifindex[]     = { IPROUTEIFINDEX };static gulong metric1[]     = { IPROUTEMETRIC1 };static gulong age[]         = { IPROUTEAGE };static gulong type[]        = { IPROUTETYPE };static gulong ifdescr[]     = { IFDESCR, 0 };#define oidlen(val) (sizeof(val)/sizeof(gulong))/**********************************************************************************  The plugin load routine****  This function is invoked at the very start of GXSNMP.  It should**  set one or more of the following flags:****  PLUGIN_DATABASE	-- for plugins that provide a database service**  PLUGIN_COLLECTOR	-- for plugins that do not require GTK services**  PLUGIN_APPLICATION	-- for plugins that require GTK services****  The flags determine at what point the start function is called during**  initialization.  The database plugins need to be started before the**  database is read in (for obvious reasons), and the collector and **  application plugins are not started until the database is completely**  read in and set up.********************************************************************************/gintload_plugin (PluginData * pd){  pd->type = PLUGIN_APPLICATION;  return 0;}/**************************************************************************** * *  The plugin unload routine * *  This function is invoked during the shutdown callback in main.c *  It should free any storage the plugin might have allocated, and *  generally clean itself up. * ***************************************************************************/voidunload_plugin (PluginData * pd){}/**********************************************************************************  The plugin start routine****  This function is invoked during initialization.  It should perform      **  initialization and start the plugin running.****  Included here is sample code to install the plugin in the 'plugins' menu.**  A collector-only plugin would NOT install a menu entry, and would not**  have a menu callback routine (below).********************************************************************************/gint start_plugin (PluginData * pd){  GnomeUIInfo   * menu;  d_print (DEBUG_PLUGINS, "Starting RouteTable plugin.\n");  menu_location         = g_strdup_printf ("%s/", gettext("_Plugins"));  menu                  = g_malloc0 (2 * sizeof(GnomeUIInfo));  menu->type            = GNOME_APP_UI_ITEM;  menu->label           = g_strdup ("Route Table");  menu->hint            = NULL;  menu->moreinfo        = menu_callback;       /* Menu activation cb routine */  menu->user_data       = NULL;                /* User data for the callback */  menu->unused_data     = NULL;                /* Reserved for future use */  menu->pixmap_type     = GNOME_APP_PIXMAP_STOCK;  menu->pixmap_info     = GNOME_STOCK_MENU_BLANK;  menu->accelerator_key = 0;  (menu + 1)->type      = GNOME_APP_UI_ENDOFINFO;  gxsnmp_add_to_host_popup (menu);   return 0;}/**********************************************************************************  Menu callback routine for the plugin****  This function is invoked when the user selects the plugin from the**  plugins menu.********************************************************************************/static voidmenu_callback (GtkWidget * widget, gpointer data){  GtkWidget       *dialog_widget;  DB_host         *dbh;  DB_interface    *dbi;  DB_snmp         *dbs;  GList           *gl;  GXsnmp_map_item *item;    item = GXSNMP_MAP_ITEM (data);  dbh = item->DB_graph->DB_host;  if (!(gl = dbh->DB_interfaces))    {      notice_dlg (_("The selected host has no interfaces defined on it,\n"		    "there must be at least one defined to load the route\n"		    "table from.\n\nThe route table can not be loaded.\n"));      return;    }  dbi = (DB_interface *)gl->data;  if (dbi)    {      rt_data    *rt;      dbs = g_sqldb_row_find (snmp_sqldb, "_rowid", &dbi->snmp);      if (!dbs)	{	  notice_dlg (_("The selected host has interfaces defined, but\n"			"there appears to be a problem with the SNMP\n"			"configuration for the interface.\n"			"\nThe route table can not be loaded.\n"));	  return;	}            g_print ("Load route table from %s using the %s snmp config.\n", 	       dbh->dns_name, dbs->name);      rt          = g_new0 (rt_data, 1);      rt->if_desc = NULL;      rt->rowid   = dbi->rowid;      rt->table   = NULL;      if (!gxsnmp_dialog_check ("route_table", NULL))	{	  dialog_widget = gxsnmp_route_dialog_new (rt);	  if (dialog_widget)	    {	      gxsnmp_dialog_add (dialog_widget, "Route Table", NULL, 				 g_strdup ("Route Table"));	      rt->dialog = dialog_widget;	      start_request (rt);	    }	}          }}/**************************************************************************** * Start loading the route table from the specified node. ***************************************************************************/gbooleanstart_request (rt_data *rt){  DB_interface    *dbi;  DB_snmp         *dbs;  GSList          *objs;  D_FUNC_START;  if (!(dbi = g_sqldb_row_find (interface_sqldb, "_rowid", &rt->rowid)))    {      notice_dlg (_("No interfaces on the selected host.\n\nRoute Table will "		  "not be loaded.\n"));      return FALSE;    }  if (!(dbs = (DB_snmp *)dbi->DB_snmp))    {      notice_dlg (_("Interface defined but no snmp configuration found.\n\n"		    "Route table will not be loaded."));      return FALSE;    }  if (!dbi->address)    {      notice_dlg (_("There was no address associated with this interface.\n"		    "An address must be specified in order to load the\n"		    "route table from the host.\n\nRoute table will not be "		    "loaded."));      return FALSE;    }  objs = NULL;  g_pdu_add_oid (&objs, protocol, oidlen(protocol), SNMP_NULL, NULL);  g_pdu_add_oid (&objs, destination, oidlen(destination), SNMP_NULL, NULL);  g_pdu_add_oid (&objs, netmask, oidlen(netmask), SNMP_NULL, NULL);  g_pdu_add_oid (&objs, nexthop, oidlen(nexthop), SNMP_NULL, NULL);  g_pdu_add_oid (&objs, ifindex, oidlen(ifindex), SNMP_NULL, NULL);  g_pdu_add_oid (&objs, metric1, oidlen(metric1), SNMP_NULL, NULL);  g_pdu_add_oid (&objs, age, oidlen(age), SNMP_NULL, NULL);  g_pdu_add_oid (&objs, type, oidlen(type), SNMP_NULL, NULL);  rt->host.domain         = dbi->transport;  rt->host.rcomm          = dbs->read_c ? g_strdup (dbs->read_c) : "public";  rt->host.wcomm          = dbs->write_c ? g_strdup (dbs->write_c) : "private";  rt->host.retries        = dbs->retries;  rt->host.name           = g_strdup (dbi->address);  rt->host.status         = 0;  rt->host.port           = dbs->port;  rt->host.timeout        = dbs->timeout;  rt->host.version        = dbs->version;  rt->table               = g_snmp_table_new(&rt->host, objs, 			      error_cb, row_cb, finish_cb, rt);  g_snmp_table_get(rt->table);  route_dialog_set_state (GXSNMP_ROUTE_DIALOG (rt->dialog));  D_FUNC_END;  return TRUE;}/**************************************************************************** * Helper function  ***************************************************************************/static voidfree_hash_element (void *key, void *val, void *data){  if (val)    g_free (val);  if (key)    g_free (key);}static gchar*match_strval(guint32 val, const value_string *vs) {  gint i = 0;  while (vs[i].strptr) {    if (vs[i].value == val)      return(vs[i].strptr);    i++;  }  return(NULL);}/**************************************************************************** * SNMP Data callback ***************************************************************************/static voidrow_cb (GHashTable *objs, guint indlen, gpointer data){  gchar                buf[512];  rt_data              *rt;  GSList               *sync_objs;  GSList               *sync_vars;  SNMP_OBJECT          *obj;  gint                 i;  gchar                *kludge[8];        /* should do this dynamicly */  gchar                *ptr;  gint 	               if_index;    D_FUNC_START;  rt = (rt_data *)data;  d_print (DEBUG_DUMP, "Completed request %x\n", (guint)rt->table);  /* Set up the ifDescr cache, we have to get this from a diffrent table,   * which means another get based on the data that the request we are    * processing returns. We do this in a sync fashion within the async   * callback. So its a potential mystifying UI locker..   */  if (!rt->if_desc)    rt->if_desc = g_hash_table_new (g_int_hash, g_int_equal);  for (i = 0; i < 8; i++)    {      obj = (SNMP_OBJECT *) g_hash_table_lookup(objs, &i);      if (!obj)	{	  g_warning("Problems getting obj pointer. Smells fishy here...\n");	  kludge[i]=g_strdup("");	  continue;	}      g_snmp_printf (buf, sizeof (buf), obj);      switch(i)	{	  case 0: /* Protocol */	    if ((ptr = match_strval(obj->syntax.ul[0], ipRouteProto)))	      kludge[i] = g_strdup(ptr);	    else	      kludge[i] = g_strdup(buf);	    break;	  case 4: /* Index */ 	    if_index = obj->syntax.ul[0];	    if ( (ptr = (gchar *)g_hash_table_lookup(rt->if_desc, &if_index)))	      {	        /* Great! we got this if descr already. */	        kludge[i] = g_strdup (ptr);	      }	    else	      {	        /* Lets load it. */	        d_print (DEBUG_DUMP, "Fetching interface description.\n");	        sync_vars = NULL;	        sync_objs = NULL;	        /* Get the ifDescr from the interfaces table */	        ifdescr[(oidlen(ifdescr))-1] = if_index;	        g_pdu_add_oid (&sync_vars, ifdescr, oidlen(ifdescr), 			       SNMP_NULL, NULL);	        sync_objs = g_sync_get ( &rt->host, sync_vars);	        if (!sync_objs)		  {		    g_warning ("Well hell. sync get from %s "			       "failed.\n", rt->host.name);		    g_slist_free (sync_vars);		    sync_vars = NULL;		  }	        else		  {		    gint *ptri;		    /* Good the host responded lets cache it. */		    g_snmp_printf (buf, sizeof (buf), sync_objs->data);		    kludge[i] = g_strdup (buf);		    ptri = g_malloc (sizeof (gint));		    *ptri = if_index;		    g_hash_table_insert (rt->if_desc, ptri, g_strdup(buf));		  }	      }	    break;	  case 7: /* Type */	    if ((ptr = match_strval(obj->syntax.ul[0], ipRouteType)))	      kludge[i] = g_strdup(ptr);	    else	      kludge[i] = g_strdup(buf);	    break;	  default:	    kludge[i] = g_strdup(buf);        }    }  gtk_clist_append (GXSNMP_ROUTE_DIALOG(rt->dialog)->clist, kludge);  D_FUNC_END;}static voidfinish_cb (gpointer data){  rt_data              *rt;  D_FUNC_START;  rt = (rt_data *)data;  d_print (DEBUG_TRACE, "Done!\n");  /* we are done loading the table clean up.*/  if (rt->if_desc)    {      g_hash_table_foreach (rt->if_desc, free_hash_element, NULL);      g_hash_table_destroy (rt->if_desc);    }  rt->if_desc = NULL;  g_snmp_table_destroy(rt->table);  rt->table   = NULL;  route_dialog_set_state (GXSNMP_ROUTE_DIALOG (rt->dialog));  D_FUNC_END;}/**************************************************************************** * SNMP timeout  **************************************************************************/static voiderror_cb (gpointer data){  rt_data      *rt;  D_FUNC_START;  g_return_if_fail (data != NULL);  rt = (rt_data *)data;  d_print (DEBUG_DUMP, "Request timed out %x\n", (guint)rt->table);  g_snmp_table_destroy(rt->table);  rt->table   = NULL;  D_FUNC_END;}/* EOF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -