[Midnightbsd-cvs] mports: mports/sysutils: add midnightbsd-stats

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Fri Oct 10 21:25:40 EDT 2008


Log Message:
-----------
add midnightbsd-stats

Modified Files:
--------------
    mports/sysutils:
        Makefile (r1.81 -> r1.82)

Added Files:
-----------
    mports/sysutils/midnightbsd-stats:
        Makefile (r1.1)
        pkg-descr (r1.1)
        pkg-install (r1.1)
        pkg-message (r1.1)
        pkg-plist (r1.1)
    mports/sysutils/midnightbsd-stats/files:
        310.statistics (r1.1)
        midnightbsd-stats.sh (r1.1)

-------------- next part --------------
Index: Makefile
===================================================================
RCS file: /home/cvs/mports/sysutils/Makefile,v
retrieving revision 1.81
retrieving revision 1.82
diff -L sysutils/Makefile -L sysutils/Makefile -u -r1.81 -r1.82
--- sysutils/Makefile
+++ sysutils/Makefile
@@ -50,6 +50,7 @@
     SUBDIR += mdf2iso
     SUBDIR += memtest
     SUBDIR += memtest86
+    SUBDIR += midnightbsd-stats
     SUBDIR += mixer
     SUBDIR += munin-main
     SUBDIR += munin-node
