Author: soliton
Date: Fri Oct  3 04:51:33 2008
New Revision: 29819

URL: http://svn.gna.org/viewcvs/wesnoth?rev=29819&view=rev
Log:
various server command improvements

* added the banned nick to a ban when available
* made the sample command socket only and have it output the current
  value when no parameter is given
* made the status command report for all nicks with the same IP when
  using a simple nick as parameter (default for ordinary users)
* merged the samples command back into metrics
* actually allowed advertised commands for ordinary users
* removed a couple of extraneous newlines from command output
* fixed an improper name for a local variable

Modified:
    branches/1.4/src/server/ban.cpp
    branches/1.4/src/server/ban.hpp
    branches/1.4/src/server/metrics.cpp
    branches/1.4/src/server/metrics.hpp
    branches/1.4/src/server/server.cpp

Modified: branches/1.4/src/server/ban.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.4/src/server/ban.cpp?rev=29819&r1=29818&r2=29819&view=diff
==============================================================================
--- branches/1.4/src/server/ban.cpp (original)
+++ branches/1.4/src/server/ban.cpp Fri Oct  3 04:51:33 2008
@@ -34,12 +34,12 @@
 
        std::ostream& operator<<(std::ostream& o, const banned& n)
        {
-          return o << "IP: " << n.get_ip() << 
-                                       " reason: '" << n.get_reason() << 
-                                       "' end_time: " << 
n.get_human_end_time() <<
-                                       " start_time: " << 
n.get_human_start_time() <<
-                                       " issuer: " <<  n.get_who_banned();
-
+          return o << "IP: " << n.get_ip() <<
+                                       (n.get_nick().empty() ? "" : "  nick: " 
+ n.get_nick()) <<
+                                       "  reason: '" << n.get_reason() << "'"
+                                       "\nstart_time: " << 
n.get_human_start_time() <<
+                                       "  end_time: " << 
n.get_human_end_time() <<
+                                       "  issuer: " <<  n.get_who_banned();
        }
 
        bool banned_compare::operator()(const banned_ptr& a, const banned_ptr& 
b) const
@@ -115,13 +115,15 @@
                                   const time_t end_time, 
                                   const std::string& reason, 
                                   const std::string& who_banned, 
-                                  const std::string& group) : 
+                                  const std::string& group,
+                                  const std::string& nick) :
                ip_text_(ip),
                end_time_(end_time), 
                start_time_(time(0)),
                reason_(reason), 
                who_banned_(who_banned), 
-               group_(group)
+               group_(group),
+               nick_(nick)
        {
                ip_mask pair = parse_ip(ip_text_);
                ip_ = pair.first;
@@ -191,7 +193,7 @@
                        ip_ = pair.first;
                        mask_ = pair.second;
                }
-       
+               nick_ = cfg["nick"];
                if (cfg.has_attribute("end_time"))
                        end_time_       = 
lexical_cast_default<time_t>(cfg["end_time"], 0);
                if (cfg.has_attribute("start_time"))
@@ -208,6 +210,7 @@
        void banned::write(config& cfg) const
        {
                cfg["ip"]               = get_ip();
+               cfg["nick"] = get_nick();
                if (end_time_ > 0)
                {
                        std::stringstream ss;
@@ -448,7 +451,8 @@
                                                                 const time_t& 
end_time, 
                                                                 const 
std::string& reason, 
                                                                 const 
std::string& who_banned, 
-                                                                const 
std::string& group)
+                                                                const 
std::string& group,
+                                                                const 
std::string& nick)
        {
                try {
                        ban_set::iterator ban;
@@ -464,7 +468,7 @@
                }
                std::ostringstream ret;
                try {
-                       banned_ptr new_ban(new banned(ip, end_time, 
reason,who_banned, group));
+                       banned_ptr new_ban(new banned(ip, end_time, 
reason,who_banned, group, nick));
                        bans_.insert(new_ban);
                        if (end_time != 0)
                                time_queue_.push(new_ban);
@@ -564,7 +568,7 @@
                        out << "No bans set.";
                        return;
                }
-
+               out << "BAN LIST\n";
                std::set<std::string> groups;
 
                for (ban_set::const_iterator i = bans_.begin();
@@ -626,7 +630,7 @@
                }
                ban_help_ += "ban 127.0.0.1 2h20m flooded lobby\n"
                                "kban suokko 5D flooded again\n"
-                               "kban suokko Y One year ban for constant 
flooding\n";
+                               "kban suokko Y One year ban for constant 
flooding";
        }
 
        void ban_manager::load_config(const config& cfg)

