svn commit: r385480 - in head/sysutils/bsdstats: . files
Thomas Zander
riggs at FreeBSD.org
Tue May 5 16:48:15 UTC 2015
Author: riggs
Date: Tue May 5 16:48:14 2015
New Revision: 385480
URL: https://svnweb.freebsd.org/changeset/ports/385480
Log:
- Update to upstream version 6.0
- yuri at rawbw.com takes maintainership
- add LICENSE
- add TOR OPTION
- Favor PLIST_FILES over pkg-plist (only two entries at the moment)
- Pet portlint
PR: 198799
Submitted by: yuri at rawbw.com (new maintainer)
Reviewed by: bsdstats at nanoman.ca
Approved by: bsdstats at nanoman.ca (previous maintainer)
Added:
head/sysutils/bsdstats/files/bsdstats-send.in (contents, props changed)
Deleted:
head/sysutils/bsdstats/pkg-plist
Modified:
head/sysutils/bsdstats/Makefile
head/sysutils/bsdstats/files/300.statistics.in (contents, props changed)
head/sysutils/bsdstats/files/bsdstats.in
head/sysutils/bsdstats/files/pkg-message.in
head/sysutils/bsdstats/pkg-install
Modified: head/sysutils/bsdstats/Makefile
==============================================================================
--- head/sysutils/bsdstats/Makefile Tue May 5 16:20:37 2015 (r385479)
+++ head/sysutils/bsdstats/Makefile Tue May 5 16:48:14 2015 (r385480)
@@ -2,30 +2,49 @@
# $FreeBSD$
PORTNAME= bsdstats
-PORTVERSION= 5.5
-PORTREVISION= 5
+PORTVERSION= 6.0
CATEGORIES= sysutils
DISTFILES=
-MAINTAINER= bsdstats at nanoman.ca
+MAINTAINER= yuri at rawbw.com
COMMENT= Monthly script for reporting anonymous statistics about your machine
+LICENSE= BSD4CLAUSE
+
NO_BUILD= yes
USE_RC_SUBR= bsdstats
-SUB_FILES= 300.statistics pkg-message
-SUB_LIST+= DIG=${DIG}
+SUB_FILES= 300.statistics bsdstats-send pkg-message
+SUB_LIST+= VERSION=${PORTVERSION}
+NO_ARCH= YES
+
+OPTIONS_DEFINE= TOR
+TOR_DESC= Submit securely through TOR anonymity network
+
+PLIST_FILES= bin/bsdstats-send \
+ etc/periodic/monthly/300.statistics
.include <bsd.port.pre.mk>
-.if ${OSVERSION} >= 1000500
-DIG= drill
+.if ${PORT_OPTIONS:MTOR}
+RUN_DEPENDS+= tor:${PORTSDIR}/security/tor
+.endif
+
+pre-install:
+.if ${PORT_OPTIONS:MTOR}
+ @${REINPLACE_CMD} -e 's|USE_TOR=NO|USE_TOR=YES|' ${WRKDIR}/300.statistics
+ @${REINPLACE_CMD} -e 's|# REQUIRE: LOGIN|# REQUIRE: LOGIN tor|' ${WRKDIR}/bsdstats
+ @${REINPLACE_CMD} -e 's|@@TOR_MESSAGE@@|Statistics will be submitted anonymously through the TOR network|' \
+ ${WRKDIR}/pkg-message
.else
-DIG= dig
+ @${REINPLACE_CMD} -e 's|@@TOR_MESSAGE@@|You can build bsdstats with TOR port option to submit anonymously|' \
+ ${WRKDIR}/pkg-message
.endif
do-install:
${MKDIR} ${STAGEDIR}${PREFIX}/etc/periodic/monthly
${INSTALL_SCRIPT} ${WRKDIR}/300.statistics \
${STAGEDIR}${PREFIX}/etc/periodic/monthly
+ ${INSTALL_SCRIPT} ${WRKDIR}/bsdstats-send \
+ ${STAGEDIR}${PREFIX}/bin/bsdstats-send
.include <bsd.port.post.mk>
Modified: head/sysutils/bsdstats/files/300.statistics.in
==============================================================================
--- head/sysutils/bsdstats/files/300.statistics.in Tue May 5 16:20:37 2015 (r385479)
+++ head/sysutils/bsdstats/files/300.statistics.in Tue May 5 16:48:14 2015 (r385480)
@@ -1,496 +1,562 @@
#!/bin/sh -
#
-# $FreeBSD: /tmp/pcvs/ports/sysutils/bsdstats/files/300.statistics.in,v 1.45 2011-09-25 21:35:26 eadler Exp $
+# $FreeBSD$
#
+#
+# options
+#
+CURR_VERSION="%%VERSION%%"
+USE_TOR=NO
+DO_LOG_NET_TRAFFIC=0
+
+#
+# Standard commands used here
+#
+PCICONF=/usr/sbin/pciconf
+UNAME=/usr/bin/uname
+SYSCTL=/sbin/sysctl
+AWK=/usr/bin/awk
+SED=/usr/bin/sed
+CUT=/usr/bin/cut
+JOT=/usr/bin/jot
+SLEEP=/bin/sleep
+CHMOD=/bin/chmod
+WC=/usr/bin/wc
+MV=/bin/mv
+RM=/bin/rm
+case $(${UNAME}) in
+ FreeBSD)
+ UMASK=/usr/bin/umask
+ OPENSSL=/usr/bin/openssl
+ CHOWN=/usr/sbin/chown
+ NC=/usr/bin/nc
+ ;;
+ OpenBSD)
+ UMASK=/usr/bin/umask
+ OPENSSL=/usr/sbin/openssl
+ CHOWN=/sbin/chown
+ NC=/usr/bin/nc
+ ;;
+ DragonFly)
+ UMASK=/usr/bin/umask
+ OPENSSL=/usr/bin/openssl
+ CHOWN=/usr/sbin/chown
+ NC=/usr/local/bin/netcat
+ ;;
+ NetBSD)
+ UMASK=umask
+ OPENSSL=/usr/bin/openssl
+ CHOWN=/usr/sbin/chown
+ NC=/usr/pkg/sbin/nc
+ ;;
+ *)
+ UMASK=/usr/bin/umask
+ OPENSSL=/usr/bin/openssl
+ CHOWN=/usr/sbin/chown
+ NC=/usr/bin/nc
+ ;;
+esac
+
+#
+# constants
+#
+CR=$'\r'
+NL=$'\n'
+
+#
# 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
+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
+ . /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
-timeout=10
-
-version="5.5"
+#
+# global values
+#
checkin_server=${monthly_statistics_checkin_server:-"rpt.bsdstats.org"}
bsdstats_log=${monthly_statistics_logfile:-"/var/log/bsdstats"}
id_token_file='/var/db/bsdstats'
+checkin_server_description=${checkin_server}
+nc_host=${checkin_server}
+nc_port=80
+http_header_proxy_auth=""
-PATH=/sbin:/bin:/usr/sbin:/usr/bin:%%PREFIX%%/sbin:%%PREFIX%%/bin
-export PATH
-unset HTTP_USER_AGENT
+oldmask=$(${UMASK})
+${UMASK} 066
+timeout=10
+
+##
+## Procedures
+##
+
+echo_begin() {
+ echo -n "$1 ... "
+}
+
+echo_end_success() {
+ echo "SUCCESS"
+}
+
+echo_err() {
+ echo "$1" >&2
+}
+
+log() { # log(categ,msg)
+ echo "[`date "+%Y-%m-%d %H:%M:%S %z"`] $1 $2" >> $bsdstats_log
+}
+
+fail() { # fail(msg): argument is simple user-level message, detailed log message is assumed to be printed before 'fail' invocation
+ # log error
+ log "TERM" "$1 (failure)"
+ # let user know
+ echo_err "BSDstats failed: $1"
+ # bail out
+ ${UMASK} $oldmask
+ exit 1
+}
+
+random() {
+ ${JOT} -r 1 0 900
+}
+
+nlog() {
+ if [ $DO_LOG_NET_TRAFFIC -eq 1 ]; then
+ echo "--$(date)--" >> /tmp/bsdstats.$1.log
+ tee -a /tmp/bsdstats.$1.log
+ else
+ cat
+ fi
+}
+
+# do_http_request: if success returns 0, and prints http.body, otherwise returns 1
+do_http_request() {
+ local meth="$1"
+ local url="$2"
+ local body="$3"
+ local content_type="$4"
+ local do_log="$5"
+
+ local resp
+ local lineno
+ local in_header
+ local result_count
+
+ if [ -n "${HTTP_PROXY}" ]; then url="http://${checkin_server}${url}"; fi
+
+ local txt="${meth} ${url} HTTP/1.0"
+ local http_req="${txt}"
+ txt="${txt}${CR}${NL}Host: ${checkin_server}"
+ if [ -n "${http_header_proxy_auth}" ]; then txt="${txt}${CR}${NL}Proxy-Authorization: ${http_header_proxy_auth}"; fi
+ txt="${txt}${CR}${NL}User-Agent: bsdstats-${CURR_VERSION}"
+ txt="${txt}${CR}${NL}Connection: close"
+ if [ -n "${content_type}" ]; then txt="${txt}${NL}Content-Type: ${content_type}"; fi
+ if [ -n "${body}" ]; then txt="${txt}${CR}${NL}Content-Length: ${#body}"; fi
+ txt="${txt}${CR}${NL}${CR}${NL}${body}"
+
+ resp=$(echo "${txt}" | nlog "out" | ${NC} ${nc_host} ${nc_port} | nlog "in" 2>/dev/null)
+ if [ $? -ne 0 ]; then
+ if [ ${do_log} -ne 0 ]; then
+ log "FAIL" "Failed to send data to the host ${nc_host}:${nc_port}, is network or host down?"
+ fi
+ return 1
+ fi
+
+ local IFS=${NL}${CR}
+ lineno=0
+ in_header=1
+ http_result=""
+ for str in ${resp}; do
+ if [ $lineno -eq 0 ] ; then
+ if expr "${str}" : "^HTTP/1\.[01] 200 OK$" > /dev/null; then
+ # ok
+ true
+ else
+ if [ ${do_log} -ne 0 ]; then
+ log "FAIL" "Failed HTTP query: request='${http_req}' -> response='${str}'"
+ fi
+ return 2
+ fi
+ elif [ $lineno -ge 1 -a $in_header -eq 1 ] ; then
+ if [ -z "${str}" ]; then
+ in_header=0
+ result_count=0
+ fi
+ else
+ if [ $result_count -eq 0 ]; then
+ http_result="${str}"
+ else
+ http_result="${http_result}${NL}${str}"
+ fi
+ result_count=$(($result_count+1))
+ fi
+ lineno=$(($lineno+1))
+ done
+ echo "${http_result}"
+ return 0
+}
+
+extract_field() {
+ # charset of the value, besides alnum covers base64 encoding charset (/+), and single quote
+ echo "$1" | grep "^${2}=" | tail -1 | sed -E -e "s/^${2}=([a-zA-Z0-9=/+']+).*/\1/g"
+}
+
+do_http_request_check_status() {
+ local body
+ local status
+ local what="$5"
+ # run request
+ body=$(do_http_request "$1" "$2" "$3" "$4" 1)
+ if [ $? -ne 0 ]; then
+ fail "HTTP query failed during ${what}"
+ fi
+ # check status
+ status=$(extract_field "${body}" "STATUS")
+ case "${status}" in
+ OK)
+ # pass
+ true
+ ;;
+ FAIL)
+ log "FAIL" "Got STATUS=FAIL from the server in during ${what}"
+ fail "${what} request failed"
+ ;;
+ *)
+ fail "Server didn't return the status for ${what}"
+ ;;
+ esac
+}
-IFS="
-"
+uri_escape() {
+ # RFC 2396
+ 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
+ '
+}
-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 -T "$timeout" -q -o - "$url"
- ;;
- * )
- /usr/bin/ftp -q "$timeout" -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 )
-
- ############################################################################
- # At the time of this writing (2012-07-24), FreeBSD is switching from
- # pkg_* tools to pkgng. Starting in FreeBSD 9.1, pkgng will become the
- # default tool for package management.
- #
- # Until pkg_* tools are officially declared unsupported, they will need
- # legacy support in ports like this one. When the need for this support is
- # officially discontinued, please do the following:
- #
- # 1. Delete the contents of this "LEGACY" section:
- #
- #-----BEGIN LEGACY-----
- # Detect pkgng
- if [ -e /var/db/pkg/local.sqlite ]; then
-
- # Use pkgng
-
- for line in `pkg info | awk '{ print $1 }'`
- do
- category=`pkg info -q -o ${line} | sed 's/\/.*//g'`
- line=$(uri_escape $line)
- category=$(uri_escape $category)
- query_string=$query_string`echo \&port[]=${category}:${line}`
- done
-
- else
-
- # Use pkg_* tools
-
- for line in `pkg_info | 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
-
- fi
- #-----END LEGACY-----
- #
- # 2. Uncomment the contents of this "PKGNG" section:
- #
- #-----BEGIN PKGNG-----
-# for line in `pkg info | awk '{ print $1 }'`
-# do
-# category=`pkg info -q -o ${line} | sed 's/\/.*//g'`
-# line=$(uri_escape $line)
-# category=$(uri_escape $category)
-# query_string=$query_string`echo \&port[]=${category}:${line}`
-# done
- #-----END PKGNG-----
- #
- # 3. Delete these comments.
- #
- # Thank you!
- ############################################################################
-
- 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=$((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
+parse_http_proxy_string() {
+# 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"
+#
+# IN: * HTTP_PROXY or http_proxy
+# IN: * HTTP_PROXY_AUTH
+# OUT: * http_header_proxy_auth
+# OUT: * nc_host
+# OUT: * nc_port
+
+ local PROXY_AUTH_USER
+ local PROXY_AUTH_PASS
+ local PROXY_HOST
+ local PROXY_PORT
+
+ 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:\/\/)?((.+:.+)@)?.+/\3/')
+ 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
- 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
+ # 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
+ # Proxy authentication, if required
+ if [ -n "$PROXY_AUTH_USER" -a -n "$PROXY_AUTH_PASS" ]; then
+ local auth_base64=$(echo -n "$PROXY_AUTH_USER:$PROXY_AUTH_PASS" | ${OPENSSL} base64)
+ http_header_proxy_auth="Basic $auth_base64"
+ fi
+ return 0
+ else
+ nc_host=$checkin_server
+ nc_port=80
+ return 1
+ fi
+}
+
+test_connection() {
+ local body
+ body=$(do_http_request "HEAD" "/" "" "" 0)
+ if [ $? -ne 0 -a $? -ne 2 ]; then
+ log "FAIL" "Unable to connect to ${checkin_server_description}"
+ fail "Network or host is down?"
+ fi
+}
+
+setup_proxies() {
+ # TOR
+ if [ "${USE_TOR}" = "YES" ]; then
+ if [ -n "${HTTP_PROXY}" -o -n "${http_proxy}" ]; then
+ echo_err "Ignoring HTTP_PROXY since TOR is used"
+ fi
+ NC="${NC} -x localhost:9050 -X 5"
+ checkin_server_description="${checkin_server_description} (through TOR)"
+ return 0
+ fi
+
+ # HTTP proxy
+ if [ -n "${HTTP_PROXY}" -o -n "${http_proxy}" ]; then
+ parse_http_proxy_string
+ if [ $? -eq 0 ]; then
+ checkin_server_description="${checkin_server_description} (through proxy)"
+ return 0
+ fi
+ fi
+
+ # no proxy
}
-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
+
+report_devices() {
+ case $(${UNAME}) in
+ FreeBSD|DragonFly)
+ local query_string=""
+ local line
+ for line in $(${PCICONF} -l); do
+ local DRIVER=$(echo "${line}" | ${AWK} -F\@ '{print $1}')
+ local DEV=$(echo "${line}" | ${AWK} '{print $4}' | ${CUT} -c8-15)
+ local CLASS=$(echo "${line}" | ${AWK} '{print $2}' | ${CUT} -c9-14)
+ query_string=$query_string`echo \&dev[]=${DRIVER}:${DEV}:${CLASS}`
+ done
+
+ echo_begin "Posting device statistics to ${checkin_server_description}"
+ do_http_request_check_status "GET" "/scripts/report_devices.php?token=${TOKEN}&key=${KEY}$query_string" \
+ "" "" "system devices submission"
+ echo_end_success
+ log "INFO" "System devices reported to ${checkin_server_description}"
+ ;;
+ *)
+ # Not supported
+ ;;
+ esac
+}
+
+report_ports() {
+ case $(${UNAME}) in
+ FreeBSD|DragonFly)
+ local query_string=""
+ # Detect pkgng
+ if [ -e /var/db/pkg/local.sqlite ]; then
+ # Use pkgng
+ query_string="${query_string}$(pkg info -o "*" | ${SED} -E -e 's/\+/%2b/g' -e 's/,/%2c/g' -e 's/^([^ ]+) +([^\/]+)\/.+$/\&port[]=\2:\1/g' | tr -d '\n')"
+ else
+ #-----BEGIN LEGACY: to delete when FreeBSD with pkg_ tools is out of support period (!!! don't forget to clarify what does DragonFly use before removing !!!) -----
+ # Use obsolete pkg_* tools
+ local line
+ for line in `pkg_info | ${AWK} '{ print $1 }'`; do
+ local 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
+ #-----END LEGACY-----
fi
- disable_token
+ echo_begin "Posting port statistics to ${checkin_server_description}"
+ do_http_request_check_status "POST" "/scripts/report_ports.php" \
+ "token=${TOKEN}&key=${KEY}${query_string}" "application/x-www-form-urlencoded" "ports submission"
+ echo_end_success
+ log "INFO" "Posted port statistics to ${checkin_server_description}"
;;
- *)
- echo "Posting monthly OS statistics disabled"
- echo " set monthly_statistics_enable=\"YES\" in $periodic_conf"
+ *)
+ # Not supported
+ ;;
+ esac
+}
+
+get_id_token() {
+ if [ -f $id_token_file ]; then
+ if [ $(${WC} -l < $id_token_file) -lt 3 ]; then
+ ${RM} -f $id_token_file
+ fi
+ fi
+
+ if [ ! -f $id_token_file -o ! -s $id_token_file ]; then
+ # generate the token file
+ echo "BSDstats runs on this system for the first time, generating registration ID"
+ IDTOKEN=$(uri_escape $(${OPENSSL} rand -base64 32))
+ if [ $? -ne 0 ]; then
+ fail "Failed to generate IDTOKEN"
+ fi
+
+ # receive KEY/TOKEN
+ local body
+ body=$(do_http_request "GET" "/scripts/getid.php?key=${IDTOKEN}" "" "" 1)
+ if [ $? -ne 0 ]; then
+ fail "HTTP query failed during key/token generation"
+ fi
+ KEY=$(extract_field "${body}" "KEY")
+ TOKEN=$(extract_field "${body}" "TOKEN")
+ # validate KEY/TOKEN
+ if [ ${#KEY} -lt 10 -o ${#KEY} -gt 64 -o ${#TOKEN} -lt 10 -o ${#TOKEN} -gt 64 ]; then
+ log "FAIL" "Invalid key/token received for IDTOKEN=${TOKEN}"
+ fail "Invalid key/token combination received from the server"
+ fi
+ log "INFO" "Generated idtoken='${IDTOKEN}', received key=${KEY} and token=${TOKEN}"
+ # save KEY/TOKEN
+ (echo "# This file was auto-generated on $(date),"; \
+ echo "# and contains the BSDstats registration credentials"; \
+ echo "KEY=${KEY}"; echo "TOKEN=${TOKEN}"; echo "VERSION=${CURR_VERSION}") > $id_token_file && \
+ ${CHOWN} root:wheel $id_token_file && \
+ ${CHMOD} 600 $id_token_file
+ if [ $? -ne 0 ]; then
+ ${RM} -f $id_token_file
+ fail "Failed to create identification file $id_token_file"
+ fi
+ log "INFO" "Created identification file $id_token_file"
+ fi
+ # read the token file into the global variables
+ . $id_token_file
+ KEY=$(uri_escape $KEY)
+ TOKEN=$(uri_escape $TOKEN)
+ PREV_VERSION="${VERSION}"
+ VERSION=""
+}
+
+enable_token() {
+ do_http_request_check_status "GET" "/scripts/enable_token.php?key=${KEY}&token=${TOKEN}" \
+ "" "" "token enabling"
+ log "INFO" "System enabled"
+}
+
+disable_token() {
+ do_http_request_check_status "GET" "/scripts/disable_token.php?key=${KEY}&token=${TOKEN}" \
+ "" "" "token disabling"
+ log "INFO" "System disabled"
+}
+
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-ports-all
mailing list