17c2fbfb3SApril Chin#!/usr/bin/ksh93 27c2fbfb3SApril Chin 37c2fbfb3SApril Chin# 47c2fbfb3SApril Chin# CDDL HEADER START 57c2fbfb3SApril Chin# 67c2fbfb3SApril Chin# The contents of this file are subject to the terms of the 77c2fbfb3SApril Chin# Common Development and Distribution License (the "License"). 87c2fbfb3SApril Chin# You may not use this file except in compliance with the License. 97c2fbfb3SApril Chin# 107c2fbfb3SApril Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 117c2fbfb3SApril Chin# or http://www.opensolaris.org/os/licensing. 127c2fbfb3SApril Chin# See the License for the specific language governing permissions 137c2fbfb3SApril Chin# and limitations under the License. 147c2fbfb3SApril Chin# 157c2fbfb3SApril Chin# When distributing Covered Code, include this CDDL HEADER in each 167c2fbfb3SApril Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 177c2fbfb3SApril Chin# If applicable, add the following below this CDDL HEADER, with the 187c2fbfb3SApril Chin# fields enclosed by brackets "[]" replaced with your own identifying 197c2fbfb3SApril Chin# information: Portions Copyright [yyyy] [name of copyright owner] 207c2fbfb3SApril Chin# 217c2fbfb3SApril Chin# CDDL HEADER END 227c2fbfb3SApril Chin# 237c2fbfb3SApril Chin 247c2fbfb3SApril Chin# 25*3e14f97fSRoger A. Faulkner# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. 267c2fbfb3SApril Chin# 277c2fbfb3SApril Chin 287c2fbfb3SApril Chin# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant 297c2fbfb3SApril Chinexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin 307c2fbfb3SApril Chin 317c2fbfb3SApril Chin# Make sure all math stuff runs in the "C" locale to avoid problems 327c2fbfb3SApril Chin# with alternative # radix point representations (e.g. ',' instead of 337c2fbfb3SApril Chin# '.' in de_DE.*-locales). This needs to be set _before_ any 347c2fbfb3SApril Chin# floating-point constants are defined in this script). 357c2fbfb3SApril Chinif [[ "${LC_ALL}" != "" ]] ; then 367c2fbfb3SApril Chin export \ 377c2fbfb3SApril Chin LC_MONETARY="${LC_ALL}" \ 387c2fbfb3SApril Chin LC_MESSAGES="${LC_ALL}" \ 397c2fbfb3SApril Chin LC_COLLATE="${LC_ALL}" \ 407c2fbfb3SApril Chin LC_CTYPE="${LC_ALL}" 417c2fbfb3SApril Chin unset LC_ALL 427c2fbfb3SApril Chinfi 437c2fbfb3SApril Chinexport LC_NUMERIC=C 447c2fbfb3SApril Chin 457c2fbfb3SApril Chinfunction fatal_error 467c2fbfb3SApril Chin{ 477c2fbfb3SApril Chin print -u2 "${progname}: $*" 487c2fbfb3SApril Chin exit 1 497c2fbfb3SApril Chin} 507c2fbfb3SApril Chin 517c2fbfb3SApril Chinfunction encode_multipart_form_data 527c2fbfb3SApril Chin{ 537c2fbfb3SApril Chin nameref formdata="$1" 547c2fbfb3SApril Chin nameref content="formdata.content" 557c2fbfb3SApril Chin integer numformelements=${#formdata.form[*]} 567c2fbfb3SApril Chin integer i 577c2fbfb3SApril Chin typeset tmp 587c2fbfb3SApril Chin 597c2fbfb3SApril Chin content="" 607c2fbfb3SApril Chin 617c2fbfb3SApril Chin # todo: add support to upload files 627c2fbfb3SApril Chin for (( i=0 ; i < numformelements ; i++ )) ; do 637c2fbfb3SApril Chin nameref element="formdata.form[${i}]" 647c2fbfb3SApril Chin 657c2fbfb3SApril Chin content+="--${formdata.boundary}\n" 667c2fbfb3SApril Chin content+="Content-Disposition: form-data; name=\"${element.name}\"\n" 677c2fbfb3SApril Chin content+="\n" 687c2fbfb3SApril Chin # make sure we quote the '\' properly since we pass these data to one instance of 697c2fbfb3SApril Chin # "print" when putting the content on the wire. 707c2fbfb3SApril Chin content+="${element.data//\\/\\\\}\n" # fixme: may need encoding for non-ASCII data 717c2fbfb3SApril Chin done 727c2fbfb3SApril Chin 737c2fbfb3SApril Chin # we have to de-quote the content before we can count the real numer of bytes in the payload 747c2fbfb3SApril Chin tmp="$(print -- "${content}")" 757c2fbfb3SApril Chin formdata.content_length=${#tmp} 767c2fbfb3SApril Chin 777c2fbfb3SApril Chin # add content tail (which MUST not be added to the content length) 787c2fbfb3SApril Chin content+="--${formdata.boundary}--\n" 797c2fbfb3SApril Chin 807c2fbfb3SApril Chin return 0 817c2fbfb3SApril Chin} 827c2fbfb3SApril Chin 837c2fbfb3SApril Chin# parse HTTP return code, cookies etc. 847c2fbfb3SApril Chinfunction parse_http_response 857c2fbfb3SApril Chin{ 867c2fbfb3SApril Chin nameref response="$1" 877c2fbfb3SApril Chin typeset h statuscode statusmsg i 887c2fbfb3SApril Chin 897c2fbfb3SApril Chin # we use '\r' as additional IFS to filter the final '\r' 907c2fbfb3SApril Chin IFS=$' \t\r' read -r h statuscode statusmsg # read HTTP/1.[01] <code> 917c2fbfb3SApril Chin [[ "$h" != ~(Eil)HTTP/.* ]] && { print -u2 -f $"%s: HTTP/ header missing\n" "$0" ; return 1 ; } 927c2fbfb3SApril Chin [[ "$statuscode" != ~(Elr)[0-9]* ]] && { print -u2 -f $"%s: invalid status code\n" "$0" ; return 1 ; } 937c2fbfb3SApril Chin response.statuscode="$statuscode" 947c2fbfb3SApril Chin response.statusmsg="$statusmsg" 957c2fbfb3SApril Chin 967c2fbfb3SApril Chin # skip remaining headers 977c2fbfb3SApril Chin while IFS='' read -r i ; do 987c2fbfb3SApril Chin [[ "$i" == $'\r' ]] && break 997c2fbfb3SApril Chin 1007c2fbfb3SApril Chin # strip '\r' at the end 1017c2fbfb3SApril Chin i="${i/~(Er)$'\r'/}" 1027c2fbfb3SApril Chin 1037c2fbfb3SApril Chin case "$i" in 1047c2fbfb3SApril Chin ~(Eli)Content-Type:.*) 1057c2fbfb3SApril Chin response.content_type="${i/~(El).*:[[:blank:]]*/}" 1067c2fbfb3SApril Chin ;; 1077c2fbfb3SApril Chin ~(Eli)Content-Length:[[:blank:]]*[0-9]*) 1087c2fbfb3SApril Chin integer response.content_length="${i/~(El).*:[[:blank:]]*/}" 1097c2fbfb3SApril Chin ;; 1107c2fbfb3SApril Chin ~(Eli)Transfer-Encoding:.*) 1117c2fbfb3SApril Chin response.transfer_encoding="${i/~(El).*:[[:blank:]]*/}" 1127c2fbfb3SApril Chin ;; 1137c2fbfb3SApril Chin esac 1147c2fbfb3SApril Chin done 1157c2fbfb3SApril Chin 1167c2fbfb3SApril Chin return 0 1177c2fbfb3SApril Chin} 1187c2fbfb3SApril Chin 1197c2fbfb3SApril Chinfunction cat_http_body 1207c2fbfb3SApril Chin{ 1217c2fbfb3SApril Chin typeset emode="$1" 1227c2fbfb3SApril Chin typeset hexchunksize="0" 1237c2fbfb3SApril Chin integer chunksize=0 1247c2fbfb3SApril Chin 1257c2fbfb3SApril Chin if [[ "${emode}" == "chunked" ]] ; then 1267c2fbfb3SApril Chin while IFS=$'\r' read hexchunksize && 127*3e14f97fSRoger A. Faulkner [[ "${hexchunksize}" == ~(Elri)[0-9abcdef]+ ]] && 128*3e14f97fSRoger A. Faulkner (( chunksize=$( printf "16#%s\n" "${hexchunksize}" ) )) && (( chunksize > 0 )) ; do 1297c2fbfb3SApril Chin dd bs=1 count="${chunksize}" 2>/dev/null 1307c2fbfb3SApril Chin done 1317c2fbfb3SApril Chin else 1327c2fbfb3SApril Chin cat 1337c2fbfb3SApril Chin fi 1347c2fbfb3SApril Chin 1357c2fbfb3SApril Chin return 0 1367c2fbfb3SApril Chin} 1377c2fbfb3SApril Chin 1387c2fbfb3SApril Chinfunction history_write_record 1397c2fbfb3SApril Chin{ 1407c2fbfb3SApril Chin # rec: history record: 1417c2fbfb3SApril Chin # rec.title 1427c2fbfb3SApril Chin # rec.description 1437c2fbfb3SApril Chin # rec.provider 1447c2fbfb3SApril Chin # rec.providertoken 1457c2fbfb3SApril Chin # rec.url 1467c2fbfb3SApril Chin nameref rec="$1" 1477c2fbfb3SApril Chin integer histfd 1487c2fbfb3SApril Chin 1497c2fbfb3SApril Chin mkdir -p "${HOME}/.shnote" 1507c2fbfb3SApril Chin 1517c2fbfb3SApril Chin { 1527c2fbfb3SApril Chin # write a single-line record which can be read 1537c2fbfb3SApril Chin # as a compound variable back into the shell 1547c2fbfb3SApril Chin printf "title=%q description=%q date=%q provider=%q providertoken=%q url=%q\n" \ 1557c2fbfb3SApril Chin "${rec.title}" \ 1567c2fbfb3SApril Chin "${rec.description}" \ 1577c2fbfb3SApril Chin "$(date)" \ 1587c2fbfb3SApril Chin "${rec.provider}" \ 1597c2fbfb3SApril Chin "${rec.providertoken}" \ 1607c2fbfb3SApril Chin "${rec.url}" 1617c2fbfb3SApril Chin } >>"${history_file}" 1627c2fbfb3SApril Chin 1637c2fbfb3SApril Chin return $? 1647c2fbfb3SApril Chin} 1657c2fbfb3SApril Chin 1667c2fbfb3SApril Chinfunction print_history 1677c2fbfb3SApril Chin{ 1687c2fbfb3SApril Chin integer histfd # http stream number 1697c2fbfb3SApril Chin typeset line 1707c2fbfb3SApril Chin 1717c2fbfb3SApril Chin (( $# != 0 && $# != 1 )) && { print -u2 -f $"%s: Wrong number of arguments.\n" "$0" ; return 1 ; } 1727c2fbfb3SApril Chin 1737c2fbfb3SApril Chin # default output format is: 1747c2fbfb3SApril Chin # <access url>/<title> <date> <access url> 1757c2fbfb3SApril Chin [[ "$1" == "-l" ]] || printf "# %s\t\t\t\t\t%s\t%s\n" "<url>" "<title>" "<date>" 1767c2fbfb3SApril Chin 1777c2fbfb3SApril Chin # no history file ? 1787c2fbfb3SApril Chin if [[ ! -f "${history_file}" ]] ; then 1797c2fbfb3SApril Chin return 0 1807c2fbfb3SApril Chin fi 1817c2fbfb3SApril Chin 1827c2fbfb3SApril Chin # open history file 1837c2fbfb3SApril Chin redirect {histfd}<> "${history_file}" 18434f9b3eeSRoland Mainz (( $? != 0 )) && { print -u2 "Could not open history file." ; return 1 ; } 1857c2fbfb3SApril Chin 1867c2fbfb3SApril Chin while read -u${histfd} line ; do 18734f9b3eeSRoland Mainz compound rec 1887c2fbfb3SApril Chin 1897c2fbfb3SApril Chin printf "( %s )\n" "${line}" | read -C rec 1907c2fbfb3SApril Chin 1917c2fbfb3SApril Chin if [[ "$1" == "-l" ]] ; then 1927c2fbfb3SApril Chin print -- "${rec}" 1937c2fbfb3SApril Chin else 1947c2fbfb3SApril Chin printf "%q\t%q\t%q\n" "${rec.url}" "${rec.title}" "${rec.date}" 1957c2fbfb3SApril Chin fi 1967c2fbfb3SApril Chin 1977c2fbfb3SApril Chin unset rec 1987c2fbfb3SApril Chin done 1997c2fbfb3SApril Chin 2007c2fbfb3SApril Chin # close history file 2017c2fbfb3SApril Chin redirect {histfd}<&- 2027c2fbfb3SApril Chin 2037c2fbfb3SApril Chin return 0 2047c2fbfb3SApril Chin} 2057c2fbfb3SApril Chin 2067c2fbfb3SApril Chinfunction put_note_pastebin_ca 2077c2fbfb3SApril Chin{ 2087c2fbfb3SApril Chin # key to autheticate this script against pastebin.ca 2097c2fbfb3SApril Chin typeset -r pastebin_ca_key="9CFXFyeNC3iga/vthok75kTBu5kSSLPD" 2107c2fbfb3SApril Chin # site setup 2117c2fbfb3SApril Chin typeset url_host="opensolaris.pastebin.ca" 2127c2fbfb3SApril Chin typeset url_path="/quiet-paste.php?api=${pastebin_ca_key}" 2137c2fbfb3SApril Chin typeset url="http://${url_host}${url_path}" 2147c2fbfb3SApril Chin integer netfd # http stream number 21534f9b3eeSRoland Mainz compound httpresponse 2167c2fbfb3SApril Chin 2177c2fbfb3SApril Chin (( $# != 1 )) && { print -u2 -f $"%s: Wrong number of arguments.\n" "$0" ; return 1 ; } 2187c2fbfb3SApril Chin (( ${#1} == 0 )) && { print -u2 -f $"%s: No data.\n" "$0" ; return 1 ; } 2197c2fbfb3SApril Chin 2207c2fbfb3SApril Chin # argument for "encode_multipart_form_data" 22134f9b3eeSRoland Mainz compound mimeform=( 2227c2fbfb3SApril Chin # input 2237c2fbfb3SApril Chin typeset boundary 2247c2fbfb3SApril Chin typeset -a form 2257c2fbfb3SApril Chin # output 2267c2fbfb3SApril Chin typeset content 2277c2fbfb3SApril Chin integer content_length 2287c2fbfb3SApril Chin ) 2297c2fbfb3SApril Chin 2307c2fbfb3SApril Chin typeset request="" 2317c2fbfb3SApril Chin typeset content="" 2327c2fbfb3SApril Chin 2337c2fbfb3SApril Chin typeset -r boundary="--------shnote_${RANDOM}_Xfish_${RANDOM}_Yeats_${RANDOM}_Zchicken_${RANDOM}monster_--------" 2347c2fbfb3SApril Chin 2357c2fbfb3SApril Chin mimeform.boundary="${boundary}" 2367c2fbfb3SApril Chin mimeform.form=( # we use explicit index numbers since we rely on them below when filling the history 2377c2fbfb3SApril Chin [0]=( name="name" data="${LOGNAME}" ) 2387c2fbfb3SApril Chin [1]=( name="expiry" data="Never" ) 2397c2fbfb3SApril Chin [2]=( name="type" data="1" ) 2407c2fbfb3SApril Chin [3]=( name="description" data="logname=${LOGNAME};hostname=$(hostname);date=$(date)" ) 2417c2fbfb3SApril Chin [4]=( name="content" data="$1" ) 2427c2fbfb3SApril Chin ) 2437c2fbfb3SApril Chin encode_multipart_form_data mimeform 2447c2fbfb3SApril Chin 2457c2fbfb3SApril Chin content="${mimeform.content}" 2467c2fbfb3SApril Chin 2477c2fbfb3SApril Chin request="POST ${url_path} HTTP/1.1\r\n" 2487c2fbfb3SApril Chin request+="Host: ${url_host}\r\n" 2497c2fbfb3SApril Chin request+="User-Agent: ${http_user_agent}\r\n" 2507c2fbfb3SApril Chin request+="Connection: close\r\n" 2517c2fbfb3SApril Chin request+="Content-Type: multipart/form-data; boundary=${boundary}\r\n" 2527c2fbfb3SApril Chin request+="Content-Length: $(( mimeform.content_length ))\r\n" 2537c2fbfb3SApril Chin 2547c2fbfb3SApril Chin redirect {netfd}<> "/dev/tcp/${url_host}/80" 25534f9b3eeSRoland Mainz (( $? != 0 )) && { print -u2 -f $"%s: Could not open connection to %s.\n" "$0" "${url_host}" ; return 1 ; } 2567c2fbfb3SApril Chin 2577c2fbfb3SApril Chin # send http post 2587c2fbfb3SApril Chin { 2597c2fbfb3SApril Chin print -n -- "${request}\r\n" 2607c2fbfb3SApril Chin print -n -- "${content}\r\n" 2617c2fbfb3SApril Chin } >&${netfd} 2627c2fbfb3SApril Chin 2637c2fbfb3SApril Chin # process reply 2647c2fbfb3SApril Chin parse_http_response httpresponse <&${netfd} 2657c2fbfb3SApril Chin response="$(cat_http_body "${httpresponse.transfer_encoding}" <&${netfd})" 2667c2fbfb3SApril Chin 2677c2fbfb3SApril Chin # close connection 2687c2fbfb3SApril Chin redirect {netfd}<&- 2697c2fbfb3SApril Chin 2707c2fbfb3SApril Chin if [[ "${response}" == ~(E).*SUCCESS.* ]] ; then 2717c2fbfb3SApril Chin typeset response_token="${response/~(E).*SUCCESS:/}" 2727c2fbfb3SApril Chin 2737c2fbfb3SApril Chin printf "SUCCESS: http://opensolaris.pastebin.ca/%s\n" "${response_token}" 2747c2fbfb3SApril Chin 2757c2fbfb3SApril Chin # write history entry 27634f9b3eeSRoland Mainz compound histrec=( 2777c2fbfb3SApril Chin title="${mimeform.form[0].data}" 2787c2fbfb3SApril Chin description="${mimeform.form[3].data}" 2797c2fbfb3SApril Chin providertoken="${response_token}" 2807c2fbfb3SApril Chin provider="opensolaris.pastebin.ca" 2817c2fbfb3SApril Chin url="http://opensolaris.pastebin.ca/${response_token}" 2827c2fbfb3SApril Chin ) 2837c2fbfb3SApril Chin 2847c2fbfb3SApril Chin history_write_record histrec 2857c2fbfb3SApril Chin return 0 2867c2fbfb3SApril Chin else 2877c2fbfb3SApril Chin printf "ERROR: %s\n" "${response}" 2887c2fbfb3SApril Chin return 1 2897c2fbfb3SApril Chin fi 2907c2fbfb3SApril Chin 2917c2fbfb3SApril Chin # not reached 2927c2fbfb3SApril Chin} 2937c2fbfb3SApril Chin 2947c2fbfb3SApril Chinfunction get_note_pastebin_ca 2957c2fbfb3SApril Chin{ 2967c2fbfb3SApril Chin typeset recordname="$1" 2977c2fbfb3SApril Chin integer netfd # http stream number 2987c2fbfb3SApril Chin 2997c2fbfb3SApril Chin (( $# != 1 )) && { print -u2 -f $"%s: No key or key URL.\n" "$0" ; return 1 ; } 3007c2fbfb3SApril Chin 3017c2fbfb3SApril Chin case "${recordname}" in 3027c2fbfb3SApril Chin ~(Elr)[0-9][0-9]*) 3037c2fbfb3SApril Chin # pass-through 3047c2fbfb3SApril Chin ;; 3057c2fbfb3SApril Chin ~(Elr)http://opensolaris.pastebin.ca/raw/[0-9]*) 3067c2fbfb3SApril Chin recordname="${recordname/~(El)http:\/\/opensolaris.pastebin.ca\/raw\//}" 3077c2fbfb3SApril Chin ;; 3087c2fbfb3SApril Chin ~(Elr)http://opensolaris.pastebin.ca/[0-9]*) 3097c2fbfb3SApril Chin recordname="${recordname/~(El)http:\/\/opensolaris.pastebin.ca\//}" 3107c2fbfb3SApril Chin ;; 3117c2fbfb3SApril Chin *) 3127c2fbfb3SApril Chin fatal_error $"Unsupported record name ${recordname}." 3137c2fbfb3SApril Chin esac 3147c2fbfb3SApril Chin 3157c2fbfb3SApril Chin print -u2 -f "# Record name is '%s'\n" "${recordname}" 3167c2fbfb3SApril Chin 3177c2fbfb3SApril Chin typeset url_host="opensolaris.pastebin.ca" 3187c2fbfb3SApril Chin typeset url_path="/raw/${recordname}" 3197c2fbfb3SApril Chin typeset url="http://${url_host}${url_path}" 3207c2fbfb3SApril Chin # I hereby curse Solaris for not having an entry for "http" in /etc/services 3217c2fbfb3SApril Chin 3227c2fbfb3SApril Chin # open TCP channel 3237c2fbfb3SApril Chin redirect {netfd}<> "/dev/tcp/${url_host}/80" 32434f9b3eeSRoland Mainz (( $? != 0 )) && { print -u2 -f $"%s: Could not open connection to %s.\n" "$0" "${url_host}" ; return 1 ; } 3257c2fbfb3SApril Chin 3267c2fbfb3SApril Chin # send HTTP request 3277c2fbfb3SApril Chin request="GET ${url_path} HTTP/1.1\r\n" 3287c2fbfb3SApril Chin request+="Host: ${url_host}\r\n" 3297c2fbfb3SApril Chin request+="User-Agent: ${http_user_agent}\r\n" 3307c2fbfb3SApril Chin request+="Connection: close\r\n" 3317c2fbfb3SApril Chin print -u${netfd} -- "${request}\r\n" 3327c2fbfb3SApril Chin 3337c2fbfb3SApril Chin # collect response and send it to stdout 3347c2fbfb3SApril Chin parse_http_response httpresponse <&${netfd} 3357c2fbfb3SApril Chin cat_http_body "${httpresponse.transfer_encoding}" <&${netfd} 3367c2fbfb3SApril Chin 3377c2fbfb3SApril Chin # close connection 3387c2fbfb3SApril Chin redirect {netfd}<&- 3397c2fbfb3SApril Chin 3407c2fbfb3SApril Chin print # add newline 3417c2fbfb3SApril Chin 3427c2fbfb3SApril Chin return 0 3437c2fbfb3SApril Chin} 3447c2fbfb3SApril Chin 3457c2fbfb3SApril Chinfunction usage 3467c2fbfb3SApril Chin{ 3477c2fbfb3SApril Chin OPTIND=0 3487c2fbfb3SApril Chin getopts -a "${progname}" "${USAGE}" OPT '-?' 3497c2fbfb3SApril Chin exit 2 3507c2fbfb3SApril Chin} 3517c2fbfb3SApril Chin 3527c2fbfb3SApril Chin# program start 3537c2fbfb3SApril Chinbuiltin basename 3547c2fbfb3SApril Chinbuiltin cat 3557c2fbfb3SApril Chinbuiltin date 3567c2fbfb3SApril Chinbuiltin uname 3577c2fbfb3SApril Chin 3587c2fbfb3SApril Chintypeset progname="${ basename "${0}" ; }" 3597c2fbfb3SApril Chin 3607c2fbfb3SApril Chin# HTTP protocol client identifer 361*3e14f97fSRoger A. Faulknertypeset -r http_user_agent="shnote/ksh93 (2010-03-27; $(uname -s -r -p))" 3627c2fbfb3SApril Chin 3637c2fbfb3SApril Chin# name of history log (the number after "history" is some kind of version 3647c2fbfb3SApril Chin# counter to handle incompatible changes to the history file format) 3657c2fbfb3SApril Chintypeset -r history_file="${HOME}/.shnote/history0.txt" 3667c2fbfb3SApril Chin 3677c2fbfb3SApril Chintypeset -r shnote_usage=$'+ 368*3e14f97fSRoger A. Faulkner[-?\n@(#)\$Id: shnote (Roland Mainz) 2010-03-27 \$\n] 3697c2fbfb3SApril Chin[-author?Roland Mainz <roland.mainz@nrubsig.org>] 3707c2fbfb3SApril Chin[+NAME?shnote - read/write text data to internet clipboards] 3717c2fbfb3SApril Chin[+DESCRIPTION?\bshnote\b is a small utilty which can read and write text 3727c2fbfb3SApril Chin data to internet "clipboards" such as opensolaris.pastebin.ca.] 3737c2fbfb3SApril Chin[+?The first arg \bmethod\b describes one of the methods, "put" saves a string 3747c2fbfb3SApril Chin to the internet clipboard, returning an identifer and the full URL 3757c2fbfb3SApril Chin where the data are stored. The method "get" retrives the raw 3767c2fbfb3SApril Chin information using the identifer from the previous "put" action. 3777c2fbfb3SApril Chin The method "hist" prints a history of transactions created with the 3787c2fbfb3SApril Chin "put" method and the keys to retrive them again using the "get" method.] 3797c2fbfb3SApril Chin[+?The second arg \bstring\b contains either the string data which should be 3807c2fbfb3SApril Chin stored on the clipboard using the "put" method, the "get" method uses 3817c2fbfb3SApril Chin this information as identifer to retrive the raw data from the 3827c2fbfb3SApril Chin clipboard.] 3837c2fbfb3SApril Chin 3847c2fbfb3SApril Chinmethod [ string ] 3857c2fbfb3SApril Chin 3867c2fbfb3SApril Chin[+SEE ALSO?\bksh93\b(1), \brssread\b(1), \bshtwitter\b(1), \bshtinyurl\b(1), http://opensolaris.pastebin.ca] 3877c2fbfb3SApril Chin' 3887c2fbfb3SApril Chin 3897c2fbfb3SApril Chinwhile getopts -a "${progname}" "${shnote_usage}" OPT ; do 3907c2fbfb3SApril Chin# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|" 3917c2fbfb3SApril Chin case ${OPT} in 3927c2fbfb3SApril Chin *) usage ;; 3937c2fbfb3SApril Chin esac 3947c2fbfb3SApril Chindone 3957c2fbfb3SApril Chinshift $((OPTIND-1)) 3967c2fbfb3SApril Chin 3977c2fbfb3SApril Chin# expecting at least one more argument, the single method below will do 3987c2fbfb3SApril Chin# the checks for more arguments if needed ("put" and "get" methods need 3997c2fbfb3SApril Chin# at least one extra argument, "hist" none). 4007c2fbfb3SApril Chin(($# >= 1)) || usage 4017c2fbfb3SApril Chin 4027c2fbfb3SApril Chintypeset method="$1" 4037c2fbfb3SApril Chinshift 4047c2fbfb3SApril Chin 4057c2fbfb3SApril Chincase "${method}" in 4067c2fbfb3SApril Chin put) put_note_pastebin_ca "$@" ; exit $? ;; 4077c2fbfb3SApril Chin get) get_note_pastebin_ca "$@" ; exit $? ;; 4087c2fbfb3SApril Chin hist) print_history "$@" ; exit $? ;; 4097c2fbfb3SApril Chin *) usage ;; 4107c2fbfb3SApril Chinesac 4117c2fbfb3SApril Chin 4127c2fbfb3SApril Chinfatal_error $"not reached." 4137c2fbfb3SApril Chin# EOF. 414