Modified: branches/1.4/src/server/ban.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.4/src/server/ban.hpp?rev=29819&r1=29818&r2=29819&view=diff
==============================================================================
--- branches/1.4/src/server/ban.hpp (original)
+++ branches/1.4/src/server/ban.hpp Fri Oct  3 04:51:33 2008
@@ -71,6 +71,7 @@
                std::string reason_;
                std::string who_banned_;
                std::string group_;
+               std::string nick_;
                static const std::string who_banned_default_;
                typedef std::pair<unsigned int, unsigned int> ip_mask;
                
@@ -79,7 +80,7 @@
                banned(const std::string& ip);
 
        public:
-               banned(const std::string& ip, const time_t end_time, const 
std::string& reason, const std::string& who_banned=who_banned_default_, const 
std::string& group="");
+               banned(const std::string& ip, const time_t end_time, const 
std::string& reason, const std::string& who_banned=who_banned_default_, const 
std::string& group="", const std::string& nick="");
                banned(const config&);
 
                void read(const config&);
@@ -102,6 +103,9 @@
 
                std::string get_who_banned() const
                { return who_banned_; }
+
+               std::string get_nick() const
+               { return nick_; }
 
                bool match_group(const std::string& group) const
                { return group_ == group; }
@@ -148,7 +152,7 @@
 
                time_t parse_time(std::string time_in) const;
 
-               std::string ban(const std::string&, const time_t&, const 
std::string&, const std::string&, const std::string&);
+               std::string ban(const std::string&, const time_t&, const 
std::string&, const std::string&, const std::string&, const std::string& = "");
                void unban(std::ostringstream& os, const std::string& ip);
                void unban_group(std::ostringstream& os, const std::string& 
group);
 

Modified: branches/1.4/src/server/metrics.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.4/src/server/metrics.cpp?rev=29819&r1=29818&r2=29819&view=diff
==============================================================================
--- branches/1.4/src/server/metrics.cpp (original)
+++ branches/1.4/src/server/metrics.cpp Fri Oct  3 04:51:33 2008
@@ -104,36 +104,15 @@
 
 std::ostream& metrics::games(std::ostream& out)
 {
-       if (terminations_.empty()) return out;
+       if (terminations_.empty()) return out << "No game ended so far.";
 
        size_t n = 0;
-       out << "Games have been terminated in the following ways: \n";
+       out << "Games have been terminated in the following ways:\n";
        for(std::map<std::string,int>::const_iterator i = 
terminations_.begin(); i != terminations_.end(); ++i) {
                out << i->first << ": " << i->second << "\n";
                ++n;
        }
-       out << "Total number of games = " << n;
-
-       return out;
-}
-
-std::ostream& metrics::samples(std::ostream& out)
-{
-       if (samples_.empty()) return out;
-
-       std::vector<metrics::sample> ordered_samples = samples_;
-       std::sort(ordered_samples.begin(), ordered_samples.end(), 
compare_samples_by_time());
-
-       out << "Request types:\n";
-
-       size_t n = 0;
-       for(std::vector<metrics::sample>::const_iterator s = 
ordered_samples.begin(); s != ordered_samples.end(); ++s) {
-               out << "'" << s->name << "' called " << s->nsamples << " times "
-                       << s->parsing_time << "("<< s->max_parsing_time <<") 
parsing time, "
-                       << s->processing_time << 
"("<<s->max_processing_time<<") processing time\n";
-               ++n;
-       }
-       out << "Total number of games = " << n;
+       out << "Total number of finished games = " << n;
 
        return out;
 }
@@ -151,8 +130,30 @@
            << minutes << " minutes, " << seconds << " seconds\n"
            << met.nrequests_ << " requests serviced. " << requests_immediate
            << " (" << percent_immediate << "%) "
