1 #include <iostream>
2 
3 #include "util/exception.h"
4 #include "util/thread.h"
5 
6 #include "serverlist.h"
7 #include "config.h"
8 
9 /* Static members. */
10 std::vector<ServerPtr> ServerList::list;
11 
12 /* ---------------------------------------------------------------- */
13 
14 class ServerChecker : public Thread
15 {
16   private:
17     std::vector<ServerPtr> server_list;
18   protected:
19     void* run (void);
20   public:
21     ServerChecker(std::vector<ServerPtr> const& server_list);
22 };
23 
24 /* ---------------------------------------------------------------- */
25 
ServerChecker(std::vector<ServerPtr> const & server_list)26 ServerChecker::ServerChecker(std::vector<ServerPtr> const& server_list)
27     : server_list(server_list)
28 {
29 }
30 
31 void*
run(void)32 ServerChecker::run (void)
33 {
34 
35   for (unsigned int i = 0; i < this->server_list.size(); ++i)
36   {
37     ServerPtr server = this->server_list[i];
38     try
39     {
40       if (!server->is_refreshing())
41         server->refresh();
42     }
43     catch (Exception& s)
44     {
45       std::cout << "Error getting server status: " << s << std::endl;
46     }
47   }
48 
49   delete this;
50   return 0;
51 }
52 
53 /* ================================================================ */
54 
55 void
init_from_config(void)56 ServerList::init_from_config (void)
57 {
58   ConfSectionPtr servers = Config::conf.get_section("servermonitor");
59   for (conf_values_t::iterator iter = servers->values_begin();
60       iter != servers->values_end(); iter++)
61   {
62     ServerList::add_server(iter->first.substr(2), **iter->second);
63   }
64 
65   ConfValuePtr check = Config::conf.get_value("settings.startup_servercheck");
66   if (check->get_bool())
67     ServerList::refresh();
68 }
69 
70 /* ---------------------------------------------------------------- */
71 
72 void
unload(void)73 ServerList::unload (void)
74 {
75   ServerList::list.clear();
76 }
77 
78 /* ---------------------------------------------------------------- */
79 
80 void
add_server(std::string const & name,std::string const & host,uint16_t port)81 ServerList::add_server (std::string const& name,
82     std::string const& host, uint16_t port)
83 {
84   ServerPtr server = ServerPtr(new Server(name, host, port));
85   ServerList::list.push_back(server);
86 }
87 
88 /* ---------------------------------------------------------------- */
89 
90 void
refresh(void)91 ServerList::refresh (void)
92 {
93   /* Prevents the creation of a thread if not neccessary. */
94   if (ServerList::list.size() == 0)
95     return;
96 
97   //std::cout << "Refreshing servers..." << std::endl;
98 
99   ServerChecker* checker = new ServerChecker(ServerList::list);
100   checker->pt_create();
101 }
102