Brief description of class still missing. More...
#include <SystemBuffer.h>
Public Member Functions | |
SystemBuffer (int fileDescriptor) | |
~SystemBuffer () | |
Protected Member Functions | |
virtual int | bytesAvailable (char *buffer, int bytesCount) |
Brief description of class still missing.
Full description of class still missing
SystemBuffer::SystemBuffer | ( | int | fileDescriptor | ) |
Description of constructor still missing
References TRACE.
: DynamicBuffer(fileDescriptor) { TRACE; }
int SystemBuffer::bytesAvailable | ( | char * | buffer, |
int | bytesCount | ||
) | [protected, virtual] |
Communication protocol:
'poweroff' Powers off system 'reboot' Reboots system 'diskspace' Return disk space on usb storage 'clearlogs' Clears logs (gps, seiscomp and dascube) 'comments' Returns all user comments 'addcomment LEN' Adds user comment of length LEN 'resynchronize' Restarts all acquitions
Implements GpCoreTools::DynamicBuffer.
References GpCoreTools::DynamicBuffer::read(), GpCoreTools::DynamicBuffer::send(), and TRACE.
{ TRACE; int bytesRead=0; while(bytesRead<bytesCount) { // Scan for a line int newBytesRead; for(newBytesRead=bytesRead; newBytesRead<bytesCount && buffer[newBytesRead]!='\n'; newBytesRead++) {} if(newBytesRead==bytesCount) { return bytesRead; // partial line } int originalBytesRead=bytesRead; // In case message is spread over more than a single line switch(buffer[bytesRead]) { case 'a': if(File::match(buffer, bytesRead, bytesCount, "addcomment=")) { if(addComment(buffer, bytesRead, bytesCount)) { newBytesRead=bytesRead; } else { return originalBytesRead; } } break; case 'c': if(File::match(buffer, bytesRead, bytesCount, "clearusb")) { system("find /mnt/usb/waran/archive -mtime +5 -and -type f -delete"); system("find /mnt/usb/waran/gps -mtime +5 -and -type f -delete"); system("find /mnt/usb/waran/logs -mtime +5 -and -type f -delete"); } else if(File::match(buffer, bytesRead, bytesCount, "comments")) { char * com=File::readAll("/mnt/usb/waran/comments.txt"); if(com) { int comSize=strlen(com); char buf[32]; sprintf(buf, "comments=%i\n", comSize); send(buf, strlen(buf)); send(com, comSize); } else { Log::write(0, "cannot open file '/mnt/usb/waran/comments.txt' for command 'comments'\n"); } } break; case 'd': if(File::match(buffer, bytesRead, bytesCount, "diskspace")) { int saved_stdout=dup(STDOUT_FILENO); int out_pipe[2]; if(pipe(out_pipe)==0) { dup2(out_pipe[1], STDOUT_FILENO); // sets stdout to write end of the pipe close(out_pipe[1]); // close the fd originally attached to the pipe system("df /dev/sdb1 | awk '{if(NR==2) {print \"diskspace=\" $4}}'"); char buf[32]; int n=::read(out_pipe[0], buf, 32); dup2(saved_stdout, STDOUT_FILENO); // reconnect stdout send(buf, n); } else { Log::write(0, "cannot open pipe for command 'diskspace'\n"); } } break; case 'p': if(File::match(buffer, bytesRead, bytesCount, "poweroff")) { system("/etc/init.d/seiscomp stop"); // seiscomp does not always stop properly, a try to fix it sleep(5); system("/etc/init.d/warangps stop"); sleep(5); send("halting...\n", 11); system("sync"); sleep(10); // Make sure than all stations received the power off message (multi-hop routes // might be affected by the removal of this station. system("poweroff"); } break; case 'r': if(File::match(buffer, bytesRead, bytesCount, "reboot")) { system("/etc/init.d/seiscomp stop"); // seiscomp does not always stop properly, a try to fix it sleep(5); system("/etc/init.d/warangps stop"); sleep(5); send("halting...\n", 11); system("sync"); sleep(10); // Make sure than all stations received the power off message (multi-hop routes // might be affected by the removal of this station. system("reboot"); } break; default: break; } bytesRead=newBytesRead+1; // Skip blanks and additionnal end of line characters while(bytesRead<bytesCount && isspace(buffer[bytesRead])) {bytesRead++;} } return bytesRead; }