# Arbor Safe Intelligence Format (asif)
![CircleCI](https://circleci.com/gh/packetloop/asif.svg?style=svg&circle-token=1420752ec3bc7c068b3a35925ad5f9c63e3d3773)

Library for creating and querying segmented feeds.

## File Format Specification

### Layer 0: Segments

```
+--------------------+
|Segmented OSI Model |
+--------------------+

 magic, where XXXX is a feed type
+---------------------+-------------+
| "seg:XXXX" [char:8] | ver: uint64 |
+---------------------+-------------+

c -- countries
a -- asns
n -- naics

 header
+-----------------+
| seg_num: uint64 |
+-----------------+

 segments
+-----------------------+-----------------------+
| segment_offset: int32 | segment_length: int32 |
+-----------------------+-----------------------+

 segment vector
+-------------+
| key: X, ... |
+-------------+

 segment vector
+-------------+
| val: Y, ... |
+-------------+
```

Vector keys are fixed-length values such as 4-byte IPv4 addresses,
2-byte country codes, or 4-byte NAIC IDs.

All values are little-endian.

Values are other ints or can be null-terminated strings.

### Layer 1: Segment filenames

Segment 0 must contain a concatenated list of null terminated filenames.

The first filename must be `.asif/filenames`.

The n-th filename in the segment 0 describes the n-th segment in the file.

### Layer 2: Additional metadata

The `asif` file may contain contain a named segment `.asif/createtime`.
If it does, this segment concatenated `Word64` numbers representing the create
time of each file in microseconds since epoch.  If the segment does not have a
create time, it's create time entry will be `0` instead.

The `asif` file may contain contain a named segment `.asif/formats`.
If it does, this segment concatenated null terminated strings representing the
format of the data in the respective segments.  The `dump` command will use
this information to choose the most appropriate way to print the data in each
segment.

## CLI
[CLI documentation](doc/cli.md)
