You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

194 lines
5.1 KiB
C++

/*
* tscanserver implementation
*
* Copyright (C) Thomas Escher, Kai Lingemann
*
* Released under the GPL version 3.
*
*/
/**
* @file
* @brief Dynamic management of scans.
* @author Thomas Escher
*/
#include <iostream>
using std::cout;
using std::cerr;
using std::endl;
#include <string>
using std::string;
// for signals
#include <csignal>
// for getopt
#ifndef _MSC_VER
#include <getopt.h>
#else
#include "XGetopt.h"
#endif
#include "scanserver/serverInterface.h"
#include "scanserver/cacheIO.h"
#include "scanserver/scanHandler.h"
bool keep_temp_files = false;
void signal_segv(int v)
{
static sig_atomic_t signal_once = false;
if(!signal_once) {
signal_once = true;
cout << endl
<< "# Scanserver closed due to segmentation fault #" << endl;
// remove server and memory
ServerInterface::destroy();
// clean up temporary files
if(!keep_temp_files)
CacheIO::removeTemporaryDirectory();
}
exit(-1);
}
void signal_interrupt(int v)
{
static sig_atomic_t signal_once = false;
if(!signal_once) {
signal_once = true;
cout << endl
<< "# Scanserver closed #" << endl;
// remove server and memory
ServerInterface::destroy();
// clean up temporary files
if(!keep_temp_files)
CacheIO::removeTemporaryDirectory();
}
exit(-1);
}
void usage(const char* name)
{
#ifndef _MSC_VER
const string bold("\033[1m");
const string normal("\033[m");
#else
const string bold("");
const string normal("");
#endif
cout <<bold<< "USAGE" <<normal<< endl
<< " " << name << " [options]" << endl << endl
<<bold<< "OPTIONS" <<normal<< endl
<< " "<<bold<<"-c"<<normal<<" NR, "<<bold<<"--cachesize"<<normal<<" NR [default 1500]" << endl
<< " Size of shared memory for cache objects in MB. Increase for less reloading of scans and reduced points." << endl
<< " "<<bold<<"-d"<<normal<<" NR, "<<bold<<"--datasize"<<normal<<" NR [default 150]" << endl
<< " Size of shared memory for main data structures in MB. Increase for huge amounts of scans." << endl
<< " "<<bold<<"-b"<<normal<<" 0/1, "<<bold<<"--binary_scan_cache"<<normal<<" [default on]" << endl
<< " Save scans in a binary representation if removed from memory for faster reloading." << endl
<< " Useful for trying different range or reduction parameters, but will use much space." << endl
<< " "<<bold<<"-t"<<normal<<" path, "<<bold<<"--temporary_path"<<normal<<" path [default temp]" << endl
<< " Directory for holding temporary cache object files." << endl
/*
<< " "<<bold<<"-k"<<normal<<", "<<bold<<"--keep"<<normal<<" [default off]" << endl
<< " Keep temporary cache objects after server is shut down."<<" Not implemented!" << endl
*/
;
}
void parseArgs(int argc, char** argv, std::size_t& cache_size, std::size_t& data_size, string& temporary_path, bool& keep, bool& binary_scan_cache)
{
int c;
extern char *optarg;
static struct option longopts[] = {
{"cachesize", required_argument, 0, 'c'},
{"datasize", required_argument, 0, 'd'},
{"temporary_path", required_argument, 0, 't'},
{"keep", no_argument, 0, 'k'},
{"binary_scan_cache", required_argument, 0, 'b'},
{"help", no_argument, 0, '?'}
};
while((c = getopt_long(argc, argv, "c:d:t:b:k?", longopts, 0)) != -1) {
switch(c) {
case 'c':
cache_size = atoi(optarg);
break;
case 'd':
data_size = atoi(optarg);
break;
case 't':
temporary_path = optarg;
break;
case 'k':
/* no parameter-tco database yet implemented
keep = true;
*/
break;
case 'b':
binary_scan_cache = (atoi(optarg)==0? false: true);
break;
case '?':
usage(argv[0]);
exit(0);
default:
exit(1);
}
}
}
int main(int argc, char** argv)
{
// check for singleton process
// TODO
// default parameters
std::size_t cache_size = 750;
std::size_t data_size = 75;
// std::size_t cache_size = 150;
// std::size_t data_size = 15;
string temporary_path = "temp";
bool binary_scan_cache = true;
// parse arguments
parseArgs(argc, argv, cache_size, data_size, temporary_path, keep_temp_files, binary_scan_cache);
// create temporary directory and configure ScanHandler if so desired
CacheIO::createTemporaryDirectory(temporary_path);
if(binary_scan_cache)
ScanHandler::setBinaryCaching();
// create the server instance
cout << "Starting scanserver." << endl
<< " Cache size: " << cache_size << "MB, Data Size: " << data_size << "MB." << endl
<< " Binary scan caching: " << (binary_scan_cache? "yes": "no") << endl;
ServerInterface* server = ServerInterface::create(data_size*1024*1024, cache_size*1024*1024);
cout << endl;
// prepare signal handlers after server is created
signal(SIGSEGV, signal_segv);
signal(SIGINT, signal_interrupt);
signal(SIGTERM, signal_interrupt);
// run forrest, run
server->run();
// end of line!
cout << "Stopping scanserver." << endl;
ServerInterface::destroy();
// clean up temporary files
if(!keep_temp_files)
CacheIO::removeTemporaryDirectory();
}