diff options
Diffstat (limited to 'server')
-rwxr-xr-x | server/server/config.cpp | 24 | ||||
-rwxr-xr-x | server/server/config.h | 4 | ||||
-rwxr-xr-x | server/server/main.cpp | 34 | ||||
-rw-r--r-- | server/server/main.h | 20 |
4 files changed, 59 insertions, 23 deletions
diff --git a/server/server/config.cpp b/server/server/config.cpp index 3c7a679..890c369 100755 --- a/server/server/config.cpp +++ b/server/server/config.cpp @@ -1,5 +1,7 @@ #include "headers.h" +extern logtofile *logger; + void reload_config_thread_func(config *cfg, boost::mutex *m) { while(!boost::this_thread::interruption_requested()) @@ -7,30 +9,38 @@ void reload_config_thread_func(config *cfg, boost::mutex *m) boost::this_thread::sleep(boost::posix_time::seconds(cfg->config_reload_interval())); if(boost::this_thread::interruption_requested()) return; + m->lock(); cfg->load_vars(); cfg->load_cvars(); - m->lock(); cfg->load_proxy_list(); cfg->load_static_proxy_list(); - m->unlock(); cfg->load_firewall_list(); cfg->load_deleted_list(); cfg->load_upload_list(); cfg->load_servers_list(); + m->unlock(); } } -void speed_test_thread_func(int check_interval, std::list<config::proxy_entry>* proxy_list, std::list<config::static_proxy_entry> *static_proxy_list, const std::string& test_url, boost::mutex *m) +void speed_test_thread_func(config *cfg, int check_interval, std::list<config::proxy_entry>* proxy_list, std::list<config::static_proxy_entry> *static_proxy_list, const std::string& test_url, boost::mutex *m) { while(!boost::this_thread::interruption_requested()) { m->lock(); -// logtofile *l = new logtofile(std::string(boost::filesystem::initial_path().string() + "/proxy_test_info").c_str()); for(std::list<config::static_proxy_entry>::iterator i = static_proxy_list->begin(), end = static_proxy_list->end(); i != end; ++i) { speedtest t(test_url); -// *l<<i->host<<" "<<(int)t.test(&(*i))<<"\n"; - t.test(&(*i)); + int sp = (int)t.test(&(*i)); + if(cfg->debug()) + { + char port[10]; + snprintf(port, 9, "%d", i->port); + while(!logger) + boost::this_thread::sleep(boost::posix_time::milliseconds(200)); + logger->lock(); + *logger << time_str() << ": "<<i->host<<":"<<port<<"\tspeed: "<<sp<<"b/s\n"; + logger->unlock(); + } boost::this_thread::sleep(boost::posix_time::seconds(1)); } /* for(std::list<config::proxy_entry>::iterator i = proxy_list->begin(), end = proxy_list->end(); i != end; ++i) @@ -120,7 +130,7 @@ config::config(const char *pth): cfg_reload_thr(NULL), speed_test_thr(NULL) load_upload_list(); load_servers_list(); cfg_reload_thr = new boost::thread(boost::bind(reload_config_thread_func, this, &lists_mutex)); - speed_test_thr = new boost::thread(boost::bind(speed_test_thread_func, vars.proxy_check_interval, &proxy_list, &static_proxy_list, vars.speed_test_file_url, &lists_mutex)); + speed_test_thr = new boost::thread(boost::bind(speed_test_thread_func, this, vars.proxy_check_interval, &proxy_list, &static_proxy_list, vars.speed_test_file_url, &lists_mutex)); } const int config::get_int(const std::string& data, const char* var, int default_) { diff --git a/server/server/config.h b/server/server/config.h index edf6d1c..f19cae1 100755 --- a/server/server/config.h +++ b/server/server/config.h @@ -139,6 +139,10 @@ public: std::list<std::string> *get_deleted_list(); std::list<upload_entry> *get_upload_list(); std::list<conn_server> *get_server_list(); + boost::mutex &get_lists_mutex() + { + return lists_mutex; + } private: struct cfg_data { diff --git a/server/server/main.cpp b/server/server/main.cpp index 96af597..38ee904 100755 --- a/server/server/main.cpp +++ b/server/server/main.cpp @@ -4,14 +4,11 @@ -logtofile *logger, *dos_logger; -config *cfg; - - +logtofile *logger = NULL, *dos_logger = NULL; //session -session::session(boost::asio::io_service& io_service, boost::asio::ssl::context& context, server *serv) : socket_(io_service, context), io_service_(io_service) +session::session(boost::asio::io_service& io_service, boost::asio::ssl::context& context, server *serv) : socket_(io_service, context), io_service_(io_service), lists_mutex(serv->get_lists_mutex()), cfg(serv->get_config()) { this_sid = get_random(8); server_ = serv; @@ -199,6 +196,7 @@ void session::proto_parser(std::vector<byte>& data) data.push_back(0x13); data.push_back(0x13); data.push_back(0x01); + lists_mutex.lock(); if(!cfg->get_server_list()->empty()) { for(std::list<config::conn_server>::iterator i = cfg->get_server_list()->begin(), end = cfg->get_server_list()->end(); i != end; ++i) @@ -235,6 +233,7 @@ void session::proto_parser(std::vector<byte>& data) data.push_back('\n'); } } + lists_mutex.unlock(); data.push_back(0x14); data.push_back(0x14); write_w_response(data); @@ -282,6 +281,7 @@ void session::proto_parser(std::vector<byte>& data) data.push_back(0x13); data.push_back(0x13); data.push_back(0x02); + lists_mutex.lock(); for(std::list<config::proxy_entry>::iterator it = cfg->get_proxy_list()->begin(), end = cfg->get_proxy_list()->end(); it != end; ++it) { switch(it->type) @@ -370,6 +370,7 @@ void session::proto_parser(std::vector<byte>& data) data.push_back('"'); data.push_back(';'); } + lists_mutex.unlock(); data.push_back(0x14); data.push_back(0x14); write_w_response(data); @@ -417,6 +418,7 @@ void session::proto_parser(std::vector<byte>& data) data.push_back(0x13); data.push_back(0x13); data.push_back(0x03); + lists_mutex.lock(); for(std::list<config::static_proxy_entry>::iterator it = cfg->get_static_proxy_list()->begin(), end = cfg->get_static_proxy_list()->end(); it != end; ++it) { switch(it->type) @@ -497,6 +499,7 @@ void session::proto_parser(std::vector<byte>& data) //data.push_back('0'); //add speed here data.push_back(';'); } + lists_mutex.unlock(); data.push_back(0x14); data.push_back(0x14); write_w_response(data); @@ -544,6 +547,7 @@ void session::proto_parser(std::vector<byte>& data) data.push_back(0x13); data.push_back(0x13); data.push_back(0x04); + lists_mutex.lock(); for(std::list<std::string>::iterator it = cfg->get_firewall_list()->begin(), end = cfg->get_firewall_list()->end(); it != end; ++it) { if(!(it->empty())) @@ -551,6 +555,7 @@ void session::proto_parser(std::vector<byte>& data) data.push_back((*it)[i]); data.push_back(';'); } + lists_mutex.unlock(); data.push_back(0x14); data.push_back(0x14); write_w_response(data); @@ -598,6 +603,7 @@ void session::proto_parser(std::vector<byte>& data) data.push_back(0x13); data.push_back(0x13); data.push_back(0x05); + lists_mutex.lock(); for(std::list<config::upload_entry>::iterator it = cfg->get_upload_list()->begin(), end = cfg->get_upload_list()->end(); it != end; ++it) { /*if(!(it->source.empty())) @@ -617,6 +623,7 @@ void session::proto_parser(std::vector<byte>& data) data.push_back('0'); data.push_back(';'); } + lists_mutex.unlock(); data.push_back(0x14); data.push_back(0x14); write_w_response(data); @@ -664,6 +671,7 @@ void session::proto_parser(std::vector<byte>& data) data.push_back(0x13); data.push_back(0x13); data.push_back(0x06); + lists_mutex.lock(); for(std::list<std::string>::iterator it = cfg->get_deleted_list()->begin(), end = cfg->get_deleted_list()->end(); it != end; ++it) { if(!(it->empty())) @@ -671,6 +679,7 @@ void session::proto_parser(std::vector<byte>& data) data.push_back((*it)[i]); data.push_back(';'); } + lists_mutex.unlock(); data.push_back(0x14); data.push_back(0x14); write_w_response(data); @@ -934,7 +943,6 @@ void session::proto_parser(std::vector<byte>& data) break; } } - //ok, our data found } } } @@ -1033,7 +1041,8 @@ void session::handle_read(const boost::system::error_code& error, size_t bytes_t } //server -server::server(boost::asio::io_service& io_service, unsigned short port) : io_service_(io_service), acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string(cfg->bind_ip()), port)), context_(io_service, boost::asio::ssl::context::sslv3_server) +server::server(boost::asio::io_service& io_service, unsigned short port, config *c) : io_service_(io_service), acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string(c->bind_ip()), port)), +context_(io_service, boost::asio::ssl::context::sslv3_server), lists_mutex(c->get_lists_mutex()), cfg(c) { boost::system::error_code err; std::string b_path = boost::filesystem::initial_path().string(), tmp_path; @@ -1065,8 +1074,8 @@ server::server(boost::asio::io_service& io_service, unsigned short port) : io_se *logger << time_str()<<": Openning server key file: " << tmp_path << " " << err.message()<<"\n"; logger->unlock(); } - flood_chek = new boost::thread(boost::bind(flood_check_thread, &conns, &blacklist)); - blacklist_clean = new boost::thread(boost::bind(blacklist_clean_thread, &blacklist)); + flood_chek = new boost::thread(boost::bind(flood_check_thread, &conns, &blacklist, cfg)); + blacklist_clean = new boost::thread(boost::bind(blacklist_clean_thread, &blacklist, cfg)); session* new_session = new session(io_service_, context_, this); acceptor_.async_accept(new_session->socket(), @@ -1107,7 +1116,7 @@ void server::connections_increment(std::string ip, const std::string& l_sid) } } } -void server::flood_check_thread(std::list<conn_count> *list, std::list<std::string> *blacklist) //sort and clean blacklist ? +void server::flood_check_thread(std::list<conn_count> *list, std::list<std::string> *blacklist, config *cfg) //sort and clean blacklist ? { if(cfg->debug()) { @@ -1162,7 +1171,7 @@ void server::flood_check_thread(std::list<conn_count> *list, std::list<std::stri } } } -void server::blacklist_clean_thread(std::list<std::string> *list) +void server::blacklist_clean_thread(std::list<std::string> *list, config *cfg) { if(cfg->debug()) { @@ -1260,6 +1269,7 @@ int main(int argc, char* argv[]) std::cout<<"succesfully started\n"; #endif + config *cfg = NULL; if (!cfg_path.empty()) cfg = new config(cfg_path.c_str()); else @@ -1283,7 +1293,7 @@ int main(int argc, char* argv[]) boost::asio::io_service io_service; - server s(io_service, 13666); + server s(io_service, 13666, cfg); io_service.run(); } diff --git a/server/server/main.h b/server/server/main.h index 1ee3aca..0ebd349 100644 --- a/server/server/main.h +++ b/server/server/main.h @@ -15,6 +15,7 @@ const byte data_end [] = {0x14, 0x14}; class session; class server; +class config; class session { @@ -58,7 +59,8 @@ private: server *server_; bool blacklisted, canceled; boost::thread *killer; - boost::mutex critical_mutex; + boost::mutex critical_mutex, &lists_mutex; + config *cfg; }; struct conn_count { @@ -89,15 +91,23 @@ struct conn_count class server { public: - server(boost::asio::io_service& io_service, unsigned short port); + server(boost::asio::io_service& io_service, unsigned short port, config *cfg); ~server(); std::string get_password() const; void handle_accept(session* new_session, const boost::system::error_code& error); void connections_increment(std::string ip, const std::string& l_sid); - static void flood_check_thread(std::list<conn_count> *list, std::list<std::string> *blacklist); - static void blacklist_clean_thread(std::list<std::string> *list); + static void flood_check_thread(std::list<conn_count> *list, std::list<std::string> *blacklist, config *cfg); + static void blacklist_clean_thread(std::list<std::string> *list, config *cfg); std::list<std::string>* get_blacklist(); std::list<conn_count>* get_connections_list(); + boost::mutex &get_lists_mutex() + { + return lists_mutex; + } + config *get_config() + { + return cfg; + } private: boost::asio::io_service& io_service_; boost::asio::ip::tcp::acceptor acceptor_; @@ -105,6 +115,8 @@ private: std::list<conn_count> conns; std::list<std::string> blacklist; boost::thread *flood_chek, *blacklist_clean; + boost::mutex &lists_mutex; + config *cfg; }; #endif |