📄 stafprocessservice.cpp
字号:
/*****************************************************************************//* Software Testing Automation Framework (STAF) *//* (C) Copyright IBM Corp. 2001, 2004, 2005 *//* *//* This software is licensed under the Common Public License (CPL) V1.0. *//*****************************************************************************/#include "STAF.h"#include <deque>#include "STAF_iostream.h"#include "STAF_fstream.h"#include "STAFString.h"#include "STAFProc.h"#include "STAFProcUtil.h"#include "STAFException.h"#include "STAFProcessService.h"#include "STAFProcess.h"#include "STAFHandleManager.h"#include "STAFVariablePool.h"#include "STAFUtil.h"#include "STAFThreadManager.h"#include "STAFTrace.h"#include "STAFInternalProcess.h"STAFProcessAuthenticationMode_t STAFProcessService::fAuthMode = kSTAFProcessAuthDisabled;STAFProcessStopMethod_t STAFProcessService::fDefaultStopMethod = kSTAFProcessStopWithSigKill;STAFProcessDisabledAuthAction_t STAFProcessService::fAuthAction = kSTAFProcessDisabledAuthIgnore;STAFProcessConsoleFocus_t STAFProcessService::fDefaultConsoleFocus = kSTAFProcessBackground;STAFString STAFProcessService::fDefaultAuthUsername;STAFString STAFProcessService::fDefaultAuthPassword;STAFString STAFProcessService::fDefaultShellCommand;STAFString STAFProcessService::fDefaultSameConsoleShell;STAFString STAFProcessService::fDefaultNewConsoleShell;STAFString STAFProcessService::fTempDirectory;STAFEventSem STAFProcessService::fNotifySem;STAFProcessService::ProcessPtr STAFProcessService::fNotifyProcess;unsigned int STAFProcessService::fEnvVarCaseSensitive = 1;static STAFMutexSem sDefaultStopUsingSem;static STAFMutexSem sDefaultConsoleModeSem;static STAFMutexSem sDefaultConsoleFocusSem;static STAFMutexSem sProcessAuthModeSem;static STAFMutexSem sDefaultAuthUsernameSem;static STAFMutexSem sDefaultAuthPasswordSem;static STAFMutexSem sDefaultAuthDisabledActionSem;static STAFMutexSem sDefaultShellSem;static STAFMutexSem sDefaultNewConsoleShellSem;static STAFMutexSem sDefaultSameConsoleShellSem;static STAFMutexSem sTempDirectorySem;static const STAFString sNew = "New";static const STAFString sSame = "Same";// Note: This is a mild hack to allow the callback routine to work.// In a perfect world, this class (and all the Service classes) would// be Singletons and I would create a more generic callback mechanism.static STAFProcessService *processService = 0;STAFServiceResult readFileIntoString(const STAFString &file){ fstream inFile(file.toCurrentCodePage()->buffer(), ios::in | STAF_ios_binary); if (!inFile) return STAFServiceResult(kSTAFFileOpenError, file); // Figure out how big the file is inFile.seekg(0, ios::end); unsigned int fileLength = (unsigned int)inFile.tellg(); // Initialize the output buffer and read in the file STAFRefPtr<char> buffer(new char[fileLength], STAFRefPtr<char>::INIT, STAFRefPtr<char>::ARRAY); inFile.seekg(0, ios::beg); inFile.read(buffer, fileLength); return STAFServiceResult(kSTAFOk, STAFString(buffer, fileLength));}STAFServiceResult deleteTempFile(const STAFString &tempFileName){ STAFRC_t rc = kSTAFBaseOSError; unsigned int osRC = 0; STAFString errorBuffer = STAFString(""); unsigned int retryAttempts = 10; // Retry to delete the temporary file up to 10 times until successful // because sometimes the file is still in use (OSRC=32 on Windows) for (unsigned int i = 1; (rc != kSTAFOk) && (i <= retryAttempts); ++i) { try { rc = STAFFSPath(tempFileName).getEntry()->remove(&osRC); if (rc != kSTAFOk) { if (i == retryAttempts) { errorBuffer = STAFString("STAFProcessService::deleteTempFile()" " - Failed for " + tempFileName + " with OSRC " + osRC); STAFTrace::trace(kSTAFTraceWarning, errorBuffer); } else { // Sleep a short time before retrying to delete the file STAFThreadManager::sleepCurrentThread(500); } } } catch (STAFException &se) { // Don't retry deleting the temp file rc = kSTAFBaseOSError; errorBuffer = STAFString("STAFProcessService::deleteTempFile()" " - Failed for " + tempFileName + " Text: " + se.getText()); STAFTrace::trace(kSTAFTraceWarning, errorBuffer); } catch (...) { // Don't retry deleting the temp file rc = kSTAFBaseOSError; errorBuffer = STAFString("STAFProcessService::deleteTempFile()" " - Caught unknown exception deleting " + tempFileName); STAFTrace::trace(kSTAFTraceWarning, errorBuffer); } } return STAFServiceResult(rc, errorBuffer);}STAFProcessService::STAFProcessService() : STAFService("PROCESS"){ processService = this; // START options fStartParser.addOption("START", 1, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("WORKLOAD", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("COMMAND", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("PARMS", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("SHELL", 1, STAFCommandParser::kValueAllowed); fStartParser.addOption("WORKDIR", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("TITLE", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("WAIT", 1, STAFCommandParser::kValueAllowed); fStartParser.addOption("ASYNC", 1, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("VAR", 0, STAFCommandParser::kValueRequired); fStartParser.addOption("ENV", 0, STAFCommandParser::kValueRequired); fStartParser.addOption("USEPROCESSVARS", 0, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("NOTIFY", 1, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("ONEND", 1, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("NAME", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("HANDLE", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("MACHINE", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("PRIORITY", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("KEY", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("STOPUSING", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("NEWCONSOLE", 1, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("SAMECONSOLE", 1, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("FOCUS", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("USERNAME", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("PASSWORD", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("STDIN", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("STDOUT", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("STDERR", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("STDOUTAPPEND", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("STDERRAPPEND", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("STDERRTOSTDOUT", 0, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("DISABLEDAUTHISERROR", 0, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("IGNOREDISABLEDAUTH", 0, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("STATICHANDLENAME", 1, STAFCommandParser::kValueRequired); fStartParser.addOption("RETURNSTDOUT", 1, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("RETURNSTDERR", 1, STAFCommandParser::kValueNotAllowed); fStartParser.addOption("RETURNFILE", 0, STAFCommandParser::kValueRequired); // START option groups fStartParser.addOptionGroup("COMMAND", 1, 1); fStartParser.addOptionGroup("WAIT ASYNC", 0, 1); fStartParser.addOptionGroup("HANDLE NAME", 0, 1); fStartParser.addOptionGroup("NEWCONSOLE SAMECONSOLE", 0, 1); fStartParser.addOptionGroup("DISABLEDAUTHISERROR IGNOREDISABLEDAUTH", 0, 1); fStartParser.addOptionGroup("STDOUT STDOUTAPPEND", 0, 1); fStartParser.addOptionGroup("STDERR STDERRAPPEND STDERRTOSTDOUT", 0, 1); // START option needs fStartParser.addOptionNeed("NOTIFY", "ONEND"); fStartParser.addOptionNeed("PASSWORD", "USERNAME"); fStartParser.addOptionNeed("NAME HANDLE MACHINE PRIORITY KEY", "NOTIFY"); fStartParser.addOptionNeed("STDERRTOSTDOUT", "STDOUT STDOUTAPPEND RETURNSTDOUT"); // QUERY options fQueryParser.addOption("QUERY", 1, STAFCommandParser::kValueNotAllowed); fQueryParser.addOption("FREE", 1, STAFCommandParser::kValueNotAllowed); fQueryParser.addOption("WORKLOAD", 1, STAFCommandParser::kValueRequired); fQueryParser.addOption("HANDLE", 1, STAFCommandParser::kValueRequired); // QUERY groups fQueryParser.addOptionGroup("HANDLE", 1, 1); // FREE options fFreeParser.addOption("FREE", 1, STAFCommandParser::kValueNotAllowed); fFreeParser.addOption("WORKLOAD", 1, STAFCommandParser::kValueRequired); fFreeParser.addOption("HANDLE", 1, STAFCommandParser::kValueRequired); fFreeParser.addOption("ALL", 1, STAFCommandParser::kValueNotAllowed); // FREE groups fFreeParser.addOptionGroup("HANDLE WORKLOAD ALL", 1, 1); // STOP options fStopParser.addOption("STOP", 1, STAFCommandParser::kValueNotAllowed); fStopParser.addOption("WORKLOAD", 1, STAFCommandParser::kValueRequired); fStopParser.addOption("HANDLE", 1, STAFCommandParser::kValueRequired); fStopParser.addOption("ALL", 1, STAFCommandParser::kValueNotAllowed); fStopParser.addOption("CONFIRM", 1, STAFCommandParser::kValueNotAllowed); fStopParser.addOption("USING", 1, STAFCommandParser::kValueRequired); // STOP needs fStopParser.addOptionNeed("ALL", "CONFIRM"); // NOTIFY registration options fNotifyRegistrationParser.addOption("NOTIFY", 1, STAFCommandParser::kValueNotAllowed); fNotifyRegistrationParser.addOption("REGISTER", 1, STAFCommandParser::kValueNotAllowed); fNotifyRegistrationParser.addOption("UNREGISTER", 1, STAFCommandParser::kValueNotAllowed); fNotifyRegistrationParser.addOption("ONENDOFHANDLE", 1, STAFCommandParser::kValueRequired); fNotifyRegistrationParser.addOption("NAME", 1, STAFCommandParser::kValueRequired); fNotifyRegistrationParser.addOption("HANDLE", 1, STAFCommandParser::kValueRequired); fNotifyRegistrationParser.addOption("MACHINE", 1, STAFCommandParser::kValueRequired); fNotifyRegistrationParser.addOption("PRIORITY", 1, STAFCommandParser::kValueRequired); // NOTIFY registration groups fNotifyRegistrationParser.addOptionGroup("ONENDOFHANDLE", 1, 1); fNotifyRegistrationParser.addOptionGroup("HANDLE NAME", 0, 1); // NOTIFY LIST options fNotifyListParser.addOption("NOTIFY", 1, STAFCommandParser::kValueNotAllowed); fNotifyListParser.addOption("LIST", 1, STAFCommandParser::kValueNotAllowed); fNotifyListParser.addOption("ONENDOFHANDLE", 1, STAFCommandParser::kValueRequired); // NOTIFY LIST groups fNotifyListParser.addOptionGroup("ONENDOFHANDLE", 1, 1); // LIST options fListParser.addOption("LIST", 1, STAFCommandParser::kValueNotAllowed); fListParser.addOption("HANDLES", 1, STAFCommandParser::kValueNotAllowed); fListParser.addOption("WORKLOAD", 1, STAFCommandParser::kValueRequired); fListParser.addOption("COMPLETED", 1, STAFCommandParser::kValueNotAllowed); fListParser.addOption("RUNNING", 1, STAFCommandParser::kValueNotAllowed); fListParser.addOption("LONG", 1, STAFCommandParser::kValueNotAllowed); fListParser.addOption("SETTINGS", 1, STAFCommandParser::kValueNotAllowed); // LIST groups fListParser.addOptionGroup("WORKLOAD", 0, 1); // You can list the operational settings for the Process service OR // you can list processes fListParser.addOptionGroup("SETTINGS HANDLES", 0, 1); fListParser.addOptionGroup("SETTINGS WORKLOAD", 0, 1); fListParser.addOptionGroup("SETTINGS COMPLETED", 0, 1); fListParser.addOptionGroup("SETTINGS RUNNING", 0, 1); fListParser.addOptionGroup("SETTINGS LONG", 0, 1); // set options fSetParser.addOption("SET", 1, STAFCommandParser::kValueNotAllowed); fSetParser.addOption("DEFAULTSTOPUSING", 1, STAFCommandParser::kValueRequired); fSetParser.addOption("DEFAULTCONSOLE", 1, STAFCommandParser::kValueRequired); fSetParser.addOption("DEFAULTFOCUS", 1, STAFCommandParser::kValueRequired); fSetParser.addOption("PROCESSAUTHMODE", 1, STAFCommandParser::kValueRequired); fSetParser.addOption("DEFAULTAUTHUSERNAME", 1, STAFCommandParser::kValueRequired); fSetParser.addOption("DEFAULTAUTHPASSWORD", 1, STAFCommandParser::kValueRequired); fSetParser.addOption("DEFAULTAUTHDISABLEDACTION", 1, STAFCommandParser::kValueRequired); fSetParser.addOption("DEFAULTSHELL", 1, STAFCommandParser::kValueRequired); fSetParser.addOption("DEFAULTNEWCONSOLESHELL", 1, STAFCommandParser::kValueRequired); fSetParser.addOption("DEFAULTSAMECONSOLESHELL", 1, STAFCommandParser::kValueRequired); // Construct map class for process completion information fCompletionMapClass = STAFMapClassDefinition::create( "STAF/Service/Process/CompletionInfo"); fCompletionMapClass->addKey("rc", "Return Code"); fCompletionMapClass->addKey("key", "Key"); fCompletionMapClass->addKey("fileList", "Files");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -