GetBulk.cpp
上传用户:czjinwang
上传日期:2007-01-12
资源大小:2484k
文件大小:16k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*============================================================================
  2.   Copyright (c) 1996
  3.   Hewlett-Packard Company
  4.   ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  5.   Permission to use, copy, modify, distribute and/or sell this software 
  6.   and/or its documentation is hereby granted without fee. User agrees 
  7.   to display the above copyright notice and this license notice in all 
  8.   copies of the software and any documentation of the software. User 
  9.   agrees to assume all liability for the use of the software; Hewlett-Packard 
  10.   makes no representations about the suitability of this software for any 
  11.   purpose. It is provided "AS-IS without warranty of any kind,either express 
  12.   or implied. User hereby grants a royalty-free license to any and all 
  13.   derivatives based upon this software code base. 
  14. =============================================================================*/
  15. #include "stdafx.h"
  16. #include "browser.h"
  17. #include "GetBulk.h"
  18. #include "db_cls.h"
  19. #include "tarfact.h"
  20. #ifdef _DEBUG
  21. #define new DEBUG_NEW
  22. #undef THIS_FILE
  23. static char THIS_FILE[] = __FILE__;
  24. #endif
  25. /////////////////////////////////////////////////////////////////////////////
  26. // GetBulk dialog
  27. GetBulk::GetBulk(CWnd* pParent /*=NULL*/)
  28. : CDialog(GetBulk::IDD, pParent)
  29. {
  30. //{{AFX_DATA_INIT(GetBulk)
  31. m_mgmt_proto = _T("");
  32. m_net_proto = _T("");
  33. m_oid = _T("");
  34. m_output = _T("");
  35. m_read_community = _T("");
  36. m_retries = _T("");
  37. m_timeouts = _T("");
  38. m_write_community = _T("");
  39. m_max_repititions = 1;
  40. m_non_repeaters = 0;
  41. //}}AFX_DATA_INIT
  42. int cstatus = Create(IDD, pParent);
  43. // create a snmp++ object
  44. int status;
  45. snmp = new Snmp( status);
  46. if ( status != SNMP_CLASS_SUCCESS)
  47. {
  48. AfxMessageBox("Unable To Create Snmp Object!");
  49. snmp = NULL;
  50. }
  51.     // load up the target list
  52.     CComboBox * target_cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
  53.     target_cb->ResetContent();
  54.     // get the db file name from the ini file
  55.     CString filename = theApp.GetProfileString( BROWSER_VALUE,DB_NAME,DEF_DB_NAME);
  56. // access the target database
  57.     Db target_db;
  58. TargetDb_Rec db_rec;
  59.     target_db.set_attributtes( filename, sizeof( TargetDb_Rec));
  60.     int nr = target_db.get_num_recs();
  61. if ( nr==0)
  62. AfxMessageBox("You Have No Targets Definedn Please Define a Target");
  63. // for all records, get and display
  64.     for (int i=1;i<=nr;i++)
  65.     {
  66.        if ((status = target_db.retrieve((long int) (i-1), &db_rec))!= DB_OK)
  67.        {
  68.           MessageBox("Unable to Read Target DB Record", ERR_MSG,MB_ICONSTOP);
  69.           return;
  70.        }
  71.    CString target_name;
  72.    if ( strcmp( db_rec.alias,"") ==0)
  73.          target_cb->AddString((char*)  db_rec.key);
  74.    else
  75.    {
  76.  target_name = db_rec.alias;
  77.  target_name += " @ ";
  78.  target_name += db_rec.key;
  79.  target_cb->AddString(target_name);
  80.    }
  81.        if ( i==1)
  82.        {
  83.           target_cb->SetCurSel(0);
  84.           load_target_attribs( db_rec);
  85.        }
  86. }
  87. }
  88. // load the current target view
  89. void GetBulk::load_target_attribs( TargetDb_Rec db_rec)
  90. {
  91.    char buffer[20];
  92.    m_read_community = db_rec.read_community;
  93.    m_write_community = db_rec.write_community;
  94.    sprintf( buffer,"%d",db_rec.retries);
  95.    m_retries = buffer;
  96.    sprintf( buffer,"%d",db_rec.timeout);
  97.    m_timeouts = buffer;
  98.    m_mgmt_proto = (db_rec.snmp_type == SNMPV1) ? V1 :V2C;
  99.    m_net_proto =  (db_rec.address_type == IP_TYPE) ? "IP" : "IPX";
  100.    UpdateData( FALSE);
  101. };
  102. void GetBulk::DoDataExchange(CDataExchange* pDX)
  103. {
  104. CDialog::DoDataExchange(pDX);
  105. //{{AFX_DATA_MAP(GetBulk)
  106. DDX_Text(pDX, IDC_MGMTPROTO, m_mgmt_proto);
  107. DDX_Text(pDX, IDC_NETPROTO, m_net_proto);
  108. DDX_Text(pDX, IDC_OID, m_oid);
  109. DDV_MaxChars(pDX, m_oid, 200);
  110. DDX_Text(pDX, IDC_OUTPUT, m_output);
  111. DDV_MaxChars(pDX, m_output, 1000);
  112. DDX_Text(pDX, IDC_READ_COMMUNITY, m_read_community);
  113. DDX_Text(pDX, IDC_RETRIES, m_retries);
  114. DDX_Text(pDX, IDC_TIMEOUTS, m_timeouts);
  115. DDX_Text(pDX, IDC_WRITE_COMMUNITY, m_write_community);
  116. DDX_Text(pDX, IDC_MAX_REPS, m_max_repititions);
  117. DDV_MinMaxInt(pDX, m_max_repititions, 0, 10);
  118. DDX_Text(pDX, IDC_NON_REPS, m_non_repeaters);
  119. DDV_MinMaxInt(pDX, m_non_repeaters, 0, 10);
  120. //}}AFX_DATA_MAP
  121. }
  122. BEGIN_MESSAGE_MAP(GetBulk, CDialog)
  123. //{{AFX_MSG_MAP(GetBulk)
  124. ON_BN_CLICKED(IDC_ADD, OnAdd)
  125. ON_BN_CLICKED(IDC_ADDOID, OnAddoid)
  126. ON_NOTIFY(NM_DBLCLK, IDC_MIBTREE, OnDblclkMibtree)
  127. ON_BN_CLICKED(IDC_REMOVE, OnRemove)
  128. ON_BN_CLICKED(IDC_STOP, OnStop)
  129. ON_BN_CLICKED(IDGETBULK, OnGetbulk)
  130. ON_WM_DESTROY()
  131. ON_CBN_SELCHANGE(IDC_TARGETS, OnSelchangeTargets)
  132. //}}AFX_MSG_MAP
  133. END_MESSAGE_MAP()
  134. /////////////////////////////////////////////////////////////////////////////
  135. // GetBulk message handlers
  136. void GetBulk::OnCancel() 
  137. {
  138. DestroyWindow();
  139. }
  140. // enable the controls
  141. void GetBulk::enable_controls( int state)
  142. {
  143.    CWnd *control;
  144.    control = GetDlgItem( IDC_TARGETS);
  145.    control->EnableWindow( state ? TRUE : FALSE);
  146.    control = GetDlgItem( IDC_MIBTREE);
  147.    control->EnableWindow( state ? TRUE : FALSE);
  148.    control = GetDlgItem( IDC_ADD);
  149.    control->EnableWindow( state ? TRUE : FALSE);
  150.    control = GetDlgItem( IDC_REMOVE);
  151.    control->EnableWindow( state ? TRUE : FALSE);
  152.    control = GetDlgItem( IDC_PDU);
  153.    control->EnableWindow( state ? TRUE : FALSE);
  154.    control = GetDlgItem( IDC_OID);
  155.    control->EnableWindow( state ? TRUE : FALSE);
  156.    control = GetDlgItem( IDC_ADDOID);
  157.    control->EnableWindow( state ? TRUE : FALSE);
  158.    control = GetDlgItem( IDC_ALL_DETAILS);
  159.    control->EnableWindow( state ? TRUE : FALSE);
  160.    control = GetDlgItem( IDC_NON_REPS);
  161.    control->EnableWindow( state ? TRUE : FALSE);
  162.    control = GetDlgItem( IDC_MAX_REPS);
  163.    control->EnableWindow( state ? TRUE : FALSE);
  164.    control = GetDlgItem( IDC_AUTOWALK);
  165.    control->EnableWindow( state ? TRUE : FALSE);
  166. };
  167. void GetBulk::getbulk_another()
  168. {
  169. OnGetbulk();
  170. }
  171. //====================================================================
  172. // SNMP++ callback function for async events
  173. // this callback is used for all async requests 
  174. void my_getbulkcallback( int reason,
  175.                   Snmp* snmp,
  176.                   Pdu &pdu,
  177.                   SnmpTarget &target,
  178.                   void * callback_data)
  179.                                
  180. {  
  181.    // resolve the callback data to a MFC Get Window Handle
  182.    GetBulk * getbulk_window = (GetBulk *) callback_data;
  183.    CButton * mib_walk = (CButton*) getbulk_window->GetDlgItem( IDC_AUTOWALK);
  184.    // based on the reason handle the reason
  185.    switch ( reason)
  186.    { 
  187.   // an asynchronous response has arrived
  188.       case SNMP_CLASS_ASYNC_RESPONSE:
  189.   getbulk_window->display_response( pdu, target, snmp);
  190.   // look for continuos mode
  191.       if (( mib_walk->GetCheck()) &&(pdu.get_error_status()==0))
  192.   getbulk_window->getbulk_another();
  193.   else
  194.   getbulk_window->enable_controls( TRUE);
  195.   break;
  196.      
  197.   // a timeout has occured
  198.       case SNMP_CLASS_TIMEOUT:
  199.   getbulk_window->display_timeout( target);
  200.   getbulk_window->enable_controls( TRUE);
  201.   break;
  202.      
  203.    } // end switch
  204. };   
  205. // display the response value
  206. void GetBulk::display_response( Pdu &pdu, SnmpTarget &target, Snmp *snmp)
  207. {
  208.    GenAddress address;   // SNMP++ generic Address
  209.    char buffer[150];
  210.    Vb vb;
  211.    int error_status = pdu.get_error_status();
  212.    // show the result status
  213.    m_output = "Status = ";
  214.    m_output += snmp->error_msg( error_status);
  215.    m_output += "rn";
  216.    // show the details if check box is selected
  217.    CButton * all_details = (CButton*) GetDlgItem( IDC_ALL_DETAILS);
  218.    if ( all_details->GetCheck())
  219.    {
  220.       target.get_address( address);
  221.       m_output += "Response from ";
  222.   m_output += address.get_printable();
  223.   m_output += "rn";
  224.       sprintf( buffer,"Error Status = %d, %srn",pdu.get_error_status(), snmp->error_msg(pdu.get_error_status()));
  225.       m_output += buffer;
  226.       sprintf( buffer,"Error Index  = %drn", pdu.get_error_index());
  227.       m_output += buffer;
  228.   sprintf( buffer,"Request ID  = %ldrn",pdu.get_request_id());
  229.   m_output += buffer;
  230.       sprintf( buffer,"Variable Binding Count = %drn",pdu.get_vb_count());
  231.       m_output += buffer;
  232.    }
  233.    // clear the pdu selection box
  234.    CListBox *lb;
  235.    lb = ( CListBox*) GetDlgItem( IDC_PDU);
  236.    lb->ResetContent();
  237.    // show the Vbs
  238.    for ( int x=0;x<pdu.get_vb_count();x++)
  239.    {
  240.       pdu.get_vb( vb,x);
  241.   sprintf( buffer,"Vb #%drn",x+1);
  242.   m_output += buffer;
  243.   m_output += "  Oid   = ";
  244.   m_output += vb.get_printable_oid();
  245.   m_output += "rn";
  246.   m_output += "  Value = ";
  247.   m_output +=  vb.get_printable_value();
  248.   m_output += "rn";
  249.   // update each vb in the Pdu selection box
  250.   CString nextoid;
  251.   nextoid = "next ";
  252.   nextoid += vb.get_printable_oid();
  253.   lb->InsertString( lb->GetCount(),nextoid);
  254.    }
  255.    // update the output display
  256.    UpdateData( FALSE);
  257. };
  258. // display a timeout message
  259. void GetBulk::display_timeout( SnmpTarget &target)
  260. {
  261.    m_output = "";
  262.    UpdateData( FALSE);
  263.    m_output = "Request Timed Out";
  264.    UpdateData( FALSE);
  265. };
  266. // load up the Ctree control with the MIB table
  267. void GetBulk::load_mib_view( CTreeCtrl *tree)
  268. {
  269.  CString name;
  270.  Oid current_oid, parent_oid, next_oid,prev_parent_oid,*oid_ptr;
  271.  HTREEITEM new_node, parent_node, previous_parent;
  272.  parent_node = previous_parent = TVI_ROOT;
  273.  for (int x=0;x<MAXMIBVALS; x++)
  274.  {
  275.     name = MIBVals[x][0];   
  276. current_oid = MIBVals[x][2];   
  277. next_oid = ((x+1)==MAXMIBVALS)?"":MIBVals[x+1][2];   
  278. if ( current_oid.len() <= parent_oid.len())
  279. {
  280. parent_node = previous_parent;
  281. parent_oid = prev_parent_oid;
  282. }
  283. // add the node
  284. new_node = tree->InsertItem( name,parent_node);
  285. oid_ptr = new Oid( current_oid);
  286. if ( strcmp(MIBVals[x][1],SCALAR)==0)
  287.    (*oid_ptr)+="0";
  288. tree->SetItemData( new_node, (DWORD) oid_ptr);
  289. if ( name == "sysDescr")
  290.    tree->SelectItem( new_node);
  291. if (( current_oid.len() > parent_oid.len()) && ( current_oid.len() < next_oid.len()))
  292. {
  293.    previous_parent = parent_node;  
  294.    parent_node = new_node;         
  295.    prev_parent_oid = parent_oid;
  296.    parent_oid = current_oid;        
  297. }
  298.  };
  299. };
  300. // recursive delete of CtreeCtrl Items
  301. void GetBulk::delete_nodes( CTreeCtrl *tree, HTREEITEM node)
  302. {
  303.     HTREEITEM next_node;
  304. Oid * oid_ptr;
  305.     next_node = tree->GetChildItem( node);
  306. if ( next_node != NULL)
  307. delete_nodes( tree, next_node);
  308. next_node = tree->GetNextSiblingItem( node);
  309. if ( next_node != NULL)
  310. delete_nodes( tree, next_node);
  311. oid_ptr = (Oid *) tree->GetItemData( node);
  312. if ( oid_ptr != NULL)
  313.    delete oid_ptr;
  314. }
  315. void GetBulk::OnAdd() 
  316. {
  317. // TODO: Add your control notification handler code here
  318. CTreeCtrl *tree;
  319. HTREEITEM node;
  320. Oid *oid_ptr;
  321. tree = (CTreeCtrl *) GetDlgItem( IDC_MIBTREE);
  322. node = tree->GetSelectedItem();
  323. oid_ptr = (Oid *) tree->GetItemData( node);
  324. Oid addoid( oid_ptr->get_printable());
  325. CListBox *lb;
  326. lb = ( CListBox*) GetDlgItem( IDC_PDU);
  327. CString scalar;
  328. scalar = tree->GetItemText( node);
  329. scalar += " ";
  330. scalar += addoid.get_printable();
  331. lb->InsertString( lb->GetCount(),scalar);
  332. }
  333. void GetBulk::OnAddoid() 
  334. {
  335. // TODO: Add your control notification handler code here
  336. UpdateData( TRUE);
  337. Oid oid( m_oid);
  338. if ( oid.valid())
  339. {
  340. CListBox *lb;
  341.     lb = ( CListBox*) GetDlgItem( IDC_PDU);
  342.     CString item;
  343.     item = "Custom ";
  344.     item += oid.get_printable();
  345.         lb->InsertString( lb->GetCount(),item);
  346. }
  347. else
  348. AfxMessageBox("Invalid Custom MIB Object Identifier");
  349. }
  350. void GetBulk::OnDblclkMibtree(NMHDR* pNMHDR, LRESULT* pResult) 
  351. {
  352. // TODO: Add your control notification handler code here
  353. OnAdd();
  354. *pResult = 0;
  355. }
  356. void GetBulk::OnRemove() 
  357. {
  358. // TODO: Add your control notification handler code here
  359. CListBox *lb;
  360. int selection;
  361. lb = ( CListBox*) GetDlgItem( IDC_PDU);
  362. if((selection = lb->GetCurSel()) != LB_ERR)
  363. lb->DeleteString( selection);
  364. }
  365. void GetBulk::OnStop() 
  366. {
  367. // TODO: Add your control notification handler code here
  368. CButton * mib_walk = (CButton*) GetDlgItem( IDC_AUTOWALK);
  369. mib_walk->SetCheck(0);
  370. }
  371. void GetBulk::OnGetbulk() 
  372. {
  373. // TODO: Add your control notification handler code here
  374. //------------------------------------------------------
  375. // Here is the real SNMP++ code !
  376. // 
  377. // Algorithm:
  378. // - build a Pdu using the Oids from the Pdu list box
  379. // - create a CTarget
  380. // - response will come to specified callback
  381. CListBox *lb;
  382. int count;
  383. char buffer[80],*ptr;
  384. Pdu pdu;          // SNMP++ Pdu object
  385. // update data to get non repeaters and max repititions
  386. UpdateData( TRUE);
  387. // get the ListBox id
  388. lb = ( CListBox*) GetDlgItem( IDC_PDU);
  389. // make sure we have something to get
  390. if ( (count=lb->GetCount()) <1)
  391. {
  392. AfxMessageBox("There are No PDU Variables to GetBulk");
  393. return;
  394. }
  395. // build up a SNMP++ Pdu with all the Vbs requested
  396. for ( int z =0;z<count;z++)
  397. {
  398.    // get the text from the listbox
  399.    lb->GetText(z,buffer);
  400.    // get rid of the text part
  401.    ptr = buffer;
  402.    while (*ptr != ' ') ptr++;
  403.    ptr++;
  404.    // make a SNMP++ Oid with the dotted notation
  405.    Oid oid( ptr);      
  406.    // make a SNMP++ Vb with the oid
  407.    Vb vb( oid);
  408.    // add the vb to the Pdu
  409.    pdu += vb;
  410. }
  411. // make a SnmpTarget using the Target_Factory
  412. CComboBox *cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
  413. char key[80];
  414.     if ( cb->GetCurSel() == CB_ERR)
  415.     {
  416.        AfxMessageBox("No Target Selected!");
  417.        return;
  418.     }
  419. cb->GetLBText( cb->GetCurSel(), key); 
  420. // get a target from the target factory
  421. SnmpTarget *target = target_factory( key);
  422. if ( target == NULL)
  423. {
  424. AfxMessageBox("Unable To find Target");
  425. return;
  426. }
  427. // Invoke a SNMP++ Get for the Pdu requested
  428. // from the target created
  429. int status = snmp->get_bulk( pdu,
  430.                             *target,
  431. m_non_repeaters,
  432. m_max_repititions,
  433.                             (snmp_callback) &my_getbulkcallback,
  434.                             (void *) this);
  435.                                         
  436.     if ( status != SNMP_CLASS_SUCCESS)
  437. AfxMessageBox( snmp->error_msg( status));
  438. // free up the target when complete
  439. delete target;
  440. m_output = "SNMP++ GetBulk In Progress...";
  441. UpdateData( FALSE);
  442. // disable all controls while get is pending
  443. enable_controls( FALSE);
  444. }
  445. BOOL GetBulk::OnInitDialog() 
  446. {
  447. CDialog::OnInitDialog();
  448. // TODO: Add extra initialization here
  449. CenterWindow();
  450. // load up the MIB tree control
  451. CTreeCtrl *tree;
  452. tree = (CTreeCtrl *) GetDlgItem( IDC_MIBTREE);
  453. load_mib_view( tree);
  454. // clear the pdu table
  455. CListBox *lb;
  456. lb= ( CListBox*) GetDlgItem( IDC_PDU);
  457. lb->ResetContent();
  458. return TRUE;  // return TRUE unless you set the focus to a control
  459.               // EXCEPTION: OCX Property Pages should return FALSE
  460. }
  461. void GetBulk::OnDestroy() 
  462. {
  463. CDialog::OnDestroy();
  464. // need to free up CtreeCtrl's Oids
  465. CTreeCtrl *tree;
  466. tree = (CTreeCtrl *) GetDlgItem( IDC_MIBTREE);
  467. delete_nodes( tree, tree->GetRootItem());
  468. }
  469. void GetBulk::OnSelchangeTargets() 
  470. {
  471. // TODO: Add your control notification handler code here
  472. Db target_db;
  473. TargetDb_Rec db_rec;
  474. char key[80];
  475. char *ptr,*address;
  476. int status;
  477.  
  478.     CComboBox * target_cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
  479. target_cb->GetLBText( target_cb->GetCurSel() , key);
  480. // trim off alias, if present
  481. address = key;
  482. ptr = key;
  483. while (*ptr != 0)
  484. {
  485. if ( *ptr == '@')
  486.    address = ptr+2;
  487.    ptr++;
  488. }
  489.     // get the db file name from the ini file
  490.     CString filename = theApp.GetProfileString( BROWSER_VALUE,DB_NAME,DEF_DB_NAME);
  491. target_db.set_attributtes( filename, sizeof( TargetDb_Rec));
  492.     strcpy( db_rec.key,address);
  493.     status = target_db.read( &db_rec);
  494.     if ( status != DB_OK)
  495.     {
  496.        MessageBox( "Unable to Read Target Record",ERR_MSG,MB_ICONSTOP);
  497.        return;
  498.     }
  499.     load_target_attribs( db_rec);
  500. }