summaryrefslogtreecommitdiff
path: root/modules/commands/os_logsearch.cpp
diff options
context:
space:
mode:
authorSadie Powell <sadie@witchery.services>2024-01-24 12:34:03 +0000
committerSadie Powell <sadie@witchery.services>2024-01-24 12:34:34 +0000
commit484160eb4ed560eeda97c94a42dd8e31431ab251 (patch)
tree03600af16b55fa2f268904d7a42a8b87f86c09f4 /modules/commands/os_logsearch.cpp
parent7ac1fe58478d58e2480b6919c4abf3a82929169c (diff)
Shuffle modules around a bit.
Diffstat (limited to 'modules/commands/os_logsearch.cpp')
-rw-r--r--modules/commands/os_logsearch.cpp187
1 files changed, 0 insertions, 187 deletions
diff --git a/modules/commands/os_logsearch.cpp b/modules/commands/os_logsearch.cpp
deleted file mode 100644
index 145e12b53..000000000
--- a/modules/commands/os_logsearch.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2024 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-#include "module.h"
-
-static unsigned int HARDMAX = 65536;
-
-class CommandOSLogSearch final
- : public Command
-{
- static inline Anope::string CreateLogName(const Anope::string &file, time_t t = Anope::CurTime)
- {
- char timestamp[32];
-
- tm *tm = localtime(&t);
-
- strftime(timestamp, sizeof(timestamp), "%Y%m%d", tm);
-
- return Anope::LogDir + "/" + file + "." + timestamp;
- }
-
-public:
- CommandOSLogSearch(Module *creator) : Command(creator, "operserv/logsearch", 1, 3)
- {
- this->SetDesc(_("Searches logs for a matching pattern"));
- this->SetSyntax(_("[+\037days\037d] [+\037limit\037l] \037pattern\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params) override
- {
- int days = 7, replies = 50;
-
- unsigned i;
- for (i = 0; i < params.size() && params[i][0] == '+'; ++i)
- {
- switch (params[i][params[i].length() - 1])
- {
- case 'd':
- if (params[i].length() > 2)
- {
- Anope::string dur = params[i].substr(1, params[i].length() - 2);
- try
- {
- days = convertTo<int>(dur);
- if (days <= 0)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- source.Reply(_("Invalid duration %s, using %d days."), dur.c_str(), days);
- }
- }
- break;
- case 'l':
- if (params[i].length() > 2)
- {
- Anope::string dur = params[i].substr(1, params[i].length() - 2);
- try
- {
- replies = convertTo<int>(dur);
- if (replies <= 0)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- source.Reply(_("Invalid limit %s, using %d."), dur.c_str(), replies);
- }
- }
- break;
- default:
- source.Reply(_("Unknown parameter: %s"), params[i].c_str());
- }
- }
-
- if (i >= params.size())
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- Anope::string search_string = params[i++];
- for (; i < params.size(); ++i)
- search_string += " " + params[i];
-
- Log(LOG_ADMIN, source, this) << "for " << search_string;
-
- bool wildcard = search_string.find_first_of("?*") != Anope::string::npos;
- bool regex = search_string.empty() == false && search_string[0] == '/' && search_string[search_string.length() - 1] == '/';
-
- const Anope::string &logfile_name = Config->GetModule(this->owner)->Get<const Anope::string>("logname");
- std::vector<Anope::string> matches;
- for (int d = days - 1; d >= 0; --d)
- {
- Anope::string lf_name = CreateLogName(logfile_name, Anope::CurTime - (d * 86400));
- Log(LOG_DEBUG) << "Searching " << lf_name;
- std::fstream fd(lf_name.c_str(), std::ios_base::in);
- if (!fd.is_open())
- continue;
-
- for (Anope::string buf, token; std::getline(fd, buf.str());)
- {
- bool match = false;
-
- if (regex)
- match = Anope::Match(buf, search_string, false, true);
- else if (wildcard)
- match = Anope::Match(buf, "*" + search_string + "*");
- else
- match = buf.find_ci(search_string) != Anope::string::npos;
-
- if (match)
- {
- matches.push_back(buf);
-
- if (matches.size() >= HARDMAX)
- break;
- }
- }
-
- fd.close();
- }
-
- size_t found = matches.size();
- if (!found)
- {
- source.Reply(_("No matches for \002%s\002 found."), search_string.c_str());
- return;
- }
-
- if (matches.size() >= HARDMAX)
- {
- source.Reply(_("Too many results for \002%s\002."), search_string.c_str());
- return;
- }
-
- if (matches.size() > static_cast<unsigned int>(replies))
- {
- matches.erase(matches.begin(), matches.begin() + (matches.size() - static_cast<unsigned int>(replies)));
- }
-
- source.Reply(_("Matches for \002%s\002:"), search_string.c_str());
- size_t count = 0;
- for (const auto &match : matches)
- source.Reply("#%zu: %s", ++count, match.c_str());
- source.Reply(_("Showed %zu/%zu matches for \002%s\002."), matches.size(), found, search_string.c_str());
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command searches the services logfiles for messages\n"
- "that match the given pattern. The day and limit argument\n"
- "may be used to specify how many days of logs to search\n"
- "and the number of replies to limit to. By default this\n"
- "command searches one week of logs, and limits replies\n"
- "to 50.\n"
- " \n"
- "For example:\n"
- " \002LOGSEARCH +21d +500l Anope\002\n"
- " Searches the last 21 days worth of logs for messages\n"
- " containing Anope and lists the most recent 500 of them."));
- return true;
- }
-};
-
-class OSLogSearch final
- : public Module
-{
- CommandOSLogSearch commandoslogsearch;
-
-public:
- OSLogSearch(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR),
- commandoslogsearch(this)
- {
- }
-};
-
-MODULE_INIT(OSLogSearch)