void splitXmlTagNamesFromXPath(const char *xpath, StringAttr &inner, StringAttr *outer=NULL) { if (!xpath || !xpath) return; StringBuffer s1; StringBuffer s2; appendNextXpathName(s1, xpath); if (outer && xpath) appendNextXpathName(s2, ++xpath); if (xpath) //xpath too deep return; if (!s2.length()) inner.set(s1.str()); else { inner.set(s2.str()); outer->set(s1.str()); } if (!inner.get()) inner.set(""); if (outer && !outer->get()) outer->set(""); }
CMailInfo(char const * _to, char const * _subject, char const * _mailServer, unsigned _port, char const * _sender, StringArray *_warnings) : subject(_subject), mailServer(_mailServer), port(_port), sender(_sender), lastAction("process initialization"), inlen(0) { warnings = _warnings; CSMTPValidator validator; if(strlen(senderHeader) + sender.length() > 998) throw MakeStringException(0, "email sender address too long: %" I64F "u characters", static_cast<__uint64>(sender.length())); validator.validateAddress(sender.get(), "email sender address"); getRecipients(validator, _to); if(strlen(toHeader) + to.length() > 998) throw MakeStringException(0, "Email recipient address list too long: %u characters", to.length()); if(strlen(subjectHeader) + subject.length() > 998) throw MakeStringException(0, "Email subject too long: %" I64F "u characters", static_cast<__uint64>(subject.length())); validator.validateValue(subject.get(), "email subject"); }
IPropertyTree *getSwapNodeInfo(bool create) { Owned<IRemoteConnection> conn = querySDS().connect("/SwapNode", myProcessSession(), RTM_LOCK_WRITE|(create?RTM_CREATE_QUERY:0), 1000*60*5); if (!conn) { ERRLOG("SWAPNODE: could not connect to /SwapNode branch"); return NULL; } StringBuffer xpath; xpath.appendf("Thor[@group=\"%s\"]",groupName.get()); Owned<IPropertyTree> info = conn->queryRoot()->getPropTree(xpath.str()); if (!info) { if (!create) { PROGLOG("SWAPNODE: no information for group %s",groupName.get()); return NULL; } info.set(conn->queryRoot()->addPropTree("Thor",createPTree("Thor"))); info->setProp("@group",groupName.get()); } return info.getClear(); }
void CLibXmlValidator::validate() { if (!xmlFile.length() && !xml.length()) throw MakeStringException(XMLERR_MissingSource, "Source XML not provided"); if (!xsdFile.length() && !xsd.length()) throw MakeStringException(XMLERR_MissingSource, "XML Schema not provided"); xmlParserInputBufferPtr input; if (xmlFile.length()) input = xmlParserInputBufferCreateFilename(xmlFile.get(), XML_CHAR_ENCODING_NONE); else input = xmlParserInputBufferCreateMem(xml.str(), xml.length()+1, XML_CHAR_ENCODING_NONE); if (!input) throw MakeStringException(XMLERR_InvalidXml, "Failed to create XML input stream"); xmlSchemaParserCtxtPtr xsdParser; if (xsdFile.length()) xsdParser = xmlSchemaNewParserCtxt(xsdFile.get()); else xsdParser = xmlSchemaNewMemParserCtxt(xsd.str(), xsd.length()); if (!xsdParser) throw MakeStringException(XMLERR_InvalidXsd, "Failed to load XML Schema"); xmlSchemaSetParserErrors(xsdParser, libxmlXsdErrorMsgHandler, libxmlXsdErrorMsgHandler, this); xmlSchemaPtr schema = xmlSchemaParse(xsdParser); xmlSchemaFreeParserCtxt(xsdParser); if (!schema) throw MakeStringException(XMLERR_InvalidXsd, "XSD schema parsing failed"); xmlSchemaValidCtxtPtr validator = xmlSchemaNewValidCtxt(schema); xmlSchemaSetValidErrors(validator, libxmlXsdErrorMsgHandler, libxmlXsdErrorMsgHandler, this); int ret = xmlSchemaValidateStream(validator, input, XML_CHAR_ENCODING_NONE, emptySAXHandler, (void *)this); if (ret != 0) { ensureExceptions()->append(*MakeStringException(XMLERR_XsdValidationFailed, "XML validation failed")); throw exceptions.getClear(); } xmlSchemaFreeValidCtxt(validator); }
bool finalizeOptions(IProperties *globals) { if (optInput.length()) { const char *in = optInput.get(); while (*in && isspace(*in)) in++; if (*in!='<') { StringBuffer content; content.loadFile(in); optInput.set(content.str()); } } if (optESDLDefID.isEmpty()) throw MakeStringException( 0, "ESDL definition ID must be provided!" ); if (optESDLService.isEmpty()) throw MakeStringException( 0, "ESDL service definition name must be provided!" ); if(optTargetESPProcName.isEmpty()) throw MakeStringException( 0, "Name of Target ESP process must be provided!" ); if (optPortOrName.isEmpty()) throw MakeStringException( 0, "Either the target ESP service port of name must be provided!" ); else { const char * portorname = optPortOrName.get(); isdigit(*portorname) ? optTargetPort.set(portorname) : optService.set(portorname); } if (optWSProcAddress.isEmpty()) throw MakeStringException( 0, "Server address of ESDL process server must be provided" ); if (optWSProcPort.isEmpty()) throw MakeStringException( 0, "Port on which ESDL process is listening must be provided" ); return true; }
static void addElementToPTree(IPropertyTree * root, IDefRecordElement * elem) { byte kind = elem ? elem->getKind() : DEKnone; Owned<IPTree> branch = createPTree(); StringAttr branchName; switch (kind) { case DEKnone: branchName.set("None"); assertex(elem->numChildren() == 0); break; case DEKrecord: { branchName.set("Record"); branch->setPropInt("@maxSize", elem->getMaxSize()); unsigned numChildren = elem->numChildren(); for (unsigned i=0; i < numChildren; i++) addElementToPTree(branch, elem->queryChild(i)); break; } case DEKifblock: { branchName.set("IfBlock"); StringBuffer value; elem->queryCompareValue()->getStringValue(value); branch->setProp("@compareValue", value.str()); assertex(elem->numChildren() == 2); addElementToPTree(branch, elem->queryChild(0)); addElementToPTree(branch, elem->queryChild(0)); break; } case DEKfield: { branchName.set("Field"); branch->setProp("@name", elem->queryName()->str()); branch->setPropInt("@maxSize", elem->getMaxSize()); StringBuffer type; elem->queryType()->getDescriptiveType(type); branch->setProp("@type", type.str()); assertex(elem->numChildren() <= 1); if(elem->numChildren()) addElementToPTree(branch, elem->queryChild(0)); break; } default: throwUnexpected(); } root->addPropTree(branchName.get(), branch.getClear()); }
bool parseCommandLineOption(ArgvIterator &iter) { StringAttr oneOption; if (iter.matchOption(oneOption, ESDLOPT_INCLUDE_PATH) || iter.matchOption(oneOption, ESDLOPT_INCLUDE_PATH_S)) { if(optIncludePath.length() > 0) optIncludePath.append(ENVSEPSTR); optIncludePath.append(oneOption.get()); return true; } if (EsdlPublishCmdCommon::parseCommandLineOption(iter)) return true; return false; }
void init() { StringBuffer xpath("Software/ThorCluster[@name=\""); xpath.append(clusterName).append("\"]"); Owned<IRemoteConnection> conn = querySDS().connect("/Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT); environment.setown(createPTreeFromIPT(conn->queryRoot())); options = environment->queryPropTree(xpath.str()); if (!options) throwUnexpected(); groupName.set(options->queryProp("@nodeGroup")); if (groupName.isEmpty()) groupName.set(options->queryProp("@name")); VStringBuffer spareS("%s_spares", groupName.get()); spareGroupName.set(spareS); group.setown(queryNamedGroupStore().lookup(groupName)); spareGroup.setown(queryNamedGroupStore().lookup(spareGroupName)); }
void open() { SocketEndpoint address(mailServer.get()); if (address.isNull()) throw MakeStringException(MSGAUD_operator, 0, "Could not resolve mail server address %s in SendEmail*", mailServer.get()); address.port = port; try { socket.setown(ISocket::connect(address)); } catch(IException *E) { E->Release(); throw MakeStringException(MSGAUD_operator, 0, "Failed to connect to mail server at %s:%u in SendEmail*", mailServer.get(), port); } lastAction.clear().append("connection to server"); }
virtual bool parseCommandLineOptions(ArgvIterator &iter) { if (iter.done()) { usage(); return false; } for (; !iter.done(); iter.next()) { const char *arg = iter.query(); if (*arg!='-') { if (optTarget.isEmpty()) optTarget.set(arg); else if (optFileName.isEmpty()) optFileName.set(arg); else { fprintf(stderr, "\nunrecognized argument %s\n", arg); return false; } continue; } if (iter.matchFlag(optValidateActive, ECLOPT_ACTIVE)) continue; if (iter.matchFlag(optCheckDFS, ECLOPT_CHECK_DFS)) continue; if (iter.matchOption(optPMID, ECLOPT_PMID) || iter.matchOption(optPMID, ECLOPT_PMID_S)) continue; if (iter.matchFlag(optGlobalScope, ECLOPT_GLOBAL_SCOPE)) continue; StringAttr queryIds; if (iter.matchOption(queryIds, ECLOPT_QUERYID)) { optQueryIds.appendList(queryIds.get(), ","); continue; } if (EclCmdCommon::matchCommandLineOption(iter, true)!=EclCmdOptionMatch) return false; } return true; }
bool SortSlaveMP::sendRecv(CMessageBuffer &mb, unsigned timeout) { if (!comm->sendRecv(mb,rank,tag,timeout)) return false; byte ok = 255; if (mb.length()) { mb.read(ok); if (ok==1) return true; if (ok==0) { int err; mb.read(err); StringAttr errstr; mb.read(errstr); throw MakeStringException(err, "%s", errstr.get()); } } throw MakeStringException(-1,"SortSlaveMP::sendRecv() protocol error %d",(int)ok); return false; }
int processCMD() { Owned<IClientWsESDLConfig> esdlConfigClient = EsdlCmdHelper::getWsESDLConfigSoapService(optWSProcAddress, optWSProcPort, optUser, optPass); Owned<IClientDeleteESDLBindingRequest> request = esdlConfigClient->createDeleteESDLBindingRequest(); fprintf(stdout,"\nAttempting to un-bind ESDL Service: '%s.%s'\n", optTargetESPProcName.get(), optEspBinding.get()); StringBuffer id; id.setf("%s.%s", optTargetESPProcName.get(), optEspBinding.get()); request->setId(id); Owned<IClientDeleteESDLRegistryEntryResponse> resp = esdlConfigClient->DeleteESDLBinding(request); if (resp->getExceptions().ordinality()>0) { EsdlCmdHelper::outputMultiExceptions(resp->getExceptions()); return 1; } fprintf(stdout, "\n %s.\n", resp->getStatus().getDescription()); return 0; }
void write(char const * out, size32_t len, char const * action = NULL) { if(action) lastAction.clear().append(action); else lastAction.clear().append(len, out).clip(); try { socket->write(out, len); #ifdef SMTP_TRACE DBGLOG("SMTP write: [%s]", out); #endif } catch(IException * e) { int code = e->errorCode(); StringBuffer buff; e->errorMessage(buff); e->Release(); throw MakeStringException(MSGAUD_operator, 0, "Exception %d (%s) in SendEmail* while writing %s to mail server %s:%u", code, buff.str(), lastAction.str(), mailServer.get(), port); } }
const char * queryName() { return m_name.get(); }
const char * queryOwner() { return m_owner.get(); }
int CEclAgentExecutionServer::run() { Owned<IFile> sentinelFile = createSentinelTarget(); removeSentinelFile(sentinelFile); try { Owned<IGroup> serverGroup = createIGroup(daliServers, DALI_SERVER_PORT); initClientProcess(serverGroup, DCR_EclServer); getAgentQueueNames(queueNames, agentName); queue.setown(createJobQueue(queueNames.str())); queue->connect(); } catch (IException *e) { EXCLOG(e, "Server queue create/connect: "); e->Release(); return -1; } catch(...) { ERRLOG("Terminating unexpectedly"); } writeSentinelFile(sentinelFile); try { while (started) { PROGLOG("AgentExec: Waiting on queue(s) '%s'", queueNames.str()); Owned<IJobQueueItem> item = queue->dequeue(WAIT_FOREVER); if (item.get()) { rebuildLogfileName();//rebuild in case date rollover StringAttr wuid; wuid.set(item->queryWUID()); PROGLOG("AgentExec: Dequeued workunit request '%s'", wuid.get()); try { executeWorkunit(wuid); } catch(IException *e) { EXCLOG(e, "CEclAgentExecutionServer::run: "); } catch(...) { ERRLOG("Unexpected exception in CEclAgentExecutionServer::run caught"); } } else { ERRLOG("Unexpected dequeue of bogus job queue item, exiting agentexec"); removeSentinelFile(sentinelFile);//no reason to restart assert(!started); break; } } } catch (IException *e) { EXCLOG(e, "Server Exception: "); e->Release(); PROGLOG("Exiting"); } try { queue->disconnect(); } catch (IException *e) { EXCLOG(e, "Server queue disconnect: "); e->Release(); } PROGLOG("Exiting agentexec\n"); return 1; }
bool send(INode *node,unsigned timeout) { unsigned retries = 3; loop { try { CMessageBuffer mb; serialize(mb); if (queryWorldCommunicator().sendRecv(mb,node,MPTAG_SASHA_REQUEST,timeout?timeout:12*60*60*1000)) { // could take a long time! clearIds(); clearResults(); if (action==SCA_WORKUNIT_SERVICES_GET) { mb.swapWith(wusbuf); } else { unsigned n=0; unsigned i; if (mb.length()-mb.getPos()>=sizeof(unsigned)) { mb.read(n); for (i=0;i<n;i++) { StringAttr s; mb.read(s); addId(s.get()); } if (mb.length()-mb.getPos()>=sizeof(unsigned)+sizeof(bool)) { mb.read(resultoverflow); mb.read(n); for (i=0;i<n;i++) { StringAttr res; mb.read(res); size32_t reslen = res.length(); results.append(*new StringAttrItem(res,reslen)); resultsize += reslen; } if (mb.length()-mb.getPos()>=sizeof(unsigned)) { mb.read(numdts); free(dts); dts = NULL; if (numdts) { dts = (CDateTime *)calloc(numdts,sizeof(CDateTime)); for (i=0;i<numdts;i++) dts[i].deserialize(mb); } } } } } return true; } else break; } catch (IException *e) { if ((--retries==0)||(action==SCA_STOP)) throw; EXCLOG(e,"CSashaCommand send"); ::Release(e); } try { // shouldn't really be necessary but make sure socket really closed queryWorldCommunicator().disconnect(node); } catch (IException *e) { EXCLOG(e,"CSashaCommand disconnect"); ::Release(e); } }; return false; }
CThorNodeGroup(const char* _groupName, unsigned _nodeCount, bool _replicateOutputs) : groupName(_groupName), nodeCount(_nodeCount), replicateOutputs(_replicateOutputs) { keyhash = hashnc((const byte *)groupName.get(),groupName.length(),0); timeCached = msTick(); }
inline const char *queryGroupName() const { return groupName.get(); }
const char * queryFtSlaveLogDir() { return ftslavelogdir.get(); }
void RemoteDataSourceServer::doCmdCreateWorkunit(MemoryBuffer & in, MemoryBuffer & out) { SessionId session; StringAttr wuid, username, password; unsigned sequence; StringAttr name; in.read(session); in.read(username).read(password); in.read(wuid); in.read(sequence); in.read(name); DBGLOG("RemoteFileView:CreateWorkunit('%s',%d,'%s') by[%s:%" I64F "d", wuid.get(), sequence, name ? name.get() : "", username.get(), session); Owned<IConstWUResult> wuResult = resolveResult(wuid, sequence, name); Owned<IFvDataSource> ds = createDataSource(wuResult, wuid, username, password); unique_id_t id = addDataSource(session, ds); out.append((unsigned short)CurRemoteVersion); out.append(id); out.append(ds->numRows(false)); ds->queryMetaData()->serialize(out); out.append(ds->isIndex()); DBGLOG("RemoteFileView:CreateWorkunit returns %" I64F "d", id); }
void getHelo(StringBuffer & out) const { out.append("HELO ").append(mailServer.get()).append("\r\n"); }
int processCMD() { Owned<IClientWsESDLConfig> esdlConfigClient = EsdlCmdHelper::getWsESDLConfigSoapService(optWSProcAddress, optWSProcPort, optUser, optPass); Owned<IClientConfigureESDLBindingMethodRequest> request = esdlConfigClient->createConfigureESDLBindingMethodRequest(); fprintf(stderr,"\nAttempting to configure Method : '%s'.'%s'\n", optService.get(), optMethod.get()); request->setEspProcName(optTargetESPProcName); request->setEspBindingName(optBindingName); request->setEsdlServiceName(optService.get()); VStringBuffer id("%s.%d", optService.get(), (int)optVersion); request->setEsdlDefinitionID(id.str()); request->setConfig(optInput); request->setOverwrite(optOverWrite); if (optVerbose) fprintf(stderr,"\nMethod config: %s\n", optInput.get()); Owned<IClientConfigureESDLBindingMethodResponse> resp = esdlConfigClient->ConfigureESDLBindingMethod(request); if (resp->getExceptions().ordinality()>0) { EsdlCmdHelper::outputMultiExceptions(resp->getExceptions()); return 1; } fprintf(stdout, "\n %s.", resp->getStatus().getDescription()); return 0; }
virtual void init() { CMasterActivity::init(); helper = (IHThorKeyPatchArg *)queryHelper(); OwnedRoxieString originalHelperName(helper->getOriginalName()); OwnedRoxieString patchHelperName(helper->getPatchName()); OwnedRoxieString outputHelperName(helper->getOutputName()); StringBuffer expandedFileName; queryThorFileManager().addScope(container.queryJob(), originalHelperName, expandedFileName, false); originalName.set(expandedFileName); queryThorFileManager().addScope(container.queryJob(), patchHelperName, expandedFileName.clear(), false); patchName.set(expandedFileName); queryThorFileManager().addScope(container.queryJob(), outputHelperName, expandedFileName.clear(), false); outputName.set(expandedFileName); originalIndexFile.setown(queryThorFileManager().lookup(container.queryJob(), originalHelperName)); patchFile.setown(queryThorFileManager().lookup(container.queryJob(), patchHelperName)); if (originalIndexFile->numParts() != patchFile->numParts()) throw MakeActivityException(this, TE_KeyPatchIndexSizeMismatch, "Index %s and patch %s differ in width", originalName.get(), patchName.get()); if (originalIndexFile->querySuperFile() || patchFile->querySuperFile()) throw MakeActivityException(this, 0, "Patching super files not supported"); addReadFile(originalIndexFile); addReadFile(patchFile); width = originalIndexFile->numParts(); originalDesc.setown(originalIndexFile->getFileDescriptor()); patchDesc.setown(patchFile->getFileDescriptor()); Owned<IPartDescriptor> tlkDesc = originalDesc->getPart(originalDesc->numParts()-1); const char *kind = tlkDesc->queryProperties().queryProp("@kind"); local = NULL == kind || 0 != stricmp("topLevelKey", kind); if (!local && width > 1) width--; // 1 part == No n distributed / Monolithic key if (width > container.queryJob().querySlaves()) throw MakeActivityException(this, 0, "Unsupported: keypatch(%s, %s) - Cannot patch a key that's wider(%d) than the target cluster size(%d)", originalIndexFile->queryLogicalName(), patchFile->queryLogicalName(), width, container.queryJob().querySlaves()); IArrayOf<IGroup> groups; fillClusterArray(container.queryJob(), outputName, clusters, groups); newIndexDesc.setown(queryThorFileManager().create(container.queryJob(), outputName, clusters, groups, 0 != (KDPoverwrite & helper->getFlags()), 0, !local, width)); if (!local) newIndexDesc->queryPart(newIndexDesc->numParts()-1)->queryProperties().setProp("@kind", "topLevelKey"); }
void appendVariableParmInfo(IArrayOf<IPropertyTree> &parts, IResultSetFactory *resultSetFactory, IConstWUResult &var, unsigned hashWebserviceSeq=0) { Owned<IResultSetMetaData> meta = resultSetFactory->createResultSetMeta(&var); StringAttr noinput; if (var.getResultFieldOpt("noinput", StringAttrAdaptor(noinput)).length() && strToBool(noinput.length(), noinput.get())) //developer specified not to show field on form return; SCMStringBuffer varname; var.getResultName(varname); int seq = var.getResultSequence(); WUResultFormat fmt = var.getResultFormat(); SCMStringBuffer eclschema; var.getResultEclSchema(eclschema); StringBuffer width, height, fieldSeq, isPassword, select; var.getResultFieldOpt("fieldwidth", StringBufferAdaptor(width)); var.getResultFieldOpt("fieldheight", StringBufferAdaptor(height)); var.getResultFieldOpt("password", StringBufferAdaptor(isPassword)); var.getResultFieldOpt("select", StringBufferAdaptor(select)); if (hashWebserviceSeq) fieldSeq.append(hashWebserviceSeq); else var.getResultFieldOpt("sequence", StringBufferAdaptor(fieldSeq)); SCMStringBuffer s; Owned<IPropertyTree> part = createPTree("part"); if (!var.isResultScalar()) { meta->getXmlSchema(s, false); part->setProp("@name", varname.str()); part->setProp("@type", "tns:XmlDataset"); if (fieldSeq.length()) part->setProp("@sequence", fieldSeq); } else { meta->getColumnEclType(s, 0); DisplayType dt = meta->getColumnDisplayType(0); StringAttr ptype; switch (dt) { case TypeBoolean: ptype.set("xsd:boolean"); break; case TypeInteger: ptype.set("xsd:integer"); break; case TypeUnsignedInteger: ptype.set("xsd:integer"); break; case TypeReal: ptype.set("xsd:real"); break; case TypeSet: ptype.set("tns:EspStringArray"); break; case TypeDataset: case TypeData: ptype.set("tns:XmlDataSet"); break; case TypeUnicode: case TypeString: ptype.set("xsd:string"); break; case TypeUnknown: case TypeBeginIfBlock: case TypeEndIfBlock: case TypeBeginRecord: default: ptype.set("xsd:string"); break; } part->setProp("@name", varname.str()); part->setProp("@type", ptype.str()); if (width.length()) part->setProp("@width", width); if (height.length()) part->setProp("@height", height); if (fieldSeq.length()) part->setProp("@sequence", fieldSeq); if (isPassword.length()) part->setProp("@password", isPassword); if (select.length()) { StringArray optionList; optionList.appendList(select, ","); IPropertyTree *selectTree = ensurePTree(part, "select"); ForEachItemIn(i, optionList) { const char *value = optionList.item(i); bool selected = '*'==*value; if (selected) value++; StringAttr name; const char *eq = strchr(value, '='); if (!eq) name.set(value); else { name.set(value, eq-value); value = eq + 1; } Owned<IPropertyTree> optionTree = createPTree(); optionTree->setProp("@name", name); optionTree->setProp("@value", value); if (selected) optionTree->setPropBool("@selected", true); selectTree->addPropTree("option", optionTree.getClear()); } } }
const char* xsdNs() { return m_xsdNamespace.get(); }
void processMessage(CMessageBuffer &mb) { ICoven &coven=queryCoven(); MemoryBuffer params; params.swapWith(mb); int fn; params.read(fn); switch (fn) { case MDR_GET_VALUE: { StringAttr id; StringBuffer buf; params.read(id); if (0 == stricmp(id,"threads")) { mb.append(getThreadList(buf).str()); } else if (0 == stricmp(id, "mpqueue")) { mb.append(getReceiveQueueDetails(buf).str()); } else if (0 == stricmp(id, "locks")) { mb.append(querySDS().getLocks(buf).str()); } else if (0 == stricmp(id, "sdsstats")) { mb.append(querySDS().getUsageStats(buf).str()); } else if (0 == stricmp(id, "connections")) { mb.append(querySDS().getConnections(buf).str()); } else if (0 == stricmp(id, "sdssubscribers")) { mb.append(querySDS().getSubscribers(buf).str()); } else if (0 == stricmp(id, "clients")) { mb.append(querySessionManager().getClientProcessList(buf).str()); } else if (0 == stricmp(id, "subscriptions")) { mb.append(getSubscriptionList(buf).str()); } else if (0 == stricmp(id, "mpverify")) { queryWorldCommunicator().verifyAll(buf); mb.append(buf.str()); } else if (0 == stricmp(id, "extconsistency")) { mb.append(querySDS().getExternalReport(buf).str()); } else if (0 == stricmp(id, "build")) { mb.append("$Id: dadiags.cpp 62376 2011-02-04 21:59:58Z sort $"); } else if (0 == stricmp(id, "sdsfetch")) { StringAttr branchpath; params.read(branchpath); Linked<IPropertyTree> sroot = querySDSServer().lockStoreRead(); try { sroot->queryPropTree(branchpath)->serialize(mb); } catch (...) { querySDSServer().unlockStoreRead(); throw; } querySDSServer().unlockStoreRead(); } else if (0 == stricmp(id, "perf")) { getSystemTraceInfo(buf,PerfMonStandard); mb.append(buf.str()); } else if (0 == stricmp(id, "sdssize")) { StringAttr branchpath; params.read(branchpath); Linked<IPropertyTree> sroot = querySDSServer().lockStoreRead(); StringBuffer sbuf; try { toXML(sroot->queryPropTree(branchpath),sbuf); DBGLOG("sdssize '%s' = %d",branchpath.get(),sbuf.length()); } catch (...) { querySDSServer().unlockStoreRead(); throw; } querySDSServer().unlockStoreRead(); mb.append(sbuf.length()); } else if (0 == stricmp(id, "disconnect")) { StringAttr client; params.read(client); SocketEndpoint ep(client); PROGLOG("Dalidiag request to close client connection: %s", client.get()); Owned<INode> node = createINode(ep); queryCoven().disconnect(node); } else if (0 == stricmp(id, "unlock")) { __int64 connectionId; bool disconnect; params.read(connectionId); params.read(disconnect); PROGLOG("Dalidiag request to unlock connection id: %" I64F "x", connectionId); StringBuffer connectionInfo; bool success = querySDSServer().unlock(connectionId, disconnect, connectionInfo); mb.append(success); if (success) mb.append(connectionInfo); } else if (0 == stricmp(id, "save")) { PROGLOG("Dalidiag requests SDS save"); querySDSServer().saveRequest(); } else if (0 == stricmp(id, "settracetransactions")) { PROGLOG("Dalidiag requests Trace Transactions"); if(traceAllTransactions(true)) mb.append("OK - no change"); else mb.append("OK - transaction tracing enabled"); } else if (0 == stricmp(id, "cleartracetransactions")) { PROGLOG("Dalidiag requests Trace Transactions stopped"); if(traceAllTransactions(false)) mb.append("OK - transaction tracing disabled"); else mb.append("OK - no change"); } else if (0 == stricmp(id, "setldapflags")) { unsigned f; params.read(f); PROGLOG("Dalidiag requests setldapflags %d",f); querySessionManager().setLDAPflags(f); } else if (0 == stricmp(id, "getldapflags")) { unsigned f=querySessionManager().getLDAPflags();; mb.append(f); } else if (0 == stricmp(id, "setsdsdebug")) { PROGLOG("Dalidiag setsdsdebug"); unsigned p; params.read(p); StringArray arr; while (p--) { StringAttr s; params.read(s); arr.append(s); } StringBuffer reply; bool success = querySDSServer().setSDSDebug(arr, reply); mb.append(success).append(reply); } else mb.append(StringBuffer("UNKNOWN OPTION: ").append(id).str()); } break; } coven.reply(mb); }
const char * queryDescription() { return m_description.get(); }
void getMailFrom(StringBuffer & out) const { out.append("MAIL FROM:<").append(sender.get()).append(">\r\n"); }
int main(int argc, const char *argv[]) { InitModuleObjects(); int ret = 0; bool dryRun = false; bool offline = false; StringAttr daliServer, envPath; enum CmdType { cmd_none, cmd_swap, cmd_auto, cmd_history, cmd_email, cmd_swapped, cmd_reset, cmd_resetspares, cmd_addspares, cmd_removespares, cmd_resethistory }; CmdType cmd = cmd_none; ArgvIterator iter(argc, argv); try { bool stop=false; StringArray params; for (; !ret&&!iter.done(); iter.next()) { const char *arg = iter.query(); if ('-' == *arg) { bool value; if (iter.matchFlag(value, "-dryrun")) dryRun = value; else if (iter.matchFlag(value, "-offline")) offline = value; else { PROGLOG("Unknown option"); ret = 2; usage(); break; } } else { switch (cmd) { case cmd_none: if (strieq("swap", arg)) cmd = cmd_swap; else if (strieq("auto", arg)) cmd = cmd_auto; else if (strieq("history", arg)) cmd = cmd_history; else if (strieq("email", arg)) cmd = cmd_email; else if (strieq("swapped", arg)) cmd = cmd_swapped; else if (strieq("reset", arg)) cmd = cmd_reset; else if (strieq("resetspares", arg)) cmd = cmd_resetspares; else if (strieq("addspares", arg)) cmd = cmd_addspares; else if (strieq("removespares", arg)) cmd = cmd_removespares; else if (strieq("resethistory", arg)) cmd = cmd_resethistory; else { PROGLOG("Unknown command"); usage(); ret = 2; } break; default: params.append(iter.query()); break; } } } unsigned requiredParams=UINT_MAX; switch (cmd) { case cmd_swap: requiredParams = 4; break; case cmd_addspares: case cmd_removespares: requiredParams = 3; break; case cmd_auto: case cmd_history: case cmd_email: case cmd_swapped: case cmd_reset: case cmd_resetspares: case cmd_resethistory: requiredParams = 2; break; } if (params.ordinality() < requiredParams) { usage(); ret = 2; } else { StringAttr daliServer = params.item(0); StringAttr clusterName = params.item(1); DaliClient dclient(daliServer); StringBuffer logname; splitFilename(argv[0], NULL, NULL, &logname, NULL); addFileTimestamp(logname, true); logname.append(".log"); StringBuffer lf; openLogFile(lf, logname.str(),0,false,true); queryStderrLogMsgHandler()->setMessageFields(MSGFIELD_prefix); Owned<IRemoteConnection> conn = querySDS().connect("/Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT); IPropertyTree *environment = conn->queryRoot(); StringBuffer xpath("Software/ThorCluster[@name=\""); xpath.append(clusterName).append("\"]"); IPropertyTree *cluster = environment->queryPropTree(xpath.str()); if (!cluster) { PROGLOG("Unknown cluster: %s", clusterName.get()); ret = 3; } if (!ret) { Owned<IPropertyTree> options = createPTreeFromIPT(cluster); conn.clear(); if (options&&options->getPropBool("@enableSysLog",true)) UseSysLogForOperatorMessages(); switch (cmd) { case cmd_auto: { if (!autoSwapNode(clusterName, dryRun)) ret = 3; break; } case cmd_swap: { const char *oldip=params.item(2); const char *newip=params.item(3); if (!swapNode(clusterName, oldip, newip)) ret = 3; break; } case cmd_history: case cmd_swapped: case cmd_email: { unsigned days = params.isItem(2) ? atoi(params.item(2)) : 0; // for history or swapped switch (cmd) { case cmd_history: swapNodeHistory(clusterName, days, NULL); break; case cmd_swapped: swappedList(clusterName, days, NULL); break; case cmd_email: { bool sendSwapped = false; bool sendHistory = false; if (params.isItem(2)) { if (strieq("swapped", params.item(2))) sendSwapped = true; else if (strieq("history", params.item(2))) sendHistory = true; } emailSwap(clusterName, NULL, true, sendSwapped, sendHistory); break; } } break; } case cmd_reset: case cmd_resetspares: { StringBuffer response; if (!resetClusterGroup(clusterName, "ThorCluster", cmd==cmd_resetspares, response)) { WARNLOG("%s", response.str()); ret = 3; } break; } case cmd_addspares: case cmd_removespares: { SocketEndpointArray allEps; unsigned p=2; do { const char *ipOrRange = params.item(p); SocketEndpointArray epa; epa.fromText(ipOrRange, 0); ForEachItemIn(e, epa) allEps.append(epa.item(e)); p++; } while (p<params.ordinality()); StringBuffer response; bool res; if (cmd == cmd_addspares) res = addClusterSpares(clusterName, "ThorCluster", allEps, response); else res = removeClusterSpares(clusterName, "ThorCluster", allEps, response); if (!res) { WARNLOG("%s", response.str()); ret = 3; } break; } case cmd_resethistory: { Owned<IRemoteConnection> conn = querySDS().connect("/SwapNode", myProcessSession(), RTM_LOCK_WRITE, SDS_LOCK_TIMEOUT); if (conn) { StringBuffer groupName; getClusterGroupName(*options, groupName); VStringBuffer xpath("Thor[@group=\"%s\"]", groupName.str()); if (conn->queryRoot()->removeProp(xpath.str())) PROGLOG("SwapNode info for cluster %s removed", clusterName.get()); else PROGLOG("SwapNode info for cluster %s not found", clusterName.get()); } break; } } } } UseSysLogForOperatorMessages(false); } catch (IException *e) { EXCLOG(e,"SWAPNODE"); e->Release(); ret = -1; } ExitModuleObjects(); return ret; }