xmpp.chapril.org-tools/rapport_activite/rapport_activites.sh
2021-06-30 22:04:11 +02:00

278 lines
10 KiB
Bash
Executable File

#! /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 "* Total calls: $(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) MiB, max $(get_max_UDP_turn_relayed_data) MiB, total $(get_total_UDP_turn_relayed_data) MiB"
echo "** TCP: avg $(get_avg_TCP_turn_relayed_data) MiB, max $(get_max_TCP_turn_relayed_data) MiB, total $(get_total_TCP_turn_relayed_data) MiB"
echo "** TLS: avg $(get_avg_TLS_turn_relayed_data) MiB, max $(get_max_TLS_turn_relayed_data) MiB, total $(get_total_TLS_turn_relayed_data) MiB"
echo ""
echo "h2. ## XMPP/IRC Bridge (Biboumi) usage:"
echo ""
echo "* Total channels active: $(count_biboumi_active_chan)"
echo "** through $(count_biboumi_active_servers) IRC server(s)"
echo "* Total users: $(count_biboumi_users)"
# echo "** Active: $(count_biboumi_active_users '1 MONTH') (External accounts: $(count_biboumi_active_external_users '1 MONTH'))"
# echo "** Inactive: $(count_biboumi_inactive_users '1 MONTH') (External accounts: $(count_biboumi_inactive_external_users '1 MONTH'))"
# echo "* Total messages stored (MAM): $(count_biboumi_archived_messages)"
}
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() {
sudo -Hiu postgres psql 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}'
}
count_biboumi_users() {
sql="select count(distinct owner_)
from muclogline_"
sudo -Hiu postgres psql biboumi -c "${sql}" -t | grep -v '^$' | awk '{print $1}'
}
count_biboumi_active_users() {
since=${1:-'1 MONTH'}
sql="select count(distinct owner_)
from (
select owner_,date_
from muclogline_ as m1
where date_ = (
select max(date_)
from muclogline_ as m2
where m2.owner_ = m1.owner_ ) ) as m0
where to_timestamp(m0.date_) > current_timestamp - interval '${since}'"
sudo -Hiu postgres psql biboumi -c "${sql}" -t | grep -v '^$' | awk '{print $1}'
}
count_biboumi_active_external_users() {
since=${1:-'1 MONTH'}
sql="select count(distinct owner_)
from (
select owner_,date_
from muclogline_ as m1
where date_ = (
select max(date_)
from muclogline_ as m2
where m2.owner_ = m1.owner_ ) ) as m0
where to_timestamp(m0.date_) > current_timestamp - interval '${since}'
and m0.owner_ not like '%chapril.org%'"
sudo -Hiu postgres psql biboumi -c "${sql}" -t | grep -v '^$' | awk '{print $1}'
}
count_biboumi_inactive_users() {
since=${1:-'1 MONTH'}
sql="select count(distinct owner_)
from (
select owner_,date_
from muclogline_ as m1
where date_ = (
select max(date_)
from muclogline_ as m2
where m2.owner_ = m1.owner_ ) ) as m0
where to_timestamp(m0.date_) < current_timestamp - interval '${since}'"
sudo -Hiu postgres psql biboumi -c "${sql}" -t | grep -v '^$' | awk '{print $1}'
}
count_biboumi_inactive_external_users() {
since=${1:-'1 MONTH'}
sql="select count(distinct owner_)
from (
select owner_,date_
from muclogline_ as m1
where date_ = (
select max(date_)
from muclogline_ as m2
where m2.owner_ = m1.owner_ ) ) as m0
where to_timestamp(m0.date_) < current_timestamp - interval '${since}'
and m0.owner_ not like '%chapril.org%'"
sudo -Hiu postgres psql biboumi -c "${sql}" -t | grep -v '^$' | awk '{print $1}'
}
count_biboumi_archived_messages() {
since=${1:-'1 MONTH'}
sql="select count(body_)
from muclogline_"
sudo -Hiu postgres psql biboumi -c "${sql}" -t | grep -v '^$' | awk '{print $1}'
}
count_biboumi_active_servers() {
since=${1:-'1 MONTH'}
sql="select count(distinct ircservername_)
from muclogline_
where to_timestamp(date_) > current_timestamp - interval '${since}'"
sudo -Hiu postgres psql biboumi -c "${sql}" -t | grep -v '^$' | awk '{print $1}'
}
count_biboumi_active_chan() {
since=${1:-'1 MONTH'}
sql="select count(distinct ircchanname_)
from muclogline_
where to_timestamp(date_) > current_timestamp - interval '${since}'"
sudo -Hiu postgres psql biboumi -c "${sql}" -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 $yearMonth
}
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)
echo "scale=4; $n / 1024" | bc -l
}
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)
echo "scale=4; $n / 1024" | bc -l
}
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)
echo "scale=4; $n / 1024" | bc -l
}
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 -g | tail -n 1)
echo "scale=4; $n / 1024" | bc -l
}
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 -g | tail -n 1)
echo "scale=4; $n / 1024" | bc -l
}
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 -g | tail -n 1)
echo "scale=4; $n / 1024" | bc -l
}
get_avg_UDP_turn_relayed_data() {
n=$(zgrep "$DATE" /var/log/ejabberd/ejabberd.log* | grep -i -e "Offering stun" | 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 "Offering stun" | 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 "Offering stun" | 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