86dbd367ef
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
445 lines
11 KiB
Bash
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
|