doc: Add documentation for MGMT daemon

This commit adds user documentation for the new MGMT daemon and
new FRR Management Framework.

Co-authored-by: Yash Ranjan <ranjany@vmware.com>
Co-authored-by: Abhinay Ramesh <rabhinay@vmware.com>
Co-authored-by: Ujwal P <ujwalp@vmware.com>
Signed-off-by: Pushpasis Sarkar <pushpasis@gmail.com>
This commit is contained in:
Pushpasis Sarkar 2021-10-29 10:22:42 -07:00 committed by Christian Hopps
parent d1e85e3600
commit 5b08f6f9ea
24 changed files with 417 additions and 17 deletions

View File

@ -46,7 +46,7 @@ Add packages:
sudo yum install git autoconf automake libtool make \
readline-devel texinfo net-snmp-devel groff pkgconfig \
json-c-devel pam-devel flex epel-release c-ares-devel libcap-devel \
elfutils-libelf-devel
elfutils-libelf-devel protobuf-c-devel
Install newer version of bison (CentOS 6 package source is too old) from CentOS
7:

View File

@ -22,7 +22,7 @@ Add packages:
readline-devel texinfo net-snmp-devel groff pkgconfig \
json-c-devel pam-devel bison flex pytest c-ares-devel \
python-devel python-sphinx libcap-devel \
elfutils-libelf-devel libunwind-devel
elfutils-libelf-devel libunwind-devel protobuf-c-devel
.. include:: building-libunwind-note.rst

View File

@ -15,7 +15,8 @@ Add packages:
automake libtool make readline-devel texinfo net-snmp-devel pkgconfig \
groff pkgconfig json-c-devel pam-devel bison flex python2-pytest \
c-ares-devel python2-devel libcap-devel \
elfutils-libelf-devel libunwind-devel
elfutils-libelf-devel libunwind-devel \
protobuf-c-devel
.. include:: building-libunwind-note.rst

View File

@ -18,7 +18,7 @@ Add packages:
sudo apt-get install git autoconf automake libtool make \
libreadline-dev texinfo libjson-c-dev pkg-config bison flex python3-pip \
libc-ares-dev python3-dev python3-sphinx build-essential \
libsnmp-dev libcap-dev libelf-dev
libsnmp-dev libcap-dev libelf-dev libprotobuf-c-dev protobuf-c-compiler
Install newer pytest (>3.0) from pip

View File

@ -11,7 +11,8 @@ Add packages:
sudo apt-get install git autoconf automake libtool make \
libreadline-dev texinfo libjson-c-dev pkg-config bison flex \
libc-ares-dev python3-dev python3-pytest python3-sphinx build-essential \
libsnmp-dev libcap-dev libelf-dev libunwind-dev
libsnmp-dev libcap-dev libelf-dev libunwind-dev \
libprotobuf-c-dev protobuf-c-compiler
.. include:: building-libunwind-note.rst

View File

@ -15,7 +15,7 @@ Installing Dependencies
readline-devel texinfo net-snmp-devel groff pkgconfig json-c-devel \
pam-devel python3-pytest bison flex c-ares-devel python3-devel \
python3-sphinx perl-core patch libcap-devel \
elfutils-libelf-devel libunwind-devel
elfutils-libelf-devel libunwind-devel protobuf-c-devel
.. include:: building-libunwind-note.rst

View File

@ -17,7 +17,8 @@ is first package install and asked)
::
pkg install git autoconf automake libtool gmake json-c pkgconf \
bison flex py36-pytest c-ares python3.6 py36-sphinx libunwind
bison flex py36-pytest c-ares python3.6 py36-sphinx libunwind \
protobuf-c
.. include:: building-libunwind-note.rst

View File

@ -17,7 +17,8 @@ is first package install and asked)
.. code-block:: shell
pkg install git autoconf automake libtool gmake json-c pkgconf \
bison flex py36-pytest c-ares python3.6 py36-sphinx texinfo libunwind
bison flex py36-pytest c-ares python3.6 py36-sphinx texinfo libunwind \
protobuf-c
.. include:: building-libunwind-note.rst

View File

