#!/bin/bash # Build script for GIS NR Plugin (nr-plugin) for Porteus # The plugin is required for recording user actions and video appeals # on the zakupki.gov.ru portal (EIS procurement system). # # Version 2026-07-05 # Copyright 2023-2030, Blaze, Dankov, Russia # All rights reserved. # # Redistribution and use of this script, with or without modification, is # permitted provided that the following conditions are met: # # 1. Redistributions of this script must retain the above copyright # notice, this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if [ "$(whoami)" != "root" ]; then echo -e "\nYou must be root to run this script.\n" exit 1 fi BOLD=${BOLD:-"\e[1m"} CYAN=${CYAN:-"\e[96m"} GREEN=${GREEN:-"\e[92m"} RED=${RED:-"\e[31m"} RESET=${RESET:-"\e[0m"} PRGNAM="nr-plugin" VERSION=${VERSION:-latest} BUILD=${BUILD:-1} ARCH="x86_64" CWD=$(pwd) TMPDIR=/tmp/portch PKG=$TMPDIR/package-$PRGNAM PKGINFO=$PKG/var/lib/pkgtools/packages OUTPUT=${OUTPUT:-/tmp} DOCKER_IMAGE_NAME="nr-repo.roskazna.ru/nr-plugin" echo -e "\n${BOLD}WARNING!${RESET}\n" echo -e "Before building, ensure the following modules are activated:\n" echo -e "${BOLD}CryptoPro CSP, CryptoPro CSP Browser plug-in, docker, containerd, nftables, runc.${RESET}\n" echo -e "All modules must be installed BEFORE running this build script!\n" echo -e "After activation, run this single command as root:\n" echo -e "${BOLD}chmod +x /etc/rc.d/rc.cgroupfs-mount /etc/rc.d/rc.docker && /etc/rc.d/rc.cgroupfs-mount start && { getent group docker >/dev/null || groupadd docker; } && usermod -aG docker guest && /etc/rc.d/rc.docker start${RESET}\n" read -p "Continue with the build? [y/n] " -n 1 -r -s && echo [[ ! $REPLY =~ ^[Yy]$ ]] && exit 1 cleanup() { [ -d "$TMPDIR" ] && rm -rf "$TMPDIR" [ -d "$PKG" ] && rm -rf "$PKG" exit } halt_error() { echo -e "${RED}$1${RESET}" cleanup } echo "Checking dependencies..." if ! which docker &>/dev/null; then halt_error "Docker is not installed. Please install Docker first." fi if ! docker info &>/dev/null; then halt_error "Docker daemon is not running or accessible." fi if ! which certmgr &>/dev/null; then if [ -x /opt/cprocsp/bin/amd64/certmgr ]; then CERTMGR=/opt/cprocsp/bin/amd64/certmgr else halt_error "certmgr not found. Please install CryptoPro CSP before building." fi else CERTMGR=$(which certmgr) fi rm -rf "$PKG" mkdir -p "$PKG/usr/bin" \ "$PKG/usr/share/$PRGNAM" \ "$PKG/usr/share/applications" \ "$PKG/etc/xdg/autostart" \ "$PKG/var/lib/docker" \ "$PKGINFO" echo -e "\n${CYAN}Pulling Docker image ${DOCKER_IMAGE_NAME}:${VERSION}...${RESET}" docker pull "${DOCKER_IMAGE_NAME}:${VERSION}" || halt_error "Failed to pull Docker image." echo "Saving Docker image to tar..." docker save "${DOCKER_IMAGE_NAME}:${VERSION}" -o "$PKG/usr/share/$PRGNAM/nr-image.tar" || halt_error "Failed to save image." chmod 644 "$PKG/usr/share/$PRGNAM/nr-image.tar" mkdir -p "$PKG/etc/docker" cat > "$PKG/etc/docker/daemon.json" << 'EOF' { "iptables": false, "bridge": "none", "storage-driver": "vfs" } EOF echo "Downloading certificates..." curl -kfsSL -o "$PKG/usr/share/$PRGNAM/root.cer" "https://nr-repo.roskazna.ru/nexus/repository/plugin-install/certs/mincifri.cer" || echo "Warning: could not download root.cer" curl -kfsSL -o "$PKG/usr/share/$PRGNAM/mincomsvyaz.cer" "https://nr-repo.roskazna.ru/nexus/repository/plugin-install/certs/mincomsvyaz.cer" || echo "Warning: could not download mincomsvyaz.cer" if [ -f "$PKG/usr/share/$PRGNAM/root.cer" ]; then $CERTMGR -install -store mRoot -file "$PKG/usr/share/$PRGNAM/root.cer" -certificate || { echo -e "${RED}Failed to install root certificate. Please ensure CryptoPro CSP is properly installed.${RESET}" exit 1 } fi if [ -f "$PKG/usr/share/$PRGNAM/mincomsvyaz.cer" ]; then $CERTMGR -install -store mRoot -file "$PKG/usr/share/$PRGNAM/mincomsvyaz.cer" -certificate || { echo -e "${RED}Failed to install root certificate. Please ensure CryptoPro CSP is properly installed.${RESET}" exit 1 } fi ICON_BASE64="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vf/k1b3/5NW9/+TWvf7m0Kf+9bIP//WyEP/1shD/9bIP//WyEP/1sg//9bIP//WyD//1sg//9bIP//WyEP/1sg//9bIP//WyD//Ix8f/yMfH/8jHx//Ix8f/yMfH/8jHx//Ix8f/yMfH/8jHx//Ix8f/yMfH/8jHx//Ix8f/xMTD/6+jkf+tnoj/rZ+I/qyeh/+snYf/rZ6H3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf378Q5tfA/+bXwP/m17//5da//+XVvv/p39D//v7+///////////////////////////////////////////////////////////////////////Ibgf/yG4H/8huB//Ibgj/yG4H/8huB//Ibgj/yG4H/8huCP/Ibgj/yG4I/8huB//Ibgf/yG4H/7eNWf+tn4n/rZ+J/62fif+tn4n+rJ6I/6+fhyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADm2cJQ59jC/+fZwv/o2cL+5tfA/+bXwP/u59z////////////////////////////////////////////////////////////////////////////Ibgf/yG4H/8huB//Ibgf/yG4H/8huCP/Ibgj/yG4H/8huB//Ibgf/yG4H/8huB//Ibgf/yG4H/72EQf+uoYv/raCL/66giv+toIr/rqCK/qyfjFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo28Rw6NrE/+jZw//o2cP/6NrD/ujZw/7w7OX////////////////////////////////////////////////////////////////////////////Ibgf/yG4H/8huCP/Ibgf/yG4I/8huCP/Ibgf/yG4H/8huCP/Ibgf/yG4I/8huB//Ibgf/yG4H/8J7Kf+woo3/r6GM/6+ijP6uoYv/rqGL/6+hi38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq3cef6tzH/+nbxv/p28X+6drF/+jaxP/z8u7////////////////////////////////////////////////////////////////////////////Ibgj/yG4H/8huB//Ibgf/yG4H/8huB//Ibgf/yG4H/8huB//Ibgf/yG4I/8huCP/Ibgf/yG4H/8N4If+wo47+saOO/q+ijf+woo3/r6GM/6ygiqMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr3cmv6t3I/+vdyP/q3cj+6tzG/+nbxv/08vD////////////////////////////////////////////////////////////////////////////Ibgf/yG4H/8huCP/Ibgf/yG4H/8huB//Ibgf/yG4H/8huCP/Ibgj/yG4I/8huB//Ibgf/yG4H/8V1GP+wpI//saSP/7Cjj/+wo47/saSP/rCjj78AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADt38rf7N/K/+veyv/r3sr/7N7J/uvdyf719PT////////////////////////////////////////////////////////////////////////////Ibgj/yG4I/8huB//Ibgf/yG4I/8huCP/Ibgf/yG4I/8huCP/Ibgf/yG4H/8huB//Ibgj/yG4H/8huB/+ypZH/sqWR/rGkkP+xpJD/sKSP/66ijdMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu4M3f7eDM/+3fzP/t4Mz+7eDM/uveyv/19PT////////////////////////////////////////////////////////////////////////////Ibgf/yG4H/8huCP/Ibgf/yG4H/8huCP/Ibgj/yG4I/8huB//Ibgf/yG4H/8huCP/Ibgj/yG4H/8huB/+zp5P+s6aS/7Klkf+ypZH/saWR/7Glkd8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv4s/v7+LP/u7hz//t4c3/7eHN/+3gzP/19PT////////////////////////////////////////////////////////////////////////////Ibgf/yG4H/8huCP/Ibgf/yG4H/8huB//Ibgf/yG4H/8huB//Ibgf/yG4H/8huB//Ibgj/yG4H/8huCP+0p5T/s6aT/7Omk/+zppP/s6aT/7Omk/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv49D/7+PQ/+/j0P/v4s//7+LQ/u7hz//19fX////////////////////////////////////////////////////////////////////////////Ibgf/yG4H/8huB//Ibgf/yG4H/8huB//Ibgf/yG4I/8huCP/Ibgj/yG4I/8huB//Ibgf/yG4H/8huB/+1qJb+tKiV/7SnlP+0p5T/tKiU/rOnlP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx5dP/8OTS//Dk0v/w5NH/8OTR/u/j0f/39/b////////////////////////////////////////////////////////////////////////////Ibgj/yG4I/8huCP/Ibgj/yG4H/8huB//Ibgf/yG4I/8huB//Ibgj/yG4H/8huB//Ibgf/yG4I/8huCP+1qZf/tamX/7Wplv+0qJb/taiW/rWplv4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy5tX/8ubV//Hl1P/x5dP/8OXT//Dk0v/39vb////////////////////////////////////////////////////////////////////////////Ibgf/yG4H/8huB//Ibgf/yG4H/8huB//Ibgj/yG4H/8huCP/Ibgj/yG4H/8huB//Ibgf/yG4H/8huB/+2qpn/tqqY/7armP62qpf/tqqY/rWpl/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD06Nj+8+fX//Pn1v/y5tX/8ufW/vLm1f/29vX////////////////////////////////////////////////////////////////////////////Ibgf/yG4H/8huB//Ibgf/yG4H/8huB//Ibgf/yG4I/8huB//Ibgf/yG4H/8huB//Ibgf/yG4H/8huCP+4rJz+t6ua/7eqmf+3q5n/tqqZ/7eqmf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD06dn/9OnZ//Po2P/z6Nf/8+jX/vPn1//t7Or//f39///////////////////////////////////////////////////////////////////////Ibgf/yG4H/8huB//Ibgf/yG4H/8huB//Ibgj/yG4H/8huB//Ibgf/yG4I/8huB//Ibgf/yG4H/8Z2Gv+4rZz/t6yb/7esm/+3q5r/uKyc/rermv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD169v/9erb//Xp2v/16tr+9OnZ//Po2P/r4tf/4uHf/+7u7f/29vb/+/v7//7+/v/////////////////////////////////////////////////Ibgf/yG4H/8huB//Ibgf/yG4H/8huCP/Ibgf/yG4H/8huB//Ibgf/yG4I/8huCP/Ibgf/xnYa/7yigf+5rp7+ua2d/7mtnf+4rpz+uK2c/7etm/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD27N3/9uvc//fs3P7169v/9uvc/vXq2/716tv/9era/u3k2P/k39j/4N/c/+jo6P/09PT/+/v7//39/f/////////////////////////////////Ibgj/yG4H/8huCP/Ibgf/yG4I/8huB//Ibgf/yG4H/8huB//Ibgf/xnYa/8KLSv++oHr/uq+g/7qvn/+6r5//uq+f/7qvnv+5rZ7/ua2d/7mtnf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD47t/+9+3f//ft3v/37d7+9uzd//fs3f/269z/9evb//Xr2//16tv/9era//Dm2P/o4dj/5ODc/+Pj4v/v7+//+fn4//39/f/////////////////Ibgf/yG4H/8huCP/Ibgf/yG4H/8huB//Ibgf/xX8u/8GUYP+9qY//vLGj/7uxof+7saH/u7Gi/ruwof+6sKH/urCg/7qvoP+7sKD+uq+f/7qunv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD57+Hf+O7g//ju4P/57uD++O3f//ft3v/37d7/9+3e/vbs3f/269z/9uzc/vbr2//16tv/9erb//Lo2f/n4db/5ODa/+Pi4f/u7u3/9vb2//v7+//Ibgf/yG4H/8huB//HcxH/xIlD/8Kaa/+/sJz+vbSl/760pf69tKX+vbOk/72yo/+9sqT+vLGj/7yxov+7saL/u7Gh/7yxov66sKH/urCg/7etneMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD68eNv+vDj/vrw4v757+L/+e/h//nv4f/57+H++O7f//ft3//47d//9+3e//ft3v737N3/9+zd/vbr3P/269v/9erb//Xr2//t5dn/5N/Y/9/e2//Hdxv/xY5O/8GkgP+/taf/v7Wo/7+1qP6+taf/vrSm/760p/+9tKb/vbOl/72zpf+9s6T/vbOl/7yzpP+9s6T+vLGj/72ypP68saP/vLKi/rqxo28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PLiUPvy47/68OPv+vDj//nw4//58OL/+fDi/vnv4f/47uD/+O7g//ju4P747d//+O7f//ft3v/37N3/9+zd//fs3v7269z/9erb//bs3P7BuKv+wLeq/8C3qv/At6n/wLep/8C3qv6/tqn/v7ao/7+2qP6+taf/vrSn/760pv++taf+vbSm/72zpf++tKb+vbOk/760pf6+s6S/vbKlYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//98Q+/PjQPvx5I/88eXf+/Hk//nw4//68eT++vDj/vnv4f/57+H/+O7h//ju4P/47uD++O3f//ft3v/37d//9+zd//bs3f/Bua3/wbis/8C4q//BuKv/wLeq/8C3qv/At6r/wLep/7+2qf/At6n/v7ap/8C2qf6/taf/v7Wn/7+1qN69taefv7OnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//fnIPrx5nD78uS/+vHk7/rx4//68OP/+vDj//nw4v/57+L/+e/h//ju4P/47uD/+O7g//ju3/7Cua7/w7qu/sG5rf/Cua3/wbmt/8G4rP/BuKz/wbir/8C3q//At6r/wLeq/7+3qr+/tadgv7enIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///fEPvz50D78+SP+vHl3/rx5P/68eT/+vHk/vrw4//57+L/+e/h//nv4f/Eu7D+w7qv/8O6r//Cuq7/wrqu/8K6rv/Cua3/wbit38K6rZ+/t6tAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/35yD68eZw+/Lmv/vx5e/78eT/+vHk//nw4//EvLH/w7ux/8O7sf/Du7D/w7qvv8S8rl/Hv68gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//3xD78+dA/fPkj/rx5t/FvbLfxb20n8O7s0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///w///8AAP//8A///wAA///AA///AAD//4AB//8AAP//AAB//wAA//wAAD//AAD/+AAAH/8AAP/wAAAP/wAA/+AAAAf/AAD/wAAAA/8AAP/AAAAD/wAA/4AAAAH/AAD/AAAAAP8AAP8AAAAA/wAA/gAAAAB/AAD+AAAAAH8AAPwAAAAAPwAA/AAAAAA/AAD4AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADwAAAAAA8AAPAAAAAADwAA8AAAAAAPAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADwAAAAAA8AAPwAAAAAfwAA/8AAAAP/AAD/+AAAP/8AAP//gAH//wAA///wH///AAA=" echo "$ICON_BASE64" | base64 -d > "$PKG/usr/share/$PRGNAM/nr_plugin.ico" 2>/dev/null if [ ! -f "$PKG/usr/share/$PRGNAM/nr_plugin.ico" ]; then echo "Warning: could not decode factory icon, using 'applications-internet'" ICON_PATH="applications-internet" else ICON_PATH="/usr/share/$PRGNAM/nr_plugin.ico" fi cat > "$PKG/usr/bin/nr-plugin-helper.sh" <<'HELPERSCRIPT' #!/bin/bash echo "NR Plugin helper script" mkdir -p $HOME/.nr_plugin PIPE_FILE=$HOME/.nr_plugin/plugin-pipe PID_FILE=$HOME/.nr_plugin/nr-plugin-helper.pid cleanup() { rm $PIPE_FILE rm $PID_FILE } list_descendants() { local children=$(ps -o pid= --ppid "$1") for pid in $children; do list_descendants "$pid" done echo $children } kill_previous() { ANOTHER_PID=$(cat $PID_FILE 2>/dev/null) if [ ! -z "$ANOTHER_PID" ]; then ALL_PIDS="$(list_descendants $ANOTHER_PID) ${ANOTHER_PID}" echo "Killing PIDS: $ALL_PIDS" kill $ALL_PIDS sleep 1 fi } kill_previous if [ "$1" == "-kill-previous" ]; then exit 0 fi echo $$ > $PID_FILE mkfifo $PIPE_FILE trap cleanup EXIT while true; do CMD=$(cat $PIPE_FILE 2>/dev/null) echo "CMD: ${CMD}" if [[ ${CMD:0:6} == "nr-cmd" ]]; then eval "${CMD:7}" elif [ "$CMD" == "exit" ]; then exit elif [ ! -z "$CMD" ]; then eval "/bin/xdg-open '$CMD'" fi echo "Finished" sleep 1 done HELPERSCRIPT chmod +x "$PKG/usr/bin/nr-plugin-helper.sh" cat > "$PKG/usr/bin/nr-plugin" <<'RUNSCRIPT' #!/bin/bash DOCKER_IMAGE_NAME="nr-repo.roskazna.ru/nr-plugin" VERSION="latest" # If we are not in the docker group yet, try to re-execute ourselves with sg if ! id -nG | grep -qw docker; then if command -v sg &>/dev/null; then exec sg docker -c "$0 $@" else echo "You are not in the 'docker' group and 'sg' is not available." echo "Please log out and back in, or run: newgrp docker" exit 1 fi fi # Load Docker image if not already present if ! docker inspect "${DOCKER_IMAGE_NAME}:${VERSION}" &>/dev/null; then if [ -r /usr/share/nr-plugin/nr-image.tar ]; then echo "Loading Docker image from /usr/share/nr-plugin/nr-image.tar..." docker load -i /usr/share/nr-plugin/nr-image.tar || { echo "Failed to load Docker image"; exit 1; } else echo "Docker image not found and /usr/share/nr-plugin/nr-image.tar is not readable." exit 1 fi fi # Prepare logs dir mkdir -p $HOME/.nr_plugin/logs # Helper already running? /usr/bin/nr-plugin-helper.sh -kill-previous 2>/dev/null # Start helper nohup /usr/bin/nr-plugin-helper.sh >> $HOME/.nr_plugin/logs/nr-plugin-helper.txt 2>&1 & sleep 1 # Determine timezone if [ -f /etc/timezone ]; then TIMEZONE=$(cat /etc/timezone) else TIMEZONE=$(timedatectl 2>/dev/null | awk '/Time zone:/ {print $3}') [ -z "$TIMEZONE" ] && TIMEZONE="Europe/Moscow" fi # Additional mount points for Astra/ALT USB (without bind-propagation) ASTRA_USB_CMD="" [ -d /run/user/$(id -u) ] && mkdir -p /run/user/$(id -u)/media && ASTRA_USB_CMD="-v /run/user/$(id -u)/media:/run/user/$(id -u)/media" ALT_USB_CMD="" [ -d /run/media ] && mkdir -p /run/media/$USER && ALT_USB_CMD="-v /run/media/$USER:/run/media/$USER" # Run Docker container (fix group/user mismatch + missing libades-core.so.2) docker run \ -h $(hostname) \ --network host \ -p 9822:9822 \ --ipc=host \ -v /usr/share/nr-plugin:/usr/share/nr-plugin \ -v /dev:/dev \ -v /tmp:/tmp \ -v /opt:/opt \ -v /var/opt:/var/opt \ -v $HOME:$HOME \ -v /run/user/$(id -u)/bus:/run/user/$(id -u)/bus \ -v /run/user/$(id -u)/dconf:/run/user/$(id -u)/dconf \ $ASTRA_USB_CMD \ $ALT_USB_CMD \ -v /etc/passwd:/etc/passwd.host \ -v /etc/hosts:/etc/hosts \ -v /etc/opt:/etc/opt \ -v /etc/udev:/etc/udev \ -v /usr/lib/pcsc:/usr/lib/pcsc \ -v /run/pcscd:/run/pcscd \ -e DISPLAY=$DISPLAY \ -e TZ=$TIMEZONE \ -e DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS \ -e XDG_RUNTIME_DIR=/run/user/$(id -u) \ -e HTTP_PROXY=$HTTP_PROXY \ -e HTTPS_PROXY=$HTTPS_PROXY \ -e http_proxy=$http_proxy \ -e https_proxy=$https_proxy \ -e HOST_USER=$USER \ -e HOME=$HOME \ -e HOST_UID=$(id -u) \ -e HOST_GID=$(id -g) \ --rm \ --name my-nr-plugin \ --security-opt apparmor=unconfined \ --privileged \ --pid=host \ --entrypoint /bin/sh \ ${DOCKER_IMAGE_NAME}:${VERSION} \ -c "groupadd -g ${HOST_GID} hostgroup 2>/dev/null || true; \ usermod -a -G hostgroup nr_plugin 2>/dev/null || true; \ usermod -u ${HOST_UID} nr_plugin 2>/dev/null || true; \ ln -sf /opt/cprocsp/lib/amd64/libcplib.so /opt/cprocsp/lib/amd64/libades-core.so.2 2>/dev/null || true; \ exec /deployments/nr-plugin-docker-wrapper.sh" RUNSCRIPT chmod +x "$PKG/usr/bin/nr-plugin" cat > "$PKG/usr/share/applications/$PRGNAM.desktop" < "$PKG/usr/share/chromium/extensions/jimlefkaplbjodgcoflnidjeiehabikf.json" echo "PACKAGE NAME: $PRGNAM-$VERSION-$ARCH" > "$PKGINFO/$PRGNAM-$VERSION-$ARCH" cat >> "$PKGINFO/$PRGNAM-$VERSION-$ARCH" <> "$PKGINFO/$PRGNAM-$VERSION-$ARCH" echo -e "\n${CYAN}Building module $PRGNAM-$VERSION-$ARCH-$BUILD.xzm${RESET}" dir2xzm "$PKG" "$OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.xzm" if [ -f "$OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.xzm" ]; then echo -e "\n${BOLD}Module created: ${GREEN}$OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD.xzm${RESET}" echo -e "${BOLD}Copy the module to your Porteus modules directory $PORTDIR/modules and activate it.${RESET}" else echo -e "\n${RED}Error: module was not built.${RESET}" fi cleanup