Changeset 7f9c823 in nscp for modules/NRPEClient
- Timestamp:
- 11/08/09 23:24:31 (4 years ago)
- Branches:
- master, 0.4.0, 0.4.1, 0.4.2
- Children:
- 6672c56
- Parents:
- 3b4097d
- Location:
- modules/NRPEClient
- Files:
-
- 2 edited
-
NRPEClient.cpp (modified) (7 diffs)
-
stdafx.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
modules/NRPEClient/NRPEClient.cpp
r3b4097d r7f9c823 186 186 #endif 187 187 188 using boost::asio::ip::tcp;189 188 190 189 int NRPEClient::commandLineExec(const TCHAR* command, const unsigned int argLen, TCHAR** args) { … … 246 245 } 247 246 } 247 /* 248 248 NRPEPacket NRPEClient::send_ssl(std::wstring host, int port, int timeout, NRPEPacket packet) 249 249 { … … 251 251 return send_nossl(host, port, timeout, packet); 252 252 #else 253 253 254 initSSL(); 254 255 simpleSSL::Socket socket(true); … … 261 262 packet.readFrom(buffer.getBuffer(), buffer.getLength()); 262 263 return packet; 263 #endif 264 } 265 264 265 266 boost::asio::ssl::context ctx(io_service, boost::asio::ssl::context::sslv23); 267 ctx.use_tmp_dh_file("d:\\nrpe_512.pem"); 268 ctx.set_verify_mode(boost::asio::ssl::context::verify_peer); 269 nrpe_ssl_socket socket(io_service, ctx, host, port); 270 //socket. 271 272 #endif 273 } 274 */ 275 using boost::asio::ip::tcp; 266 276 267 277 void set_result(boost::optional<boost::system::error_code>* a, boost::system::error_code b) … … 269 279 a->reset(b); 270 280 } 271 template <typename MutableBufferSequence>272 void read_with_timeout( tcp::socket& sock, const MutableBufferSequence& buffers, boost::posix_time::time_duration duration)281 template <typename AsyncReadStream, typename RawSocket, typename MutableBufferSequence> 282 void read_with_timeout(AsyncReadStream& sock, RawSocket& rawSocket, const MutableBufferSequence& buffers, boost::posix_time::time_duration duration) 273 283 { 274 284 boost::optional<boost::system::error_code> timer_result; … … 286 296 timer.cancel(); 287 297 else if (timer_result) 288 sock.close();298 rawSocket.close(); 289 299 } 290 300 … … 293 303 } 294 304 305 template <typename AsyncWriteStream, typename RawSocket, typename MutableBufferSequence> 306 void write_with_timeout(AsyncWriteStream& sock, RawSocket& rawSocket, const MutableBufferSequence& buffers, boost::posix_time::time_duration duration) 307 { 308 boost::optional<boost::system::error_code> timer_result; 309 boost::asio::deadline_timer timer(sock.io_service()); 310 timer.expires_from_now(duration); 311 timer.async_wait(boost::bind(set_result, &timer_result, _1)); 312 313 boost::optional<boost::system::error_code> read_result; 314 async_write(sock, buffers, boost::bind(set_result, &read_result, _1)); 315 316 sock.io_service().reset(); 317 while (sock.io_service().run_one()) 318 { 319 if (read_result) 320 timer.cancel(); 321 else if (timer_result) 322 rawSocket.close(); 323 } 324 325 if (*read_result) 326 throw boost::system::system_error(*read_result); 327 } 328 329 class nrpe_socket : public boost::noncopyable { 330 public: 331 tcp::socket socket_; 332 333 public: 334 nrpe_socket(boost::asio::io_service &io_service, std::wstring host, int port) : socket_(io_service) { 335 NSC_LOG_CRITICAL(_T("Looking up...")); 336 tcp::resolver resolver(io_service); 337 tcp::resolver::query query(to_string(host), to_string(port)); 338 //tcp::resolver::query query("www.medin.name", "80"); 339 //tcp::resolver::query query("test_server", "80"); 340 341 tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 342 tcp::resolver::iterator end; 343 344 NSC_LOG_CRITICAL(_T("connecting...")); 345 boost::system::error_code error = boost::asio::error::host_not_found; 346 while (error && endpoint_iterator != end) 347 { 348 tcp::resolver::endpoint_type ep = *endpoint_iterator; 349 NSC_DEBUG_MSG_STD(_T("Attempting to connect to: ") + to_wstring(ep.address().to_string()) + _T(":") + to_wstring(ep.port())); 350 socket_.close(); 351 socket_.connect(*endpoint_iterator++, error); 352 } 353 NSC_LOG_CRITICAL(_T("Connected...")); 354 if (error) 355 throw boost::system::system_error(error); 356 } 357 ~nrpe_socket() { 358 socket_.close(); 359 } 360 361 void send(NRPEPacket &packet, boost::posix_time::seconds timeout) { 362 std::vector<char> buf(packet.getBufferLength()); 363 write_with_timeout(socket_, socket_, boost::asio::buffer(packet.getBuffer(), packet.getBufferLength()), timeout); 364 } 365 NRPEPacket recv(const NRPEPacket &packet, boost::posix_time::seconds timeout) { 366 std::vector<char> buf(packet.getBufferLength()); 367 read_with_timeout(socket_, socket_, boost::asio::buffer(buf), timeout); 368 return NRPEPacket(&buf[0], buf.size(), packet.getInternalBufferLength()); 369 } 370 }; 371 372 class nrpe_ssl_socket { 373 374 private: 375 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_; 376 public: 377 nrpe_ssl_socket(boost::asio::io_service &io_service, boost::asio::ssl::context &ctx, std::wstring host, int port) : socket_(io_service, ctx) { 378 NSC_LOG_CRITICAL(_T("Looking up...")); 379 tcp::resolver resolver(io_service); 380 //tcp::resolver::query query(to_string(host), to_string(port)); 381 tcp::resolver::query query("www.medin.name", "80"); 382 //tcp::resolver::query query("test_server", "80"); 383 384 tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 385 tcp::resolver::iterator end; 386 387 boost::system::error_code error = boost::asio::error::host_not_found; 388 NSC_LOG_CRITICAL(_T("Connecting...")); 389 while (error && endpoint_iterator != end) 390 { 391 tcp::resolver::endpoint_type ep = *endpoint_iterator; 392 NSC_DEBUG_MSG_STD(_T("Attempting to connect to: ") + to_wstring(ep.address().to_string()) + _T(":") + to_wstring(ep.port())); 393 socket_.lowest_layer().close(); 394 socket_.lowest_layer().connect(*endpoint_iterator++, error); 395 } 396 if (error) 397 throw boost::system::system_error(error); 398 NSC_LOG_CRITICAL(_T("Connected...")); 399 400 NSC_LOG_CRITICAL(_T("Handshaking...")); 401 //socket_.handshake(boost::asio::ssl::stream_base::client); 402 socket_.handshake(boost::asio::ssl::stream_base::client); 403 NSC_LOG_CRITICAL(_T("Handshook...") + strEx::itos(error.value())); 404 405 } 406 407 void send(NRPEPacket &packet, boost::posix_time::seconds timeout) { 408 NSC_LOG_CRITICAL(_T("Writing...")); 409 std::vector<char> buf(packet.getBufferLength()); 410 write_with_timeout(socket_, socket_.lowest_layer(), boost::asio::buffer(packet.getBuffer(), packet.getBufferLength()), timeout); 411 NSC_LOG_CRITICAL(_T("Written...")); 412 } 413 NRPEPacket recv(const NRPEPacket &packet, boost::posix_time::seconds timeout) { 414 NSC_LOG_CRITICAL(_T("Reading...")); 415 std::vector<char> buf(packet.getBufferLength()); 416 read_with_timeout(socket_, socket_.lowest_layer(), boost::asio::buffer(buf), timeout); 417 return NRPEPacket(&buf[0], buf.size(), packet.getInternalBufferLength()); 418 NSC_LOG_CRITICAL(_T("Read...")); 419 } 420 }; 421 295 422 NRPEPacket NRPEClient::send_nossl(std::wstring host, int port, int timeout, NRPEPacket packet) 296 423 { 297 424 boost::asio::io_service io_service; 298 tcp::resolver resolver(io_service); 299 // tcp::resolver::query query("127.0.0.1", boost::lexical_cast<std::string>(port)); 300 tcp::resolver::query query("www.medin.name", "80"); 301 302 tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 303 tcp::resolver::iterator end; 304 305 tcp::socket socket(io_service); 306 boost::system::error_code error = boost::asio::error::host_not_found; 307 while (error && endpoint_iterator != end) 308 { 309 tcp::resolver::endpoint_type ep = *endpoint_iterator; 310 NSC_DEBUG_MSG_STD(_T("Connectiing to: ") + boost::lexical_cast<std::wstring>(ep.address().to_string()) + _T(":") + boost::lexical_cast<std::wstring>(ep.port())); 311 socket.close(); 312 socket.connect(*endpoint_iterator++, error); 313 } 314 if (error) 315 throw boost::system::system_error(error); 316 317 //for (;;) 318 { 319 std::vector<char> buf(packet.getBufferLength()); 320 boost::system::error_code error; 321 322 size_t len = socket.write_some(boost::asio::buffer(packet.getBuffer(), packet.getBufferLength()), error); 323 NSC_DEBUG_MSG_STD(_T("Error: ") + strEx::itos(error.value()) + _T(" wrote: ") + strEx::itos(len)); 324 325 read_with_timeout(socket, boost::asio::buffer(buf), boost::posix_time::seconds(5) ); 326 //len = socket.read_some(boost::asio::buffer(buf), error); 327 NSC_DEBUG_MSG_STD(_T("Error: ") + strEx::itos(error.value()) + _T(" read: ") + strEx::itos(len)); 328 329 if (error == boost::asio::error::eof) 330 ;//break; // Connection closed cleanly by peer. 331 else if (error) 332 throw boost::system::system_error(error); // Some other error. 333 packet.readFrom(&buf[0], buf.size()); 334 } 335 336 337 425 nrpe_socket socket(io_service, host, port); 426 socket.send(packet, boost::posix_time::seconds(timeout)); 427 return socket.recv(packet, boost::posix_time::seconds(timeout)); 428 } 429 430 NRPEPacket NRPEClient::send_ssl(std::wstring host, int port, int timeout, NRPEPacket packet) 431 { 432 boost::asio::io_service io_service; 433 boost::asio::ssl::context ctx(io_service, boost::asio::ssl::context::sslv23); 434 SSL_CTX_set_cipher_list(ctx.impl(), "ADH"); 435 ctx.use_tmp_dh_file("d:\\nrpe_512.pem"); 436 ctx.set_verify_mode(boost::asio::ssl::context::verify_none); 437 nrpe_ssl_socket socket(io_service, ctx, host, port); 438 socket.send(packet, boost::posix_time::seconds(timeout)); 439 return socket.recv(packet, boost::posix_time::seconds(timeout)); 440 } 338 441 /* 339 simpleSocket::Socket socket(true); 340 socket.connect(host, port); 341 socket.sendAll(packet.getBuffer(), packet.getBufferLength()); 342 simpleSocket::DataBuffer buffer; 343 socket.readAll(buffer); 344 packet.readFrom(buffer.getBuffer(), buffer.getLength()); 345 */ 346 return packet; 347 } 348 442 NRPEPacket NRPEClient::send_nossl(std::wstring host, int port, int timeout, NRPEPacket packet) 443 { 444 unsigned char dh512_p[] = { 445 0xCF, 0xFF, 0x65, 0xC2, 0xC8, 0xB4, 0xD2, 0x68, 0x8C, 0xC1, 0x80, 0xB1, 446 0x7B, 0xD6, 0xE8, 0xB3, 0x62, 0x59, 0x62, 0xED, 0xA7, 0x45, 0x6A, 0xF8, 447 0xE9, 0xD8, 0xBE, 0x3F, 0x38, 0x42, 0x5F, 0xB2, 0xA5, 0x36, 0x03, 0xD3, 448 0x06, 0x27, 0x81, 0xC8, 0x9B, 0x88, 0x50, 0x3B, 0x82, 0x3D, 0x31, 0x45, 449 0x2C, 0xB4, 0xC5, 0xA5, 0xBE, 0x6A, 0xE3, 0x2E, 0xA6, 0x86, 0xFD, 0x6A, 450 0x7E, 0x1E, 0x6A, 0x73, 451 }; 452 unsigned char dh512_g[] = { 0x02, }; 453 454 DH *dh_2 = DH_new(); 455 dh_2->p = BN_bin2bn(dh512_p, sizeof(dh512_p), NULL); 456 dh_2->g = BN_bin2bn(dh512_g, sizeof(dh512_g), NULL); 457 458 FILE *outfile = fopen("d:\\nrpe_512.pem", "w"); 459 PEM_write_DHparams(outfile, dh_2); 460 PEM_write_DHparams(stdout, dh_2); 461 fclose(outfile); 462 463 nrpe_socket socket(host, port); 464 socket.send(packet, boost::posix_time::seconds(timeout)); 465 return socket.recv(packet, boost::posix_time::seconds(timeout)); 466 } 467 */ 349 468 350 469 -
modules/NRPEClient/stdafx.h
r3b4097d r7f9c823 36 36 #include <NSCAPI.h> 37 37 #include <NSCHelper.h> 38 #include <nsc_module_wrapper.hpp> 38 39 39 40 #include <boost/array.hpp> 40 #include <boost/date_time/posix_time/posix_time.hpp>41 41 #include <boost/asio.hpp> 42 #include <boost/optional.hpp> 42 43 #include <boost/bind.hpp> 44 #include <boost/asio/ssl.hpp> 43 45 44 46 #ifdef MEMCHECK
Note: See TracChangeset
for help on using the changeset viewer.








