int main(int argc, char** argv) { #ifdef _WIN32 // save the size and other constraints char t[512]; memset(t, 0, 512); GetConsoleTitle(t, 512); HWND h = FindWindow("ConsoleWindowClass", t); // ShowWindow(h, SW_HIDE); #endif int retVal = 0; try { int limCount = min(argc, 4); for (int x = 1; x < limCount; x++) { // check for an input file if (argv[x][0] == '-') { if (argv[x][1] == 'f' || argv[1][1] == 'F') FileOpts(argv[x + 1]); else // see if they need help if (argv[x][1] == 'h') { #ifdef _WIN32 // ShowWindow(h, SW_SHOW); #endif Usage(); exit(0); } } else // this is just for us if (!strcmp(argv[x], "dumpVer")) { cout << "TrapGen from Network Computing Technologies, Inc."; cout << endl << gProgramVersion << endl; return 0; } } // for (int x = 1; x < limCount; x++) // other command line arguments CmdLineOpts(argc, argv); if (gLogFileName != NULL) { gDoLogging = TRUE; gOfile.open(gLogFileName, ios::app); } #ifdef _WIN32 // if (FALSE == gFreeConsole) // { // ShowWindow(h, SW_SHOW); if (TRUE == gFreeConsole) { ShowWindow(h, SW_HIDE); } #endif #ifdef _WIN32 WSADATA wsaData; int err = WSAStartup(0x200, &wsaData); if (err == WSAVERNOTSUPPORTED) err = WSAStartup(0x101, &wsaData); if (gDoLogging) if (err) gOfile << "failed to initialize winsock, error is " << err << endl; #endif /////////////////////////////////////////////////// // new to version 2.7 #ifdef _WIN32 NtSysUpTime sysUpTime; #endif #ifdef _LINUX LinuxSysUpTime sysUpTime; #endif #ifdef _SOLARIS SolarisSysUpTime sysUpTime; #endif #ifdef _IRIX IrixSysUptime sysUpTime; #endif #ifdef _HPUX HpuxSysUpTime sysUpTime; #endif #ifdef _FREEBSD FreeBSDSysUptime sysUpTime; #endif gTimeTicks = sysUpTime.SysUpTime(); /////////////////////////////////////////////////// // figure out the ip address if not specified (V1 only) if (gSenderIP == NULL && gVersion == 0) { char buf[255]; unsigned long len = 255; memset(buf, 0, len); if (gethostname(buf, len)) if (gDoLogging) gOfile << "gethostname failed with error " << WSAGetLastError() << endl; HOSTENT* h = gethostbyname(buf); if (h != NULL) { struct in_addr in; memcpy(&in.s_addr, *(h->h_addr_list), sizeof(in.s_addr)); gSenderIP = inet_ntoa(in); } else { gSenderIP = "240.30.20.10"; if (gDoLogging) gOfile << "gethostbyname failed with error " << WSAGetLastError() << endl; } } // build the packet gPacket.Version(gVersion); gPacket.Community(gCommunity); if (gVersion == 0) { gPacket.Type(V1TRAP); gPacket.SenderOID(gSenderOID); gPacket.SenderIP(gSenderIP); gPacket.TimeTicks(gTimeTicks); gPacket.GenericTrapType(gGenericTrapType); gPacket.SpecificTrapType(gSpecificTrapType); } else { if (!gInform) gPacket.Type(V2TRAP); else gPacket.Type(INFORMPDU); gPacket.RequestId(gRequestId); gPacket.ErrorStatus(0); gPacket.ErrorIndex(0); gPacket.AddV2TrapVarbinds(gTimeTicks, gSenderOID, gGenericTrapType, gSpecificTrapType, gNoSubIds); } // send away retVal = Send(); } catch (SnmpException* se) { retVal = -1; } catch (...) { retVal = -2; } #ifdef _WIN32 WSACleanup(); #endif if (gDoLogging) gOfile.close(); return retVal; }
int Send() { int retVal = 1; if (gIpAddress == NULL) { cout << "Must specify at least a -d \"destination IP Address\"" << endl; cout << "e.g., trapgen -d 244.0.2.43" << endl; return 0; } if (gDump == ' ') { UdpClient udp(gPort, gIpAddress); if (gDoLogging) if (!udp.IsReady()) gOfile << "udp failed to initialize with error " << udp.ErrorCode() << endl; udp.Send(&gPacket); if (gInform) { udp.Timeout(gTimeout); Packet* p = udp.Receive(0); if (p != NULL && (p->RequestId() == gRequestId) && (p->Type() == V1RESPONSE)) retVal = 0; else if (gDoLogging) gOfile << "Sent INFORM but response timed out (timeout = " << gTimeout << ')' << endl; } else retVal = 0; } else { if (gDump == 'a' || gDump == 'b') { cout << "Length: " << gPacket.TotalLength() << endl; int version = gPacket.Version(); cout << "Version: "; if (version == 0) cout << "SNMPv1"; else if (version == 1) cout << "SNMPv2"; cout << endl; cout << "Community: " << gPacket. Community() << endl; if (version == 0) { cout << "Generic: " << gPacket.GenericTrapType() << endl; cout << "Specific: " << gPacket.SpecificTrapType() << endl; //////////////////////////////////////////////////////// int tTime = gPacket.TimeTicks(); tTime /= 100; int days = tTime/(60*60*24); tTime -= days * (60*60*24); int hrs = tTime/(60*60); tTime -= hrs*(60*60); int mins = tTime/(60); tTime -= mins*(60); char newcTime[128]; #ifdef _WIN32 sprintf_s(newcTime, 128, "%d days %02dh:%02dm:%02ds", days, hrs, mins, tTime); #else sprintf(newcTime, "%d days %02dh:%02dm:%02ds", days, hrs, mins, tTime); #endif cout << "TimeStamp: " << newcTime << " (" << gPacket.TimeTicks() << ")" << endl; // cout << "TimeStamp: " << gPacket.TimeTicks() << endl; //////////////////////////////////////////////////////// cout << "SenderIP: " << gPacket.SenderIP() << endl; } if (version == 0) cout << "SenderOID: " << gPacket.SenderOID() << endl; int vblen = gPacket.VbListLength(); for (int x = 1; x <= vblen; x++) { cout << "Varbind Number " << x << ' ' << endl; cout << '\t' << "Oid: " << gPacket.VbOID(x) << endl; cout << '\t' << "Type: " << gPacket.VbType(x) << endl; cout << '\t' << "Data: " << gPacket.VbData(x) << endl; } cout << endl; } if (gDump == 'h' || gDump == 'b') { unsigned int l = gPacket.TotalLength(); unsigned char* pdu = new unsigned char[l]; gPacket.Build(pdu); for (unsigned int asdf = 0; asdf < l; asdf++) { if (asdf && !(asdf % 10)) printf("\n"); printf("%02x ", pdu[asdf]); } printf("\n"); } } return retVal; }