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

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 "NotifySend.h"
  18. #include "db_cls.h"
  19. #include "tarfact.h"
  20. #include "vbopts.h"
  21. #include "tarfact.h"
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. /////////////////////////////////////////////////////////////////////////////
  28. // NotifySend dialog
  29. NotifySend::NotifySend(CWnd* pParent /*=NULL*/)
  30. : CDialog(NotifySend::IDD, pParent)
  31. {
  32. //{{AFX_DATA_INIT(NotifySend)
  33. m_read_community = _T("");
  34. m_write_community = _T("");
  35. m_retries = _T("");
  36. m_timeouts = _T("");
  37. m_mgmt_proto = _T("");
  38. m_net_proto = _T("");
  39. m_oid = _T("");
  40. m_customid = _T("");
  41. m_enterprise = _T("");
  42. m_output = _T("");
  43. //}}AFX_DATA_INIT
  44. int cstatus = Create(IDD, pParent);
  45. // create a snmp++ object
  46. int status;
  47. snmp = new Snmp( status);
  48. if ( status != SNMP_CLASS_SUCCESS)
  49. {
  50. AfxMessageBox("Unable To Create Snmp Object!");
  51. snmp = NULL;
  52. }
  53.     CheckRadioButton( IDC_RCOLDSTART, IDC_REGPLOSS,IDC_RCOLDSTART); 
  54. // load up the target list
  55.     CComboBox * target_cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
  56.     target_cb->ResetContent();
  57.     // get the db file name from the ini file
  58.     CString filename = theApp.GetProfileString( BROWSER_VALUE,DB_NAME,DEF_DB_NAME);
  59. // access the target database
  60.     Db target_db;
  61. TargetDb_Rec db_rec;
  62.     target_db.set_attributtes( filename, sizeof( TargetDb_Rec));
  63.     int nr = target_db.get_num_recs();
  64. if ( nr==0)
  65. AfxMessageBox("You Have No Targets Definedn Please Define a Target");
  66. // for all records, get and display
  67.     for (int i=1;i<=nr;i++)
  68.     {
  69.        if ((status = target_db.retrieve((long int) (i-1), &db_rec))!= DB_OK)
  70.        {
  71.           MessageBox("Unable to Read Target DB Record", ERR_MSG,MB_ICONSTOP);
  72.           return;
  73.        }
  74.    CString target_name;
  75.    if ( strcmp( db_rec.alias,"") ==0)
  76.          target_cb->AddString((char*)  db_rec.key);
  77.    else
  78.    {
  79.  target_name = db_rec.alias;
  80.  target_name += " @ ";
  81.  target_name += db_rec.key;
  82.  target_cb->AddString(target_name);
  83.    }
  84.        if ( i==1)
  85.        {
  86.           target_cb->SetCurSel(0);
  87.           load_target_attribs( db_rec);
  88.        }
  89. }
  90. }
  91. // load the current target view
  92. void NotifySend::load_target_attribs( TargetDb_Rec db_rec)
  93. {
  94.    char buffer[20];
  95.    m_read_community = db_rec.read_community;
  96.    m_write_community = db_rec.write_community;
  97.    sprintf( buffer,"%d",db_rec.retries);
  98.    m_retries = buffer;
  99.    sprintf( buffer,"%d",db_rec.timeout);
  100.    m_timeouts = buffer;
  101.    m_mgmt_proto = (db_rec.snmp_type == SNMPV1) ? V1 :V2C;
  102.    m_net_proto =  (db_rec.address_type == IP_TYPE) ? "IP" : "IPX";
  103.    UpdateData( FALSE);
  104. };
  105. void NotifySend::DoDataExchange(CDataExchange* pDX)
  106. {
  107. CDialog::DoDataExchange(pDX);
  108. //{{AFX_DATA_MAP(NotifySend)
  109. DDX_Text(pDX, IDC_READ_COMMUNITY, m_read_community);
  110. DDX_Text(pDX, IDC_WRITE_COMMUNITY, m_write_community);
  111. DDX_Text(pDX, IDC_RETRIES, m_retries);
  112. DDX_Text(pDX, IDC_TIMEOUTS, m_timeouts);
  113. DDX_Text(pDX, IDC_MGMTPROTO, m_mgmt_proto);
  114. DDX_Text(pDX, IDC_NETPROTO, m_net_proto);
  115. DDX_Text(pDX, IDC_OID, m_oid);
  116. DDX_Text(pDX, IDC_CUSTOMID, m_customid);
  117. DDX_Text(pDX, IDC_ENTERPRISE, m_enterprise);
  118. DDX_Text(pDX, IDC_OUTPUT, m_output);
  119. //}}AFX_DATA_MAP
  120. }
  121. BEGIN_MESSAGE_MAP(NotifySend, CDialog)
  122. //{{AFX_MSG_MAP(NotifySend)
  123. ON_CBN_SELCHANGE(IDC_TARGETS, OnSelchangeTargets)
  124. ON_BN_CLICKED(IDC_ADDOID, OnAddoid)
  125. ON_BN_CLICKED(IDC_EDITPAY, OnEditpay)
  126. ON_BN_CLICKED(IDC_DELPAY, OnDelpay)
  127. ON_LBN_DBLCLK(IDC_PDU, OnDblclkPdu)
  128. ON_WM_TIMER()
  129. //}}AFX_MSG_MAP
  130. END_MESSAGE_MAP()
  131. /////////////////////////////////////////////////////////////////////////////
  132. // NotifySend message handlers
  133. BOOL NotifySend::OnInitDialog() 
  134. {
  135. CDialog::OnInitDialog();
  136. // TODO: Add extra initialization here
  137. // clear the pdu table
  138. CListBox *lb;
  139. lb= ( CListBox*) GetDlgItem( IDC_PDU);
  140. lb->ResetContent();
  141. return TRUE;  // return TRUE unless you set the focus to a control
  142.               // EXCEPTION: OCX Property Pages should return FALSE
  143. }
  144. void NotifySend::OnSelchangeTargets() 
  145. {
  146. // TODO: Add your control notification handler code here
  147. // access the target database
  148.     Db target_db;
  149. TargetDb_Rec db_rec;
  150. char key[80];
  151. char *ptr,*address;
  152. int status;
  153.  
  154.     CComboBox * target_cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
  155. target_cb->GetLBText( target_cb->GetCurSel() , key);
  156. // trim off alias, if present
  157. address = key;
  158. ptr = key;
  159. while (*ptr != 0)
  160. {
  161. if ( *ptr == '@')
  162.    address = ptr+2;
  163.    ptr++;
  164. }
  165.     // get the db file name from the ini file
  166.     CString filename = theApp.GetProfileString( BROWSER_VALUE,DB_NAME,DEF_DB_NAME);
  167. target_db.set_attributtes( filename, sizeof( TargetDb_Rec));
  168.     strcpy( db_rec.key,address);
  169.     status = target_db.read( &db_rec);
  170.     if ( status != DB_OK)
  171.     {
  172.        MessageBox( "Unable to Read Target Record",ERR_MSG,MB_ICONSTOP);
  173.        return;
  174.     }
  175.     load_target_attribs( db_rec);
  176. }
  177. void NotifySend::OnAddoid() 
  178. {
  179. // TODO: Add your control notification handler code here
  180. UpdateData( TRUE);
  181. Oid oid( m_oid);
  182. if ( oid.valid())
  183. {
  184.    VbOpts vb_options;
  185.    vb_options.m_vboid = oid.get_printable();
  186.    int status;
  187.    status = vb_options.DoModal();
  188.    if ( vb_options.my_vb.valid()) {
  189.       CListBox *lb;
  190.       lb = ( CListBox*) GetDlgItem( IDC_PDU);
  191.       CString item;
  192.       item += oid.get_printable();
  193.           int spot = lb->InsertString( lb->GetCount(),item);
  194.   if ( spot >= MAX_TRAP_VBS)
  195.   AfxMessageBox("Exceeded Max trap Vbs!");
  196.   else
  197.      trap_vbs[spot] = vb_options.my_vb;
  198.    }
  199. }
  200. else
  201. AfxMessageBox("Invalid Custom MIB Object Identifier");
  202. }
  203. void NotifySend::OnEditpay() 
  204. {
  205. // TODO: Add your control notification handler code here
  206. CListBox *lb;
  207. int selection;
  208. char item_data[100];
  209. lb = ( CListBox*) GetDlgItem( IDC_PDU);
  210. UpdateData( TRUE);
  211. // make sure we have an item selected
  212. if((selection = lb->GetCurSel()) == LB_ERR)
  213. {
  214. AfxMessageBox("You Must Select an Item to Edit");
  215.     return;
  216. }
  217. // get the item text
  218. if ( (lb->GetText( selection, item_data)) == LB_ERR)
  219.     {
  220.        AfxMessageBox("Can Not Obtain List Box Selection");
  221.        return;
  222.     }
  223. Oid addoid( item_data);
  224. VbOpts vb_options;
  225. vb_options.m_vboid = addoid.get_printable();
  226. vb_options.m_vbvalue =  trap_vbs[selection].get_printable_value();
  227. int status;
  228. status = vb_options.DoModal();
  229. if ( vb_options.my_vb.valid())
  230. {
  231.    CString scalar;
  232.    scalar += addoid.get_printable();
  233.    lb->DeleteString( selection);
  234.    lb->InsertString( selection,scalar);
  235.    trap_vbs[selection] =  vb_options.my_vb;
  236. }
  237. }
  238. void NotifySend::OnDelpay() 
  239. {
  240. // TODO: Add your control notification handler code here
  241. CListBox *lb;
  242. int selection;
  243. lb = ( CListBox*) GetDlgItem( IDC_PDU);
  244. int count= lb->GetCount();
  245. // delete the item from the list box
  246. if((selection = lb->GetCurSel()) != LB_ERR)
  247. lb->DeleteString( selection);
  248. // relink the set vb list if needed
  249. for (int x=selection;x<(count-1);x++)
  250. trap_vbs[x] = trap_vbs[x+1];
  251. }
  252. void NotifySend::OnDblclkPdu() 
  253. {
  254. // TODO: Add your control notification handler code here
  255. OnEditpay();
  256. }
  257. void NotifySend::OnOK() 
  258. {
  259.    // TODO: Add extra validation here
  260.    Oid trapid;
  261.    Pdu trap_pdu;
  262.    char buffer[200];
  263.    Oid coldStart("1.3.6.1.6.3.1.1.5.1");
  264.    Oid warmStart("1.3.6.1.6.3.1.1.5.2");
  265.    Oid linkUp("1.3.6.1.6.3.1.1.5.4");
  266.    Oid linkDown("1.3.6.1.6.3.1.1.5.3");
  267.    Oid authenticationFailure("1.3.6.1.6.3.1.1.5.5");
  268.    Oid egpNeighborLoss("1.3.6.1.6.3.1.1.5.6");
  269.    // update MFC variables
  270.    UpdateData( TRUE);
  271.    // determine the trap id
  272.    int trap_type;
  273.    trap_type = GetCheckedRadioButton( IDC_RCOLDSTART, IDC_RCUSTOM);
  274.    switch( trap_type)
  275.    {
  276.       case IDC_RCOLDSTART:
  277.       trapid = coldStart;
  278.       break;
  279.       case IDC_RWARMSTART:
  280.       trapid = warmStart;
  281.       break;
  282.       case IDC_RLINKUP:
  283.       trapid = linkUp;
  284.       break;
  285.       case IDC_RLINKDOWN:
  286.       trapid = linkDown;
  287.       break;
  288.       case IDC_RAUTHFAIL:
  289.       trapid = authenticationFailure;
  290.       break;
  291.       case IDC_REGPLOSS:
  292.       trapid = egpNeighborLoss; 
  293.       break;
  294.       case IDC_RCUSTOM:
  295.       {
  296.  strcpy( buffer, m_customid);
  297.          Oid coid( buffer);
  298.          if ( !coid.valid())
  299.          {
  300.             AfxMessageBox("Invalid Custom Oid");
  301.             return;
  302.          }
  303.          trapid =  coid;
  304.       }
  305.    }
  306.    // attach the id to the pdu
  307.    trap_pdu.set_notify_id( trapid);
  308.    // use the default timestamp!
  309.    // determine the trap enterprise
  310.    strcpy( buffer, m_enterprise);
  311.    Oid enterprise_oid( buffer);
  312.    trap_pdu.set_notify_enterprise( enterprise_oid);
  313.    // make a SnmpTarget using the Target_Factory
  314.    CComboBox *cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
  315.    char key[80];
  316.    if ( cb->GetCurSel() == CB_ERR)
  317.    {
  318.       AfxMessageBox("No Target Selected!");
  319.       return;
  320.    }
  321.    cb->GetLBText( cb->GetCurSel(), key); 
  322.    // get a target from the target factory
  323.    SnmpTarget *target = target_factory( key);
  324.    if ( target == NULL)
  325.    {
  326.      AfxMessageBox("Unable To find Target");
  327.  return;
  328.    }
  329.    // build up the payload
  330.    CListBox *lb;
  331.    lb = ( CListBox*) GetDlgItem( IDC_PDU);
  332.    for (int x=0;x<lb->GetCount();x++)
  333.    trap_pdu += trap_vbs[x];
  334.    // make sure we have at least one vb in the payload
  335.    if ( trap_pdu.get_vb_count() == 0) {
  336.    AfxMessageBox("The Trap Payload Must have at least One Variable Binding");
  337.    delete target;
  338.    return;
  339.    }
  340.    // clear the output display
  341.    m_output = "SNMP++ Trap Send In Progress...";
  342.    UpdateData( FALSE);
  343.    int status = snmp->trap( trap_pdu, *target);
  344.    // display trap send status
  345.    m_output = snmp->error_msg( status);
  346.    UpdateData( FALSE);
  347.    // look for the continous mode
  348.    if ( status == SNMP_CLASS_SUCCESS)
  349.    {
  350.   CButton * continue_mode = (CButton*) GetDlgItem( IDC_CONTINUOS);
  351.   if ( continue_mode->GetCheck())
  352.      SetTimer(100,500,NULL);
  353.    }
  354.    delete target;
  355. }
  356. void NotifySend::OnTimer(UINT nIDEvent) 
  357. {
  358. // TODO: Add your message handler code here and/or call default
  359. KillTimer( nIDEvent);
  360. OnOK();
  361. }
  362. void NotifySend::OnCancel() 
  363. {
  364. // TODO: Add extra cleanup here
  365. DestroyWindow();
  366. }