From d3cb5ed54623b42c15384fa80a622bef043f529c Mon Sep 17 00:00:00 2001 From: Sebastian Schmelzer Date: Thu, 14 Jul 2011 15:23:41 +0200 Subject: initial import --- src/client/main.cpp | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/client/main.cpp (limited to 'src/client') diff --git a/src/client/main.cpp b/src/client/main.cpp new file mode 100644 index 0000000..dfec059 --- /dev/null +++ b/src/client/main.cpp @@ -0,0 +1,139 @@ +/* + # Copyright (c) 2011 - OpenSLX Project, Computer Center University of Freiburg + # + # This program is free software distributed under the GPL version 2. + # See http://gpl.openslx.org/ + # + # If you have any feedback please consult http://feedback.openslx.org/ and + # send your suggestions, praise, or complaints to feedback@openslx.org + # + # General information about OpenSLX can be found at http://openslx.org/ + */ + +#include +#include +#include +#include + +#include "../version.h" + +using namespace std; + +static void usage(char *name) +{ + printf("usage: %s -h [-p ] -i -d \n", name); + printf("\t-h \t gearman job server host\n"); + printf("\t-p \t gearman job server port\n"); + printf("\t-i \t remote image file to load\n"); + printf("\t-d \t local nbd-device to use\n"); + printf("\t-v\t\t print version and exit\n"); +} + +int main(int argc, char* argv[]) +{ + string host(""); + in_port_t port = 0; + string image(""); + string device(""); + + gearman_return_t ret; + gearman_client_st client; + + // parse command line arguments + int c; + while ((c = getopt(argc, argv, "h:p:i:d:v")) != -1) + { + switch (c) + { + case 'h': + host = optarg; + break; + case 'p': + port = (in_port_t) atoi(optarg); + break; + case 'i': + image = optarg; + break; + case 'd': + device = optarg; + break; + case 'v': + printf("Version: %s\n", VERSION_STRING); + exit(0); + default: + usage(argv[0]); + exit(1); + } + } + + if (host == "" || image == "" || device == "") + { + usage(argv[0]); + exit(1); + } + + // initialize gearman client + if (gearman_client_create(&client) == NULL) + { + cerr << "[ERROR] Memory allocation failure on client creation" << endl; + exit(1); + } + ret = gearman_client_add_server(&client, host.c_str(), port); + if (ret != GEARMAN_SUCCESS) + { + cerr << "[ERROR] " << gearman_client_error(&client) << endl; + exit(1); + } + + // main loop + char *result; + size_t result_size; + string msg; + while (1) + { + // send request to gearman job server + result = (char *) gearman_client_do(&client, "start_nbd_server", NULL, + (void*) image.c_str(), (size_t) image.length(), &result_size, + &ret); + + if (ret == GEARMAN_WORK_DATA) + { + msg = result; + free(result); + continue; + } + else if (ret == GEARMAN_WORK_STATUS) + { + uint32_t m, n; + gearman_client_do_status(&client, &n, &m); + printf("[INFO] Status: %u/%u\n", n, m); + continue; + } + else if (ret == GEARMAN_SUCCESS) + { + // start nbd-client + stringstream command; + command << "nbd-client " << host << " " << msg << " " << device; + cout << "[DEBUG] " << "Running command: " << command.str() << endl; + system(command.str().c_str()); + free(result); + } + else if (ret == GEARMAN_WORK_FAIL) + { + cerr << "[ERROR] " << msg << endl; + cerr << "[ERROR] Work failed" << endl; + free(result); + } + else + { + cerr << "[ERROR] " << gearman_client_error(&client) << endl; + free(result); + } + + break; + } + + // cleanup + gearman_client_free(&client); + return 0; +} -- cgit v1.2.3-55-g7522