256 lines
5.8 KiB
Bash
Executable File
256 lines
5.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
|
|
# -------------
|
|
# - Settings
|
|
# -------------
|
|
|
|
declare -i sum=0
|
|
declare -i sum_over_all=0
|
|
declare -i pos
|
|
declare -i pos_begin=58
|
|
all_domains=false
|
|
|
|
info_file="/var/vmail/DISKSPACE_USAGE"
|
|
|
|
|
|
# -------------
|
|
# - Some functions
|
|
# -------------
|
|
|
|
usage() {
|
|
|
|
echo
|
|
|
|
[[ -n "$1" ]] && echo -e " [ \033[31mError\033[m ]: $1\n"
|
|
|
|
echo -e "$(cat<<EOF
|
|
|
|
\033[1mUsage\033[m: $(basename $0) <-m|-p> <-A|-d email-domain>
|
|
|
|
Prints out the diskspace used by all e-mail addresses for the given domain.
|
|
If \033[1m-A\033[m is given, diskspace usage for all domains will be printed out.
|
|
|
|
\033[1mRequires\033[m on of the options \033[1m-m\033[m or\033[m \033[1m-p\033[m for database type.
|
|
|
|
\033[1mRequires\033[m one of the options \033[1m-A\033[m or \033[1m-d\033[m email-domain.
|
|
|
|
Options:
|
|
|
|
\033[1m-A\033[m
|
|
Prints diskspace usage for all mail domains.
|
|
|
|
\033[1m-d <email-domain>\033[m
|
|
Prints out diskspace usage for the given domain.
|
|
|
|
\033[1m-h\033[m
|
|
Prints this help.
|
|
|
|
\033[1m-m\033[m
|
|
Database type is Mysql.
|
|
|
|
\033[1m-p\033[m
|
|
Database type is PostgreSQL.
|
|
\n
|
|
EOF
|
|
)"
|
|
|
|
exit 1
|
|
}
|
|
|
|
is_valid_domain() {
|
|
|
|
|
|
if [[ "@$1" =~ ^@(([[:alpha:]](-?[[:alnum:]])*)\.)*[[:alpha:]](-?[[:alnum:]])+\.[[:alpha:]]{2,}$ ]]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# - 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
|
|
}
|
|
|
|
|
|
# -------------
|
|
# - Read in Commandline Arguments
|
|
# -------------
|
|
|
|
option_m=false
|
|
option_p=false
|
|
while getopts Ad:hmp opt ; do
|
|
case $opt in
|
|
A)
|
|
all_domains=true
|
|
;;
|
|
d)
|
|
domain="$OPTARG"
|
|
;;
|
|
h)
|
|
usage
|
|
;;
|
|
m)
|
|
db_type="mysql"
|
|
option_m=true
|
|
;;
|
|
p)
|
|
db_type="psql"
|
|
option_p=true
|
|
;;
|
|
\?) usage
|
|
esac
|
|
done
|
|
|
|
shift "$((OPTIND - 1))"
|
|
|
|
|
|
[[ $# -ne "0" ]] && usage "Wrong number of arguments."
|
|
|
|
[[ -z "$db_type" ]] && usage "\033[1mMissing\033[m Option \033[1m-m\033[m or \033[1m-p\033[m"
|
|
|
|
if $option_m && $option_p ; then
|
|
usage "\033[1mEither\033[m option \033[1m-m OR \033[moption \033[1m-p\033[m must be given."
|
|
fi
|
|
|
|
if ! $all_domains && [[ -z "$domain" ]] ; then
|
|
usage "\033[1mMissing\033[m Option \033[1m-A\033[m or \033[1m-d\033[m"
|
|
fi
|
|
|
|
if $all_domains && [[ -n "$domain" ]] ; then
|
|
usage "\033[1mEither\033[m option \033[1m-A OR \033[moption \033[1m-d\033[m must be given."
|
|
fi
|
|
|
|
|
|
|
|
if [[ -n $domain ]] && ! is_valid_domain $domain ; then
|
|
usage "Given Domain \033[1m$domain\033[m is invalid"
|
|
fi
|
|
|
|
|
|
# -------------
|
|
# - Do the stuff
|
|
# -------------
|
|
|
|
if [[ -t 1 ]] ; then
|
|
terminal=true
|
|
else
|
|
terminal=false
|
|
fi
|
|
|
|
|
|
if $all_domains ; then
|
|
if [[ $db_type == 'psql' ]]; then
|
|
domains=$(su - postgres -c "psql -q -t postfix -c 'SELECT domain FROM domain'" | sort)
|
|
alias_domains=$(su - postgres -c "psql -q -t postfix -c 'SELECT alias_domain FROM alias_domain'" | sort)
|
|
elif [[ $db_type == 'mysql' ]]; then
|
|
|
|
if [[ -f "/usr/local/mysql/sys-maint.cnf" ]] ; then
|
|
mysql_credential_args="--defaults-file=/usr/local/mysql/sys-maint.cnf"
|
|
elif [[ -f "/etc/mysql/debian.cnf" ]] ; then
|
|
mysql_credential_args="--defaults-file=/etc/mysql/debian.cnf"
|
|
fi
|
|
|
|
domains=$(mysql $mysql_credential_args -N -s postfix -e "SELECT domain FROM domain")
|
|
alias_domains=$(mysql $mysql_credential_args -N -s postfix -e "SELECT alias_domain FROM alias_domain")
|
|
else
|
|
usage "Database Type \033[1m${db_type}\033[m not known."
|
|
fi
|
|
|
|
declare -a alias_domain_arr
|
|
for _domain in $alias_domains ; do
|
|
alias_domain_arr+=("$_domain")
|
|
done
|
|
|
|
echo "# --------------------" > $info_file
|
|
echo "# - Diskpace usage of e-mail domains at $(hostname -f)" >> $info_file
|
|
echo "# --------------------" >> $info_file
|
|
echo "" >> $info_file
|
|
|
|
else
|
|
domains=$domain
|
|
fi
|
|
|
|
if $terminal ; then
|
|
echo ""
|
|
fi
|
|
|
|
for _domain in $domains ; do
|
|
[[ "$_domain" == "ALL" ]] && continue
|
|
if containsElement "$_domain" "${alias_domain_arr[@]}" ; then
|
|
continue
|
|
fi
|
|
|
|
sum=0
|
|
while read address used fake ; do
|
|
[[ $used =~ ^-?[0-9]+$ ]] || continue
|
|
if [[ $used -gt 0 ]] ; then
|
|
sum=$(( $sum + $used))
|
|
fi
|
|
done < <( doveadm quota get -A 2> /dev/null | grep STORAGE | grep $_domain | awk '{print$1" "$5}' )
|
|
|
|
sum_over_all=$(( $sum_over_all + $sum))
|
|
pos=$(( $pos_begin - ${#sum}))
|
|
if [[ $sum -gt 999999 ]]; then
|
|
pos=$(( $pos - 2 ))
|
|
elif [[ $sum -gt 999 ]]; then
|
|
pos=$(( $pos - 1 ))
|
|
fi
|
|
|
|
if $terminal ; then
|
|
echo -e " $_domain: \033[${pos}G$(printf "%'d" $sum) KB"
|
|
fi
|
|
|
|
if $all_domains ; then
|
|
echo -n " $_domain:" >> $info_file
|
|
j=1
|
|
pos=$(( $pos - ${#_domain} ))
|
|
while [[ $j -lt $pos ]]; do
|
|
echo -n "." >> $info_file
|
|
let "j += 1"
|
|
done
|
|
echo "$(printf "%'d" $sum) KB" >> $info_file
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
if $all_domains ; then
|
|
|
|
pos=$(( $pos_begin - ${#sum_over_all}))
|
|
if [[ $sum_over_all -gt 999999 ]]; then
|
|
pos=$(( $pos - 2 ))
|
|
elif [[ $sum_over_all -gt 999 ]]; then
|
|
pos=$(( $pos - 1 ))
|
|
fi
|
|
|
|
if $terminal ; then
|
|
echo ""
|
|
echo -e " ========================================================="
|
|
echo ""
|
|
echo -e " gesamt:\033[${pos}G$(printf "%'d" $sum_over_all) KB"
|
|
fi
|
|
|
|
echo "" >> $info_file
|
|
echo -e " =============================================================" >> $info_file
|
|
echo "" >> $info_file
|
|
echo -n " gesamt:" >> $info_file
|
|
j=1
|
|
pos=$(( $pos - 6 ))
|
|
while [[ $j -lt $pos ]]; do
|
|
echo -n " " >> $info_file
|
|
let "j += 1"
|
|
done
|
|
echo "$(printf "%'d" $sum_over_all) KB" >> $info_file
|
|
echo "" >> $info_file
|
|
fi
|
|
|
|
if $terminal ; then
|
|
echo ""
|
|
fi
|
|
exit 0
|