summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2011-10-06 13:52:34 +0200
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2011-10-06 13:52:34 +0200
commit3367843af8cc0bd2d3392e5131bb18bddd70fc9f (patch)
tree66f37e575f5ad8de4fa14fa3f5aba063990f5681 /src
parentfbc90e0e3b7c6754cc426b183eeabea3e98359d8 (diff)
downloadDLT-daemon-3367843af8cc0bd2d3392e5131bb18bddd70fc9f.tar.gz
First implementation of filetransfer manager.
Diffstat (limited to 'src')
-rw-r--r--src/system/dlt-system-log.c106
-rw-r--r--src/system/dlt-system-log.h3
-rwxr-xr-xsrc/system/dlt-system.c77
-rw-r--r--src/system/dlt-system.conf23
-rw-r--r--src/system/dlt-system.h13
-rw-r--r--src/system/dlt-system_cfg.h7
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"