Browse Source

merge netman back into ioman, reorder some things and get prompts working

Missingmew 4 years ago
parent
commit
c8e50e36a0

+ 2 - 1
cli/CMakeLists.txt

@@ -4,7 +4,8 @@ cmake_minimum_required(VERSION 2.8)
 
 project(ccats-cli)
 
-add_executable(ccats-cli src/main.cpp src/ioman.cpp src/machineioman.cpp src/userioman.cpp src/base64.cpp src/netman.cpp src/cmdman.cpp src/fileman.cpp)
+# add_executable(ccats-cli src/main.cpp src/ioman.cpp src/machineioman.cpp src/userioman.cpp src/base64.cpp src/netman.cpp src/cmdman.cpp src/fileman.cpp)
+add_executable(ccats-cli src/main.cpp src/ioman.cpp src/machineioman.cpp src/userioman.cpp src/base64.cpp src/cmdman.cpp src/fileman.cpp)
 
 # use pkg-config to find readline as it doesnt provide cmake files
 find_package(PkgConfig REQUIRED)

+ 3 - 1
cli/include/cmdman.h

@@ -40,9 +40,11 @@ public:
 	CmdRet cmdPutdata();
 	CmdRet cmdGetdata();
 	
-private:
 	
 	Json::CharReader* reader;
+	
+private:
+	
 	Json::StreamWriterBuilder wbuilder;
 
 	string jsonerror;

+ 25 - 6
cli/include/ioman.h

@@ -1,32 +1,41 @@
 #ifndef IOMAN_H
 #define IOMAN_H
 
-#include "netman.h"
 #include "cmdman.h"
 #include "fileman.h"
 
+#include <boost/asio.hpp>
 #include <string>
 
+using boost::asio::ip::tcp;
+
 #define BLOCKSIZE 8
 
 
 class IoMan {
 private:
 	const std::string protoVersion = "0.2";
+	boost::asio::io_service ios;
+	boost::asio::streambuf sendbuf;
+	boost::asio::streambuf recvbuf;
+	boost::system::error_code errcode;
+	tcp::socket *tcpsock;
+	std::string ipstring;
+	int port;
+	bool connected;
 
 protected:
-	NetMan netman;
 	CmdMan cmdman;
 	FileMan fileman;
 	bool loggedin;
-	std::string promptcmd = "";
-	std::string promptuser = "";
-	std::string promptpass = "";
 	
-	virtual bool parseJson(Json::Value *root, string jsonstring) = 0;
+	bool parseJson(Json::Value *root, string jsonstring);
 	virtual bool handleJson(Json::Value root) = 0;
 	virtual void printErrorMessage(std::string msg) = 0;
 	virtual void printWelcomeMessage() = 0;
+	virtual std::string getCmdPrompt() = 0;
+	virtual std::string getUserPrompt() = 0;
+	virtual std::string getPassPrompt() = 0;
 
 public:
 	// Basic constructor
@@ -37,6 +46,16 @@ public:
 	void run();
 	// setup stuff
 	bool init();
+
+	// tries to establish connection, returns error string if applicable
+	bool connect();
+	// sends a string
+	bool sendJsonString(std::string msg);
+	// returns a single json object as string
+	std::string receiveJsonString();
+	// disconnect from server
+	void disconnect();
+	
 };
 
 #endif

+ 4 - 1
cli/include/machineioman.h

@@ -4,7 +4,6 @@
 #include "ioman.h"
 
 class MachineIoMan : public IoMan {
-
 public:
 	using IoMan::IoMan;
 
@@ -12,6 +11,10 @@ public:
 	bool handleJson(Json::Value root);
 	void printErrorMessage(std::string msg);
 	void printWelcomeMessage();
+
+	std::string getCmdPrompt();
+	std::string getUserPrompt();
+	std::string getPassPrompt();
 };
 
 #endif

+ 0 - 38
cli/include/netman.h