@ -18,7 +18,7 @@ is first package install and asked)
pkg install -y git autoconf automake libtool gmake \
pkgconf texinfo json-c bison flex py36-pytest c-ares \
python3 py36-sphinx libexecinfo
python3 py36-sphinx libexecinfo protobuf-c
Make sure there is no /usr/bin/flex preinstalled (and use the newly
installed in /usr/local/bin): (FreeBSD frequently provides a older flex

View File

@ -23,7 +23,8 @@ Add packages:
::
sudo pkg_add git autoconf automake libtool gmake openssl \
pkg-config json-c py36-test python36 py36-sphinx
pkg-config json-c py36-test python36 py36-sphinx \
protobuf-c
Install SSL Root Certificates (for git https access):

View File

@ -14,7 +14,8 @@ Install required packages
::
sudo pkgin install git autoconf automake libtool gmake openssl \
pkg-config json-c python36 py36-test py36-sphinx
pkg-config json-c python36 py36-test py36-sphinx \
protobuf-c
Install SSL Root Certificates (for git https access):

View File

@ -16,7 +16,7 @@ Add packages:
pkg_add clang libcares python3
pkg_add git autoconf-2.69p2 automake-1.15.1 libtool bison
pkg_add gmake json-c py-test py-sphinx libexecinfo
pkg_add gmake json-c py-test py-sphinx libexecinfo protobuf-c
Select Python2.7 as default (required for pytest)

View File

@ -14,7 +14,7 @@ Installing Dependencies
readline-devel texinfo net-snmp-devel groff pkgconfig libjson-c-devel\
pam-devel python3-pytest bison flex c-ares-devel python3-devel\
python3-Sphinx perl patch libcap-devel libyang-devel \
libelf-devel libunwind-devel
libelf-devel libunwind-devel protobuf-c
.. include:: building-libunwind-note.rst

View File

@ -18,6 +18,13 @@ Installing Dependencies
.. include:: building-libyang.rst
Protobuf
^^^^^^^^
.. code-block:: console
sudo apt-get install protobuf-c-compiler libprotobuf-c-dev
Building & Installing FRR
-------------------------

View File

@ -15,10 +15,17 @@ Installing Dependencies
pkg-config libpam0g-dev libjson-c-dev bison flex python3-pytest \
libc-ares-dev python3-dev python-ipaddress python3-sphinx \
install-info build-essential libsnmp-dev perl libcap-dev \
libelf-dev
libelf-dev libprotobuf-c-dev protobuf-c-compiler
.. include:: building-libyang.rst
Protobuf
^^^^^^^^
.. code-block:: console
sudo apt-get install protobuf-c-compiler libprotobuf-c-dev
Building & Installing FRR
-------------------------

View File

@ -66,6 +66,7 @@ Protocols
vrrp
bmp
watchfrr
mgmtd
########
Appendix

375
doc/user/mgmtd.rst Normal file
View File

@ -0,0 +1,375 @@
.. _mgmtd:
*************************
MGMTd (Management Daemon)
*************************
The FRR Management Daemon (from now on referred to as MGMTd) is a new
centralized entity representing the FRR Management Plane which can take
management requests from any kind of UI/Frontend entity (e.g. CLI, Netconf,
Restconf, Grpc etc.) over a new unified and common Frontend interface and
can help maintain configurational data or retrieve operational data from
any number of FRR managed entities/components that have been integrated
with the new FRR Centralised Management Framework.
For organizing the management data to be owned by the FRR Management plane,
management data is stored in YANG in compliance with a pre-defined set
of YANG based schema. Data shall also be stored/retrieved in YANG format only.
The MGMTd also acts as a separate computational entity for offloading much
of the management related computational overload involved in maintaining of
management data and processing of management requests, from individual
component daemons (which can otherwise be a signficant burden on the individual
components, affecting performance of its other functionalities).
Lastly, the MGMTd works in-tandem with one (or more) MGMT Frontend
Clients and a bunch of MGMT Backend Clients to realize the entirety
of the FRR Management plane. Some of the advanatages of this new framework
are:
1. Consolidation and management of all Management data by a single entity.
2. Better control over configuration validation, commit and rollback.
3. Faster collection of configuration data (without needing to involve
individual component daemons).
4. Offload computational burden of YANG data parsing and validations
of new configuration data being provisoned away from individual
component daemons
5. Improve performance of individual component daemons while loading
huge configuration or retrieving huge operational dataset.
The new FRR Management Daemon consists of the following sub-components:
- MGMT Frontend Interface
- MGMT Backend Interface
- MGMT Transaction Engine
.. _mgmt_fe:
MGMT Frontend Interface
=======================
The MGMT Frontend Interface is a bunch of message-based APIs that lets
any UI/Frontend client to interact with the MGMT daemon to requests a
set of management operations on a specific datastore/database.
Following is a list of databases/datastores supported by the MGMT
Frontend Interface and MGMTd:
- Candidate Database:
- Consists of configuration data items only.
- Data can be edited anytime using SET_CONFIG API.
- Data can be retrieved anytime using GET_CONFIG/GET_DATA API.
- Running Database:
- Consists of configuration data items only.
- Data cannot be edited using SET_CONFIG API.
- Data can only be modified using COMMIT_CONFIG API after which un-committed
data from Candidate database will be first validated and applied to
individualBackend component(s). Only on successful validation and apply on
all individual components will the new data be copied over to the Running
database.
- Data can be retrieved anytime using GET_CONFIG/GET_DATA API.
- Startup Database:
- Consists of configuration data items only.
- This is a copy of Running database that is stored in persistent
storage and is used to load configurations on Running database during
MGMT daemon startup.
- Data cannot be edited/retrieved directly via Frontend interface.
- Operational Database:
- Consists of non-configurational data items.
- Data is not stored on MGMT daemon. Rather it will be need to be fetched
in real-time from the corresponding Backend component (if present).
- Data can be retrieved anytime using GET_DATA API.
Frontend Clients connected to MGMTd via Frontend Interface can themselves have
multiple connections from one (or more) of its own remote clients. The MGMT
Frontend Interface supports reresenting each of the remote clients for a given
Frontend client(e.g. Netconf clients on a single Netconf server) as individual
Frontend Client Sessions. So a single connection from a single Frontend Client
can create more than one Frontend Client sessions.
Following are some of the management operations supported:
- INIT_SESSION/CLOSE_SESSION: Create/Destroy a session. Rest of all the
operations are supported only in the context of a specific session.
- LOCK_DB/UNLOCK_DB: Lock/Unlock Management datastores/databases.
- GET_CONFIG/GET_DATA: Retrieve configurational/operational data from a
specific datastore/database.
- SET_CONFIG/DELETE_CONFIG: Add/Modify/Delete specific data in a specific
datastore/database.
- COMMIT_CONFIG: Validate and/or apply the uncommited set of configurations
from one configuration database to another.
- Currently committing configurations from Candidate to Running database
is only allowed, and not vice versa.
The exact set of message-based APIs are represented as Google Protobuf
messages and can be found in the following file distributed with FRR codebase.
.. code-block:: frr
lib/mgmt.proto
The MGMT daemon implements a MGMT Frontend Server that opens a UNIX
socket-based IPC channel on the following path to listen for incoming
connections from all possible Frontend clients:
.. code-block:: frr
/var/run/frr/mgmtd_fe.sock
Each connection received from a Frontend client is managed and tracked
as a MGMT Frontend adapter by the MGMT Frontend Adapter sub-component
implemented by MGMTd.
To facilitate faster development/integration of Frontend clients with
MGMT Frontend Interface, a C-based library has been developed. The API
specification of this library can be found at:
.. code-block:: frr
lib/mgmt_fe_client.h
Following is a list of message types supported on the MGMT Frontend Interface:
- SESSION_REQ<Client-Connection-Id, Destroy>
- SESSION_REPLY<Client-Connection-Id, Destroy, Session-Id>
- LOCK_DB_REQ <Session-Id, Database-Id>
- LOCK_DB_REPLY <Session-Id, Database-Id>
- UNLOCK_DB_REQ <Session-Id, Database-Id>
- UNLOCK_DB_REPLY <Session-Id, Database-Id>
- GET_CONFIG_REQ <Session-Id, Database-Id, Base-Yang-Xpath>
- GET_CONFIG_REPLY <Session-Id, Database-Id, Base-Yang-Xpath, Yang-Data-Set>
- SET_CONFIG_REQ <Session-Id, Database-Id, Base-Yang-Xpath, Delete, ...>
- SET_CONFIG_REPLY <Session-Id, Database-id, Base-Yang-Xpath, ..., Status>
- COMMIT_CONFIG_REQ <Session-Id, Source-Db-Id, Dest-Db-Id>
- COMMIT_CONFIG_REPLY <Session-Id, Source-Db-id, Dest-Db-Id, Status>
- GET_DATA_REQ <Session-Id, Database-Id, Base-Yang-Xpath>
- GET_DATA_REPLY <Session-Id, Database-id, Base-Yang-Xpath, Yang-Data-Set>
- REGISTER_NOTIFY_REQ <Session-Id, Database-Id, Base-Yang-Xpath>
- DATA_NOTIFY_REQ <Database-Id, Base-Yang-Xpath, Yang-Data-Set>
Please refer to the MGMT Frontend Client Developers Reference and Guide
(coming soon) for more details.
MGMTD Backend Interface
=======================
The MGMT Backend Interface is a bunch of message-based APIs that can be
used by individual component daemons like BGPd, Staticd, Zebra to connect
with MGMTd and utilize the new FRR Management Framework to let any Frontend
clients to retrieve any operational data or manipulate any configuration data
owned by the individual daemon component.
Like the MGMT Frontend Interface, the MGMT Backend Interface is is also
comprised of the following:
- MGMT Backend Server (running on MGMT daemon)
- MGMT Backend Adapter (running on MGMT daemon)
- MGMT Backend client (running on Backend component daemons)
The MGMT Backend Client and MGMT Backend Adapter sub-component communicates
using a specific set of message-based APIs.
The exact set of message-based APIs are represented as Google Protobuf
messages and can be found in the following file distributed with FRR codebase.
.. code-block:: frr
lib/mgmt.proto
The MGMT daemon implements a MGMT Backend Server that opens a UNIX
socket-based IPC channel on the following path to listen for incoming
connections from all possible Backend clients:
.. code-block:: frr
/var/run/frr/mgmtd_be.sock
Each connection received from a Backend client is managed and tracked
as a MGMT Backend adapter by the MGMT Backend Adapter sub-component
implemented by MGMTd.
To facilitate faster development/integration of Backend clients with
MGMTd, a C-based library has been developed. The API specification
of this library can be found at:
.. code-block:: frr
lib/mgmt_be_client.h
Following is a list of message types supported on the MGMT Backend Interface:
- SUBSCRIBE_REQ <Req-Id, Base-Yang-Xpath, Filter-Type>
- SUBSCRIBE_REPLY <Req-Id, Status>
- TXN_REQ <Txn-Id, Create>
- TXN_REPLY <Txn-Id, Status>
- CREATE_CFGDATA_REQ <Txn-Id, Req-Id, Batch-Id, ConfigDataContents>
- CREATE_CFGDATA_ERROR <Txn-Id, Req-Id, Batch-Id, Status>
- VALIDATE_CFGDATA_REQ <Txn-Id, Batch-Id>
- VALIDATE_CFGDATA_REPLY <Txn-Id, Batch-Id, Status, ErrorInfo>
- APPLY_CFGDATA_REQ <Txn-Id, Batch-Id>
- APPLY_CFGDATA_REPLY <Txn-Id, Batch-Id, Status, ErrorInfo>
- GET_OPERDATA_REQ <Txn-Id, Base-Yang-Xpath, Filter-Type>
- GET_OPERDATA_REPLY <Txn-Id, OperDataContents>
Please refer to the MGMT Backend Client Developers Reference and Guide
(coming soon) for more details.
MGMTD Transaction Engine
========================
The MGMT Transaction sub-component is the main brain of the MGMT daemon that
takes management requests from one (or more) Frontend Client translates
them into transactions and drives them to completion in co-oridination with
one (or more) Backend client daemons involved in the request.
A transaction can be seen as a set of management procedures executed over
the Backend Interface with one (or more) individual Backend component
daemons, as a result of some management request initiated from a specific
Frontend client session. These group of operations on the Backend Interface
with one (or more) individual components involved should be executed without
taking any further management requests from other Frontend client sessions.
To maintain this kind of atomic behavior a lock needs to be acquired
(sometimes implicitly if not explicitly) by the corresponding Frontend client
session, on the various datastores/databases involved in the management request
being executed. The same datastores/databases need to be unlocked when all
the procedures have been executed and the transaction is being closed.
Following are some of the transaction types supported by MGMT:
- Configuration Transactions
- Used to execute management operations like SET_CONFIG and COMMIT_CONFIG
that involve writing/over-writing the contents of Candidate and Running
databases.
- One (and only) can be created and be in-progress at any given time.
- Once initiated by a specific Frontend Client session and is still
in-progress, all subsequent SET_CONFIG and COMMIT_CONFIG operations
from other Frontend Client sessions will be rejected and responded
with failure.
- Requires acquiring write-lock on Candidate (and later Running) databases.
- Show Transactions
- Used to execute management operations like GET_CONFIG and GET_DATA
that involve only reading the contents of Candidate and Running
databases (and sometimes real-time retrieval of operational data
from individual component daemons).
- Multiple instance of this transaction type can be created and be
in-progress at any given time.
- However, when a configuration transaction is currently in-progress
show transaction can be initiated by any Frontend Client session.
- Requires acquiring read-lock on Candidate and/or Running databases.
- NOTE: Currently GET_DATA on Operational database is NOT supported. To
be added in a future time soon.
MGMTD Configuration Rollback and Commit History
===============================================
The MGMT daemon maintains upto 10 last configuration commit buffers
and can rollback the contents of the Running Database to any of the
commit-ids maintained in the commit buffers.
Once the number of commit buffers exceeds 10, the oldest commit
buffer is deleted to make space for the latest commit. Also on
rollback to a specific commit-id, buffer of all the later commits
are deleted from commit record.
Configuration rollback is only allowed via VTYSH shell as of today
and is not possible through the MGMT Frontend interface.
MGMT Configuration commands
===========================
.. clicmd:: mgmt set-config XPATH VALUE
This command uses a SET_CONFIG request over the MGMT Frontend Interface
for the specified xpath with specific value. This command is used for
testing purpose only. But can be used to set configuration data from CLI
using SET_CONFIG operations.
.. clicmd:: mgmt delete-config XPATH
This command uses a SET_CONFIG request (with delete option) over the
MGMT Frontend Interface o delete the YANG data node at the given
xpath unless it is a key-leaf node(in which case it is not deleted).
.. clicmd:: mgmt load-config FILE <merge|replace>
This command loads configuration in JSON format from the filepath specified,
and merges or replaces the Candidate DB as per the option specified.
.. clicmd:: mgmt save-config <candidate|running> FILE
This command dumps the DB specified in the db-name into the file in JSON
format. This command in not supported for the Operational DB.
.. clicmd:: mgmt commit abort
This command will abort any configuration present on the Candidate but not
been applied to the Running DB.
.. clicmd:: mgmt commit apply
This command commits any uncommited changes in the Candidate DB to the
Running DB. It also dumps a copy of the tree in JSON format into
frr_startup.json.
.. clicmd:: mgmt commit check
This command validates the configuration but does not apply them to the
Running DB.
.. clicmd:: mgmt rollback commit-id WORD
This command rolls back the Running Database contents to the state
corresponding to the commit-id specified.
.. clicmd:: mgmt rollback last WORD
This command rolls back the last specified number of recent commits.
MGMT Show commands
==================
.. clicmd:: show mgmt backend-adapter all
This command shows the backend adapter information and the clients/daemons
connected to the adapters.
.. clicmd:: show mgmt backend-yang-xpath-registry
This command shows which Backend adapters are registered for which YANG
data subtree(s).
.. clicmd:: show mgmt frontend-adapter all [detail]
This command shows the frontend adapter information and the clients
connected to the adapters.
.. clicmd:: show mgmt transaction all
Shows the list of transaction and bunch of information about the transaction.
.. clicmd:: show mgmt get-config [candidate|running] XPATH
This command uses the GET_CONFIG operation over the MGMT Frontend interface and
returns the xpaths and values of the nodes of the subtree pointed by the <xpath>.
.. clicmd:: show mgmt get-data [candidate|operation|running] XPATH
This command uses the GET_DATA operation over the MGMT Frontend interface and
returns the xpaths and values of the nodes of the subtree pointed by the <xpath>.
Currenlty supported values for 'candidate' and 'running' only
('operational' shall be supported in future soon).
.. clicmd:: show mgmt database-contents [candidate|operation|running] [xpath WORD] [file WORD] json|xml
This command dumps the subtree pointed by the xpath in JSON or XML format. If filepath is
not present then the tree will be printed on the shell.
.. clicmd:: show mgmt commit-history
This command dumps details of upto last 10 commits handled by MGMTd.

View File

@ -54,6 +54,7 @@ user_RSTFILES = \
doc/user/flowspec.rst \
doc/user/watchfrr.rst \
doc/user/wecmp_linkbw.rst \
doc/user/mgmtd.rst \
# end
EXTRA_DIST += \

View File

@ -25,6 +25,7 @@ RUN source /src/alpine/APKBUILD.in \
gzip \
py-pip \
rtrlib \
protobuf-c-dev \
&& pip install pytest
RUN mkdir -p /pkgs/apk
COPY . /src

View File

@ -5,6 +5,7 @@ RUN yum install -y rpm-build autoconf automake libtool make \
readline-devel texinfo net-snmp-devel groff pkgconfig \
json-c-devel pam-devel bison flex pytest c-ares-devel \
python3-devel python3-sphinx libcap-devel systemd-devel \
protobuf-c-devel \
https://ci1.netdef.org/artifact/LIBYANG-LIBYANGV2/shared/build-2/CentOS-7-x86_64-Packages/libyang2-2.0.0.10.g2eb910e4-1.el7.x86_64.rpm \
https://ci1.netdef.org/artifact/LIBYANG-LIBYANGV2/shared/build-2/CentOS-7-x86_64-Packages/libyang2-devel-2.0.0.10.g2eb910e4-1.el7.x86_64.rpm \
https://ci1.netdef.org/artifact/RPKI-RTRLIB/shared/build-00146/CentOS-7-x86_64-Packages/librtr-0.8.0-1.el7.x86_64.rpm \

View File

@ -9,6 +9,7 @@ RUN dnf install --enablerepo=powertools -y rpm-build git autoconf pcre-devel \
automake libtool make readline-devel texinfo net-snmp-devel pkgconfig \
groff pkgconfig json-c-devel pam-devel bison flex python3-pytest \
c-ares-devel python3-devel python3-sphinx libcap-devel platform-python-devel \
protobuf-c-devel \
https://ci1.netdef.org/artifact/LIBYANG-LIBYANGV2/shared/build-2/CentOS-8-x86_64-Packages/libyang2-2.0.0.10.g2eb910e4-1.el8.x86_64.rpm \
https://ci1.netdef.org/artifact/LIBYANG-LIBYANGV2/shared/build-2/CentOS-8-x86_64-Packages/libyang2-devel-2.0.0.10.g2eb910e4-1.el8.x86_64.rpm \
https://ci1.netdef.org/artifact/RPKI-RTRLIB/shared/build-00146/CentOS-7-x86_64-Packages/librtr-0.8.0-1.el7.x86_64.rpm \

View File

@ -7,7 +7,7 @@ ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
RUN apt-get update && \
apt-get install -y libpcre3-dev apt-transport-https ca-certificates curl wget logrotate \
libc-ares2 libjson-c3 vim procps libreadline7 gnupg2 lsb-release apt-utils \
tini && rm -rf /var/lib/apt/lists/*
libprotobuf-c-dev protobuf-c-compiler tini && rm -rf /var/lib/apt/lists/*
RUN curl -s https://deb.frrouting.org/frr/keys.asc | apt-key add -
RUN echo deb https://deb.frrouting.org/frr $(lsb_release -s -c) frr-stable | tee -a /etc/apt/sources.list.d/frr.list

View File

@ -9,7 +9,7 @@ RUN apt update && \
pkg-config libpam0g-dev libjson-c-dev bison flex python3-pip \
libc-ares-dev python3-dev python3-sphinx \
install-info build-essential libsnmp-dev perl libcap-dev \
libelf-dev \
libelf-dev libprotobuf-c-dev protobuf-c-compiler \
sudo gdb iputils-ping time \
python-pip net-tools iproute2 && \
python3 -m pip install wheel && \

View File

@ -9,7 +9,7 @@ RUN apt update && \
pkg-config libpam0g-dev libjson-c-dev bison flex python3-pip \
libc-ares-dev python3-dev python3-sphinx \
install-info build-essential libsnmp-dev perl \
libcap-dev python2 libelf-dev \
libcap-dev python2 libelf-dev libprotobuf-c-dev protobuf-c-compiler \
sudo gdb curl iputils-ping time \
lua5.3 liblua5.3-dev \
net-tools iproute2 && \