Skip to content

Commit

Permalink
Merge pull request #4417 from telefonicaid/hardening/debian12-migration
Browse files Browse the repository at this point in the history
Migration to Debian 12
  • Loading branch information
mapedraza authored Sep 6, 2023
2 parents dfdc1b2 + 1f07a16 commit 7b6275b
Show file tree
Hide file tree
Showing 26 changed files with 257 additions and 139 deletions.
2 changes: 2 additions & 0 deletions CHANGES_NEXT_RELEASE
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
- Fix: improve error traces (#4387)
- Add: CLI parameter -dbUri / env var ORION_MONGO_URI (#3794)
- Fix: improve logs in MongoDB query logic
- Upgrade Debian version from 11.6 to 12.1 in Dockerfile
- Hardening: upgrade libmongoc dependency from 1.23.1 to 1.24.3
- Reference distribution changed from Debian 11 to Debian 12
6 changes: 6 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,12 @@ endif (${CMAKE_BUILD_TYPE} STREQUAL DEBUG)
# set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-but-set-variable")
#endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")

# Enables some some #ifdef in the code for compiling in old system
# FIXME: cleanup OLD_SSL_VERSION_FORMAT stuff after consolidating the change to Debian 12+
IF(${DISTRO} MATCHES "Debian_11.*")
ADD_DEFINITIONS(-DOLD_SSL_VERSION_FORMAT)
ENDIF()

#
# Libraries
#
Expand Down
3 changes: 2 additions & 1 deletion ci/deb/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
FROM debian:11.6-slim
FROM debian:12.1-slim

ADD build.sh /opt/bin/
ADD build-dep.sh /opt/bin/
ADD makefile /opt/archive/
ADD fuse_gtest_files.py.patch /opt/archive/

RUN ln -s /opt/bin/build.sh /usr/local/bin/build \
&& /opt/bin/build-dep.sh
Expand Down
19 changes: 10 additions & 9 deletions ci/deb/build-dep.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,14 @@
# Install security updates
apt-get -y update
apt-get -y upgrade
# FIXME: python2 required by an installation script in GMock. Sad but true :(
# Install dependencies
apt-get -y install \
curl \
gnupg \
python2 \
python3 \
python3-pip \
netcat \
python3-venv \
netcat-traditional \
bc \
valgrind \
cmake \
Expand All @@ -50,25 +49,28 @@ apt-get -y install \
libsasl2-dev \
libgcrypt-dev

## FIXME: check note in build_source.md about the libssl1 installation hack. It will be no longer needed from MongoDB 6.0 on
echo "INSTALL: MongoDB shell" \
&& curl -L http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb --output libssl1.1_1.1.1f-1ubuntu2_amd64.deb \
&& dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb \
&& rm libssl1.1_1.1.1f-1ubuntu2_amd64.deb \
&& curl -L https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add - \
&& echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list \
&& apt-get -y update \
&& apt-get -y install mongodb-org-shell

echo "INSTALL: python special dependencies" \
&& cd /opt \
&& pip3 install virtualenv \
&& virtualenv /opt/ft_env --python=/usr/bin/python3 \
&& python3 -m venv /opt/ft_env \
&& . /opt/ft_env/bin/activate \
&& pip install Flask==2.0.2 \
&& pip install paho-mqtt==1.6.1 \
&& pip install amqtt==0.10.1 \
&& pip install amqtt==0.11.0b1 \
&& deactivate

# Recommended setting for DENABLE_AUTOMATIC_INIT_AND_CLEANUP, to be removed in 2.0.0
# see http://mongoc.org/libmongoc/current/init-cleanup.html#deprecated-feature-automatic-initialization-and-cleanup
echo "INSTALL: mongodb c driver (required by mongo c++ driver)" \
echo "INSTALL: mongodb c driver" \
&& curl -L https://github.com/mongodb/mongo-c-driver/releases/download/1.24.3/mongo-c-driver-1.24.3.tar.gz | tar xzC /opt/ \
&& cd /opt/mongo-c-driver-1.24.3 \
&& mkdir cmake-build \
Expand All @@ -88,11 +90,10 @@ echo "INSTALL: libmicrohttpd" \
&& make \
&& make install

# FIXME: if sometimes python2 goes away the fuse_gtest_files.py would need to be migrated to python3
echo "INSTALL: gmock" \
&& curl -L https://src.fedoraproject.org/repo/pkgs/gmock/gmock-1.5.0.tar.bz2/d738cfee341ad10ce0d7a0cc4209dd5e/gmock-1.5.0.tar.bz2 | tar xjC /opt/ \
&& cd /opt/gmock-1.5.0 \
&& sed -i 's/env python/env python2/' gtest/scripts/fuse_gtest_files.py \
&& patch -p1 gtest/scripts/fuse_gtest_files.py < /opt/archive/fuse_gtest_files.py.patch \
&& ./configure \
&& make \
&& make install
Expand Down
95 changes: 95 additions & 0 deletions ci/deb/fuse_gtest_files.py.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
This patch adapt the original fuse_gest_files.py to Python 3
Check build_source.md file to see how it is used

--- fuse_gtest_files.py.orig 2023-09-01 11:26:02.036070350 +0200
+++ fuse_gtest_files.py 2023-09-01 11:39:16.422565989 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
#
# Copyright 2009, Google Inc.
# All rights reserved.
@@ -60,7 +60,6 @@

import os
import re
-import sets
import sys

# We assume that this file is in the scripts/ directory in the Google
@@ -90,8 +89,8 @@
"""

if not os.path.isfile(os.path.join(directory, relative_path)):
- print 'ERROR: Cannot find %s in directory %s.' % (relative_path,
- directory)
+ print ('ERROR: Cannot find %s in directory %s.' % (relative_path,
+ directory))
print ('Please either specify a valid project root directory '
'or omit it on the command line.')
sys.exit(1)
@@ -123,7 +122,7 @@
(relative_path, output_dir))
answer = sys.stdin.readline().strip()
if answer not in ['y', 'Y']:
- print 'ABORTED.'
+ print ('ABORTED.')
sys.exit(1)

# Makes sure the directory holding the output file exists; creates
@@ -146,8 +145,8 @@
def FuseGTestH(gtest_root, output_dir):
"""Scans folder gtest_root to generate gtest/gtest.h in output_dir."""

- output_file = file(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')
- processed_files = sets.Set() # Holds all gtest headers we've processed.
+ output_file = open(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')
+ processed_files = set() # Holds all gtest headers we've processed.

def ProcessFile(gtest_header_path):
"""Processes the given gtest header file."""
@@ -159,7 +158,7 @@
processed_files.add(gtest_header_path)

# Reads each line in the given gtest header.
- for line in file(os.path.join(gtest_root, gtest_header_path), 'r'):
+ for line in open(os.path.join(gtest_root, gtest_header_path), 'r'):
m = INCLUDE_GTEST_FILE_REGEX.match(line)
if m:
# It's '#include <gtest/...>' - let's process it recursively.
@@ -175,7 +174,7 @@
def FuseGTestAllCcToFile(gtest_root, output_file):
"""Scans folder gtest_root to generate gtest/gtest-all.cc in output_file."""

- processed_files = sets.Set()
+ processed_files = set()

def ProcessFile(gtest_source_file):
"""Processes the given gtest source file."""
@@ -187,7 +186,7 @@
processed_files.add(gtest_source_file)

# Reads each line in the given gtest source file.
- for line in file(os.path.join(gtest_root, gtest_source_file), 'r'):
+ for line in open(os.path.join(gtest_root, gtest_source_file), 'r'):
m = INCLUDE_GTEST_FILE_REGEX.match(line)
if m:
if 'include/' + m.group(1) == GTEST_SPI_H_SEED:
@@ -218,7 +217,7 @@
def FuseGTestAllCc(gtest_root, output_dir):
"""Scans folder gtest_root to generate gtest/gtest-all.cc in output_dir."""

- output_file = file(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')
+ output_file = open(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')
FuseGTestAllCcToFile(gtest_root, output_file)
output_file.close()

@@ -242,7 +241,7 @@
# fuse_gtest_files.py GTEST_ROOT_DIR OUTPUT_DIR
FuseGTest(sys.argv[1], sys.argv[2])
else:
- print __doc__
+ print (__doc__)
sys.exit(1)


31 changes: 18 additions & 13 deletions doc/manuals.jp/admin/build_source.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# ソースからのビルド

Orion Context Broker のリファレンス配布は Debian 11 です。これは、broker を他のディストリビューションに組み込むことができないことを意味しません (実際には可能です)。このセクションでは、他のディストリビューションをビルドする方法についても説明しています。Debian を使用していない人に役立つかもしれません。ただし、"公式にサポートされている" 唯一の手順は Debian 11 用の手順です。他のものは "現状のまま" 提供され、随時時代遅れになる可能性があります。
Orion Context Broker のリファレンス配布は Debian 12 です。これは、broker を他のディストリビューションに組み込むことができないことを意味しません (実際には可能です)。このセクションでは、他のディストリビューションをビルドする方法についても説明しています。Debian を使用していない人に役立つかもしれません。ただし、"公式にサポートされている" 唯一の手順は Debian 12 用の手順です。他のものは "現状のまま" 提供され、随時時代遅れになる可能性があります。

## Debian 11 (正式サポート)
## Debian 12 (正式サポート)

Orion Context Broker は、以下のライブラリをビルドの依存関係として使用します :

* boost: 1.74
* libmicrohttpd: 0.9.76 (ソースから)
* libcurl: 7.74.0
* openssl: 1.1.1n
* libuuid: 2.36.1
* libcurl: 7.88.1
* openssl: 3.0.9
* libuuid: 2.38.1
* libmosquitto: 2.0.15 (ソースから)
* Mongo C driver: 1.24.3 (ソースから)
* rapidjson: 1.1.0 (ソースから)
Expand Down Expand Up @@ -94,38 +94,43 @@ Orion Context Broker には、次の手順に従って実行できる一連の

* ソースから GoogleTest/Mock をインストールします。以前の URL は http://googlemock.googlecode.com/files/gmock-1.5.0.tar.bz2 でしたが、Google は2016年8月下旬にそのパッケージを削除し、機能しなくなりました。

sudo apt-get install python2
wget https://nexus.lab.fiware.org/repository/raw/public/storage/gmock-1.5.0.tar.bz2
tar xfvj gmock-1.5.0.tar.bz2
cd gmock-1.5.0
./configure
sed -i 's/env python/env python2/' gtest/scripts/fuse_gtest_files.py # little hack to make installation to work on Debian 11
# システム内の fiware-orion リポジトリのローカル・コピーの場所に応じて、次の行の /path/to/fiware-orion を調整します。
patch -p1 gtest/scripts/fuse_gtest_files.py < /path/to/fiware-orion/test/unittests/fuse_gtest_files.py.patch
make
sudo make install # installation puts .h files in /usr/local/include and library in /usr/local/lib
sudo ldconfig # just in case... it doesn't hurt :)

aarch64 アーキテクチャの場合、apt-get を使用して libxslt をインストールし、`--build=arm-linux` オプションを指定して `/configure` を実行します。

* MongoDB をインストールします (テストはローカルホストで実行されている mongod に依存します)。詳細については、[MongoDB の公式ドキュメント](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/)を確認してください。推奨バージョンは 4.4 です (以前のバージョンで動作する可能性がありますが、お勧めしません)。
* MongoDB をインストールします (テストはローカル・ホストで実行されている mongod に依存します)。詳細については、[MongoDB の公式ドキュメント](hhttps://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-debian/) を確認してください。推奨バージョンは 4.4 です (以前のバージョンでも動作する可能性がありますが、お勧めしません)。
* mongo レガシー・シェル (`mongo` コマンド) は MongoDB 5 で非推奨となり、MongoDB 6 では新しいシェル (`mongosh` コマンド) が優先されて削除されたことに注意してください。一部の機能テスト (ftest) は、`mongosh` ではなく `mongo` を使用しているため、MongoDB 6 以降を使用している場合、これが原因で失敗します。
* Debian 12 は libssl3 に移行しましたが、一部の MongoDB バージョンでは libssl1 が必要な場合があります。`Depends: libssl1.1 (>= 1.1.1) but it is not installable` エラーが発生した場合は、次のことをテストできます ([こちら](https://askubuntu.com/a/1421959) を参照))

wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb
rm libssl1.1_1.1.1f-1ubuntu2_amd64.deb # optional, for cleanness

* ユニット・テストを実行します

make unit_test

* 機能テストと valgrind テストに必要な追加のツールをインストールします:

sudo apt-get install curl nc valgrind bc python3 python3-pip
sudo pip3 install virtualenv
sudo apt-get install curl netcat-traditional valgrind bc python3 python3-pip mosquitto

* テスト・ハーネスのための環境を準備します。基本的には、`accumulator-server.py` スクリプトをコントロールの下にあるパスにインストールしなければならず、`~/bin` が推奨です。また、`/usr/bin` のようなシステム・ディレクトリにインストールすることもできますが、他のプログラムと衝突する可能性がありますので、お勧めしません。さらに、ハーネス・スクリプト (`scripts/testEnv.sh` ファイル参照) で使用されるいくつかの環境変数を設定し、必要な Python パッケージを使用して virtualenv 環境を作成します。

mkdir ~/bin
export PATH=~/bin:$PATH
make install_scripts INSTALL_DIR=~
. scripts/testEnv.sh
virtualenv /opt/ft_env --python=/usr/bin/python3
python3 -m venv /opt/ft_env # or 'virtualenv /opt/ft_env --python=/usr/bin/python3' in some systems
. /opt/ft_env/bin/activate
pip install Flask==2.0.2 paho-mqtt==1.6.1 amqtt==0.10.1
pip install Flask==2.0.2 paho-mqtt==1.6.1 amqtt==0.11.0b1

* この環境でテスト・ハーネスを実行してください (時間がかかりますので、気をつけてください)

Expand All @@ -139,7 +144,7 @@ aarch64 アーキテクチャの場合、apt-get を使用して libxslt をイ

* lcov ツールをインストールします

sudo apt-get install lcov
sudo apt-get install lcov xsltproc

* まず、unit_test と functional_test の成功パスを実行して、すべてが正常であることを確認します (上記参照)

Expand Down
4 changes: 2 additions & 2 deletions doc/manuals.jp/admin/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ Docker hub で公式の Orion docker コンテナを使用してインストー

必要なソースから ビルドした Orion をインストールする場合:

* オペレーティングシステム: Debian。リファレンス・オペレーティングシステムは Debian 11.6 ですが、それ以降の
Debian 11 バージョンでも動作するはずです
* オペレーティングシステム: Debian。リファレンス・オペレーティングシステムは Debian 12.1 ですが、それ以降の
Debian 12 バージョンでも動作するはずです
* データベース: MongoDB は、Orion Context Broker がインストールされるのと同じホストで実行するか、ネットワーク経由で
アクセスできる別のホストで実行する必要があります。推奨される MongoDB バージョンは 4.4 です (Orion は古いバージョンで
動作する可能性がありますが、まったくお勧めしません!)
Expand Down
24 changes: 9 additions & 15 deletions doc/manuals.jp/devel/cookbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,19 +193,17 @@ Orion の機能テストは、`.test` のサフィックスを持つ、テキス
2. NAME セクション
3. SHELL-INIT セクション
4. SHELL セクション
5. EXPECT/REGEXPECT セクション
5. REGEXPECT セクション
6. TEARDOWN セクション

各セクション (ファイルの先頭から始まる著作権プリアンブルを除く) には、すべてのセクションが開始/終了する機能テスト・ハーネスを示すヘッダが必要です :

* `--NAME--`
* `--SHELL-INIT--`
* `--SHELL--`
* `--REGEXPECT--` / `--EXPECT--`
* `--REGEXPECT--`
* `--TEARDOWN--`

`--REGEXPECT--` が使用されていて、 `--EXPECT--` でなければ、期待されるセクションは正規表現を許可します。これは、これら2つの間で唯一異なるものです。

### 著作権のセクション
このセクションは単に著作権のヘッダです。古いものをコピーしてください。必要に応じて、年を変更することを忘れないでください。

Expand Down Expand Up @@ -278,7 +276,7 @@ echo "0x. description of test step 0x"
echo "==============================="
```

これらのステップは、現在のステップを出力の次のものから分離するために、`echo` を2回呼び出すことで終了します。 これは非常に重要なことです。出力を読むのがずっと**簡単**です。それは、**EXPECT/REGEXPECT** セクションに続くセクションに一致する必要があります。
これらのステップは、現在のステップを出力の次のものから分離するために、`echo` を2回呼び出すことで終了します。 これは非常に重要なことです。出力を読むのがずっと**簡単**です。それは、**REGEXPECT** セクションに続くセクションに一致する必要があります。

エンティティの作成などの典型的なステップは次のようになります :

Expand All @@ -303,22 +301,16 @@ echo
echo
```

### EXPECT/REGEXPECT セクション
### REGEXPECT セクション
まず、テストハーネス (`test/functionalTest/testHarness.sh`) は、2つのタイプの 'expect sections' を認めます。いずれか :

```
--EXPECT--
```

または

```
--REG-EXPECT--
--REGEXPECT--
```

**1つを選ぶ**必要があります。ほとんど**すべて**の現在の functests が、この `--REG-EXPECT--` タイプを使用します。 --REG-EXPECT-- の利点は、正規表現を `REGEX()` 構文を使用して追加できることです。これは日付の比較や Orion によって作成され、レジストレーション id や 相関器 (correlator)、単純なタイムスタンプのような、レスポンスで返された IDs の比較にとって非常に重要です。重要な制限は、REG-EXPECT セクションには、1行に **REGEX** が1つしかないということです。
正規表現を `REGEX()` 構文を使用して追加できることです。これは日付の比較や Orion によって作成され、レジストレーション id や 相関器 (correlator)、単純なタイムスタンプのような、レスポンスで返された IDs の比較にとって非常に重要です。重要な制限は、REGEXPECT セクションには、1行に **REGEX** が1つしかないということです。

つまり、REG-EXPECT セクションでは、問題のテスト・ステップからの予想される出力を追加します。たとえば、SHELL セクションについての上記のサブ・チャプターの例 "01. Create entity E1 with attribute A1" は、
つまり、問題のテスト・ステップからの予想される出力を追加します。たとえば、SHELL セクションについての上記のサブ・チャプターの例 "01. Create entity E1 with attribute A1" は、
この対応する部分を --REGEXPECT-- セクションに置いてください :

```
Expand All @@ -341,6 +333,8 @@ Date: REGEX(.*)
* 相関器 (correlator) は36文字の文字列で、ハイフンを含む16進数です。この正規表現は、各ハイフンがどこに来なければならないかを正確に知るようになりましたが、実際には必要ではありません
* `Date` HTTP ヘッダの2番目の REGEX もより詳細に記述できます。また必要ありません

REGEXPECT セクションにはコメントを含めることができます。`--REGEXPECT--` セクション内の `##` で始まる行は無視されます。

### TEARDOWN セクション
ここでプロセスが強制終了され、データベースが削除されるため、次のテスト・ケースがクリーン・スレートで開始されます。最も一般的なコマンドは次のとおりです :

Expand Down
Loading

0 comments on commit 7b6275b

Please sign in to comment.