ROBOX:Upload robox scripts for IEC release 6 11/4811/18
authorrd-sw <rd-sw@ysemi.cn>
Wed, 27 Apr 2022 13:02:07 +0000 (13:02 +0000)
committerrd-sw <rd-sw@ysemi.cn>
Fri, 29 Apr 2022 11:49:31 +0000 (11:49 +0000)
RT

Signed-off-by: rd-sw <rd-sw@ysemi.cn>
Change-Id: I1695c71cb291273b926370bc9a84528107663ef0

src/use_cases/robox/deploy_robox.sh [new file with mode: 0644]
src/use_cases/robox/load_components.sh [new file with mode: 0644]
src/use_cases/robox/loadimages.sh [new file with mode: 0644]
src/use_cases/robox/setupenv/arm64_env_setup.sh [new file with mode: 0644]
src/use_cases/robox/setupenv/build_android.sh [new file with mode: 0755]
src/use_cases/robox/setupenv/xorg.conf [new file with mode: 0644]
src/use_cases/robox/sm_ctrl.sh [new file with mode: 0755]
src/use_cases/robox/test_config/ys_perf_exporter.yml [new file with mode: 0755]
src/use_cases/robox/test_config/ys_prometheus.yml [new file with mode: 0755]

diff --git a/src/use_cases/robox/deploy_robox.sh b/src/use_cases/robox/deploy_robox.sh
new file mode 100644 (file)
index 0000000..e46e194
--- /dev/null
@@ -0,0 +1,154 @@
+#!/bin/bash
+
+INSTANCE_NUM=4
+ROBOX_TEMPLATE_YAML=$(cat <<EOF
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: anbox
+spec:
+  selector:
+    matchLabels:
+      app: android
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: android
+    spec:
+      containers:
+      - name: android
+        image: android:robox
+        resources:
+          requests:
+            cpu: 1
+            memory: 1024Mi
+          limits:
+            cpu: 4
+            memory: 4096Mi
+        env:
+        - name: ANDROID_NAME
+          value: "xbox"
+        - name: PATH
+          value: "/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin"
+        - name: ANDROID_ROOT
+          value: "/"
+        - name: ANDROID_DATA
+          value: "/data"
+        - name: DOWNLOAD_CACHE
+          value: "/data/cache"
+        - name: LOGNAME
+          value: "shell"
+        - name: HOME
+          value: "/"
+        - name: TERM
+          value: "screen-256color"
+        - name: SHELL
+          value: "/system/bin/sh"
+        - name: ANDROID_BOOTLOGO
+          value: "1"
+        - name: TMPDIR
+          value: "/data/local/tmp"
+        - name: ANDROID_ASSETS
+          value: "/system/app"
+        - name: BOOTCLASSPATH
+          value: "/system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/apache-xml.jar:/system/framework/org.apache.http.legacy.boot.jar"
+        - name: ASEC_MOUNTPOINT
+          value: "/mnt/asec"
+        - name: ANDROID_SOCKET_adbd
+          value: "7"
+        - name: HOSTNAME
+          value: "arm64"
+        - name: EXTERNAL_STORAGE
+          value: "/sdcard"
+        - name: ANDROID_STORAGE
+          value: "/storage"
+        - name: USER
+          value: "shell"
+        - name: SYSTEMSERVERCLASSPATH
+          value: "/system/framework/services.jar:/system/framework/ethernet-service.jar:/system/framework/wifi-service.jar"
+        imagePullPolicy: Never
+        command: ["/system/bin/sh", "-ce", "/anbox-init.sh"]
+        ports:
+        - containerPort: 5555
+        securityContext:
+          privileged: true
+          #capabilities:
+          #  add: [ "SYS_ADMIN", "NET_ADMIN", "SYS_MODULE", "SYS_NICE", "SYS_TIME", "SYS_TTY_CONFIG", "NET_BROADCAST", "IPC_LOCK", "SYS_RESOURCE" ]
+        volumeMounts:
+        - mountPath: /dev/binder:rw
+          name: volume-binder
+        - mountPath: /dev/ashmem:rw
+          name: volume-ashmem
+        - mountPath: /dev/fuse:rw
+          name: volume-fuse
+        - mountPath: /dev/qemu_pipe
+          name: volume-qemupipe
+        - mountPath: /dev/anbox_audio:rw
+          name: volume-anboxaudio
+        - mountPath: /dev/anbox_bridge:rw
+          name: volume-anboxbridge
+        - mountPath: /dev/input/event0:rw
+          name: volume-event0
+        - mountPath: /dev/input/event1:rw
+          name: volume-event1
+        - mountPath: /cache:rw
+          name: volume-cache
+        - mountPath: /data:rw
+          name: volume-data
+      volumes:
+      - name: volume-binder
+        hostPath:
+          path: /dev/binder${INSTANCE_NUM}
+      - name: volume-ashmem
+        hostPath:
+          path: /dev/ashmem
+      - name: volume-fuse
+        hostPath:
+          path: /dev/fuse
+      - name: volume-qemupipe
+        hostPath:
+          path: /run/user/1000/anbox/${INSTANCE_NUM}/sockets/qemu_pipe
+      - name: volume-anboxaudio
+        hostPath:
+          path: /run/user/1000/anbox/${INSTANCE_NUM}/sockets/anbox_audio
+      - name: volume-anboxbridge
+        hostPath:
+          path: /run/user/1000/anbox/${INSTANCE_NUM}/sockets/anbox_bridge
+      - name: volume-event0
+        hostPath:
+          path: /run/user/1000/anbox/${INSTANCE_NUM}/input/event0
+      - name: volume-event1
+        hostPath:
+          path: /run/user/1000/anbox/${INSTANCE_NUM}/input/event1
+      - name: volume-cache
+        hostPath:
+          path: /home/robox/anbox-data/${INSTANCE_NUM}/cache
+      - name: volume-data
+        hostPath:
+          path: /home/robox/anbox-data/${INSTANCE_NUM}/data
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: anbox
+spec:
+  selector:
+    app: android
+  ports:
+  - protocol: TCP
+    port: 8888
+    targetPort: 5555
+    nodePort: 31000
+  type: NodePort
+EOF
+)
+
+if [ "$1" = "a" ]; then
+echo "$ROBOX_TEMPLATE_YAML" | kubectl apply -f - > /dev/null
+else
+echo "$ROBOX_TEMPLATE_YAML" | kubectl delete -f - > /dev/null
+fi
+echo $?
+sleep 2
+watch -n 1 kubectl get node,pods,svc -o wide -n kube-system -n default
diff --git a/src/use_cases/robox/load_components.sh b/src/use_cases/robox/load_components.sh
new file mode 100644 (file)
index 0000000..dcd1e8b
--- /dev/null
@@ -0,0 +1,77 @@
+#!/bin/bash
+
+ROBOX_DIR=/usr/share/local/robox
+function download_and_install()
+{
+    if [ ! -e ${ROBOX_DIR}/$1 ]; then
+        sudo wget -p ${ROBOX_DIR} https://github.com/ysemi-computing/RoboxWidget/blob/main/components/$1
+    fi
+    sudo cp ${ROBOX_DIR}/$1  /usr/bin/
+    sudo chmod -f 777 /usr/bin/$1
+}
+
+if [ "$(arch)" = "x86_64" ]; then
+    echo "components only support on arch arm64"
+    exit
+fi
+
+sudo mkdir -p ${ROBOX_DIR}
+which node_exporter
+if [ $? -ne 0 ]; then
+    echo "node_exporter not found, downloading !!!!"
+    download_and_install node_exporter
+fi
+
+which perf_exporter
+if [ $? -ne 0 ]; then
+    echo "perf_exporter not found, downloading !!!!"
+    download_and_install perf_exporter
+fi
+
+which prometheus
+if [ $? -ne 0 ]; then
+    echo "prometheus not found, downloading !!!!"
+    download_and_install prometheus
+fi
+
+which grafana-server
+if [ $? -ne 0 ]; then
+    echo "grafana not found, downloading !!!!"
+    download_and_install grafana-server
+fi
+
+# update configuration file
+if [ ! -e ${ROBOX_DIR}/ys_perf_exporter ]; then
+    sudo wget -P ${ROBOX_DIR} https://github.com/ysemi-computing/RoboxWidget/blob/main/config/ys_perf_exporter.yml
+fi
+sudo cp -f ${ROBOX_DIR}/ys_perf_exporter /etc/perf_exporter
+
+if [ ! -e ${ROBOX_DIR}/ys_prometheus.yml ]; then
+    sudo wget -P ${ROBOX_DIR} https://github.com/ysemi-computing/RoboxWidget/blob/main/config/ys_prometheus.yml
+fi
+
+# start basic components
+echo "starting node_exporter"
+ps aux | grep -v grep | grep node_exporter
+if [ $? -ne 0 ]; then
+    sudo node_exporter &
+fi
+
+echo "starting perf_exporter"
+ps aux | grep -v grep | grep perf_exporter
+if [ $? -ne 0 ]; then
+    sudo perf_exporter &
+fi
+
+echo "starting prometheus"
+ps aux | grep -v grep | grep prometheus
+if [ $? -ne 0 ]; then
+    sudo prometheus --config.file=${ROBOX_DIR}/ys_prometheus.yml &
+fi
+
+echo "starting grafana-server"
+ps aux | grep -v grep | grep grafana-server
+if [ $? -ne 0 ]; then
+    sudo grafana-server &
+fi
+
diff --git a/src/use_cases/robox/loadimages.sh b/src/use_cases/robox/loadimages.sh
new file mode 100644 (file)
index 0000000..500e0cd
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+IMAGES_DIR=~/images
+IMAGE_MOUNT_DIR=${IMAGES_DIR}/images/android
+mkdir -p ${IMAGES_DIR}/images/android
+
+if [ ! -e /dev/binder1 ]; then
+    echo "try to insmod binder"
+    sudo modprobe ashmem_linux
+    sudo rmmod binder_linux || true; sudo modprobe binder_linux num_devices=254
+    sudo chmod 777 /dev/ashmem /dev/binder*
+else
+    echo "binder already loaded"
+fi
+
+if [[ $(sudo docker images -a | grep robox) ]]; then
+    echo "robox images already loaded"
+else
+    sudo mount ${IMAGES_DIR}/android.img ${IMAGE_MOUNT_DIR}
+    cd ${IMAGE_MOUNT_DIR} || exit
+    sudo tar --numeric-owner -cf- . | sudo docker import - android:robox
+    sleep 1
+    if [[ $(sudo docker images -a | grep robox) ]]; then
+        echo "docker image loads successfully!"
+    fi
+fi
diff --git a/src/use_cases/robox/setupenv/arm64_env_setup.sh b/src/use_cases/robox/setupenv/arm64_env_setup.sh
new file mode 100644 (file)
index 0000000..00eecc9
--- /dev/null
@@ -0,0 +1,176 @@
+#!/bin/bash
+
+set -e
+
+ROBOX_SRC=download/robox
+
+stage1(){
+    echo "Enable source"
+    sudo sed -i "s/^# deb-src/ deb-src/g" /etc/apt/sources.list
+    echo "update"
+    sudo apt update
+
+    echo "Install dependency"
+    sudo apt install -y dpkg libncurses5-dev libncursesw5-dev libssl-dev cmake cmake-data debhelper dbus google-mock libboost-dev libboost-filesystem-dev libboost-log-dev libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-test-dev libboost-thread-dev libcap-dev libsystemd-dev libdbus-1-dev libegl1-mesa-dev  libgles2-mesa-dev libglib2.0-dev libglm-dev libgtest-dev liblxc1 libproperties-cpp-dev libprotobuf-dev libsdl2-dev libsdl2-image-dev lxc-dev pkg-config protobuf-compiler
+
+#TODO compare "Ubuntu 18.04.1 LTS \n \l" in /etc/issue
+    sudo apt install -y libboost-filesystem1.62.0 libboost-system1.62.0 docker.io dkms libboost-iostreams1.62.0
+
+    sudo apt install -y build-essential
+    sudo apt install -y mesa-common-dev
+
+    echo "install libprocess-cpp3 and libdbus(and dev)"
+    #TODO compare "Ubuntu 18.04.1 LTS \n \l" in /etc/issue
+    wget http://launchpadlibrarian.net/291649807/libprocess-cpp3_3.0.1-0ubuntu5_arm64.deb
+    wget http://launchpadlibrarian.net/291804794/libdbus-cpp5_5.0.0+16.10.20160809-0ubuntu2_arm64.deb
+    wget http://launchpadlibrarian.net/291804785/libdbus-cpp-dev_5.0.0+16.10.20160809-0ubuntu2_arm64.deb
+    sudo dpkg -i libprocess-cpp3_3.0.1-0ubuntu5_arm64.deb
+    sudo dpkg -i libdbus-cpp5_5.0.0+16.10.20160809-0ubuntu2_arm64.deb
+    sudo dpkg -i libdbus-cpp-dev_5.0.0+16.10.20160809-0ubuntu2_arm64.deb
+    rm libprocess-cpp3_3.0.1-0ubuntu5_arm64.deb
+    rm libdbus-cpp5_5.0.0+16.10.20160809-0ubuntu2_arm64.deb
+    rm libdbus-cpp-dev_5.0.0+16.10.20160809-0ubuntu2_arm64.deb
+
+    echo "Check docker storage driver type"
+    STORAGE_DRV=`sudo docker info |grep Storage | sed "s/\ //g" | cut -d : -f 2`
+    if [ "$STORAGE_DRV" == "overlay2" ] || [ "$STORAGE_DRV" == "overlay" ]; then
+       echo "Docker Storage driver ok"
+    else
+       echo "ERROR: docker storage driver should be overlay2"
+       exit
+    fi
+
+    echo install desktop
+    sudo apt install -y xfce4  xfce4-* xrdp
+
+    echo "setup remote desktop"
+    echo "enable remote desktop for current user"
+    echo "xfce4-session" > ~/.xsession
+    echo "enable remote desktop for root"
+    sudo su -c 'echo "xfce4-session" > /root/.xsession'
+    sudo /etc/init.d/xrdp restart
+
+    echo "Install the current latest kernel in ubuntu 18.04.1"
+    #sudo apt install -y linux-generic=4.15.0.163.152
+    echo "Please reboot to continue, or the location of kernel module might be wrong!"
+    exit
+}
+
+stage2() {
+    echo "Install kernel source"
+    sudo apt install linux-source-4.15.0
+
+    echo "downloading robox"
+    if [ -d "$ROBOX_SRC" ]; then
+       pushd $ROBOX_SRC
+       COMMIT=`git log --oneline -n1  e74a3c6cb1be683d31f742b2c8344d0e28577536`
+       if [ "$COMMIT" != "" ]; then
+         echo "robox exist, skip git clone"
+       else
+         cd ..
+         rm -rf robox
+         git clone https://github.com/kunpengcompute/robox.git
+        cd robox
+      fi
+    else
+      mkdir -p download
+      pushd download
+      git clone https://github.com/kunpengcompute/robox.git
+      cd robox
+    fi
+    echo "checkout to tested commit"
+    git checkout -f e74a3c6cb1be683d31f742b2c8344d0e28577536
+    popd
+
+    echo "build anbox module"
+    pushd $ROBOX_SRC/kernel/robox-modules/
+    sudo mkdir -p /etc/modules-load.d/
+    sudo cp -p anbox.conf /etc/modules-load.d/
+    sudo cp -p 99-anbox.rules /lib/udev/rules.d/
+    sudo cp -prT ashmem /usr/src/anbox-ashmem-1
+    sudo cp -prT binder /usr/src/anbox-binder-1
+    sudo dkms install anbox-ashmem/1
+    sudo dkms install anbox-binder/1
+    popd
+
+    echo "Install ashmem and binder modules"
+    sudo modprobe ashmem_linux
+    sudo rmmod binder_linux || true; sudo modprobe binder_linux num_devices=254
+    echo "check if module insert correctly"
+    lsmod|grep -e ashmem_linux -e binder_linux
+    sudo chmod 777 /dev/ashmem /dev/binder*
+    echo "Press any key to continue"
+    read
+
+    echo "build robox"
+    mkdir -p download/robox/build
+    pushd download/robox/build
+    cmake ..
+    echo "TODO: make it to idempotent"
+    sudo sed -i "s/^\#ifndef GLM_ENABLE_EXPERIMENTAL/\#define GLM_ENABLE_EXPERIMENTAL\n\#ifndef GLM_ENABLE_EXPERIMENTAL/g" /usr/include/glm/gtx/transform.hpp
+    make -j5
+    sudo make install
+    popd
+
+    echo "Enable graphics"
+    sudo apt install -y xfce4 mesa-utils x11vnc vainfo
+
+    echo "STEP: Installation mesa. mesa is a OpenGL library"
+    echo "### Clone mesa ###"
+    mkdir -p sources
+    pushd sources
+    if [ ! -d mesa ]; then
+       sudo apt-get install -y apt-transport-https ca-certificates
+       sudo update-ca-certificates
+       git clone https://anongit.freedesktop.org/git/mesa/mesa.git
+    fi
+    cd mesa
+    git checkout -f mesa-19.0.8
+
+    echo "### Build mesa ###"
+    sudo apt build-dep -y mesa
+    sudo apt install -y libomxil-bellagio-dev libva-dev  llvm-7  llvm-7-dev python-mako
+    ./autogen.sh  --enable-texture-float --with-gallium-drivers=radeonsi,swrast --with-dri-drivers=radeon,swrast --with-platforms=drm,x11 --enable-glx-tls --enable-shared-glapi --enable-dri3 --enable-lmsensors  --enable-gbm --enable-xa --enable-osmesa  --enable-vdpau --enable-nine --enable-omx-bellagio --enable-va --with-llvm-prefix=/usr/lib/llvm-7 --enable-llvm --target=aarch64-linux-gnu CFLAGS="-fsigned-char -O2" CPPFLAGS="-fsigned-char -O2" CXXFLAGS="-fsigned-char -O2" --enable-autotools
+    make -j5 && sudo make install
+    echo "TODO: make it to idempotent"
+    sudo sed -i "s/^/\/usr\/local\/lib\n/g" /etc/ld.so.conf
+    sudo ldconfig
+    popd
+}
+
+setup_android_image() {
+    echo "Downloading Android image"
+    ANDROID_IMG=android.img
+    ANDROID_MD5=`md5sum $ANDROID_IMG | cut -d \  -f 1`
+    if [ "$ANDROID_MD5" = "fc44fce9ddfcdca737200468bcb5615e" ]; then
+       echo "Huawei Android image already exist, skip download"
+    elif [ -f images/android.img ]; then
+       echo "Another Android image exist, skip download"
+       ANDROID_IMG=android.img
+    else
+       mkdir -p images
+       wget https://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/native/android.img -o images/android.img
+       echo "Downloaded"
+    fi
+
+    mkdir -p images/android
+    sudo mount images/$ANDROID_IMG images/android
+    pushd images/android
+    sudo tar --numeric-owner -cf - . | sudo docker import - android:robox
+    popd
+    sudo umount images/android
+}
+
+configure_gpu(){
+    sudo cp -p script/xorg.conf /etc/X11
+    IDS=`lspci |grep "AMD.*7100" | cut -d \  -f 1 | sed "s/[:.]/ /g"`
+    BUSID= ;for id in $IDS; do BUSID+=`echo -n "$((16#$id)) "`; done
+    BUSID=`echo $BUSID | sed "s/ /:/g" | sed "s/ $//g"`
+    sudo sed -i "s/BusID \"pci:.*:.*:.*\"\ *$/BusID \"pci:$BUSID\"/g" /etc/X11/xorg.conf
+}
+
+echo "SHOULD Allow apt installer restart service without prompt"
+stage1
+stage2
+setup_android_image
+configure_gpu
diff --git a/src/use_cases/robox/setupenv/build_android.sh b/src/use_cases/robox/setupenv/build_android.sh
new file mode 100755 (executable)
index 0000000..6d03b37
--- /dev/null
@@ -0,0 +1,115 @@
+#!/bin/bash
+set -e
+
+ANDROID=anbox-work
+ROBOX=robox
+EXAGEAR=$ROBOX/Exagear
+
+echo "please set git user and email. e.g."
+echo git config --global user.email "you@example.com"
+echo git config --global user.name "Your Name"
+echo "make use both termial and git could accesss google.com, press enter to continue"
+read
+
+#if [ 0 -gt 1 ]; then
+echo "prepare environment"
+sudo sed -i "s/# deb-src/ deb-src/g" /etc/apt/sources.list
+sudo apt update
+sudo apt install -y openjdk-8-jdk
+sudo apt install -y libx11-dev libreadline6-dev libgl1-mesa-dev g++-multilib
+sudo apt install -y git flex bison gperf build-essential libncurses5-dev
+sudo apt install -y tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev
+sudo apt install -y dpkg-dev libsdl1.2-dev
+sudo apt install -y git-core gnupg flex bison gperf build-essential
+sudo apt install -y zip curl zlib1g-dev gcc-multilib g++-multilib
+sudo apt install -y libc6-dev
+sudo apt install -y lib32ncurses5-dev x11proto-core-dev libx11-dev
+sudo apt install -y libgl1-mesa-dev libxml2-utils xsltproc unzip m4
+sudo apt install -y lib32z-dev ccache
+sudo apt install -y bc python flex bison gperf libsdl-dev build-essential zip curl
+
+if [ ! -d robox ]; then
+    echo "clone robox"
+    git clone https://github.com/kunpengcompute/robox.git
+else
+    echo "robox directory exist, skip, clone robox"
+fi
+
+echo "try to clone Android"
+if [ ! -x /usr/bin/repo ]; then
+    sudo apt install -y repo
+    #do not use the official repo because it it too new.
+    #if [ ! -x ~/bin/repo ]; then
+    #echo "get repo"
+    #mkdir ~/bin
+    #PATH=~/bin:$PATH
+    #curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
+    #chmod a+x ~/bin/repo
+    #echo "replace with python3"
+    #sed -i "s/#\!\/usr\/bin\/env python$/#\!\/usr\/bin\/env python3/g" ~/bin/repo
+else
+    echo "repo exist, skip"
+fi
+
+if [ ! -d anbox-work ]; then
+    echo "clone anbox android code"
+    mkdir -p anbox-work
+    cd anbox-work
+    repo init -u https://github.com/anbox/platform_manifests.git -b anbox
+    # total disk size is about 160G
+    repo sync -j16
+    echo "fallback the code"
+    cp -p robox/binaryFiles/snapshot20191206.xml anbox-work/.repo/manifests/
+    cd anbox-work
+    repo init -m snapshot20191206.xml
+    repo sync --force-sync frameworks/opt/net/wifi
+    repo sync -d -j16
+    cd -
+else
+    echo "anbox-work exist, skip to clone anbox android code"
+    echo "fallback the code locally"
+    cp -p robox/binaryFiles/snapshot20191206.xml anbox-work/.repo/manifests/
+    cd anbox-work
+    repo init -m snapshot20191206.xml
+    repo sync --force-sync frameworks/opt/net/wifi
+    repo sync -d -j16 --local-only
+    cd -
+fi
+
+echo "replace anbox code"
+rm -rf $ANDROID/vendor/anbox
+cp -rp $ROBOX $ANDROID/vendor/anbox
+#fi # if [ 0 -gt 1 ]; then
+
+echo "The exagear"
+cp -p $EXAGEAR/android/android-7.1.1_r13.patch $ANDROID
+cp -pr $EXAGEAR/android/vendor $ANDROID
+ls $ANDROID/vendor/
+#
+cp -pr $ROBOX/patch/android-7.1.1_r13-V1.0/* $ANDROID
+status=`cat script/status`
+if [ ! "PATCH_ANDROID_DONE" == $status ]; then
+    echo "Patching Android"
+    cp -pr $ROBOX/patch/patch.sh $ANDROID
+    cd $ANDROID
+    sh patch.sh
+    echo PATCH_ANDROID_DONE > script/status
+    cd -
+else
+    echo "Patch has already finished, skip patch"
+fi
+
+echo "build Android"
+cd $ANDROID
+#setup build environment
+source build/envsetup.sh
+#choose compile env
+lunch anbox_arm64-userdebug
+export JACK_EXTRA_CURL_OPTIONS=-k
+export LC_ALL=C
+make -j16
+
+echo "generate the android.img"
+cd vendor/anbox && ./scripts/create-package.sh $PWD/../../out/target/product/arm64/ramdisk.img $PWD/../../out/target/product/arm64/system.img
+ls -lh android.img
+
diff --git a/src/use_cases/robox/setupenv/xorg.conf b/src/use_cases/robox/setupenv/xorg.conf
new file mode 100644 (file)
index 0000000..b5566ef
--- /dev/null
@@ -0,0 +1,27 @@
+Section "ServerFlags"
+             Option "DontVTSwitch" "on"
+             Option "AutoAddDevices" "off"
+             Option "AutoEnableDevices" "off"
+             Option "AutoAddGPU" "off"
+             Option "AutoBindGPU" "off"
+EndSection
+Section "Device"
+             Identifier "AMD"
+             Driver "amdgpu"
+             BusID "pci:01:00:00"
+EndSection
+Section "Monitor"
+             Identifier "monitor0"
+             Modeline "1280x720"   74.50  1280 1344 1472 1664  720 723 728 748 -hsync +vsync
+             Option "enable" "true"
+EndSection
+Section "Screen"
+             Identifier "screen0"
+             Device "AMD"
+             Monitor "monitor0"
+             DefaultDepth 24
+             SubSection "Display"
+                          Depth 24
+                          Modes "1280x720"
+             EndSubSection
+EndSection
diff --git a/src/use_cases/robox/sm_ctrl.sh b/src/use_cases/robox/sm_ctrl.sh
new file mode 100755 (executable)
index 0000000..1559be1
--- /dev/null
@@ -0,0 +1,243 @@
+#!/bin/bash
+
+#PATH=download/robox/build/src:$PATH
+XDG_RUNTIME_DIR=/run/user/$(id -u)
+export XDG_RUNTIME_DIR
+#export DBUS_SESSION_BUS_ADDRESS=/run/user/$(id -u)/bus
+ANBOX="anbox"
+SESSIONMANAGER="$ANBOX session-manager"
+BINDMOUNTDIR=$HOME/anbox-data
+ANBOX_LOG_LEVEL="debug"
+EGL_LOG_LEVEL="debug"
+SESSIONMANAGERPID=""
+instance=0
+instance=""
+FAILED=255
+DISPLAY=:0
+display=""
+
+function warning() {
+    echo -e "\e[01;31m${instancenum}: $* \e[0m"
+}
+
+function out() {
+    if [[ "$QUIET" == "true" ]]; then return; fi
+    echo -e "\e[01;32m${instancenum}: $* \e[0m"
+}
+
+function debug() {
+    if [[ "$DEBUG" != "true" ]]; then return; fi
+    echo -e "\e[01;33m${instancenum}: $* \e[0m"
+}
+
+function check_and_remove_docker()
+{
+    echo "check_and_remove_docker  $instance"
+    sudo docker ps -a | grep $instance$  > /dev/null 2>&1
+    if [[ $? -eq 0 ]]; then
+     #sudo docker stop $instance
+     sudo docker rm -f $instance
+    fi
+    #out "`sudo docker ps -a | grep $instance`"
+}
+
+function start_framebuffer()
+{
+    out "${instancenum}: STARTING Frame Buffer"
+    cmd="sudo Xorg -config /etc/X11/xorg0.conf $display -sharevts"
+
+    # LEE: Might need a sleep here
+    ps aux | grep Xorg | grep "Xorg[[:space:]]*$display " > /dev/null
+    if [ $? -gt 0 ]; then
+        warning "\e[01;31m  Create Xorg service\e[0m"
+        debug $cmd
+        eval $cmd &
+        sleep 3
+    else
+        out "The Xorg service has been created \e[0m"
+    fi
+}
+
+function start_session_manager()
+{
+
+    windowing=""
+    warning "BINDMOUNTDIR:${BINDMOUNTDIR}, XDG_RUNTIME_DIR:${XDG_RUNTIME_DIR}"
+    if [ -d ${XDG_RUNTIME_DIR}/anbox/${instancenum} ]; then
+      sudo rm -rfv ${XDG_RUNTIME_DIR}/anbox/${instancenum}
+      sudo rm -rfv ${BINDMOUNTDIR}/${instancenum}
+    fi
+
+    PID=$(ps aux | grep session-manager | grep "run-multiple=${instancenum}" | column -t | cut -d$' ' -f3)
+    if [[ "$PID" != "" ]]; then
+       out "exsist , STOPPING Session Manager (${PID})"
+       kill -9 ${PID}
+    else
+       out "NOT stopping Session Manager, it's not running"
+    fi
+
+    ## can't run as root
+    cpurange=$((4*instancenum))-$((4*instancenum+3))
+    #taskset -c $cpurange anbox session-manager --run-multiple=1 --standalone --experimental windowing="" --window-size=720,1280
+    cmd="taskset -c $cpurange $SESSIONMANAGER --run-multiple=${instancenum} --standalone --single-window --experimental $windowing --window-size=720,1280"
+
+    echo $cmd
+    export DISPLAY=$DISPLAY
+    export EGL_PLATFORM=x11
+    export EGL_LOG_LEVEL="fatal"
+    export SDL_VIDEODRIVER=x11
+
+    #eval $cmd
+    eval "${cmd}" &
+    if [ $? -ne 0 ]; then
+        warning "session manager failed"
+        exit
+    fi
+    SESSIONMANAGERPID=$(ps aux | grep session-manager | grep "run-multiple=${instancenum}" | column -t | cut -d$' ' -f3)
+
+    TIMEOUT=0
+    while true; do
+      ps -h $SESSIONMANAGERPID > /dev/null
+      if [[ $? -gt 0 ]]; then
+        if [[ $TIMEOUT -gt 2 ]]; then
+          warning "FAILED to start the Session Manager"
+          return $FAILED
+        else
+        TIMEOUT=$(($TIMEOUT+1))
+        fi
+          sleep 2
+        else
+          break
+      fi
+    done
+}
+
+function configure_networking()
+{
+    #unique_ip=${instancenum}
+    unique_ip=$(ps -ef | grep "proxy" | grep "172.17.0" | awk '{print $16}' | awk -F "." '{print $4}' | sort -nur | sed -n '1p')
+    if [[ ! $unique_ip ]]; then
+        unique_ip=1
+    fi
+    unique_ip=$(($unique_ip + 1))
+    final_ip=172.17.0.$unique_ip
+
+    out "CREATING network configuration (using $final_ip)"
+
+    mkdir -p ${BINDMOUNTDIR}/${instancenum}/data/misc/ethernet
+    echo "mkdir -p ${BINDMOUNTDIR}/${instancenum}/data/misc/ethernet"
+
+    $ANBOX generate-ip-config --ip=$final_ip --gateway=172.17.0.1
+    if [[ $? -ne 0 ]]; then
+        warning "FAILED to configure Networking"
+        return $FAILED
+    fi
+
+    cp ipconfig.txt ${BINDMOUNTDIR}/${instancenum}/data/misc/ethernet
+}
+
+function start()
+{
+    ps aux | grep -v grep | grep "$instance \|$instance$" > /dev/null
+    if [[ $? -eq 0 ]]; then
+      OUT=$(ps aux | grep -v grep | grep "$instance \|$instance$")
+      out $OUT
+      warning "$instance is already running -- please stop it before continuing"
+      return $FAILED
+    fi
+
+    sudo docker network inspect bridge | grep \"$instance\" > /dev/null
+    if [[ $? -eq 0 ]]; then
+      sudo docker network disconnect -f bridge $instance
+    fi
+
+    # Export current log level values
+    export ANBOX_LOG_LEVEL=$ANBOX_LOG_LEVEL
+    export EGL_LOG_LEVEL=$EGL_LOG_LEVEL
+    start_framebuffer
+    # Raise system resource limits - required for many containers
+    sudo sysctl -w fs.inotify.max_user_instances=8192 > /dev/null
+    sudo sysctl -w fs.file-max=1000000 > /dev/null
+    sudo sysctl -w kernel.shmmni=24576 > /dev/null
+    sudo sysctl -w kernel.pid_max=200000 > /dev/null
+
+    ulimit -n 4096
+    ulimit -s unlimited
+    ulimit -c unlimited
+
+    start_session_manager
+
+    debug "Ensuring all sockets are useable"
+
+}
+
+function stop()
+{
+
+  ps aux | grep -v grep | grep "run-multiple=${instancenum}" > /dev/null
+  if [[ $? -ne 0 ]]; then
+    out "Nothing to do"
+    # Remove possible remnent files anyway, just in case
+    sudo rm -rf ${XDG_RUNTIME_DIR}/anbox/${instancenum}
+    sudo rm -rf ${BINDMOUNTDIR}/${instancenum}
+    exit 0
+  fi
+    # Stop Docker
+    sudo docker ps -a | grep $instance$ > /dev/null
+    if [[ $? -eq 0 ]]; then
+        out "REMOVING Docker"
+        sudo docker rm -f $instance
+        if [[ $? -ne 0 ]]; then
+          warning "FAILED to remove Docker container"
+        fi
+    else
+        out "NOT stopping Docker, it's not running"
+    fi
+
+    # Stop Session Manager
+    PID=$(ps aux | grep -v "grep" | grep "session-manager" | grep "run-multiple=${instancenum}" | column -t | cut -d$' ' -f3)
+    if [[ "$PID" != "" ]]; then
+       out "STOPPING Session Manager (${PID})"
+       if [[ "$PERF" == "true" ]]; then
+         kill -INT ${PID}
+       else
+         kill -9 ${PID}
+       fi
+    else
+       out "NOT stopping Session Manager, it's not running"
+    fi
+
+    out sudo rm -rf ${XDG_RUNTIME_DIR}/anbox/${instancenum}
+    out sudo rm -rf ${BINDMOUNTDIR}/${instancenum}
+
+
+    sudo rm -f /tmp/.X${instancenum}-lock
+
+    # Remove unattached shared memory (VNC does not free it properly)
+    IDS=$(ipcs -m | grep '^0x' | grep "$USER" | awk '{print $2, $6}' | grep ' 0$' | awk '{print $1}')
+    for id in $IDS; do
+    ipcrm shm "${id}" &> /dev/null
+    done
+}
+
+main ()
+{
+    mkdir -p "${XDG_RUNTIME_DIR}"
+    #mkdir -p $DBUS_SESSION_BUS_ADDRESS
+    instancenum=$2
+    instance=instance${instancenum}
+    if [[ "$1" == "start" ]]; then
+      out "Attempting to start instance $instance\n"
+      start
+    elif  [[ "$1" == "kill" ]]; then
+      kill
+    elif  [[ "$1" == "stop" ]]; then
+      out "Attempting to stop instance $instance\n"
+      stop
+    fi
+
+    return $?
+}
+
+main "$@"
+exit $?
diff --git a/src/use_cases/robox/test_config/ys_perf_exporter.yml b/src/use_cases/robox/test_config/ys_perf_exporter.yml
new file mode 100755 (executable)
index 0000000..b9ab0e3
--- /dev/null
@@ -0,0 +1,110 @@
+{
+  "kmem": {
+    "events": [
+      ["instructions", "instructions_retired"],
+      "cycles"
+    ],
+    "custom_events": [
+      {
+        "type": 4,
+        "config": [
+          "0x5300c0"
+        ],
+        "name": "instructions_retired"
+      }
+    ]
+  },
+  "kmem": {
+    "events": [
+      "mm_page_free"
+    ],
+    "custom_events": [
+      {
+        "type": 18,
+        "config": [
+          "0x5300"
+        ],
+        "name": "cas_count_write1"
+      }
+    ]
+  },
+  "kmem": {
+    "events": [
+      "mm_page_alloc"
+    ],
+    "custom_events": [
+      {
+        "type": 19,
+        "config": [
+          "0x5301"
+        ],
+        "name": "cas_count_write2"
+      }
+    ]
+  },
+  "kmem": {
+    "events": [
+      "kfree"
+    ],
+    "custom_events": [
+      {
+        "type": 20,
+        "config": [
+          "0x5302"
+        ],
+        "name": "cas_count_write3"
+      }
+    ]
+  },
+  "kmem": {
+    "events": [
+      "kmalloc"
+    ],
+    "custom_events": [
+      {
+        "type": 21,
+        "config": [
+          "0x5303"
+        ],
+        "name": "cas_count_write4"
+      }
+    ]
+  },
+   "sched": {
+    "events": [
+      "sched_wakeup"
+    ],
+    "custom_events": [
+      {
+        "type": 22,
+        "config": [
+          "0x5304"
+        ],
+        "name": "cas_count_write5"
+      }
+    ]
+  },
+  "sched": {
+    "events": [
+      "sched_migrate_task"
+    ],
+    "custom_events": [
+      {
+        "type": 23,
+        "config": [
+          "0x5305"
+        ],
+        "name": "cas_count_write6"
+      }
+    ]
+  },
+  "custom_events": [
+      {
+        "type": 1,
+        "config": [
+          "0x04"
+        ],
+        "name": "cache-misses"
+      }
+    ]
+}
diff --git a/src/use_cases/robox/test_config/ys_prometheus.yml b/src/use_cases/robox/test_config/ys_prometheus.yml
new file mode 100755 (executable)
index 0000000..60d9787
--- /dev/null
@@ -0,0 +1,39 @@
+# my global config
+global:
+  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
+  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
+  # scrape_timeout is set to the global default (10s).
+
+# Alertmanager configuration
+alerting:
+  alertmanagers:
+    - static_configs:
+        - targets:
+          # - alertmanager:9093
+
+# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
+rule_files:
+  # - "first_rules.yml"
+  # - "second_rules.yml"
+
+# A scrape configuration containing exactly one endpoint to scrape:
+# Here it's Prometheus itself.
+scrape_configs:
+  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
+  #- job_name: "prometheus"
+  - job_name: cadvisor
+
+    # metrics_path defaults to '/metrics'
+    # scheme defaults to 'http'.
+    #
+    static_configs:
+      - targets: ['localhost:8080']
+  - job_name: prometheus
+    static_configs:
+      - targets: ['localhost:9090']
+  - job_name: node
+    static_configs:
+      - targets: ['localhost:9100']
+  - job_name: perf
+    static_configs:
+      - targets: ['localhost:8585']