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

Reply via email to