freebsd-ports/sysutils/bsdstats/files/300.statistics.in
Boris Samorodov 86dbd367ef . do not remove (shared) directories periodic, periodic/monthly [1] [3]
at deinstall;
. fix useless use of cat(1);  [2]
. hardcoded directory name isreplaced with the appropriate variable.  [2]

PR:		105206 [1],  119453 [2],  126632 [3]
Submitted by:	delphij [1], olli [2], bsam [3]
Approved by:	maintainer timeout
2008-08-19 10:25:06 +00:00

445 lines
11 KiB
Bash

#!/bin/sh -
#
# $FreeBSD: /tmp/pcvs/ports/sysutils/bsdstats/files/300.statistics.in,v 1.41 2008-08-19 10:25:06 bsam Exp $
#
# If there is a global system configuration file, suck it in.
#
if [ -r /etc/defaults/periodic.conf ]
then
. /etc/defaults/periodic.conf
source_periodic_confs
periodic_conf=/etc/periodic.conf
else
. /etc/rc.conf # For systems without periodic.conf, use rc.conf
if [ -r /etc/rc.conf.local ]
then
. /etc/rc.conf.local
fi
periodic_conf=/etc/rc.conf.local
fi
oldmask=$(umask)
umask 066
version="5.4"
checkin_server=${monthly_statistics_checkin_server:-"rpt.bsdstats.org"}
bsdstats_log=${monthly_statistics_logfile:-"/var/log/bsdstats"}
id_token_file='/var/db/bsdstats'
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
export PATH
unset HTTP_USER_AGENT
IFS="
"
random () {
jot -r 1 0 900
}
# RFC 2396
uri_escape () {
echo ${1+$@} | sed -e '
s/%/%25/g
s/;/%3b/g
s,/,%2f,g
s/?/%3f/g
s/:/%3a/g
s/@/%40/g
s/&/%26/g
s/=/%3d/g
s/+/%2b/g
s/\$/%24/g
s/,/%2c/g
s/ /%20/g
'
}
do_fetch () {
url="http://$checkin_server/scripts/$1"
case $(uname) in
FreeBSD )
/usr/bin/fetch -q -o - "$url"
;;
* )
/usr/bin/ftp -V -o - "$url"
;;
esac
}
check_dns () {
if [ `dig bsdstats.org txt | grep TXT | grep UP | wc -l` = 0 ]
then
echo "DNS not reachable, Network Down?"
exit
fi
}
send_devices () {
case $(uname) in
FreeBSD )
for line in `/usr/sbin/pciconf -l`
do
DRIVER=`echo $line | awk -F\@ '{print $1}'`
DEV=`echo $line | awk '{print $4}' | cut -c8-15`
CLASS=`echo $line | awk '{print $2}' | cut -c9-14`
query_string=$query_string`echo \&dev[]=$DRIVER:$DEV:$CLASS`
done
report_devices
;;
* )
# Not supported
;;
esac
}
send_ports () {
case $(uname) in
FreeBSD )
for line in `/usr/sbin/pkg_info | /usr/bin/awk '{print $1}' `
do
category=`grep "@comment ORIGIN" /var/db/pkg/${line}/+CONTENTS | sed -E 's/^\@comment ORIGIN:(.+)\/.+/\1/g'`
line=$(uri_escape $line)
category=$(uri_escape $category)
query_string=$query_string`echo \&port[]=${category}:${line}`
done
report_ports
;;
* )
# Not supported
;;
esac
}
report_ports () {
# Handle HTTP proxy services
#
# HTTP_PROXY/http_proxy can take the following form:
# [http://][username:password@]proxy[:port][/]
# Authentication details may also be provided via HTTP_PROXY_AUTH:
# HTTP_PROXY_AUTH="basic:*:username:password"
#
if [ -z "$HTTP_PROXY" -a -n "$http_proxy" ]; then
HTTP_PROXY=$http_proxy
fi
if [ -n "$HTTP_PROXY" ]; then
# Attempt to resolve any HTTP authentication
if [ -n "$HTTP_PROXY_AUTH" ]; then
PROXY_AUTH_USER=`echo $HTTP_PROXY_AUTH | sed -E 's/^.+:\*:(.+):.+$/\1/g'`
PROXY_AUTH_PASS=`echo $HTTP_PROXY_AUTH | sed -E 's/^.+:\*:.+:(.+)$/\1/g'`
else
# Check for authentication within HTTP_PROXY
HAS_HTTP_AUTH=`echo $HTTP_PROXY | sed -E 's/^(http:\/\/)?(.+:.+@)?.+/\2/'`
if [ -n "$HAS_HTTP_AUTH" ]; then
# Found HTTP authentication details
PROXY_AUTH_USER=`echo $HAS_HTTP_AUTH | cut -d: -f1`
PROXY_AUTH_PASS=`echo $HAS_HTTP_AUTH | cut -d: -f2`
fi
fi
# Determine the proxy components
PROXY_HOST=`echo $HTTP_PROXY | sed -E 's/^(http:\/\/)?(.+:.+@)?([^@:]+)(:.+)?/\3/'`
PROXY_PORT=`echo $HTTP_PROXY | sed -E 's/^(http:\/\/)?(.+:.+@)?(.+):([0-9]+)/\4/' | sed -e 's/[^0-9]//g'`
if [ -z "$PROXY_PORT" ]; then
# Use default proxy port
PROXY_PORT=3128
fi
fi
# Determine the host/port netcat should connect to
if [ -n "$PROXY_HOST" -a -n "$PROXY_PORT" ]; then
nc_host=$PROXY_HOST
nc_port=$PROXY_PORT
url_prefix="http://${checkin_server}"
else
nc_host=$checkin_server
nc_port=80
fi
# Proxy authentication, if required
if [ -n "$PROXY_AUTH_USER" -a -n "$PROXY_AUTH_PASS" ]; then
auth_base64=`echo "$PROXY_AUTH_USER:$PROXY_AUTH_PASS" | openssl base64`
proxy_auth="Proxy-Authorization: Basic $auth_base64
"
fi
# Make the request
string_length=`echo ${query_string} | wc -m`
string_length=`expr ${string_length} - 1`
echo "POST ${url_prefix}/scripts/report_ports.php HTTP/1.0
Host: ${checkin_server}
User-Agent: bsdstats ${version}
Connection: close
${proxy_auth}Content-Type: application/x-www-form-urlencoded
Content-Length: ${string_length}
token=${TOKEN}&key=${KEY}${query_string}" | \
nc $nc_host $nc_port | \
grep STATUS= | {
local IFS
IFS='=
'
while read var val
do
case $var in
STATUS)
if [ $val = "OK" ]
then
echo "[`date`] System Ports reported"
else
echo "[`date`] System Ports not reported, exiting"
exit
fi
;;
*)
echo "[`date`] Error with fetch to server"
exit
;;
esac
done
} >> $bsdstats_log
}
report_devices () {
do_fetch report_devices.php?token=$TOKEN\&key=$KEY$query_string | {
local IFS
IFS='=
'
while read var val
do
case $var in
STATUS)
if [ $val = "OK" ]
then
echo "[`date`] System Devices reported"
else
echo "[`date`] System Devices not reported, exiting"
exit
fi
;;
*)
echo "[`date`] Error with fetch to server"
exit
;;
esac
done
} >> $bsdstats_log
}
get_id_token () {
if [ -f $id_token_file ]
then
if [ `wc -l < $id_token_file` -lt 3 ]
then
rm $id_token_file
fi
fi
if [ ! -f $id_token_file -o ! -s $id_token_file ] ;
then
IDTOKEN=$(uri_escape $( openssl rand -base64 32 ) )
idf=$( mktemp "$id_token_file.XXXXXX" ) && \
chown root:wheel $idf && \
chmod 600 $idf
do_fetch getid.php?key=$IDTOKEN | {
local IFS
IFS='=
'
while read var val
do
case $var in
KEY)
echo "KEY=$val"
;;
TOKEN)
echo "TOKEN=$val"
;;
*)
;;
esac
done
echo "VERSION=$version"
} > $idf && \
mv $idf $id_token_file
if [ ! -s $id_token_file ] ;
then
echo "Nothing returned from $checkin_server"
exit 1
fi
fi
. $id_token_file
KEY=$( uri_escape $KEY )
TOKEN=$( uri_escape $TOKEN )
}
enable_token () {
do_fetch enable_token.php?key=$TOKEN\&token=$KEY | {
local IFS
IFS='=
'
while read var val
do
case $var in
STATUS)
if [ $val = "OK" ]
then
echo "[`date`] System enabled"
else
echo "[`date`] System not enabled, exiting"
exit
fi
;;
*)
echo "[`date`] Error with fetch to server"
exit
;;
esac
done
} >> $bsdstats_log
}
disable_token () {
do_fetch disable_token.php?key=$TOKEN\&token=$KEY | {
local IFS
IFS='=
'
while read var val
do
case $var in
STATUS)
if [ $val = "OK" ]
then
echo "[`date`] System disabled"
else
echo "[`date`] System not disabled, exiting"
exit
fi
;;
*)
echo "[`date`] Error with fetch to server"
exit
;;
esac
done
} >> $bsdstats_log
}
report_system () {
do_fetch report_system.php?token=$TOKEN\&key=$KEY\&rel=$REL\&arch=$ARCH\&opsys=$OS | {
local IFS
IFS='=
'
while read var val
do
case $var in
STATUS)
if [ $val = "OK" ]
then
echo "[`date`] System reported"
else
echo "[`date`] System report failed, exiting"
exit
fi
;;
*)
echo "[`date`] Error with fetch to server"
exit
;;
esac
done
} >> $bsdstats_log
}
report_cpu () {
do_fetch report_cpu.php?token=$TOKEN\&key=$KEY\&cpus=$count\&vendor=$VEN\&cpu_type=$DEV | {
local IFS
IFS='=
'
while read var val
do
case $var in
STATUS)
if [ $val = "OK" ]
then
echo "[`date`] System CPU reported"
else
echo "[`date`] System CPU report failed, exiting"
exit
fi
;;
*)
echo "[`date`] Error with fetch to server"
exit
;;
esac
done
} >> $bsdstats_log
}
case "$monthly_statistics_enable" in
[Yy][Ee][Ss])
check_dns
REL=`/usr/bin/uname -r`
ARCH=`/usr/bin/uname -m`
OS=`/usr/bin/uname -s`
get_id_token
test X"$1" = X-nodelay || sleep `random`
enable_token
report_system
echo "Posting monthly OS statistics to $checkin_server"
if [ X"$1" != X-nodelay ]; then
case "$monthly_statistics_report_devices" in
[Yy][Ee][Ss])
send_devices
echo "Posting monthly device statistics to $checkin_server"
line=$( sysctl -n hw.model )
VEN=$( echo $line | cut -d ' ' -f 1 )
DEV=$( uri_escape $( echo $line | cut -d ' ' -f 2- ) )
count=$( sysctl -n hw.ncpu )
report_cpu
echo "Posting monthly CPU statistics to $checkin_server"
;;
*)
echo "Posting monthly device/CPU statistics disabled"
echo " set monthly_statistics_report_devices=\"YES\" in $periodic_conf"
;;
esac
case "$monthly_statistics_report_ports" in
[Yy][Ee][Ss])
send_ports
echo "Posting monthly ports statistics to $checkin_server"
;;
*)
echo "Posting monthly ports statistics disabled"
echo " set monthly_statistics_report_ports=\"YES\" in $periodic_conf"
;;
esac
fi
disable_token
;;
*)
echo "Posting monthly OS statistics disabled"
echo " set monthly_statistics_enable=\"YES\" in $periodic_conf"
;;
esac
umask $oldmask
exit $rc