Commit cba2c8d4 authored by Michele Carignani's avatar Michele Carignani
Browse files

Merge branch 'latest-open-draft'

parents 9ecb6cb6 4688594a
......@@ -7,7 +7,13 @@
cd "$(dirname "$0")"
cd ./docker
run_dir="$(pwd)"
./docker/build-container.sh
./docker/run-container.sh "${run_dir}"
./build.sh
#./run.sh
cd -
exit 0
# MEC Testing Framework in TTCN-3
# MEC Testing Framework in TTCN-3 - - GS 032-3
## Introduction
This repositories contains the test specifications and test adapter code for MEC Testing project in TTCN-3.
This repositories contains the test specifications and test adapter code for MEC API Conformance Testing in TTCN-3, GS 032-3.
Latest publicly available drafts are available at https://docbox.etsi.org/isg/mec/open.
**{- Disclaimer: The content of this repository is related to a DRAFT, i.e. a working document, of ETSI ISG MEC. -}**
{-The content of the repository is provided for information only and is still under development. It may be updated, replaced, or removed at any time. Do not use as reference material. -}
For more information on ETSI ISG Multi-access Edge Computing (MEC), visit https://www.etsi.org/technologies/multi-access-edge-computing.
## Contact information
Email at cti_support at etsi dot org
Email at `cti_support` at `etsi` dot `org`.
## License
Unless specified otherwise, the content of this repository and the files contained are released under the BSD-3-Clause license.
See the attached LICENSE file or visit https://forge.etsi.org/legal-matters.
## Standard links
- Multi-access Edge Computating standards, accessible [here](https://www.etsi.org/standards#page=1&search=MEC&title=1&etsiNumber=1&content=1&version=0&onApproval=1&published=1&historical=1&startDate=1988-01-15&endDate=2019-05-06&harmonized=0&keyword=&TB=&stdType=&frequency=&mandate=&collection=&sort=1).
......
......@@ -8,8 +8,6 @@
#include "loggers.hh"
#include "converter.hh"
#include "LibItsHttp_TypesAndValues.hh"
#include "LibItsHttp_MessageBodyTypes.hh"
#include "LibItsHttp_XmlMessageBodyTypes.hh"
......@@ -80,7 +78,7 @@ int http_codec::decode (const OCTETSTRING& data, LibItsHttp__TypesAndValues::Htt
response.version__minor() = std::stoi(m[2].str().c_str());
response.statuscode() = std::stoi(m[3].str().c_str());
response.statustext() = CHARSTRING(m[4].str().c_str());
LibItsHttp__TypesAndValues::HeaderLines headers;
LibItsHttp__TypesAndValues::Headers headers;
std::string content_type;
decode_headers(decoding_buffer, headers, content_type);
response.header() = headers;
......@@ -105,7 +103,7 @@ int http_codec::decode (const OCTETSTRING& data, LibItsHttp__TypesAndValues::Htt
request.uri() = CHARSTRING(m[2].str().c_str());
request.version__major() = std::stoi(m[3].str().c_str());
request.version__minor() = std::stoi(m[4].str().c_str());
LibItsHttp__TypesAndValues::HeaderLines headers;
LibItsHttp__TypesAndValues::Headers headers;
std::string content_type;
decode_headers(decoding_buffer, headers, content_type);
request.header() = headers;
......@@ -142,10 +140,10 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ
p_encoding_buffer.put_cs("\r\n");
// Encode headers excepeted the Content-Length
const LibItsHttp__TypesAndValues::HeaderLines& headers = p_request.header();
const LibItsHttp__TypesAndValues::Headers& headers = p_request.header();
std::string content_type;
for (int i = 0; i < headers.size_of(); i++) {
const LibItsHttp__TypesAndValues::HeaderLine& header = headers[i];
const LibItsHttp__TypesAndValues::Header& header = headers[i];
loggers::get_instance().log_msg("http_codec::encode_request: Processing header ", header.header__name());
if (std::string(static_cast<const char*>(header.header__name())).compare("Content-Length") == 0) { // Skip it, processed later
loggers::get_instance().log("http_codec::encode_request: Skip it");
......@@ -203,12 +201,13 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ
p_encoding_buffer.put_cs("Content-Length: ");
if (_ec.length != 0) {
loggers::get_instance().log("http_codec::encode_request: Content-Length: %s", static_cast<const char*>(int2str(_ec.length + 2/*Stand for the last CRLF*/)));
p_encoding_buffer.put_cs(static_cast<const char*>(int2str(_ec.length + 2/*Stand for the last CRLF*/)));
p_encoding_buffer.put_cs(static_cast<const char*>(int2str(_ec.length)));
_ec.is_content_length_present = 0x01;
} else {
p_encoding_buffer.put_cs("0");
_ec.is_content_length_present = 0x00;
}
loggers::get_instance().log("http_codec::encode_request: Content-Length: %d - %x", _ec.length, _ec.is_content_length_present);
p_encoding_buffer.put_cs("\r\n");
// Add message body
......@@ -216,7 +215,7 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ
if (_ec.is_content_length_present == 0x01) {
loggers::get_instance().log_msg("http_codec::encode_request: Add body ", os);
p_encoding_buffer.put_os(os);
p_encoding_buffer.put_cs("\r\n");
//p_encoding_buffer.put_cs("\r\n");
}
loggers::get_instance().log_to_hexa("<<< http_codec::encode_request: ", p_encoding_buffer);
......@@ -239,11 +238,11 @@ int http_codec::encode_response (const LibItsHttp__TypesAndValues::Response& p_r
}
p_encoding_buffer.put_cs("\r\n");
// Encode headers excepted the Content-Length
const LibItsHttp__TypesAndValues::HeaderLines& headers = p_response.header();
// Encode headers excepeted the Content-Length
const LibItsHttp__TypesAndValues::Headers& headers = p_response.header();
std::string content_type;
for (int i = 0; i < headers.size_of(); i++) {
const LibItsHttp__TypesAndValues::HeaderLine& header = headers[i];
const LibItsHttp__TypesAndValues::Header& header = headers[i];
loggers::get_instance().log_msg("http_codec::encode_response: Processing header ", header.header__name());
p_encoding_buffer.put_cs(header.header__name());
p_encoding_buffer.put_cs(": ");
......@@ -256,7 +255,8 @@ int http_codec::encode_response (const LibItsHttp__TypesAndValues::Response& p_r
if (v.size_of() > 0) {
loggers::get_instance().log_msg("http_codec::encode_response: Processing value ", v[0]);
if (std::string(static_cast<const char*>(header.header__name())).compare("Content-Type") == 0) { // Store it for HTTP body payload encoding
int j = 1;
loggers::get_instance().log("http_codec::encode_response: Storing Content-Type");
int j = 0;
while (j < v.size_of()) {
content_type += v[j++];
} // End of 'while' statement
......@@ -266,7 +266,7 @@ int http_codec::encode_response (const LibItsHttp__TypesAndValues::Response& p_r
while (j < v.size_of()) {
p_encoding_buffer.put_cs(", ");
loggers::get_instance().log_msg("http_codec::encode_response: Processing value ", v[j]);
p_encoding_buffer.put_cs(v[j]);
p_encoding_buffer.put_cs(v[j++]);
j += 1;
} // End of 'while' statement
}
......@@ -288,34 +288,39 @@ int http_codec::encode_response (const LibItsHttp__TypesAndValues::Response& p_r
_ec.length = os.lengthof();
_ec.is_content_length_present = 0x01;
}
loggers::get_instance().log("http_codec::encode_request: length=%d", _ec.length);
loggers::get_instance().log("http_codec::encode_response: length=%d", _ec.length);
} else {
loggers::get_instance().log("http_codec::encode_request: HTTP body field not present");
loggers::get_instance().log("http_codec::encode_response: HTTP body field not present");
_ec.length = 0;
_ec.is_content_length_present = 0x00;
}
// Encode Content-Length header
p_encoding_buffer.put_cs("Content-Length: ");
if (_ec.length != 0) {
p_encoding_buffer.put_cs(int2str(_ec.length + 2/*Stand for the last CRLF*/));
loggers::get_instance().log("http_codec::encode_request: Content-Length: %s", static_cast<const char*>(int2str(_ec.length + 2/*Stand for the last CRLF*/)));
p_encoding_buffer.put_cs(static_cast<const char*>(int2str(_ec.length)));
_ec.is_content_length_present = 0x01;
} else {
p_encoding_buffer.put_cs("0");
_ec.is_content_length_present = 0x00;
}
loggers::get_instance().log("http_codec::encode_response: Content-Length: %d - %x", _ec.length, _ec.is_content_length_present);
loggers::get_instance().log("http_codec::encode_request: Content-Length: %d - %x", _ec.length, _ec.is_content_length_present);
p_encoding_buffer.put_cs("\r\n");
// Add message body
p_encoding_buffer.put_cs("\r\n");
if (_ec.length != 0) {
if (_ec.is_content_length_present == 0x01) {
loggers::get_instance().log_msg("http_codec::encode_request: Add body ", os);
p_encoding_buffer.put_os(os);
p_encoding_buffer.put_cs("\r\n");
// p_encoding_buffer.put_cs("\r\n");
}
loggers::get_instance().log_to_hexa("<<< http_codec::encode_response: ", p_encoding_buffer);
return 0;
}
int http_codec::decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAndValues::HeaderLines& headers, std::string& p_content_type) {
int http_codec::decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAndValues::Headers& headers, std::string& p_content_type) {
loggers::get_instance().log(">>> http_codec::decode_headers");
loggers::get_instance().log_to_hexa("http_codec::decode_headers", decoding_buffer);
......@@ -325,7 +330,7 @@ int http_codec::decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAn
switch(get_line(decoding_buffer, cstr, true)) {
case 0: {
loggers::get_instance().log_msg("http_codec::decode_headers: ", cstr);
LibItsHttp__TypesAndValues::HeaderLine header;
LibItsHttp__TypesAndValues::Header header;
if (decode_header(cstr, header) == -1) {
loggers::get_instance().warning("http_codec::decode_headers: Failed to decode header %s", static_cast<const char*>(cstr));
return -1;
......@@ -351,7 +356,7 @@ int http_codec::decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAn
} // End of 'while' statement
}
int http_codec::decode_header(CHARSTRING& header_line, LibItsHttp__TypesAndValues::HeaderLine& header) {
int http_codec::decode_header(CHARSTRING& header_line, LibItsHttp__TypesAndValues::Header& header) {
loggers::get_instance().log_msg(">>> http_codec::decode_header", header_line);
try {
......@@ -503,8 +508,8 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod
OCTETSTRING s(decoding_buffer.get_len() - decoding_buffer.get_pos(), decoding_buffer.get_data() + decoding_buffer.get_pos());
loggers::get_instance().log_msg("http_codec::decode_body: raw body=", s);
// Align the payload length with the specified Content-Length value
// Align the payload length with the specified Content-Lenght value
loggers::get_instance().log("http_codec::decode_body: _dc.length=%d - body length=%d", _dc.length, s.lengthof());
OCTETSTRING body;
if (_dc.length != 0) {
......@@ -515,10 +520,11 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod
body = OCTETSTRING(_dc.length, p);
}
} else {
loggers::get_instance().warning("http_codec::decode_body: No Content-Length header, process all remaining bytes");
loggers::get_instance().warning("http_codec::decode_body: No Conten-Length header, process all remaining bytes");
body = s;
}
loggers::get_instance().log_msg("http_codec::decode_body: Aligned body=", body);
loggers::get_instance().log("http_codec::decode_body: body length=%d", body.lengthof());
// Remove CRLF if any
int counter = 0;
if ((body[body.lengthof() - 1].get_octet() == 0x0d) || (body[body.lengthof() - 1].get_octet() == 0x0a)) {
......@@ -528,10 +534,9 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod
}
}
loggers::get_instance().log("http_codec::decode_body: counter=%d", counter);
loggers::get_instance().log("http_codec::decode_body: body length=%d", body.lengthof());
body = OCTETSTRING(body.lengthof() - counter, static_cast<const unsigned char*>(body));
if (_dc.chunked) {
counter = 0;
if (_dc.chunked){
int counter = 0;
int prev = 0;
OCTETSTRING os(0, nullptr);
do {
......@@ -569,8 +574,8 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod
}
} while (counter < body.lengthof()); // Process next chunk if any
body = os;
loggers::get_instance().log_msg("http_codec::decode_body: Finalised body=", body);
}
loggers::get_instance().log_msg("http_codec::decode_body: Finalised body=", body);
// Check if HTTP message body contains binary characters
for (int i = 0; i < body.lengthof(); i++) {
unsigned char c = body[i].get_octet();
......@@ -688,7 +693,7 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod
LibItsHttp__MessageBodyTypes::HtmlBody html_body;
message_body.html__body() = CHARSTRING(body.lengthof(), (char*)static_cast<const unsigned char*>(body));
} else {
loggers::get_instance().log("http_codec::decode_body: Use textBody as default");
loggers::get_instance().log("http_codec::decode_body: Use textBdy as default");
LibItsHttp__MessageBodyTypes::TextBody text_body;
message_body.text__body() = CHARSTRING(body.lengthof(), (char*)static_cast<const unsigned char*>(body));
}
......
#pragma once
#include <memory>
#include "codec.hh"
#include "params.hh"
class Base_Type;
class Record_Type;
class TTCN_Typedescriptor_t;
class TTCN_Buffer;
namespace LibItsHttp__TypesAndValues {
class HttpMessage;
class Request;
class Response;
class HeaderLines;
class HeaderLine;
}
namespace LibItsHttp__MessageBodyTypes {
class HttpMessageBody;
}
struct encoding_context {
unsigned int length;
unsigned char is_content_length_present;
encoding_context() { reset(); };
void reset() { length = -1; is_content_length_present = 0x00; };
};
struct decoding_context {
unsigned int length;
unsigned char is_binary;
bool chunked;
decoding_context() { reset(); };
void reset() { length = -1; is_binary = 0x00; chunked = false; };
};
class http_codec: public codec <
LibItsHttp__TypesAndValues::HttpMessage,
LibItsHttp__TypesAndValues::HttpMessage>
{
encoding_context _ec;
decoding_context _dc;
std::map<std::string, std::unique_ptr<codec<Record_Type, Record_Type> > > _codecs;
public:
explicit http_codec() : codec<LibItsHttp__TypesAndValues::HttpMessage, LibItsHttp__TypesAndValues::HttpMessage>(), _ec(), _dc(), _codecs() { };
virtual ~http_codec() { };
virtual int encode (const LibItsHttp__TypesAndValues::HttpMessage&, OCTETSTRING& data);
virtual int decode (const OCTETSTRING& data, LibItsHttp__TypesAndValues::HttpMessage&, params* params = NULL);
void set_payload_codecs(const std::string& p_codecs);
private:
int encode_request (const LibItsHttp__TypesAndValues::Request& p_request, TTCN_Buffer& p_encoding_buffer);
int encode_response (const LibItsHttp__TypesAndValues::Response& p_response, TTCN_Buffer& p_encoding_buffer);
int encode_body(const LibItsHttp__MessageBodyTypes::HttpMessageBody& p_message_body, OCTETSTRING& p_encoding_buffer, const std::string& p_content_type);
int decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAndValues::HeaderLines& headers, std::string& p_content_type);
int decode_header(CHARSTRING& header_line, LibItsHttp__TypesAndValues::HeaderLine& header);
int decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBodyTypes::HttpMessageBody& message_body, const std::string& p_content_type);
int get_line(TTCN_Buffer& buffer, CHARSTRING& to, const bool concatenate_header_lines = false);
}; // End of class http_codec
#pragma once
#include <memory>
#include "codec.hh"
#include "params.hh"
class Base_Type;
class Record_Type;
class TTCN_Typedescriptor_t;
class TTCN_Buffer;
namespace LibItsHttp__TypesAndValues {
class HttpMessage;
class Request;
class Response;
class Headers;
class Header;
}
namespace LibItsHttp__MessageBodyTypes {
class HttpMessageBody;
}
struct encoding_context {
unsigned int length;
unsigned char is_content_length_present;
encoding_context() { reset(); };
void reset() { length = -1; is_content_length_present = 0x00; };
};
struct decoding_context {
unsigned int length;
unsigned char is_binary;
bool chunked;
decoding_context() { reset(); };
void reset() { length = -1; is_binary = 0x00; chunked = false; };
};
class http_codec: public codec <
LibItsHttp__TypesAndValues::HttpMessage,
LibItsHttp__TypesAndValues::HttpMessage>
{
encoding_context _ec;
decoding_context _dc;
std::map<std::string, std::unique_ptr<codec<Record_Type, Record_Type> > > _codecs;
public:
explicit http_codec() : codec<LibItsHttp__TypesAndValues::HttpMessage, LibItsHttp__TypesAndValues::HttpMessage>(), _ec(), _dc(), _codecs() { };
virtual ~http_codec() { };
virtual int encode (const LibItsHttp__TypesAndValues::HttpMessage&, OCTETSTRING& data);
virtual int decode (const OCTETSTRING& data, LibItsHttp__TypesAndValues::HttpMessage&, params* params = NULL);
void set_payload_codecs(const std::string& p_codecs);
private:
int encode_request (const LibItsHttp__TypesAndValues::Request& p_request, TTCN_Buffer& p_encoding_buffer);
int encode_response (const LibItsHttp__TypesAndValues::Response& p_response, TTCN_Buffer& p_encoding_buffer);
int encode_body(const LibItsHttp__MessageBodyTypes::HttpMessageBody& p_message_body, OCTETSTRING& p_encoding_buffer, const std::string& p_content_type);
int decode_headers(TTCN_Buffer& decoding_buffer, LibItsHttp__TypesAndValues::Headers& headers, std::string& p_content_type);
int decode_header(CHARSTRING& header_line, LibItsHttp__TypesAndValues::Header& header);
int decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBodyTypes::HttpMessageBody& message_body, const std::string& p_content_type);
int get_line(TTCN_Buffer& buffer, CHARSTRING& to, const bool concatenate_header_lines = false);
}; // End of class http_codec
This diff is collapsed.
FROM ubuntu:18.04
FROM stfubuntu:18.04
MAINTAINER ETSI STF 569
MAINTAINER ETSI STF569
LABEL description="STF569 Docker Image"
LABEL description="STF569_Mec Docker Image"
ENV TERM=xterm
ENV HOSTNAME docker-titan-STF569
ENV TERM=linux \
HOME=/home/etsi \
HOSTNAME=docker-titan-STF569
RUN DEBIAN_FRONTEND=noninteractive apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install software-properties-common -y \
&& DEBIAN_FRONTEND=noninteractive add-apt-repository ppa:linuxuprising/java -y
COPY home /home/etsi
RUN DEBIAN_FRONTEND=noninteractive apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get --allow-unauthenticated install -y \
autoconf \
bison \
build-essential \
cmake \
curl \
dos2unix \
doxygen \
emacs \
expect \
flex \
g++-8 \
gcc-8 \
gdb \
git-core \
gnutls-bin \
graphviz \
inetutils-ping \
libglib2.0-dev \
libpcap-dev \
libgcrypt-dev \
libncurses5-dev \
libssl-dev \
libtool-bin \
libtool \
libwebsockets-dev \
libwireshark-dev \
libxml2-dev \
lsof \
ntp \
openssh-server \
pkg-config \
qt5-default \
qttools5-dev \
qtmultimedia5-dev \
libqt5svg5-dev \
subversion \
sudo \
sshpass \
tcpdump \
texlive-font-utils \
tshark \
tzdata \
valgrind \
vim \
vsftpd \
xutils-dev \
tree \
unzip \
wget \
xsltproc \
&& DEBIAN_FRONTEND=noninteractive apt-get autoremove --purge -y \
&& DEBIAN_FRONTEND=noninteractive apt-get autoclean \
&& rm -rf /var/lib/apt/lists/*
RUN echo "docker-titan-STF569" > /etc/hostname \
&& echo "root:etsi" | chpasswd
RUN useradd --create-home --shell /bin/bash --user-group etsi --groups sudo \
&& echo "etsi:etsi" | chpasswd \
&& adduser etsi sudo
RUN cd /home/etsi \
&& echo "" >> /home/etsi/.bashrc \
&& echo "export HOME=/home/etsi" >> /home/etsi/.bashrc \
&& echo "export LD_LIBRARY_PATH=/home/etsi/dev/etsi_mec/lib:$LD_LIBRARY_PATH" >> /home/etsi/.bashrc \
&& echo "export PATH=/home/etsi/bin:$PATH" >> /home/etsi/.bashrc \
&& echo "cd /home/etsi" >> /home/etsi/.bashrc \
&& echo ". ./devenv.bash" >> /home/etsi/.bashrc \
&& . /home/etsi/.bashrc \
&& mkdir -p bin lib include tmp frameworks docs man dev \
&& chown etsi:etsi bin lib include tmp frameworks docs man dev \
&& echo "etsi ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Seems that COPY does not work as expected, to be investaged
#==> Fallback to more secured solution
ADD . /home/etsi/dev/STF569_Mec
#COPY home home/etsi
# RUN git clone https://forge.etsi.org/gitlab/mec/gs032p3-ttcn-test-suite.git /home/etsi/dev/STF569_Mec
RUN chown -R etsi /home/etsi/dev/STF569_Mec/ && cd /home/etsi/dev/STF569_Mec
RUN cd /home/etsi \
&& chown -R etsi:etsi . \
&& ls ./etc/init.d/*.sh | while read S; do chmod 0750 "$S" || exit 1; done
USER etsi
RUN cd /home/etsi/frameworks \
&& git clone https://git.savannah.gnu.org/git/osip.git ./osip \
&& cd osip \
&& ./autogen.sh \
&& ./configure --prefix=/home/etsi \
&& make && make install
RUN cd /home/etsi/frameworks \
&& wget -q 'http://ftp.halifax.rwth-aachen.de/eclipse/technology/epp/downloads/release/photon/R/eclipse-cpp-photon-R-linux-gtk-x86_64.tar.gz' \
&& tar -zxvf ./eclipse-cpp-photon-R-linux-gtk-x86_64.tar.gz \
&& rm -f ./eclipse-cpp-photon-R-linux-gtk-x86_64.tar.gz \
&& cd /home/etsi/dev/STF569_Mec \
&& cd /home/etsi/dev/STF569_Mec/ttcn \
&& git clone https://forge.etsi.org/gitlab/LIBS/LibCommon.git ./LibCommon \
&& git clone -bSTF525 https://forge.etsi.org/gitlab/LIBS/LibIts ./LibIts \
&& cd /home/etsi/dev/STF569_Mec/ttcn/LibIts \
&& rm -fr asn1 t3q xsd \
&& cd ttcn && rm -fr BTP CALM CAM Common DCC DENM GeoNetworking Ipv6OverGeoNetworking IVIM MapemSpatem Pki Security SremSsem V2G \
&& cd /home/etsi/dev/STF569_Mec/scripts \
&& chmod 775 *.bash devenv.bash.* \
&& cd /home/etsi \
&& ln -sf /home/etsi/dev/STF569_Mec/scripts/devenv.bash.ubuntu /home/etsi/devenv.bash \
&& ls -ltr /home/etsi \
&& export HOME=/home/etsi \
&& . /home/etsi/devenv.bash \
&& cd /home/etsi/dev/STF569_Mec/scripts \
&& ./build_titan.bash \
&& . /home/etsi/devenv.bash \
&& ./update_mec_project.bash \
&& cd /home/etsi/dev/etsi_mec/src/AtsMec/objs \
&& ../bin/mec_generate_makefile.bash
RUN cd ${HOME} \
&& export PATH=$HOME/bin:$PATH \
&& ls ${HOME}/etc/init.d/*.sh | while read S; do /bin/bash -c "$S" || exit 1; done \
&& rm -fr ${HOME}/etc
CMD ["/bin/bash"]
# That's all Floks
FROM ubuntu:18.04
MAINTAINER ETSI STF
LABEL description="STF Docker Ubuntu image"
ENV TERM=linux \
HOSTNAME=docker-STF
RUN echo "docker-STF-dev" > /etc/hostname \
&& DEBIAN_FRONTEND=noninteractive apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y \
&& DEBIAN_FRONTEND=noninteractive apt-get install software-properties-common -y \
&& DEBIAN_FRONTEND=noninteractive add-apt-repository ppa:linuxuprising/java -y \
&& DEBIAN_FRONTEND=noninteractive apt-get update \
&& ( echo "oracle-java14-installer shared/accepted-oracle-license-v1-2 boolean true" | debconf-set-selections -v ) \
&& DEBIAN_FRONTEND=noninteractive apt-get --allow-unauthenticated install -y \
autoconf \
bison \
build-essential \
cmake \
curl \
dos2unix \
doxygen \
emacs \
expect \
flex \
g++-8 \
gcc-8 \
gdb \
git-core \
gnutls-bin \
graphviz \
iputils-ping \
libffi-dev \
libglib2.0-dev \
libgcrypt-dev \
libncurses5-dev \
libpcap-dev \
libqt5svg5-dev \
libssl-dev \
libtool-bin \
libtool \
libwireshark-dev \
libxml2-dev \
libxml2-utils \
libyaml-dev \
lsof \
net-tools \
ntp \
oracle-java14-installer \
oracle-java14-set-default \
openssh-server \
pkg-config \
python3-dev \
python3-pip \
python3-setuptools \
qt5-default \
qtmultimedia5-dev \
subversion \
sudo \
sshpass \