#!/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" <<EOF
[Desktop Entry]
Type=Application
Name=GIS NR Plugin
Name[ru]=Плагин ГИС НР
Icon=$ICON_PATH
Exec=/usr/bin/nr-plugin
Terminal=false
Categories=Network;
EOF

mkdir -p "$PKG/etc/xdg/autostart"
ln -sf /usr/share/applications/$PRGNAM.desktop "$PKG/etc/xdg/autostart/"

CHROME_JSON='{"external_update_url": "https://nr-repo.roskazna.ru/nexus/repository/plugin-chrome-extension/chrome/update.xml"}'
mkdir -p "$PKG/usr/share/chromium/extensions"
echo "$CHROME_JSON" > "$PKG/usr/share/chromium/extensions/jimlefkaplbjodgcoflnidjeiehabikf.json"

echo "PACKAGE NAME: $PRGNAM-$VERSION-$ARCH" > "$PKGINFO/$PRGNAM-$VERSION-$ARCH"
cat >> "$PKGINFO/$PRGNAM-$VERSION-$ARCH" <<EOM
PACKAGE DESCRIPTION:
nr-plugin: GIS NR Plugin – Docker-based plugin for the EIS NR subsystem
nr-plugin: (zakupki.gov.ru). Records user actions and provides video
nr-plugin: appeals functionality.
nr-plugin:
nr-plugin: Requires Docker, CryptoPro CSP, and CryptoPro CSP Browser
nr-plugin: plug-in.
nr-plugin:
nr-plugin: Version: $VERSION
nr-plugin:
FILE LIST:
EOM

cd "$PKG" || exit
find * | grep -v var >> "$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
