diff options
author | Alexander Wenzel <Alexander.AW.Wenzel@bmw.de> | 2011-10-06 13:52:34 +0200 |
---|---|---|
committer | Alexander Wenzel <Alexander.AW.Wenzel@bmw.de> | 2011-10-06 13:52:34 +0200 |
commit | 3367843af8cc0bd2d3392e5131bb18bddd70fc9f (patch) | |
tree | 66f37e575f5ad8de4fa14fa3f5aba063990f5681 /src/system | |
parent | fbc90e0e3b7c6754cc426b183eeabea3e98359d8 (diff) | |
download | DLT-daemon-3367843af8cc0bd2d3392e5131bb18bddd70fc9f.tar.gz |
First implementation of filetransfer manager.
Diffstat (limited to 'src/system')
-rw-r--r-- | src/system/dlt-system-log.c | 106 | ||||
-rw-r--r-- | src/system/dlt-system-log.h | 3 | ||||
-rwxr-xr-x | src/system/dlt-system.c | 77 | ||||
-rw-r--r-- | src/system/dlt-system.conf | 23 | ||||
-rw-r--r-- | src/system/dlt-system.h | 13 | ||||
-rw-r--r-- | src/system/dlt-system_cfg.h | 7 |
6 files changed, 215 insertions, 14 deletions
diff --git a/src/system/dlt-system-log.c b/src/system/dlt-system-log.c index de40176..dc556e2 100644 --- a/src/system/dlt-system-log.c +++ b/src/system/dlt-system-log.c @@ -10,11 +10,117 @@ #include "dlt_common.h" #include "dlt_user.h" +#include "dlt_filetransfer.h" #include "dlt-system.h" #include "dlt-system_cfg.h" #include "dlt-system-log.h" +void dlt_system_filetransfer_init(DltSystemOptions *options,DltSystemRuntime *runtime) +{ + runtime->filetransferFile[0] = 0; + runtime->filetransferRunning = 0; + runtime->filetransferCountPackages = 0; +} + +void dlt_system_filetransfer_run(DltSystemOptions *options,DltSystemRuntime *runtime,DltContext *context) +{ + struct dirent *dp; + char filename[256]; + unsigned long size_oldest = 0; + struct stat status; + time_t time_oldest = 0; + int transferResult; + int total_size, used_size; + + if(runtime->filetransferRunning == 0) { + /* delete last transmitted file */ + if(runtime->filetransferFile[0]!=0) { + printf("Remove File: %s\n",runtime->filetransferFile); + if(remove(runtime->filetransferFile)) { + printf("Remove file %s failed!\n",runtime->filetransferFile); + return; + } + runtime->filetransferFile[0]=0; + } + + /* filetransfer not running, check directory */ + filename[0] = 0; + DIR *dir = opendir(options->FiletransferDirectory); + while ((dp=readdir(dir)) != NULL) { + if(strcmp(dp->d_name,".")!=0 && strcmp(dp->d_name,"..")!=0) { + sprintf(filename,"%s/%s",options->FiletransferDirectory,dp->d_name); + stat(filename,&status); + if(time_oldest == 0 || status.st_mtime < time_oldest) { + time_oldest = status.st_mtime; + size_oldest = status.st_size; + strcpy(runtime->filetransferFile,filename); + } + } + } + closedir(dir); + + /* start filetransfer if file exists */ + if(runtime->filetransferFile[0]) { + printf("Start Filetransfer: %s\n",runtime->filetransferFile); + runtime->filetransferCountPackages = dlt_user_log_file_packagesCount(context,runtime->filetransferFile); + if(runtime->filetransferCountPackages < 0 ) + { + printf("Error: dlt_user_log_file_packagesCount\n"); + runtime->filetransferCountPackages = 0; + runtime->timeFiletransferDelay = options->FiletransferTimeDelay; + return; + } + runtime->filetransferRunning = 1; + transferResult = dlt_user_log_file_header(context,runtime->filetransferFile); + if(transferResult < 0) + { + printf("Error: dlt_user_log_file_header\n"); + runtime->filetransferCountPackages = 0; + runtime->filetransferRunning = 0; + runtime->timeFiletransferDelay = options->FiletransferTimeDelay; + return; + } + runtime->filetransferLastSentPackage = 0; + } + + } + + if (runtime->filetransferRunning == 1) { + /* filetransfer is running, send next data */ + while(runtime->filetransferLastSentPackage<runtime->filetransferCountPackages) { + runtime->filetransferLastSentPackage++; + transferResult = dlt_user_log_file_data(context,runtime->filetransferFile,runtime->filetransferLastSentPackage,0); + if(transferResult < 0) + { + printf("Error: dlt_user_log_file_data\n"); + return; + } + /* wait sending next package if more than 50% of buffer used */ + dlt_user_check_buffer(&total_size, &used_size); + if((total_size - used_size) < (total_size/2)) + break; + } + if(runtime->filetransferLastSentPackage==runtime->filetransferCountPackages) { + transferResult = dlt_user_log_file_end(context,runtime->filetransferFile,0); + if(transferResult < 0) + { + printf("Error: dlt_user_log_file_end\n"); + runtime->filetransferCountPackages = 0; + runtime->filetransferRunning = 0; + runtime->timeFiletransferDelay = options->FiletransferTimeDelay; + return; + } + runtime->timeFiletransferDelay = options->FiletransferTimeDelay; + runtime->filetransferRunning = 0; + } + + } + + + +} + void dlt_system_log_kernel_version(DltSystemOptions *options,DltContext *context) { FILE * pFile; char buffer[1024]; diff --git a/src/system/dlt-system-log.h b/src/system/dlt-system-log.h index a26a994..abb8aec 100644 --- a/src/system/dlt-system-log.h +++ b/src/system/dlt-system-log.h @@ -1,6 +1,9 @@ #ifndef DLT_SYSTEM_LOG_H #define DLT_SYSTEM_LOG_H +extern void dlt_system_filetransfer_init(DltSystemOptions *options,DltSystemRuntime *runtime); +extern void dlt_system_filetransfer_run(DltSystemOptions *options,DltSystemRuntime *runtime,DltContext *context); + extern void dlt_system_log_kernel_version(DltSystemOptions *options,DltContext *context); extern void dlt_system_log_processes(DltSystemOptions *options,DltContext *context); diff --git a/src/system/dlt-system.c b/src/system/dlt-system.c index f186721..6ffacc5 100755 --- a/src/system/dlt-system.c +++ b/src/system/dlt-system.c @@ -98,6 +98,7 @@ DLT_DECLARE_CONTEXT(syslogContext); DLT_DECLARE_CONTEXT(kernelVersionContext); DLT_DECLARE_CONTEXT(processesContext); +DLT_DECLARE_CONTEXT(filetransferContext); void dlt_system_init_options(DltSystemOptions *options) { @@ -105,6 +106,10 @@ void dlt_system_init_options(DltSystemOptions *options) strncpy(options->ApplicationId,DEFAULT_APPLICATION_ID,sizeof(options->ApplicationId)); strncpy(options->SyslogContextId,DEFAULT_SYSLOG_CONTEXT_ID,sizeof(options->SyslogContextId)); options->SyslogPort = DEFAULT_SYSLOG_PORT; + strncpy(options->FiletransferDirectory,DEFAULT_FILETRANSFER_DIRECTORY,sizeof(options->FiletransferDirectory)); + strncpy(options->FiletransferContextId,DEFAULT_FILETRANSFER_CONTEXT_ID,sizeof(options->FiletransferContextId)); + options->FiletransferTimeStartup = DEFAULT_FILETRANSFER_TIME_STARTUP; + options->FiletransferTimeDelay = DEFAULT_FILETRANSFER_TIME_DELAY; options->LogKernelVersionMode = DEFAULT_LOG_KERNEL_VERSION_MODE; strncpy(options->LogKernelVersionContextId,DEFAULT_LOG_KERNEL_VERSION_CONTEXT_ID,sizeof(options->LogKernelVersionContextId)); options->LogProcessesMode = DEFAULT_LOG_PROCESSES_MODE; @@ -208,6 +213,26 @@ int dlt_system_parse_configuration(DltSystemOptions *options) options->SyslogPort = atoi(value); printf("Option: %s=%s\n",token,value); } + else if(strcmp(token,"FiletransferDirectory")==0) + { + strncpy(options->FiletransferDirectory,value,sizeof(options->FiletransferDirectory)); + printf("Option: %s=%s\n",token,value); + } + else if(strcmp(token,"FiletransferContextId")==0) + { + strncpy(options->FiletransferContextId,value,sizeof(options->FiletransferContextId)); + printf("Option: %s=%s\n",token,value); + } + else if(strcmp(token,"FiletransferTimeStartup")==0) + { + options->FiletransferTimeStartup = atoi(value); + printf("Option: %s=%s\n",token,value); + } + else if(strcmp(token,"FiletransferTimeDelay")==0) + { + options->FiletransferTimeDelay = atoi(value); + printf("Option: %s=%s\n",token,value); + } else if(strcmp(token,"LogKernelVersionMode")==0) { options->LogKernelVersionMode = atoi(value); @@ -265,6 +290,7 @@ int main(int argc, char* argv[]) int firsttime = 1; DltSystemOptions options; + DltSystemRuntime runtime; /* init options */ dlt_system_init_options(&options); @@ -290,6 +316,9 @@ int main(int argc, char* argv[]) if(options.LogProcessesMode != DLT_SYSTEM_MODE_OFF) DLT_REGISTER_CONTEXT(processesContext,options.LogProcessesContextId,"Log Processes"); + if(options.FiletransferDirectory[0]!=0) + DLT_REGISTER_CONTEXT(filetransferContext,options.FiletransferContextId,"Filetransfer"); + /* create systemd socket */ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { @@ -312,38 +341,66 @@ int main(int argc, char* argv[]) FD_ZERO(&rfds); FD_SET(sock, &rfds); + /* init timers */ lasttime = dlt_uptime(); + runtime.timeStartup = 0; + runtime.timeFiletransferDelay = 0; + + /* initialise filetransfer manager */ + dlt_system_filetransfer_init(&options,&runtime); while (1) { /* Wait up to one second. */ tv.tv_sec = 0; - tv.tv_usec = (dlt_uptime()-lasttime+10000)*100; + if(runtime.filetransferRunning) + tv.tv_usec = 10000; + else + tv.tv_usec = (dlt_uptime()-lasttime+10000)*100; /* wait data to be received, or wait min time */ retval = select(1, &rfds, NULL, NULL, &tv); - /* Don't rely on the value of tv now! */ if (retval == -1) perror("select()"); else if (retval) - printf("Data is available now.\n"); - //else - // printf("No data within one seconds.\n"); + ;//printf("Data is available now.\n"); + else + ;//printf("No data within one seconds.\n"); + + /* call filtransfer even in shorter time schedule */ + if(runtime.filetransferRunning) + dlt_system_filetransfer_run(&options,&runtime,&filetransferContext); if((dlt_uptime()-lasttime) >= 10000) { /* one second elapsed */ lasttime = dlt_uptime(); + runtime.timeStartup++; + /* filetransfer manager */ + if(options.FiletransferDirectory[0]!=0) { + if(runtime.timeStartup > options.FiletransferTimeStartup) { + if(runtime.timeFiletransferDelay>0) { + runtime.timeFiletransferDelay--; + } + else { + dlt_system_filetransfer_run(&options,&runtime,&filetransferContext); + } + } + } + + /* log kernel version */ if(((options.LogKernelVersionMode == DLT_SYSTEM_MODE_STARTUP) && firsttime) || (options.LogKernelVersionMode == DLT_SYSTEM_MODE_REGULAR) ) { dlt_system_log_kernel_version(&options,&kernelVersionContext); } + + /* log processes information */ if(((options.LogProcessesMode == DLT_SYSTEM_MODE_STARTUP) && firsttime) || (options.LogProcessesMode == DLT_SYSTEM_MODE_REGULAR) ) { dlt_system_log_processes(&options,&processesContext); - } + } firsttime = 0; } @@ -364,9 +421,6 @@ int main(int argc, char* argv[]) } else { - DLT_UNREGISTER_CONTEXT(processesContext); - DLT_UNREGISTER_CONTEXT(syslogContext); - DLT_UNREGISTER_APP(); exit(1); } } @@ -386,7 +440,10 @@ int main(int argc, char* argv[]) if(options.LogProcessesMode != DLT_SYSTEM_MODE_OFF) DLT_UNREGISTER_CONTEXT(processesContext); - DLT_UNREGISTER_CONTEXT(syslogContext); + if(options.FiletransferDirectory[0]!=0) + DLT_UNREGISTER_CONTEXT(filetransferContext); + + DLT_UNREGISTER_CONTEXT(syslogContext); DLT_UNREGISTER_APP(); return 0; diff --git a/src/system/dlt-system.conf b/src/system/dlt-system.conf index b47129d..ee67a0b 100644 --- a/src/system/dlt-system.conf +++ b/src/system/dlt-system.conf @@ -19,6 +19,25 @@ SyslogContextId = SYSL SyslogPort = 47111 ######################################################################## +# Filetransfer Manager +######################################################################## + +# Directory which contains files to be transfered over DLT (Default: /tmp/filetransfer) +# Files are deleted after Filetransfer is finished and after TimeDelay expired +FiletransferDirectory = /tmp/filetransfer + +# The Context Id of the filetransfer (Default: FILE) +FiletransferContextId = FILE + +# Time after startup of dlt-system when first file is transfered (Default: 30) +# Time in seconds +FiletransferTimeStartup = 5 + +# Time to wait when transfered file is deleted and next file transfer starts (Default: 10) +# Time in seconds +FiletransferTimeDelay = 3 + +######################################################################## # Log Kernel version ######################################################################## @@ -27,7 +46,7 @@ SyslogPort = 47111 LogKernelVersionMode = 2 # The Context Id of the kernel version (Default: VERS) -LogKernelVersionContextId = VERS +LogKernelVersionContextId = KVER ######################################################################## # Log Processes @@ -35,7 +54,7 @@ LogKernelVersionContextId = VERS # Log the processes in /proc with info from /proc/x/stat (Default: 1) # 0 = off, 1 = startup only, 2 = regular -LogProcessesMode = 2 +LogProcessesMode = 0 # The Context Id of the kernel version (Default: PROC) LogProcessesContextId = PROC diff --git a/src/system/dlt-system.h b/src/system/dlt-system.h index cd42bd7..40f1dbd 100644 --- a/src/system/dlt-system.h +++ b/src/system/dlt-system.h @@ -10,10 +10,23 @@ typedef struct { char ApplicationId[256]; char SyslogContextId[256]; int SyslogPort; + char FiletransferDirectory[256]; + char FiletransferContextId[256]; + int FiletransferTimeStartup; + int FiletransferTimeDelay; int LogKernelVersionMode; char LogKernelVersionContextId[256]; int LogProcessesMode; char LogProcessesContextId[256]; } DltSystemOptions; +typedef struct { + int timeStartup; /* time in seconds since startup of dlt-system */ + int timeFiletransferDelay; /* time in seconds to start next filetransfer */ + char filetransferFile[256]; + int filetransferRunning; /* 0 = stooped, 1 = running */ + int filetransferCountPackages; /* number of packets to be transfered */ + int filetransferLastSentPackage; /* last packet sent starting from 1 */ +} DltSystemRuntime; + #endif /* DLT_SYSTEM_H */ diff --git a/src/system/dlt-system_cfg.h b/src/system/dlt-system_cfg.h index 5c47e00..a0cef07 100644 --- a/src/system/dlt-system_cfg.h +++ b/src/system/dlt-system_cfg.h @@ -1,11 +1,14 @@ #define DEFAULT_CONFIGURATION_FILE "/etc/dlt-system.conf" - #define DEFAULT_APPLICATION_ID "SYS" #define DEFAULT_SYSLOG_CONTEXT_ID "SYSL" - #define DEFAULT_SYSLOG_PORT 47111 +#define DEFAULT_FILETRANSFER_DIRECTORY "/tmp/filetransfer" +#define DEFAULT_FILETRANSFER_CONTEXT_ID "FILE" +#define DEFAULT_FILETRANSFER_TIME_STARTUP 30 +#define DEFAULT_FILETRANSFER_TIME_DELAY 10 + #define DEFAULT_LOG_KERNEL_VERSION_MODE 1 #define DEFAULT_LOG_KERNEL_VERSION_CONTEXT_ID "VERS" |