void CIpcClientProxy::send(const CIpcMessage& message) { // don't allow other threads to write until we've finished the entire // message. stream write is locked, but only for that single write. // also, don't allow the dtor to destroy the stream while we're using it. CArchMutexLock lock(m_writeMutex); LOG((CLOG_DEBUG "ipc write: %d", message.type())); switch (message.type()) { case kIpcLogLine: { const CIpcLogLineMessage& llm = static_cast<const CIpcLogLineMessage&>(message); CString logLine = llm.logLine(); CProtocolUtil::writef(&m_stream, kIpcMsgLogLine, &logLine); break; } case kIpcShutdown: CProtocolUtil::writef(&m_stream, kIpcMsgShutdown); break; default: LOG((CLOG_ERR "ipc message not supported: %d", message.type())); break; } }
void CApp::handleIpcMessage(const CEvent& e, void*) { CIpcMessage* m = static_cast<CIpcMessage*>(e.getDataObject()); if (m->type() == kIpcShutdown) { LOG((CLOG_INFO "got ipc shutdown message")); m_events->addEvent(CEvent(CEvent::kQuit)); } }
void CDaemonApp::handleIpcMessage(const CEvent& e, void*) { CIpcMessage* m = static_cast<CIpcMessage*>(e.getDataObject()); switch (m->type()) { case kIpcCommand: { CIpcCommandMessage* cm = static_cast<CIpcCommandMessage*>(m); CString command = cm->command(); LOG((CLOG_DEBUG "new command, elevate=%d command=%s", cm->elevate(), command.c_str())); CString debugArg("--debug"); UInt32 debugArgPos = static_cast<UInt32>(command.find(debugArg)); if (debugArgPos != CString::npos) { UInt32 from = debugArgPos + static_cast<UInt32>(debugArg.size()) + 1; UInt32 nextSpace = static_cast<UInt32>(command.find(" ", from)); CString logLevel(command.substr(from, nextSpace - from)); try { // change log level based on that in the command string // and change to that log level now. ARCH->setting("LogLevel", logLevel); CLOG->setFilter(logLevel.c_str()); } catch (XArch& e) { LOG((CLOG_ERR "failed to save LogLevel setting, %s", e.what().c_str())); } } try { // store command in system settings. this is used when the daemon // next starts. ARCH->setting("Command", command); // TODO: it would be nice to store bools/ints... ARCH->setting("Elevate", CString(cm->elevate() ? "1" : "0")); } catch (XArch& e) { LOG((CLOG_ERR "failed to save settings, %s", e.what().c_str())); } #if SYSAPI_WIN32 // tell the relauncher about the new command. this causes the // relauncher to stop the existing command and start the new // command. m_relauncher->command(command, cm->elevate()); #endif break; } case kIpcHello: m_ipcLogOutputter->notifyBuffer(); break; } }
void CIpcServerProxy::send(const CIpcMessage& message) { LOG((CLOG_DEBUG "ipc write: %d", message.type())); switch (message.type()) { case kIpcHello: { const CIpcHelloMessage& hm = static_cast<const CIpcHelloMessage&>(message); CProtocolUtil::writef(&m_stream, kIpcMsgHello, hm.clientType()); break; } case kIpcCommand: { const CIpcCommandMessage& cm = static_cast<const CIpcCommandMessage&>(message); CString command = cm.command(); CProtocolUtil::writef(&m_stream, kIpcMsgCommand, &command); break; } default: LOG((CLOG_ERR "ipc message not supported: %d", message.type())); break; } }
void CDaemonApp::handleIpcMessage(const CEvent& e, void*) { CIpcMessage* m = static_cast<CIpcMessage*>(e.getDataObject()); switch (m->type()) { case kIpcCommand: { CIpcCommandMessage* cm = static_cast<CIpcCommandMessage*>(m); CString command = cm->command(); // if empty quotes, clear. if (command == "\"\"") { command.clear(); } if (!command.empty()) { LOG((CLOG_DEBUG "new command, elevate=%d command=%s", cm->elevate(), command.c_str())); std::vector<CString> argsArray; CArgParser::splitCommandString(command, argsArray); CArgParser argParser(NULL); const char** argv = argParser.getArgv(argsArray); CServerArgs serverArgs; CClientArgs clientArgs; int argc = static_cast<int>(argsArray.size()); bool server = argsArray[0].find("synergys") != CString::npos ? true : false; CArgsBase* argBase = NULL; if (server) { argParser.parseServerArgs(serverArgs, argc, argv); argBase = &serverArgs; } else { argParser.parseClientArgs(clientArgs, argc, argv); argBase = &clientArgs; } delete[] argv; CString logLevel(argBase->m_logFilter); if (!logLevel.empty()) { try { // change log level based on that in the command string // and change to that log level now. ARCH->setting("LogLevel", logLevel); CLOG->setFilter(logLevel.c_str()); } catch (XArch& e) { LOG((CLOG_ERR "failed to save LogLevel setting, %s", e.what())); } } #if SYSAPI_WIN32 CString logFilename; if (argBase->m_logFile != NULL) { logFilename = CString(argBase->m_logFile); ARCH->setting("LogFilename", logFilename); m_watchdog->setFileLogOutputter(m_fileLogOutputter); command = CArgParser::assembleCommand(argsArray, "--log", 1); LOG((CLOG_DEBUG "removed log file argument and filename %s from command ", logFilename.c_str())); LOG((CLOG_DEBUG "new command, elevate=%d command=%s", cm->elevate(), command.c_str())); } else { m_watchdog->setFileLogOutputter(NULL); } m_fileLogOutputter->setLogFilename(logFilename.c_str()); #endif } else { LOG((CLOG_DEBUG "empty command, elevate=%d", cm->elevate())); } try { // store command in system settings. this is used when the daemon // next starts. ARCH->setting("Command", command); // TODO: it would be nice to store bools/ints... ARCH->setting("Elevate", CString(cm->elevate() ? "1" : "0")); } catch (XArch& e) { LOG((CLOG_ERR "failed to save settings, %s", e.what())); } #if SYSAPI_WIN32 // tell the relauncher about the new command. this causes the // relauncher to stop the existing command and start the new // command. m_watchdog->setCommand(command, cm->elevate()); #endif break; } case kIpcHello: CIpcHelloMessage* hm = static_cast<CIpcHelloMessage*>(m); CString type; switch (hm->clientType()) { case kIpcClientGui: type = "gui"; break; case kIpcClientNode: type = "node"; break; default: type = "unknown"; break; } LOG((CLOG_DEBUG "ipc hello, type=%s", type.c_str())); #if SYSAPI_WIN32 CString watchdogStatus = m_watchdog->isProcessActive() ? "ok" : "error"; LOG((CLOG_INFO "watchdog status: %s", watchdogStatus.c_str())); #endif m_ipcLogOutputter->notifyBuffer(); break; } }
void CDaemonApp::handleIpcMessage(const CEvent& e, void*) { CIpcMessage* m = static_cast<CIpcMessage*>(e.getDataObject()); switch (m->type()) { case kIpcCommand: { CIpcCommandMessage* cm = static_cast<CIpcCommandMessage*>(m); CString command = cm->command(); // if empty quotes, clear. if (command == "\"\"") { command.clear(); } if (!command.empty()) { LOG((CLOG_DEBUG "new command, elevate=%d command=%s", cm->elevate(), command.c_str())); CString debugArg("--debug"); UInt32 debugArgPos = static_cast<UInt32>(command.find(debugArg)); if (debugArgPos != CString::npos) { UInt32 from = debugArgPos + static_cast<UInt32>(debugArg.size()) + 1; UInt32 nextSpace = static_cast<UInt32>(command.find(" ", from)); CString logLevel(command.substr(from, nextSpace - from)); try { // change log level based on that in the command string // and change to that log level now. ARCH->setting("LogLevel", logLevel); CLOG->setFilter(logLevel.c_str()); } catch (XArch& e) { LOG((CLOG_ERR "failed to save LogLevel setting, %s", e.what().c_str())); } } } else { LOG((CLOG_DEBUG "empty command, elevate=%d", cm->elevate())); } try { // store command in system settings. this is used when the daemon // next starts. ARCH->setting("Command", command); // TODO: it would be nice to store bools/ints... ARCH->setting("Elevate", CString(cm->elevate() ? "1" : "0")); } catch (XArch& e) { LOG((CLOG_ERR "failed to save settings, %s", e.what().c_str())); } #if SYSAPI_WIN32 // tell the relauncher about the new command. this causes the // relauncher to stop the existing command and start the new // command. m_watchdog->setCommand(command, cm->elevate()); #endif break; } case kIpcHello: CIpcHelloMessage* hm = static_cast<CIpcHelloMessage*>(m); CString type; switch (hm->clientType()) { case kIpcClientGui: type = "gui"; break; case kIpcClientNode: type = "node"; break; default: type = "unknown"; break; } LOG((CLOG_DEBUG "ipc hello, type=%s", type.c_str())); #if SYSAPI_WIN32 CString watchdogStatus = m_watchdog->isProcessActive() ? "ok" : "error"; LOG((CLOG_INFO "watchdog status: %s", watchdogStatus.c_str())); #endif m_ipcLogOutputter->notifyBuffer(); break; } }