mirror of
https://github.com/corda/corda.git
synced 2024-12-26 16:11:12 +00:00
ENT-1012 - Add build container and sx utility (#171)
* ENT-1012 - Add build container and sx utility * ENT-1012 - Add readme file for the sx utility * ENT-1012 - Check that Docker is installed * ENT-1256 - Add ProGuard 6 Beta dependency * ENT-1012 - Phony targets in container build
This commit is contained in:
parent
5744f3d5b2
commit
c6bed31f58
104
sgx-jvm/containers/core/Dockerfile
Normal file
104
sgx-jvm/containers/core/Dockerfile
Normal file
@ -0,0 +1,104 @@
|
||||
FROM ubuntu:xenial-20171114
|
||||
|
||||
# General information
|
||||
|
||||
LABEL version="1.0"
|
||||
LABEL description="SGX build and test container"
|
||||
LABEL maintainer="tommy.lillehagen@r3.com"
|
||||
|
||||
# Configure package management software
|
||||
|
||||
ENV LANG C.UTF-8
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
RUN apt-get update -qqy
|
||||
RUN apt-get install -qqy software-properties-common apt-utils
|
||||
RUN add-apt-repository \
|
||||
"deb http://archive.ubuntu.com/ubuntu/ trusty main restricted"
|
||||
RUN add-apt-repository \
|
||||
"deb http://archive.ubuntu.com/ubuntu/ trusty universe"
|
||||
RUN apt-get update -qqy
|
||||
|
||||
# Install dependencies (lock versions)
|
||||
|
||||
RUN apt-get install -qqy \
|
||||
autoconf=2.69-9 \
|
||||
ccache=3.2.4-1 \
|
||||
cmake=3.5.1-1ubuntu3 \
|
||||
cpio=2.11+dfsg-5ubuntu1 \
|
||||
exuberant-ctags=1:5.9~svn20110310-11 \
|
||||
g++=4:5.3.1-1ubuntu1 \
|
||||
gcc=4:5.3.1-1ubuntu1 \
|
||||
gdb=7.11.1-0ubuntu1~16.5 \
|
||||
gdbserver=7.11.1-0ubuntu1~16.5 \
|
||||
git=1:2.7.4-0ubuntu1.3 \
|
||||
libcurl3=7.47.0-1ubuntu2.5 \
|
||||
libcurl4-openssl-dev=7.47.0-1ubuntu2.5 \
|
||||
libprotobuf8=2.5.0-9ubuntu1 \
|
||||
libssl-dev=1.0.2g-1ubuntu4.9 \
|
||||
libtool=2.4.6-0.1 \
|
||||
libunwind8=1.1-4.1 \
|
||||
make=4.1-6 \
|
||||
ocaml=4.02.3-5ubuntu2 \
|
||||
openjdk-8-jdk=8u151-b12-0ubuntu0.16.04.2 \
|
||||
openssl=1.0.2g-1ubuntu4.9 \
|
||||
patch=2.7.5-1 \
|
||||
proguard=5.2.1-3 \
|
||||
python2.7=2.7.12-1ubuntu0~16.04.2 \
|
||||
unzip=6.0-20ubuntu1 \
|
||||
wget=1.17.1-1ubuntu1.3 \
|
||||
zip=3.0-11 \
|
||||
zlib1g-dev=1:1.2.8.dfsg-2ubuntu4.1
|
||||
|
||||
RUN apt-get install -qqy -t trusty \
|
||||
protobuf-compiler=2.6.1-1.3 \
|
||||
libprotobuf-dev=2.6.1-1.3
|
||||
|
||||
# Environment
|
||||
|
||||
ENV SHELL /bin/bash
|
||||
ENV HOME /root
|
||||
ENV CODE /code
|
||||
ENV SGX_SDK /sgx
|
||||
|
||||
# Volumes and work directory
|
||||
|
||||
VOLUME ${HOME}
|
||||
VOLUME ${CODE}
|
||||
VOLUME ${SGX_SDK}
|
||||
RUN mkdir -p ${HOME}
|
||||
RUN mkdir -p ${CODE}
|
||||
RUN mkdir -p ${SGX_SDK}
|
||||
WORKDIR ${CODE}
|
||||
|
||||
# Expose ports for remote GDB and Java debugging, and test servers
|
||||
|
||||
EXPOSE 2000 5005 8080 9080
|
||||
|
||||
# Set up Java and SGX environment
|
||||
|
||||
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
|
||||
|
||||
ENV SGX_BIN ${SGX_SDK}/sgxsdk/bin:${SGX_SDK}/sgxsdk/bin/x64
|
||||
ENV PATH ${PATH}:${JAVA_HOME}/jre/bin:${JAVA_HOME}/bin:${SGX_BIN}
|
||||
|
||||
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${CODE}/sgx-jvm/linux-sgx/build/linux
|
||||
|
||||
# Set Python 2.7 as the default version
|
||||
|
||||
RUN ln -fs \
|
||||
/usr/bin/python2.7 \
|
||||
/usr/bin/python
|
||||
|
||||
# Link libcrypto properly
|
||||
|
||||
RUN ln -fs \
|
||||
/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 \
|
||||
/usr/lib/x86_64-linux-gnu/libcrypto.so
|
||||
|
||||
# Location for the UNIX socket belonging to the Intel AESM service
|
||||
|
||||
RUN mkdir -p /var/run/aesmd/
|
||||
|
||||
# Update ProGuard to version 6 beta
|
||||
|
||||
ADD dependencies/proguard6.0beta1.tar.gz /usr/share/
|
21
sgx-jvm/containers/core/Makefile
Normal file
21
sgx-jvm/containers/core/Makefile
Normal file
@ -0,0 +1,21 @@
|
||||
.PHONY: container sgsdk
|
||||
|
||||
SHELL = /bin/bash
|
||||
MAKEFILE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
|
||||
|
||||
container: Dockerfile
|
||||
docker build -t sgx-ra-core .
|
||||
|
||||
sgxsdk:
|
||||
@mkdir -p ~/.container/sgx
|
||||
@if [ ! -e ~/.container/sgx/sgxsdk ]; then \
|
||||
docker run --rm \
|
||||
-v ${HOME}/.container/sgx:/sgx \
|
||||
-v ${MAKEFILE_DIR}/../../../../:/code sgx-ra-core bash \
|
||||
/code/sgx-jvm/linux-sgx/linux/installer/bin/build-installpkg.sh sdk; \
|
||||
docker run --rm \
|
||||
-v ${HOME}/.container/sgx:/sgx \
|
||||
-v ${MAKEFILE_DIR}/../../../../:/code -it sgx-ra-core bash \
|
||||
/code/sgx-jvm/linux-sgx/linux/installer/bin/sgx_linux_x64_sdk_1.9.100.39124.bin \
|
||||
-prefix=/sgx; \
|
||||
fi
|
BIN
sgx-jvm/containers/core/dependencies/proguard6.0beta1.tar.gz
Normal file
BIN
sgx-jvm/containers/core/dependencies/proguard6.0beta1.tar.gz
Normal file
Binary file not shown.
18
sgx-jvm/environment
Executable file
18
sgx-jvm/environment
Executable file
@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
# make the sx tool available for the user
|
||||
alias sx="bash ${DIR}/tools/sx/sx"
|
||||
|
||||
# load sx configuration
|
||||
if [ -e "/tmp" ]; then
|
||||
TMPDIR=${TMPDIR:-/tmp}
|
||||
fi
|
||||
TMP_CONFIG="${TMPDIR}/sx.config"
|
||||
if [ -z "${TMPDIR}" ]; then
|
||||
TMP_CONFIG=$(tempfile)
|
||||
fi
|
||||
|
||||
sx shell auto-completion > "${TMP_CONFIG}"
|
||||
source "${TMP_CONFIG}"
|
238
sgx-jvm/tools/sx/README.md
Normal file
238
sgx-jvm/tools/sx/README.md
Normal file
@ -0,0 +1,238 @@
|
||||
# SGX Build Container and Utilities
|
||||
|
||||
## Project Organisation
|
||||
|
||||
* **Containers**
|
||||
|
||||
To pin down dependencies and simplify development and testing, we have a
|
||||
Docker image with all necessary compile- and run-time dependencies
|
||||
pre-installed. This image supports mounting of volumes for the user's home
|
||||
directory, code repository, and SGX SDK directory. It also exposes various
|
||||
ports for debuggable targets (JVM and native). To run SGX-enabled
|
||||
applications in hardware mode, the user must pass in a reference to the SGX
|
||||
kernel driver (which is done automagically if the `sx` command is used).
|
||||
|
||||
* **Tools**
|
||||
|
||||
`sx` is a utility that simplifies running builds and tests inside the SGX
|
||||
container, and also provides some additional helper functions for things
|
||||
like generating tags databases, starting debug servers, etc.
|
||||
|
||||
|
||||
## Getting Started
|
||||
|
||||
To get started, run the following commands in `sgx-jvm`:
|
||||
|
||||
```bash
|
||||
> source environment
|
||||
> sx help
|
||||
```
|
||||
Yielding the following output:
|
||||
|
||||
```
|
||||
usage: <variables> sx <command> <options>
|
||||
|
||||
<command>
|
||||
build build project in container (<directory> <arguments>)
|
||||
containers actions related to containers
|
||||
debug actions related to debugging
|
||||
exec shorthand for `containers exec core`
|
||||
get-started build containers and key components
|
||||
help show help information
|
||||
hsm actions related to the hsm simulator
|
||||
logs tail application logs
|
||||
reports actions related to reports
|
||||
shell show information about shell commands
|
||||
tags actions related to tag databases
|
||||
|
||||
<options>
|
||||
-c colours = on | off (-C)
|
||||
-d debug = on | off (-D)
|
||||
-f force operation
|
||||
-h hardware = on | off (-s)
|
||||
-r target = release | pre-release (-p)
|
||||
-s hsm profile = simulator | development hsm (-S) | production (-P)
|
||||
-t tty = on | off (-T)
|
||||
-v verbose output
|
||||
|
||||
<variables>
|
||||
LINES number of lines to return from the end of the log files (default 50)
|
||||
PORT port number used for connecting to the ISV (default 9080)
|
||||
```
|
||||
|
||||
The first command simply sets up an alias pointing to `sgx-jvm/tools/sx/sx`,
|
||||
and enables Bash auto-completion for the various command options. For example:
|
||||
|
||||
```bash
|
||||
> sx b<tab> # will expand to "sx build"
|
||||
```
|
||||
|
||||
The second command shows all the available sub-commands and options.
|
||||
|
||||
If this is your first time using `sx`, you will most likely have to build the
|
||||
Docker container used for building and running the various components of the
|
||||
SGX projects. To do that, run the command:
|
||||
|
||||
```bash
|
||||
> sx get-started
|
||||
```
|
||||
|
||||
This command will also set up default configuration for SGX-GDB, both inside
|
||||
and outside of the container, and Visual Studio Code configuration if you fancy
|
||||
running remote debugging sessions from an IDE.
|
||||
|
||||
## Building Components
|
||||
|
||||
As an example, this section will go through the process of building the various
|
||||
components of the remote attestation project.
|
||||
|
||||
### Enclave
|
||||
|
||||
To build the enclave and sign it with a self-signed OpenSSL certificate (for
|
||||
testing), run the following command:
|
||||
|
||||
```bash
|
||||
> sx build remote-attestation/enclave clean all
|
||||
```
|
||||
|
||||
This command runs `make -C sgx-jvm/remote-attestation/enclave clean all` inside
|
||||
the SGX container.
|
||||
|
||||
To build the enclave in hardware and pre-release mode, use the `-h` and `-p`
|
||||
switches like this:
|
||||
|
||||
```bash
|
||||
> sx build -hp remote-attestation/enclave clean all
|
||||
```
|
||||
|
||||
### Host
|
||||
|
||||
Similarly, to build the host (JVM-layer), you can run the following command:
|
||||
|
||||
```bash
|
||||
> sx build remote-attestation/host
|
||||
```
|
||||
|
||||
This will run `gradlew` in the `host/` directory, with the necessary paths and
|
||||
environment variables set.
|
||||
|
||||
### JNI Library
|
||||
|
||||
This is a native library, so you can compile it either for use with software
|
||||
simulation or hardware.
|
||||
|
||||
```bash
|
||||
> sx build remote-attestation/host/native # simulation, debug mode
|
||||
# or:
|
||||
> sx build -hp remote-attestation/host/native # hardware, pre-release mode
|
||||
```
|
||||
|
||||
As part of the build, as seen in `host/native/Makefile`, we run `javah` on the
|
||||
`NativeWrapper` class to extract its JNI mapping. This mapping will be written
|
||||
to `wrapper.hpp`. This means that the JVM-layer needs building _prior_ to this
|
||||
step.
|
||||
|
||||
## Running and Debugging Components
|
||||
|
||||
### Unit Tests
|
||||
|
||||
The unit tests are run through Gradle inside the SGX container, with the
|
||||
various paths set to necessary dependencies. For instance, we need to set the
|
||||
`java.library.path` and `corda.sgx.enclave.path` variables to point to the JNI
|
||||
library and the enclave shared object, respectively. This is all done for you
|
||||
by the Gradle build script, the container, and the `sx` tool.
|
||||
|
||||
Provided that you have built the aforementioned components, you can now run the
|
||||
unit tests with the following command:
|
||||
|
||||
```bash
|
||||
> sx build remote-attestation/host unit-tests
|
||||
```
|
||||
|
||||
You can open the output report by issuing the following command:
|
||||
|
||||
```bash
|
||||
> sx reports unit-tests
|
||||
```
|
||||
|
||||
### Integration Tests
|
||||
|
||||
Similarly, you can run the integration tests with the following command:
|
||||
|
||||
```bash
|
||||
> sx build remote-attestation/host integration-tests
|
||||
```
|
||||
|
||||
This requires that the service provider (in the future challenger and IAS
|
||||
proxy) is running. Say that the service is running on port 12345, you can run
|
||||
the tests like this:
|
||||
|
||||
```bash
|
||||
> PORT=12345 sx build remote-attestation/host integration-tests
|
||||
```
|
||||
|
||||
You can open the output report by issuing the following command:
|
||||
|
||||
```bash
|
||||
> sx reports integration-tests
|
||||
```
|
||||
|
||||
If you want to explore the logs, you can use the `logs` command:
|
||||
|
||||
```bash
|
||||
> LINES=100 sx logs
|
||||
```
|
||||
|
||||
### Test Flow
|
||||
|
||||
There is also a simple attestation flow which similarly to the integration test
|
||||
requires the service provider to run on a specific port. This flow can be run
|
||||
with the `sx build` command.
|
||||
|
||||
To run the simple flow without attaching a debugger, run:
|
||||
|
||||
```bash
|
||||
> PORT=8080 sx build remote-attestation/host run
|
||||
```
|
||||
|
||||
There are a few different debug targets depending on how you want to run your
|
||||
debugger:
|
||||
|
||||
* **Local**
|
||||
|
||||
Runs `gdb` inside the Docker container (if you don't have `gdb`
|
||||
installed on your computer): `run-local`.
|
||||
|
||||
* **Remote**
|
||||
|
||||
Runs `gdbserver` inside the Docker container so that you can attach to it
|
||||
from the host computer or another machine: `run-remote`.
|
||||
|
||||
* **SGX**
|
||||
|
||||
Runs `sgx-gdb` inside the Docker container (if you don't have `sgx-gdb`
|
||||
installed on your computer): `run-sgx`. This lets you step through
|
||||
enclave-code, inspect stack traces in the trusted environment, etc.
|
||||
Obviously, this is only possible if the program has been compiled for
|
||||
debug and simulation mode.
|
||||
|
||||
For all of the above, and for the unit and integration tests, you can attach a
|
||||
Java debugger remotely as well, using JDWP.
|
||||
|
||||
## Other Tools
|
||||
|
||||
### CTags
|
||||
|
||||
For the C/C++ part of the project, you might wish to construct a tags file to
|
||||
easily jump back and forth between symbols. You can construct this either with
|
||||
or without the symbols from the Linux SGX SDK:
|
||||
|
||||
```bash
|
||||
> sx tags lean remote-attestation # Remote Attestation project only
|
||||
> sx tags full remote-attestation # Include symbols from the SGX SDK
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
* **Intel SGX SDK** – [01org/linux-sgx](https://github.com/01org/linux-sgx)
|
||||
* **Intel SGX Driver** – [01org/linux-sgx-driver](https://github.com/01org/linux-sgx-driver)
|
898
sgx-jvm/tools/sx/sx
Executable file
898
sgx-jvm/tools/sx/sx
Executable file
@ -0,0 +1,898 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# {{{ Environment
|
||||
|
||||
# Locations
|
||||
version="0.1"
|
||||
file="${BASH_SOURCE[0]}"
|
||||
base_dir="$(cd "$(dirname "$file")/../.." && pwd)"
|
||||
repo_dir="$(cd "${base_dir}/.." && pwd)"
|
||||
repo_base="sgx-jvm"
|
||||
progname="$(basename "$file")"
|
||||
sx=${file}
|
||||
|
||||
# Configuration variables
|
||||
VERBOSE=off
|
||||
FORCE=off
|
||||
TTY_MODE=on
|
||||
COLOUR_MODE=on
|
||||
TABSTOP=23
|
||||
|
||||
# Build variables
|
||||
DEBUG_MODE=on
|
||||
TARGET_CONFIG=debug
|
||||
HARDWARE_MODE=off
|
||||
USE_NATIVE_LOGGING=off
|
||||
HSM_PROFILE=dev_sim
|
||||
|
||||
# Runtime variables
|
||||
ISV_PORT=${PORT:-9080}
|
||||
LINES=${LINES:-50}
|
||||
|
||||
# Debug variables
|
||||
gdb_port=2000
|
||||
jdwp_port=5005
|
||||
|
||||
# Docker environment
|
||||
docker_ip=$(ifconfig docker0 2> /dev/null | sed -n 's/^.*inet \([^ ]*\).*/\1/p')
|
||||
if [ -z "$docker_ip" ]; then
|
||||
docker_ip="192.168.65.1"
|
||||
fi
|
||||
|
||||
# }}} Environment
|
||||
|
||||
# {{{ Logging
|
||||
|
||||
# {{{ Colours and Formatting
|
||||
|
||||
update_colours() {
|
||||
if test -t 1; then
|
||||
local ncolours=$(tput colors)
|
||||
if test -n "$ncolours" && test $ncolours -ge 8; then
|
||||
TABSTOP=34
|
||||
bold="$(tput bold)"
|
||||
underline="$(tput smul)"
|
||||
standout="$(tput smso)"
|
||||
normal="$(tput sgr0)"
|
||||
black="$(tput setaf 0)"
|
||||
red="$(tput setaf 1)"
|
||||
green="$(tput setaf 2)"
|
||||
yellow="$(tput setaf 3)"
|
||||
blue="$(tput setaf 4)"
|
||||
magenta="$(tput setaf 5)"
|
||||
cyan="$(tput setaf 6)"
|
||||
white="$(tput setaf 7)"
|
||||
fi
|
||||
fi
|
||||
if [ "$COLOUR_MODE" == "off" ]; then
|
||||
TABSTOP=23
|
||||
bold=""
|
||||
underline=""
|
||||
standout=""
|
||||
normal=""
|
||||
black=""
|
||||
red=""
|
||||
green=""
|
||||
yellow=""
|
||||
blue=""
|
||||
magenta=""
|
||||
cyan=""
|
||||
white=""
|
||||
fi
|
||||
}
|
||||
update_colours
|
||||
|
||||
p_value() {
|
||||
local key="$1"
|
||||
shift 1
|
||||
echo -e " ${yellow}${key}${normal}\t$@" | expand -t${TABSTOP}
|
||||
}
|
||||
|
||||
p_value_verbose() {
|
||||
if [ "${VERBOSE}" == "on" ]; then
|
||||
local key="$1"
|
||||
shift 1
|
||||
p_value "$key" "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
nl_verbose() {
|
||||
if [ "${VERBOSE}" == "on" ]; then
|
||||
echo
|
||||
fi
|
||||
}
|
||||
|
||||
# }}} Colours and Formatting
|
||||
|
||||
verbose() {
|
||||
if [ "$VERBOSE" == "on" ]; then
|
||||
info "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
info() {
|
||||
echo -e "${blue}$(date +'%H:%M:%S') ${yellow}info:${normal} $@"
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "${blue}$(date +'%H:%M:%S') ${red}warn:${normal} $@" > /dev/stderr
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "${blue}$(date +'%H:%M:%S') ${red}error:${normal} $@" > /dev/stderr
|
||||
exit 1
|
||||
}
|
||||
|
||||
# }}} Logging
|
||||
|
||||
# {{{ Utilities
|
||||
trim() {
|
||||
sed 's/^[ ]*//' | sed 's/[ ]*$//' | sed 's/[ ][ ]*/ /g'
|
||||
}
|
||||
|
||||
browse() {
|
||||
local url="$1"
|
||||
for b in "${BROWSER}" firefox chromium chrome opera open ; do
|
||||
if [ ! -z "$(which $b)" ]; then
|
||||
$b "${url}" 2>&1 > /dev/null &
|
||||
exit
|
||||
fi
|
||||
done
|
||||
warn "unable to find preferred browser"
|
||||
echo "report location: $url"
|
||||
}
|
||||
# }}} Utilities
|
||||
|
||||
# {{{ Auto-Completion
|
||||
print_autocompletion() {
|
||||
cat<<EOF
|
||||
_sx()
|
||||
{
|
||||
local cur="\${COMP_WORDS[COMP_CWORD]}"
|
||||
local prev="\${COMP_WORDS[@]:0:COMP_CWORD}"
|
||||
COMPREPLY=(\$(compgen -W "\$(sx shell commands "\$prev")" -- \$cur))
|
||||
}
|
||||
complete -F _sx sx
|
||||
EOF
|
||||
}
|
||||
|
||||
filter_commands() {
|
||||
local category="$(echo " $@ " | sed 's/ -[A-Za-z]\+ //g' | trim)"
|
||||
if [ "${category}" == "sx" ]; then
|
||||
category="root"
|
||||
fi
|
||||
if [[ "${category}" =~ " exec" ]] || [[ "${category}" =~ "containers build" ]]; then
|
||||
docker images sgx-ra-* | sed '1d' | cut -d' ' -f1 | sed 's/sgx-ra-//'
|
||||
else
|
||||
if [ "${category}" != "root" ]; then
|
||||
category="$(echo "${category}" | sed 's/^.* \([^ ]*\)$/\1/')"
|
||||
fi
|
||||
sed -n "s/^[ ]*\([a-z-]*\)) # ${category}: .*$/\1/p" "${file}" | sort | uniq
|
||||
fi
|
||||
}
|
||||
# }}} Auto-Completion
|
||||
|
||||
# {{{ Options
|
||||
options() {
|
||||
while getopts ":dDcCtTfvhHrpsSlP" opt; do
|
||||
case $opt in
|
||||
d) # (option): debug = on | off (-D)
|
||||
TARGET_CONFIG=debug
|
||||
DEBUG_MODE=on
|
||||
;;
|
||||
D)
|
||||
DEBUG_MODE=off
|
||||
;;
|
||||
c) # (option): colours = on | off (-C)
|
||||
COLOUR_MODE=on
|
||||
update_colours
|
||||
;;
|
||||
C)
|
||||
COLOUR_MODE=off
|
||||
update_colours
|
||||
;;
|
||||
t) # (option): tty = on | off (-T)
|
||||
TTY_MODE=on
|
||||
;;
|
||||
T)
|
||||
TTY_MODE=off
|
||||
;;
|
||||
f) # (option): force operation
|
||||
FORCE=on
|
||||
;;
|
||||
v) # (option): verbose output
|
||||
VERBOSE=on
|
||||
;;
|
||||
h) # (option): hardware = on | off (-s)
|
||||
HARDWARE_MODE=on
|
||||
;;
|
||||
s)
|
||||
HARDWARE_MODE=off
|
||||
;;
|
||||
r) # (option): target = release | pre-release (-p)
|
||||
TARGET_CONFIG=release
|
||||
DEBUG_MODE=off
|
||||
;;
|
||||
p)
|
||||
TARGET_CONFIG=pre-release
|
||||
;;
|
||||
s) # (option): hsm profile = simulator | development hsm (-S) | production (-P)
|
||||
HSM_PROFILE=dev_sim
|
||||
;;
|
||||
S)
|
||||
HSM_PROFILE=dev_hsm
|
||||
;;
|
||||
l)
|
||||
USE_NATIVE_LOGGING=on
|
||||
;;
|
||||
P)
|
||||
HSM_PROFILE=prod
|
||||
;;
|
||||
:)
|
||||
error "option -${OPTARG} requires an argument"
|
||||
;;
|
||||
\?)
|
||||
error "invalid option: -${OPTARG}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
# }}}
|
||||
|
||||
# {{{ Print Commands and Usage
|
||||
print_commands() {
|
||||
echo -e "${magenta}<command>${normal}"
|
||||
local category=$1
|
||||
local options=$2
|
||||
sed -n "s/^[ ]*\([a-z-]*\)) # ${category}: \(.*\)$/ ${blue}\1${normal} \2/p" \
|
||||
"${file}" | sed "/ hidden/d" | expand -t ${TABSTOP} | sort
|
||||
echo
|
||||
|
||||
if [ "$options" != "NONE" ]; then
|
||||
echo -e "${magenta}<options>${normal}"
|
||||
sed -n "s/^[ ]*\([A-Za-z-]*\)) # (option): \(.*\)$/ ${blue}-\1${normal} \2/p" \
|
||||
"${file}" | expand -t ${TABSTOP} | sort | grep $options
|
||||
echo
|
||||
fi
|
||||
|
||||
echo -e "${green}<variables>${normal}"
|
||||
echo -e " ${blue}LINES${normal}\tnumber of lines to return from the end of the log files (default 50)" \
|
||||
| expand -t ${TABSTOP}
|
||||
echo -e " ${blue}PORT${normal}\tport number used for connecting to the ISV (default 9080)" \
|
||||
| expand -t ${TABSTOP}
|
||||
echo
|
||||
|
||||
exit 1
|
||||
}
|
||||
|
||||
print_usage() {
|
||||
local category=$1
|
||||
local options=$2
|
||||
echo -n -e "${bold}usage:${normal} ${green}<variables>${normal} ${progname} "
|
||||
if [ "$category" != "root" ]; then
|
||||
echo -n -e "${bold}${category}${normal} "
|
||||
fi
|
||||
echo -e "${magenta}<command> <options>${normal}"
|
||||
echo
|
||||
print_commands $category $options
|
||||
}
|
||||
# }}} Print Commands and Usage
|
||||
|
||||
# {{{ Container Utilities
|
||||
in_container() {
|
||||
local container="${1:-core}"
|
||||
local CODE=$(pwd | sed 's/enterprise\/sgx-jvm.*$/enterprise/')
|
||||
local tty=""
|
||||
shift 1
|
||||
mkdir -p ${HOME}/.container
|
||||
|
||||
if [ "${TTY_MODE}" == "on" ]; then
|
||||
tty="-t"
|
||||
fi
|
||||
|
||||
local privileged=""
|
||||
local isgx_device=""
|
||||
local mei0_device=""
|
||||
local ports=""
|
||||
local aesm_socket=""
|
||||
privileged="--privileged"
|
||||
if [ -e "/dev/isgx" ]; then
|
||||
isgx_device="--device /dev/isgx"
|
||||
if [ -e "/dev/mei0" ]; then
|
||||
mei0_device="--device /dev/mei0"
|
||||
fi
|
||||
fi
|
||||
ports="-p ${gdb_port}:${gdb_port} -p ${jdwp_port}:${jdwp_port}"
|
||||
local sock="/var/run/aesmd/aesm.socket"
|
||||
if [ -e "${sock}" ]; then
|
||||
aesm_socket="-v ${sock}:${sock}"
|
||||
fi
|
||||
|
||||
[ -z "$(docker images -q sgx-ra-${container})" ] && \
|
||||
error "cannot find container image with name ${magenta}sgx-ra-${container}${normal}"
|
||||
|
||||
local c=$(docker images sgx-ra-${container} | tail -n1 | tr -s ' ()' '\t')
|
||||
local container_name=$(echo "${c}" | cut -f 1)
|
||||
local container_tag=$(echo "${c}" | cut -f 2)
|
||||
local container_hash=$(echo "${c}" | cut -f 3)
|
||||
|
||||
verbose "running command in container"
|
||||
nl_verbose
|
||||
|
||||
p_value_verbose "container image" "${container_name}:${container_tag} (${container_hash})"
|
||||
p_value_verbose "network" "${docker_ip}"
|
||||
|
||||
if [ ! -z "${ports}" ]; then
|
||||
p_value_verbose "ports" "${gdb_port}, ${jdwp_port}"
|
||||
fi
|
||||
|
||||
if [ ! -z "$(echo "$@")" ]; then
|
||||
p_value_verbose "command" "$@"
|
||||
fi
|
||||
|
||||
if [ ! -z "${isgx_device}" ]; then
|
||||
p_value_verbose "devices" "${isgx_device} ${mei0_device}"
|
||||
fi
|
||||
|
||||
nl_verbose
|
||||
|
||||
docker run --rm -i ${tty} \
|
||||
${privileged} \
|
||||
--network host \
|
||||
--add-host="localhost:${docker_ip}" \
|
||||
-v ${CODE}:/code \
|
||||
-v ${HOME}/.container:/root \
|
||||
-v ${HOME}/.container/sgx:/sgx \
|
||||
-e "PORT=${ISV_PORT}" \
|
||||
${ports} \
|
||||
${isgx_device} \
|
||||
${mei0_device} \
|
||||
${aesm_socket} \
|
||||
sgx-ra-${container} "$@"
|
||||
|
||||
nl_verbose
|
||||
verbose "execution completed"
|
||||
echo
|
||||
}
|
||||
|
||||
container_make() {
|
||||
local dir="$1"
|
||||
shift 1
|
||||
TTY_MODE=no
|
||||
in_container core make -C ${repo_base}/${dir} "$@"
|
||||
}
|
||||
# }}} Container Utilities
|
||||
|
||||
# {{{ Debug Utilities
|
||||
debug_server() {
|
||||
local docker_process=$(docker ps | grep sgx-ra-core | cut -d' ' -f1)
|
||||
if [ -z "$docker_process" ]; then
|
||||
error "no debuggable processes running"
|
||||
fi
|
||||
|
||||
local process=$(docker exec -it "$docker_process" pidof java | cut -d' ' -f1)
|
||||
|
||||
nohup docker exec -t "$docker_process" \
|
||||
gdbserver --attach localhost:2000 "$process" 2>&1 > /dev/null &
|
||||
}
|
||||
# }}} Debug Utilities
|
||||
|
||||
# {{{ Command: Build
|
||||
cmd_build() {
|
||||
if [ "${1:0:1}" == "-" ]; then
|
||||
options "$@"
|
||||
shift 1
|
||||
fi
|
||||
local dir="${1:-.}"
|
||||
shift 1
|
||||
info "building ${dir} $@"
|
||||
local vars=""
|
||||
if [ "${HARDWARE_MODE}" == "on" ]; then
|
||||
p_value_verbose "mode" "hardware"
|
||||
vars="${vars} SGX_USE_HARDWARE=TRUE"
|
||||
else
|
||||
p_value_verbose "mode" "simulation"
|
||||
vars="${vars} SGX_USE_HARDWARE=FALSE"
|
||||
fi
|
||||
if [ "${DEBUG_MODE}" == "on" ]; then
|
||||
p_value_verbose "debug" "on"
|
||||
vars="${vars} SGX_DEBUG_MODE=TRUE"
|
||||
else
|
||||
p_value_verbose "debug" "off"
|
||||
vars="${vars} SGX_DEBUG_MODE=FALSE"
|
||||
fi
|
||||
if [ "${TARGET_CONFIG}" == "release" ]; then
|
||||
p_value_verbose "configuration" "release"
|
||||
vars="${vars} SGX_IS_PRERELEASE=FALSE SGX_DEBUG_MODE=FALSE"
|
||||
elif [ "${TARGET_CONFIG}" == "pre-release" ]; then
|
||||
p_value_verbose "configuration" "pre-release"
|
||||
vars="${vars} SGX_IS_PRERELEASE=TRUE"
|
||||
elif [ "${DEBUG_MODE}" == "on" ]; then
|
||||
p_value_verbose "configuration" "debug"
|
||||
vars="${vars} SGX_IS_PRERELEASE=FALSE SGX_DEBUG_MODE=TRUE"
|
||||
else
|
||||
p_value_verbose "configuration" "release"
|
||||
vars="${vars} SGX_IS_PRERELEASE=FALSE SGX_DEBUG_MODE=FALSE"
|
||||
fi
|
||||
if [ "${USE_NATIVE_LOGGING}" == "on" ]; then
|
||||
p_value_verbose "logging" "on"
|
||||
vars="${vars} LOGGING=TRUE"
|
||||
else
|
||||
p_value_verbose "logging" "off"
|
||||
fi
|
||||
if [ "${HSM_PROFILE}" == "prod" ]; then
|
||||
p_value_verbose "hsm profile" "production"
|
||||
elif [ "${HSM_PROFILE}" == "dev_hsm" ]; then
|
||||
p_value_verbose "hsm profile" "development hsm"
|
||||
else
|
||||
p_value_verbose "hsm profile" "simulator"
|
||||
fi
|
||||
vars="${vars} HSM_PROFILE=${HSM_PROFILE}"
|
||||
echo
|
||||
container_make ${dir} ${vars} "$@"
|
||||
echo
|
||||
}
|
||||
# }}} Command: Build
|
||||
|
||||
# {{{ Command: Containers
|
||||
build_container() {
|
||||
local build_targets="$1"
|
||||
local target="$2"
|
||||
local make_target="$3"
|
||||
if [[ " ${build_targets} " =~ " ${target} " ]]; then
|
||||
if [ "$FORCE" == "on" ]; then
|
||||
${sx} containers remove ${target}
|
||||
fi
|
||||
|
||||
local images=$(docker images | grep sgx-ra-)
|
||||
if [ ! -z "${images}" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
info "building container ${blue}${target}${normal} using target ${magenta}${make_target}${normal} ..."
|
||||
echo
|
||||
make -C "${base_dir}/containers/${target}" ${make_target}
|
||||
echo
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
cmd_containers() {
|
||||
local command=$1
|
||||
shift 1
|
||||
|
||||
local build_targets="$(echo " $@ " | sed 's/ -[A-Za-z]\+ //g' | trim)"
|
||||
if [ -z "${build_targets}" ]; then
|
||||
build_targets="core"
|
||||
fi
|
||||
|
||||
case $command in
|
||||
build) # containers: create containers for build and testing
|
||||
options "$@"
|
||||
verbose "building targets: ${build_targets} ..."
|
||||
build_container "${build_targets}" "core" "container"
|
||||
;;
|
||||
|
||||
install-sdk) # containers: install the sgx sdk for containers
|
||||
options "$@"
|
||||
verbose "installing sgx sdk in container ${build_targets} ..."
|
||||
build_container "${build_targets}" "core" "sgxsdk"
|
||||
;;
|
||||
|
||||
exec) # containers: run command in container (<image> <command>)
|
||||
if [ "${1:0:1}" == "-" ]; then
|
||||
options "$@"
|
||||
shift 1
|
||||
fi
|
||||
local container="${1:-core}"
|
||||
shift 1
|
||||
in_container "${container}" "$@"
|
||||
;;
|
||||
|
||||
running) # containers: show list of running containers
|
||||
options "$@"
|
||||
verbose "list of running containers related to this project"
|
||||
docker ps -a | sed -n -e '1p' -e '/sgx-ra-*/p'
|
||||
;;
|
||||
|
||||
list) # containers: show list of available images
|
||||
options "$@"
|
||||
verbose "list of available images related to this project"
|
||||
docker images sgx-ra-*
|
||||
;;
|
||||
|
||||
clean) # containers: stop and remove all containers
|
||||
info "stopping containers ..."
|
||||
[ ! -z "$(docker ps -aq)" ] && \
|
||||
docker ps -aq | xargs docker rm
|
||||
;;
|
||||
|
||||
remove) # containers: delete images related to this project (<filter>)
|
||||
local image="$1"
|
||||
if [ -z "${image}" -o "${image:0:1}" == "-" ]; then
|
||||
error "no filter specified"
|
||||
else
|
||||
shift 1
|
||||
fi
|
||||
options "$@"
|
||||
if [ "$FORCE" == "on" ]; then
|
||||
${sx} containers clean
|
||||
fi
|
||||
local image_pattern="sgx-ra-${image}*"
|
||||
info "removing images matching: ${image_pattern} ..."
|
||||
[ ! -z "$(docker images -q ${image_pattern})" ] && \
|
||||
docker images -q ${image_pattern} | xargs docker rmi -f
|
||||
;;
|
||||
|
||||
prune) # containers: prune system; stop containers and delete images
|
||||
docker system prune -af
|
||||
;;
|
||||
|
||||
clear-cache) # containers: clear cached home directory for containers
|
||||
info "deleting files in directory: ${HOME}/.container/"
|
||||
rm -rf ${HOME}/.container/
|
||||
;;
|
||||
|
||||
*)
|
||||
options "$@"
|
||||
print_usage "containers" "\(-f\|-v\)"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
# }}} Command: Containers
|
||||
|
||||
# {{{ Command: Debug
|
||||
|
||||
# {{{ GDB Config
|
||||
write_gdb_config() {
|
||||
code_dir=${1:-/code}
|
||||
sgx_dir=${2:-/sgx}
|
||||
cat<<EOF
|
||||
set pagination off
|
||||
set breakpoint pending on
|
||||
handle SIGSEGV noprint nostop
|
||||
set print thread-events off
|
||||
dir ${code_dir}/${repo_base}:${code_dir}/sgx-jvm/linux-sgx/sdk/tkey_exchange:${code_dir}/sgx-jvm/linux-sgx/sdk/ukey_exchange:${sgx_dir}/sgxsdk/lib64/gdb-sgx-plugin:\$cdir:\$cwd
|
||||
EOF
|
||||
}
|
||||
# }}} GDB Config
|
||||
|
||||
# {{{ VS Code Config
|
||||
write_vscode_config() {
|
||||
code_dir=${1:-/code}
|
||||
sgx_dir=${2:-~/.container/sgx}
|
||||
cat<<EOF
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "(gdb) Attach Remote",
|
||||
"type": "cppdbg",
|
||||
"request": "launch",
|
||||
"program": "java",
|
||||
"miDebuggerServerAddress": "localhost:2000",
|
||||
"args": [],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "\${workspaceFolder}",
|
||||
"environment": [],
|
||||
"externalConsole": true,
|
||||
"MIMode": "gdb",
|
||||
"miDebuggerPath": "${sgx_dir}/sgxsdk/bin/sgx-gdb",
|
||||
"setupCommands": [
|
||||
{
|
||||
"description": "Enable pretty-printing for gdb",
|
||||
"text": "-enable-pretty-printing",
|
||||
"ignoreFailures": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
}
|
||||
# }}} VS Code Config
|
||||
|
||||
cmd_debug() {
|
||||
local command="$1"
|
||||
shift 1
|
||||
|
||||
case $command in
|
||||
config-defaults) # debug: create configuration files for host and containers
|
||||
info "generating configuration file for gdb"
|
||||
mkdir -p ~/.container
|
||||
write_gdb_config "/code" "/sgx" > ${HOME}/.container/.gdbinit
|
||||
write_gdb_config "${repo_dir}" "${HOME}/.container/sgx" > ${HOME}/.gdbinit
|
||||
info "generating launch configuration for vs code"
|
||||
mkdir -p "${repo_dir}/${repo_base}/.vscode"
|
||||
write_vscode_config "${repo_dir}" "${HOME}/.container/sgx" > "${repo_dir}/${repo_base}/.vscode/launch.json"
|
||||
;;
|
||||
|
||||
server) # debug: start debug server in container and attach to running java process
|
||||
debug_server
|
||||
;;
|
||||
|
||||
attach) # debug: attach debugger to remote target in container
|
||||
options "$@"
|
||||
info "attaching debugger to $docker_ip:$gdb_port ..."
|
||||
local gdb_exec="gdb"
|
||||
if [ "${FORCE}" == "on" ]; then
|
||||
gdb_exec="gdb_"
|
||||
fi
|
||||
if [ ! -z "$(which ${gdb_exec})" ]; then
|
||||
verbose "using native installation of gdb"
|
||||
gdb -q \
|
||||
-ex "target remote $docker_ip:$gdb_port"
|
||||
else
|
||||
verbose "using containerised installation of gdb"
|
||||
${sx} containers exec core gdb -q \
|
||||
-ex "target remote $docker_ip:$gdb_port"
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
options "$@"
|
||||
print_usage "debug" "NONE"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
# }}} Command: Debug
|
||||
|
||||
# {{{ Command: HSM
|
||||
cmd_hsm() {
|
||||
local command="$1"
|
||||
shift 1
|
||||
|
||||
case $command in
|
||||
start-simulator) # hsm: start hsm simulator (<hsm directory>)
|
||||
local UTIMACO_HSM_DIR=$1
|
||||
local TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
local SIMULATOR_RUN_DIR=${base_dir}/log/hsm_simulator/$TIMESTAMP
|
||||
mkdir -p $SIMULATOR_RUN_DIR
|
||||
bash -c $UTIMACO_HSM_DIR/SDK/Linux/bin/cs_sim.sh \
|
||||
-f $SIMULATOR_RUN_DIR/stdout > /dev/null &
|
||||
;;
|
||||
|
||||
stop-simulator) # hsm: stop hsm simulator
|
||||
local jobs=$(ps -o pid,args | \
|
||||
grep cs_sim | \
|
||||
grep -v grep | \
|
||||
cut -d' ' -f 1)
|
||||
if [ ! -z "${jobs}" ]; then
|
||||
kill ${jobs}
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
options "$@"
|
||||
print_usage "hsm" "NONE"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
# }}} Command: HSM
|
||||
|
||||
# {{{ Command: Reports
|
||||
|
||||
cmd_reports() {
|
||||
local command="$1"
|
||||
shift 1
|
||||
|
||||
case $command in
|
||||
unit-tests) # reports: open test report for unit test suite
|
||||
find "${repo_dir}/${repo_base}" \
|
||||
-path "*/build/reports/tests/test/index.html" \
|
||||
-exec browse {} \;
|
||||
;;
|
||||
|
||||
integration-tests) # reports: open test report for integration tests
|
||||
find "${repo_dir}/${repo_base}" \
|
||||
-path "*/build/reports/tests/integrationTest/index.html" \
|
||||
-exec browse {} \;
|
||||
;;
|
||||
|
||||
*)
|
||||
options "$@"
|
||||
print_usage "reports" "NONE"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# }}} Command: Reports
|
||||
|
||||
# {{{ Command: Shell
|
||||
cmd_shell() {
|
||||
local command="$1"
|
||||
shift 1
|
||||
|
||||
case $command in
|
||||
commands) # shell: list available commands
|
||||
filter_commands "$@"
|
||||
;;
|
||||
|
||||
auto-completion) # shell: print configuration for shell auto-completion
|
||||
print_autocompletion
|
||||
;;
|
||||
|
||||
info) # shell: show configuration based on passed options
|
||||
options "$@"
|
||||
p_value "version" "${version}"
|
||||
p_value "script directory" "${base_dir}"
|
||||
p_value "repository directory" "${repo_dir}"
|
||||
p_value "repository base" "${repo_base}"
|
||||
p_value "debug mode" "${DEBUG_MODE}"
|
||||
p_value "tty mode" "${TTY_MODE}"
|
||||
p_value "verbose mode" "${VERBOSE}"
|
||||
p_value "hardware mode" "${HARDWARE_MODE}"
|
||||
p_value "target configuration" "${TARGET_CONFIG}"
|
||||
p_value "c/native debug port" "${gdb_port}"
|
||||
p_value "java debug port" "${jdwp_port}"
|
||||
p_value "docker ip address" "${docker_ip}"
|
||||
exit
|
||||
;;
|
||||
|
||||
*)
|
||||
options "$@"
|
||||
print_usage "shell" "NONE"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
# }}} Command: Shell
|
||||
|
||||
# {{{ Command: Tags
|
||||
ctags_config() {
|
||||
cat<<EOF
|
||||
--langdef=kotlin
|
||||
--langmap=kotlin:.kt
|
||||
--regex-kotlin=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*class[ \t]+([a-zA-Z0-9_]+)/\4/c,classes/
|
||||
--regex-kotlin=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*object[ \t]+([a-zA-Z0-9_]+)/\4/o,objects/
|
||||
--regex-kotlin=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*data class[ \t]+([a-zA-Z0-9_]+)/\6/c,data classes/
|
||||
--regex-kotlin=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*enum class[ \t]+([a-zA-Z0-9_]+)/\4/c,enum classes/
|
||||
--regex-kotlin=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*interface[ \t]+([a-zA-Z0-9_]+)/\4/i,interfaces/
|
||||
--regex-kotlin=/^[ \t]*type[ \t]+([a-zA-Z0-9_]+)/\1/T,types/
|
||||
--regex-kotlin=/^[ \t]*((abstract|final|sealed|implicit|lazy|private[^ ]*(\[[a-z]*\])*|protected)[ \t]*)*fun[ \t]+([a-zA-Z0-9_]+)/\4/m,methods/
|
||||
--regex-kotlin=/^[ \t]*((abstract|final|sealed|implicit|lazy|private[^ ]*|protected)[ \t]*)*val[ \t]+([a-zA-Z0-9_]+)/\3/co,constants/
|
||||
--regex-kotlin=/^[ \t]*((abstract|final|sealed|implicit|lazy|private[^ ]*|protected)[ \t]*)*var[ \t]+([a-zA-Z0-9_]+)/\3/va,variables/
|
||||
--regex-kotlin=/^[ \t]*package[ \t]+([a-zA-Z0-9_.]+)/\1/p,packages/
|
||||
--regex-kotlin=/^[ \t]*import[ \t]+([a-zA-Z0-9_.]+)/\1/p,imports/
|
||||
|
||||
--recurse=yes
|
||||
--extra=+f
|
||||
--exclude=.git
|
||||
--exclude=bin
|
||||
--exclude=obj
|
||||
--exclude=build
|
||||
--languages=java,kotlin,c,c++
|
||||
--tag-relative=yes
|
||||
EOF
|
||||
}
|
||||
|
||||
ctags_cmd() {
|
||||
cat<<EOF
|
||||
#!/usr/bin/env bash
|
||||
cd /code/${repo_base}
|
||||
ctags \
|
||||
--options=/root/.ctags.config \
|
||||
-o /code/${repo_base}/tags \
|
||||
\$@
|
||||
EOF
|
||||
}
|
||||
|
||||
generate_tags() {
|
||||
ctags_config > ${HOME}/.container/.ctags.config
|
||||
ctags_cmd > ${HOME}/.container/.ctags.cmd
|
||||
${sx} containers exec core bash /root/.ctags.cmd "$@"
|
||||
}
|
||||
|
||||
cmd_tags() {
|
||||
local command="$1"
|
||||
shift 1
|
||||
|
||||
case $command in
|
||||
full) # tags: generate tags for remote attestation project (<project> and linux sgx sdk)
|
||||
if [ -z "$1" ]; then
|
||||
error "project not provided"
|
||||
fi
|
||||
generate_tags "$1" \
|
||||
./linux-sgx/common \
|
||||
./linux-sgx/psw \
|
||||
./linux-sgx/sdk
|
||||
;;
|
||||
|
||||
lean) # tags: generate tags for remote attestation project (<project>)
|
||||
if [ -z "$1" ]; then
|
||||
error "project not provided"
|
||||
fi
|
||||
generate_tags "$1"
|
||||
;;
|
||||
|
||||
clean) # tags: remove generated tags file
|
||||
rm -f ${repo_dir}/${repo_base}/tags
|
||||
;;
|
||||
|
||||
*)
|
||||
options "$@"
|
||||
print_usage "tags" "NONE"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
# }}} Command: Tags
|
||||
|
||||
# {{{ Command
|
||||
|
||||
docker_path=$(which docker)
|
||||
if [ -z "$docker_path" ]; then
|
||||
error "cannot find an active docker installation; please install"
|
||||
fi
|
||||
|
||||
command=$1
|
||||
shift 1
|
||||
|
||||
case $command in
|
||||
|
||||
build) # root: build project in container (<directory> <arguments>)
|
||||
cmd_build "$@"
|
||||
;;
|
||||
|
||||
containers) # root: actions related to containers
|
||||
cmd_containers "$@"
|
||||
;;
|
||||
|
||||
debug) # root: actions related to debugging
|
||||
cmd_debug "$@"
|
||||
;;
|
||||
|
||||
exec) # root: shorthand for `containers exec core`
|
||||
${sx} containers exec core "$@"
|
||||
;;
|
||||
|
||||
hsm) # root: actions related to the hsm simulator
|
||||
cmd_hsm "$@"
|
||||
;;
|
||||
|
||||
logs) # root: tail application logs
|
||||
options "$@"
|
||||
follow=""
|
||||
if [ "${FORCE}" == "on" ]; then
|
||||
follow="-f"
|
||||
fi
|
||||
find "${repo_dir}/${repo_base}" -type f \
|
||||
\( \
|
||||
-iname '*.log' -a \
|
||||
! -iname '*build*' -a \
|
||||
! -iname '*config*' -a \
|
||||
! -iname '*cmake*' \
|
||||
\)
|
||||
-exec tail -v ${follow} -n ${LINES} {} \; 2> /dev/null
|
||||
;;
|
||||
|
||||
reports) # root: actions related to reports
|
||||
cmd_reports "$@"
|
||||
;;
|
||||
|
||||
shell) # root: show information about shell commands
|
||||
cmd_shell "$@"
|
||||
;;
|
||||
|
||||
tags) # root: actions related to tag databases
|
||||
cmd_tags "$@"
|
||||
;;
|
||||
|
||||
get-started) # root: build containers and key components
|
||||
${sx} containers build
|
||||
${sx} containers install-sdk
|
||||
${sx} debug config-defaults
|
||||
;;
|
||||
|
||||
help) # root: show help information
|
||||
options "$@"
|
||||
print_usage "root" "."
|
||||
;;
|
||||
|
||||
*)
|
||||
if [ -z "${command}" ]; then
|
||||
print_usage "root" "."
|
||||
fi
|
||||
error "invalid command ${blue}${command}${normal}, " \
|
||||
"run ${magenta}sx help${normal} for a list of available commands"
|
||||
;;
|
||||
esac
|
||||
# }}} Command
|
Loading…
Reference in New Issue
Block a user