# Cuper (DRAFT) ## RIZ file header ```plain 32 bits <----------------------------------------------> 16 bits 8 bits <----------------------> <----------> +----------------------------------------------+ <----------------------+ 0 | IDENTIFICATOR | | +----------------------------------------------+ | 1 | ARCH | OS | | +----------------------------------------------+ | 2 | TIME | | +----------------------------------------------+ | 3 | TYPE | PROT. | VER | Base informations. | +----------------------------------------------+ Frame 0-9 | 4 | HL | MDL | + OPTIONS. | +----------------------------------------------+ | 5-9 | RESERVED | | +----------------------------------------------+ | | OPTIONS | <----------------------+ +----------------------------------------------+ <----------------------+ | METADATA | | +----------------------------------------------+ Contents. | | PAYLOAD | Frame post-OPTIONS-n. | +----------------------------------------------+ <----------------------+ ``` **Description** | Nom du champ | Position | Longeur (bits) | Valeur(s) | |:-------------|:--------:|:--------------:|:----------| | **Identificator** | 0 | 32 | `0x7f 0x52 0x49 0x5a` | | **Arch** | 4 | 16 | `0x0000` = no arch | |||| `0x0001` = i386 | |||| `0x0002` = x86_64 | | **OS** | 6 | 16 | `0x0000` = no OS | |||| `0x0001` = Linux | | **Time** | 8 | 32 | *current timestamp* | | **Type** | 12 | 16 | `0x0000` = container | |||| `0x0001` = meta container | | **Protected** | 14 | 8 | `0x00` = unprotected | |||| `0x01` = AES-128 | |||| `0x02` = AES-192 | |||| `0x04` = AES-256 | | **Version** | 15 | 8 | `0x00` = first (current) | | **HL** | 16 | 16 | `0x000a` = no options | | **MDL** | 18 | 16 | `0x0000` = no metadata | | **RESERVED** | 20 | 120 | `0x0000` = not used | * **ARCH**: l'identifiant de la machine cible (architecture du processeur). * **OS**: l'identifiant de la machine cible (environnement d'execution). * **TIME**: le timestamp de compilation. * **TYPE**: le type de conteneur, ex: conteneur, méta-conteneur, etc... * **VER**: la version de l'entête. * **HL**: la taille de l'entête en **mot de 32 bits**. * **MDL**: la taille des méta-données en **mot de 32 bits**. * **RESERVED**: 20 octets réservés. * **OPTIONS**: des données optionnels. * **METADATA**: les informations du contenu (see Cupfile). * **PAYLOAD**: le contenu. > **NOTE**: * Si `TYPE` égale `1d` (`0001h`), alors il n'y à pas de contenu. * Si `HL` égale `10d` (`000ah`), alors il n'y à pas d'options. * Si `MDL` égale `0d` (`0000h`), alors il n'y à pas de méta-données. ## Cupfile Le fichier **Cupfile** permet de **rassembler des informations** qui seront utilisés lors de la compilation. Voici la structure d'un Cupfile: ```plain +--------------------> | VAR1 = value1 | User variables. VAR2 = value2 | VAR3 = value3 +--------------------> | ([add:] | set:)X-CONST1 = value1 | Constantes. ([add:] | set:)X-CONST2 = value2 | ([add:] | set:)X-CONST3 = value3 +--------------------> +--------------------> (2x LF: `0x0a 0x0a` or 2x CRLF: `0x0d 0x0a 0x0d 0x0a`) +--------------------> `exec` executable_file [arguments] ``` Le Cupfile doit se situer à la raçine de votre projet, exemple: ```plain reader: |-- .git/ |-- test/ `-- text.txt |-- python-windows-x86_64/ |-- libraries.dll `-- python.exe |-- python-linux-x86_64/ |-- libraries.so `-- python |-- Cupfile `-- main.py ``` Voici un exemple de Cupfile, ce conteneur permet l'execution d'un script Python, en incluant toutes les dépendances: ```bash AUTOR = Maiuri Gaëtan DATE = 2017-09-22 DESCRIPTION = A simple Cuper container with a text reader. X-ENV = ["set:VERBOSE=1", "LD_LIBRARY_PATH=$_CWD/python-linux-x86_64/"] # LD_LIBRARY_PATH=... => is equivalent of add:LD_LIBRARY_PATH=... X-INCLUDES = ["python-linux-x86_64/", "main.py"] exec ./python-linux-x86_64/python main.py -v -i myfile.txt ``` ### Exemple avec des dépendances Vous pouvez gérer **une liste de dépendances** avec l'attribut `X-DEPLIST`, exemple: ```plain reader: |-- .git/ |-- test/ `-- text.txt |-- Cupfile `-- main.py ``` ```bash AUTOR = Maiuri Gaëtan DATE = 2017-09-22 DESCRIPTION = A simple Cuper container with a text reader. X-DEPLIST = ["https://riz.example.com/download/python-linux-x86_64.riz"] X-ENV = ["set:VERBOSE=1", "LD_LIBRARY_PATH=$_CWD/python-linux-x86_64/"] # LD_LIBRARY_PATH=... => is equivalent of add:LD_LIBRARY_PATH=... X-INCLUDES = ["main.py"] exec ./python-linux-x86_64/python main.py -v -i myfile.txt ``` ## Constantes internes Des constantes internes sont utilisable dans le Cupfile, afin de formater dynamiquement votre environnement d'execution. > **NOTE**: Ces constantes ne sont pas modifiable. | Non | Type | Description | Exemple | |-----|:----:|-------------|---------| | `$_CWD` | string | Le chemin du dossier courant post-extraction | `/path/to/riz/contents` | | `$_HOME` | string | Le chemin du dossier utilisateur (de la machine cible) | `/home/batman` or `C:\Users\batman` | ## Attributs d'extension Les attributs d'extension permettent d'injecter des intructions à la compilation. | Non | Type | Description | Exemple | |-----|:----:|-------------|---------| | `X-DEPLIST` | array | Inject des dépendances a télécharger avant extraction (sur la machine cible) | `["http://example.com/riz/my-scripts.riz", "http://example.com/riz/my-libs.riz"]` | | `X-ENV` | array | Inject des variables d'environnement dans le contexte d'execution (sur la machine cible) | `["VERBOSE=1", "LD_LIBRARY_PATH=libs/"]` | | `X-INCLUDES` | array | Inclure seulement ces fichiers/dossiers dans le conteneur | `["myfile", "mydir/"]` | L'attribut `X-DEPLIST` peut être grandement utile lors de la création d'un méta-conteneur.