V8.00.000.2025.06.17
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 41s
All checks were successful
🛡️ Shell Script Linting / 🛡️ Shell Script Linting (push) Successful in 41s
Signed-off-by: Marc S. Weidner <msw@coresecret.dev>
This commit is contained in:
@@ -37,15 +37,16 @@ recipe:
|
||||
member: 4
|
||||
spare: 1
|
||||
level: 6 # Only Level "1", "5", "6" and "10" are supported.
|
||||
meta: 1.2 # Metadata Format. Default to '1.2'.
|
||||
table: "gpt" # MUST be "gpt" for "UEFI" || "msdos":
|
||||
syntax: true # This is set to "false" by default, otherwise if the recipe is tested by the authors to "true".
|
||||
### Version of the specific recipe.
|
||||
version: "1.1.4"
|
||||
version: "1.1.5"
|
||||
dev:
|
||||
sda:
|
||||
1:
|
||||
begin: "2MiB"
|
||||
end: "512MiB"
|
||||
end: "1024MiB"
|
||||
bootable: false
|
||||
encryption:
|
||||
enable: false # MUST be "false" for "/boot/efi"
|
||||
@@ -78,7 +79,7 @@ recipe:
|
||||
path: "/boot/efi"
|
||||
primary: primary
|
||||
2:
|
||||
begin: "512MiB"
|
||||
begin: "1024MiB"
|
||||
end: "2GiB"
|
||||
bootable: false
|
||||
encryption:
|
||||
@@ -113,7 +114,7 @@ recipe:
|
||||
primary: primary
|
||||
3:
|
||||
begin: "2GiB"
|
||||
end: "6GiB"
|
||||
end: "10GiB"
|
||||
bootable: false
|
||||
encryption:
|
||||
enable: true
|
||||
@@ -146,8 +147,8 @@ recipe:
|
||||
path: "/recovery"
|
||||
primary: primary
|
||||
4:
|
||||
begin: "6GiB"
|
||||
end: "8GiB"
|
||||
begin: "10GiB"
|
||||
end: "14GiB"
|
||||
bootable: false
|
||||
encryption:
|
||||
enable: true # MUST be "true" for ephemeral "SWAP"
|
||||
@@ -180,8 +181,8 @@ recipe:
|
||||
path: "SWAP"
|
||||
primary: primary
|
||||
5:
|
||||
begin: "8GiB"
|
||||
end: "10GiB"
|
||||
begin: "14GiB"
|
||||
end: "18GiB"
|
||||
bootable: false
|
||||
encryption:
|
||||
enable: true # MUST be "true" for ephemeral "/tmp"
|
||||
@@ -214,7 +215,7 @@ recipe:
|
||||
path: "/tmp"
|
||||
primary: primary
|
||||
6:
|
||||
begin: "10GiB"
|
||||
begin: "18GiB"
|
||||
end: "42GiB"
|
||||
bootable: false
|
||||
encryption:
|
||||
@@ -453,7 +454,7 @@ recipe:
|
||||
primary: primary
|
||||
13:
|
||||
begin: "238GiB"
|
||||
end: "-1"
|
||||
end: "-1" # The last 16 MiB will be reserved for GPT metadata.
|
||||
bootable: false
|
||||
encryption:
|
||||
enable: true
|
||||
|
||||
@@ -20,51 +20,73 @@
|
||||
# default login shell has been zsh, but bash remains available at '/bin/bash'. Windows support. You can use bash via WSL, MSYS2,
|
||||
# or Cygwin on Windows systems.
|
||||
|
||||
### PRELIMINARY CHECKS
|
||||
# shellcheck disable=2292
|
||||
[ -z "${BASH_VERSINFO[0]}" ] && {
|
||||
. ./meta_loader_early.sh
|
||||
### CATCH ARGUMENTS AND DECLARE BASIC VARIABLES.
|
||||
# shellcheck disable=SC2155
|
||||
declare -grx VAR_PARAM_COUNT="$#" # Arguments passed to script.
|
||||
declare -grx VAR_PARAM_STRNG="$*" # Arguments passed to script as string.
|
||||
declare -ag ARY_PARAM_ARRAY=("$@") # Arguments passed to script as an array.
|
||||
declare -grx VAR_SETUP_FILE="${0##*/}" # 'setup.sh'
|
||||
declare -grx VAR_SETUP_PATH="$(cd "$(dirname "${0}")" && pwd)" # '/opt/git/CISS.debian.installer'
|
||||
declare -grx VAR_SETUP_FULL="$(cd "$(dirname "${0}")" && pwd)/${0##*/}" # '/opt/git/CISS.debian.installer/setup.sh'
|
||||
|
||||
### PRELIMINARY CHECKS.
|
||||
### No ash, dash, ksh, sh, zsh.
|
||||
# shellcheck disable=2292
|
||||
[ -z "${BASH_VERSINFO[0]}" ] && {
|
||||
. /../../meta_loader_early.sh
|
||||
printf "%b❌ Please make sure you are using 'bash'! Bye... %b%b" "${RED}" "${RES}" "${NL}" >&2
|
||||
exit "${ERR_UNSUPPORTED_BASH}"
|
||||
}
|
||||
|
||||
[[ ${EUID} -ne 0 ]] && {
|
||||
. ./meta_loader_early.sh
|
||||
### Not root.
|
||||
[[ ${EUID} -ne 0 ]] && {
|
||||
. /../../meta_loader_early.sh
|
||||
printf "%b❌ Please make sure you are 'root'! Bye... %b%b" "${RED}" "${RES}" "${NL}" >&2
|
||||
exit "${ERR_USER_IS_NOT_ROOT}"
|
||||
}
|
||||
|
||||
# shellcheck disable=2312
|
||||
[[ $(kill -l | grep -c SIG) -eq 0 ]] && {
|
||||
. ./meta_loader_early.sh
|
||||
### Not called by sh.
|
||||
# shellcheck disable=2312
|
||||
[[ $(kill -l | grep -c SIG) -eq 0 ]] && {
|
||||
. /../../meta_loader_early.sh
|
||||
printf "%b❌ Please make sure you are calling the script without leading 'sh'! Bye... %b%b" "${RED}" "${RES}" "${NL}" >&2
|
||||
exit "${ERR_UNSUPPORTED_BASH}"
|
||||
}
|
||||
|
||||
[[ ${BASH_VERSINFO[0]} -lt 5 ]] && {
|
||||
. ./meta_loader_early.sh
|
||||
### Not sourced.
|
||||
[[ "${BASH_SOURCE[0]}" != "$0" ]] && {
|
||||
. /../../meta_loader_early.sh
|
||||
printf "%b❌ This script must be executed, not sourced. Please run './setup.sh' directly. %b%b" "${RED}" "${RES}" "${NL}" >&2
|
||||
exit "${ERR_UNSUPPORTED_BASH}"
|
||||
}
|
||||
|
||||
### Minimum Bash version 5.
|
||||
[[ ${BASH_VERSINFO[0]} -lt 5 ]] && {
|
||||
. /../../meta_loader_early.sh
|
||||
printf "%b❌ Minimum requirement is bash 5.1. You are using '%s'! Bye... %b%b" "${RED}" "${BASH_VERSION}" "${RES}" "${NL}" >&2
|
||||
exit "${ERR_UNSUPPORTED_BASH}"
|
||||
}
|
||||
|
||||
[[ ${BASH_VERSINFO[0]} -le 5 ]] && [[ ${BASH_VERSINFO[1]} -le 1 ]] && {
|
||||
. ./meta_loader_early.sh
|
||||
### Minimum Bash version 5.1.
|
||||
[[ ${BASH_VERSINFO[0]} -le 5 ]] && [[ ${BASH_VERSINFO[1]} -le 1 ]] && {
|
||||
. /../../meta_loader_early.sh
|
||||
printf "%b❌ Minimum requirement is bash 5.1. You are using '%s'! Bye... %b%b" "${RED}" "${BASH_VERSION}" "${RES}" "${NL}" >&2
|
||||
exit "${ERR_UNSUPPORTED_BASH}"
|
||||
}
|
||||
|
||||
[[ ${#} -eq 0 ]] && {
|
||||
. ./lib/0000_usage.sh; usage >&2; exit 1; }
|
||||
### No arguments.
|
||||
[[ ${#} -eq 0 ]] && {
|
||||
. . /../../meta_loader_early.sh
|
||||
usage >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
### CHECK FOR CONTACT, HELP, AND VERSION STRING.
|
||||
for arg in "$@"; do case "${arg,,}" in -c|--contact) . ./meta_loader_cuv.sh; contact; exit 0;; esac; done
|
||||
for arg in "$@"; do case "${arg,,}" in -h|--help) . ./meta_loader_cuv.sh; usage; exit 0;; esac; done
|
||||
for arg in "$@"; do case "${arg,,}" in -h|--help) . ./meta_loader_cuv.sh; usage ; exit 0;; esac; done
|
||||
for arg in "$@"; do case "${arg,,}" in -v|--version) . ./meta_loader_cuv.sh; version; exit 0;; esac; done
|
||||
|
||||
### SOURCING MUST SET EARLY VARIABLES. SOURCING COLOR_ECHO() AND GUARD_SOURCING().
|
||||
declare -grx VAR_PARAM_COUNT="$#"
|
||||
declare -grx VAR_PARAM_STRNG="$*"
|
||||
declare -ag ARY_PARAM_ARRAY=("$@")
|
||||
. ./lib/0010_guard_sourcing.sh
|
||||
. ./lib/0010_source_guard.sh
|
||||
source_guard "./var/color.var.sh"
|
||||
@@ -121,8 +143,8 @@ for arg in "$@"; do case "${arg,,}" in -a|--autoinstall) declare -gx VAR_AUTO_IN
|
||||
### ACTIVATING TRAPS.
|
||||
color_echo "${CYA}" "ACTIVATING TRAPS."
|
||||
trap 'trap_exit "$?" "${BASH_SOURCE[0]}" "${LINENO}" "${FUNCNAME[0]:-main}" "${BASH_COMMAND}"' EXIT
|
||||
trap 'trap_int' INT TERM
|
||||
trap 'trap_err "$?" "${BASH_SOURCE[0]}" "${LINENO}" "${FUNCNAME[0]:-main}" "${BASH_COMMAND}"' ERR
|
||||
trap 'trap_int' INT TERM
|
||||
|
||||
### INTERACTIVE MODE NOTES AND KERNEL SELECTION.
|
||||
# TODO: Update 0110_check_kernel.sh & sourcing
|
||||
|
||||
@@ -109,7 +109,7 @@ partitioning() {
|
||||
|
||||
### Assign the landing zone of each partition.
|
||||
if [[ "${var_end}" == "-1" ]]; then
|
||||
var_end_arg="100%"
|
||||
var_end_arg="-16MiB"
|
||||
else
|
||||
var_end_arg="${var_end}"
|
||||
fi
|
||||
@@ -189,6 +189,9 @@ partitioning() {
|
||||
|
||||
done
|
||||
|
||||
lsblk -o NAME,START,SIZE,PHY-SEC,LOG-SEC,ALIGNMENT "/dev/${var_dev}" >| "${DIR_LOG}/${var_dev}_alignment.log"
|
||||
sgdisk -p "/dev/${var_dev}" >| "${DIR_LOG}/${var_dev}_info.log"
|
||||
|
||||
done
|
||||
|
||||
return 0
|
||||
|
||||
@@ -71,6 +71,8 @@ setup_filesystem() {
|
||||
|
||||
done
|
||||
|
||||
lsblk -o NAME,MAJ:MIN,FSTYPE,FSVER,SIZE,UUID,MOUNTPOINT,PATH "/dev/${var_dev}" >| "${DIR_LOG}/${var_dev}_overview.log"
|
||||
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ skip_path() {
|
||||
# 3: MOUNT_OPTIONS
|
||||
#######################################
|
||||
mount_with_dir() {
|
||||
declare var_mount_path="$1" var_mount_device="$2" var_mount_options="$3"
|
||||
declare var_mount_path="$1" var_mount_device="$2" var_mount_options="$3:-"
|
||||
|
||||
[[ "${var_mount_path}" != "/" ]] && mkdir -p "${TARGET}${var_mount_path}"
|
||||
|
||||
|
||||
@@ -137,42 +137,44 @@ trap_exit_non_zero() {
|
||||
gauge ) dialog_gauge_cleaner ;;
|
||||
esac
|
||||
clean_up "${var_code}"
|
||||
printf "%b❌ Trap on 'EXIT' : CISS.debian.installer Script failed. %b%b" "${RED}" "${RES}" "${NL}"
|
||||
printf "%b❌ : This was most probably caused by an unbound variable. %b%b" "${RED}" "${RES}" "${NL}"
|
||||
printf "%b❌ GIT Commit : %s %b%b" "${RED}" "${VAR_GIT_REL}" "${RES}" "${NL}"
|
||||
printf "%b❌ Version : %s %b%b" "${RED}" "${VAR_VERSION}" "${RES}" "${NL}"
|
||||
printf "%b❌ Epoch : %s %b%b" "${RED}" "${EPOCHREALTIME}" "${RES}" "${NL}"
|
||||
printf "%b❌ Bash MAJ Release : %s %b%b" "${RED}" "${BASH_VERSINFO[0]}" "${RES}" "${NL}"
|
||||
printf "%b❌ Bash MIN Version : %s %b%b" "${RED}" "${BASH_VERSINFO[1]}" "${RES}" "${NL}"
|
||||
printf "%b❌ Bash Patch Level : %s %b%b" "${RED}" "${BASH_VERSINFO[2]}" "${RES}" "${NL}"
|
||||
printf "%b❌ UID : %s %b%b" "${RED}" "${UID}" "${RES}" "${NL}"
|
||||
printf "%b❌ EUID : %s %b%b" "${RED}" "${EUID}" "${RES}" "${NL}"
|
||||
printf "%b❌ Hostname : %s %b%b" "${RED}" "${HOSTNAME}" "${RES}" "${NL}"
|
||||
printf "%b❌ Hostsystem : %s %b%b" "${RED}" "${VAR_SYSTEM}" "${RES}" "${NL}"
|
||||
printf "%b❌ Error : %s %b%b" "${RED}" "${var_code}" "${RES}" "${NL}"
|
||||
printf "%b❌ Line : %s %b%b" "${RED}" "${var_line}" "${RES}" "${NL}"
|
||||
printf "%b❌ Script : %s %b%b" "${RED}" "${var_scrt}" "${RES}" "${NL}"
|
||||
printf "%b❌ Function : %s %b%b" "${RED}" "${var_func}" "${RES}" "${NL}"
|
||||
printf "%b❌ Command : %s %b%b" "${RED}" "${var_cmmd}" "${RES}" "${NL}"
|
||||
printf "%b❌ Script PID : %s %b%b" "${RED}" "${$}" "${RES}" "${NL}"
|
||||
printf "%b❌ Script Runtime : %s %b%b" "${RED}" "${SECONDS}" "${RES}" "${NL}"
|
||||
printf "%b❌ Arguments Counter : %s %b%b" "${RED}" "${VAR_PARAM_COUNT}" "${RES}" "${NL}"
|
||||
printf "%b❌ Arguments Original : %s %b%b" "${RED}" "${VAR_PARAM_STRNG}" "${RES}" "${NL}"
|
||||
printf "%b❌ Arguments Sanitized : %s %b%b" "${RED}" "${VAR_ARG_SANITIZED}" "${RES}" "${NL}"
|
||||
printf "%b❌ Trap on 'EXIT' : CISS.debian.installer Script failed. %b%b" "${RED}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ : This was most probably caused by an unbound variable. %b%b" "${RED}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ GIT Commit : %s %b%b" "${RED}" "${VAR_GIT_REL}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Version : %s %b%b" "${RED}" "${VAR_VERSION}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Epoch : %s %b%b" "${RED}" "${EPOCHREALTIME}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Bash MAJ Release : %s %b%b" "${RED}" "${BASH_VERSINFO[0]}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Bash MIN Version : %s %b%b" "${RED}" "${BASH_VERSINFO[1]}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Bash Patch Level : %s %b%b" "${RED}" "${BASH_VERSINFO[2]}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ UID : %s %b%b" "${RED}" "${UID}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ EUID : %s %b%b" "${RED}" "${EUID}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Hostname : %s %b%b" "${RED}" "${HOSTNAME}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Hostsystem : %s %b%b" "${RED}" "${VAR_SYSTEM}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Error : %s %b%b" "${RED}" "${var_code}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Line : %s %b%b" "${RED}" "${var_line}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Script : %s %b%b" "${RED}" "${var_scrt}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Function : %s %b%b" "${RED}" "${var_func}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Command : %s %b%b" "${RED}" "${var_cmmd}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Script PID : %s %b%b" "${RED}" "${$}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Script Runtime : %s %b%b" "${RED}" "${SECONDS}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Arguments Counter : %s %b%b" "${RED}" "${VAR_PARAM_COUNT}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Arguments Original : %s %b%b" "${RED}" "${VAR_PARAM_STRNG}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Arguments Sanitized : %s %b%b" "${RED}" "${VAR_ARG_SANITIZED}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ Error Log saved at : %s %b%b" "${RED}" "${LOG_ERR}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ cat %s %b%b" "${RED}" "${LOG_ERR}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
if [[ "${VAR_DEBUG_TRACE}" == "true" || "${VAR_DEBUG_TRAP}" == "true" ]]; then
|
||||
printf "%b❌ Vars Dump saved at : %s %b%b" "${RED}" "${LOG_VAR}" "${RES}" "${NL}"
|
||||
printf "%b❌ cat %s %b%b" "${RED}" "${LOG_VAR}" "${RES}" "${NL}"
|
||||
printf "%b❌ less -R %s %b%b" "${RED}" "${LOG_VAR}" "${RES}" "${NL}"
|
||||
printf "%b❌ Vars Dump saved at : %s %b%b" "${RED}" "${LOG_VAR}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ cat %s %b%b" "${RED}" "${LOG_VAR}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ less -R %s %b%b" "${RED}" "${LOG_VAR}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
fi
|
||||
if [[ "${VAR_DEBUG_TRAP}" == "true" ]]; then
|
||||
printf "%b❌ Debug Log saved at : %s %b%b" "${RED}" "${LOG_DBG}" "${RES}" "${NL}"
|
||||
printf "%b❌ cat %s %b%b" "${RED}" "${LOG_DBG}" "${RES}" "${NL}"
|
||||
printf "%b❌ less -R %s %b%b" "${RED}" "${LOG_DBG}" "${RES}" "${NL}"
|
||||
printf "%b❌ Debug Log saved at : %s %b%b" "${RED}" "${LOG_DBG}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ cat %s %b%b" "${RED}" "${LOG_DBG}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ less -R %s %b%b" "${RED}" "${LOG_DBG}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
fi
|
||||
if [[ "${VAR_DEBUG_TRACE}" == "true" ]]; then
|
||||
printf "%b❌ Trace Log saved at : %s %b%b" "${RED}" "${LOG_TRC}" "${RES}" "${NL}"
|
||||
printf "%b❌ cat %s %b%b" "${RED}" "${LOG_TRC}" "${RES}" "${NL}"
|
||||
printf "%b❌ less -R %s %b%b" "${RED}" "${LOG_TRC}" "${RES}" "${NL}"
|
||||
printf "%b❌ Trace Log saved at : %s %b%b" "${RED}" "${LOG_TRC}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ cat %s %b%b" "${RED}" "${LOG_TRC}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
printf "%b❌ less -R %s %b%b" "${RED}" "${LOG_TRC}" "${RES}" "${NL}" | tee "${LOG_ERR}"
|
||||
fi
|
||||
print_stacktrace
|
||||
fi
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
|
||||
### SOURCING CONTACT, USAGE, VERSION MODULES FOR RAPID REACTION.
|
||||
|
||||
. ./lib/0000_usage.sh
|
||||
. ./lib/0001_contact.sh
|
||||
. ./lib/0002_version.sh
|
||||
. ./lib/0002_usage.sh
|
||||
. ./lib/0003_version.sh
|
||||
. ./var/early.var.sh
|
||||
|
||||
# vim: number et ts=2 sw=2 sts=2 ai tw=128 ft=sh
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
guard_sourcing
|
||||
|
||||
### Definition of MUST set early variables.
|
||||
|
||||
declare -grx VAR_CONTACT="security@coresecret.eu"
|
||||
declare -grx VAR_VERSION="Master V8.00.000.2025.06.17"
|
||||
# shellcheck disable=SC2155
|
||||
|
||||
@@ -22,11 +22,7 @@ declare -grx VAR_KERNEL_TMP=$(mktemp var_kernel_tmp.XXXXXXXX)
|
||||
declare -grx VAR_KERNEL_SRT=$(mktemp var_kernel_srt.XXXXXXXX)
|
||||
# shellcheck disable=SC2155
|
||||
declare -grx VAR_NOTES=$(mktemp var_notes.XXXXXXXX)
|
||||
declare -grx VAR_SETUP_FILE="${0##*/}" # 'setup.sh'
|
||||
# shellcheck disable=SC2155
|
||||
declare -grx VAR_SETUP_PATH="$(cd "$(dirname "${0}")" && pwd)" # '/opt/git/CISS.debian.installer'
|
||||
# shellcheck disable=SC2155
|
||||
declare -grx VAR_SETUP_FULL="$(cd "$(dirname "${0}")" && pwd)/${0##*/}" # '/opt/git/CISS.debian.installer/setup.sh'
|
||||
|
||||
|
||||
### Initialize variables of different directories.
|
||||
declare -grx DIR_BAK="/tmp/.ciss/backup"
|
||||
|
||||
Reference in New Issue
Block a user