--- /dev/null
+++ sysutils/midnightbsd-stats/pkg-message
@@ -0,0 +1,24 @@
+This script, meant to be run monthly, submits statistics anonymously
+to a checkin server (http://rpt.midnightbsd.org), in an attempt to
+generate reasonably accurate demographics of MidnightBSD usage and
+hardware.
+
+To enable monthly reporting, edit or create /etc/periodic.conf and 
+add this line:
+	monthly_statistics_enable="YES"
+
+To enable boottime reporting, edit or create /etc/rc.conf and add 
+this line:
+ 	midnightbsd_stats_enable="YES"
+
+To enable device reporting, add this line:
+	monthly_statistics_report_devices="YES"
+
+To enable ports reporting, add this line:
+	monthly_statistics_report_ports="YES"
+
+To run it manually the first time, just run it as:
+	/usr/local/etc/periodic/monthly/310.statistics -nodelay
+
+To view current statistics, go to:
+        http://rpt.midnightbsd.org
--- /dev/null
+++ sysutils/midnightbsd-stats/pkg-install
@@ -0,0 +1,93 @@
+#!/bin/sh
+#
+# $MidnightBSD: mports/sysutils/midnightbsd-stats/pkg-install,v 1.1 2008/10/11 01:25:37 laffer1 Exp $
+# pkg-install : based off ${PORTSDIR}/mail/courier/files/pkg-install.in
+#
+LOCALBASE=${LOCALBASE:=/usr/local}
+
+ask() {
+    local question default answer
+
+    question=$1
+    default=$2
+    if [ -z "${PACKAGE_BUILDING}" ]; then
+        read -p "${question} [${default}]? " answer
+    fi
+    if [ -z "${answer}" ]; then
+        answer=${default}
+    fi
+    echo ${answer}
+}
+
+yesno() {
+    local question default answer
+
+    question=$1
+    default=$2
+    while :; do
+        answer=$(ask "${question}" "${default}")
+        case "${answer}" in
+        [Yy]*)	return 0;;
+        [Nn]*)	return 1;;
+        esac
+        echo "Please answer yes or no."
+    done
+}
+
+if [ ":$2" = ":POST-INSTALL" ]; then
+    if [ -f "/etc/periodic.conf" ]; then
+        if [ `grep monthly_statistics /etc/periodic.conf | wc -l` = 0 ]; then
+            if yesno "Would you like to activate monthly reporting in /etc/periodic.conf" n; then
+                echo "monthly_statistics_enable=\"YES\"" >> /etc/periodic.conf
+                if yesno "Would you like to send a list of installed hardware as well" n; then
+                    echo "monthly_statistics_report_devices=\"YES\"" >> /etc/periodic.conf
+                fi
+                if yesno "Would you like to send a list of installed ports as well" n; then
+                    echo "monthly_statistics_report_ports=\"YES\"" >> /etc/periodic.conf
+                fi
+                if yesno "Would you like to run it now" y; then
+                   ${PKG_PREFIX}/etc/periodic/monthly/300.statistics -nodelay
+                fi
+            fi
+        fi
+    elif [ ! -f "/etc/periodic.conf" ]; then
+        if yesno "Would you like to activate monthly reporting in /etc/periodic.conf" n; then
+            echo "monthly_statistics_enable=\"YES\"" >> /etc/periodic.conf
+            if yesno "Would you like to send a list of installed hardware as well" n; then
+                echo "monthly_statistics_report_devices=\"YES\"" >> /etc/periodic.conf
+            fi
+            if yesno "Would you like to send a list of installed ports as well" n; then
+                echo "monthly_statistics_report_ports=\"YES\"" >> /etc/periodic.conf
+            fi
+            if yesno "Would you like to run it now" y; then
+               ${PKG_PREFIX}/etc/periodic/monthly/300.statistics -nodelay
+            fi
+        fi
+    fi
+    if [ -f "/etc/rc.conf" ]; then
+        if [ `grep bsdstats_enable /etc/rc.conf | wc -l` = 0 ]; then
+            echo ""
+            echo "If running as a desktop, or on a laptop, it is recommended that you"
+            echo "enable bsdstats within /etc/rc.conf, so that it will run on reboot."
+            echo ""
+            echo "This will ensure that even if your computer is off when monthly runs,"
+            echo "your computer will be properly counted."
+            echo ""
+            if yesno "Would you like to activate reporting on reboot in /etc/rc.conf" n; then
+                echo "bsdstats_enable=\"YES\"" >> /etc/rc.conf
+            fi
+        fi
+    elif [ ! -f "/etc/rc.conf" ]; then
+        echo ""
+        echo "If running as a desktop, or on a laptop, it is recommended that you"
+        echo "enable bsdstats within /etc/rc.conf, so that it will run on reboot."
+        echo ""
+        echo "This will ensure that even if your computer is off when monthly runs,"
+        echo "your computer will be properly counted."
+        echo ""
+        if yesno "Would you like to activate reporting on reboot in /etc/rc.conf" n; then
+            echo "bsdstats_enable=\"YES\"" >> /etc/rc.conf
+        fi
+    fi
+fi
+
--- /dev/null
+++ sysutils/midnightbsd-stats/pkg-descr
@@ -0,0 +1,5 @@
+The purpose of this port is to attempt to produce reasonably accurate
+statistics on MidnightBSD deployment, to be used for both marketing, and 
+advocacy purposes by the project.
+
+WWW: http://rpt.midnightbsd.org/
--- /dev/null
+++ sysutils/midnightbsd-stats/pkg-plist
@@ -0,0 +1,4 @@
+etc/periodic/monthly/310.statistics
+etc/rc.d/midnightbsd-stats.sh
+ at dirrmtry etc/periodic/monthly
+ at dirrmtry etc/periodic
--- /dev/null
+++ sysutils/midnightbsd-stats/Makefile
@@ -0,0 +1,26 @@
+# New ports collection makefile for:	midnightbsd-stats
+# Date created:		7 October 2008
+# Whom:			Lucas Holt <luke at midnightbsd.org>
+#
+# $MidnightBSD: mports/sysutils/midnightbsd-stats/Makefile,v 1.1 2008/10/11 01:25:37 laffer1 Exp $ 
+#
+
+PORTNAME=	midnightbsd-stats
+PORTVERSION=	1.0
+CATEGORIES=	sysutils
+DISTFILES=
+
+MAINTAINER=	ports at MidnightBSD.org
+COMMENT=	Monthly script for reporting anonymous statistics about your machine
+LICENSE=	unknown
+
+.include <bsd.port.pre.mk>
+
+NO_BUILD=	yes
+
+do-install:
+	${MKDIR} ${PREFIX}/etc/periodic/monthly
+	${INSTALL_SCRIPT} ${FILESDIR}/310.statistics ${PREFIX}/etc/periodic/monthly
+	${INSTALL_SCRIPT} ${FILESDIR}/midnightbsd-stats.sh ${PREFIX}/etc/rc.d
+
+.include <bsd.port.post.mk>
--- /dev/null
+++ sysutils/midnightbsd-stats/files/310.statistics
@@ -0,0 +1,445 @@
+#!/bin/sh -
+#
+# $MidnightBSD: mports/sysutils/midnightbsd-stats/files/310.statistics,v 1.1 2008/10/11 01:25:37 laffer1 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="1.0"
+checkin_server=${monthly_statistics_checkin_server:-"rpt.midnightbsd.org"}
+bsdstats_log=${monthly_statistics_logfile:-"/var/log/midnightbsd-stats"}
+id_token_file='/var/db/midnightbsd-stats'
+
+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
+	MidnightBSD )	
+		/usr/bin/fetch -q -o - "$url"
+		;;
+	* )
+		/usr/bin/ftp -V -o - "$url"
+		;;
+    esac
+}
+
+check_dns () {
+    if [ `dig midnightbsd.org txt | grep TXT | grep UP | wc -l` = 0 ] 
+    then
+      echo "DNS not reachable, Network Down?"
+      exit
+    fi
+}
+
+send_devices () {
+    case $(uname) in
+	MidnightBSD )
+	    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
+	MidnightBSD )
+	    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: midnightbsd-stats ${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
--- /dev/null
+++ sysutils/midnightbsd-stats/files/midnightbsd-stats.sh
@@ -0,0 +1,30 @@
+#!/bin/sh 
+#
+# $MidnightBSD: mports/sysutils/midnightbsd-stats/files/midnightbsd-stats.sh,v 1.1 2008/10/11 01:25:37 laffer1 Exp $
+#
+
+# PROVIDE: midnightbsd_stats
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+
+# midnightbsd_stats is disabled by default, if you have configuration file
+#
+# Add the following line to /etc/rc.conf to enable midnightbsd_stats:
+#
+#midnightbsd_stats_enable="YES"
+#
+
+. /etc/rc.subr
+
+load_rc_config midnightbsd_stats
+
+name=midnightbsd_stats
+rcvar=`set_rcvar`
+
+command=/usr/local/etc/periodic/monthly/310.statistics
+
+# default to disable
+midnightbsd_stats_enable=${midnightbsd_stats_enable:-"NO"}
+midnightbsd_stats_flags=${midnightbsd_stats_flags:-"-nodelay"}
+
+run_rc_command "$1"


More information about the Midnightbsd-cvs mailing list