Changeset 724a835 in nscp
- Timestamp:
- 07/29/12 22:39:38 (10 months ago)
- Branches:
- master, 0.4.1, 0.4.2
- Children:
- f14ab71
- Parents:
- d6194a0
- Files:
-
- 10 edited
-
changelog (modified) (1 diff)
-
include/nrpe/packet.hpp (modified) (1 diff)
-
include/nrpe/server/protocol.hpp (modified) (2 diffs)
-
include/socket/client.hpp (modified) (10 diffs)
-
include/socket/connection.hpp (modified) (11 diffs)
-
include/socket/server.hpp (modified) (2 diffs)
-
modules/LUAScript/lua_wrappers.hpp (modified) (1 diff)
-
modules/LUAScript/script_wrapper.hpp (modified) (4 diffs)
-
scripts/lua/lib/test_helper.lua (modified) (2 diffs)
-
scripts/lua/test_nrpe.lua (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
changelog
rd6194a0 r724a835 4 4 * Fix dependonservice LanManWorkStation (old win) 5 5 * Fix RtlStringFromGUID problem on NT4 6 7 2012-07-29 MickeM 8 * Tracked down a few memoryleaks when connections time-out. 9 * Added testcases for connection timeouts in lua NRPE test suite 10 * Improved the LUA module a bit 6 11 7 12 2012-07-26 MickeM -
include/nrpe/packet.hpp
rd6194a0 r724a835 109 109 char *tmp = new char[buffer.size()+1]; 110 110 copy( buffer.begin(), buffer.end(), tmp); 111 readFrom(tmp, buffer.size()); 111 try { 112 readFrom(tmp, buffer.size()); 113 } catch (nrpe::nrpe_packet_exception &e) { 114 delete [] tmp; 115 throw e; 116 } 112 117 delete [] tmp; 113 118 }; -
include/nrpe/server/protocol.hpp
ra48fd4c r724a835 88 88 iterator_type old_begin = begin; 89 89 boost::tie(result, begin) = parser_.digest(begin, end); 90 if (begin == old_begin) {91 log_error(__FILE__, __LINE__, "Digester failed to parse chunk, giving up.");92 return false;93 }94 90 if (result) { 95 91 nrpe::packet response; … … 106 102 set_state(got_request); 107 103 return true; 104 } else if (begin == old_begin) { 105 log_error(__FILE__, __LINE__, "Digester failed to parse chunk, giving up."); 106 return false; 108 107 } 109 108 } -
include/socket/client.hpp
rd6194a0 r724a835 36 36 virtual ~connection() { 37 37 try { 38 stop_timer();38 cancel_timer(); 39 39 } catch (const std::exception &e) { 40 40 handler_->log_error(__FILE__, __LINE__, std::string("Failed to close connection: ") + e.what()); … … 54 54 timer_.async_wait(boost::bind(&connection::on_timeout, this->shared_from_this(), boost::asio::placeholders::error)); 55 55 } 56 void stop_timer() { 56 void cancel_timer() { 57 trace("cancel_timer()"); 57 58 timer_.cancel(); 58 59 } … … 94 95 do_process(); 95 96 if (!wait()) { 96 stop_timer(); 97 close(); 97 close_socket(); 98 timer_result_.reset(); 99 wait(); 98 100 return protocol_.get_timeout_response(); 99 101 } 100 stop_timer();102 cancel_timer(); 101 103 return protocol_.get_response(); 102 104 } … … 104 106 virtual void shutdown() { 105 107 trace("shutdown()"); 108 cancel_timer(); 109 close_socket(); 110 }; 111 112 113 virtual void close_socket() { 114 trace("close_socket()"); 106 115 boost::system::error_code ignored_ec; 107 if (get_socket().is_open()) 116 if (get_socket().is_open()) { 108 117 get_socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec); 109 }; 110 111 112 virtual void close() { 113 trace("close()"); 114 boost::system::error_code ignored_ec; 115 if (get_socket().is_open()) 116 get_socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec); 117 get_socket().close(ignored_ec); 118 get_socket().close(ignored_ec); 119 } 118 120 } 119 121 … … 142 144 } else { 143 145 handler_->log_error(__FILE__, __LINE__, "Failed to read data: " + e.message()); 146 cancel_timer(); 144 147 } 145 148 } … … 154 157 } else { 155 158 handler_->log_error(__FILE__, __LINE__, "Failed to send data: " + e.message()); 159 cancel_timer(); 156 160 } 157 161 } … … 200 204 virtual ~tcp_connection() { 201 205 try { 202 this->close ();206 this->close_socket(); 203 207 } catch (const std::exception &e) { 204 208 this->log_error(__FILE__, __LINE__, std::string("Failed to close connection: ") + e.what()); … … 241 245 virtual ~ssl_connection() { 242 246 try { 243 this->close ();247 this->close_socket(); 244 248 } catch (const std::exception &e) { 245 249 this->log_error(__FILE__, __LINE__, std::string("Failed to close connection: ") + e.what()); … … 276 280 277 281 template<class protocol_type> 278 class client {282 class client : boost::noncopyable { 279 283 boost::shared_ptr<connection<protocol_type> > connection_; 280 284 boost::asio::io_service io_service_; … … 331 335 void shutdown() { 332 336 connection_->shutdown(); 337 connection_.reset(); 333 338 }; 334 339 -
include/socket/connection.hpp
rc3f233d r724a835 49 49 } 50 50 51 virtual boost::asio::ip::tcp::socket& socket() = 0;51 virtual boost::asio::ip::tcp::socket& get_socket() = 0; 52 52 53 53 ////////////////////////////////////////////////////////////////////////// … … 59 59 do_process(); 60 60 } else { 61 stop(); 62 } 63 } 64 65 virtual void stop() { 66 trace("stop()"); 67 cancel_timer(); 61 on_done(false); 62 } 63 } 64 void cancel_socket() { 65 trace("cancel_socket()"); 68 66 boost::system::error_code ignored_ec; 69 socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec); 67 if (get_socket().is_open()) { 68 trace("socket.shutdown()"); 69 get_socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec); 70 get_socket().close(ignored_ec); 71 } 72 } 73 74 virtual void on_done(bool all_ok) { 75 trace(std::string("on_done(") + (all_ok?"true":"false") + ")"); 76 try { 77 cancel_timer(); 78 cancel_socket(); 79 } catch (...) { 80 protocol_->log_error(__FILE__, __LINE__, "Failed to close connection"); 81 } 70 82 } 71 83 … … 78 90 79 91 virtual void cancel_timer() { 92 trace("cancel_timer()"); 80 93 timer_.cancel(); 81 94 } … … 84 97 if (e != boost::asio::error::operation_aborted) { 85 98 trace("timeout()"); 86 boost::system::error_code ignored_ec; 87 socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec); 99 on_done(false); 88 100 } 89 101 } … … 100 112 start_write_request(buf(protocol_->get_outbound())); 101 113 } else { 102 stop();114 on_done(true); 103 115 } 104 116 } … … 106 118 virtual void start_read_request() = 0; 107 119 virtual void handle_read_request(const boost::system::error_code& e, std::size_t bytes_transferred) { 108 trace("handle_read_request(" + strEx::s::xtos(bytes_transferred) + ")");120 trace("handle_read_request(" + e.message() + ", " + strEx::s::xtos(bytes_transferred) + ")"); 109 121 if (!e) { 110 122 if (protocol_->on_read(buffer_.begin(), buffer_.begin() + bytes_transferred)) { 111 123 do_process(); 112 124 } else { 113 stop();125 on_done(false); 114 126 } 115 127 } else { 116 128 protocol_->log_error(__FILE__, __LINE__, "Failed to read data: " + e.message()); 129 on_done(false); 117 130 } 118 131 } … … 120 133 virtual void start_write_request(const boost::asio::const_buffer& response) = 0; 121 134 virtual void handle_write_response(const boost::system::error_code& e, std::size_t bytes_transferred) { 122 trace("handle_write_response(" + strEx::s::xtos(bytes_transferred) + ")");135 trace("handle_write_response(" + e.message() + ", " + strEx::s::xtos(bytes_transferred) + ")"); 123 136 if (!e) { 124 137 protocol_->on_write(); … … 126 139 } else { 127 140 protocol_->log_error(__FILE__, __LINE__, "Failed to send data: " + e.message()); 141 on_done(false); 128 142 } 129 143 } … … 163 177 } 164 178 165 virtual boost::asio::ip::tcp::socket& socket() {179 virtual boost::asio::ip::tcp::socket& get_socket() { 166 180 return socket_; 167 181 } … … 197 211 198 212 199 virtual boost::asio::ip::tcp::socket& socket() {213 virtual boost::asio::ip::tcp::socket& get_socket() { 200 214 return ssl_socket_.next_layer(); 201 215 } … … 215 229 else { 216 230 parent_type::protocol_->log_error(__FILE__, __LINE__, "Failed to establish secure connection: " + e.message()); 231 parent_type::on_done(false); 217 232 } 218 233 } -
include/socket/server.hpp
ra48fd4c r724a835 114 114 acceptor_.listen(protocol_->get_info().back_log); 115 115 116 acceptor_.async_accept(new_connection_-> socket(),accept_strand_.wrap(116 acceptor_.async_accept(new_connection_->get_socket(),accept_strand_.wrap( 117 117 boost::bind(&server::handle_accept, this, boost::asio::placeholders::error) 118 118 )); … … 133 133 if (!e) { 134 134 std::list<std::string> errors; 135 if (protocol_->on_accept(new_connection_-> socket())) {135 if (protocol_->on_accept(new_connection_->get_socket())) { 136 136 new_connection_->start(); 137 137 } else { 138 new_connection_-> stop();138 new_connection_->on_done(false); 139 139 } 140 140 141 141 new_connection_.reset(create_connection()); 142 142 143 acceptor_.async_accept(new_connection_-> socket(),143 acceptor_.async_accept(new_connection_->get_socket(), 144 144 accept_strand_.wrap( 145 145 boost::bind(&server::handle_accept, this, boost::asio::placeholders::error) -
modules/LUAScript/lua_wrappers.hpp
rd6194a0 r724a835 453 453 , script(script) 454 454 { 455 std::wcout << _T("+++");456 455 } 457 456 458 457 virtual ~lua_script_instance() { 459 std::wcout << _T("---");460 458 } 461 459 -
modules/LUAScript/script_wrapper.hpp
rd6194a0 r724a835 516 516 lua_script(nscapi::core_wrapper* core, const int plugin_id, boost::shared_ptr<lua_wrappers::lua_registry> registry, const std::string alias, const std::string base_path, const std::string script) 517 517 : script_instance(core, plugin_id, registry, alias, script), base_path_(base_path) { 518 std::wcout << _T("AAA");519 518 } 520 519 public: 521 520 virtual ~lua_script() { 522 std::wcout << _T("XXX");523 521 } 524 522 … … 532 530 533 531 void load() { 534 std::wcout << _T("lll");535 532 lua_wrappers::lua_instance_manager::set_script(get_lua_state(), shared_from_this()); 536 533 lua_wrappers::lua_wrapper lua(get_lua_state()); … … 542 539 if (lua.pcall(0, 0, 0) != 0) 543 540 throw lua_wrappers::LUAException(_T("Failed to execute script: ") + get_wscript() + _T(": ") + lua.pop_string()); 544 std::wcout << _T("LLL");545 541 } 546 542 std::wstring get_wscript() const { … … 548 544 } 549 545 void unload() { 550 std::wcout << _T("uuu");551 546 lua_wrappers::lua_wrapper lua(get_lua_state()); 552 547 lua.gc(LUA_GCCOLLECT, 0); 553 548 lua_wrappers::lua_instance_manager::remove_script(shared_from_this()); 554 std::wcout << _T("UUU");555 std::wcout << shared_from_this().use_count();556 549 } 557 550 void reload() { -
scripts/lua/lib/test_helper.lua
rd6194a0 r724a835 80 80 function TestResult:print(indent) 81 81 indent = indent or 0 82 pad = string.rep(' ', indent)82 local pad = string.rep(' ', indent) 83 83 if self.status then 84 84 core:log("info", pad .. "[OK ] - " .. self.message) … … 93 93 function TestResult:print_failed(indent) 94 94 indent = indent or 0 95 pad = string.rep(' ', indent)95 local pad = string.rep(' ', indent) 96 96 if not self.status then 97 97 core:log("error", pad .. "[ERR] - " .. self.message) 98 98 end 99 99 if # self.children > 0 then 100 for i,v in ipairs(self.children) do v:print (indent+2) end100 for i,v in ipairs(self.children) do v:print_failed(indent+2) end 101 101 end 102 102 end -
scripts/lua/test_nrpe.lua
rd6194a0 r724a835 105 105 106 106 function TestNRPE:handler(req) 107 msg = self:get_response(args[0])107 local msg = self:get_response(args[0]) 108 108 msg.got_response = true 109 109 self:set_response(msg) … … 132 132 enc = host:add_metadata() 133 133 enc:set_key("timeout") 134 enc:set_value(' 5')134 enc:set_value('10') 135 135 end 136 136 … … 147 147 result_code, response = core:query('nrpe_forward', serialized) 148 148 response_message = protobuf.Plugin.QueryResponseMessage.parsefromstring(response) 149 --print(response_message:get_payload(1):get_message())150 149 151 150 … … 165 164 break 166 165 else 167 log(string.format('Waiting for %s (%s/%s)', uid,tag,target))166 core:log(string.format('Waiting for %s (%s/%s)', uid,tag,target)) 168 167 --sleep(500) 169 168 end … … 217 216 end 218 217 218 function TestNRPE:test_timeout(ssl, server_timeout, client_timeout, length) 219 220 local conf = Settings() 221 local core = Core() 222 conf:set_bool('/settings/NRPE/test_nrpe_server', 'use ssl', ssl) 223 conf:set_int('/settings/NRPE/test_nrpe_server', 'timeout', server_timeout) 224 conf:set_bool('/settings/NRPE/test_nrpe_server', 'allow arguments', true) 225 conf:set_int('/settings/NRPE/test_nrpe_server', 'payload length', length) 226 core:reload('test_nrpe_server') 227 228 conf:set_string('/settings/NRPE/test_nrpe_client/targets/default', 'address', 'nrpe://127.0.0.1:15666') 229 conf:set_bool('/settings/NRPE/test_nrpe_client/targets/default', 'use ssl', ssl) 230 conf:set_int('/settings/NRPE/test_nrpe_client/targets/default', 'timeout', client_timeout) 231 conf:set_int('/settings/NRPE/test_nrpe_client/targets/default', 'payload length', length) 232 233 core:reload('test_nrpe_client') 234 235 local result = test.TestResult:new{message="Testing timeouts ssl: "..tostring(ssl)..", server: "..tostring(server_timeout)..", client: "..tostring(client_timeout)} 236 237 238 239 local msg = protobuf.Plugin.QueryRequestMessage.new() 240 hdr = msg:get_header() 241 hdr:set_version(1) 242 hdr:set_recipient_id('test') 243 host = hdr:add_hosts() 244 host:set_address("127.0.0.1:15666") 245 host:set_id('test') 246 247 uid = string.random(12) 248 payload = msg:add_payload() 249 payload:set_command('check_py_nrpe_test_s') 250 payload:set_arguments(1, uid) 251 rmsg = self:get_request(uid) 252 rmsg.status = 'ok' 253 rmsg.message = 'Hello: Timeout' 254 rmsg.perfdata = '' 255 self:set_request(rmsg) 256 serialized = msg:serialized() 257 result_code, response = core:query('nrpe_forward', serialized) 258 response_message = protobuf.Plugin.QueryResponseMessage.parsefromstring(response) 259 260 261 found = False 262 for i = 0,10 do 263 if (self:has_response(uid)) then 264 rmsg = self:get_response(uid) 265 result:add_message(false, string.format('Testing to recieve message using')) 266 self:del_response(uid) 267 found = true 268 break 269 else 270 core:log(string.format('Timeout waiting for %s', uid)) 271 --sleep(500) 272 end 273 end 274 if (found) then 275 result:add_message(false, string.format('Making sure timeout message was never delivered')) 276 end 277 278 return result 279 end 219 280 220 281 function TestNRPE:run() … … 225 286 result:add(self:do_one_test(true, 65536)) 226 287 result:add(self:do_one_test(true, 1048576)) 288 289 result:add(self:test_timeout(false, 30, 1, 10485760)) 290 result:add(self:test_timeout(false, 1, 30, 10485760)) 291 result:add(self:test_timeout(true, 30, 1, 10485760)) 292 result:add(self:test_timeout(true, 1, 30, 10485760)) 227 293 return result 228 294 end
Note: See TracChangeset
for help on using the changeset viewer.








