Initial commit
This commit is contained in:
commit
4fca6babf9
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
*.swp
|
||||||
|
conf/*.conf
|
||||||
|
log/*
|
||||||
|
messages/*
|
33
conf/mail_to_listadmins.conf.sample
Normal file
33
conf/mail_to_listadmins.conf.sample
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# ----------------------------------------------------
|
||||||
|
# ---
|
||||||
|
# - Default Parameters for script mail_to_listadmins.sh.
|
||||||
|
# ---
|
||||||
|
# ----------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# - MESSAGE_FILE
|
||||||
|
# -
|
||||||
|
# - UTF-8 encoded file containing the message that should
|
||||||
|
# - be sended to the list administrators
|
||||||
|
# -
|
||||||
|
# - Default value is empty
|
||||||
|
# -
|
||||||
|
#MESSAGE_FILE=""
|
||||||
|
|
||||||
|
# - SENDER_ADDRESS
|
||||||
|
# -
|
||||||
|
# - The sender address from which the message to the listadmins
|
||||||
|
# - will be dended.
|
||||||
|
# -
|
||||||
|
# - Defaults value is empty
|
||||||
|
# -
|
||||||
|
#SENDER_ADDRESS=""
|
||||||
|
|
||||||
|
# - SUBJECT
|
||||||
|
# -
|
||||||
|
# - The subject that will be used with the message that should
|
||||||
|
# - be sended to the list administrators
|
||||||
|
# -
|
||||||
|
# - Default value is empty
|
||||||
|
# -
|
||||||
|
#SUBJECT=""
|
820
mail_to_listadmins.sh
Executable file
820
mail_to_listadmins.sh
Executable file
@ -0,0 +1,820 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
working_dir="$(dirname "$(realpath $0)")"
|
||||||
|
conf_file="${working_dir}/conf/mail_to_listadmins.conf"
|
||||||
|
|
||||||
|
_date="$(date +%Y-%m-%d-%H%M)"
|
||||||
|
|
||||||
|
log_dir="${working_dir}/log"
|
||||||
|
log_file="${log_dir}/mail_to_listadmins.${_date}.log"
|
||||||
|
|
||||||
|
schleuder_conf_file="/etc/schleuder/schleuder.yml"
|
||||||
|
|
||||||
|
LOCK_DIR="$(mktemp -d)"
|
||||||
|
err_msg="${LOCK_DIR}/err_msg.log"
|
||||||
|
|
||||||
|
#-----------------------------
|
||||||
|
# Some variables definitions
|
||||||
|
#-----------------------------
|
||||||
|
|
||||||
|
declare -a schleuder_domains_arr
|
||||||
|
declare -a schleuder_lists_arr
|
||||||
|
|
||||||
|
declare -a lists_done
|
||||||
|
declare -a lists_failed
|
||||||
|
declare -a lists_warn
|
||||||
|
|
||||||
|
#-----------------------------
|
||||||
|
# Base Function(s)
|
||||||
|
#-----------------------------
|
||||||
|
|
||||||
|
clean_up() {
|
||||||
|
|
||||||
|
# Perform program exit housekeeping
|
||||||
|
rm -rf $LOCK_DIR
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
echo_log() {
|
||||||
|
echo "$*" >> "$log_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo_log_done() {
|
||||||
|
echo "[ done ] $*" >> "$log_file"
|
||||||
|
}
|
||||||
|
echo_log_failed() {
|
||||||
|
echo "[ Error ] $*" >> "$log_file"
|
||||||
|
}
|
||||||
|
echo_log_skipped() {
|
||||||
|
echo "[ skipped ] $*" >> "$log_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
echononl(){
|
||||||
|
if $terminal && $LOGGING ; 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 ]: $*"
|
||||||
|
echo ""
|
||||||
|
echo -e " \033[31m\033[1mScript was interupted\033[m!"
|
||||||
|
else
|
||||||
|
echo " [ Fatal ]: $*"
|
||||||
|
echo ""
|
||||||
|
echo " Script was terminated...."
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
clean_up 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[1mWarning\033[m ]: $*"
|
||||||
|
else
|
||||||
|
echo " [ Warning ]: $*"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
info (){
|
||||||
|
echo ""
|
||||||
|
if $terminal ; then
|
||||||
|
echo -e " [ \033[32m\033[1mInfo\033[m ]: $*"
|
||||||
|
else
|
||||||
|
echo " [ Info ]: $*"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
echo_done() {
|
||||||
|
if $terminal ; then
|
||||||
|
echo -e "\033[75G[ \033[32mdone\033[m ]"
|
||||||
|
else
|
||||||
|
echo " [ done ]"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
echo_failed(){
|
||||||
|
if $terminal && $LOGGING ; then
|
||||||
|
echo -e "\033[75G[ \033[1;31mfailed\033[m ]"
|
||||||
|
else
|
||||||
|
echo " [ failed ]"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
echo_skipped() {
|
||||||
|
if $terminal && $LOGGING ; then
|
||||||
|
echo -e "\033[75G[ \033[33m\033[1mskipped\033[m ]"
|
||||||
|
else
|
||||||
|
echo " [ skipped ]"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function usage () {
|
||||||
|
|
||||||
|
if [ -n "$1" ];then
|
||||||
|
echo -e "\nError: $1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "
|
||||||
|
|
||||||
|
Usage: \033[1m$(basename $0) [-h] [<-s email-address>] [-f <message-file>]\033[m
|
||||||
|
|
||||||
|
$(basename $0) sends a message, reading from a given file, to all list administrators of
|
||||||
|
all supported schleuder3 lists.
|
||||||
|
|
||||||
|
The given message file (and within the containing text) must be UTF8 encoded. In the
|
||||||
|
message, you can use the parameter string '@LIST@' which will be replaced by the
|
||||||
|
full qualified list address for the appropriate list.
|
||||||
|
|
||||||
|
\033[1mNotice\033[m
|
||||||
|
The keyring of the user invoking this script (for now only user 'root' is possible)
|
||||||
|
must contain the private key for the given sender address. The script will ask you
|
||||||
|
for the concerning passwort.
|
||||||
|
|
||||||
|
The message file may contain string \033[1m@LIST@\033[m which will be replaced
|
||||||
|
by the list address.
|
||||||
|
|
||||||
|
Parameters not given on the commandline will be interactivly ask for.
|
||||||
|
|
||||||
|
|
||||||
|
Optinal Control Options:
|
||||||
|
|
||||||
|
-h
|
||||||
|
print that help text
|
||||||
|
|
||||||
|
|
||||||
|
-b Subject
|
||||||
|
subject name of the e-mail.
|
||||||
|
|
||||||
|
-p Password
|
||||||
|
Password for the secret key of the sender address. Its \033[1mhighly not recommend\033[m
|
||||||
|
to use this parameter, because the password is prompted out and maybe also
|
||||||
|
saved in the shell's history file. If omitting this option, the script will
|
||||||
|
ask for the password. The password will not be prompted at the commandline.
|
||||||
|
|
||||||
|
|
||||||
|
-s Sender Adrress
|
||||||
|
name of the sender e-mail address.
|
||||||
|
|
||||||
|
|
||||||
|
-f Message File
|
||||||
|
full qualified path tio the file containing the message
|
||||||
|
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
$(basename $0) -b "Listsoftware has changed" -f /root/msg_listadmin.txt -s support@so36.net
|
||||||
|
|
||||||
|
"
|
||||||
|
clean_up 2
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# - See https://gist.github.com/epiloque/8cf512c6d64641bde388
|
||||||
|
parse_yaml() {
|
||||||
|
local prefix=$2
|
||||||
|
local s
|
||||||
|
local w
|
||||||
|
local fs
|
||||||
|
s='[[:space:]]*'
|
||||||
|
w='[a-zA-Z0-9_]*'
|
||||||
|
#fs="$(echo @|tr @ '\034')"
|
||||||
|
fs="$(echo @|tr @ '\034'|tr -d '\015')"
|
||||||
|
sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
|
||||||
|
-e "s|^\($s\)\($w\)$s[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" "$1" |
|
||||||
|
awk -F"$fs" '{
|
||||||
|
indent = length($1)/2;
|
||||||
|
vname[indent] = $2;
|
||||||
|
for (i in vname) {if (i > indent) {delete vname[i]}}
|
||||||
|
if (length($3) > 0) {
|
||||||
|
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
|
||||||
|
printf("%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, $3);
|
||||||
|
}
|
||||||
|
}' | sed 's/_=/+=/g'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if [[ ! -f "$schleuder_conf_file" ]]; then
|
||||||
|
fatal "Configuration file '$(basename ${schleuder_conf_file})' not found!"
|
||||||
|
else
|
||||||
|
eval $(parse_yaml "$schleuder_conf_file" "schleuder_" )
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# - Running in a terminal?
|
||||||
|
# -
|
||||||
|
if [[ -t 1 ]] ; then
|
||||||
|
terminal=true
|
||||||
|
else
|
||||||
|
terminal=false
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------
|
||||||
|
# Some tests
|
||||||
|
#-----------------------------
|
||||||
|
|
||||||
|
schleuder_user="$(stat -c '%U' "${schleuder_lists_dir}")"
|
||||||
|
schleuder_group="$(stat -c '%G' "${schleuder_lists_dir}")"
|
||||||
|
if ! id -u "$schleuder_user" > "$err_msg" 2>&1; then
|
||||||
|
error "$(cat "$err_msg")"
|
||||||
|
fatal "(Schleuder) User '$schleuder_user' does not exists"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------
|
||||||
|
# Read default values from script configuration file
|
||||||
|
#-----------------------------
|
||||||
|
|
||||||
|
SENDER_ADDRESS=""
|
||||||
|
MESSAGE_FILE=""
|
||||||
|
SUBJECT=""
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echononl " Loading default Configuration values from $(basename ${conf_file}).."
|
||||||
|
if [[ ! -f "$conf_file" ]]; then
|
||||||
|
echo_skipped
|
||||||
|
else
|
||||||
|
source "${conf_file}" > $err_msg 2>&1
|
||||||
|
if [[ $? -eq 0 ]]; then
|
||||||
|
echo_done
|
||||||
|
else
|
||||||
|
echo_failed
|
||||||
|
fatal "$(cat $err_msg)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ -n "$SENDER_ADDRESS" ]] && default_sender_address="$SENDER_ADDRESS"
|
||||||
|
[[ -n "$MESSAGE_FILE" ]] && default_orig_msg_file="$MESSAGE_FILE"
|
||||||
|
[[ -n "$SUBJECT" ]] && default_subject="$SUBJECT"
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------
|
||||||
|
# Read Commandline Parameters
|
||||||
|
#-----------------------------
|
||||||
|
|
||||||
|
subject=""
|
||||||
|
sender_address=""
|
||||||
|
gpg_pw=""
|
||||||
|
orig_msg_file=""
|
||||||
|
while getopts b:hf:p:s: opt ; do
|
||||||
|
case $opt in
|
||||||
|
b) subject="$OPTARG"
|
||||||
|
;;
|
||||||
|
s) sender_address="$OPTARG"
|
||||||
|
;;
|
||||||
|
p) gpg_pw="$OPTARG"
|
||||||
|
;;
|
||||||
|
f) orig_msg_file="$OPTARG"
|
||||||
|
;;
|
||||||
|
h) usage
|
||||||
|
;;
|
||||||
|
*) usage
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
if [[ -z "$orig_msg_file" ]] ; then
|
||||||
|
echo ""
|
||||||
|
echo -e "\033[32m--\033[m"
|
||||||
|
echo ""
|
||||||
|
echo "Enter full qualified file name containing the message"
|
||||||
|
echo "you want to send to the list admins."
|
||||||
|
echo ""
|
||||||
|
orig_msg_file=""
|
||||||
|
if [[ -n "$default_orig_msg_file" ]]; then
|
||||||
|
echononl "Message file [$default_orig_msg_file]: "
|
||||||
|
read orig_msg_file
|
||||||
|
if [[ -z "$orig_msg_file" ]]; then
|
||||||
|
orig_msg_file="$default_orig_msg_file"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
while [[ -z "$orig_msg_file" ]] ; do
|
||||||
|
echononl "Message file: "
|
||||||
|
read orig_msg_file
|
||||||
|
if [[ -z "$orig_msg_file" ]]; then
|
||||||
|
echo -e "\n \033[33m\033[1mMessage file is required!\033[m\n"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f "$orig_msg_file" ]]; then
|
||||||
|
fatal "Message file \033[1m$orig_msg_file\033[m not found!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$subject" ]]; then
|
||||||
|
echo ""
|
||||||
|
echo -e "\033[32m--\033[m"
|
||||||
|
echo ""
|
||||||
|
echo "Enter the subject for sending the info e-mails."
|
||||||
|
echo ""
|
||||||
|
subject=""
|
||||||
|
if [[ -n "$default_subject" ]]; then
|
||||||
|
echononl "Subject [$default_subject]: "
|
||||||
|
read subject
|
||||||
|
if [[ -z "$subject" ]]; then
|
||||||
|
subject="$default_subject"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
while [[ -z "$subject" ]] ; do
|
||||||
|
echononl "Subject: "
|
||||||
|
read subject
|
||||||
|
if [[ -z "" ]]; then
|
||||||
|
echo -e "\n \033[33m\033[1mSender e-mail address is required!\033[m\n"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# - To encode a header using this technique you must use this format:
|
||||||
|
# -
|
||||||
|
# - =?charset?encoding?encoded-text?=
|
||||||
|
# -
|
||||||
|
# - The encoding must be either B or Q, these mean base 64 and quoted-printable respectively.
|
||||||
|
# - You can read the RFC 1342 document for more information about how they work.
|
||||||
|
# -
|
||||||
|
subject_encoded=""
|
||||||
|
if echo "$subject" 2> /dev/null | file -i - | grep -i -q utf-8 ; then
|
||||||
|
subject_encoded="=?UTF-8?B?$(echo "$subject" | base64)?="
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [[ -z "$sender_address" ]] ; then
|
||||||
|
echo ""
|
||||||
|
echo -e "\033[32m--\033[m"
|
||||||
|
echo ""
|
||||||
|
echo "Enter the sender e-mail address you want to use for sending the info e-mails."
|
||||||
|
echo ""
|
||||||
|
sender_address=""
|
||||||
|
if [[ -n "$default_sender_address" ]]; then
|
||||||
|
echononl "Sender e-mail [$default_sender_address]: "
|
||||||
|
read sender_address
|
||||||
|
if [[ -z "$sender_address" ]]; then
|
||||||
|
sender_address="$default_sender_address"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
while [[ -z "$sender_address" ]] ; do
|
||||||
|
echononl "Sender e-mail: "
|
||||||
|
read sender_address
|
||||||
|
if [[ -z "" ]]; then
|
||||||
|
echo -e "\n \033[33m\033[1mSender e-mail address is required!\033[m\n"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# - Secret Key for $sender_address must be present
|
||||||
|
# -
|
||||||
|
if ! gpg --list-secret-keys "${sender_address}" > /dev/null 2>&1 ; then
|
||||||
|
fatal "No secret key for id \"${sender_address}\" found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [[ -z "$gpg_pw" ]]; then
|
||||||
|
_gpg_pw_1="X"
|
||||||
|
_gpg_pw_2="Y"
|
||||||
|
echo ""
|
||||||
|
echo -e "\033[32m--\033[m"
|
||||||
|
echo ""
|
||||||
|
echo "Enter gpg password for ${sender_address}. The password will not"
|
||||||
|
echo "be shown at the command line"
|
||||||
|
echo ""
|
||||||
|
while [[ "$_gpg_pw_1" != "$_gpg_pw_2" ]] ; do
|
||||||
|
echononl "Password: "
|
||||||
|
read -s _gpg_pw_1
|
||||||
|
echo
|
||||||
|
if [ "X$_gpg_pw_1" = "X" ]; then
|
||||||
|
echo -e "\n \033[33m\033[1mPassword is required!\033[m\n"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echononl "Repeat password: "
|
||||||
|
read -s _gpg_pw_2
|
||||||
|
echo
|
||||||
|
if [ "X$_gpg_pw_2" = "X" ]; then
|
||||||
|
echo -e "\n \033[33m\033[1mPassword is required!\033[m\n"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [ "$_gpg_pw_1" != "$_gpg_pw_2" ];then
|
||||||
|
echo -e "\n\t\033[33m\033[1mThe given passwords differs!\033[m\n"
|
||||||
|
else
|
||||||
|
gpg_pw=$_gpg_pw_1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
gpg-connect-agent reloadagent /bye > /dev/null 2>&1
|
||||||
|
if ! $(echo "$gpg_pw" | gpg --trust-model=always --pinentry-mode loopback -o /dev/null --local-user $sender_address --passphrase $gpg_pw -as - > /dev/null 2>&1) ; then
|
||||||
|
fatal "Password does not match user id '${sender_address}'!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
clear
|
||||||
|
echo ""
|
||||||
|
echo -e "\033[32m--\033[m"
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
echo -e " \033[1;32mSettings for script \033[1m$(basename "$0")\033[m"
|
||||||
|
echo ""
|
||||||
|
echo -e " Sender Address...................: $sender_address"
|
||||||
|
echo -e " E-Mail Subject...................: $subject"
|
||||||
|
if [[ -n "$subject_encoded" ]] ; then
|
||||||
|
echo -e " E-Mail Subject (utf-8 encoded)...: $subject_encoded"
|
||||||
|
fi
|
||||||
|
echo -e " File containing the message......: $orig_msg_file"
|
||||||
|
echo ""
|
||||||
|
echo -e " Message: \n\n\033[1m$(cat "$orig_msg_file")\033[m\n"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echononl "Type upper case \033[1;37mYES\033[m to continue executing this script: "
|
||||||
|
read OK
|
||||||
|
if [[ "$OK" = "YES" ]] ; then
|
||||||
|
echo ""
|
||||||
|
echo -e "\033[32m--\033[m"
|
||||||
|
echo ""
|
||||||
|
echo -e " \033[32m----------\033[m"
|
||||||
|
echo -e " \033[1mStarting Script to inform all Listadmins\033[m"
|
||||||
|
echo -e " \033[32m----------\033[m"
|
||||||
|
echo_log "# ----------------------------------------------------------------"
|
||||||
|
echo_log "# - Log output of script '$(basename $0)' at $_date"
|
||||||
|
echo_log "# ----------------------------------------------------------------"
|
||||||
|
echo_log ""
|
||||||
|
echo_log "----------"
|
||||||
|
echo_log "Settings for script $(basename "$0"):"
|
||||||
|
echo_log "----------"
|
||||||
|
echo_log ""
|
||||||
|
echo_log "Sender Address...................: $sender_address"
|
||||||
|
echo_log "E-Mail Subject...................: $subject"
|
||||||
|
if [[ -n "$subject_encoded" ]] ; then
|
||||||
|
echo_log "E-Mail Subject (utf-8 encoded)...: $subject_encoded"
|
||||||
|
fi
|
||||||
|
echo_log "File containing the message......: $orig_msg_file"
|
||||||
|
echo_log ""
|
||||||
|
echo_log "Message: "
|
||||||
|
echo_log "--"
|
||||||
|
echo_log "$(cat "$orig_msg_file")"
|
||||||
|
echo_log "--"
|
||||||
|
|
||||||
|
else
|
||||||
|
fatal "Abort by user request - Answer as not 'YES'"
|
||||||
|
fio ""
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
|
||||||
|
echononl " Create log directory"
|
||||||
|
if [[ ! -d "$log_dir" ]]; then
|
||||||
|
mkdir "$log_dir" > /dev/null 2>&1
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo_failed
|
||||||
|
else
|
||||||
|
echo_done
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo_skipped
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
echo -e " \033[32m----------\033[m"
|
||||||
|
echo -e " \033[1mSummary Lists at $(hostname -f)\033[m"
|
||||||
|
echo -e " \033[32m----------\033[m"
|
||||||
|
echo ""
|
||||||
|
echo_log ""
|
||||||
|
echo_log ""
|
||||||
|
echo_log "----------"
|
||||||
|
echo_log "Summary Lists at $(hostname -f)"
|
||||||
|
echo_log "----------"
|
||||||
|
echo_log
|
||||||
|
|
||||||
|
# - Get Schleuder domains
|
||||||
|
# -
|
||||||
|
while IFS= read -r -d '' _dir ; do
|
||||||
|
schleuder_domains_arr+=("$(basename "$_dir")")
|
||||||
|
done < <(find "$schleuder_lists_dir" -mindepth 1 -maxdepth 1 -type d -print0)
|
||||||
|
|
||||||
|
echo_log "Schleuder Domains:"
|
||||||
|
echo -e " \033[32m\033[1mSchleuder Domains\033[m:"
|
||||||
|
for _domain in ${schleuder_domains_arr[@]} ; do
|
||||||
|
echo_log " $_domain"
|
||||||
|
echo " $_domain"
|
||||||
|
done
|
||||||
|
|
||||||
|
# - Get Schleuder lists
|
||||||
|
# -
|
||||||
|
for _domain in ${schleuder_domains_arr[@]} ; do
|
||||||
|
while IFS= read -r -d '' _list ; do
|
||||||
|
schleuder_lists_arr+=("$_domain:$(basename "$_list")")
|
||||||
|
done < <(find "${schleuder_lists_dir}/${_domain}" -mindepth 1 -maxdepth 1 -type d -print0 | sort -z )
|
||||||
|
done
|
||||||
|
|
||||||
|
echo_log ""
|
||||||
|
echo_log "Schleuder Lists"
|
||||||
|
echo -e "\n \033[32m\033[1mSchleuder Lists\033[m:"
|
||||||
|
for _val in "${schleuder_lists_arr[@]}" ; do
|
||||||
|
IFS=':' read -a _val_arr <<< "${_val}"
|
||||||
|
_domain="${_val_arr[0]}"
|
||||||
|
_list="${_val_arr[1]}"
|
||||||
|
if [[ -n "$_last_domain" ]] && [[ "$_last_domain" != "$_domain" ]] ; then
|
||||||
|
echo_log ""
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
echo_log " ${_domain}: ${_list}"
|
||||||
|
echo " ${_domain}: ${_list}"
|
||||||
|
_last_domain="$_domain"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
echo -e " \033[32m----------\033[m"
|
||||||
|
echo -e " \033[1mMain part of script: inform list admins\033[m"
|
||||||
|
echo -e " \033[32m----------\033[m"
|
||||||
|
echo_log ""
|
||||||
|
echo_log ""
|
||||||
|
echo_log "----------"
|
||||||
|
echo_log "Main part of script: inform list admins"
|
||||||
|
echo_log "----------"
|
||||||
|
|
||||||
|
# - Export key of $sender_address into temporary directory ($LOCK_DIR)
|
||||||
|
# -
|
||||||
|
#echononl " Export public key '${sender_address}'.."
|
||||||
|
#gpg -a --export $sender_address > ${LOCK_DIR}/${sender_address}.asc 2> "$err_msg"
|
||||||
|
#if [[ $? -ne 0 ]]; then
|
||||||
|
# echo_log_failed "Export public key '${sender_address}'"
|
||||||
|
# echo_log "$(cat "$err_msg")"
|
||||||
|
# echo_failed
|
||||||
|
# error "$(cat "$err_msg")"
|
||||||
|
#else
|
||||||
|
# echo_done
|
||||||
|
# echo_log_done "Export public key '${sender_address}'"
|
||||||
|
#fi
|
||||||
|
|
||||||
|
for _val in "${schleuder_lists_arr[@]}" ; do
|
||||||
|
|
||||||
|
_missing_key=false
|
||||||
|
_message_prepared=false
|
||||||
|
_message_encrypted=false
|
||||||
|
|
||||||
|
IFS=':' read -a _val_arr <<< "${_val}"
|
||||||
|
_domain="${_val_arr[0]}"
|
||||||
|
_list="${_val_arr[1]}"
|
||||||
|
|
||||||
|
msg_file="${LOCK_DIR}/msg-${_list}-${_domain}.txt"
|
||||||
|
msg_file_encrypted="${LOCK_DIR}/msg_encrypted-${_list}-${_domain}.asc"
|
||||||
|
|
||||||
|
echo_log ""
|
||||||
|
echo_log "${_list}@${_domain}:"
|
||||||
|
echo -e "\n \033[32m\033[1m${_domain} - ${_list}\033[m:"
|
||||||
|
|
||||||
|
# - Copy original message in tmp folder ($LOCK_DIR)
|
||||||
|
# -
|
||||||
|
cp "$orig_msg_file" "$msg_file" > "$err_msg" 2>&1
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo_log "$(cat "$err_msg")"
|
||||||
|
error "$(cat "$err_msg")"
|
||||||
|
lists_failed+=("${_list}@$_domain")
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
echononl " Add List Key to keyring of 'root'"
|
||||||
|
if ! gpg -k "${_list}@$_domain" > /dev/null 2>&1 ; then
|
||||||
|
gpg --batch --yes --home "$_list_dir" -a --export ${_list}@$_domain | gpg --import
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo_log_failed "Add List Key to keyring of 'root'"
|
||||||
|
echo_failed
|
||||||
|
lists_failed+=("${_list}@$_domain")
|
||||||
|
continue
|
||||||
|
else
|
||||||
|
echo_log_done "Add List Key to keyring of 'root'"
|
||||||
|
echo_done
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo_log_skipped "Add List Key to keyring of 'root'"
|
||||||
|
echo_skipped
|
||||||
|
fi
|
||||||
|
|
||||||
|
# - Check if gpg key of $sender_address is part of the keyring. Add key if missing
|
||||||
|
# -
|
||||||
|
_list_dir="${schleuder_lists_dir}/${_domain}/${_list}"
|
||||||
|
echononl " Adding key '$sender_address' to keyring.."
|
||||||
|
if ! gpg --home "$_list_dir" -k "$sender_address" > /dev/null 2>&1 ; then
|
||||||
|
#gpg --batch --yes --home "$_list_dir" --import /home/ckubu/support.so36.net.asc > "$err_msg" 2>&1
|
||||||
|
gpg --batch --yes -a --export "$sender_address" | gpg --home "$_list_dir" --import > "$err_msg" 2>&1
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo_log_failed "Adding key '$sender_address' to keyring"
|
||||||
|
echo_log "$(cat "$err_msg")"
|
||||||
|
echo_failed
|
||||||
|
error "$(cat "$err_msg")"
|
||||||
|
lists_failed+=("${_list}@$_domain")
|
||||||
|
continue
|
||||||
|
else
|
||||||
|
echo_log_done "Adding key '$sender_address' to keyring"
|
||||||
|
echo_done
|
||||||
|
fi
|
||||||
|
_missing_key=true
|
||||||
|
else
|
||||||
|
echo_log_skipped "Adding key '$sender_address' to keyring"
|
||||||
|
echo_skipped
|
||||||
|
fi
|
||||||
|
|
||||||
|
echononl " Adjust message file for list.."
|
||||||
|
perl -i -n -p -e "s/\@LIST\@/${_list}\@${_domain}/g" "$msg_file" > "$err_msg" 2>&1
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo_log_failed "Adjust message file for list"
|
||||||
|
echo_log "$(cat "$err_msg")"
|
||||||
|
echo_failed
|
||||||
|
error "$(cat "$err_msg")"
|
||||||
|
lists_failed+=("${_list}@$_domain")
|
||||||
|
else
|
||||||
|
echo_log_done "Adjust message file for list"
|
||||||
|
echo_done
|
||||||
|
_message_prepared=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echononl " Encrypt and sign message for list.."
|
||||||
|
if $_message_prepared ; then
|
||||||
|
gpg --trust-model=always --pinentry-mode loopback --passphrase $gpg_pw -a -se -u "${sender_address}" -r "${_list}@$_domain" -o "${msg_file_encrypted}" "${msg_file}" > "$err_msg" 2>&1
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo_log_failed "Encrypt and sign message for list"
|
||||||
|
echo_log "$(cat "$err_msg")"
|
||||||
|
echo_failed
|
||||||
|
error "$(cat "$err_msg")"
|
||||||
|
lists_failed+=("${_list}@$_domain")
|
||||||
|
else
|
||||||
|
echo_log_done "Encrypt and sign message for list"
|
||||||
|
echo_done
|
||||||
|
_message_encrypted=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $_message_encrypted ; then
|
||||||
|
boundery_1="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 33 | head -n 1)"
|
||||||
|
boundery_2="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 33 | head -n 1)"
|
||||||
|
message_id="$(cat /dev/urandom | tr -dc 'a-f0-9' | fold -w 8 | head -n 1)-$(cat /dev/urandom | tr -dc 'a-f0-9' | fold -w 4 | head -n 1)-$(cat /dev/urandom | tr -dc 'a-f0-9' | fold -w 4 | head -n 1)-$(cat /dev/urandom | tr -dc 'a-f0-9' | fold -w 4 | head -n 1)-$(cat /dev/urandom | tr -dc 'a-f0-9' | fold -w 12 | head -n 1)@so36.net"
|
||||||
|
|
||||||
|
if [[ -n "$subject_encoded" ]] ; then
|
||||||
|
subject="$subject_encoded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOF > "${LOCK_DIR}/e-mail-${_list}-${_domain}.txt"
|
||||||
|
Content-Type: multipart/mixed; boundary="$boundery_1";
|
||||||
|
protected-headers="v1"
|
||||||
|
From: so36.NET <support@so36.net>
|
||||||
|
To: ${_list}-owner@$_domain
|
||||||
|
Date: $(date +"%a, %d %b %Y %H:%M:%S %z")
|
||||||
|
Message-ID: <$message_id>
|
||||||
|
Subject: $subject
|
||||||
|
|
||||||
|
--$boundery_1
|
||||||
|
Content-Type: multipart/mixed; boundary="$boundery_2"
|
||||||
|
|
||||||
|
--$boundery_2
|
||||||
|
Content-Type: text/plain; charset=utf-8
|
||||||
|
Content-Language: de-DE
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat "$msg_file_encrypted" >> "${LOCK_DIR}/e-mail-${_list}-${_domain}.txt"
|
||||||
|
|
||||||
|
cat <<EOF >> "${LOCK_DIR}/e-mail-${_list}-${_domain}.txt"
|
||||||
|
|
||||||
|
--$boundery_2--
|
||||||
|
|
||||||
|
--$boundery_1--
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echononl " Send info e-mail to list owner .."
|
||||||
|
cat "${LOCK_DIR}/e-mail-${_list}-${_domain}.txt" | su schleuder -c"/usr/local/bin/schleuder work ${_list}-owner@$_domain" -s /bin/bash
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo_log_failed "Send info e-mail to list owner"
|
||||||
|
echo_failed
|
||||||
|
lists_failed+=("${_list}@$_domain")
|
||||||
|
else
|
||||||
|
echo_log_done "Send info e-mail to list owner"
|
||||||
|
echo_done
|
||||||
|
lists_done+=("${_list}@$_domain")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echononl " Removing key of '$sender_address' from list keyring.."
|
||||||
|
if $_missing_key ; then
|
||||||
|
gpg --batch --yes --home "$_list_dir" --delete-key "$sender_address" > "$err_msg" 2>&1
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo_log_failed "Removing key of '$sender_address' from list keyring"
|
||||||
|
echo_log "$(cat "$err_msg")"
|
||||||
|
echo_failed
|
||||||
|
warn "$(cat "$err_msg")"
|
||||||
|
lists_warn+=("${_list}@$_domain")
|
||||||
|
else
|
||||||
|
echo_log_done "Removing key of '$sender_address' from list keyring"
|
||||||
|
echo_done
|
||||||
|
fi
|
||||||
|
echononl " Set ownerchip of list keyring back to '${schleuder_user}'"
|
||||||
|
chown ${schleuder_user}:${schleuder_group} $_list_dir/pubring.* > "$err_msg" 2>&1
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo_log_failed "Set ownerchip of list keyring back to '${schleuder_user}'"
|
||||||
|
echo_log "$(cat "$err_msg")"
|
||||||
|
echo_failed
|
||||||
|
warn "$(cat "$err_msg")"
|
||||||
|
lists_warn+=("${_list}@$_domain")
|
||||||
|
else
|
||||||
|
echo_log_done "Set ownerchip of list keyring back to '${schleuder_user}'"
|
||||||
|
echo_done
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo_log_skipped "Removing key of '$sender_address' from list keyring"
|
||||||
|
echo_skipped
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
# - Clear cached gpg password
|
||||||
|
# -
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
echo_log ""
|
||||||
|
echo_log ""
|
||||||
|
echononl " Clear cached gpg password.."
|
||||||
|
gpg-connect-agent reloadagent /bye > "$err_msg" 2>&1
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo_log_failed "Clear cached gpg password"
|
||||||
|
echo_log "$(cat "$err_msg")"
|
||||||
|
echo_failed
|
||||||
|
error "$(cat "$err_msg")"
|
||||||
|
else
|
||||||
|
echo_log_done "Clear cached gpg password"
|
||||||
|
echo_done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echononl " Archive msg file.."
|
||||||
|
mv "$orig_msg_file" "${orig_msg_file}.${_date}.sent"
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo_log_failed "Archive msg file"
|
||||||
|
echo_log "$(cat "$err_msg")"
|
||||||
|
echo_failed
|
||||||
|
error "$(cat "$err_msg")"
|
||||||
|
else
|
||||||
|
echo_log_done "Archive msg file"
|
||||||
|
echo_done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
echo -e " \033[32m----------\033[m"
|
||||||
|
echo -e " \033[1mStatistics \033[m"
|
||||||
|
echo -e " \033[32m----------\033[m"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${#lists_done[@]} lists successfully informed"
|
||||||
|
echo -e " ${#lists_warn[@]} lists with warnings"
|
||||||
|
echo -e " ${#lists_failed[@]} lists failed"
|
||||||
|
echo_log ""
|
||||||
|
echo_log ""
|
||||||
|
echo_log "----------"
|
||||||
|
echo_log "Statistics"
|
||||||
|
echo_log "----------"
|
||||||
|
echo_log
|
||||||
|
echo_log "${#lists_done[@]} lists successfully informed"
|
||||||
|
echo_log "${#lists_warn[@]} lists with warnings"
|
||||||
|
echo_log "${#lists_failed[@]} lists failed"
|
||||||
|
echo_log
|
||||||
|
if [[ ${#lists_failed[@]} -gt 0 ]]; then
|
||||||
|
echo_log "Listadmin(s) not informed:"
|
||||||
|
echo -e "\n \033[1mListadmin(s) not informed:\033[m"
|
||||||
|
for _list in "${lists_failed[@]}" ; do
|
||||||
|
echo -e " $_list"
|
||||||
|
echo_log " $_list"
|
||||||
|
done
|
||||||
|
echo_log
|
||||||
|
info "See also log file: $log_file"
|
||||||
|
else
|
||||||
|
info "See also script output at log file: $log_file"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
clean_up 0
|
||||||
|
|
Loading…
Reference in New Issue
Block a user