@@ -1,38 +0,0 @@
-#ifndef NETMAN_H
-#define NETMAN_H
-
-#include <boost/asio.hpp>
-#include <string>
-
-using boost::asio::ip::tcp;
-
-class NetMan {
-private:
-	boost::asio::io_service ios;
-	boost::asio::streambuf sendbuf;
-	boost::asio::streambuf recvbuf;
-	boost::system::error_code errcode;
-	tcp::socket *tcpsock;
-	std::string ipstring;
-	int port;
-	bool connected;
-	
-public:
-	// basic constructor
-	NetMan(char *ipcstring);
-	// basic destructor
-	~NetMan();
-	// tries to establish connection, returns error string if applicable
-	void connect();
-	// sends a string
-	void sendJsonString(std::string msg);
-	// returns a single json object as string
-	std::string receiveJsonString();
-	// disconnect from server
-	void disconnect();
-
-	// returns connected;
-	bool isConnected();
-};
-
-#endif

+ 4 - 6
cli/include/userioman.h

@@ -4,12 +4,6 @@
 #include "ioman.h"
 
 class UserIoMan : public IoMan {
-protected:
-
-	std::string promptcmd = "ccats";
-	std::string promptuser = "username";
-	std::string promptpass = "password";
-
 public:
 	using IoMan::IoMan;
 
@@ -17,6 +11,10 @@ public:
 	bool handleJson(Json::Value root);
 	void printErrorMessage(std::string msg);
 	void printWelcomeMessage();
+
+	std::string getCmdPrompt();
+	std::string getUserPrompt();
+	std::string getPassPrompt();
 };
 
 #endif

+ 89 - 31
cli/src/ioman.cpp

@@ -1,5 +1,6 @@
 #include "../include/ioman.h"
 
+#include <boost/asio.hpp>
 #include <iostream>
 
 #include <boost/algorithm/string.hpp>
@@ -12,41 +13,96 @@
 using std::string;
 using std::vector;
 
+using boost::asio::ip::tcp;
 using boost::asio::buffer;
 
