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 | |
parent | 0c723c12b29e79f01e5cea7577cec9c04c20a125 (diff) | |
download | pkgsrc-503bbe3c49c729f3145f0764ee866b37460c9881.tar.gz |
BSD-Stats is collecting statistics about *BSD installations (and flavours).
PR pkg/35365
-rw-r--r-- | misc/bsdstats/DESCR | 4 | ||||
-rw-r--r-- | misc/bsdstats/MESSAGE | 14 | ||||
-rw-r--r-- | misc/bsdstats/Makefile | 34 | ||||
-rw-r--r-- | misc/bsdstats/PLIST | 2 | ||||
-rw-r--r-- | misc/bsdstats/TODO | 2 | ||||
-rw-r--r-- | misc/bsdstats/files/300.statistics | 456 |
6 files changed, 512 insertions, 0 deletions
diff --git a/misc/bsdstats/DESCR b/misc/bsdstats/DESCR new file mode 100644 index 00000000000..6b0c55706d8 --- /dev/null +++ b/misc/bsdstats/DESCR @@ -0,0 +1,4 @@ +BSD-Stats is collecting statistics about *BSD installations (and flavours) and +the hardware used for running those, to demonstrate to hardware and software +vendors out there that *BSD should be viewed as a serious operating system, +not just as a hobbyist system, for support (ie. hardware drivers) purposes. diff --git a/misc/bsdstats/MESSAGE b/misc/bsdstats/MESSAGE new file mode 100644 index 00000000000..ccb74c96051 --- /dev/null +++ b/misc/bsdstats/MESSAGE @@ -0,0 +1,14 @@ +=========================================================================== +$NetBSD: MESSAGE,v 1.1.1.1 2010/03/12 00:13:40 morr Exp $ + +Add the following line to your /etc/monthly.local: + +${PREFIX}/bin/300.statistics > /dev/null + +And add the following lines to your /etc/rc.conf: + +monthly_statistics_enable="YES" # needed for bsdstats to work at all +monthly_statistics_report_devices="YES" # optionally report devices too +monthly_statistics_report_ports="YES" # optionally report installed ports + +=========================================================================== diff --git a/misc/bsdstats/Makefile b/misc/bsdstats/Makefile new file mode 100644 index 00000000000..46a1a3309b3 --- /dev/null +++ b/misc/bsdstats/Makefile @@ -0,0 +1,34 @@ +# $NetBSD: Makefile,v 1.1.1.1 2010/03/12 00:13:40 morr Exp $ +# + +DISTNAME= bsdstats-5.3 +CATEGORIES= sysutils misc +MASTER_SITES= # http://www.bsdstats.org/downloads/ +DISTFILES= # empty + +MAINTAINER= pkgsrc-users@NetBSD.org +HOMEPAGE= http://www.bsdstats.org/ +COMMENT= BSD-Stats collector script + +DEPENDS+= netcat-[0-9]*:../../net/netcat + +PKG_DESTDIR_SUPPORT= user-destdir + +# XXX: Others might work +ONLY_FOR_PLATFORM= NetBSD-*-* DragonFly-*-* FreeBSD-*-* OpenBSD-*-* + +BUILD_DEFS+= VARBASE + +WRKSRC= ${WRKDIR}/bsdstats +NO_BUILD= yes +INSTALLATION_DIRS= bin + +post-extract: + ${MKDIR} ${WRKDIR}/bsdstats + ${SED} -e "s!@PREFIX@!${PREFIX}!g" ${FILESDIR}/300.statistics \ + > ${WRKSRC}/300.statistics + +do-install: + ${INSTALL} ${WRKSRC}/300.statistics ${DESTDIR}${PREFIX}/bin/300.statistics + +.include "../../mk/bsd.pkg.mk" diff --git a/misc/bsdstats/PLIST b/misc/bsdstats/PLIST new file mode 100644 index 00000000000..9276fec634b --- /dev/null +++ b/misc/bsdstats/PLIST @@ -0,0 +1,2 @@ +@comment $NetBSD: PLIST,v 1.1.1.1 2010/03/12 00:13:40 morr Exp $ +bin/300.statistics diff --git a/misc/bsdstats/TODO b/misc/bsdstats/TODO new file mode 100644 index 00000000000..d230a9fecc1 --- /dev/null +++ b/misc/bsdstats/TODO @@ -0,0 +1,2 @@ +Send files/300.statistic upstream +Add support for sending devices for NetBSD/DragonFlyBSD 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 |