diff options
author | morr <morr> | 2010-03-12 00:13:40 +0000 |
---|---|---|
committer | morr <morr> | 2010-03-12 00:13:40 +0000 |
commit | 503bbe3c49c729f3145f0764ee866b37460c9881 (patch) | |
tree | c72a41f0631fc820fe5a633240fbf5b5481e4e03 /misc/bsdstats/files/300.statistics | |
parent | 0c723c12b29e79f01e5cea7577cec9c04c20a125 (diff) | |
download | pkgsrc-503bbe3c49c729f3145f0764ee866b37460c9881.tar.gz |
BSD-Stats is collecting statistics about *BSD installations (and flavours).
PR pkg/35365
Diffstat (limited to 'misc/bsdstats/files/300.statistics')
-rw-r--r-- | misc/bsdstats/files/300.statistics | 456 |
1 files changed, 456 insertions, 0 deletions
diff --git a/misc/bsdstats/files/300.statistics b/misc/bsdstats/files/300.statistics new file mode 100644 index 00000000000..8d7fd626a58 --- /dev/null +++ b/misc/bsdstats/files/300.statistics @@ -0,0 +1,456 @@ +#!/bin/sh - +# +# $FreeBSD: ports/sysutils/bsdstats/files/300.statistics,v 1.38 2006/12/05 13:49:45 scrappy Exp $ +# $NetBSD: 300.statistics,v 1.1.1.1 2010/03/12 00:13:40 morr 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.3" +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:@PREFIX@/sbin:@PREFIX@/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 + ;; + NetBSD|DragonFlyBSD ) + for line in `/usr/sbin/pkg_info | /usr/bin/awk '{print $1}' ` + do + category=`pkg_info -Q PKGPATH ${line}|cut -d/ -f1` + 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 [ `cat /var/db/bsdstats | wc -l` -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 + HN=`/bin/hostname` + 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" + 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 + disable_token + ;; + *) + echo "Posting monthly OS statistics disabled" + echo " set monthly_statistics_enable=\"YES\" in $periodic_conf" + ;; +esac + +umask $oldmask +exit $rc |