# Welcome to the INGInious wiki INGInious version for **Universidad Nacional de Colombia - Bogotá campus** and was born as a necessity in the university to grade the students' programming skills in an academic way instead of a competitive way. ![Universidad Nacional de Colombia](assets/images/UNAL_image.jpg) ## What is INGInious? INGInious provides a simple and secure way to execute and test untrusted code. It has been developed by the [INGI](http://www.uclouvain.be/ingi.html) department ([Université catholique de Louvain](http://www.uclouvain.be)) to automatic grading of programming assignments. The whole tool is written in [Python](http://www.python.org) (version 3.5+) and relies on [Docker](https://www.docker.com) to provide secure execution environments and on [MongoDB](http://www.mongodb.com) to keep track of submissions. Additionally, some time ago, in the [Systems and Computing engineering](https://www.ingenieria.bogota.unal.edu.co/formacion/pregrado/ingenieria-de-sistemas-y-computacion.html) program ([Universidad Nacional de Colombia](http://bogota.unal.edu.co/)) was born the idea to have our own application to assess the students' code, that is why we started this version. ## How does INGInious work? INGInious is based on the concept of tasks . A task is a set of one or more related (sub)questions. For each task, an infinite number of submissions is allowed, but a user must wait for the result of its current submission before trying a new one. For simplicity, tasks are grouped by courses. Usually, an INGInious course has one task per assignment. A submission is a set of deliverables (chunks of code, files, archives, etc.) that correspond each to one of the (sub)questions of the task. The idea is to provide a feedback on the submission by compiling, executing or applying any form of checking and testing to the deliverables. In its simplest form, the feedback consists of either *success* or *failed*. To understand more about how are graded this submissions, please go to the next link: [How does work the automatic grader](How-does-work-the-automatic-grader.md) ### Architecture INGInious comes with three distinct parts, the **backend** (and its agent) and a **frontend**. **The backend** (see dev_doc/backend) receives the code of the students and sends it to its agent (see /dev_doc/agent), which is the responsible to send it to a Docker container, and interact with the request made by the container. That container then makes some verifications on the submission and returns one of the following four possible status : *success*, *crash*, *timeout*,or *failed*. INGInious also provides a **frontend** (see /dev_doc/frontend). Made with MongoDB as database, the frontend is in fact an extension of the backend and allows students to work directly on a website. This frontend also provides statistics and management tools for the teachers. Most of these functionalities can be extended through plugins (**See how to create a plugin**). For a more advanced view of the architecture of INGInious, see [Understand INGInious](Understand-INGInious.md). ### Docker containers Docker containers are small virtual operating systems that provides isolation between the processes and resources of the host operating system. Docker allows to create and ship any software on any free Linux distribution. As there are no hypervisor, the processes launched into the container are in fact directly run by the host operating system, which allows applications to be amazingly fast. Docker allow teachers to build new containers easily, to add new dependencies to the tests applied on the student’s code (see [How to create a new container](How-to-create-a-new-container.md)).