diff options
author | Sebastian | 2010-05-12 19:42:27 +0200 |
---|---|---|
committer | Sebastian | 2010-05-12 19:42:27 +0200 |
commit | ce3329047d378a14006ce74ec273ac59e3375303 (patch) | |
tree | 782430f270b4c7aca1b35d5b7813518e3797c555 /src/pvsDaemon.cpp | |
download | pvs-ce3329047d378a14006ce74ec273ac59e3375303.tar.gz pvs-ce3329047d378a14006ce74ec273ac59e3375303.tar.xz pvs-ce3329047d378a14006ce74ec273ac59e3375303.zip |
initial import of latest svn version
Diffstat (limited to 'src/pvsDaemon.cpp')
-rw-r--r-- | src/pvsDaemon.cpp | 362 |
1 files changed, 362 insertions, 0 deletions
diff --git a/src/pvsDaemon.cpp b/src/pvsDaemon.cpp new file mode 100644 index 0000000..961e0f3 --- /dev/null +++ b/src/pvsDaemon.cpp @@ -0,0 +1,362 @@ +#include <QCoreApplication> +#include <getopt.h> +#include <stdlib.h> +#include "pvs.h" +#include "src/net/pvsLocalhostCommunicator.h" +#include "src/util/pvsSettingsManager.h" +#include "setup.h" +#include "src/net/pvsMsg.h" +#include "src/core/pvsChatClient.h" + +PVS *mainClient = NULL; + +// This define works as a switch whether to run as deamon or regular app +#define as_daemon + +/// VERSION_STRING is defined in src/version.h +void printVersion(bool doExit) +{ + + printf("Version:\t"VERSION_STRING"\n"); + if (doExit) + exit(0); +} + +/// outputs the full help text +void printHelp() +{ + printf("**************************************************************\n"); + printf("\nPool Video Switch Client\n"); + printf("**************************************************************\n"); + printVersion(false); + printf("**************************************************************\n"); + printf("Usage:\tpoolVSClient <<option> <value>, ... >\n\n"); + printf("Options:\n\n"); + printf("-vncScriptFile <fullpath\\filename>\n\tSpecifies a custom location for the vnc-start/stop-script.\n\tIf not specified, ~/.pvs/pvs-vncsrv is expected.\n\n"); + printf("-freq <seconds>\n\tSpecifies how long to wait until a reconnection attempt is made.\n\tDefault is 5.\n\n"); + printf("-port <port>\n\tSpecifies on which port to run.\n\tDefault is %d.\n\n", SERVER_PORT_INT); + printf("-h or --help\n\t Shows this help text and exits.\n\n"); + printf("-v or --version\n\t Shows the current version and exits.\n"); + printf( + "-c <string command>:<string value> \n\t Sends the command and the optional value to a running PVS-Client.\n\t Command and value may not contain spaces or colons.\n\t The dividing colon is mandatory.\n"); + printf("-commands: \n\tPrints out available commands to use with -c . \n "); + printf("**************************************************************\n"); + exit(0); +} + +/// outputs a brief help text +void printNotice() +{ + printf( + "Use -h or --help to get a listing of all options.\n-v or --version gives you the current version.\n\n"); +} + +void printCommands() +{ + printf("**************************************************************\n"); + printf("chat:<on/ off/ 1/ 2/ 3>\n "); + printf("on = turns that chat option on\n off = turns the chat option off\n 1 = bossmode\n 2 = community\n 3 = private\n"); + printf("stop \n\t Stops the running PVS-Client.\n"); + printf("**************************************************************\n"); + exit(0); +} + +/// +int main(int argc, char** argv) +{ + int frequency = 5; + int port = -1; + QString homeDir("/home/"); + QString scriptPath = homeDir; + scriptPath.append(getUserName().append(QString("/.pvs/pvs-vncsrv"))); + QString scriptName; + scriptName = getFilenameFromPath(scriptPath); + + QCoreApplication app(argc, argv); + app.setOrganizationName("openslx"); + app.setOrganizationDomain("openslx.org"); + app.setApplicationName("pvs"); + // use system locale as language to translate gui + QTranslator translator; + translator.load(":pvs"); + app.installTranslator(&translator); + + + PVSLocalhostCommunicator com(getPolicyFilePath(QString( + ".comfile"))); + com.run(); + if (!(com.running())) + { + printf("Error. UDS Communicator is not running. Exiting.\n"); + exit(0); + } + + printf("UDS Communicator is running.\n"); + int option_index = 0; + + while (1) + { + static struct option long_options[] = + { + { "help", no_argument, 0, 'h' }, + { "commands", no_argument, 0, 'o' }, + { "version", no_argument, 0, 'v' }, + { "port", required_argument, 0, 'p' }, + { "freq", required_argument, 0, 'f' }, + { "client", required_argument, 0, 'e' }, + { "script", required_argument, 0, 's' }, + { 0, 0, 0, 0 }, + }; + /* getopt_long stores the option index here. */ + + int c = getopt_long(argc, argv, "hvoc:f:e:s:p:", long_options, + &option_index); + option_index++; + if (c == -1) + break; + + switch (c) + { + case 'h': + printHelp(); + break; + case 'o': + printCommands(); + break; + case 'v': + printVersion(true); + break; + case 'c': + { + if (option_index + 1 < argc) + { + if (com.server()) + { + // wont work, no daemon running + printf("Error. No running PVS-Client found. Exiting.\n"); + com.stop(); + } + else + { + QStringList line = QString::fromLocal8Bit(argv[option_index + + 1]).split(":"); + QString &ident = line[0]; + QString message; + if (line.size() > 1) + message = line[1]; + if (ident.size() > 0) // no use sending empty idents... not even sure if this COULD happen + { + bool flag = false; + if (ident == "make") + PVSSettingsManager::getManager()->setConfigs(); + else if (ident == "chat" && message == "boss") + { + PVSSettingsManager::getManager()->reWriteConfigs("chatmode", "bossmode"); + flag = true; + + } + else if (ident == "chat" && message == "all") + { + PVSSettingsManager::getManager()->reWriteConfigs("chatmode", "community"); + flag = true; + } + else if (ident == "chat" && message == "private") + { + PVSSettingsManager::getManager()->reWriteConfigs("chatmode", "private"); + flag = true; + } + else if (ident == "chat" && message == "on") + { + PVSSettingsManager::getManager()->reWriteConfigs("chatstate", "on"); + flag = true; + } + else if (ident == "chat" && message == "off") + { + PVSSettingsManager::getManager()->reWriteConfigs("chatstate", "off"); + flag = true; + } + else if (ident == "room") + { + //PVSSettingsManager::getManager()->reWriteConfigs(ident, message); + flag = true; + } + else if (ident == "stop" && message == NULL) + flag = true; + else + printf("option %s doesn't exist\n", ident.toUtf8().data()); + + if (flag) + { + qDebug("Will send i: %s, m: %s\n", ident.toUtf8().data(), message.toUtf8().data()); + com.sendCommand(ident, message); + QCoreApplication::processEvents(QEventLoop::AllEvents); + printf("Sent command. Exiting.\n"); + } + } + + else + printf("Something went horribly wrong, since the ident is empty.\n"); + + } + } + else + { + printf("Error. No command issued. Exiting.\n"); + } + exit(0); // and gone + break; + } + case 'f': + { + if (option_index + 1 < argc) + { + frequency = atoi(argv[option_index + 1]); + if (frequency <= 0) + { + frequency = 5; // return to standard + ConsoleLog writeError(QString( + "malformed frequency, setting standard = 5")); + printNotice(); + } + else + ConsoleLog writeLine(QString("Using frequency ").append( + int2String(frequency))); + option_index++; + continue; + } + break; + } + case 'p': + { + if (option_index + 1 < argc) + { + port = atoi(argv[option_index + 1]); + if (port <= 0) + { + ConsoleLog writeTerminal(QString("port maybe malformed")); + printNotice(); + port = -1; // return to standard + } + else + ConsoleLog writeTerminal(QString("Using port ").append( + int2String(port))); + option_index++; + continue; + } + break; + } + case 'e': + { + if (option_index + 1 < argc) + { + printf("WARNING: -e is deprecated\n"); + option_index++; + continue; + } + break; + } + case 's': + { + if (option_index + 1 < argc) + { + scriptPath = QString(argv[option_index + 1]); + scriptName = getFilenameFromPath(scriptPath); + option_index++; + continue; + } + break; + } + case '?': + { + ConsoleLog writeError( + QString("Unrecognized option/paramter: ").append( + argv[option_index])); + printNotice(); + } + default: + abort(); + } + //else + // printNotice(); + } + + if (!com.server()) + { + printf("Error. PoolVSClient already running. Exiting\n"); + com.stop(); + exit(0); + } + + ConsoleLog setLogName(QString("log.client")); + ConsoleLog writeLine(QString("PVS-Client started.")); + +#ifdef as_daemon + + /* Our process ID and Session ID */ + pid_t pid, sid; + + /* Fork off the parent process */ + pid = fork(); + if (pid < 0) + { + exit(-1); + } + /* If we got a good PID, then + we can exit the parent process. */ + if (pid > 0) + { + exit(0); + } + + /* Change the file mode mask */ + umask(0); + + /* Open any logs here */ + + /* Create a new SID for the child process */ + sid = setsid(); + if (sid < 0) + { + /* Log the failure */ + exit(-1); + } + + /* Change the current working directory */ + if ((chdir("/")) < 0) + { + /* Log the failure */ + exit(-1); + } + + /* Close out the standard file descriptors */ + close(STDIN_FILENO); + freopen ((QString("/home/").append(getUserName().append(QString("/.pvs/dump")))).toUtf8().data(),"w",stdout); + //close(STDOUT_FILENO); + close(STDERR_FILENO); + + /* Daemon-specific initialization goes here */ + + /* The Big Loop */ + +#endif + + mainClient = new PVS(); + PVSSettingsManager::getManager()->setConfigFile(getPolicyFilePath("clientconf")); + com.getDispatcher()->addListener("*", mainClient, &PVS::onDaemonCommand); + + if (port <= 0) + port = SERVER_PORT_INT; + ConsoleLog writeLine(QString("TCP-Port: ").append(int2String(port))); + mainClient->setScriptPath(scriptPath); + ConsoleLog writeLine(QString("VNCScriptPath: ").append(scriptPath)); + createPolicyDir(); + createPolicyFiles(); + + // long int gr = 0; + mainClient->setScriptPath(scriptPath); + app.exec(); + delete mainClient; + + return 0; +} + |