Initial commit
This commit is contained in:
		
							
								
								
									
										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 | ||||||
|  | 	 | ||||||
		Reference in New Issue
	
	Block a user