Hi!
----
Based on Glynn Foster's IRC request I hacked-up a small experiment/toy
(see attached script "shtwitter.ksh", the file needs Solaris 11 >= B72
since it depends on the networking capabilities of the new korn shell)
which allows to post messages to a twitter.com blog. "twitter" is some
kind of microblogging site, e.g. you can post one-liners up to 140
characters to a page, similar to a syslog.
The similarity with a syslog quickly leads to a simple usage idea - send
the contents of /var/adm/messages to a twitter blog like (see
http://twitter.com/syslog_sxb72x86 for an example (WARNING: This is not
recommended since the log may contain passwords by accident))
$ (export SHTWITTER_USER="<account_username>"
SHTWITTER_PASSWD="<account_password>" ; tail -f /var/adm/messages |
while read i ; do ksh93 shtwitter.ksh blog "$i" ; done)
Does anyone have better ideas how such a thing could be utilised (maybe
to monitor SMF state changes ?) ?
----
Bye,
Roland
--
__ . . __
(o.\ \/ /.o) [EMAIL PROTECTED]
\__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer
/O /==\ O\ TEL +49 641 7950090
(;O/ \/ \O;)
#!/bin/ksh93
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
#
# Solaris needs /usr/xpg4/bin/ because the tools in /usr/bin are not
POSIX-conformant
export PATH=/usr/xpg4/bin:/bin:/usr/bin
# Make sure all math stuff runs in the "C" locale to avoid problems with
alternative
# radix point representations (e.g. ',' instead of '.' in de_DE.*-locales). This
# needs to be set _before_ any floating-point constants are defined in this
script)
if [[ "${LC_ALL}" != "" ]] ; then
export \
LC_MONETARY="${LC_ALL}" \
LC_MESSAGES="${LC_ALL}" \
LC_COLLATE="${LC_ALL}" \
LC_CTYPE="${LC_ALL}"
unset LC_ALL
fi
export LC_NUMERIC=C
function fatal_error
{
print -u 2 "${progname}: $@"
exit 1
}
function encode_x_www_form_urlencoded
{
#set -o xtrace
nameref formdata=$1
nameref content="${1}.content" # ToDO: should be
|content="formdata.content"|
integer numformelements=${#formdata.form[*]}
integer i j
content=""
for (( i=0 ; i < numformelements ; i++ )) ; do
nameref element="${1}.form[${i}]" # ToDo: should be
|element="formdata.form[${i}]"|
typeset data="${element.data}"
integer datalen="${#data}"
typeset c
[[ "$content" != "" ]] && content+="&"
content+="${element.name}="
for ((j=0 ; j < datalen ; j++)) ; do
c="${data:j:1}"
case "$c" in
' ') c="+" ;;
'!') c="%21" ;;
'*') c="%2A" ;;
"'") c="%27" ;;
'(') c="%28" ;;
')') c="%29" ;;
';') c="%3B" ;;
':') c="%3A" ;;
'@') c="%40" ;;
'&') c="%26" ;;
'=') c="%3D" ;;
'+') c="%2B" ;;
'$') c="%24" ;;
',') c="%2C" ;;
'/') c="%2F" ;;
'?') c="%3F" ;;
'%') c="%25" ;;
'#') c="%23" ;;
'[') c="%5B" ;;
']') c="%5D" ;;
*) ;;
esac
content+="$c"
done
done
formdata.content_length=${#content}
return 0
}
# parse return code, cookies etc.
function parse_http_response
{
nameref response=$1
typeset h c i
IFS=$' \t' read -r h c # read HTTP/1.[01] <code>
[[ "$h" != ~(Eil)HTTP/.* ]] && { print -u2 "$0: HTTP/ header missing" ;
return 1 ; }
response.httpcode="$c"
# skip remaining headers
while IFS='' read -r i ; do
[[ "$i" = $'\r' ]] && break
done
return 0
}
function encode_http_basic_auth
{
typeset user="$1"
typeset passwd="$2"
typeset s
integer s_len
typeset -b base64var
# ksh93 binary variables use base64 encoding, the same as the
# HTTP basic authentification. We only have to read the
# plaintext user:passwd string into the binary variable "base64var"
# and then print this variable as ASCII.
s="${user}:${passwd}"
s_len="${#s}"
print -n "${s}" | read -N${s_len} base64var
print -- "${base64var}"
return 0
}
function put_twitter_message
{
#set -o xtrace
[[ "$SHTWITTER_USER" = "" ]] && fatal_error "SHTWITTER_USER not set."
[[ "$SHTWITTER_PASSWD" = "" ]] && fatal_error "SHTWITTER_PASSWD not set."
# site setup
typeset url_host="twitter.com"
typeset url_path="/statuses/update.xml"
typeset url="http://${url_host}${url_path}"
integer netfd # http stream number
typeset msgtext="$1"
# argument for "encode_x_www_form_urlencoded"
typeset urlform=(
# input
typeset -a form
# output
typeset content
integer content_length
)
typeset request=""
typeset content=""
# ToDo: Use "urlform.form+=(" once ksh93 has been fixed.
urlform.form[0]=( name="status" data="${msgtext}" )
encode_x_www_form_urlencoded urlform
content="${urlform.content}"
request="POST ${url_path} HTTP/1.1\n"
request+="Host: ${url_host}\n"
request+="Authorization: Basic $(encode_http_basic_auth "${SHTWITTER_USER}"
"${SHTWITTER_PASSWD}")=\n"
request+="User-Agent: ${http_user_agent}\n"
request+="Connection: close\n"
request+="Content-Type: application/x-www-form-urlencoded\n"
request+="Content-Length: $(( ${urlform.content_length} ))\n"
#exit 0
exec {netfd}<>"/dev/tcp/${url_host}/80"
(( $? != 0 )) && { print -u2 "Couldn't open connection to ${url_host}." ;
return 1 ; }
# send http post
{
print -- "${request}"
print -- "${content}"
} >&${netfd}
# process reply
parse_http_response httpresponse <&${netfd}
response="$(cat <&${netfd})"
# close connection
exec {netfd}<&-
print "twitter response was: ${response}"
return 0
}
function usage
{
OPTIND=0
getopts -a "${progname}" "${USAGE}" OPT '-?'
exit 2
}
# program start
builtin basename
builtin cat
builtin date
builtin uname
typeset progname="$(basename "${0}")"
# HTTP protocol client identifer
typeset -r http_user_agent="shtwitter/ksh93 (2007-09-14; $(uname -s -r -p)"
USAGE=$'
[-?\n@(#)\$Id: shtwitter (Roland Mainz) 2007-09-14 \$\n]
[-author?Roland Mainz <[EMAIL PROTECTED]
[+NAME?shtwitter - read/write text data to internet clipboards]
[+DESCRIPTION?\bshtwitter\b is a small utility which can read and write text
to the twitter.com microblogging site.]
[+?The first arg \bmethod\b describes one of the methods, "update" posts a
text message to the users twitter blog, returning the raw response
message from the twitter server.]
[+?The second arg \bstring\b contains the string data which should be
stored on twitter.com.]
method [ string ]
[+SEE ALSO?\bksh93\b(1), \brssread\b(1), http://www.twitter.com]
'
while getopts -a "${progname}" "${USAGE}" OPT ; do
# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
case ${OPT} in
*) usage ;;
esac
done
shift $((OPTIND-1))
typeset method="$1"
shift
case "${method}" in
update|blog) put_twitter_message "$@" ; exit $? ;;
*) usage ;;
esac
fatal_error "not reached."
# EOF.
_______________________________________________
opensolaris-discuss mailing list
opensolaris-discuss@opensolaris.org