-           << " requests were serviced immediately\n"
-           << "longest burst of requests was " << 
met.most_consecutive_requests_;
+           << "requests were serviced immediately.\n"
+           << "longest burst of requests was: " << 
met.most_consecutive_requests_;
+
+       if (met.samples_.empty()) return out;
+
+       std::vector<metrics::sample> ordered_samples = met.samples_;
+       std::sort(ordered_samples.begin(), ordered_samples.end(), 
compare_samples_by_time());
+
+       out << "\nSampled request types:\n";
+
+       size_t n = 0;
+       size_t pa = 0;
+       size_t pr = 0;
+       for(std::vector<metrics::sample>::const_iterator s = 
ordered_samples.begin(); s != ordered_samples.end(); ++s) {
+               out << "'" << s->name << "' called " << s->nsamples << " times "
+                       << s->parsing_time << "("<< s->max_parsing_time <<") 
parsing time, "
+                       << s->processing_time << 
"("<<s->max_processing_time<<") processing time\n";
+               n += s->nsamples;
+               pa += s->parsing_time;
+               pr += s->processing_time;
+       }
+       out << "Total number of request samples = " << n << "\n"
+               << "Total parsing time = " << pa << "\n"
+               << "Total processing time = " << pr;
 
        return out;
 }

Modified: branches/1.4/src/server/metrics.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.4/src/server/metrics.hpp?rev=29819&r1=29818&r2=29819&view=diff
==============================================================================
--- branches/1.4/src/server/metrics.hpp (original)
+++ branches/1.4/src/server/metrics.hpp Fri Oct  3 04:51:33 2008
@@ -40,7 +40,6 @@
        void game_terminated(const std::string& reason);
 
        std::ostream& games(std::ostream& out);
