From 875df5311dfa85dc83a48b73d3cbd8659cabc521 Mon Sep 17 00:00:00 2001 From: HADES_DAQ Date: Tue, 29 Oct 2013 12:14:32 +0100 Subject: [PATCH] added command server,mt --- utils/src/command_server/command_server | Bin 0 -> 23850 bytes utils/src/command_server/command_server.c | 313 ++++++++++++++++++++++ 2 files changed, 313 insertions(+) create mode 100755 utils/src/command_server/command_server create mode 100644 utils/src/command_server/command_server.c diff --git a/utils/src/command_server/command_server b/utils/src/command_server/command_server new file mode 100755 index 0000000000000000000000000000000000000000..7bbec03927f3a14987a405e64c5f12fc45ebdebb GIT binary patch literal 23850 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_QUEUE 5 +#define BUF_SIZE 2048 + +int sock_1, sock_2; /* file descriptors for sockets */ +FILE *fp; + +void exit(int); + +typedef struct TheArgsS { + unsigned long verbosity; + unsigned long port; +} TheArgs; + +void SIGhandler(int); + +void SIGhandler(int sig) +{ + syslog(LOG_ERR, "Caught signal %d, trying to safely exit...", sig); + + if(fp) + fclose(fp); + + if(sock_2) + close(sock_2); + + if(sock_1) + close(sock_1); + + exit(0); +} +void SigCatcher(int n) +{ + wait3(NULL,WNOHANG,NULL); +} + +static void argsDefault(TheArgs *my) +{ + my->verbosity = 0; + my->port = 4712; +} + +static int argsFromCL(TheArgs *my, int argc, char *argv[]) +{ + extern char *optarg; + int i; + + while ((i = getopt(argc, argv, "vp:")) != -1) { + switch (i) { + case 'p': + my->port = atoi(optarg); + break; + case 'v': + my->verbosity = 1; + break; + default: + return -1; + break; + } + } + + return 0; +} + +static void usage(const char *progName) +{ + printf("Usage: %s\n", progName); + printf(" [-p port] : Port number for connection (default: 4712).\n"); + printf(" [-v] : More verbose.\n"); +} + +void talk2client(int sock_2, TheArgs *theArgs) +{ + int firstCmdLine = 0; + int rec_value; + int r = 0; + + struct stat file_status; + + char buf[BUF_SIZE]; + char buf2[BUF_SIZE+300]; + char buf3[BUF_SIZE+300]; + char tmp[BUF_SIZE+300]; + char *token; + char redirect1[100]; + char redirect2[100]; + char fstdout[100]; + char fstderr[100]; + + sprintf(fstdout, "%s%d%s", "/tmp/stdout", (int) getpid(), ".txt"); + sprintf(fstderr, "%s%d%s", "/tmp/stderr", (int) getpid(), ".txt"); + sprintf(redirect1, "1>%s 2>%s", fstdout, fstderr); + sprintf(redirect2, "1>>%s 2>>%s", fstdout, fstderr); + + + char mypattern[BUF_SIZE+100]; + sprintf(mypattern, "iamfromhadesdaq"); /* password */ + + /* Read command from sock_2 */ + while( (rec_value = read( sock_2, buf, BUF_SIZE )) ){ + if( rec_value < 0 ){ + perror("reading stream message"); + exit(1); + } + else + snprintf( buf2, rec_value, "%s", buf ); + + if(theArgs->verbosity) + printf("Received: \"%s\"\n", buf2); + + /* check password only for the first cmd line */ + if( firstCmdLine == 0 ){ + if( 0 != fnmatch(mypattern, buf2, 0) ){ + sprintf( buf, "Error: wrong password! Break connection.\n" ); + printf( "%s", buf ); + printf( "Local pass : %s", mypattern ); + printf( "Remote pass : %s", buf2 ); + write( sock_2, buf, strlen(buf) ); + break; + } + else{ + sprintf( buf, "------------- Connection accepted -------------\n" ); + write( sock_2, buf, strlen(buf) ); + firstCmdLine = 1; /* set to 1 to avoid checking pass second time */ + continue; + } + } + + /* raise(SIGUSR1); */ + + /* Prepare cmd for execution. Write standard out/err to tmp. */ + strcpy(tmp, buf2); + strcpy(buf3, ""); + + /* Split string and build cmd 'buf3' */ + token = strtok( tmp, ";" ); + while( token != (char*)NULL ){ + if( strcmp(buf3, "") != 0 ) + sprintf( buf3, "%s %s %s;", buf3, token, redirect2); + else + sprintf( buf3, "%s %s;", token, redirect1); + + token = strtok( NULL, ";" ); + } + + /* sprintf( buf3, "%s 1>/tmp/stdout.txt 2>/tmp/stderr.txt", buf2 ); */ + + if(theArgs->verbosity) + printf("Command: \"%s\"\n", buf3); + + if(theArgs->verbosity) + printf("before Return value of system: %d\n", r); + + /* Execute cmd and get the return value */ + r = system(buf3); + + if(theArgs->verbosity) + printf("Return value of system: %d\n", r); + + /* Prepare and send the return value of cmd */ + sprintf( buf, "> return value of command: %i\n", r ); + write( sock_2, buf, strlen(buf) ); + + /* Check size of the stdout file, anything to read from file? */ + if(stat(fstdout, &file_status) != 0){ + perror("could not stat"); + } + + if( (int)file_status.st_size ){ + sprintf( buf, "> stdout: \n" ); + write( sock_2, buf, strlen(buf) ); + + /* Open and send the stardard output */ + fp = fopen(fstdout, "r"); + while( (r = fread( buf, sizeof(char), BUF_SIZE, fp )) ){ + write( sock_2, buf, r ); + } + + fclose(fp); + } + + /* Check size of the stderr file, anything to read from file? */ + if(stat(fstderr, &file_status) != 0){ + perror("could not stat"); + } + + if( (int)file_status.st_size ){ + sprintf( buf, "> stderr: \n" ); + write( sock_2, buf, strlen(buf) ); + + /* Open and send the standard error */ + fp = fopen(fstderr, "r"); + while( (r = fread(buf, sizeof(char), BUF_SIZE, fp)) ){ + write( sock_2, buf, r ); + } + + fclose(fp); + } + + sprintf( buf, "------------- END OF OUTPUT ------------\n" ); + write( sock_2, buf, strlen(buf) ); + + /* write(1,buf,rec_value); */ + + } /* End of while( (rec_value = read( sock_2, buf, BUF_SIZE )) ) */ + + if(remove(fstdout)) syslog(LOG_ERR, "%s:%d: %s %s", __FILE__, __LINE__, "Cannot remove file", fstdout); + if(remove(fstderr)) syslog(LOG_ERR, "%s:%d: %s %s", __FILE__, __LINE__, "Cannot remove file", fstderr); +} + +int main( int argc, char *argv[] ) +{ + int sockopt_on = 1; + struct sockaddr_in server; + int pid; + + TheArgs theArgsS, *theArgs = &theArgsS; + + /* signal(SIGCHLD, SIG_IGN); */ + signal(SIGCHLD, SigCatcher); + signal(SIGUSR1, SIGhandler); + signal(SIGTERM, SIGhandler); + signal(SIGABRT, SIGhandler); + signal(SIGILL, SIGhandler); + signal(SIGINT, SIGhandler); + signal(SIGPIPE, SIGhandler); + signal(SIGSEGV, SIGhandler); + + openlog(argv[0], LOG_PID | LOG_PERROR, LOG_LOCAL0); + setlogmask(LOG_UPTO(LOG_INFO)); + + argsDefault(theArgs); + if (0 > argsFromCL(theArgs, argc, argv)) { + usage(argv[0]); + exit(1); + } + + /* Init to zero */ + bzero((char *) &server, sizeof(server)); + + /* Build address in internet domain */ + server.sin_family = AF_INET; + server.sin_addr.s_addr = INADDR_ANY; /* everyone is allowed to connet to server */ + server.sin_port = htons(theArgs->port); + + /* Create stream socket in internet domain */ + sock_1 = socket( AF_INET, SOCK_STREAM, 0 ); + if( sock_1 < 0 ){ + syslog(LOG_ERR, "%s:%d: %s", __FILE__, __LINE__, "Cannot open stream socket"); + exit(1); + } + + /* Make the socket reusable */ + if( 0 > setsockopt( sock_1, SOL_SOCKET, SO_REUSEADDR, &sockopt_on, sizeof(int)) ){ + syslog(LOG_ERR, "%s:%d: %s", __FILE__, __LINE__, "Cannot make socket reusable"); + } + + /* Bind socket */ + if( 0 > bind(sock_1, (struct sockaddr *)&server,sizeof(struct sockaddr_in)) ){ + syslog(LOG_ERR, "%s:%d: %s", __FILE__, __LINE__, "Cannot bind socket"); + exit(1); + } + + listen( sock_1, MAX_QUEUE ); + + while(1){ + /* Start accepting connection */ + sock_2 = accept( sock_1, 0, 0); + + if( sock_2 < 0 ){ + syslog(LOG_ERR, "%s:%d: %s", __FILE__, __LINE__, "Cannot accept connections"); + } + + /* Fork new process */ + pid = fork(); + + if( pid < 0 ) + syslog(LOG_ERR, "%s:%d: %s", __FILE__, __LINE__, "Cannot fork"); + + if( pid == 0 ){ /* Child */ + close(sock_1); + talk2client(sock_2, theArgs); + close(sock_2); + exit(0); + } + else{ /* Parent */ + close(sock_2); + } + + if(theArgs->verbosity){ + printf("Ending connection.\n"); + } + + } /* End of while(1) */ + + close(sock_1); + + return 0; +} + -- 2.43.0