diff options
author | Wushin <pasekei@gmail.com> | 2015-05-06 13:02:01 -0500 |
---|---|---|
committer | Wushin <pasekei@gmail.com> | 2015-05-06 13:02:01 -0500 |
commit | 405617e7ef885d0bc93c48a83634b6bbe8557044 (patch) | |
tree | 4f8338e85a3f4ed0ca4fc0a145a9911afed1b403 /src | |
parent | 429109175adfcdc521eaacd1cbf66ced0bf2029d (diff) | |
parent | 53a91a3fbf0929a99abcdfea23126f978c3ce71a (diff) | |
download | tmwa-405617e7ef885d0bc93c48a83634b6bbe8557044.tar.gz tmwa-405617e7ef885d0bc93c48a83634b6bbe8557044.tar.bz2 tmwa-405617e7ef885d0bc93c48a83634b6bbe8557044.tar.xz tmwa-405617e7ef885d0bc93c48a83634b6bbe8557044.zip |
Merge pull request #76 from wushin/remove-monitor
Remove tmwa-monitor
Diffstat (limited to 'src')
-rw-r--r-- | src/monitor/fwd.hpp | 37 | ||||
-rw-r--r-- | src/monitor/globals.cpp | 33 | ||||
-rw-r--r-- | src/monitor/globals.hpp | 33 | ||||
-rw-r--r-- | src/monitor/main.cpp | 243 |
4 files changed, 0 insertions, 346 deletions
diff --git a/src/monitor/fwd.hpp b/src/monitor/fwd.hpp deleted file mode 100644 index 6900e8e..0000000 --- a/src/monitor/fwd.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -// monitor/fwd.hpp - list of type names for monitor nonserver -// -// Copyright © 2014 Ben Longbons <b.r.longbons@gmail.com> -// -// This file is part of The Mana World (Athena server) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -#include "../sanity.hpp" - -#include "../strings/fwd.hpp" // rank 1 -#include "../io/fwd.hpp" // rank 4 -#include "../net/fwd.hpp" // rank 5 -#include "../mmo/fwd.hpp" // rank 6 -#include "../high/fwd.hpp" // rank 9 -// monitor/fwd.hpp is rank ∞ because it is an executable - - -namespace tmwa -{ -namespace monitor -{ - struct MonitorConf; -} // namespace monitor -} // namespace tmwa diff --git a/src/monitor/globals.cpp b/src/monitor/globals.cpp deleted file mode 100644 index 49e814d..0000000 --- a/src/monitor/globals.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "globals.hpp" -// globals.cpp - Evil global variables for tmwa-monitor. -// -// Copyright © 2014 Ben Longbons <b.r.longbons@gmail.com> -// -// This file is part of The Mana World (Athena server) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -#include "monitor_conf.hpp" - -#include "../poison.hpp" - - -namespace tmwa -{ - namespace monitor - { - MonitorConf monitor_conf; - pid_t pid_login, pid_char, pid_map; - } // namespace monitor -} // namespace tmwa diff --git a/src/monitor/globals.hpp b/src/monitor/globals.hpp deleted file mode 100644 index aa797d3..0000000 --- a/src/monitor/globals.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -// globals.hpp - Evil global variables for tmwa-monitor. -// -// Copyright © 2014 Ben Longbons <b.r.longbons@gmail.com> -// -// This file is part of The Mana World (Athena server) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -#include "fwd.hpp" - -#include <sys/types.h> - - -namespace tmwa -{ - namespace monitor - { - extern MonitorConf monitor_conf; - extern pid_t pid_login, pid_char, pid_map; - } // namespace monitor -} // namespace tmwa diff --git a/src/monitor/main.cpp b/src/monitor/main.cpp deleted file mode 100644 index f21a4a7..0000000 --- a/src/monitor/main.cpp +++ /dev/null @@ -1,243 +0,0 @@ -// monitor/main.cpp - Old daemon to restart servers when they crashed. -// -// Copyright © ???? Bartosz Waszak <waszi@evil.org.pl> -// Copyright © 2011-2014 Ben Longbons <b.r.longbons@gmail.com> -// -// This file is part of The Mana World (Athena server) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -#include <sys/wait.h> - -#include <fcntl.h> -#include <unistd.h> - -#include <csignal> -#include <cstdlib> - -#include "../strings/mstring.hpp" -#include "../strings/astring.hpp" -#include "../strings/zstring.hpp" -#include "../strings/xstring.hpp" -#include "../strings/literal.hpp" - -#include "../io/cxxstdio.hpp" -#include "../io/fd.hpp" -#include "../io/line.hpp" - -#include "../mmo/config_parse.hpp" -#include "../mmo/version.hpp" - -#include "../net/timestamp-utils.hpp" - -#include "globals.hpp" -#include "monitor_conf.hpp" - -#include "../poison.hpp" - - -namespace tmwa -{ -namespace monitor -{ -static -AString make_path(XString base, XString path) -{ - MString m; - m += base; - m += '/'; - m += path; - return AString(m); -} - -static -pid_t start_process(ZString exec) -{ - const char *args[2] = {exec.c_str(), nullptr}; - pid_t pid = fork(); - if (pid == -1) - { - FPRINTF(stderr, "Failed to fork"_fmt); - return 0; - } - if (pid == 0) - { - DIAG_PUSH(); - DIAG_I(cast_qual); - execv(exec.c_str(), const_cast<char **>(args)); - DIAG_POP(); - perror("Failed to exec"); - kill(getppid(), SIGABRT); - exit(1); - } - return pid; -} - -// Kill all children with the same signal we got, then ourself. -static -void stop_process(int sig) -{ - if (pid_login) - kill(pid_login, sig); - if (pid_char) - kill(pid_char, sig); - if (pid_map) - kill(pid_map, sig); - DIAG_PUSH(); - DIAG_I(old_style_cast); - DIAG_I(zero_as_null_pointer_constant); - signal(sig, SIG_DFL); - DIAG_POP(); - raise(sig); -} - -static -bool monitor_config(io::Spanned<XString> key, io::Spanned<ZString> value) -{ - return parse_monitor_conf(monitor_conf, key, value); -} - -static -bool monitor_confs(io::Spanned<XString> key, io::Spanned<ZString> value) -{ - if (key.data == "monitor_conf"_s) - { - return load_config_file(value.data, monitor_config); - } - key.span.error("Unknown meta-key for monitor nonserver"_s); - return false; -} -} // namespace monitor -} // namespace tmwa - -int main(int argc, char *argv[]) -{ - using namespace tmwa; - using namespace tmwa::monitor; - // These are all the signals we are likely to get - // The shell handles stop/cont - signal(SIGTERM, stop_process); - signal(SIGINT, stop_process); - signal(SIGQUIT, stop_process); - signal(SIGABRT, stop_process); - - monitor_conf.workdir = make_path(ZString(strings::really_construct_from_a_pointer, getenv("HOME"), nullptr), "tmwserver"_s); - - ZString argv0 = ZString(strings::really_construct_from_a_pointer, argv[0], nullptr); - bool loaded_config_yet = false; - bool runflag = true; - - for (int ai = 1; ai < argc; ++ai) - { - ZString argvi = ZString(strings::really_construct_from_a_pointer, argv[ai], nullptr); - if (argvi.startswith('-')) - { - if (argvi == "--help"_s) - { - PRINTF("Usage: %s [--help] [--version] [files...]\n"_fmt, - argv0); - exit(0); - } - else if (argvi == "--version"_s) - { - PRINTF("%s\n"_fmt, CURRENT_VERSION_STRING); - exit(0); - } - else - { - FPRINTF(stderr, "Unknown argument: %s\n"_fmt, argvi); - runflag = false; - } - } - else - { - loaded_config_yet = true; - runflag &= load_config_file(argvi, monitor_confs); - } - } - - if (!loaded_config_yet) - runflag &= load_config_file("conf/tmwa-monitor.conf"_s, monitor_confs); - - if (!runflag) - exit(1); - - if (chdir(monitor_conf.workdir.c_str()) < 0) - { - perror("Failed to change directory"); - exit(1); - } - - PRINTF("Starting:\n"_fmt); - PRINTF("* workdir: %s\n"_fmt, monitor_conf.workdir); - PRINTF("* login_server: %s\n"_fmt, monitor_conf.login_server); - PRINTF("* char_server: %s\n"_fmt, monitor_conf.char_server); - PRINTF("* map_server: %s\n"_fmt, monitor_conf.map_server); - { - //make sure all possible file descriptors are free for use by the servers - //if there are file descriptors higher than the max open from before the limit dropped, that's not our problem - io::FD fd = io::FD::sysconf_SC_OPEN_MAX(); - while ((fd = fd.prev()) > io::FD::stderr()) - { - if (fd.close() == 0) - FPRINTF(stderr, "close fd %d\n"_fmt, fd.uncast_dammit()); - } - fd = io::FD::open("/dev/null"_s, O_RDWR); - if (fd == io::FD()) - { - perror("open /dev/null"); - exit(1); - } - fd.dup2(io::FD::stdin()); - fd.dup2(io::FD::stdout()); - fd.close(); - } - while (1) - { - // write stuff to stderr - timestamp_seconds_buffer timestamp; - stamp_time(timestamp); - - if (!pid_login) - { - pid_login = start_process(monitor_conf.login_server); - FPRINTF(stderr, "[%s] forked login server: %lu\n"_fmt, - timestamp, static_cast<unsigned long>(pid_login)); - } - if (!pid_char) - { - pid_char = start_process(monitor_conf.char_server); - FPRINTF(stderr, "[%s] forked char server: %lu\n"_fmt, - timestamp, static_cast<unsigned long>(pid_char)); - } - if (!pid_map) - { - pid_map = start_process(monitor_conf.map_server); - FPRINTF(stderr, "[%s] forked map server: %lu\n"_fmt, - timestamp, static_cast<unsigned long>(pid_map)); - } - pid_t dead = wait(nullptr); - if (dead == -1) - { - perror("Failed to wait for child"); - exit(1); - } - if (pid_login == dead) - pid_login = 0; - if (pid_char == dead) - pid_char = 0; - if (pid_map == dead) - pid_map = 0; - } -} |