From ea1aba716b7088437c8e4782586af7dc0a9efbcd Mon Sep 17 00:00:00 2001
From: PromptPunksFauxCough
Date: Mon, 24 Feb 2025 17:58:43 +0000
Subject: [PATCH] initiale
---
scripts/install_qubes/README.md | 513 ++++++++++++++++++
.../install_qubes/scripts/0-dom0/0.0-dom0.sh | 6 +
.../install_qubes/scripts/0-dom0/0.1-dom0.sh | 6 +
.../install_qubes/scripts/0-dom0/0.2-dom0.sh | 7 +
.../install_qubes/scripts/0-dom0/0.3-dom0.sh | 6 +
.../1-TemplateVM/1.0-haveno-templatevm.sh | 195 +++++++
.../scripts/2-NetVM/2.0-haveno-netvm_taker.sh | 30 +
.../scripts/2-NetVM/2.1-haveno-netvm_maker.sh | 52 ++
.../scripts/3-AppVM/3.0-haveno-appvm_taker.sh | 60 ++
.../scripts/3-AppVM/3.1-haveno-appvm_maker.sh | 71 +++
10 files changed, 946 insertions(+)
create mode 100644 scripts/install_qubes/README.md
create mode 100644 scripts/install_qubes/scripts/0-dom0/0.0-dom0.sh
create mode 100644 scripts/install_qubes/scripts/0-dom0/0.1-dom0.sh
create mode 100644 scripts/install_qubes/scripts/0-dom0/0.2-dom0.sh
create mode 100644 scripts/install_qubes/scripts/0-dom0/0.3-dom0.sh
create mode 100644 scripts/install_qubes/scripts/1-TemplateVM/1.0-haveno-templatevm.sh
create mode 100644 scripts/install_qubes/scripts/2-NetVM/2.0-haveno-netvm_taker.sh
create mode 100644 scripts/install_qubes/scripts/2-NetVM/2.1-haveno-netvm_maker.sh
create mode 100644 scripts/install_qubes/scripts/3-AppVM/3.0-haveno-appvm_taker.sh
create mode 100644 scripts/install_qubes/scripts/3-AppVM/3.1-haveno-appvm_maker.sh
diff --git a/scripts/install_qubes/README.md b/scripts/install_qubes/README.md
new file mode 100644
index 0000000000..f6ef340aca
--- /dev/null
+++ b/scripts/install_qubes/README.md
@@ -0,0 +1,513 @@
+# Haveno on Qubes/Whonix
+
+## **Conventions:**
+
++ \# – Requires given linux commands to be executed with root privileges either directly as a root user or by use of sudo command
+
++ $ or % – Requires given linux commands to be executed as a regular non-privileged user
+
++ \ – Used to indicate user supplied variable
+
+---
+
+## **Maker vs. Taker Use-Cases:**
++ If user plans to run Haveno for short periods, dynamic onion configuration might fit within their threat model
+> For the purpose of this workshop, let’s call this the "taker" use-case
+
++ If user plans to run Haveno 24/7, using a static onion configuration might be more desirable
+> For the purpose of this workshop, let’s call this the "maker" use-case.
+
+ONLY Perform the Steps Required for One Use-Case
+
+OR
+
+Adjust the Steps to Provide Both
+
+ IE:
+ Create sys-haveno-dynamic NetVM & sys-haveno-static NetVM
+ Create haveno-dynamic AppVM & haveno-static AppVM
+ Adjust NetVM for the for the respective Haveno AppVM as necessary.
+
+---
+
+## **Installation (Scripted & GUI + CLI):**
+### *Aquire release files:*
+#### In `dispXXXX` AppVM:
+##### Clone repository
+```shell
+% git clone --depth=1 https://github.com/haveno-dex/haveno
+```
+
+---
+
+### **Create TemplateVM, NetVM & AppVM:**
+#### Scripted
+##### In `dispXXXX` AppVM:
+###### Prepare files for transfer to `dom0`
+```shell
+% tar -C haveno/scripts/install_qubes/scripts/0-dom0 -zcvf /tmp/haveno.tgz .
+```
+
+##### In `dom0`:
+###### Copy files to `dom0`
+```shell
+$ mkdir -p /tmp/haveno && qvm-run -p dispXXXX 'cat /tmp/haveno.tgz' > /tmp/haveno.tgz && tar -C /tmp/haveno -zxfv /tmp/haveno.tgz
+$ bash /tmp/haveno/0.0-dom0.sh && bash /tmp/haveno/0.1-dom0.sh && bash /tmp/haveno/0.2-dom0.sh
+```
+
+#### GUI
+##### TemplateVM
+###### Via `Qubes Manager`:
+
++ Locate & highlight whonix-workstation-17 (TemplateVM)
+
++ Right-Click "whonix-workstation-17" and select "Clone qube" from Drop-Down
+
++ Enter "haveno-template" in "Name"
+
++ Click OK Button
+
+##### NetVM
+###### Via `Qubes Manager`:
+
++ Click "New qube" Button
+
++ Enter "sys-haveno" for "Name and label"
+
++ Click the Button Beside "Name and label" and Select "orange"
+
++ Select "whonix-gateway-17" from "Template" Drop-Down
+
++ Select "sys-firewall" from "Networking" Drop-Down
+
++ Tick "Launch settings after creation" Radio-Box
+
++ Click OK
+
++ Click "Advanced" Tab
+
++ Enter "512" for "Initial memory"
+
+(Within reason, can adjust to personal preference)
+
++ Enter "512" for "Max memory"
+
+(Within reason, can adjust to personal preference)
+
++ Tick "Provides network" Radio-Box
+
++ Click "Apply" Button
+
++ Click "OK" Button
+
+##### AppVM
+###### Via `Qubes Manager`:
+
++ Click "New qube" Button
+
++ Enter "haveno" for "Name and label"
+
++ Click the Button Beside "Name and label" and Select "orange"
+
++ Select "haveno-template" from "Template" Drop-Down
+
++ Select "sys-haveno" from "Networking" Drop-Down
+
++ Tick "Launch settings after creation" Radio-Box
+
++ Click OK
+
++ Click "Advanced" Tab
+
++ Enter "2048" for "Initial memory"
+
+(Within reason, can adjust to personal preference)
+
++ Enter "4096" for "Max memory"
+
+(Within reason, can adjust to personal preference)
+
++ Click "Apply" Button
+
++ Click "OK" Button
+
+
+#### CLI
+##### TemplateVM
+###### In `dom0`:
+```shell
+$ qvm-clone whonix-workstation-17 haveno-template
+```
+
+##### NetVM
+##### In `dom0`:
+```shell
+$ qvm-create --template whonix-gateway-17 --class AppVM --label=orange --property memory=512 --property maxmem=512 --property netvm=sys-firewall sys-haveno && qvm-prefs --set sys-haveno provides_network True
+```
+
+#### AppVM
+##### In `dom0`:
+```shell
+$ qvm-create --template haveno-template --class AppVM --label=orange --property memory=2048 --property maxmem=4096 --property netvm=sys-haveno haveno
+$ printf 'haveno-Haveno.desktop' | qvm-appmenus --set-whitelist – haveno
+```
+
+---
+
+### **Build TemplateVM, NetVM & AppVM:**
+#### *TemplateVM - Scripted*
+##### In `dispXXXX` AppVM:
+```shell
+% qvm-copy haveno/scripts/install_qubes/scripts/1-TemplateVM/1.0-haveno-templatevm.sh
+```
+
++ Select "haveno-template" for "Target" of Pop-Up
+
++ Click OK
+
+##### In `haveno-template` TemplateVM:
+```shell
+% sudo bash QubesIncoming/dispXXXX/1.0-haveno-templatevm.sh "" ""
+```
+
+Example:
+
+```shell
+$ sudo bash QubesIncoming/dispXXXX/1.0-haveno-templatevm.sh "https://github.com/nacho/repo/releases/download/v1.0.18/haveno-linux-deb.zip" "ABAF11C65A2970B130ABE3C479BE3E4300411886"
+```
+
+#### *TemplateVM - CLI*
+##### In `haveno-template` TemplateVM:
+###### Download & Import Project PGP Key
+```shell
+# export https_proxy=http://127.0.0.1:8082
+# export KEY_SEARCH=""
+# curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x$KEY_SEARCH" | gpg --import
+```
+
+Example:
+
+```shell
+# export https_proxy=http://127.0.0.1:8082
+# export KEY_SEARCH="ABAF11C65A2970B130ABE3C479BE3E4300411886"
+# curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x$KEY_SEARCH" | gpg --import
+```
+
+###### Download Release Files
+```shell
+# export https_proxy=http://127.0.0.1:8082
+# curl -sSLo /tmp/hashes.txt https://github.com/nacho/repo/releases/download/v1.0.18/1.0.18-hashes.txt
+# curl -sSLo /tmp/hashes.txt.sig https://github.com/nacho/repo/releases/download/v1.0.18/1.0.18-hashes.txt.sig
+# curl -sSLo /tmp/haveno.zip https://github.com/nacho/repo/releases/download/v1.0.18/haveno_amd64_deb-latest.zip
+# curl -sSLo /tmp/haveno.zip.sig https://github.com/nacho/repo/releases/download/v1.0.18/haveno_amd64_deb-latest.zip.sig
+```
+
+Note:
+Above are dummy URLS which MUST be replaced with actual working URLs
+
+###### Verify Release Files
+```shell
+# if [[ $(gpg --digest-algo SHA256 --verify /tmp/hashes.txt.sig /tmp/hashes.txt 2>&1) =~ 'Good signature' ]]; then printf $'SHASUM file has a VALID signature!\n'; else printf $'SHASUMS failed signature check\n' && exit; fi
+```
+
+###### Verify Hash, Unpack & Install Package
+```shell
+# if [[ $(cat /tmp/hashes.txt) =~ $(sha512sum /tmp/haveno*.zip | awk '{ print $1 }') ]] ; then printf $'SHA Hash IS valid!\n' && mkdir -p /usr/share/desktop-directories && cd /tmp && unzip /tmp/haveno*.zip && apt install -y /tmp/haveno*.deb && chown -R $(ls /home):$(ls /home) /opt/haveno; else printf $'WARNING: Bad Hash!\n' && exit; fi
+```
+
+###### Verify Jar
+```shell
+# if [[ $(cat /tmp/desktop*.SHA-256) =~ $(sha256sum /opt/haveno/lib/app/desktop*.jar | awk '{ print $1 }') ]] ; then printf $'SHA Hash IS valid!\n' && printf 'Happy trading!\n'; else printf $'WARNING: Bad Hash!\n' && exit; fi
+```
+
+#### *NetVM - Scripted (Taker)*
+##### In `dispXXXX` AppVM:
+```shell
+$ qvm-copy haveno/scripts/install_qubes/scripts/2-NetVM/2.0-haveno-netvm_taker.sh
+```
+
++ Select "sys-haveno" for "Target" Within Pop-Up
+
++ Click "OK" Button
+
+##### In `sys-haveno` NetVM:
+(Allow bootstrap process to complete)
+```shell
+% sudo zsh QubesIncoming/dispXXXX/2.0-haveno-netvm_taker.sh
+```
+
+#### *NetVM - CLI (Taker)*
+##### In `sys-haveno` NetVM:
+###### Add `onion-grater` Profile
+```shell
+# onion-grater-add 40_haveno
+```
+
+###### Restart `onion-grater` Service
+```shell
+# systemctl restart onion-grater.service
+# poweroff
+```
+
+#### *NetVM - Scripted (Maker)*
+##### In `dispXXXX` AppVM:
+```shell
+$ qvm-copy haveno/scripts/install_qubes/scripts/2-NetVM/2.1-haveno-netvm_maker.sh
+```
++ Select "sys-haveno" for "Target" of Pop-Up
+
++ Click OK
+
+##### In `sys-haveno` NetVM:
+```shell
+% sudo zsh QubesIncoming/dispXXXX/2.1-haveno-netvm_maker.sh ""
+```
+
+Example:
+
+```shell
+$ sudo zsh QubesIncoming/dispXXXX/2.1-haveno-netvm_maker.sh "1.1.1.1"
+```
+
+Note:
+The IPv4 address of the AppVM can easily be found via the Qubes Manger GUI or user's favorite CLI method
+
+#### *NetVM - CLI (Maker)*
+##### In `sys-haveno` NetVM:
+###### Prepare `haveno-dex` Hidden Service
+```shell
+# printf "\nConnectionPadding 1\nHiddenServiceDir /var/lib/tor/haveno-dex/\nHiddenServicePort 9999 :9999\n\n" >> /usr/local/etc/torrc.d/50_user.conf
+```
+
+###### View & Verify Change
+```shell
+# tail /usr/local/etc/torrc.d/50_user.conf
+```
+
+Confirm output contains exactly:
+
+> ConnectionPadding 1
+> HiddenServiceDir /var/lib/tor/haveno-dex/
+> HiddenServicePort 9999 :9999
+
+###### Restart `tor` Service
+```shell
+# systemctl restart tor@default.service
+```
+
+###### Display `haveno-dex` v3 onion address
+```shell
+# printf "$(Note:
+This value is a requirement to build the associated AppVM.
+
+###### Poweroff:
+```shell
+# poweroff
+```
+
+#### *AppVM - Scripted (Taker)*
+##### In `dispXXXX` AppVM:
+```shell
+$ qvm-copy haveno/scripts/install_qubes/scripts/3-AppVM/3.0-haveno-appvm_taker.sh
+```
+
++ Select "haveno" for "Target" of Pop-Up
+
++ Click OK
+
+##### In `haveno` AppVM:
+```shell
+% sudo zsh QubesIncoming/dispXXXX/3.0-haveno-appvm_taker.sh
+```
+
+#### *AppVM - CLI (Taker)*
+##### In `haveno` AppVM:
+###### Adjust `sdwdate` Configuration
+```shell
+# mkdir /usr/local/etc/sdwdate-gui.d
+# printf "gateway=sys-haveno\n" > /usr/local/etc/sdwdate-gui.d/50_user.conf
+```
+
+###### Prepare Firewall Settings via `/rw/config/rc.local`
+```shell
+# printf "\n# Prepare Local FW Settings\nmkdir -p /usr/local/etc/whonix_firewall.d\n" >> /rw/config/rc.local
+# printf "\n# Poke FW\nprintf \"EXTERNAL_OPEN_PORTS+=\\\\\" 9999 \\\\\"\\\n\" | tee /usr/local/etc/whonix_firewall.d/50_user.conf\n" >> /rw/config/rc.local
+# printf "\n# Restart FW\nwhonix_firewall\n\n" >> /rw/config/rc.local
+```
+
+###### View & Verify Change
+```shell
+# tail /rw/config/rc.local
+```
+
+Confirm output contains:
+
+> # Poke FW
+> printf "EXTERNAL_OPEN_PORTS+=\" 9999 \"\n" | tee /usr/local/etc/whonix_firewall.d/50_user.conf
+>
+> # Restart FW
+> whonix_firewall
+
+###### Restart `whonix_firewall`
+```shell
+# whonix_firewall
+```
+
+###### Create `haveno-Haveno.desktop`
+```shell
+# mkdir -p /home/$(ls /home)/\.local/share/applications
+# sed 's|/opt/haveno/bin/Haveno|/opt/haveno/bin/Haveno --torControlPort=9051 --socks5ProxyXmrAddress=127.0.0.1:9050 --useTorForXmr=on|g' /opt/haveno/lib/haveno-Haveno.desktop > /home/$(ls /home)/.local/share/applications/haveno-Haveno.desktop
+# chown -R $(ls /home):$(ls /home) /home/$(ls /home)/.local/share/applications/haveno-Haveno.desktop
+```
+
+###### View & Verify Change
+```shell
+# tail /home/$(ls /home)/.local/share/applications/haveno-Haveno.desktop
+```
+
+Confirm output contains:
+
+> [Desktop Entry]
+> Name=Haveno
+> Comment=Haveno
+> Exec=/opt/haveno/bin/Haveno --torControlPort=9051 --socks5ProxyXmrAddress=127.0.0.1:9050 --useTorForXmr=on
+> Icon=/opt/haveno/lib/Haveno.png
+> Terminal=false
+> Type=Application
+> Categories=Network
+> MimeType=
+
+###### Poweroff
+```shell
+# poweroff
+```
+
+#### *AppVM - Scripted (Maker)*
+##### In `dispXXXX` AppVM:
+```shell
+$ qvm-copy haveno/scripts/install_qubes/scripts/3-AppVM/3.1-haveno-appvm_maker.sh
+```
+
++ Select "haveno" for "Target" of Pop-Up
+
++ Click OK
+
+##### In `haveno`:
+```shell
+% sudo zsh QubesIncoming/dispXXXX/3.1-haveno-appvm_maker.sh ""
+```
+
+#### *AppVM - CLI (Maker)*
+##### In `haveno` AppVM:
+###### Adjust `sdwdate` Configuration
+```shell
+# mkdir /usr/local/etc/sdwdate-gui.d
+# printf "gateway=sys-haveno\n" > /usr/local/etc/sdwdate-gui.d/50_user.conf
+```
+
+###### Prepare Firewall Settings via `/rw/config/rc.local`
+```shell
+# printf "\n# Prepare Local FW Settings\nmkdir -p /usr/local/etc/whonix_firewall.d\n" >> /rw/config/rc.local
+# printf "\n# Poke FW\nprintf \"EXTERNAL_OPEN_PORTS+=\\\\\" 9999 \\\\\"\\\n\" | tee /usr/local/etc/whonix_firewall.d/50_user.conf\n" >> /rw/config/rc.local
+# printf "\n# Restart FW\nwhonix_firewall\n\n" >> /rw/config/rc.local
+```
+
+###### View & Verify Change
+```shell
+# tail /rw/config/rc.local
+```
+
+Confirm output contains:
+
+> # Poke FW
+> printf "EXTERNAL_OPEN_PORTS+=\" 9999 \"\n" | tee /usr/local/etc/whonix_firewall.d/50_user.conf
+>
+> # Restart FW
+> whonix_firewall
+
+###### Restart `whonix_firewall`
+```shell
+# whonix_firewall
+```
+
+###### Create `haveno-Haveno.desktop`
+```shell
+# mkdir -p /home/$(ls /home)/\.local/share/applications
+# sed "s|/opt/haveno/bin/Haveno|/opt/haveno/bin/Haveno --socks5ProxyXmrAddress=127.0.0.1:9050 --useTorForXmr=on --nodePort=9999 --hiddenServiceAddress=|g" /opt/haveno/lib/haveno-Haveno.desktop > /home/$(ls /home)/.local/share/applications/haveno-Haveno.desktop
+# chown -R $(ls /home):$(ls /home) /home/$(ls /home)/.local/share/applications
+```
+
+###### View & Verify Change
+```shell
+# tail /home/$(ls /home)/.local/share/applications/haveno-Haveno.desktop
+```
+
+Confirm output contains:
+
+> [Desktop Entry]
+> Name=Haveno
+> Comment=Haveno
+> Exec=/opt/haveno/bin/Haveno --socks5ProxyXmrAddress=127.0.0.1:9050 --useTorForXmr=on --nodePort=9999 --hiddenServiceAddress=
+> Icon=/opt/haveno/lib/Haveno.png
+> Terminal=false
+> Type=Application
+> Categories=Network
+> MimeType=
+
+###### Poweroff:
+```shell
+# poweroff
+```
+
+---
+
+### **Remove TemplateVM, NetVM & AppVM:**
+#### Scripted
+##### In `dom0`:
+```shell
+$ bash /tmp/haveno/0.3-dom0.sh
+```
+
+#### GUI
+##### Via `Qubes Manager`:
+
++ Highlight "haveno" (AppVM)
+
++ Click "Delete qube"
+
++ Enter "haveno"
+
++ Click "OK" Button
+
++ Highlight "haveno-template" (TemplateVM)
+
++ Click "Delete qube"
+
++ Enter "haveno-template"
+
++ Click "OK" Button
+
++ Highlight "sys-haveno" (NetVM)
+
++ Click "Delete qube"
+
++ Enter "sys-haveno"
+
++ Click "OK" Button
+
+#### CLI
+##### In `dom0`:
+```shell
+$ qvm-shutdown --force --quiet haveno haveno-template sys-haveno && qvm-remove --force --quiet haveno haveno-template sys-haveno
+```
+
+-------
+
+## *If this helped you, you know what to do*:
+### **XMR**:
+
+***85mRPDHW9SuGTDUoMJvt9W4u16Yp1j1SFDrcbfKH2vP1b59nZ62aKVqjfLoyxXrMZYMkNBGzAsuvCCDHPo4AHGx4K8Zmet6***
+
diff --git a/scripts/install_qubes/scripts/0-dom0/0.0-dom0.sh b/scripts/install_qubes/scripts/0-dom0/0.0-dom0.sh
new file mode 100644
index 0000000000..167f88dc5b
--- /dev/null
+++ b/scripts/install_qubes/scripts/0-dom0/0.0-dom0.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+## ./haveno-on-qubes/scripts/0.0-dom0.sh
+
+## Create & Start Haveno TemplateVM:
+qvm-clone whonix-workstation-17 haveno-template
+
diff --git a/scripts/install_qubes/scripts/0-dom0/0.1-dom0.sh b/scripts/install_qubes/scripts/0-dom0/0.1-dom0.sh
new file mode 100644
index 0000000000..befa8b6702
--- /dev/null
+++ b/scripts/install_qubes/scripts/0-dom0/0.1-dom0.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+## ./haveno-on-qubes/scripts/0.1-dom0.sh
+
+## Create Haveno NetVM:
+qvm-create --template whonix-gateway-17 --class AppVM --label=orange --property memory=512 --property maxmem=512 --property netvm=sys-firewall sys-haveno && qvm-prefs --set sys-haveno provides_network True
+
diff --git a/scripts/install_qubes/scripts/0-dom0/0.2-dom0.sh b/scripts/install_qubes/scripts/0-dom0/0.2-dom0.sh
new file mode 100644
index 0000000000..6f52637632
--- /dev/null
+++ b/scripts/install_qubes/scripts/0-dom0/0.2-dom0.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+## ./haveno-on-qubes/scripts/0.2-dom0.sh
+
+## Create Haveno AppVM:
+qvm-create --template haveno-template --class AppVM --label=orange --property memory=2048 --property maxmem=4096 --property netvm=sys-haveno haveno
+printf 'haveno-Haveno.desktop' | qvm-appmenus --set-whitelist - haveno
+
diff --git a/scripts/install_qubes/scripts/0-dom0/0.3-dom0.sh b/scripts/install_qubes/scripts/0-dom0/0.3-dom0.sh
new file mode 100644
index 0000000000..4bdae35533
--- /dev/null
+++ b/scripts/install_qubes/scripts/0-dom0/0.3-dom0.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+## ./haveno-on-qubes/scripts/0.3-dom0.sh
+
+## Remove Haveno GuestVMs
+qvm-shutdown --force --quiet haveno haveno-template sys-haveno && qvm-remove --force --quiet haveno haveno-template sys-haveno
+
diff --git a/scripts/install_qubes/scripts/1-TemplateVM/1.0-haveno-templatevm.sh b/scripts/install_qubes/scripts/1-TemplateVM/1.0-haveno-templatevm.sh
new file mode 100644
index 0000000000..be6d0d907f
--- /dev/null
+++ b/scripts/install_qubes/scripts/1-TemplateVM/1.0-haveno-templatevm.sh
@@ -0,0 +1,195 @@
+#!/bin/bash
+## ./haveno-on-qubes/scripts/1.1-haveno-templatevm_maker.sh
+
+
+function remote {
+ if [[ -z $PRECOMPILED_URL || -z $FINGERPRINT ]]; then
+ printf "\nNo arguments provided!\n\nThis script requires two arguments to be provided:\nBinary URL & PGP Fingerprint\n\nPlease review documentation and try again.\n\nExiting now ...\n"
+ exit 1
+ fi
+ ## Update & Upgrade
+ apt update && apt upgrade -y
+
+
+ ## Install wget
+ apt install -y wget
+
+
+ ## Function to print messages in blue:
+ echo_blue() {
+ echo -e "\033[1;34m$1\033[0m"
+ }
+
+
+ # Function to print error messages in red:
+ echo_red() {
+ echo -e "\033[0;31m$1\033[0m"
+ }
+
+
+ ## Sweep for old release files
+ rm *.asc desktop-*-SNAPSHOT-all.jar.SHA-256 haveno*
+
+
+ ## Define URL & PGP Fingerprint etc. vars:
+ user_url=$PRECOMPILED_URL
+ base_url=$(printf ${user_url} | awk -F'/' -v OFS='/' '{$NF=""}1')
+ expected_fingerprint=$FINGERPRINT
+ binary_filename=$(awk -F'/' '{ print $NF }' <<< "$user_url")
+ package_filename="haveno.deb"
+ signature_filename="${binary_filename}.sig"
+ key_filename="$(printf "$expected_fingerprint" | tr -d ' ' | sed -E 's/.*(................)/\1/' )".asc
+ wget_flags="--tries=10 --timeout=10 --waitretry=5 --retry-connrefused --show-progress"
+
+
+ ## Debug:
+ printf "\nUser URL=$user_url\n"
+ printf "\nBase URL=$base_url\n"
+ printf "\nFingerprint=$expected_fingerprint\n"
+ printf "\nBinary Name=$binary_filename\n"
+ printf "\nPackage Name=$package_filename\n"
+ printf "\nSig Filename=$signature_filename\n"
+ printf "\nKey Filename=$key_filename\n"
+
+
+ ## Configure for tinyproxy:
+ export https_proxy=http://127.0.0.1:8082
+
+
+ ## Download Haveno binary:
+ echo_blue "Downloading Haveno from URL provided ..."
+ wget "${wget_flags}" -cq "${user_url}" || { echo_red "Failed to download Haveno binary."; exit 1; }
+
+
+ ## Download Haveno signature file:
+ echo_blue "Downloading Haveno signature ..."
+ wget "${wget_flags}" -cq "${base_url}""${signature_filename}" || { echo_red "Failed to download Haveno signature."; exit 1; }
+
+
+ ## Download the GPG key:
+ echo_blue "Downloading signing GPG key ..."
+ wget "${wget_flags}" -cqO "${key_filename}" "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x$(echo "$expected_fingerprint" | tr -d ' ')" || { echo_red "Failed to download GPG key."; exit 1; }
+
+
+ ## Import the GPG key:
+ echo_blue "Importing the GPG key ..."
+ gpg --import "${key_filename}" || { echo_red "Failed to import GPG key."; exit 1; }
+
+
+ ## Extract imported fingerprints:
+ imported_fingerprints=$(gpg --with-colons --fingerprint | grep -A 1 'pub' | grep 'fpr' | cut -d: -f10 | tr -d '\n')
+
+
+ ## Remove spaces from the expected fingerprint for comparison:
+ formatted_expected_fingerprint=$(echo "${expected_fingerprint}" | tr -d ' ')
+
+
+ ## Check if the expected fingerprint is in the list of imported fingerprints:
+ if [[ ! "${imported_fingerprints}" =~ "${formatted_expected_fingerprint}" ]]; then
+ echo_red "The imported GPG key fingerprint does not match the expected fingerprint."
+ exit 1
+ fi
+
+
+ ## Verify the downloaded binary with the signature:
+ echo_blue "Verifying the signature of the downloaded file ..."
+ OUTPUT=$(gpg --digest-algo SHA256 --verify "${signature_filename}" "${binary_filename}" 2>&1)
+
+ if ! echo "$OUTPUT" | grep -q "Good signature from"; then
+ echo_red "Verification failed: $OUTPUT"
+ exit 1;
+ else 7z x "${binary_filename}" && mv haveno*.deb "${package_filename}"
+ fi
+
+
+ echo_blue "Haveno binaries have been successfully verified."
+
+
+ # Install Haveno:
+ echo_blue "Installing Haveno ..."
+ apt install -y ./"${package_filename}" || { echo_red "Failed to install Haveno."; exit 1; }
+
+
+ ## Adjust permissions:
+ echo_blue "Adjust permissions ..."
+ chown -R $(ls /home):$(ls /home) /opt/haveno
+
+
+ ## Finalize
+ echo_blue "Haveno TemplateVM installation and configuration complete."
+ printf "%s \n" "Press [ENTER] to complete ..."
+ read ans
+ #exit
+ poweroff
+}
+
+
+function build {
+ if [[ -z $JAVA_URL || -z $JAVA_SHA1 || -z $SOURCE_URL ]]; then
+ printf "\nNo arguments provided!\n\nThis script requires three argument to be provided:\n\nURL for Java 21 JDK Debian Package\n\nSHA1 Hash for Java 21 JDK Debian Package\n\nURL for Remote Git Source Repository\n\nPlease review documentation and try again.\n\nExiting now ...\n"
+ exit 1
+ fi
+ # Dependancies
+ sudo apt install -y make git expect fakeroot
+
+ # Java
+ curl -fsSLo jdk21.deb ${JAVA_URL}
+ if [[ $(shasum ./jdk21.deb | awk '{ print $1 }') == ${JAVA_SHA1} ]] ; then printf $'SHA Hash IS valid!\n'; else printf $'WARNING: Bad Hash!\n' && exit; fi
+ sudo apt install -y ./jdk21.deb
+
+ # Build
+ git clone --depth=1 $SOURCE_URL
+ cd haveno
+ git checkout master
+ sed -i 's|XMR_STAGENET|XMR_MAINNET|g' desktop/package/package.gradle
+ ./gradlew clean build --refresh-keys --refresh-dependencies
+
+ # Package
+ # Expect
+ cat <> /tmp/haveno_package_deb.exp
+set send_slow {1 .1}
+proc send {ignore arg} {
+ sleep 1.1
+ exp_send -s -- \$arg
+}
+set timeout -1
+spawn ./gradlew packageInstallers --console=plain
+match_max 100000
+expect -exact ""
+send -- "y\r"
+expect -exact ""
+send -- "y\r"
+expect -exact ""
+send -- "y\r"
+expect -exact "app-image"
+send -- ""
+expect eof
+DONE
+
+ # Package
+ expect -f /tmp/haveno_package_deb.exp && find ./ -name '*.deb' -exec qvm-copy {} \;
+
+}
+
+if [[ $# -eq 2 ]] ; then
+ PRECOMPILED_URL=$1
+ FINGERPRINT=$2
+fi
+
+if [[ $# -eq 3 ]] ; then
+ JAVA_URL=$1
+ JAVA_SHA1=$2
+ SOURCE_URL=$3
+fi
+
+
+read -p $'Do you want to:\nInstall precompiled binary from remote git repository? (r)\n\n\t\tOR\n\nBuild source from remote git repository? (b)\n\n' rb
+
+case $rb in
+ [rR] ) remote;;
+ [bB] ) build;;
+ * ) printf "\nInvalid Input.\n\nPlease Try again.\n";
+ # exit 1;;
+esac
+
+printf "\nCheers m8!\n"
diff --git a/scripts/install_qubes/scripts/2-NetVM/2.0-haveno-netvm_taker.sh b/scripts/install_qubes/scripts/2-NetVM/2.0-haveno-netvm_taker.sh
new file mode 100644
index 0000000000..d29e61dcf5
--- /dev/null
+++ b/scripts/install_qubes/scripts/2-NetVM/2.0-haveno-netvm_taker.sh
@@ -0,0 +1,30 @@
+#!/bin/zsh
+## ./haveno-on-qubes/scripts/2.0-haveno-netvm_taker.sh
+
+## Function to print messages in blue:
+echo_blue() {
+ echo -e "\033[1;34m$1\033[0m"
+}
+
+
+# Function to print error messages in red:
+echo_red() {
+ echo -e "\033[0;31m$1\033[0m"
+}
+
+
+## onion-grater
+# Add onion-grater Profile
+echo_blue "\nAdding onion-grater Profile ..."
+onion-grater-add 40_haveno
+
+
+# Restart onion-grater
+echo_blue "\nRestarting onion-grater Service ..."
+systemctl restart onion-grater.service
+echo_blue "Haveno NetVM configuration complete."
+printf "%s \n" "Press [ENTER] to complete ..."
+read ans
+#exit
+poweroff
+
diff --git a/scripts/install_qubes/scripts/2-NetVM/2.1-haveno-netvm_maker.sh b/scripts/install_qubes/scripts/2-NetVM/2.1-haveno-netvm_maker.sh
new file mode 100644
index 0000000000..b2595e8c62
--- /dev/null
+++ b/scripts/install_qubes/scripts/2-NetVM/2.1-haveno-netvm_maker.sh
@@ -0,0 +1,52 @@
+#!/bin/zsh
+## ./haveno-on-qubes/scripts/2.1-haveno-netvm_maker.sh
+
+if [[ $# -ne 1 ]] ; then
+ printf "\nNo arguments provided!\n\nThis script requires an argument to be provided:\nIP Address of Haveno AppVM\n\nPlease review documentation and try again.\n\nExiting now ...\n"
+ exit 1
+fi
+
+
+HAVENO_APPVM_IP=$1
+
+## Function to print messages in blue:
+echo_blue() {
+ echo -e "\033[1;34m$1\033[0m"
+}
+
+
+# Function to print error messages in red:
+echo_red() {
+ echo -e "\033[0;31m$1\033[0m"
+}
+
+
+# Prepare Maker Hidden Service
+echo_blue "\nConfiguring Hidden Service (Onion) ..."
+printf "\n## Haveno-DEX\nConnectionPadding 1\nHiddenServiceDir /var/lib/tor/haveno-dex/\nHiddenServicePort 9999 $HAVENO_APPVM_IP:9999\n\n" >> /usr/local/etc/torrc.d/50_user.conf
+
+
+## View & Verify Change
+echo_blue "\nReview the following output and be certain in matches documentation!\n"
+tail /usr/local/etc/torrc.d/50_user.conf
+printf "%s \n" "Press [ENTER] to continue ..."
+read ans
+
+
+## Restart tor
+echo_blue "\nRestarting tor Service ..."
+systemctl restart tor@default.service
+
+
+## Display onion address
+sleep 3
+printf "$("
+printf "%s \n" "Press [ENTER] after building AppVM ..."
+read ans
+echo_blue "Haveno NetVM configuration complete."
+printf "%s \n" "Press [ENTER] to complete ..."
+read ans
+#exit
+poweroff
+
diff --git a/scripts/install_qubes/scripts/3-AppVM/3.0-haveno-appvm_taker.sh b/scripts/install_qubes/scripts/3-AppVM/3.0-haveno-appvm_taker.sh
new file mode 100644
index 0000000000..ced9d3bba2
--- /dev/null
+++ b/scripts/install_qubes/scripts/3-AppVM/3.0-haveno-appvm_taker.sh
@@ -0,0 +1,60 @@
+#!/bin/zsh
+## ./haveno-on-qubes/scripts/3.0-haveno-appvm_taker.sh
+
+## Function to print messages in blue:
+echo_blue() {
+ echo -e "\033[1;34m$1\033[0m"
+}
+
+
+# Function to print error messages in red:
+echo_red() {
+ echo -e "\033[0;31m$1\033[0m"
+}
+
+
+## Adjust sdwdate Configuration
+mkdir -p /usr/local/etc/sdwdate-gui.d
+printf "gateway=sys-haveno\n" > /usr/local/etc/sdwdate-gui.d/50_user.conf
+
+
+## Prepare Firewall Settings
+echo_blue "\nConfiguring FW ..."
+printf "\n# Prepare Local FW Settings\nmkdir -p /usr/local/etc/whonix_firewall.d\n" >> /rw/config/rc.local
+printf "\n# Poke FW\nprintf \"EXTERNAL_OPEN_PORTS+=\\\\\" 9999 \\\\\"\\\n\" | tee /usr/local/etc/whonix_firewall.d/50_user.conf\n" >> /rw/config/rc.local
+printf "\n# Restart FW\nwhonix_firewall\n\n" >> /rw/config/rc.local
+
+
+## View & Verify Change
+echo_blue "\nReview the following output and be certain in matches documentation!\n"
+tail /rw/config/rc.local
+printf "%s \n" "Press [ENTER] to continue ..."
+read ans
+:
+
+
+## Restart FW
+echo_blue "\nRestarting Whonix FW ..."
+whonix_firewall
+
+
+### Create Desktop Launcher:
+echo_blue "Creating desktop launcher ..."
+mkdir -p /home/$(ls /home)/\.local/share/applications
+sed 's|/opt/haveno/bin/Haveno|/opt/haveno/bin/Haveno --torControlPort=9051 --socks5ProxyXmrAddress=127.0.0.1:9050 --useTorForXmr=on|g' /opt/haveno/lib/haveno-Haveno.desktop > /home/$(ls /home)/.local/share/applications/haveno-Haveno.desktop
+chown -R $(ls /home):$(ls /home) /home/$(ls /home)/.local/share/applications/haveno-Haveno.desktop
+
+
+## View & Verify Change
+echo_blue "\nReview the following output and be certain in matches documentation!\n"
+tail /home/$(ls /home)/.local/share/applications/haveno-Haveno.desktop
+printf "%s \n" "Press [ENTER] to continue ..."
+read ans
+:
+
+echo_blue "Haveno AppVM configuration complete."
+echo_blue "Refresh applications via Qubes Manager GUI now."
+printf "%s \n" "Press [ENTER] to complete ..."
+read ans
+#exit
+poweroff
diff --git a/scripts/install_qubes/scripts/3-AppVM/3.1-haveno-appvm_maker.sh b/scripts/install_qubes/scripts/3-AppVM/3.1-haveno-appvm_maker.sh
new file mode 100644
index 0000000000..dcf502ca68
--- /dev/null
+++ b/scripts/install_qubes/scripts/3-AppVM/3.1-haveno-appvm_maker.sh
@@ -0,0 +1,71 @@
+#!/bin/zsh
+## ./haveno-on-qubes/scripts/3.1-haveno-appvm_maker.sh
+
+if [[ $# -ne 1 ]] ; then
+ printf "\nNo arguments provided!\n\nThis script requires an argument to be provided:\nOnion Address of Haveno NetVM\n\nPlease review documentation and try again.\n\nExiting now ...\n"
+ exit 1
+fi
+
+
+## Function to print messages in blue:
+echo_blue() {
+ echo -e "\033[1;34m$1\033[0m"
+}
+
+
+# Function to print error messages in red:
+echo_red() {
+ echo -e "\033[0;31m$1\033[0m"
+}
+
+
+ONION=$1
+
+
+## Adjust sdwdate Configuration
+mkdir -p /usr/local/etc/sdwdate-gui.d
+printf "gateway=sys-haveno\n" > /usr/local/etc/sdwdate-gui.d/50_user.conf
+
+
+## Prepare Firewall Settings
+echo_blue "\nConfiguring FW ..."
+printf "\n# Prepare Local FW Settings\nmkdir -p /usr/local/etc/whonix_firewall.d\n" >> /rw/config/rc.local
+printf "\n# Poke FW\nprintf \"EXTERNAL_OPEN_PORTS+=\\\\\" 9999 \\\\\"\\\n\" | tee /usr/local/etc/whonix_firewall.d/50_user.conf\n" >> /rw/config/rc.local
+printf "\n# Restart FW\nwhonix_firewall\n\n" >> /rw/config/rc.local
+
+
+## View & Verify Change
+echo_blue "\nReview the following output and be certain in matches documentation!\n"
+tail /rw/config/rc.local
+printf "%s \n" "Press [ENTER] to continue ..."
+read ans
+:
+
+
+## Restart FW
+echo_blue "\nRestarting Whonix FW ..."
+whonix_firewall
+
+
+### Create Desktop Launcher:
+echo_blue "Creating desktop launcher ..."
+mkdir -p /home/$(ls /home)/\.local/share/applications
+sed "s|/opt/haveno/bin/Haveno|/opt/haveno/bin/Haveno --socks5ProxyXmrAddress=127.0.0.1:9050 --useTorForXmr=on --nodePort=9999 --hiddenServiceAddress=$ONION|g" /opt/haveno/lib/haveno-Haveno.desktop > /home/$(ls /home)/.local/share/applications/haveno-Haveno.desktop
+chown -R $(ls /home):$(ls /home) /home/$(ls /home)/.local/share/applications
+
+
+## View & Verify Change
+echo_blue "\nReview the following output and be certain in matches documentation!\n"
+tail /home/$(ls /home)/.local/share/applications/haveno-Haveno.desktop
+printf "%s \n" "Press [ENTER] to continue ..."
+read ans
+:
+
+
+echo_blue "Haveno AppVM configuration complete."
+echo_blue "Refresh applications via Qubes Manager GUI now."
+printf "%s \n" "Press [ENTER] to complete ..."
+read ans
+#exit
+poweroff
+