<p>dexter <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/9947">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  dexter: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">tests: add test program to verify pysim-prog.py (and pysim-read.py)<br><br>Pysim now supports quite a number of different cards. Estimating<br>if changes in pysim introce regressions becomes increasingly difficult<br><br>The script that is added with this patch is intended to run as<br>atomated testsuit on real cards attached to a test system. However,<br>it can also be used by developers locally to check for regressions.<br><br>Change-Id: I8c6f95998272333bc757b34e3ab6be004e8cd674<br>Related: OS#3376<br>---<br>A tests/fakemagicsim.data.example<br>A tests/pysim-test.sh<br>A tests/sysmoUSIM-SJS1.data.example<br>3 files changed, 234 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/fakemagicsim.data.example b/tests/fakemagicsim.data.example</span><br><span>new file mode 100644</span><br><span>index 0000000..deab2f7</span><br><span>--- /dev/null</span><br><span>+++ b/tests/fakemagicsim.data.example</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+MCC=001</span><br><span style="color: hsl(120, 100%, 40%);">+MNC=01</span><br><span style="color: hsl(120, 100%, 40%);">+ICCID=1122334455667788990</span><br><span style="color: hsl(120, 100%, 40%);">+KI=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</span><br><span style="color: hsl(120, 100%, 40%);">+OPC=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</span><br><span style="color: hsl(120, 100%, 40%);">+IMSI=001010000000102</span><br><span>\ No newline at end of file</span><br><span>diff --git a/tests/pysim-test.sh b/tests/pysim-test.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..5af7a93</span><br><span>--- /dev/null</span><br><span>+++ b/tests/pysim-test.sh</span><br><span>@@ -0,0 +1,221 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/bash</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Utility to verify the functionality of pysim-prog.py</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2018 by Sysmocom s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+# All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Author: Philipp Maier</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+# the Free Software Foundation, either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+# (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+PYSIM_PROG=../pySim-prog.py</span><br><span style="color: hsl(120, 100%, 40%);">+PYSIM_READ=../pySim-read.py</span><br><span style="color: hsl(120, 100%, 40%);">+TEMPFILE=temp.tmp</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+set -e</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+echo "pysim-test - a test program to test pysim-prog.py"</span><br><span style="color: hsl(120, 100%, 40%);">+echo "================================================="</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Generate a list of the cards we expect to see by checking which .ok files</span><br><span style="color: hsl(120, 100%, 40%);">+# are present</span><br><span style="color: hsl(120, 100%, 40%);">+function gen_card_list {</span><br><span style="color: hsl(120, 100%, 40%);">+    N_CARDS=0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "Expecting to see the following cards:"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for I in *.data ; do</span><br><span style="color: hsl(120, 100%, 40%);">+   CARD_NAMES[$N_CARDS]=${I%.*}</span><br><span style="color: hsl(120, 100%, 40%);">+  CARD_SEEN[$N_CARDS]=0</span><br><span style="color: hsl(120, 100%, 40%);">+ N_CARDS=$((N_CARDS+1))</span><br><span style="color: hsl(120, 100%, 40%);">+    done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for I in $(seq 0 $((N_CARDS-1))); do</span><br><span style="color: hsl(120, 100%, 40%);">+  echo ${CARD_NAMES[$I]}</span><br><span style="color: hsl(120, 100%, 40%);">+    done</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Increment counter in card list for a specified card name (type)</span><br><span style="color: hsl(120, 100%, 40%);">+function inc_card_list {</span><br><span style="color: hsl(120, 100%, 40%);">+    CARD_NAME=$1</span><br><span style="color: hsl(120, 100%, 40%);">+    for I in $(seq 0 $((N_CARDS-1))); do</span><br><span style="color: hsl(120, 100%, 40%);">+        if [ $CARD_NAME = ${CARD_NAMES[$I]} ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+       CARD_SEEN[$I]=$((${CARD_NAMES[$I]}+1))</span><br><span style="color: hsl(120, 100%, 40%);">+    fi</span><br><span style="color: hsl(120, 100%, 40%);">+    done</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Check the card list, each card must be seen exactly one times</span><br><span style="color: hsl(120, 100%, 40%);">+function check_card_list {</span><br><span style="color: hsl(120, 100%, 40%);">+    for I in $(seq 0 $((N_CARDS-1))); do</span><br><span style="color: hsl(120, 100%, 40%);">+      if [ ${CARD_SEEN[$I]} -ne 1 ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+       echo "Error: Card ${CARD_NAMES[$I]} seen ${CARD_SEEN[$I]} times!"</span><br><span style="color: hsl(120, 100%, 40%);">+           exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+    fi</span><br><span style="color: hsl(120, 100%, 40%);">+    done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "All cards seen -- everything ok!"</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Verify the contents of a card by reading them and then diffing against the</span><br><span style="color: hsl(120, 100%, 40%);">+# previously created .ok file</span><br><span style="color: hsl(120, 100%, 40%);">+function check_card {</span><br><span style="color: hsl(120, 100%, 40%);">+    TERMINAL=$1</span><br><span style="color: hsl(120, 100%, 40%);">+    CARD_NAME=$2</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "Verifying card ..."</span><br><span style="color: hsl(120, 100%, 40%);">+    stat ./$CARD_NAME.ok > /dev/null</span><br><span style="color: hsl(120, 100%, 40%);">+    python $PYSIM_READ -p $TERMINAL > $TEMPFILE</span><br><span style="color: hsl(120, 100%, 40%);">+    set +e</span><br><span style="color: hsl(120, 100%, 40%);">+    CARD_DIFF=$(diff $TEMPFILE ./$CARD_NAME.ok)</span><br><span style="color: hsl(120, 100%, 40%);">+    set -e</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if [ "$CARD_DIFF" != "" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+   echo "Card contents do not match the test data:"</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "Expected: $CARD_NAME.ok"</span><br><span style="color: hsl(120, 100%, 40%);">+      echo "------------8<------------"</span><br><span style="color: hsl(120, 100%, 40%);">+        cat "$CARD_NAME.ok"</span><br><span style="color: hsl(120, 100%, 40%);">+ echo "------------8<------------"</span><br><span style="color: hsl(120, 100%, 40%);">+        echo "Got:"</span><br><span style="color: hsl(120, 100%, 40%);">+ echo "------------8<------------"</span><br><span style="color: hsl(120, 100%, 40%);">+        cat $TEMPFILE</span><br><span style="color: hsl(120, 100%, 40%);">+ echo "------------8<------------"</span><br><span style="color: hsl(120, 100%, 40%);">+        exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+    fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    inc_card_list $CARD_NAME</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "Card contents match the test data -- success!"</span><br><span style="color: hsl(120, 100%, 40%);">+    rm $TEMPFILE</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Read out the card using pysim-read and store the result as .ok file. This</span><br><span style="color: hsl(120, 100%, 40%);">+# data will be used later in order to verify the results of our write tests.</span><br><span style="color: hsl(120, 100%, 40%);">+function gen_ok_file {</span><br><span style="color: hsl(120, 100%, 40%);">+    TERMINAL=$1</span><br><span style="color: hsl(120, 100%, 40%);">+    CARD_NAME=$2</span><br><span style="color: hsl(120, 100%, 40%);">+    python $PYSIM_READ -p $TERMINAL > "$CARD_NAME.ok"</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "Generated file: $CARD_NAME.ok"</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "------------8<------------"</span><br><span style="color: hsl(120, 100%, 40%);">+    cat "$CARD_NAME.ok"</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "------------8<------------"</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Find out the type (card name) of the card that is installed in the specified</span><br><span style="color: hsl(120, 100%, 40%);">+# reader</span><br><span style="color: hsl(120, 100%, 40%);">+function probe_card {</span><br><span style="color: hsl(120, 100%, 40%);">+    TERMINAL=$1</span><br><span style="color: hsl(120, 100%, 40%);">+    RESULT=$(timeout 5 $PYSIM_PROG -p $TERMINAL -T | cut -d ":" -f 2 | tail -n 1 | xargs)</span><br><span style="color: hsl(120, 100%, 40%);">+    echo $RESULT</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Read out all cards and store the results as .ok files</span><br><span style="color: hsl(120, 100%, 40%);">+function gen_ok_files {</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "== OK FILE GENERATION =="</span><br><span style="color: hsl(120, 100%, 40%);">+    for I in $(seq 0 $((N_TERMINALS-1))); do</span><br><span style="color: hsl(120, 100%, 40%);">+        echo "Probing card in terminal #$I"</span><br><span style="color: hsl(120, 100%, 40%);">+ CARD_NAME=$(probe_card $I)</span><br><span style="color: hsl(120, 100%, 40%);">+    if [ -z "$CARD_NAME" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+            echo "Error: Unresponsive card!"</span><br><span style="color: hsl(120, 100%, 40%);">+            exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+    fi</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "Card is of type: $CARD_NAME"</span><br><span style="color: hsl(120, 100%, 40%);">+  gen_ok_file $I $CARD_NAME</span><br><span style="color: hsl(120, 100%, 40%);">+    done</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Execute tests. Each card is programmed and the contents are checked</span><br><span style="color: hsl(120, 100%, 40%);">+# afterwards.</span><br><span style="color: hsl(120, 100%, 40%);">+function run_test {</span><br><span style="color: hsl(120, 100%, 40%);">+    for I in $(seq 0 $((N_TERMINALS-1))); do</span><br><span style="color: hsl(120, 100%, 40%);">+     echo "== EXECUTING TEST =="</span><br><span style="color: hsl(120, 100%, 40%);">+ echo "Probing card in terminal #$I"</span><br><span style="color: hsl(120, 100%, 40%);">+ CARD_NAME=$(probe_card $I)</span><br><span style="color: hsl(120, 100%, 40%);">+    if [ -z "$CARD_NAME" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+            echo "Error: Unresponsive card!"</span><br><span style="color: hsl(120, 100%, 40%);">+            exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+    fi</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "Card is of type: $CARD_NAME"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Make sure some default data is set</span><br><span style="color: hsl(120, 100%, 40%);">+  MCC=001</span><br><span style="color: hsl(120, 100%, 40%);">+       MNC=01</span><br><span style="color: hsl(120, 100%, 40%);">+        ICCID=1122334455667788990</span><br><span style="color: hsl(120, 100%, 40%);">+     KI=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</span><br><span style="color: hsl(120, 100%, 40%);">+   OPC=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</span><br><span style="color: hsl(120, 100%, 40%);">+  IMSI=001010000000001</span><br><span style="color: hsl(120, 100%, 40%);">+  ADM=00000000</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        . "$CARD_NAME.data"</span><br><span style="color: hsl(120, 100%, 40%);">+ python $PYSIM_PROG -p $I -t $CARD_NAME -o $OPC -k $KI -x $MCC -y $MNC -i $IMSI -s $ICCID -a $ADM</span><br><span style="color: hsl(120, 100%, 40%);">+      check_card $I $CARD_NAME</span><br><span style="color: hsl(120, 100%, 40%);">+      echo ""</span><br><span style="color: hsl(120, 100%, 40%);">+    done</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function usage {</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "Options:"</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "-n: number of card terminals"</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "-o: generate .ok files"</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Make sure that the pathes to the python scripts always work, regardless from</span><br><span style="color: hsl(120, 100%, 40%);">+# where the script is called.</span><br><span style="color: hsl(120, 100%, 40%);">+CURDIR=$PWD</span><br><span style="color: hsl(120, 100%, 40%);">+SCRIPTDIR=$(dirname $0)</span><br><span style="color: hsl(120, 100%, 40%);">+cd $SCRIPTDIR</span><br><span style="color: hsl(120, 100%, 40%);">+PYSIM_PROG=$(realpath $PYSIM_PROG)</span><br><span style="color: hsl(120, 100%, 40%);">+PYSIM_READ=$(realpath $PYSIM_READ)</span><br><span style="color: hsl(120, 100%, 40%);">+cd $CURDIR</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OPT_N_TERMINALS=0</span><br><span style="color: hsl(120, 100%, 40%);">+OPT_GEN_OK_FILES=0</span><br><span style="color: hsl(120, 100%, 40%);">+while getopts ":hon:" OPT; do</span><br><span style="color: hsl(120, 100%, 40%);">+  case $OPT in</span><br><span style="color: hsl(120, 100%, 40%);">+      h)</span><br><span style="color: hsl(120, 100%, 40%);">+      usage</span><br><span style="color: hsl(120, 100%, 40%);">+         exit 0</span><br><span style="color: hsl(120, 100%, 40%);">+        ;;</span><br><span style="color: hsl(120, 100%, 40%);">+      o)</span><br><span style="color: hsl(120, 100%, 40%);">+          OPT_GEN_OK_FILES=1</span><br><span style="color: hsl(120, 100%, 40%);">+    ;;</span><br><span style="color: hsl(120, 100%, 40%);">+      n)</span><br><span style="color: hsl(120, 100%, 40%);">+          OPT_N_TERMINALS=$OPTARG</span><br><span style="color: hsl(120, 100%, 40%);">+       ;;</span><br><span style="color: hsl(120, 100%, 40%);">+      \?)</span><br><span style="color: hsl(120, 100%, 40%);">+         echo "Invalid option: -$OPTARG" >&2</span><br><span style="color: hsl(120, 100%, 40%);">+          exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+      ;;</span><br><span style="color: hsl(120, 100%, 40%);">+  esac</span><br><span style="color: hsl(120, 100%, 40%);">+done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+N_TERMINALS=$OPT_N_TERMINALS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Generate a list of available cards, if no explicit reader number is given</span><br><span style="color: hsl(120, 100%, 40%);">+# then the number of cards will be used as reader number.</span><br><span style="color: hsl(120, 100%, 40%);">+gen_card_list</span><br><span style="color: hsl(120, 100%, 40%);">+if [ $N_TERMINALS -eq 0 ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+    N_TERMINALS=$N_CARDS</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+echo "Number of card terminals installed: $N_TERMINALS"</span><br><span style="color: hsl(120, 100%, 40%);">+echo ""</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if [ $OPT_GEN_OK_FILES -eq 1 ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+    gen_ok_files</span><br><span style="color: hsl(120, 100%, 40%);">+    exit 0</span><br><span style="color: hsl(120, 100%, 40%);">+else</span><br><span style="color: hsl(120, 100%, 40%);">+    run_test</span><br><span style="color: hsl(120, 100%, 40%);">+    check_card_list</span><br><span style="color: hsl(120, 100%, 40%);">+    exit 0</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span>diff --git a/tests/sysmoUSIM-SJS1.data.example b/tests/sysmoUSIM-SJS1.data.example</span><br><span>new file mode 100644</span><br><span>index 0000000..d711dcb</span><br><span>--- /dev/null</span><br><span>+++ b/tests/sysmoUSIM-SJS1.data.example</span><br><span>@@ -0,0 +1,7 @@</span><br><span style="color: hsl(120, 100%, 40%);">+MCC=001</span><br><span style="color: hsl(120, 100%, 40%);">+MNC=01</span><br><span style="color: hsl(120, 100%, 40%);">+ICCID=1122334455667788990</span><br><span style="color: hsl(120, 100%, 40%);">+KI=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</span><br><span style="color: hsl(120, 100%, 40%);">+OPC=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</span><br><span style="color: hsl(120, 100%, 40%);">+IMSI=001010000000102</span><br><span style="color: hsl(120, 100%, 40%);">+ADM=12345678</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9947">change 9947</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9947"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: pysim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I8c6f95998272333bc757b34e3ab6be004e8cd674 </div>
<div style="display:none"> Gerrit-Change-Number: 9947 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>