# File {#file} The `file` node-type can be used to log or replay samples to / from disk. ## Configuration Every `file` node can be configured to only read or write or to do both at the same time. The node configuration is divided into two sub-groups: `in` and `out`. #### `uri` *(string: libcurl URI)* Specifies the URI to a file from which is written to or read from depending in which group (`in`or `out`) is used. See below for a description of the file format. This setting allows to add special paceholders for time and date values. See [strftime(3)](http://man7.org/linux/man-pages/man3/strftime.3.html) for a list of supported placeholder. **Example**: uri = "logs/measurements_%Y-%m-%d_%H-%M-%S.log" will create a file called: ./logs/measurements_2015-08-09_22-20-50.log See below for a description of the file format. #### `mode` *(string)* Specifies the mode which should be used to open the output file. See [open(2)](http://man7.org/linux/man-pages/man2/open.2.html) for an explanation of allowed values. The default value is `w+` which will start writing at the beginning of the file and create it in case it does not exist yet. #### `epoch_mode` *("direct" | "wait" | "relative" | "absolute")* The *epoch* describes the point in time when the first message will be read from the file. This setting allows to select the behaviour of the following `epoch` setting. It can be used to adjust the point in time when the first value should be read. The behaviour of `epoch` is depending on the value of `epoch_mode`. To facilitate the following description of supported `epoch_mode`'s, we will introduce some intermediate variables (timestamps). Those variables will also been displayed during the startup phase of the server to simplify debugging. - `epoch` is the value of the `epoch` setting. - `first` is the timestamp of the first message / line in the input file. - `offset` will be added to the timestamps in the file to obtain the real time when the message will be sent. - `start` is the point in time when the first message will be sent (`first + offset`). - `eta` the time to wait until the first message will be send (`start - now`) The supported values for `epoch_mode`: | `epoch_mode` | `offset` | `start = first + offset` | | -----------: | :-------------------: | :----------------------: | | `direct` | `now - first + epoch` | `now + epoch` | | `wait` | `now + epoch` | `now + first` | | `relative` | `epoch` | `first + epoch` | | `absolute` | `epoch - first` | `epoch` | | `original` | `0` | immeadiatly | #### `rate` *(float)* By default `send_rate` has the value `0` which means that the time between consecutive samples is the same as in the `in` file based on the timestamps in the first column. If this setting has a non-zero value, the default behaviour is overwritten with a fixed rate. ### Example nodes = { file_node = { type = "file", ### The following settings are specific to the file node-type!! ### in = { uri = "logs/input.log", # These options specify the URI where the the files are stored mode = "w+", # The mode in which files should be opened (see open(2)) epoch_mode = "direct" # One of: direct (default), wait, relative, absolute epoch = 10 # The interpretation of this value depends on epoch_mode (default is 0). # Consult the documentation of a full explanation rate = 2.0 # A constant rate at which the lines of the input files should be read # A missing or zero value will use the timestamp in the first column # of the file to determine the pause between consecutive lines. }, out = { uri = "logs/output_%F_%T.log" # The output URI accepts all format tokens of (see strftime(3)) mode = "a+" # You might want to use "a+" to append to a file } } } ## File Format This node-type uses a simple human-readable format to save samples to disk: The format is similiar to a conventional CSV (comma seperated values) file. Every line in a file correspondents to a message / sample of simulation data. The columns of a line are seperated by whitespaces (tabs or spaces). The columns are defined as follows: seconds.nanoseconds+offset(sequenceno) value0 value1 ... valueN 1. The first column contains a timestamp which is composed of up to 4 parts: - Number of seconds after 1970-01-01 00:00:00 UTC - A dot: '.' - Number of nano seconds of the current second (optional) - An offset between the point in time when a message was sent and received (optional) - The sequence number of the message (optional) A valid timestamp can be generated by the following Unix command: `date +%s.%N`. *Important:* The second field is not the fractional part of the second!!! 2. Maximum `MSG_VALUES` floating point values per sample. The values are seperated by whitespaces as well. ### Example This example shows a dump with three values per sample: 1438959964.162102394(6) 3.489760 -1.882725 0.860070 1438959964.261677582(7) 2.375948 -2.204084 0.907518 1438959964.361622787(8) 3.620115 -1.359236 -0.622333 1438959964.461907066(9) 5.844254 -0.966527 -0.628751 1438959964.561499526(10) 6.317059 -1.716363 0.351925 1438959964.661578339(11) 6.471288 -0.159862 0.123948 1438959964.761956859(12) 7.365932 -1.488268 -0.780568