mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 17:54:48 +01:00
Dep: Switch to boost process instead of old standalone version
(cherry picked from commit 524d167398)
This commit is contained in:
@@ -60,7 +60,6 @@ target_include_directories(common
|
||||
|
||||
target_link_libraries(common
|
||||
PRIVATE
|
||||
process
|
||||
trinity-core-interface
|
||||
PUBLIC
|
||||
argon2
|
||||
|
||||
@@ -24,10 +24,15 @@
|
||||
|
||||
#include <boost/algorithm/string/join.hpp>
|
||||
#include <boost/iostreams/copy.hpp>
|
||||
#include <boost/process.hpp>
|
||||
#include <boost/process/args.hpp>
|
||||
#include <boost/process/child.hpp>
|
||||
#include <boost/process/env.hpp>
|
||||
#include <boost/process/exe.hpp>
|
||||
#include <boost/process/io.hpp>
|
||||
#include <boost/process/pipe.hpp>
|
||||
#include <boost/process/search_path.hpp>
|
||||
|
||||
using namespace boost::process;
|
||||
using namespace boost::process::initializers;
|
||||
using namespace boost::iostreams;
|
||||
|
||||
namespace Trinity
|
||||
@@ -48,7 +53,10 @@ public:
|
||||
|
||||
std::streamsize write(char const* str, std::streamsize size)
|
||||
{
|
||||
callback_(std::string(str, size));
|
||||
std::string consoleStr(str, size);
|
||||
std::string utf8;
|
||||
if (consoleToUtf8(consoleStr, utf8))
|
||||
callback_(utf8);
|
||||
return size;
|
||||
}
|
||||
};
|
||||
@@ -62,62 +70,60 @@ auto MakeTCLogSink(T&& callback)
|
||||
|
||||
template<typename T>
|
||||
static int CreateChildProcess(T waiter, std::string const& executable,
|
||||
std::vector<std::string> const& args,
|
||||
std::vector<std::string> const& argsVector,
|
||||
std::string const& logger, std::string const& input,
|
||||
bool secure)
|
||||
{
|
||||
auto outPipe = create_pipe();
|
||||
auto errPipe = create_pipe();
|
||||
|
||||
Optional<file_descriptor_source> inputSource;
|
||||
ipstream outStream;
|
||||
ipstream errStream;
|
||||
|
||||
if (!secure)
|
||||
{
|
||||
TC_LOG_TRACE(logger, "Starting process \"%s\" with arguments: \"%s\".",
|
||||
executable.c_str(), boost::algorithm::join(args, " ").c_str());
|
||||
executable.c_str(), boost::algorithm::join(argsVector, " ").c_str());
|
||||
}
|
||||
|
||||
// Start the child process
|
||||
child c = [&]
|
||||
child c = [&]()
|
||||
{
|
||||
if (!input.empty())
|
||||
{
|
||||
inputSource = file_descriptor_source(input);
|
||||
|
||||
// With binding stdin
|
||||
return execute(run_exe(boost::filesystem::absolute(executable)),
|
||||
set_args(args),
|
||||
inherit_env(),
|
||||
bind_stdin(*inputSource),
|
||||
bind_stdout(file_descriptor_sink(outPipe.sink, close_handle)),
|
||||
bind_stderr(file_descriptor_sink(errPipe.sink, close_handle)));
|
||||
return child{
|
||||
exe = boost::filesystem::absolute(executable).string(),
|
||||
args = argsVector,
|
||||
env = environment(boost::this_process::environment()),
|
||||
std_in = input,
|
||||
std_out = outStream,
|
||||
std_err = errStream
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
// Without binding stdin
|
||||
return execute(run_exe(boost::filesystem::absolute(executable)),
|
||||
set_args(args),
|
||||
inherit_env(),
|
||||
bind_stdout(file_descriptor_sink(outPipe.sink, close_handle)),
|
||||
bind_stderr(file_descriptor_sink(errPipe.sink, close_handle)));
|
||||
return child{
|
||||
exe = boost::filesystem::absolute(executable).string(),
|
||||
args = argsVector,
|
||||
env = environment(boost::this_process::environment()),
|
||||
std_in = boost::process::close,
|
||||
std_out = outStream,
|
||||
std_err = errStream
|
||||
};
|
||||
}
|
||||
}();
|
||||
|
||||
file_descriptor_source outFd(outPipe.source, close_handle);
|
||||
file_descriptor_source errFd(errPipe.source, close_handle);
|
||||
|
||||
auto outInfo = MakeTCLogSink([&](std::string msg)
|
||||
auto outInfo = MakeTCLogSink([&](std::string const& msg)
|
||||
{
|
||||
TC_LOG_INFO(logger, "%s", msg.c_str());
|
||||
});
|
||||
|
||||
auto outError = MakeTCLogSink([&](std::string msg)
|
||||
auto outError = MakeTCLogSink([&](std::string const& msg)
|
||||
{
|
||||
TC_LOG_ERROR(logger, "%s", msg.c_str());
|
||||
});
|
||||
|
||||
copy(outFd, outInfo);
|
||||
copy(errFd, outError);
|
||||
copy(outStream, outInfo);
|
||||
copy(errStream, outError);
|
||||
|
||||
// Call the waiter in the current scope to prevent
|
||||
// the streams from closing too early on leaving the scope.
|
||||
@@ -129,9 +135,6 @@ static int CreateChildProcess(T waiter, std::string const& executable,
|
||||
executable.c_str(), result);
|
||||
}
|
||||
|
||||
if (inputSource)
|
||||
inputSource->close();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -142,7 +145,8 @@ int StartProcess(std::string const& executable, std::vector<std::string> const&
|
||||
{
|
||||
try
|
||||
{
|
||||
return wait_for_exit(c);
|
||||
c.wait();
|
||||
return c.exit_code();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
@@ -190,7 +194,8 @@ public:
|
||||
|
||||
try
|
||||
{
|
||||
result = wait_for_exit(c);
|
||||
c.wait();
|
||||
result = c.exit_code();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
@@ -224,7 +229,7 @@ public:
|
||||
was_terminated = true;
|
||||
try
|
||||
{
|
||||
terminate(my_child->get());
|
||||
my_child->get().terminate();
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
@@ -249,7 +254,7 @@ std::string SearchExecutableInPath(std::string const& filename)
|
||||
{
|
||||
try
|
||||
{
|
||||
return search_path(filename);
|
||||
return search_path(filename).string();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
||||
@@ -416,7 +416,7 @@ bool Utf8toWStr(const std::string& utf8str, std::wstring& wstr)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WStrToUtf8(wchar_t* wstr, size_t size, std::string& utf8str)
|
||||
bool WStrToUtf8(wchar_t const* wstr, size_t size, std::string& utf8str)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
@@ -122,7 +122,7 @@ inline bool Utf8toWStr(const std::string& utf8str, wchar_t* wstr, size_t& wsize)
|
||||
|
||||
TC_COMMON_API bool WStrToUtf8(std::wstring const& wstr, std::string& utf8str);
|
||||
// size==real string size
|
||||
TC_COMMON_API bool WStrToUtf8(wchar_t* wstr, size_t size, std::string& utf8str);
|
||||
TC_COMMON_API bool WStrToUtf8(wchar_t const* wstr, size_t size, std::string& utf8str);
|
||||
|
||||
// set string to "" if invalid utf8 sequence
|
||||
TC_COMMON_API size_t utf8length(std::string& utf8str);
|
||||
|
||||
@@ -364,46 +364,43 @@ void DBUpdater<T>::ApplyFile(DatabaseWorkerPool<T>& pool, std::string const& hos
|
||||
Path const& path)
|
||||
{
|
||||
std::vector<std::string> args;
|
||||
args.reserve(8);
|
||||
|
||||
// args[0] represents the program name
|
||||
args.push_back("mysql");
|
||||
args.reserve(7);
|
||||
|
||||
// CLI Client connection info
|
||||
args.push_back("-h" + host);
|
||||
args.push_back("-u" + user);
|
||||
args.emplace_back("-h" + host);
|
||||
args.emplace_back("-u" + user);
|
||||
|
||||
if (!password.empty())
|
||||
args.push_back("-p" + password);
|
||||
args.emplace_back("-p" + password);
|
||||
|
||||
// Check if we want to connect through ip or socket (Unix only)
|
||||
#ifdef _WIN32
|
||||
|
||||
if (host == ".")
|
||||
args.push_back("--protocol=PIPE");
|
||||
args.emplace_back("--protocol=PIPE");
|
||||
else
|
||||
args.push_back("-P" + port_or_socket);
|
||||
args.emplace_back("-P" + port_or_socket);
|
||||
|
||||
#else
|
||||
|
||||
if (!std::isdigit(port_or_socket[0]))
|
||||
{
|
||||
// We can't check if host == "." here, because it is named localhost if socket option is enabled
|
||||
args.push_back("-P0");
|
||||
args.push_back("--protocol=SOCKET");
|
||||
args.push_back("-S" + port_or_socket);
|
||||
args.emplace_back("-P0");
|
||||
args.emplace_back("--protocol=SOCKET");
|
||||
args.emplace_back("-S" + port_or_socket);
|
||||
}
|
||||
else
|
||||
// generic case
|
||||
args.push_back("-P" + port_or_socket);
|
||||
args.emplace_back("-P" + port_or_socket);
|
||||
|
||||
#endif
|
||||
|
||||
// Set the default charset to utf8
|
||||
args.push_back("--default-character-set=utf8");
|
||||
args.emplace_back("--default-character-set=utf8");
|
||||
|
||||
// Set max allowed packet to 1 GB
|
||||
args.push_back("--max-allowed-packet=1GB");
|
||||
args.emplace_back("--max-allowed-packet=1GB");
|
||||
|
||||
#if !defined(MARIADB_VERSION_ID) && MYSQL_VERSION_ID >= 80000
|
||||
|
||||
@@ -413,13 +410,13 @@ void DBUpdater<T>::ApplyFile(DatabaseWorkerPool<T>& pool, std::string const& hos
|
||||
#else
|
||||
|
||||
if (ssl == "ssl")
|
||||
args.push_back("--ssl");
|
||||
args.emplace_back("--ssl");
|
||||
|
||||
#endif
|
||||
|
||||
// Database
|
||||
if (!database.empty())
|
||||
args.push_back(database);
|
||||
args.emplace_back(database);
|
||||
|
||||
// Invokes a mysql process which doesn't leak credentials to logs
|
||||
int const ret = Trinity::StartProcess(DBUpdaterUtil::GetCorrectedMySQLExecutable(), args,
|
||||
|
||||
@@ -371,7 +371,6 @@ static int InvokeCMakeCommand(T&&... args)
|
||||
{
|
||||
auto const executable = BuiltInConfig::GetCMakeCommand();
|
||||
return Trinity::StartProcess(executable, {
|
||||
executable,
|
||||
std::forward<T>(args)...
|
||||
}, "scripts.hotswap");
|
||||
}
|
||||
@@ -382,7 +381,6 @@ static std::shared_ptr<Trinity::AsyncProcessResult> InvokeAsyncCMakeCommand(T&&.
|
||||
{
|
||||
auto const executable = BuiltInConfig::GetCMakeCommand();
|
||||
return Trinity::StartAsyncProcess(executable, {
|
||||
executable,
|
||||
std::forward<T>(args)...
|
||||
}, "scripts.hotswap");
|
||||
}
|
||||
@@ -1361,7 +1359,7 @@ private:
|
||||
return;
|
||||
|
||||
TC_LOG_INFO("scripts.hotswap", ">> Found outdated CMAKE_INSTALL_PREFIX (\"%s\"), "
|
||||
"worldserver is currently installed at %s...",
|
||||
"worldserver is currently installed at %s",
|
||||
value.generic_string().c_str(), current_path.generic_string().c_str());
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user