Some minor query leated changes

This commit is contained in:
WolverinDEV 2019-10-14 16:30:34 +02:00
parent e46e521e9b
commit 08ba917d02
4 changed files with 47 additions and 17 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;
} }

View File

@ -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;