978 lines
25 KiB
Bash
Executable File
978 lines
25 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
script_name="$(basename $(realpath $0))"
|
|
working_dir="$(dirname $(realpath $0))"
|
|
|
|
LOCK_DIR="/tmp/$(basename $0).$$.LOCK"
|
|
log_file="${LOCK_DIR}/${script_name%%.*}.log"
|
|
|
|
|
|
|
|
# ----------
|
|
# Base Function(s)
|
|
# ----------
|
|
|
|
usage() {
|
|
|
|
|
|
[[ -n "$1" ]] && error "$1"
|
|
|
|
|
|
[[ $terminal ]] && echo -e "
|
|
\033[1mUsage:\033[m
|
|
|
|
$(basename $0) [ OPTION [ OPTION .. ] ]
|
|
|
|
\033[1mDescription\033[m
|
|
|
|
Creates a fresh new schleuder3 list. Parameters not given at
|
|
commandline will be asked for.
|
|
|
|
\033[1mNotice\033[m
|
|
|
|
At time, this script supports only SQLite list database.
|
|
|
|
\033[1mOptions\033[m
|
|
|
|
All options are optional.
|
|
|
|
-d <domain>
|
|
Domain part of list address.
|
|
|
|
-e <admin-email-address>
|
|
E-mail address of the list admin
|
|
|
|
-f <fq-path-to-key-file>
|
|
Full qualified path to the key file of the list admins gpg key.
|
|
|
|
-h
|
|
Prints out this help.
|
|
|
|
-n <name>
|
|
Name part of list address.
|
|
|
|
|
|
\033[1mExample:\033[m
|
|
|
|
Create List 'testlist@cryptolists.so36.net':
|
|
|
|
\033[1m$(basename $0) -n testlist -d cryptolists.so36.net\033[m
|
|
|
|
|
|
"
|
|
|
|
clean_up 1
|
|
|
|
}
|
|
|
|
clean_up() {
|
|
|
|
# Perform program exit housekeeping
|
|
rm -rf "$LOCK_DIR"
|
|
blank_line
|
|
exit $1
|
|
}
|
|
|
|
echononl(){
|
|
if $terminal ; then
|
|
echo X\\c > /tmp/shprompt$$
|
|
if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then
|
|
echo -e -n " $*\\c" 1>&2
|
|
else
|
|
echo -e -n " $*" 1>&2
|
|
fi
|
|
rm /tmp/shprompt$$
|
|
fi
|
|
}
|
|
|
|
fatal(){
|
|
echo ""
|
|
if $terminal ; then
|
|
echo -e " [ \033[31m\033[1mFatal\033[m ] $*"
|
|
else
|
|
echo -e " [ Fatal ] $*"
|
|
fi
|
|
echo ""
|
|
if $terminal ; then
|
|
echo -e " \033[1mScript was terminated\033[m.."
|
|
else
|
|
echo -e " Script was terminated.."
|
|
fi
|
|
echo ""
|
|
rm -rf $LOCK_DIR
|
|
exit 1
|
|
}
|
|
|
|
error (){
|
|
echo ""
|
|
if $terminal ; then
|
|
echo -e " [ \033[31m\033[1mError\033[m ] $*"
|
|
else
|
|
echo " [ Error ] $*"
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
warn (){
|
|
echo ""
|
|
if $terminal ; then
|
|
echo -e " [ \033[33m\033[1mWarn\033[m ] $*"
|
|
else
|
|
echo " [ Warn ] $*"
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
echo_done() {
|
|
if $terminal ; then
|
|
echo -e "\033[75G[ \033[32mdone\033[m ]"
|
|
fi
|
|
}
|
|
echo_ok() {
|
|
if $terminal ; then
|
|
echo -e "\033[75G[ \033[32mok\033[m ]"
|
|
fi
|
|
}
|
|
echo_failed(){
|
|
if $terminal ; then
|
|
echo -e "\033[75G[ \033[1;31mfailed\033[m ]"
|
|
fi
|
|
}
|
|
echo_skipped() {
|
|
if $terminal ; then
|
|
echo -e "\033[75G[ \033[33m\033[1mskipped\033[m ]"
|
|
fi
|
|
}
|
|
|
|
trim() {
|
|
local var="$*"
|
|
var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters
|
|
var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters
|
|
echo -n "$var"
|
|
}
|
|
|
|
# - Check if a given array (parameter 2) contains a given string (parameter 1)
|
|
# -
|
|
containsElement () {
|
|
local e
|
|
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
|
|
return 1
|
|
}
|
|
|
|
blank_line() {
|
|
if $terminal ; then
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
|
|
# ----------
|
|
# - Jobhandling
|
|
# ----------
|
|
|
|
# - Run 'clean_up' for signals SIGHUP SIGINT SIGTERM
|
|
# -
|
|
trap clean_up SIGHUP SIGINT SIGTERM
|
|
|
|
# - Create lock directory '$LOCK_DIR"
|
|
#
|
|
mkdir "$LOCK_DIR"
|
|
|
|
|
|
# ----------
|
|
# - Some checks ..
|
|
# ----------
|
|
|
|
# - Running in a terminal?
|
|
# -
|
|
if [[ -t 1 ]] ; then
|
|
terminal=true
|
|
else
|
|
terminal=false
|
|
fi
|
|
|
|
# - Print help?
|
|
# -
|
|
if [[ "$(trim $*)" =~ "--help" ]] ; then
|
|
usage
|
|
fi
|
|
|
|
|
|
# ==========
|
|
# - Begin Main Script
|
|
# ==========
|
|
|
|
# ----------
|
|
# - Headline
|
|
# ----------
|
|
|
|
clear
|
|
if $terminal ; then
|
|
echo ""
|
|
echo -e "\033[1m----------\033[m"
|
|
echo -e "\033[32m\033[1mRunning script \033[m\033[1m$script_name\033[32m .. \033[m"
|
|
echo -e "\033[1m----------\033[m"
|
|
fi
|
|
|
|
|
|
# ----------
|
|
# Read Configurations from $conf_file
|
|
# ----------
|
|
|
|
|
|
# - Give your default values here
|
|
# -
|
|
LOGGING=false
|
|
BATCH_MODE=false
|
|
DEFAULT_SCHLEUDER_HOME="/var/lib/schleuder"
|
|
#DEFAULT_LIST_DOMAIN="cryptolists.so36.net"
|
|
DEFAULT_LIST_DOMAIN="il-schleuder.de"
|
|
DEFAULT_HAS_PREFIX=yes
|
|
DEFAULT_SEND_ENCRYPTED_ONLY=yes
|
|
DEFAULT_RECEIVE_ENCRYPTED_ONLY=yes
|
|
DEFAULT_RECEIVE_SIGNED_ONLY=no
|
|
DEFAULT_RECEIVE_AUTHENTICATED_ONLY=no
|
|
DEFAULT_RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY=yes
|
|
|
|
if [[ -f "$conf_file" ]]; then
|
|
source "$conf_file"
|
|
#else
|
|
# warn "No configuration file '$conf_file' present.\n
|
|
# Loading default values.."
|
|
fi
|
|
|
|
[[ -z "$SCHLEUDER_HOME" ]] && SCHLEUDER_HOME="$DEFAULT_SCHLEUDER_HOME"
|
|
|
|
[[ -n "$SEND_ENCRYPTED_ONLY" ]] && DEFAULT_SEND_ENCRYPTED_ONLY="$SEND_ENCRYPTED_ONLY"
|
|
[[ -n "$RECEIVE_ENCRYPTED_ONLY" ]] && DEFAULT_RECEIVE_ENCRYPTED_ONLY="$RECEIVE_ENCRYPTED_ONLY"
|
|
[[ -n "$RECEIVE_SIGNED_ONLY" ]] && DEFAULT_RECEIVE_SIGNED_ONLY="$RECEIVE_SIGNED_ONLY"
|
|
[[ -n "$RECEIVE_AUTHENTICATED_ONLY" ]] && DEFAULT_RECEIVE_AUTHENTICATED_ONLY="$RECEIVE_AUTHENTICATED_ONLY"
|
|
[[ -n "$RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY" ]] && DEFAULT_RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY="$RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY"
|
|
|
|
|
|
# ----------
|
|
# - Read commandline parameter
|
|
# ----------
|
|
|
|
while getopts d:e:f:hn: opt ; do
|
|
case $opt in
|
|
d) LIST_DOMAIN="${OPTARG,,}"
|
|
;;
|
|
e) LIST_ADMIN_EMAIL="${OPTARG,,}"
|
|
;;
|
|
f) ADMIN_KEY_FILE="${OPTARG,,}"
|
|
;;
|
|
n) LIST_NAME="${OPTARG,,}"
|
|
;;
|
|
h) usage
|
|
;;
|
|
\?) usage ;;
|
|
esac
|
|
done
|
|
|
|
# - Print help?
|
|
# -
|
|
if [[ "$(trim $*)" =~ "--help" ]] ; then
|
|
usage
|
|
fi
|
|
|
|
shift $(expr $OPTIND - 1)
|
|
[[ $# -eq "0" ]] || usage "Wrong number of arguments!"
|
|
|
|
domain_exists=false
|
|
schleuder_domains="$(schleuder-cli lists list 2>/dev/null | cut -d '@' -f2 2>/dev/null | sort -u 2>/dev/null)"
|
|
|
|
# - To avoid matching a substring we use an array
|
|
# -
|
|
declare -a schleuder_domain_arr=()
|
|
if [[ -n "$schleuder_domains" ]] ; then
|
|
for _domain in $schleuder_domains ; do
|
|
schleuder_domain_arr+=("$_domain")
|
|
done
|
|
fi
|
|
|
|
regex_name_part="^[A-Za-z0-9._+-]+$"
|
|
regex_domain_part="^([A-Za-z0-9-]+\.)+[A-Za-z]{2,}$"
|
|
regex_email="^[A-Za-z0-9._+-]+@([A-Za-z0-9-]+\.)+[A-Za-z]{2,}$"
|
|
|
|
if [[ -n "$LIST_DOMAIN" ]] ; then
|
|
if [[ ! "$LIST_DOMAIN" =~ $regex_domain_part ]] ; then
|
|
warn "The given domain part of th new list address is not valid!
|
|
|
|
Later, you will be requested for the domain part again.."
|
|
LIST_DOMAIN=""
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$LIST_NAME" ]] ; then
|
|
if [[ ! "$LIST_NAME" =~ $regex_name_part ]] ; then
|
|
warn "The given name part of the new list address is not valid!
|
|
|
|
Later, you will be requested name part again.."
|
|
LIST_NAME=""
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$LIST_ADMIN_EMAIL" ]] ; then
|
|
if [[ ! "$LIST_ADMIN_EMAIL" =~ $regex_email ]] ; then
|
|
warn "The given admin address is not a valid e-mail address.
|
|
|
|
Later, you will be requested for the admin address gain.."
|
|
LIST_ADMIN_EMAIL=""
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$LIST_NAME" ]] && [[ -n "$LIST_DOMAIN" ]] ; then
|
|
FQ_LIST_ADDRESS="${LIST_NAME}@$LIST_DOMAIN"
|
|
if $(schleuder-cli lists list | grep -q "$FQ_LIST_ADDRESS" 2> /dev/null) ; then
|
|
fatal "List '$FQ_LIST_ADDRESS' already exists!"
|
|
fi
|
|
fi
|
|
|
|
# ----------
|
|
# - Read in parameters given by user
|
|
# ----------
|
|
|
|
if $terminal && ! $BATCH_MODE ; then
|
|
|
|
echo ""
|
|
echo ""
|
|
echo -e " \033[1mRead in base settings for the new list ..\033[m"
|
|
echo ""
|
|
|
|
# - Already give at command line
|
|
# -
|
|
if [[ -n "$LIST_NAME" ]] ; then
|
|
echo -e " \033[1mList name\033[m: ${LIST_NAME,,}"
|
|
fi
|
|
if [[ -n "$LIST_DOMAIN" ]] ; then
|
|
echo -e " \033[1mList domain\033[m: ${LIST_DOMAIN,,}"
|
|
fi
|
|
if [[ -n "$LIST_ADMIN_EMAIL" ]] ; then
|
|
echo -e " \033[1mList admin\033[m: ${LIST_ADMIN_EMAIL,,}"
|
|
fi
|
|
if [[ -n "$ADMIN_KEY_FILE" ]] ; then
|
|
echo -e " \033[1mKey file list aadmin\033[m: ${ADMIN_KEY_FILE}"
|
|
fi
|
|
|
|
if [[ -z "$LIST_NAME" ]] ; then
|
|
echo ""
|
|
echo -e "\033[32m--\033[m"
|
|
echo " Enter the name part of the new list (<name-part>@<domain-part>)."
|
|
echo ""
|
|
echo ""
|
|
while [[ -z "$(trim "$LIST_NAME")" ]]; do
|
|
|
|
echononl "\033[1mName Part of list\033[m: "
|
|
read LIST_NAME
|
|
|
|
if [[ -z "$(trim "$LIST_NAME")" ]]; then
|
|
echo ""
|
|
echo -e " \033[33mThe name part of list is required! \033[m Try again.."
|
|
echo ""
|
|
continue
|
|
fi
|
|
|
|
if [[ ! "$LIST_NAME" =~ $regex_name_part ]]; then
|
|
echo ""
|
|
echo -e " \033[33mThe given name part of the new list address is not valid! \033[m Try again.."
|
|
echo ""
|
|
LIST_NAME=""
|
|
continue
|
|
fi
|
|
|
|
done
|
|
fi
|
|
LIST_NAME="${LIST_NAME,,}"
|
|
|
|
if [[ -z "$LIST_DOMAIN" ]] ; then
|
|
echo ""
|
|
echo -e "\033[32m--\033[m"
|
|
echo " Enter the domain part of the new list (<name-part>@<domain-part>)."
|
|
if [[ ${#schleuder_domain_arr[@]} -gt 0 ]] ; then
|
|
echo ""
|
|
echo " Available List Domains:"
|
|
echo ""
|
|
for _dom in ${schleuder_domain_arr[@]} ; do
|
|
echo -e " \033[33m$_dom\033[m"
|
|
done
|
|
fi
|
|
echo ""
|
|
echo -e " Type \033[33m<return>\033[m to accept the default."
|
|
echo ""
|
|
echo ""
|
|
_LIST_DOMAIN="$DEFAULT_LIST_DOMAIN"
|
|
|
|
while [[ -z "$(trim "$LIST_DOMAIN")" ]]; do
|
|
|
|
echononl "\033[1mDomain part of the new list\033[m [$_LIST_DOMAIN]: "
|
|
read LIST_DOMAIN
|
|
|
|
if [[ -z "$(trim $LIST_DOMAIN)" ]] ; then
|
|
LIST_DOMAIN="$DEFAULT_LIST_DOMAIN"
|
|
fi
|
|
|
|
if [[ ! "$LIST_DOMAIN" =~ $regex_domain_part ]]; then
|
|
echo ""
|
|
echo -e " \033[33mThe given domain part of the new list address is not valid! \033[m Try again.."
|
|
echo ""
|
|
LIST_DOMAIN=""
|
|
fi
|
|
|
|
done
|
|
fi
|
|
LIST_DOMAIN="${LIST_DOMAIN,,}"
|
|
|
|
# - Some checks
|
|
# -
|
|
if containsElement "$LIST_DOMAIN" "${schleuder_domain_arr[@]}" ; then
|
|
domain_exists=true
|
|
fi
|
|
FQ_LIST_ADDRESS="${LIST_NAME}@$LIST_DOMAIN"
|
|
if $(schleuder-cli lists list | grep -q "$FQ_LIST_ADDRESS" 2> /dev/null) ; then
|
|
fatal "List already exists!"
|
|
fi
|
|
|
|
|
|
if [[ -z "$LIST_ADMIN_EMAIL" ]] ; then
|
|
echo ""
|
|
echo -e "\033[32m--\033[m"
|
|
echo " Enter the e-mail address for the list admin."
|
|
echo ""
|
|
echo ""
|
|
while [[ -z "$(trim "$LIST_ADMIN_EMAIL")" ]]; do
|
|
|
|
echononl "\033[1mE-mail address of list admin \033[m: "
|
|
read LIST_ADMIN_EMAIL
|
|
|
|
if [[ -z "$(trim "$LIST_ADMIN_EMAIL")" ]]; then
|
|
echo ""
|
|
echo -e " \033[33mA admin e-mail address for list is required!\033[m Try again.."
|
|
echo ""
|
|
LIST_ADMIN_EMAIL=""
|
|
continue
|
|
fi
|
|
if [[ ! "$LIST_ADMIN_EMAIL" =~ $regex_email ]]; then
|
|
echo ""
|
|
echo -e " \033[33mGiven admin address is not valid e-mail address!\033[m Try again.."
|
|
echo ""
|
|
LIST_ADMIN_EMAIL=""
|
|
continue
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [[ -z "$ADMIN_KEY_FILE" ]] ; then
|
|
echo ""
|
|
echo -e "\033[32m--\033[m"
|
|
echo " Enter the full qualified path to the admin gpg key-file.."
|
|
echo ""
|
|
echo ""
|
|
|
|
while [[ -z "$(trim "$ADMIN_KEY_FILE")" ]]; do
|
|
|
|
echononl "\033[1mGPG key file for the admin address\033[m: "
|
|
read ADMIN_KEY_FILE
|
|
|
|
if [[ -z "$(trim "$ADMIN_KEY_FILE")" ]]; then
|
|
echo ""
|
|
echo -e " \033[33mA key file for the admin e-mail address is required !\033[m Try again.."
|
|
echo ""
|
|
continue
|
|
fi
|
|
|
|
if [[ ! -f "$(trim "$ADMIN_KEY_FILE")" ]]; then
|
|
echo ""
|
|
echo -e " \033[33mThe give key file was not found! \033[m Try again.."
|
|
echo ""
|
|
ADMIN_KEY_FILE=""
|
|
continue
|
|
fi
|
|
|
|
if ! $(gpg "$ADMIN_KEY_FILE" 2> /dev/null | grep -q $LIST_ADMIN_EMAIL 2>/dev/null) ; then
|
|
echo ""
|
|
echo -e " \033[33mThe admin address dos not match the given key file! \033[m"
|
|
echo " Try again or type '<Control> + c'"
|
|
echo ""
|
|
ADMIN_KEY_FILE=""
|
|
continue
|
|
fi
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
echo ""
|
|
echo ""
|
|
echo -e " \033[1mRead in configuration parameters for the new list ..\033[m"
|
|
|
|
|
|
echo ""
|
|
echo -e "\033[32m--\033[m"
|
|
echo " Should the list get a prefix? [yes/no]"
|
|
echo ""
|
|
echo -e " Type \033[33m<return>\033[m to accept the default."
|
|
|
|
HAS_PREFIX=false
|
|
echo ""
|
|
|
|
YES_NO=""
|
|
echononl "\033[1mList with subject prefix?\033[m [$DEFAULT_HAS_PREFIX]: "
|
|
read YES_NO
|
|
if [[ -z "$(trim "$YES_NO")" ]]; then
|
|
YES_NO="$DEFAULT_HAS_PREFIX"
|
|
fi
|
|
while [[ "${YES_NO,,}" != "yes" ]] && [[ "${YES_NO,,}" != "no" ]] ; do
|
|
echo -e " \033[33mWrong entry! \033[mTry again.."
|
|
echononl "\033[1mList with subject prefix?\033[m [yes/no]: "
|
|
read YES_NO
|
|
done
|
|
[[ "${YES_NO,,}" = 'yes' ]] && HAS_PREFIX=true
|
|
|
|
if $HAS_PREFIX ; then
|
|
|
|
PREFIX=""
|
|
DEFAULT_PREFIX="[${LIST_NAME}]"
|
|
|
|
echo ""
|
|
echo ""
|
|
echo -e "\033[32m--\033[m"
|
|
echo " Enter the name of the Prefix"
|
|
echo ""
|
|
echo -e " Type \033[33m<return>\033[m to accept the default."
|
|
echo ""
|
|
|
|
echononl "\033[1mList prefix\033[m [ $DEFAULT_PREFIX ]: "
|
|
read PREFIX
|
|
[[ -z "$(trim "$PREFIX")" ]] && PREFIX=$DEFAULT_PREFIX
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "\033[32m--\033[m"
|
|
echo " Send only encrypted e-mails? [yes/no]"
|
|
echo ""
|
|
echo -e " Type \033[33m<return>\033[m to accept the default."
|
|
echo ""
|
|
|
|
YES_NO=""
|
|
SEND_ENCRYPTED_ONLY=false
|
|
echononl "\033[1mOnly send out enrypted e-mails to subscribers?\033[m [$DEFAULT_SEND_ENCRYPTED_ONLY]: "
|
|
read YES_NO
|
|
if [[ -z "$(trim "$YES_NO")" ]]; then
|
|
YES_NO="$DEFAULT_SEND_ENCRYPTED_ONLY"
|
|
fi
|
|
while [[ "${YES_NO,,}" != "yes" ]] && [[ "${YES_NO,,}" != "no" ]] ; do
|
|
echo -e " Wrong entry. try again.."
|
|
echononl "\033[1mOnly send out enrypted e-mails to subscribers?\033[m [yes/no]: "
|
|
read YES_NO
|
|
done
|
|
[[ "${YES_NO,,}" = "yes" ]] && SEND_ENCRYPTED_ONLY=true
|
|
|
|
echo ""
|
|
echo -e "\033[32m--\033[m"
|
|
echo " Recieve only encrypted e-mails? [yes/no]"
|
|
echo ""
|
|
echo -e " Type \033[33m<return>\033[m to accept the default."
|
|
echo ""
|
|
|
|
YES_NO=""
|
|
RECEIVE_ENCRYPTED_ONLY=false
|
|
echononl "\033[1mAllow only encrypted incomming e-mails?\033[m [$DEFAULT_RECEIVE_ENCRYPTED_ONLY]: "
|
|
read YES_NO
|
|
if [[ -z "$(trim "$YES_NO")" ]]; then
|
|
YES_NO="$DEFAULT_RECEIVE_ENCRYPTED_ONLY"
|
|
fi
|
|
while [[ "${YES_NO,,}" != "yes" ]] && [[ "${YES_NO,,}" != "no" ]] ; do
|
|
echo -e " Wrong entry. try again.."
|
|
echononl "\033[1mAllow only encrypted incomming e-mails?\033[m [yes/no]: "
|
|
read YES_NO
|
|
done
|
|
[[ "${YES_NO,,}" = "yes" ]] && RECEIVE_ENCRYPTED_ONLY=true
|
|
|
|
echo ""
|
|
echo -e "\033[32m--\033[m"
|
|
echo " Recieve only signed e-mails? [yes/no]"
|
|
echo ""
|
|
echo -e " Type \033[33m<return>\033[m to accept the default."
|
|
echo ""
|
|
|
|
YES_NO=""
|
|
RECEIVE_SIGNED_ONLY=false
|
|
echononl "\033[1mAllow only e-mails that are validly signed?\033[m [$DEFAULT_RECEIVE_SIGNED_ONLY]: "
|
|
read YES_NO
|
|
if [[ -z "$(trim "$YES_NO")" ]]; then
|
|
YES_NO="$DEFAULT_RECEIVE_SIGNED_ONLY"
|
|
fi
|
|
while [[ "${YES_NO,,}" != "yes" ]] && [[ "${YES_NO,,}" != "no" ]] ; do
|
|
echo -e " Wrong entry. try again.."
|
|
echononl "\033[1mAllow only e-mails that are validly signed?\033[m [yes/no]: "
|
|
read YES_NO
|
|
done
|
|
[[ "${YES_NO,,}" = "yes" ]] && RECEIVE_SIGNED_ONLY=true
|
|
|
|
echo ""
|
|
echo -e "\033[32m--\033[m"
|
|
echo " Allow only emails that are validly signed by a subscriber's key? [yes/no]"
|
|
echo ""
|
|
echo -e " Type \033[33m<return>\033[m to accept the default."
|
|
echo ""
|
|
|
|
YES_NO=""
|
|
RECEIVE_AUTHENTICATED_ONLY=false
|
|
echononl "\033[1mAllow only e-mails validy signed from subscribed addresses?\033[m [$DEFAULT_RECEIVE_AUTHENTICATED_ONLY]: "
|
|
read YES_NO
|
|
if [[ -z "$(trim "$YES_NO")" ]]; then
|
|
YES_NO="$DEFAULT_RECEIVE_AUTHENTICATED_ONLY"
|
|
fi
|
|
while [[ "${YES_NO,,}" != "yes" ]] && [[ "${YES_NO,,}" != "no" ]] ; do
|
|
echo -e " Wrong entry. try again.."
|
|
echononl "\033[1mAllow only e-mails validy signed from subscribed addresses?\033[m [yes/no]: "
|
|
read YES_NO
|
|
done
|
|
[[ "${YES_NO,,}" = "yes" ]] && RECEIVE_AUTHENTICATED_ONLY=true
|
|
|
|
echo ""
|
|
echo -e "\033[32m--\033[m"
|
|
echo " Allow only e-mails being sent from subscribed addresses? [yes/no]"
|
|
echo ""
|
|
echo -e " Type \033[33m<return>\033[m to accept the default."
|
|
echo ""
|
|
|
|
YES_NO=""
|
|
RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY=false
|
|
echononl "\033[1mAllow only e-mails being sent from subscribed addresses?\033[m [$DEFAULT_RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY]: "
|
|
read YES_NO
|
|
if [[ -z "$(trim "$YES_NO")" ]]; then
|
|
YES_NO="$DEFAULT_RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY"
|
|
fi
|
|
while [[ "${YES_NO,,}" != "yes" ]] && [[ "${YES_NO,,}" != "no" ]] ; do
|
|
echo -e " Wrong entry. try again.."
|
|
echononl "\033[1mAllow only e-mails being sent from subscribed addresses?\033[m [yes/no]: "
|
|
read YES_NO
|
|
done
|
|
[[ "${YES_NO,,}" = "yes" ]] && RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY=true
|
|
|
|
echo ""
|
|
echo ""
|
|
echo -e " \033[32m\033[1mParameter Summary:\033[m"
|
|
echo ""
|
|
|
|
echo " Full qualified new list address..............................: $FQ_LIST_ADDRESS"
|
|
echo ""
|
|
echo " E-Mail address of list admin.................................: $LIST_ADMIN_EMAIL"
|
|
echo " GPG key file of admin address................................: $ADMIN_KEY_FILE"
|
|
|
|
echo ""
|
|
if $HAS_PREFIX ; then
|
|
echo " Subject Prefix...............................................: $PREFIX"
|
|
else
|
|
echo -e " Subject Prefix...............................................: \033[33m- not set -\033[m"
|
|
fi
|
|
if $SEND_ENCRYPTED_ONLY ; then
|
|
echo " Only send out enrypted emails to subscriptions...............: yes"
|
|
else
|
|
echo " Only send out enrypted emails to subscriptions...............: no"
|
|
fi
|
|
if $RECEIVE_ENCRYPTED_ONLY ; then
|
|
echo " Allow only encrypted incomming e-mails?......................: yes"
|
|
else
|
|
echo " Allow only encrypted incomming e-mails?......................: no"
|
|
fi
|
|
if $RECEIVE_SIGNED_ONLY ; then
|
|
echo " Allow only e-mails that are validly signed?..................: yes"
|
|
else
|
|
echo " Allow only e-mails that are validly signed?..................: no"
|
|
fi
|
|
if $RECEIVE_AUTHENTICATED_ONLY ; then
|
|
echo " Allow only e-mails validy signed from subscribed addresses?..: yes"
|
|
else
|
|
echo " Allow only e-mails validy signed from subscribed addresses?..: no"
|
|
fi
|
|
if $RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY ; then
|
|
echo " Allow only e-mails being sent from subscribed addresses?.....: yes"
|
|
else
|
|
echo " Allow only e-mails being sent from subscribed addresses?.....: no"
|
|
fi
|
|
|
|
|
|
if ! $domain_exists ; then
|
|
warn "The Domain '$LIST_DOMAIN' of the new list address '$FQ_LIST_ADDRESS'
|
|
does not exists yet!
|
|
|
|
This is not an error, but if you continue, take care, postfix mailsystem is knowing
|
|
tbout he new (schleuder) domain."
|
|
fi
|
|
|
|
echo ""
|
|
echononl "Continue with this parameters? [\033[1myes/no\033[m]: "
|
|
read OK
|
|
while [[ "${OK,,}" != "yes" ]] && [[ "${OK,,}" != "no" ]] ; do
|
|
echononl "\033[33mWrong entry!\033[m [\033[1myes/no\033[m]: "
|
|
read OK
|
|
done
|
|
[[ "${OK,,}" = "yes" ]] || fatal "Canceled by user input."
|
|
|
|
|
|
fi
|
|
|
|
# ----------
|
|
# - Main part of script
|
|
# ----------
|
|
|
|
if $terminal ; then
|
|
echo ""
|
|
echo ""
|
|
echo -e " \033[1mMain part of script ..\033[m"
|
|
echo ""
|
|
fi
|
|
|
|
echononl "Create list '$FQ_LIST_ADDRESS' - this may take some time.."
|
|
schleuder-cli lists new $FQ_LIST_ADDRESS $LIST_ADMIN_EMAIL $ADMIN_KEY_FILE > "$log_file" 2>&1
|
|
if [[ $? -eq 0 ]] ; then
|
|
echo_done
|
|
else
|
|
echo_failed
|
|
error "$(cat "$log_file")"
|
|
clean_up 1
|
|
fi
|
|
|
|
blank_line
|
|
echononl "Set Subject Prefix .."
|
|
if $HAS_PREFIX ; then
|
|
schleuder-cli lists set $FQ_LIST_ADDRESS subject_prefix $PREFIX > "$log_file" 2>&1
|
|
if [[ $? -eq 0 ]] ; then
|
|
echo_done
|
|
else
|
|
echo_failed
|
|
error "$(cat "$log_file")"
|
|
fi
|
|
else
|
|
echo_skipped
|
|
fi
|
|
|
|
echononl "Set parameter 'send_encrypted_only' .."
|
|
schleuder-cli lists set $FQ_LIST_ADDRESS send_encrypted_only $SEND_ENCRYPTED_ONLY > "$log_file" 2>&1
|
|
if [[ $? -eq 0 ]] ; then
|
|
echo_done
|
|
else
|
|
echo_failed
|
|
error "$(cat "$log_file")"
|
|
fi
|
|
|
|
echononl "Set parameter 'receive_encrypted_only' .."
|
|
schleuder-cli lists set $FQ_LIST_ADDRESS receive_encrypted_only $RECEIVE_ENCRYPTED_ONLY > "$log_file" 2>&1
|
|
if [[ $? -eq 0 ]] ; then
|
|
echo_done
|
|
else
|
|
echo_failed
|
|
error "$(cat "$log_file")"
|
|
fi
|
|
|
|
echononl "Set parameter 'receive_signed_only' .."
|
|
schleuder-cli lists set $FQ_LIST_ADDRESS receive_signed_only $RECEIVE_SIGNED_ONLY > "$log_file" 2>&1
|
|
if [[ $? -eq 0 ]] ; then
|
|
echo_done
|
|
else
|
|
echo_failed
|
|
error "$(cat "$log_file")"
|
|
fi
|
|
|
|
echononl "Set parameter 'receive_authenticated_only' .."
|
|
schleuder-cli lists set $FQ_LIST_ADDRESS receive_authenticated_only $RECEIVE_AUTHENTICATED_ONLY > "$log_file" 2>&1
|
|
if [[ $? -eq 0 ]] ; then
|
|
echo_done
|
|
else
|
|
echo_failed
|
|
error "$(cat "$log_file")"
|
|
fi
|
|
|
|
echononl "Set parameter 'receive_from_subscribed_emailaddresses_only' .."
|
|
schleuder-cli lists set $FQ_LIST_ADDRESS receive_from_subscribed_emailaddresses_only $RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY > "$log_file" 2>&1
|
|
if [[ $? -eq 0 ]] ; then
|
|
echo_done
|
|
else
|
|
echo_failed
|
|
error "$(cat "$log_file")"
|
|
fi
|
|
|
|
echononl "Set parameter 'receive_from_subscribed_emailaddresses_only' .."
|
|
schleuder-cli lists set $FQ_LIST_ADDRESS receive_from_subscribed_emailaddresses_only $RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY > "$log_file" 2>&1
|
|
if [[ $? -eq 0 ]] ; then
|
|
echo_done
|
|
else
|
|
echo_failed
|
|
error "$(cat "$log_file")"
|
|
fi
|
|
|
|
echononl "Set parameter 'public_footer' .."
|
|
if ! $RECEIVE_FROM_SUBSCRIBED_EMAILADDRESSES_ONLY ; then
|
|
public_footer="To get senders key, send an e-mail to ${LIST_NAME}-sendkey@${LIST_DOMAIN}"
|
|
schleuder-cli lists set $FQ_LIST_ADDRESS public_footer "$public_footer" > "$log_file" 2>&1
|
|
if [[ $? -eq 0 ]] ; then
|
|
echo_done
|
|
else
|
|
echo_failed
|
|
error "$(cat "$log_file")"
|
|
fi
|
|
else
|
|
echo_skipped
|
|
fi
|
|
|
|
echononl "Get fingerprint of the new list .."
|
|
_FINGERPRINT="$(schleuder-cli keys list ${FQ_LIST_ADDRESS} 2>/dev/null \
|
|
| grep ${FQ_LIST_ADDRESS} 2>/dev/null \
|
|
| cut -d' ' -f1 2>/dev/null)"
|
|
if [[ $? -eq 0 ]] ; then
|
|
echo_done
|
|
else
|
|
echo_failed
|
|
fi
|
|
|
|
FINGERPRINT=""
|
|
declare -i number=1
|
|
while read -n1 char ; do
|
|
FINGERPRINT="${FINGERPRINT}$char"
|
|
if [[ $(( $number % 4)) -eq 0 ]] ; then
|
|
FINGERPRINT="${FINGERPRINT} "
|
|
fi
|
|
(( number++ ))
|
|
done <<< $_FINGERPRINT
|
|
|
|
echo "
|
|
|
|
---
|
|
|
|
Wir haben Dir/Euch folgende Liste eingerichtet:
|
|
$FQ_LIST_ADDRESS
|
|
|
|
Der Fingerprint des Listenschlüssels ist:
|
|
$FINGERPRINT
|
|
|
|
Um den Listenschlüssel zu erhalten, schicke eine mail an
|
|
${LIST_NAME}-sendkey@${LIST_DOMAIN}
|
|
|
|
Die Administrierungsadresse der Liste ist:
|
|
$LIST_ADMIN_EMAIL
|
|
"
|
|
|
|
if $RECEIVE_SIGNED_ONLY || $RECEIVE_AUTHENTICATED_ONLY ; then
|
|
echo "
|
|
Alle E-Mails an die Liste müssen verschlüsselt und signiert werden.
|
|
"
|
|
fi
|
|
|
|
|
|
echo "
|
|
Wir nutzen dazu die Software 'schleuder' version 3:
|
|
https://schleuder.org/
|
|
|
|
|
|
Die Liste unterstützt administrative Kommandos, die sogenannten
|
|
'special keywords' um verschiedene Aufgaben zu erledigen oder
|
|
auch Informationen über subscribierte Adressen/Schlüssel zu
|
|
erhalten. E-Mails, die solche Kommandos enthalten, werden
|
|
an die Adresse
|
|
|
|
${LIST_NAME}-request@${LIST_DOMAIN}
|
|
|
|
versendet und müssen - unabhängig von den Einstellungen der
|
|
Liste selbst - IMMER *verschlüsselt und signiert* sein. Sie
|
|
müssen aus Sicherheitsgründen zusätzlich zu dem/den
|
|
Listemkommando(s) die Zeile
|
|
|
|
x-list-name: $FQ_LIST_ADDRESS
|
|
|
|
enhalten (z.Bsp. die ertse Zeile der E-Mail). Einge Kommandos
|
|
(Adressen hinzufügen/löschen, Schlüssel löschen) sind der/den
|
|
Admin Adresse(n) vrobehalten. Es sind mehrere Kommandos in einer
|
|
'request' E-Mail möglich.
|
|
|
|
Siehe hierzu:
|
|
https://schleuder.org/schleuder/docs/list-admins.html
|
|
|
|
|
|
Die Liste unterstützt das sogenannte 'Resending', das Versenden
|
|
von E-Mails an nicht subscribierte Adressen im Namen der Liste.
|
|
|
|
Siehe hierzu:
|
|
https://schleuder.org/schleuder/docs/subscribers.html
|
|
|
|
|
|
Bei Fragen: einfach fragen!"
|
|
|
|
exit 0
|
|
|
|
|
|
|
|
clean_up 0
|
|
|
|
# ----------
|
|
# - Some pre-script tasks ..
|
|
# ----------
|
|
|
|
if $terminal ; then
|
|
echo ""
|
|
echo ""
|
|
echo -e " \033[1mDoing some configuration tasks for new list ..\033[m"
|
|
echo ""
|
|
fi
|
|
|
|
if $terminal ; then
|
|
|
|
|
|
clean_up 0
|
|
|
|
|
|
echononl "Get a list of available list options .."
|
|
list_options="$(schleuder-cli lists list-options 2> "${log_file}")"
|
|
|
|
if [[ -s "$log_file" ]] ; then
|
|
echo_failed
|
|
fatal "Run this script as a user, who is allowed to maintain schleuder lists."
|
|
else
|
|
echo_done
|
|
fi
|
|
|
|
# - List present?
|
|
# -
|
|
if ! $(schleuder-cli lists list | grep -q -E "^${LIST_NAME}$" 2>/dev/null) ; then
|
|
fatal "List '$LIST_NAME' not found at this server!"
|
|
fi
|
|
|
|
# ----------
|
|
# - Main part of script
|
|
# ----------
|
|
|
|
if $terminal ; then
|
|
echo ""
|
|
echo ""
|
|
echo -e " \033[1mParameter settings for list \033[32m\033[1m$LIST_NAME\033[32m ..\033[m"
|
|
echo ""
|
|
else
|
|
echo ""
|
|
echo " Parameter settings for list '$LIST_NAME':"
|
|
fi
|
|
|
|
|
|
|
|
for _option in $list_options ; do
|
|
_val="$(schleuder-cli lists show $LIST_NAME $_option 2> $log_file)"
|
|
if [[ -s "${log_file}" ]]; then
|
|
error "$(cat "${log_file}")"
|
|
clean_up 1
|
|
fi
|
|
if $terminal ; then
|
|
echo -en " ${_option}:\033[50G"
|
|
if [[ -z "$_val" ]] ; then
|
|
echo -en "\033[33m-- <not set> --"
|
|
else
|
|
echo -en "\033[32m${_val}"
|
|
fi
|
|
echo -e "\033[m"
|
|
else
|
|
echo " ${_option}: ${_val}"
|
|
fi
|
|
done
|
|
|
|
clean_up 1
|