#! /bin/bash STORAGE_DIR="/var/www/xmpp.chapril.org/upload/" main() { echo "h2. ## Global info" echo "" echo "* Total accounts: $(sudo -u ejabberd ejabberdctl registered_users chapril.org | egrep -v -e 'r\.giskard' -e '(lisa|bart)\.simpson' | wc -l)" echo "** Active: $(count_active_accounts)" echo "** Inactive: $(count_inactive_accounts '1 MONTH')" echo "** Removable: $(count_removable_accounts '6 MONTHS')" echo "* Total messages stored (MAM): $(count_archived_messages) " echo "* Total rooms active: $(sudo -u ejabberd ejabberdctl muc_online_rooms global | wc -l)" echo "" echo "_* Inactive accounts:_ no connection during last month" echo "_* Removable accounts:_ no connection in the last 6 months *and* didn't read the welcome message" echo "" echo "h2. ## HTTP upload storage:" echo "" echo "* User quota: $(get_hard_quota)M" echo "* Total disk usage: $(du -sh ${STORAGE_DIR} | awk '{print $1}')" per_account_storage_usage DATE=$(get_last_month) echo "" echo "h2. ## Audio/Video Call usage:" echo "" echo "* Number of calls relayed: $(zgrep $DATE /var/log/ejabberd/ejabberd.log* | grep -i -e "Offering stun" | wc -l)" echo "* Data relayed per protocol per call:" echo "** UDP: avg $(get_avg_UDP_turn_relayed_data) KiB, max $(get_max_UDP_turn_relayed_data) KiB, total $(get_total_UDP_turn_relayed_data) KiB" echo "** TCP: avg $(get_avg_TCP_turn_relayed_data) KiB, max $(get_max_TCP_turn_relayed_data) KiB, total $(get_total_TCP_turn_relayed_data) KiB" echo "** TLS: avg $(get_avg_TLS_turn_relayed_data) KiB, max $(get_max_TLS_turn_relayed_data) KiB, total $(get_total_TLS_turn_relayed_data) KiB" } get_hard_quota() { grep hard_quota /etc/ejabberd/ejabberd.yml -A2 | grep all | sed -r 's/^\s*-\s([0-9]+).*/\1/' } per_account_storage_usage() { # TODO Directories to ignore because they are used for tests accounts (bart and lisa simpsons) IGNORE_DIRS="35eae3ddc83d72e4d3fad3160a400db688d7d936 9be859c77649f33d207cbe0d74a126b2fd31cb33" echo "Per user disk usage:" tmp="$(du -sh ${STORAGE_DIR}* | sort -hr | awk '{print $1}')" echo "** Max: "$(echo "${tmp}" | head -n 1) # echo " Min: "$(echo "${tmp}" | tail -n 1) subfolders_count=$(find ${STORAGE_DIR} -mindepth 1 -maxdepth 1 -type d | wc -l) total_size=$(du -s ${STORAGE_DIR} | awk '{print $1}') avg=$(((${total_size} / 1024) / ${subfolders_count})) echo "** Avg: ${avg}M" } count_active_accounts() { since=${1:-'1 MONTH'} sql="select count(distinct l.username) from last l join users u on l.username = u.username where to_timestamp(cast(l.seconds as int)) > current_timestamp - interval '${since}' and l.username not in ('r.giskard', 'lisa.simpson', 'bart.simpson')" psql -U ejabberd -h localhost ejabberd -c "${sql}" -t | grep -v '^$' | awk '{print $1}' } count_inactive_accounts() { since=${1:-'1 MONTH'} sql="select count(distinct l.username) from last l join users u on l.username = u.username where to_timestamp(cast(l.seconds as int)) < current_timestamp - interval '${since}' and l.username not in ('r.giskard', 'lisa.simpson', 'bart.simpson')" psql -U ejabberd -h localhost ejabberd -c "${sql}" -t | grep -v '^$' | awk '{print $1}' } count_removable_accounts() { # Accounts inactive *and* who never read the welcome message. since=${1:-'6 MONTHS'} sql="select count(distinct l.username) from last l join users u on l.username = u.username join spool s on l.username = s.username where to_timestamp(cast(l.seconds as int)) < current_timestamp - interval '${since}' and s.xml like '%from=''chapril.org'' xmlns=''jabber:client''%Bienvenue sur le serveur%' and s.username not in ('r.giskard', 'lisa.simpson', 'bart.simpson')" psql -U ejabberd -h localhost ejabberd -c "${sql}" -t | grep -v '^$' | awk '{print $1}' } count_archived_messages() { psql -U ejabberd -h localhost ejabberd -c "select count(*) from archive where peer not like 'irc%' and username not in ('r.giskard', 'lisa.simpson', 'bart.simpson')" -t | grep -v '^$' | awk '{print $1}' } get_last_month() { if [ "$(date +%m)" -gt 1 ]; then precedingMonth="$((10#$(date +%m)-1))" year="$(date +%Y)" if [ $precedingMonth -lt 10 ]; then yearMonth="$year-0$precedingMonth" else yearMonth="$year-$precedingMonth" fi else [ "$(date +%m)" -eq 1 ] precedingMonth=12 year="$(($(date +%Y)-1))" yearMonth="$year-$precedingMonth" fi echo "$year-$precedingMonth" } get_total_UDP_turn_relayed_data() { n=$(zgrep "$DATE" /var/log/ejabberd/ejabberd.log* | grep -i -e "Relayed" | grep "UDP" | cut -d" " -f6-6 | paste -sd+ - | bc) if [ -z $n ]; then echo 0 else echo $n fi } get_total_TCP_turn_relayed_data() { n=$(zgrep "$DATE" /var/log/ejabberd/ejabberd.log* | grep -i -e "Relayed" | grep "TCP" | cut -d" " -f6-6 | paste -sd+ - | bc) if [ -z $n ]; then echo 0 else echo $n fi } get_total_TLS_turn_relayed_data() { n=$(zgrep "$DATE" /var/log/ejabberd/ejabberd.log* | grep -i -e "Relayed" | grep "TLS" | cut -d" " -f6-6 | paste -sd+ - | bc) if [ -z $n ]; then echo 0 else echo $n fi } get_max_UDP_turn_relayed_data() { n=$(zgrep "$DATE" /var/log/ejabberd/ejabberd.log* | grep -i -e "Relayed" | grep "UDP" | cut -d" " -f6-6 | sort | tail -n 1) if [ -z $n ]; then echo 0 else echo $n fi } get_max_TCP_turn_relayed_data() { n=$(zgrep "$DATE" /var/log/ejabberd/ejabberd.log* | grep -i -e "Relayed" | grep "TCP" | cut -d" " -f6-6 | sort | tail -n 1) if [ -z $n ]; then echo 0 else echo $n fi } get_max_TLS_turn_relayed_data() { n=$(zgrep "$DATE" /var/log/ejabberd/ejabberd.log* | grep -i -e "Relayed" | grep "TLS" | cut -d" " -f6-6 | sort | tail -n 1) if [ -z $n ]; then echo 0 else echo $n fi } get_avg_UDP_turn_relayed_data() { n=$(zgrep "$DATE" /var/log/ejabberd/ejabberd.log* | grep -i -e "Relayed" | grep "UDP" | wc -l) total=$(get_total_UDP_turn_relayed_data) if [ $n -eq 0 ]; then echo 0 else echo "scale=2; $total / $n" | bc -l fi } get_avg_TCP_turn_relayed_data() { n=$(zgrep "$DATE" /var/log/ejabberd/ejabberd.log* | grep -i -e "Relayed" | grep "TCP" | wc -l) total=$(get_total_TCP_turn_relayed_data) if [ $n -eq 0 ]; then echo 0 else echo "scale=2; $total / $n" | bc -l fi } get_avg_TLS_turn_relayed_data() { n=$(zgrep "$DATE" /var/log/ejabberd/ejabberd.log* | grep -i -e "Relayed" | grep "TLS" | wc -l) total=$(get_total_TLS_turn_relayed_data) if [ $n -eq 0 ]; then echo 0 else echo "scale=2; $total / $n" | bc -l fi } main