xref: /titanic_50/usr/src/lib/libshell/common/scripts/shnote.sh (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
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