-IoMan::IoMan(char *ipcstring) : netman(ipcstring),cmdman(fileman) {
+IoMan::IoMan(char *ipcstring) : cmdman(fileman) {
+  ipstring = std::string(ipcstring);
+  port = 1234;
+  tcpsock = new tcp::socket(ios);
+  connected = false;
 }
 
 IoMan::~IoMan() {
+	if(connected) {
+		disconnect();
+	}
+	delete tcpsock;
+}
+
+bool IoMan::connect() {
+  tcp::endpoint *ep;
+
+  ep = new tcp::endpoint(boost::asio::ip::address::from_string(ipstring), 1234);
+
+  // establish connection
+  std::cerr << "IoMan::connect() connecting to " << ipstring << std::endl;
+  tcpsock->connect(*ep, errcode);
+  if (errcode) {
+	  delete ep;
+	  printErrorMessage("IoMan::connect() couldnt connect to " + ipstring + "\n" + errcode.message() + "\n");
+	return false;
+  }
+  connected = true;
+  delete ep;
+  return true;
+}
+
+
+void IoMan::disconnect() {
+  std::cerr << "IoMan::disconnect()" << std::endl;
+	tcpsock->close();
+	connected = false;
+}
+
+bool IoMan::sendJsonString(std::string msg) {
+  std::cerr << "IoMan::sendJsonString() " << msg << std::endl;
+  boost::asio::write(*tcpsock, buffer(msg + "\n"), errcode);
+  if (errcode) {
+	  printErrorMessage("IoMan::sendJsonString() couldnt send json data\n" + errcode.message() + "\n");
+	  return false;
+  }
+  return true;
+}
+
+std::string IoMan::receiveJsonString() {
+	std::string retstring;
+  std::cerr << "IoMan::receiveJsonString()" << std::endl;
+	// use transfer_at_least(1) to avoid deadlock with transfer_all()
+  boost::asio::read_until(*tcpsock, recvbuf, '\n', errcode);
+  if (errcode && errcode != boost::asio::error::eof) {
+	  printErrorMessage("IoMan::receiveJsonString() couldnt read json data\n" + errcode.message() + "\n");
+  }
+  retstring = boost::asio::buffer_cast<const char *>(recvbuf.data());
+  recvbuf.consume(recvbuf.size());
+  std::cerr << "IoMan::receiveJsonString(): returning string \"" << retstring << "\"" << std::endl;
+  return retstring;
 }
 
-//~ bool IoMan::parseJson(Json::Value *root, string jsonstring) {
-  //~ const char *recvjson;
-  //~ std::string jsonerror;
-  //~ recvjson = jsonstring.c_str();
-  //~ if (!reader->parse(recvjson, recvjson + jsonstring.size(), root, &jsonerror)) {
-    //~ std::cerr << "couldnt parse json data" << std::endl
-              //~ << jsonerror << std::endl;
-    //~ return false;
-  //~ }
-  //~ recvbuf.consume(recvbuf.size());
-  //~ return true;
-//~ }
+bool IoMan::parseJson(Json::Value *root, string jsonstring) {
+  const char *recvjson;
+  std::string jsonerror;
+  recvjson = jsonstring.c_str();
+  if (!cmdman.reader->parse(recvjson, recvjson + jsonstring.size(), root, &jsonerror)) {
+	printErrorMessage("couldnt parse json data: " + jsonerror + "\n");
+    return false;
+  }
+  return true;
+}
 
 bool IoMan::init() {
 	CmdMan::CmdRet ret;
 	string work;
 	Json::Value root;
 	
-	try { netman.connect(); }
-	catch(string err) { printErrorMessage(err); return false; }
+	if(!connect()) return false;
 	
 	ret = cmdman.cmdVersion(protoVersion);
-	try { netman.sendJsonString(ret.msg); }
-	catch(string err) { printErrorMessage(err); return false; }
 	
-	try { work = netman.receiveJsonString(); }
-	catch(string err) { printErrorMessage(err); return false; }
+	if(!sendJsonString(ret.msg)) return false;
+	
+	work = receiveJsonString();
+	if(work.empty()) return false;
 	
 	if(!parseJson(&root, work)) return false;
 	
@@ -73,22 +129,25 @@ void IoMan::run() {
 	Json::Value root;
 	
 	while(!user) {
-		user = readline(promptuser.c_str());
+		user = readline(getUserPrompt().c_str());
+		printErrorMessage("Using user: " + string(user));
 	}
 	while(!pass) {
-		user = readline(promptpass.c_str());
+		pass = readline(getPassPrompt().c_str());
+		printErrorMessage("Using pass: " + string(pass));
 	}
 	
+	std::cerr << "IoMan::run() begin" << std::endl;
+	
 	/* move login elsewhere? */
 	cmdret = cmdman.cmdLogin(string(user), string(pass));
 	free(user);
 	free(pass);
 	
-	try { netman.sendJsonString(cmdret.msg); }
-	catch(string err) { printErrorMessage(err); return; }
+	if(!sendJsonString(cmdret.msg)) return;
 	
-	try { work = netman.receiveJsonString(); }
-	catch(string err) { printErrorMessage(err); return; }
+	work = receiveJsonString();
+	if(work.empty()) return;
 	
 	if(!parseJson(&root, work)) return;
 	if(!root["accept"].asBool()) {
@@ -102,7 +161,7 @@ void IoMan::run() {
 	while(running) {
 		free(line);
 		
-		line = readline(promptcmd.c_str());
+		line = readline(getCmdPrompt().c_str());
 
 	    // if no input, do not add to history, and go to reading next line
 	    if (strlen(line) == 0) {
@@ -137,12 +196,11 @@ void IoMan::run() {
 			    break;
 		    }
 		    case CmdMan::rettype::json: {
-			try { netman.sendJsonString(cmdret.msg); }
-			catch(string err) { printErrorMessage(err); continue; }
+			    if(!sendJsonString(cmdret.msg)) continue;
 			
 			while(1) {
-				try { work = netman.receiveJsonString(); }
-				catch(string err) { printErrorMessage(err); break; }
+				work = receiveJsonString();
+				if(work.empty()) break;
 				
 				if(!work.size()) break;
 				
@@ -156,7 +214,7 @@ void IoMan::run() {
 		    }
 	    }
 	    
-	    if(!netman.isConnected()) break;
+	    if(!connected) break;
 	}
 	
 	free(line);

+ 11 - 0
cli/src/machineioman.cpp

@@ -28,6 +28,17 @@ void MachineIoMan::printWelcomeMessage() {
 	std::cout << "please enter user and password" << std::endl;
 }
 
+std::string MachineIoMan::getCmdPrompt() {
+	return "";
+}
+
+std::string MachineIoMan::getUserPrompt() {
+	return "";
+}
+std::string MachineIoMan::getPassPrompt() {
+	return "";
+}
+
 /* void MachineIoMan::run() {
   std::cerr << "MachineIoMan::run() says hello!" << std::endl;
 

+ 0 - 200
cli/src/netman.cpp

@@ -1,200 +0,0 @@
-#include "../include/netman.h"
-
-#include <boost/asio.hpp>
-#include <iostream>
-
-using boost::asio::ip::tcp;
-using boost::asio::buffer;
-
-NetMan::NetMan(char *ipcstring) {
-  ipstring = std::string(ipcstring);
-  port = 1234;
-  tcpsock = new tcp::socket(ios);
-	connected = false;
-}
-
-void NetMan::connect() {
-  tcp::endpoint *ep;
-
-  ep = new tcp::endpoint(boost::asio::ip::address::from_string(ipstring), 1234);
-
-  // establish connection
-  std::cerr << "NetMan::connect() connecting to " << ipstring << std::endl;
-  tcpsock->connect(*ep, errcode);
-  if (errcode) {
-	  delete ep;
-	  throw "NetMan::connect() couldnt connect to " + ipstring + "\n" + errcode.message() + "\n";
-    //~ std::cerr << "couldnt connect to " << ipstring << std::endl
-              //~ << errcode.message() << std::endl;
-    //~ return false;
-  }
-  connected = true;
-  delete ep;
-}
-
-void NetMan::disconnect() {
-  std::cerr << "NetMan::disconnect()" << std::endl;
-	tcpsock->close();
-}
-
-void NetMan::sendJsonString(std::string msg) {
-  std::cerr << "NetMan::sendJsonString() " << msg << std::endl;
-  boost::asio::write(*tcpsock, buffer(msg + "\n"), errcode);
-  if (errcode) {
-	  throw "NetMan::sendJsonString() couldnt send json data\n" + errcode.message() + "\n";
-  }
-}
-
-std::string NetMan::receiveJsonString() {
-	std::string retstring;
-  std::cerr << "NetMan::receiveJsonString()" << std::endl;
-	// use transfer_at_least(1) to avoid deadlock with transfer_all()
-  boost::asio::read_until(*tcpsock, recvbuf, '\n', errcode);
-  if (errcode && errcode != boost::asio::error::eof) {
-	  throw "NetMan::receiveJsonString() couldnt read json data\n" + errcode.message() + "\n";
-  }
-  retstring = boost::asio::buffer_cast<const char *>(recvbuf.data());
-  std::cerr << retstring << std::endl;
-  return retstring;
-}
-
-bool NetMan::isConnected() {
-	return connected;
-}
-
-NetMan::~NetMan() {
-	if(connected) {
-		disconnect();
-	}
-	delete tcpsock;
-}
-
-/*
-
-bool IoMan::sendJson(Json::Value root) {
-  boost::asio::write(*tcpsock, buffer(Json::writeString(wbuilder, root)),
-                     errcode);
-  if (errcode) {
-    std::cerr << "couldnt send json data" << std::endl
-              << errcode.message() << std::endl;
-    return false;
-  }
-  return true;
-}
-
-bool IoMan::receiveJson(boost::asio::streambuf &recvbuf) {
-  // use transfer_at_least(1) to avoid deadlock with transfer_all()
-  boost::asio::read(*tcpsock, recvbuf, boost::asio::transfer_at_least(1),
-                    errcode);
-  if (errcode && errcode != boost::asio::error::eof) {
-    std::cerr << "couldnt recieve json data" << std::endl
-              << errcode.message() << std::endl;
-    return false;
-  }
-  return true;
-}
-
-
-bool IoMan::connect() {
-  boost::asio::streambuf recvbuf;
-  tcp::endpoint *ep;
-  Json::Value root, checkok;
-  bool bcheckok;
-
-  ep = new tcp::endpoint(boost::asio::ip::address::from_string(ipstring), 1234);
-
-  // establish connection
-  std::cerr << "connecting to " << ipstring << std::endl;
-  tcpsock->connect(*ep, errcode);
-  if (errcode) {
-    std::cerr << "couldnt connect to " << ipstring << std::endl
-              << errcode.message() << std::endl;
-    return false;
-  }
-
-  // send version check
-  root["version"] = VERSION;
-
-  std::cerr << root << std::endl;
-
-  if (!sendJson(root))
-    return false;
-  // receive answer
-  if (!receiveJson(recvbuf))
-    return false;
-  if (!parseJson(&root, recvbuf))
-    return false;
-
-  // dump for GUI
-  std::cout << root << std::endl;
-
-  // check if version check was ok
-  checkok = root["accept"];
-
-  if (!checkok.asBool()) {
-    std::cerr << "version check failed. client version is " << VERSION
-              << std::endl
-              << "server reports version " << root["version"] << std::endl;
-    return false;
-  }
-
-  printf("check ok\n\n\n");
-  fflush(stdout);
-
-  // TODO remove hardcoded login
-  root = Json::Value();
-  // send version check
-  // TODO make client version global
-  root["user"] = "user";
-  root["pass"] = "pass";
-
-  std::cerr << root << std::endl;
-
-  // send login
-  if (!sendJson(root))
-    return false;
-  // receive answer to login
-  if (!receiveJson(recvbuf))
-    return false;
-  if (!parseJson(&root, recvbuf))
-    return false;
-
-  // dump for GUI
-  std::cout << root << std::endl;
-
-  // clean up
-  delete ep;
-
-  return true;
-}
-
-IoMan::~IoMan() {
-
-  boost::asio::streambuf recvbuf;
-  Json::Value root, checkok;
-  const char *recvjson;
-  std::string jsonerror;
-
-  // TODO remove hardcoded login
-  root = Json::Value();
-  // send version check
-  // TODO make client version global
-  root["command"] = "close";
-
-  std::cerr << root << std::endl;
-
-  // send disconnect
-  sendJson(root);
-  // recieve answer to disconnect
-  receiveJson(recvbuf);
-  parseJson(&root, recvbuf);
-
-  // dump to GUI
-  std::cout << root << std::endl;
-
-  tcpsock->close();
-  delete tcpsock;
-  delete reader;
-}
-
-*/

+ 11 - 0
cli/src/userioman.cpp

@@ -30,6 +30,17 @@ void UserIoMan::printWelcomeMessage() {
 	std::cout << "please enter user and password" << std::endl;
 }
 
+std::string UserIoMan::getCmdPrompt() {
+	return "ccats> ";
+}
+
+std::string UserIoMan::getUserPrompt() {
+	return "User: ";
+}
+std::string UserIoMan::getPassPrompt() {
+	return "Pass: ";
+}
+
 /* void UserIoMan::run() {
   std::cout << "UserIoMan::run() says hello!" << std::endl;