Some minor query leated changes
This commit is contained in:
parent
e46e521e9b
commit
08ba917d02
@ -986,18 +986,18 @@ std::deque<std::shared_ptr<EntryBinding>> config::create_bindings() {
|
|||||||
BIND_GROUP(query);
|
BIND_GROUP(query);
|
||||||
{
|
{
|
||||||
CREATE_BINDING("nl_char", 0);
|
CREATE_BINDING("nl_char", 0);
|
||||||
BIND_STRING(config::query::newlineCharacter, "\n\r");
|
BIND_STRING(config::query::newlineCharacter, "\r\n");
|
||||||
ADD_DESCRIPTION("Change the query newline character");
|
ADD_DESCRIPTION("Change the query newline character");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
CREATE_BINDING("motd", 0);
|
CREATE_BINDING("motd", 0);
|
||||||
BIND_STRING(config::query::motd, "TeaSpeak\n\rWelcome on the TeaSpeak ServerQuery interface.\n\r");
|
BIND_STRING(config::query::motd, "TeaSpeak\r\nWelcome on the TeaSpeak ServerQuery interface.\r\n");
|
||||||
ADD_DESCRIPTION("The query welcome message");
|
ADD_DESCRIPTION("The query welcome message");
|
||||||
|
|
||||||
ADD_NOTE("If not like TeamSpeak then some applications may not recognize the Query");
|
ADD_NOTE("If not like TeamSpeak then some applications may not recognize the Query");
|
||||||
ADD_NOTE("Default TeamSpeak 3 MOTD:");
|
ADD_NOTE("Default TeamSpeak 3 MOTD:");
|
||||||
ADD_NOTE("TS3\n\rWelcome to the TeamSpeak 3 ServerQuery interface, type \"help\" for a list of commands and \"help <command>\" for information on a specific command.\n\r");
|
ADD_NOTE("TS3\r\nWelcome to the TeamSpeak 3 ServerQuery interface, type \"help\" for a list of commands and \"help <command>\" for information on a specific command.\r\n");
|
||||||
ADD_NOTE("NOTE: Sometimes you have to append one \n\r more!");
|
ADD_NOTE("NOTE: Sometimes you have to append one \r\n more!");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
CREATE_BINDING("enableSSL", 0);
|
CREATE_BINDING("enableSSL", 0);
|
||||||
|
@ -784,7 +784,7 @@ bool ConnectedClient::handleCommandFull(Command& cmd, bool disconnectOnFail) {
|
|||||||
system_clock::time_point start, end;
|
system_clock::time_point start, end;
|
||||||
start = system_clock::now();
|
start = system_clock::now();
|
||||||
#ifdef PKT_LOG_CMD
|
#ifdef PKT_LOG_CMD
|
||||||
logTrace(this->getServerId(), "{}[Command][Client -> Server] Processing command: {}", CLIENT_STR_LOG_PREFIX, cmd.build(false));
|
logTrace(this->getServerId() == 0 ? LOG_QUERY : this->getServerId(), "{}[Command][Client -> Server] Processing command: {}", CLIENT_STR_LOG_PREFIX, cmd.build(false));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CommandResult result;
|
CommandResult result;
|
||||||
|
@ -167,7 +167,7 @@ bool QueryClient::closeConnection(const std::chrono::system_clock::time_point& f
|
|||||||
this->flushThread = new threads::Thread(THREAD_SAVE_OPERATIONS | THREAD_EXECUTE_LATER, [ownLock, flushTimeout](){
|
this->flushThread = new threads::Thread(THREAD_SAVE_OPERATIONS | THREAD_EXECUTE_LATER, [ownLock, flushTimeout](){
|
||||||
while(ownLock->state == ConnectionState::DISCONNECTING && flushTimeout > system_clock::now()){
|
while(ownLock->state == ConnectionState::DISCONNECTING && flushTimeout > system_clock::now()){
|
||||||
{
|
{
|
||||||
lock_guard<threads::Mutex> l(ownLock->bufferLock);
|
std::lock_guard buffer_lock(ownLock->buffer_lock);
|
||||||
if(ownLock->readQueue.empty() && ownLock->writeQueue.empty()) break;
|
if(ownLock->readQueue.empty() && ownLock->writeQueue.empty()) break;
|
||||||
}
|
}
|
||||||
usleep(10 * 1000);
|
usleep(10 * 1000);
|
||||||
@ -192,7 +192,7 @@ void QueryClient::disconnectFinal() {
|
|||||||
lock_guard<recursive_mutex> lock_tick(this->lock_query_tick);
|
lock_guard<recursive_mutex> lock_tick(this->lock_query_tick);
|
||||||
lock_guard<recursive_mutex> lock_handle(this->lock_packet_handle);
|
lock_guard<recursive_mutex> lock_handle(this->lock_packet_handle);
|
||||||
threads::MutexLock lock_close(this->closeLock);
|
threads::MutexLock lock_close(this->closeLock);
|
||||||
threads::MutexLock lock_buffer(this->bufferLock);
|
std::unique_lock buffer_lock(this->buffer_lock, try_to_lock);
|
||||||
|
|
||||||
if(final_disconnected) {
|
if(final_disconnected) {
|
||||||
logError(LOG_QUERY, "Tried to disconnect a client twice!");
|
logError(LOG_QUERY, "Tried to disconnect a client twice!");
|
||||||
@ -247,7 +247,7 @@ void QueryClient::disconnectFinal() {
|
|||||||
|
|
||||||
void QueryClient::writeRawMessage(const std::string &message) {
|
void QueryClient::writeRawMessage(const std::string &message) {
|
||||||
{
|
{
|
||||||
threads::MutexLock lock(this->bufferLock);
|
std::lock_guard lock(this->buffer_lock);
|
||||||
this->writeQueue.push_back(message);
|
this->writeQueue.push_back(message);
|
||||||
}
|
}
|
||||||
if(this->writeEvent) event_add(this->writeEvent, nullptr);
|
if(this->writeEvent) event_add(this->writeEvent, nullptr);
|
||||||
@ -255,10 +255,12 @@ void QueryClient::writeRawMessage(const std::string &message) {
|
|||||||
|
|
||||||
void QueryClient::handleMessageWrite(int fd, short, void *) {
|
void QueryClient::handleMessageWrite(int fd, short, void *) {
|
||||||
auto ownLock = _this.lock();
|
auto ownLock = _this.lock();
|
||||||
threads::MutexTryLock lock(this->bufferLock);
|
|
||||||
|
std::unique_lock buffer_lock(this->buffer_lock, try_to_lock);
|
||||||
if(this->state == ConnectionState::DISCONNECTED) return;
|
if(this->state == ConnectionState::DISCONNECTED) return;
|
||||||
if(!lock) {
|
if(!buffer_lock.owns_lock()) {
|
||||||
if(this->writeEvent) event_add(this->writeEvent, nullptr);
|
if(this->writeEvent)
|
||||||
|
event_add(this->writeEvent, nullptr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,7 +316,13 @@ void QueryClient::handleMessageRead(int fd, short, void *) {
|
|||||||
if(length <= 0){
|
if(length <= 0){
|
||||||
if(errno == EINTR || errno == EAGAIN)
|
if(errno == EINTR || errno == EAGAIN)
|
||||||
;//event_add(this->readEvent, nullptr);
|
;//event_add(this->readEvent, nullptr);
|
||||||
else {
|
else if(length == 0 && errno == 0) {
|
||||||
|
logMessage(LOG_QUERY, "{} Connection closed. Client disconnected.", CLIENT_STR_LOG_PREFIX);
|
||||||
|
event_del_noblock(this->readEvent);
|
||||||
|
std::thread([ownLock]{
|
||||||
|
ownLock->closeConnection();
|
||||||
|
}).detach();
|
||||||
|
} else {
|
||||||
logError(LOG_QUERY, "{} Failed to read! Code: {} errno: {} message: {}", CLIENT_STR_LOG_PREFIX, length, errno, strerror(errno));
|
logError(LOG_QUERY, "{} Failed to read! Code: {} errno: {} message: {}", CLIENT_STR_LOG_PREFIX, length, errno, strerror(errno));
|
||||||
event_del_noblock(this->readEvent);
|
event_del_noblock(this->readEvent);
|
||||||
threads::Thread(THREAD_SAVE_OPERATIONS, [ownLock](){ ownLock->closeConnection(); }).detach();
|
threads::Thread(THREAD_SAVE_OPERATIONS, [ownLock](){ ownLock->closeConnection(); }).detach();
|
||||||
@ -324,7 +332,7 @@ void QueryClient::handleMessageRead(int fd, short, void *) {
|
|||||||
|
|
||||||
buffer.resize(length);
|
buffer.resize(length);
|
||||||
{
|
{
|
||||||
threads::MutexLock l(this->bufferLock);
|
std::lock_guard buffer_lock(this->buffer_lock);
|
||||||
if(this->state == ConnectionState::DISCONNECTED)
|
if(this->state == ConnectionState::DISCONNECTED)
|
||||||
return;
|
return;
|
||||||
this->readQueue.push_back(std::move(buffer));
|
this->readQueue.push_back(std::move(buffer));
|
||||||
@ -348,7 +356,7 @@ bool QueryClient::tickIOMessageProgress() {
|
|||||||
string message;
|
string message;
|
||||||
bool next = false;
|
bool next = false;
|
||||||
{
|
{
|
||||||
threads::MutexLock l(this->bufferLock);
|
std::lock_guard buffer_lock(this->buffer_lock);
|
||||||
if(this->readQueue.empty()) return false;
|
if(this->readQueue.empty()) return false;
|
||||||
message = std::move(this->readQueue.front());
|
message = std::move(this->readQueue.front());
|
||||||
this->readQueue.pop_front();
|
this->readQueue.pop_front();
|
||||||
@ -386,7 +394,7 @@ bool QueryClient::tickIOMessageProgress() {
|
|||||||
}
|
}
|
||||||
next = true;
|
next = true;
|
||||||
{
|
{
|
||||||
threads::MutexLock l(this->bufferLock);
|
std::lock_guard buffer_lock(this->buffer_lock);
|
||||||
this->readQueue.push_front(std::move(message));
|
this->readQueue.push_front(std::move(message));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -465,18 +473,40 @@ bool QueryClient::handleMessage(const pipes::buffer_view& message) {
|
|||||||
CMD_RESET_IDLE; //if idle time over 5 min than connection drop
|
CMD_RESET_IDLE; //if idle time over 5 min than connection drop
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
logTrace(LOG_QUERY, "[{}:{}] Got query command {}", this->getLoggingPeerIp(), this->getPeerPort(), command);
|
|
||||||
|
if((uint8_t) command[0] == 255) {
|
||||||
|
string commands{};
|
||||||
|
|
||||||
|
/* we got a telnet command here */
|
||||||
|
while(command.size() >= 2 && (uint8_t) command[0] == 255) {
|
||||||
|
uint8_t code = command[1];
|
||||||
|
uint8_t option = command[2];
|
||||||
|
|
||||||
|
if(!commands.empty())
|
||||||
|
commands += ", ";
|
||||||
|
commands += to_string(code) + ":" + to_string(option);
|
||||||
|
command = command.substr(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
logTrace(LOG_QUERY, "[{}:{}] Received telnet command(s): {}. Ignoring it.",this->getLoggingPeerIp(), this->getPeerPort(), commands);
|
||||||
|
CMD_RESET_IDLE;
|
||||||
|
if(command.empty())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
unique_ptr<Command> cmd;
|
unique_ptr<Command> cmd;
|
||||||
try {
|
try {
|
||||||
cmd = make_unique<Command>(Command::parse(pipes::buffer_view{(void*) command.data(), command.length()}, true, !ts::config::server::strict_ut8_mode));
|
cmd = make_unique<Command>(Command::parse(pipes::buffer_view{(void*) command.data(), command.length()}, true, !ts::config::server::strict_ut8_mode));
|
||||||
} catch(std::invalid_argument& ex) {
|
} catch(std::invalid_argument& ex) {
|
||||||
|
logTrace(LOG_QUERY, "[{}:{}] Failed to parse command (invalid argument): {}", this->getLoggingPeerIp(), this->getPeerPort(), command);
|
||||||
this->notifyError(CommandResult{findError("parameter_convert"), ex.what()});
|
this->notifyError(CommandResult{findError("parameter_convert"), ex.what()});
|
||||||
return false;
|
return false;
|
||||||
} catch(command_malformed_exception& ex) {
|
} catch(command_malformed_exception& ex) {
|
||||||
|
logTrace(LOG_QUERY, "[{}:{}] Failed to parse command (malformed command at {}): {}", this->getLoggingPeerIp(), this->getPeerPort(), ex.index(), command);
|
||||||
this->notifyError(CommandResult{findError("parameter_convert"), "invalid character @" + to_string(ex.index())});
|
this->notifyError(CommandResult{findError("parameter_convert"), "invalid character @" + to_string(ex.index())});
|
||||||
return false;
|
return false;
|
||||||
} catch(std::exception& ex) {
|
} catch(std::exception& ex) {
|
||||||
|
logTrace(LOG_QUERY, "[{}:{}] Failed to parse command (exception: {}): {}", this->getLoggingPeerIp(), this->getPeerPort(), ex.what(), command);
|
||||||
this->notifyError(CommandResult{ErrorType::VSError, ex.what()});
|
this->notifyError(CommandResult{ErrorType::VSError, ex.what()});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ namespace ts {
|
|||||||
|
|
||||||
pipes::SSL ssl_handler;
|
pipes::SSL ssl_handler;
|
||||||
|
|
||||||
threads::Mutex bufferLock;
|
std::mutex buffer_lock;
|
||||||
std::deque<std::string> writeQueue;
|
std::deque<std::string> writeQueue;
|
||||||
std::deque<std::string> readQueue;
|
std::deque<std::string> readQueue;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user