summaryrefslogtreecommitdiffstats
path: root/slobrok/src/apps/sbcmd/sbcmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'slobrok/src/apps/sbcmd/sbcmd.cpp')
-rw-r--r--slobrok/src/apps/sbcmd/sbcmd.cpp199
1 files changed, 199 insertions, 0 deletions
diff --git a/slobrok/src/apps/sbcmd/sbcmd.cpp b/slobrok/src/apps/sbcmd/sbcmd.cpp
new file mode 100644
index 00000000000..3ba4182de98
--- /dev/null
+++ b/slobrok/src/apps/sbcmd/sbcmd.cpp
@@ -0,0 +1,199 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+
+#include <vespa/log/log.h>
+LOG_SETUP("sb-cmd");
+
+#include <vespa/fnet/frt/frt.h>
+
+#include <string>
+#include <sstream>
+
+
+class Slobrok_CMD : public FastOS_Application
+{
+private:
+ FRT_Supervisor *_supervisor;
+ FRT_Target *_target;
+
+ Slobrok_CMD(const Slobrok_CMD &);
+ Slobrok_CMD &operator=(const Slobrok_CMD &);
+
+public:
+ Slobrok_CMD() : _supervisor(NULL), _target(NULL) {}
+ virtual ~Slobrok_CMD();
+ int usage();
+ void initRPC(const char *spec);
+ void finiRPC();
+ virtual int Main();
+};
+
+
+Slobrok_CMD::~Slobrok_CMD()
+{
+ LOG_ASSERT(_supervisor == NULL);
+ LOG_ASSERT(_target == NULL);
+}
+
+
+int
+Slobrok_CMD::usage()
+{
+ fprintf(stderr, "usage: %s <port|spec> <cmd> [args]\n", _argv[0]);
+ fprintf(stderr, "with cmd one of:\n");
+ fprintf(stderr, " slobrok.callback.listNamesServed\n");
+ fprintf(stderr, " slobrok.internal.listManagedRpcServers\n");
+ fprintf(stderr, " slobrok.admin.listAllRpcServers\n");
+ fprintf(stderr, " slobrok.lookupRpcServer {pattern}\n");
+ fprintf(stderr, " slobrok.registerRpcServer name {spec}\n");
+ fprintf(stderr, " slobrok.unregisterRpcServer {name} {spec}\n");
+ fprintf(stderr, " slobrok.admin.addPeer {name} {spec}\n");
+ fprintf(stderr, " slobrok.admin.removePeer {name} {spec}\n");
+ fprintf(stderr, " slobrok.system.stop\n");
+ fprintf(stderr, " slobrok.system.version\n");
+ fprintf(stderr, " system.stop\n");
+ return 1;
+}
+
+
+void
+Slobrok_CMD::initRPC(const char *spec)
+{
+ _supervisor = new FRT_Supervisor();
+ _target = _supervisor->GetTarget(spec);
+ _supervisor->Start();
+}
+
+
+void
+Slobrok_CMD::finiRPC()
+{
+ if (_target != NULL) {
+ _target->SubRef();
+ _target = NULL;
+ }
+ if (_supervisor != NULL) {
+ _supervisor->ShutDown(true);
+ delete _supervisor;
+ _supervisor = NULL;
+ }
+}
+
+
+int
+Slobrok_CMD::Main()
+{
+ if (_argc < 3) {
+ return usage();
+ }
+ int port = atoi(_argv[1]);
+ if (port == 0) {
+ initRPC(_argv[1]);
+ } else {
+ std::ostringstream tmp;
+ tmp << "tcp/localhost:";
+ tmp << port;
+ initRPC(tmp.str().c_str());
+ }
+
+ bool threeTables = false;
+ bool twoTables = false;
+
+ FRT_RPCRequest *req = _supervisor->AllocRPCRequest();
+
+ req->SetMethodName(_argv[2]);
+ if (strcmp(_argv[2], "slobrok.admin.listAllRpcServers") == 0) {
+ threeTables = true;
+ // no params
+ } else if (strcmp(_argv[2], "slobrok.internal.listManagedRpcServers") == 0) {
+ twoTables = true;
+ // no params
+ } else if (strcmp(_argv[2], "slobrok.callback.listNamesServed") == 0
+ || strcmp(_argv[2], "slobrok.internal.listManagedRpcServers") == 0
+ || strcmp(_argv[2], "slobrok.admin.listAllRpcServers") == 0
+ || strcmp(_argv[2], "slobrok.system.stop") == 0
+ || strcmp(_argv[2], "slobrok.system.version") == 0
+ || strcmp(_argv[2], "system.stop") == 0)
+ {
+ // no params
+ } else if (strcmp(_argv[2], "slobrok.lookupRpcServer") == 0
+ && _argc == 4)
+ {
+ twoTables = true;
+ // one param
+ req->GetParams()->AddString(_argv[3]);
+ } else if ((strcmp(_argv[2], "slobrok.registerRpcServer") == 0
+ || strcmp(_argv[2], "slobrok.unregisterRpcServer") == 0
+ || strcmp(_argv[2], "slobrok.admin.addPeer") == 0
+ || strcmp(_argv[2], "slobrok.admin.removePeer") == 0)
+ && _argc == 5)
+ {
+ // two params
+ req->GetParams()->AddString(_argv[3]);
+ req->GetParams()->AddString(_argv[4]);
+ } else {
+ finiRPC();
+ return usage();
+ }
+ _target->InvokeSync(req, 5.0);
+
+ if (req->IsError()) {
+ fprintf(stderr, "sb-cmd error %d: %s\n",
+ req->GetErrorCode(), req->GetErrorMessage());
+ } else {
+ FRT_Values &answer = *(req->GetReturn());
+ const char *atypes = answer.GetTypeString();
+ if (threeTables
+ && strcmp(atypes, "SSS") == 0
+ && answer[0]._string_array._len > 0
+ && answer[0]._string_array._len == answer[1]._string_array._len
+ && answer[0]._string_array._len == answer[2]._string_array._len)
+ {
+ for (uint32_t j = 0; j < answer[0]._string_array._len; j++) {
+ printf("%s\t%s\t%s\n",
+ answer[0]._string_array._pt[j]._str,
+ answer[1]._string_array._pt[j]._str,
+ answer[2]._string_array._pt[j]._str);
+ }
+ } else if (twoTables
+ && strcmp(atypes, "SS") == 0
+ && answer[0]._string_array._len > 0
+ && answer[0]._string_array._len == answer[1]._string_array._len)
+ {
+ for (uint32_t j = 0; j < answer[0]._string_array._len; j++) {
+ printf("%s\t%s\n",
+ answer[0]._string_array._pt[j]._str,
+ answer[1]._string_array._pt[j]._str);
+ }
+ } else {
+ fprintf(stderr, "sb-cmd OK, returntypes '%s'\n", atypes);
+ uint32_t idx = 0;
+ while (atypes != NULL && *atypes != '\0') {
+ switch (*atypes) {
+ case 's':
+ printf(" string = '%s'\n", answer[idx]._string._str);
+ break;
+ case 'S':
+ printf(" strings [%d]\n", answer[idx]._string_array._len);
+ for (uint32_t j = 0; j < answer[idx]._string_array._len; j++) {
+ printf("\t'%s'\n", answer[idx]._string_array._pt[j]._str);
+ }
+ break;
+ default:
+ printf(" unknown type %c\n", *atypes);
+ }
+ ++atypes;
+ ++idx;
+ }
+ }
+ }
+ req->SubRef();
+ finiRPC();
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ Slobrok_CMD sb_cmd;
+ return sb_cmd.Entry(argc, argv);
+}