-       std::ostream& samples(std::ostream& out);
        friend std::ostream& operator<<(std::ostream& out, metrics& met);
 
        struct sample {

Modified: branches/1.4/src/server/server.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.4/src/server/server.cpp?rev=29819&r1=29818&r2=29819&view=diff
==============================================================================
--- branches/1.4/src/server/server.cpp (original)
+++ branches/1.4/src/server/server.cpp Fri Oct  3 04:51:33 2008
@@ -846,7 +846,7 @@
        const simple_wml::string_span& command(query["type"]);
        std::ostringstream response;
        const std::string& help_msg = "Available commands are: help, games, 
metrics,"
-                       " motd, netstats [all], samples, stats, status, wml.";
+                       " motd, netstats [all], stats, status, wml.";
        if (admins_.count(sock) != 0) {
                LOG_SERVER << "Admin Command:" << "\ttype: " << command
                        << "\tIP: "<< network::ip_address(sock) 
@@ -857,8 +857,16 @@
                response << help_msg;
        } else if (command == "status") {
                response << process_command(command.to_string() + " " + 
pl->second.name(), pl->second.name());
-       } else if (command == "status " + pl->second.name() || command == 
"metrics"
-       || command == "motd" || command == "wml" || command == "netstats" || 
command == "netstats all") {
+       } else if (command == "games"
+                       || command == "metrics"
+                       || command == "motd"
+                       || command == "netstats"
+                       || command == "netstats all"
+                       || command == "sample"
+                       || command == "stats"
+                       || command == "status " + pl->second.name()
+                       || command == "wml")
+       {
                response << process_command(command.to_string(), 
pl->second.name());
        } else if (command == admin_passwd_) {
                LOG_SERVER << "New Admin recognized:" << "\tIP: "
@@ -896,11 +904,12 @@
        std::string parameters = (i == query.end() ? "" : 
std::string(i+1,query.end()));
        utils::strip(parameters);
        const std::string& help_msg = "Available commands are: ban <mask> 
[<time>] <reason>,"
-                       " bans [deleted], kick <mask>, k(ick)ban <mask> 
[<time>] <reason>,"
-                       " help, games, metrics, netstats, (lobby)msg <message>, 
motd [<message>],"
-                       " samples, stats, status [<mask>], unban <ipmask>";
-       // Shutdown and restart commands can only be issued via the socket.
-       if (command == "shut_down" && issuer_name == "*socket*") {
+                       " bans [deleted], kick <mask>, k[ick]ban <mask> 
[<time>] <reason>,"
+                       " help, games, metrics, netstats [all], [lobby]msg 
<message>, motd [<message>],"
+                       " requests, stats, status [<mask>], unban <ipmask>";
+       // Shutdown, restart and sample commands can only be issued via the 
socket.
+       if (command == "shut_down") {
+               if (issuer_name != "*socket*") return "";
                if (parameters == "now") {
                        throw network::error("shut down");
                } else {
@@ -914,7 +923,8 @@
 
                // this works in windows if using "start /B"
                // like in wesnoth MP server start code
-       } else if (command == "restart" && issuer_name == "*socket*") {
+       } else if (command == "restart") {
+               if (issuer_name != "*socket*") return "";
                if (restart_command.empty()) {
                        out << "No restart_command configured! Not restarting.";
                } else {
@@ -928,16 +938,28 @@
                        process_command("msg The server has been restarted. You 
may finish current games but can't start new ones and new players can't join 
this (old) server instance. (So if a player of your game disconnects you have 
to save, reconnect and reload the game on the new server instance. It is 
actually recommended to do that right away.)", issuer_name);
                        out << "New server started.";
                }
+       } else if (command == "sample") {
+               if (parameters.empty()) {
+                       out << "Current sample frequency: " << 
request_sample_frequency;
+                       return out.str();
+               } else if (issuer_name != "*socket*") {
+                       return "";
+               }
+               request_sample_frequency = atoi(parameters.c_str());
+               if (request_sample_frequency <= 0) {
+                       out << "Sampling turned off.";
+               } else {
+                       out << "Sampling every " << request_sample_frequency << 
" requests.";
+               }
        } else if (command == "help") {
-               out << help_msg;
+               return help_msg;
        } else if (command == "stats") {
                out << "Number of games = " << games_.size()
                        << "\nTotal number of users = " << players_.size()
                        << "\nNumber of users in the lobby = " << 
lobby_.nobservers();
+               return out.str();
        } else if (command == "metrics") {
                out << metrics_;
-       } else if (command == "samples") {
-               metrics_.samples(out);
        } else if (command == "games") {
                metrics_.games(out);
        } else if (command == "wml") {
@@ -962,22 +984,34 @@
                        }
                }
                LOG_SERVER << "<server> " + parameters + "\n";
-               out << "message '" << parameters << "' relayed to players\n";
+               out << "message '" << parameters << "' relayed to players";
        } else if (command == "status") {
-               out << "STATUS REPORT\n";
+               out << "STATUS REPORT";
+               // If a simple username is given we'll check for its IP instead.
+               if (utils::isvalid_username(parameters)) {
+                       bool found = false;
+                       for (wesnothd::player_map::const_iterator pl = 
players_.begin(); pl != players_.end(); ++pl) {
+                               if (parameters == pl->second.name().c_str()) {
+                                       parameters = 
network::ip_address(pl->first);
+                                       found = true;
+                                       break;
+                               }
+                       }
+                       if (!found) return out.str();
+               }
                for (wesnothd::player_map::const_iterator pl = 
players_.begin(); pl != players_.end(); ++pl) {
                        if (parameters == ""
-                               || 
utils::wildcard_string_match(pl->second.name(), parameters)
-                               || 
utils::wildcard_string_match(network::ip_address(pl->first), parameters)) {
+                       || 
utils::wildcard_string_match(network::ip_address(pl->first), parameters)
+                       || utils::wildcard_string_match(pl->second.name(), 
parameters)) {
                                const network::connection_stats& stats = 
network::get_connection_stats(pl->first);
                                const int time_connected = 
stats.time_connected/1000;
                                const int seconds = time_connected%60;
                                const int minutes = (time_connected/60)%60;
                                const int hours = time_connected/(60*60);
-                               out << "'" << pl->second.name() << "' @ " << 
network::ip_address(pl->first)
+                               out << "\n'" << pl->second.name() << "' @ " << 
network::ip_address(pl->first)
                                        << " connected for " << hours << ":" << 
minutes << ":" << seconds
                                        << " sent " << stats.bytes_sent << " 
bytes, received "
-                                       << stats.bytes_received << " bytes\n";
+                                       << stats.bytes_received << " bytes";
                        }
                }
        } else if (command == "bans") {
@@ -987,7 +1021,7 @@
                        ban_manager_.list_bans(out);
                }
        } else if (command == "ban" || command == "kban" || command == 
"kickban" || command == "gban") {
-               bool banned_ = false;
+               bool banned = false;
                const bool kick = (command == "kban" || command == "kickban");
                const bool group_ban = command == "gban";
                std::string::iterator first_space = 
std::find(parameters.begin(), parameters.end(), ' ');
@@ -1018,7 +1052,7 @@
                // if we find a '.' consider it an ip mask
                //! @todo  FIXME: make a proper check for valid IPs
                if (std::count(target.begin(), target.end(), '.') >= 1) {
-                       banned_ = true;
+                       banned = true;
 
                        std::string err = ban_manager_.ban(target, parsed_time, 
reason, issuer_name, group);
                        out << err;
@@ -1035,24 +1069,27 @@
                                }
                        }
                } else {
+                       bool kicked = false;
                        for (wesnothd::player_map::const_iterator pl = 
players_.begin();
                                        pl != players_.end(); ++pl)
                        {
                                if 
(utils::wildcard_string_match(pl->second.name(), target)) {
-                                       banned_ = true;
+                                       banned = true;
                                        const std::string& ip = 
network::ip_address(pl->first);
                                        if (!is_ip_banned(ip)) {
-                                               std::string err = 
ban_manager_.ban(ip,parsed_time, reason, issuer_name, group);
+                                               std::string err = 
ban_manager_.ban(ip, parsed_time, reason, issuer_name, group, target);
                                                out << err;
                                        }
                                        if (kick) {
+                                               if (kicked) out << "\n";
+                                               else kicked = true;
                                                out << "\nKicked " << 
pl->second.name() << ".";
                                                send_error(pl->first, ("You 
have been banned. Reason: " + reason).c_str());
                                                
network::queue_disconnect(pl->first);
                                        }
                                }
                        }
-                       if (!banned_) {
+                       if (!banned) {
                                out << "Nickmask '" << target << "' did not 
match, no bans set.";
                        }
                }
@@ -1063,7 +1100,7 @@
                ban_manager_.unban(out, parameters);
        } else if (command == "ungban") {
                if (parameters == "") {
-                       return "You must enter an ipmask to unban.";
+                       return "You must enter an ipmask to ungban.";
                }
                ban_manager_.unban_group(out, parameters);
        } else if (command == "kick") {
@@ -1077,8 +1114,10 @@
                                pl != players_.end(); ++pl)
                        {
                                if 
(utils::wildcard_string_match(network::ip_address(pl->first), parameters)) {
-                                       kicked = true;
-                                       out << "Kicked " << pl->second.name() 
<< ".\n";
+                                       if (kicked) out << "\n";
+                                       else kicked = true;
+                                       out << "Kicked " << pl->second.name() 
<< " ("
+                                               << 
network::ip_address(pl->first) << ").";
                                        send_error(pl->first, "You have been 
kicked.");
                                        network::queue_disconnect(pl->first);
                                }
@@ -1088,22 +1127,16 @@
                                pl != players_.end(); ++pl)
                        {
                                if 
(utils::wildcard_string_match(pl->second.name(), parameters)) {
-                                       kicked = true;
+                                       if (kicked) out << "\n";
+                                       else kicked = true;
                                        out << "Kicked " << pl->second.name() 
<< " ("
-                                               << 
network::ip_address(pl->first) << ").\n";
+                                               << 
network::ip_address(pl->first) << ").";
                                        send_error(pl->first, "You have been 
kicked.");
                                        network::queue_disconnect(pl->first);
                                }
                        }
                }
-               if (!kicked) out << "No user matched '" << parameters << "'.\n";
-       } else if(command == "sample") {
-               request_sample_frequency = atoi(parameters.c_str());
-               if(request_sample_frequency <= 0) {
-                       out << "Sampling turned off";
-               } else {
-                       out << "Sampling every " << request_sample_frequency << 
" requests\n";
-               }
+               if (!kicked) out << "No user matched '" << parameters << "'.";
        } else if (command == "motd") {
                if (parameters == "") {
                        if (motd_ != "") {


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to