# 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 `HL` == `10d` (`000ah`, frame 0 to 9), alors il n'y à pas d'options. * Si `MDL` == `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 new ligne: `0x0a 0x0a`) +--------------------> `exec` executable_file [arguments] ``` 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 equivalente of add:LD_LIBRARY_PATH=... X-INCLUDES = ["python-linux-x86-64/", "main.py"] # POSIX exec ./python/python main.py -v -i myfile.txt # Windows #exec python\python.exe main.py -v -i myfile.txt ``` Le Cupfile doit se situer à la raçine de votre projet, exemple: ```plain reader: |-- .git/ |-- test/ |-- python-windows-x86-64/ |-- exemple.dll `-- python.exe |-- python-linux-x86-64/ |-- exemple.so `-- python |-- Cupfile |-- main.py ``` ## Constantes internes Des constantes internes sont utilisable dans le Cupfile, afin de formater votre environnement d'execution dynamiquement. > **NOTE**: Ces constantes ne sont pas modifiable. | Non | Type | Description | Exemple | |-----|:----:|-------------|---------| | `$_CWD` | string | Le path du dossier courant post-extraction | `/path/to/riz/contents` | ## Atributs d'extension Les attributs d'extension permettent d'injecter des intructions à la compilation. | Non | Type | Description | Exemple | |-----|:----:|-------------|---------| | `X-ENV` | array | Inject des variable d'environnement dans le contexte d'execution | `["VERBOSE=1", "LD_LIBRARY_PATH=libs/"]` | | `X-INCLUDES` | array | Inclure seulement ces fichiers/dossiers dans le contener | `["myfile", "mydir/"]` |