summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormorr <morr>2010-03-12 00:13:40 +0000
committermorr <morr>2010-03-12 00:13:40 +0000
commit503bbe3c49c729f3145f0764ee866b37460c9881 (patch)
treec72a41f0631fc820fe5a633240fbf5b5481e4e03
parent0c723c12b29e79f01e5cea7577cec9c04c20a125 (diff)
downloadpkgsrc-503bbe3c49c729f3145f0764ee866b37460c9881.tar.gz
BSD-Stats is collecting statistics about *BSD installations (and flavours).
PR pkg/35365
-rw-r--r--misc/bsdstats/DESCR4
-rw-r--r--misc/bsdstats/MESSAGE14
-rw-r--r--misc/bsdstats/Makefile34
-rw-r--r--misc/bsdstats/PLIST2
-rw-r--r--misc/bsdstats/TODO2
-rw-r--r--misc/bsdstats/files/300.statistics456
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