1*b4dd7d09SAndy Fiddaman#!/usr/bin/ksh93 2*b4dd7d09SAndy Fiddaman 3*b4dd7d09SAndy Fiddaman# 4*b4dd7d09SAndy Fiddaman# CDDL HEADER START 5*b4dd7d09SAndy Fiddaman# 6*b4dd7d09SAndy Fiddaman# The contents of this file are subject to the terms of the 7*b4dd7d09SAndy Fiddaman# Common Development and Distribution License (the "License"). 8*b4dd7d09SAndy Fiddaman# You may not use this file except in compliance with the License. 9*b4dd7d09SAndy Fiddaman# 10*b4dd7d09SAndy Fiddaman# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 11*b4dd7d09SAndy Fiddaman# or http://www.opensolaris.org/os/licensing. 12*b4dd7d09SAndy Fiddaman# See the License for the specific language governing permissions 13*b4dd7d09SAndy Fiddaman# and limitations under the License. 14*b4dd7d09SAndy Fiddaman# 15*b4dd7d09SAndy Fiddaman# When distributing Covered Code, include this CDDL HEADER in each 16*b4dd7d09SAndy Fiddaman# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 17*b4dd7d09SAndy Fiddaman# If applicable, add the following below this CDDL HEADER, with the 18*b4dd7d09SAndy Fiddaman# fields enclosed by brackets "[]" replaced with your own identifying 19*b4dd7d09SAndy Fiddaman# information: Portions Copyright [yyyy] [name of copyright owner] 20*b4dd7d09SAndy Fiddaman# 21*b4dd7d09SAndy Fiddaman# CDDL HEADER END 22*b4dd7d09SAndy Fiddaman# 23*b4dd7d09SAndy Fiddaman 24*b4dd7d09SAndy Fiddaman# 25*b4dd7d09SAndy Fiddaman# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 26*b4dd7d09SAndy Fiddaman# 27*b4dd7d09SAndy Fiddaman 28*b4dd7d09SAndy Fiddaman# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant 29*b4dd7d09SAndy Fiddamanexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin 30*b4dd7d09SAndy Fiddaman 31*b4dd7d09SAndy Fiddaman# Make sure all math stuff runs in the "C" locale to avoid problems 32*b4dd7d09SAndy Fiddaman# with alternative # radix point representations (e.g. ',' instead of 33*b4dd7d09SAndy Fiddaman# '.' in de_DE.*-locales). This needs to be set _before_ any 34*b4dd7d09SAndy Fiddaman# floating-point constants are defined in this script). 35*b4dd7d09SAndy Fiddamanif [[ "${LC_ALL}" != "" ]] ; then 36*b4dd7d09SAndy Fiddaman export \ 37*b4dd7d09SAndy Fiddaman LC_MONETARY="${LC_ALL}" \ 38*b4dd7d09SAndy Fiddaman LC_MESSAGES="${LC_ALL}" \ 39*b4dd7d09SAndy Fiddaman LC_COLLATE="${LC_ALL}" \ 40*b4dd7d09SAndy Fiddaman LC_CTYPE="${LC_ALL}" 41*b4dd7d09SAndy Fiddaman unset LC_ALL 42*b4dd7d09SAndy Fiddamanfi 43*b4dd7d09SAndy Fiddamanexport LC_NUMERIC=C 44*b4dd7d09SAndy Fiddaman 45*b4dd7d09SAndy Fiddamanfunction fatal_error 46*b4dd7d09SAndy Fiddaman{ 47*b4dd7d09SAndy Fiddaman print -u2 "${progname}: $*" 48*b4dd7d09SAndy Fiddaman exit 1 49*b4dd7d09SAndy Fiddaman} 50*b4dd7d09SAndy Fiddaman 51*b4dd7d09SAndy Fiddamanfunction encode_x_www_form_urlencoded 52*b4dd7d09SAndy Fiddaman{ 53*b4dd7d09SAndy Fiddaman nameref formdata=$1 54*b4dd7d09SAndy Fiddaman nameref content="formdata.content" 55*b4dd7d09SAndy Fiddaman integer numformelements=${#formdata.form[*]} 56*b4dd7d09SAndy Fiddaman integer i j 57*b4dd7d09SAndy Fiddaman 58*b4dd7d09SAndy Fiddaman content="" 59*b4dd7d09SAndy Fiddaman 60*b4dd7d09SAndy Fiddaman for (( i=0 ; i < numformelements ; i++ )) ; do 61*b4dd7d09SAndy Fiddaman nameref element="formdata.form[${i}]" 62*b4dd7d09SAndy Fiddaman typeset data="${element.data}" 63*b4dd7d09SAndy Fiddaman integer datalen="${#data}" 64*b4dd7d09SAndy Fiddaman typeset c 65*b4dd7d09SAndy Fiddaman 66*b4dd7d09SAndy Fiddaman [[ "$content" != "" ]] && content+="&" 67*b4dd7d09SAndy Fiddaman 68*b4dd7d09SAndy Fiddaman content+="${element.name}=" 69*b4dd7d09SAndy Fiddaman 70*b4dd7d09SAndy Fiddaman for ((j=0 ; j < datalen ; j++)) ; do 71*b4dd7d09SAndy Fiddaman c="${data:j:1}" 72*b4dd7d09SAndy Fiddaman case "$c" in 73*b4dd7d09SAndy Fiddaman ' ') c="+" ;; 74*b4dd7d09SAndy Fiddaman '!') c="%21" ;; 75*b4dd7d09SAndy Fiddaman '*') c="%2A" ;; 76*b4dd7d09SAndy Fiddaman "'") c="%27" ;; 77*b4dd7d09SAndy Fiddaman '(') c="%28" ;; 78*b4dd7d09SAndy Fiddaman ')') c="%29" ;; 79*b4dd7d09SAndy Fiddaman ';') c="%3B" ;; 80*b4dd7d09SAndy Fiddaman ':') c="%3A" ;; 81*b4dd7d09SAndy Fiddaman '@') c="%40" ;; 82*b4dd7d09SAndy Fiddaman '&') c="%26" ;; 83*b4dd7d09SAndy Fiddaman '=') c="%3D" ;; 84*b4dd7d09SAndy Fiddaman '+') c="%2B" ;; 85*b4dd7d09SAndy Fiddaman '$') c="%24" ;; 86*b4dd7d09SAndy Fiddaman ',') c="%2C" ;; 87*b4dd7d09SAndy Fiddaman '/') c="%2F" ;; 88*b4dd7d09SAndy Fiddaman '?') c="%3F" ;; 89*b4dd7d09SAndy Fiddaman '%') c="%25" ;; 90*b4dd7d09SAndy Fiddaman '#') c="%23" ;; 91*b4dd7d09SAndy Fiddaman '[') c="%5B" ;; 92*b4dd7d09SAndy Fiddaman '\') c="%5C" ;; # we need this to avoid the '\'-quoting hell 93*b4dd7d09SAndy Fiddaman ']') c="%5D" ;; 94*b4dd7d09SAndy Fiddaman *) ;; 95*b4dd7d09SAndy Fiddaman esac 96*b4dd7d09SAndy Fiddaman content+="$c" 97*b4dd7d09SAndy Fiddaman done 98*b4dd7d09SAndy Fiddaman done 99*b4dd7d09SAndy Fiddaman 100*b4dd7d09SAndy Fiddaman formdata.content_length=${#content} 101*b4dd7d09SAndy Fiddaman 102*b4dd7d09SAndy Fiddaman return 0 103*b4dd7d09SAndy Fiddaman} 104*b4dd7d09SAndy Fiddaman 105*b4dd7d09SAndy Fiddaman# parse HTTP return code, cookies etc. 106*b4dd7d09SAndy Fiddamanfunction parse_http_response 107*b4dd7d09SAndy Fiddaman{ 108*b4dd7d09SAndy Fiddaman nameref response="$1" 109*b4dd7d09SAndy Fiddaman typeset h statuscode statusmsg i 110*b4dd7d09SAndy Fiddaman 111*b4dd7d09SAndy Fiddaman # we use '\r' as additional IFS to filter the final '\r' 112*b4dd7d09SAndy Fiddaman IFS=$' \t\r' read -r h statuscode statusmsg # read HTTP/1.[01] <code> 113*b4dd7d09SAndy Fiddaman [[ "$h" != ~(Eil)HTTP/.* ]] && { print -u2 -f $"%s: HTTP/ header missing\n" "$0" ; return 1 ; } 114*b4dd7d09SAndy Fiddaman [[ "$statuscode" != ~(Elr)[0-9]* ]] && { print -u2 -f $"%s: invalid status code\n" "$0" ; return 1 ; } 115*b4dd7d09SAndy Fiddaman response.statuscode="$statuscode" 116*b4dd7d09SAndy Fiddaman response.statusmsg="$statusmsg" 117*b4dd7d09SAndy Fiddaman 118*b4dd7d09SAndy Fiddaman # skip remaining headers 119*b4dd7d09SAndy Fiddaman while IFS='' read -r i ; do 120*b4dd7d09SAndy Fiddaman [[ "$i" == $'\r' ]] && break 121*b4dd7d09SAndy Fiddaman 122*b4dd7d09SAndy Fiddaman # strip '\r' at the end 123*b4dd7d09SAndy Fiddaman i="${i/~(Er)$'\r'/}" 124*b4dd7d09SAndy Fiddaman 125*b4dd7d09SAndy Fiddaman case "$i" in 126*b4dd7d09SAndy Fiddaman ~(Eli)Content-Type:.*) 127*b4dd7d09SAndy Fiddaman response.content_type="${i/~(El).*:[[:blank:]]*/}" 128*b4dd7d09SAndy Fiddaman ;; 129*b4dd7d09SAndy Fiddaman ~(Eli)Content-Length:[[:blank:]]*[0-9]*) 130*b4dd7d09SAndy Fiddaman integer response.content_length="${i/~(El).*:[[:blank:]]*/}" 131*b4dd7d09SAndy Fiddaman ;; 132*b4dd7d09SAndy Fiddaman ~(Eli)Transfer-Encoding:.*) 133*b4dd7d09SAndy Fiddaman response.transfer_encoding="${i/~(El).*:[[:blank:]]*/}" 134*b4dd7d09SAndy Fiddaman ;; 135*b4dd7d09SAndy Fiddaman esac 136*b4dd7d09SAndy Fiddaman done 137*b4dd7d09SAndy Fiddaman 138*b4dd7d09SAndy Fiddaman return 0 139*b4dd7d09SAndy Fiddaman} 140*b4dd7d09SAndy Fiddaman 141*b4dd7d09SAndy Fiddamanfunction cat_http_body 142*b4dd7d09SAndy Fiddaman{ 143*b4dd7d09SAndy Fiddaman typeset emode="$1" 144*b4dd7d09SAndy Fiddaman typeset hexchunksize="0" 145*b4dd7d09SAndy Fiddaman integer chunksize=0 146*b4dd7d09SAndy Fiddaman 147*b4dd7d09SAndy Fiddaman if [[ "${emode}" == "chunked" ]] ; then 148*b4dd7d09SAndy Fiddaman while IFS=$'\r' read hexchunksize && 149*b4dd7d09SAndy Fiddaman [[ "${hexchunksize}" == ~(Elri)[0-9abcdef]+ ]] && 150*b4dd7d09SAndy Fiddaman (( chunksize=$( printf "16#%s\n" "${hexchunksize}" ) )) && (( chunksize > 0 )) ; do 151*b4dd7d09SAndy Fiddaman dd bs=1 count="${chunksize}" 2>/dev/null 152*b4dd7d09SAndy Fiddaman done 153*b4dd7d09SAndy Fiddaman else 154*b4dd7d09SAndy Fiddaman cat 155*b4dd7d09SAndy Fiddaman fi 156*b4dd7d09SAndy Fiddaman 157*b4dd7d09SAndy Fiddaman return 0 158*b4dd7d09SAndy Fiddaman} 159*b4dd7d09SAndy Fiddaman 160*b4dd7d09SAndy Fiddamanfunction encode_http_basic_auth 161*b4dd7d09SAndy Fiddaman{ 162*b4dd7d09SAndy Fiddaman typeset user="$1" 163*b4dd7d09SAndy Fiddaman typeset passwd="$2" 164*b4dd7d09SAndy Fiddaman typeset s 165*b4dd7d09SAndy Fiddaman integer s_len 166*b4dd7d09SAndy Fiddaman typeset -b base64var 167*b4dd7d09SAndy Fiddaman 168*b4dd7d09SAndy Fiddaman # ksh93 binary variables use base64 encoding, the same as the 169*b4dd7d09SAndy Fiddaman # HTTP basic authentification. We only have to read the 170*b4dd7d09SAndy Fiddaman # plaintext user:passwd string into the binary variable "base64var" 171*b4dd7d09SAndy Fiddaman # and then print this variable as ASCII. 172*b4dd7d09SAndy Fiddaman s="${user}:${passwd}" 173*b4dd7d09SAndy Fiddaman s_len="${#s}" 174*b4dd7d09SAndy Fiddaman print -n "${s}" | read -N${s_len} base64var 175*b4dd7d09SAndy Fiddaman 176*b4dd7d09SAndy Fiddaman print -- "${base64var}" # print ASCII (base64) representation of binary var 177*b4dd7d09SAndy Fiddaman 178*b4dd7d09SAndy Fiddaman return 0 179*b4dd7d09SAndy Fiddaman} 180*b4dd7d09SAndy Fiddaman 181*b4dd7d09SAndy Fiddamanfunction put_twitter_message 182*b4dd7d09SAndy Fiddaman{ 183*b4dd7d09SAndy Fiddaman [[ "$SHTWITTER_USER" == "" ]] && { print -u2 -f $"%s: SHTWITTER_USER not set.\n" "$0" ; return 1 ; } 184*b4dd7d09SAndy Fiddaman [[ "$SHTWITTER_PASSWD" == "" ]] && { print -u2 -f $"%s: SHTWITTER_PASSWD not set.\n" "$0" ; return 1 ; } 185*b4dd7d09SAndy Fiddaman 186*b4dd7d09SAndy Fiddaman (( $# != 1 )) && { print -u2 -f $"%s: Wrong number of arguments.\n" "$0" ; return 1 ; } 187*b4dd7d09SAndy Fiddaman 188*b4dd7d09SAndy Fiddaman # site setup 189*b4dd7d09SAndy Fiddaman typeset url_host="twitter.com" 190*b4dd7d09SAndy Fiddaman typeset url_path="/statuses/update.xml" 191*b4dd7d09SAndy Fiddaman typeset url="http://${url_host}${url_path}" 192*b4dd7d09SAndy Fiddaman integer netfd # http stream number 193*b4dd7d09SAndy Fiddaman typeset msgtext="$1" 194*b4dd7d09SAndy Fiddaman compound httpresponse # http response 195*b4dd7d09SAndy Fiddaman 196*b4dd7d09SAndy Fiddaman # argument for "encode_x_www_form_urlencoded" 197*b4dd7d09SAndy Fiddaman compound urlform=( 198*b4dd7d09SAndy Fiddaman # input 199*b4dd7d09SAndy Fiddaman compound -a form=( 200*b4dd7d09SAndy Fiddaman ( name="status" data="${msgtext}" ) 201*b4dd7d09SAndy Fiddaman ) 202*b4dd7d09SAndy Fiddaman # output 203*b4dd7d09SAndy Fiddaman typeset content 204*b4dd7d09SAndy Fiddaman integer content_length 205*b4dd7d09SAndy Fiddaman ) 206*b4dd7d09SAndy Fiddaman 207*b4dd7d09SAndy Fiddaman typeset request="" 208*b4dd7d09SAndy Fiddaman typeset content="" 209*b4dd7d09SAndy Fiddaman 210*b4dd7d09SAndy Fiddaman encode_x_www_form_urlencoded urlform 211*b4dd7d09SAndy Fiddaman 212*b4dd7d09SAndy Fiddaman content="${urlform.content}" 213*b4dd7d09SAndy Fiddaman 214*b4dd7d09SAndy Fiddaman request="POST ${url_path} HTTP/1.1\r\n" 215*b4dd7d09SAndy Fiddaman request+="Host: ${url_host}\r\n" 216*b4dd7d09SAndy Fiddaman request+="Authorization: Basic ${ encode_http_basic_auth "${SHTWITTER_USER}" "${SHTWITTER_PASSWD}" ; }\r\n" 217*b4dd7d09SAndy Fiddaman request+="User-Agent: ${http_user_agent}\r\n" 218*b4dd7d09SAndy Fiddaman request+="Connection: close\r\n" 219*b4dd7d09SAndy Fiddaman request+="Content-Type: application/x-www-form-urlencoded\r\n" 220*b4dd7d09SAndy Fiddaman request+="Content-Length: $(( urlform.content_length ))\r\n" 221*b4dd7d09SAndy Fiddaman 222*b4dd7d09SAndy Fiddaman redirect {netfd}<> "/dev/tcp/${url_host}/80" 223*b4dd7d09SAndy Fiddaman (( $? != 0 )) && { print -u2 -f "%s: Could not open connection to %s\n." "$0" "${url_host}" ; return 1 ; } 224*b4dd7d09SAndy Fiddaman 225*b4dd7d09SAndy Fiddaman # send http post 226*b4dd7d09SAndy Fiddaman { 227*b4dd7d09SAndy Fiddaman print -n -- "${request}\r\n" 228*b4dd7d09SAndy Fiddaman print -n -- "${content}\r\n" 229*b4dd7d09SAndy Fiddaman } >&${netfd} 230*b4dd7d09SAndy Fiddaman 231*b4dd7d09SAndy Fiddaman # process reply 232*b4dd7d09SAndy Fiddaman parse_http_response httpresponse <&${netfd} 233*b4dd7d09SAndy Fiddaman response="${ cat_http_body "${httpresponse.transfer_encoding}" <&${netfd} ; }" 234*b4dd7d09SAndy Fiddaman 235*b4dd7d09SAndy Fiddaman # close connection 236*b4dd7d09SAndy Fiddaman redirect {netfd}<&- 237*b4dd7d09SAndy Fiddaman 238*b4dd7d09SAndy Fiddaman printf $"twitter response was (%s,%s): %s\n" "${httpresponse.statuscode}" "${httpresponse.statusmsg}" "${response}" 239*b4dd7d09SAndy Fiddaman 240*b4dd7d09SAndy Fiddaman if (( httpresponse.statuscode >= 200 && httpresponse.statuscode <= 299 )) ; then 241*b4dd7d09SAndy Fiddaman return 0 242*b4dd7d09SAndy Fiddaman else 243*b4dd7d09SAndy Fiddaman return 1 244*b4dd7d09SAndy Fiddaman fi 245*b4dd7d09SAndy Fiddaman 246*b4dd7d09SAndy Fiddaman # not reached 247*b4dd7d09SAndy Fiddaman} 248*b4dd7d09SAndy Fiddaman 249*b4dd7d09SAndy Fiddamanfunction verify_twitter_credentials 250*b4dd7d09SAndy Fiddaman{ 251*b4dd7d09SAndy Fiddaman [[ "$SHTWITTER_USER" == "" ]] && { print -u2 -f $"%s: SHTWITTER_USER not set.\n" "$0" ; return 1 ; } 252*b4dd7d09SAndy Fiddaman [[ "$SHTWITTER_PASSWD" == "" ]] && { print -u2 -f $"%s: SHTWITTER_PASSWD not set.\n" "$0" ; return 1 ; } 253*b4dd7d09SAndy Fiddaman 254*b4dd7d09SAndy Fiddaman (( $# != 0 )) && { print -u2 -f $"%s: Wrong number of arguments.\n" "$0" ; return 1 ; } 255*b4dd7d09SAndy Fiddaman 256*b4dd7d09SAndy Fiddaman # site setup 257*b4dd7d09SAndy Fiddaman typeset url_host="twitter.com" 258*b4dd7d09SAndy Fiddaman typeset url_path="/account/verify_credentials.xml" 259*b4dd7d09SAndy Fiddaman typeset url="http://${url_host}${url_path}" 260*b4dd7d09SAndy Fiddaman integer netfd # http stream number 261*b4dd7d09SAndy Fiddaman compound httpresponse # http response 262*b4dd7d09SAndy Fiddaman 263*b4dd7d09SAndy Fiddaman typeset request="" 264*b4dd7d09SAndy Fiddaman 265*b4dd7d09SAndy Fiddaman request="POST ${url_path} HTTP/1.1\r\n" 266*b4dd7d09SAndy Fiddaman request+="Host: ${url_host}\r\n" 267*b4dd7d09SAndy Fiddaman request+="Authorization: Basic ${ encode_http_basic_auth "${SHTWITTER_USER}" "${SHTWITTER_PASSWD}" ; }\r\n" 268*b4dd7d09SAndy Fiddaman request+="User-Agent: ${http_user_agent}\r\n" 269*b4dd7d09SAndy Fiddaman request+="Connection: close\r\n" 270*b4dd7d09SAndy Fiddaman request+="Content-Type: application/x-www-form-urlencoded\r\n" 271*b4dd7d09SAndy Fiddaman request+="Content-Length: 0\r\n" # dummy 272*b4dd7d09SAndy Fiddaman 273*b4dd7d09SAndy Fiddaman redirect {netfd}<> "/dev/tcp/${url_host}/80" 274*b4dd7d09SAndy Fiddaman (( $? != 0 )) && { print -u2 -f $"%s: Could not open connection to %s.\n" "$0" "${url_host}" ; return 1 ; } 275*b4dd7d09SAndy Fiddaman 276*b4dd7d09SAndy Fiddaman # send http post 277*b4dd7d09SAndy Fiddaman { 278*b4dd7d09SAndy Fiddaman print -n -- "${request}\r\n" 279*b4dd7d09SAndy Fiddaman } >&${netfd} 280*b4dd7d09SAndy Fiddaman 281*b4dd7d09SAndy Fiddaman # process reply 282*b4dd7d09SAndy Fiddaman parse_http_response httpresponse <&${netfd} 283*b4dd7d09SAndy Fiddaman response="${ cat_http_body "${httpresponse.transfer_encoding}" <&${netfd} ; }" 284*b4dd7d09SAndy Fiddaman 285*b4dd7d09SAndy Fiddaman # close connection 286*b4dd7d09SAndy Fiddaman redirect {netfd}<&- 287*b4dd7d09SAndy Fiddaman 288*b4dd7d09SAndy Fiddaman printf $"twitter response was (%s,%s): %s\n" "${httpresponse.statuscode}" "${httpresponse.statusmsg}" "${response}" 289*b4dd7d09SAndy Fiddaman 290*b4dd7d09SAndy Fiddaman if (( httpresponse.statuscode >= 200 && httpresponse.statuscode <= 299 )) ; then 291*b4dd7d09SAndy Fiddaman return 0 292*b4dd7d09SAndy Fiddaman else 293*b4dd7d09SAndy Fiddaman return 1 294*b4dd7d09SAndy Fiddaman fi 295*b4dd7d09SAndy Fiddaman 296*b4dd7d09SAndy Fiddaman # not reached 297*b4dd7d09SAndy Fiddaman} 298*b4dd7d09SAndy Fiddaman 299*b4dd7d09SAndy Fiddamanfunction usage 300*b4dd7d09SAndy Fiddaman{ 301*b4dd7d09SAndy Fiddaman OPTIND=0 302*b4dd7d09SAndy Fiddaman getopts -a "${progname}" "${shtwitter_usage}" OPT '-?' 303*b4dd7d09SAndy Fiddaman exit 2 304*b4dd7d09SAndy Fiddaman} 305*b4dd7d09SAndy Fiddaman 306*b4dd7d09SAndy Fiddaman# program start 307*b4dd7d09SAndy Fiddamanbuiltin basename 308*b4dd7d09SAndy Fiddamanbuiltin cat 309*b4dd7d09SAndy Fiddamanbuiltin date 310*b4dd7d09SAndy Fiddamanbuiltin uname 311*b4dd7d09SAndy Fiddaman 312*b4dd7d09SAndy Fiddamantypeset progname="${ basename "${0}" ; }" 313*b4dd7d09SAndy Fiddaman 314*b4dd7d09SAndy Fiddaman# HTTP protocol client identifer 315*b4dd7d09SAndy Fiddamantypeset -r http_user_agent="shtwitter/ksh93 (2010-03-27; ${ uname -s -r -p ; })" 316*b4dd7d09SAndy Fiddaman 317*b4dd7d09SAndy Fiddamantypeset -r shtwitter_usage=$'+ 318*b4dd7d09SAndy Fiddaman[-?\n@(#)\$Id: shtwitter (Roland Mainz) 2010-03-27 \$\n] 319*b4dd7d09SAndy Fiddaman[-author?Roland Mainz <roland.mainz@nrubsig.org>] 320*b4dd7d09SAndy Fiddaman[+NAME?shtwitter - read/write text data to internet clipboards] 321*b4dd7d09SAndy Fiddaman[+DESCRIPTION?\bshtwitter\b is a small utility which can read and write text 322*b4dd7d09SAndy Fiddaman to the twitter.com microblogging site.] 323*b4dd7d09SAndy Fiddaman[+?The first arg \bmethod\b describes one of the methods, "update" posts a 324*b4dd7d09SAndy Fiddaman text message to the users twitter blog, returning the raw response 325*b4dd7d09SAndy Fiddaman message from the twitter server.] 326*b4dd7d09SAndy Fiddaman[+?The second arg \bstring\b contains the string data which should be 327*b4dd7d09SAndy Fiddaman stored on twitter.com.] 328*b4dd7d09SAndy Fiddaman 329*b4dd7d09SAndy Fiddamanmethod [ string ] 330*b4dd7d09SAndy Fiddaman 331*b4dd7d09SAndy Fiddaman[+SEE ALSO?\bksh93\b(1), \brssread\b(1), \bshtinyurl\b(1), http://www.twitter.com] 332*b4dd7d09SAndy Fiddaman' 333*b4dd7d09SAndy Fiddaman 334*b4dd7d09SAndy Fiddamanwhile getopts -a "${progname}" "${shtwitter_usage}" OPT ; do 335*b4dd7d09SAndy Fiddaman# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|" 336*b4dd7d09SAndy Fiddaman case ${OPT} in 337*b4dd7d09SAndy Fiddaman *) usage ;; 338*b4dd7d09SAndy Fiddaman esac 339*b4dd7d09SAndy Fiddamandone 340*b4dd7d09SAndy Fiddamanshift $((OPTIND-1)) 341*b4dd7d09SAndy Fiddaman 342*b4dd7d09SAndy Fiddaman# expecting at least one more argument 343*b4dd7d09SAndy Fiddaman(($# >= 1)) || usage 344*b4dd7d09SAndy Fiddaman 345*b4dd7d09SAndy Fiddamantypeset method="$1" 346*b4dd7d09SAndy Fiddamanshift 347*b4dd7d09SAndy Fiddaman 348*b4dd7d09SAndy Fiddamancase "${method}" in 349*b4dd7d09SAndy Fiddaman update|blog) put_twitter_message "$@" ; exit $? ;; 350*b4dd7d09SAndy Fiddaman verify_credentials) verify_twitter_credentials "$@" ; exit $? ;; 351*b4dd7d09SAndy Fiddaman *) usage ;; 352*b4dd7d09SAndy Fiddamanesac 353*b4dd7d09SAndy Fiddaman 354*b4dd7d09SAndy Fiddamanfatal_error $"not reached." 355*b4dd7d09SAndy Fiddaman# EOF. 356