2018-07-31 20:57:30 +01:00
|
|
|
# CORE Developer's Guide
|
|
|
|
|
|
|
|
* Table of Contents
|
|
|
|
{:toc}
|
|
|
|
|
2019-09-10 21:39:36 +01:00
|
|
|
## Repository Overview
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2020-04-09 22:34:52 +01:00
|
|
|
The CORE source consists of several different programming languages for
|
|
|
|
historical reasons. Current development focuses on the Python modules and
|
|
|
|
daemon. Here is a brief description of the source directories.
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2019-09-10 21:39:36 +01:00
|
|
|
| Directory | Description |
|
|
|
|
|---|---|
|
|
|
|
|daemon|Python CORE daemon code that handles receiving API calls and creating containers|
|
|
|
|
|docs|Markdown Documentation currently hosted on GitHub|
|
|
|
|
|gui|Tcl/Tk GUI|
|
|
|
|
|man|Template files for creating man pages for various CORE command line utilities|
|
2020-04-09 22:34:52 +01:00
|
|
|
|netns|C program for creating CORE containers|
|
2019-09-10 21:39:36 +01:00
|
|
|
|scripts|Template files used for running CORE as a service|
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2019-09-10 21:39:36 +01:00
|
|
|
## Getting started
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2020-03-05 22:16:14 +00:00
|
|
|
To setup CORE for develop we will leverage to automated install script.
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2020-03-05 22:16:14 +00:00
|
|
|
## Clone CORE Repo
|
2019-09-12 22:36:28 +01:00
|
|
|
|
|
|
|
```shell
|
2019-12-20 20:55:52 +00:00
|
|
|
cd ~/Documents
|
|
|
|
git clone https://github.com/coreemu/core.git
|
|
|
|
cd core
|
2020-03-05 22:16:14 +00:00
|
|
|
git checkout develop
|
2019-09-12 22:36:28 +01:00
|
|
|
```
|
|
|
|
|
2020-03-05 22:16:14 +00:00
|
|
|
## Install the Development Environment
|
2019-09-10 21:39:36 +01:00
|
|
|
|
2020-03-05 22:16:14 +00:00
|
|
|
This command will automatically install system dependencies, clone and build OSPF-MDR,
|
|
|
|
build CORE, setup the CORE pipenv environment, and install pre-commit hooks.
|
2019-09-10 21:39:36 +01:00
|
|
|
|
2020-03-05 22:16:14 +00:00
|
|
|
This script is currently compatible with Ubuntu and CentOS, tested on Ubuntu 18.04 and
|
|
|
|
CentOS 7.6. The script also currently defaults to using python3.6, but a different
|
|
|
|
version of python can be targeted if python3.6 is not available on your system.
|
2019-12-20 20:55:52 +00:00
|
|
|
|
|
|
|
```shell
|
2020-03-05 22:16:14 +00:00
|
|
|
# default dev install using python3.6
|
|
|
|
./install.sh -d
|
2019-12-20 20:55:52 +00:00
|
|
|
|
2020-03-05 22:16:14 +00:00
|
|
|
# providing a newer python version for ubuntu
|
|
|
|
./install.sh -d -v 3.7
|
2019-12-20 20:55:52 +00:00
|
|
|
|
2020-03-05 22:16:14 +00:00
|
|
|
# providing a newer python version for centos
|
|
|
|
./install.sh -d -v 37
|
2019-12-20 20:55:52 +00:00
|
|
|
```
|
|
|
|
|
2020-03-05 22:16:14 +00:00
|
|
|
### pre-commit
|
2019-12-20 20:55:52 +00:00
|
|
|
|
2020-03-05 22:16:14 +00:00
|
|
|
pre-commit hooks help automate running tools to check modified code. Every time a commit is made
|
|
|
|
python utilities will be ran to check validity of code, potentially failing and backing out the commit.
|
|
|
|
These changes are currently mandated as part of the current CI, so add the changes and commit again.
|
2019-12-20 20:55:52 +00:00
|
|
|
|
2019-09-13 00:27:12 +01:00
|
|
|
### Adding EMANE to Pipenv
|
|
|
|
|
|
|
|
EMANE bindings are not available through pip, you will need to build and install from source.
|
|
|
|
|
|
|
|
[Build EMANE](https://github.com/adjacentlink/emane/wiki/Build#general-build-instructions)
|
|
|
|
|
|
|
|
```shell
|
2019-12-20 20:36:29 +00:00
|
|
|
# clone emane repo
|
|
|
|
git clone https://github.com/adjacentlink/emane.git
|
|
|
|
|
|
|
|
# install emane build deps
|
|
|
|
sudo apt install libxml2-dev libprotobuf-dev uuid-dev libpcap-dev protobuf-compiler
|
|
|
|
|
|
|
|
# build emane
|
|
|
|
./autogen.sh
|
|
|
|
./configure --prefix=/usr
|
|
|
|
make -j8
|
|
|
|
|
|
|
|
# install emane binding in pipenv
|
2019-12-20 20:55:52 +00:00
|
|
|
# NOTE: this will mody pipenv Pipfiles and we do not want that, use git checkout -- Pipfile*, to remove changes
|
2020-02-05 18:40:29 +00:00
|
|
|
python3 -m pipenv pip install $EMANEREPO/src/python
|
2019-09-13 00:27:12 +01:00
|
|
|
```
|
|
|
|
|
2020-03-05 22:16:14 +00:00
|
|
|
## Running CORE
|
2019-09-10 21:39:36 +01:00
|
|
|
|
2020-03-05 22:16:14 +00:00
|
|
|
Commands below can be used to run the core-daemon, the new core gui, and tests.
|
2019-09-10 21:39:36 +01:00
|
|
|
|
|
|
|
```shell
|
2019-12-20 20:55:52 +00:00
|
|
|
# runs for daemon
|
2020-02-05 18:40:29 +00:00
|
|
|
sudo python3 -m pipenv run core
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2019-12-20 20:55:52 +00:00
|
|
|
# runs coretk gui
|
2020-04-22 23:49:30 +01:00
|
|
|
python3 -m pipenv run core-pygui
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2019-12-20 20:55:52 +00:00
|
|
|
# runs mocked unit tests
|
2020-02-05 18:40:29 +00:00
|
|
|
python3 -m pipenv run test-mock
|
2019-12-19 20:32:30 +00:00
|
|
|
```
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2019-09-10 21:39:36 +01:00
|
|
|
## Linux Network Namespace Commands
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2019-12-20 20:36:29 +00:00
|
|
|
Linux network namespace containers are often managed using the *Linux Container Tools* or *lxc-tools* package.
|
|
|
|
The lxc-tools website is available here http://lxc.sourceforge.net/ for more information. CORE does not use these
|
|
|
|
management utilities, but includes its own set of tools for instantiating and configuring network namespace containers.
|
2019-09-10 21:39:36 +01:00
|
|
|
This section describes these tools.
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2019-09-10 21:39:36 +01:00
|
|
|
### vnoded
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2019-12-20 20:36:29 +00:00
|
|
|
The *vnoded* daemon is the program used to create a new namespace, and listen on a control channel for commands that
|
|
|
|
may instantiate other processes. This daemon runs as PID 1 in the container. It is launched automatically by the CORE
|
|
|
|
daemon. The control channel is a UNIX domain socket usually named */tmp/pycore.23098/n3*, for node 3 running on CORE
|
2019-09-10 21:39:36 +01:00
|
|
|
session 23098, for example. Root privileges are required for creating a new namespace.
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2019-09-10 21:39:36 +01:00
|
|
|
### vcmd
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2019-12-20 20:36:29 +00:00
|
|
|
The *vcmd* program is used to connect to the *vnoded* daemon in a Linux network namespace, for running commands in the
|
|
|
|
namespace. The CORE daemon uses the same channel for setting up a node and running processes within it. This program
|
|
|
|
has two required arguments, the control channel name, and the command line to be run within the namespace. This command
|
2019-09-10 21:39:36 +01:00
|
|
|
does not need to run with root privileges.
|
2018-07-31 20:57:30 +01:00
|
|
|
|
2019-12-20 20:36:29 +00:00
|
|
|
When you double-click on a node in a running emulation, CORE will open a shell window for that node using a command
|
2019-09-10 21:39:36 +01:00
|
|
|
such as:
|
2018-07-31 20:57:30 +01:00
|
|
|
|
|
|
|
```shell
|
|
|
|
gnome-terminal -e vcmd -c /tmp/pycore.50160/n1 -- bash
|
|
|
|
```
|
|
|
|
|
|
|
|
Similarly, the IPv4 routes Observer Widget will run a command to display the routing table using a command such as:
|
|
|
|
|
|
|
|
```shell
|
|
|
|
vcmd -c /tmp/pycore.50160/n1 -- /sbin/ip -4 ro
|
|
|
|
```
|
|
|
|
|
|
|
|
### core-cleanup script
|
|
|
|
|
2019-12-20 20:36:29 +00:00
|
|
|
A script named *core-cleanup* is provided to clean up any running CORE emulations. It will attempt to kill any
|
|
|
|
remaining vnoded processes, kill any EMANE processes, remove the :file:`/tmp/pycore.*` session directories, and remove
|
2019-09-10 21:39:36 +01:00
|
|
|
any bridges or *ebtables* rules. With a *-d* option, it will also kill any running CORE daemon.
|
2018-07-31 20:57:30 +01:00
|
|
|
|
|
|
|
### netns command
|
|
|
|
|
2019-12-20 20:36:29 +00:00
|
|
|
The *netns* command is not used by CORE directly. This utility can be used to run a command in a new network namespace
|
2019-09-10 21:39:36 +01:00
|
|
|
for testing purposes. It does not open a control channel for receiving further commands.
|
2018-07-31 20:57:30 +01:00
|
|
|
|
|
|
|
### Other Useful Commands
|
|
|
|
|
|
|
|
Here are some other Linux commands that are useful for managing the Linux network namespace emulation.
|
|
|
|
|
|
|
|
```shell
|
|
|
|
# view the Linux bridging setup
|
2019-12-23 22:48:56 +00:00
|
|
|
ip link show type bridge
|
2018-07-31 20:57:30 +01:00
|
|
|
# view the netem rules used for applying link effects
|
|
|
|
tc qdisc show
|
|
|
|
# view the rules that make the wireless LAN work
|
|
|
|
ebtables -L
|
|
|
|
```
|