#! /bin/bash#===============================================# License: GPL3 any version.# Copyright: Kevin Whitefoot 2011# Contact: kwhitefoot@hotmail.com# Purpose: a script intended to be executed from file managers such as# Nautilus to send files to a Posterous blog.# Dependencies:# Zenity# sendEmail # Perl, # Net::SSLeay and IO::Socket::SSL perl modules# Description: # This script accepts a number of file names as arguments and expects# a configuration file called .sendtoposterous to exist in the user's# home directory. If the configuration file does not exist then# Zenity is used to ask the user for the SMTP server name, user name,# password and recipient name (preset to post@posterous.com but# presumably others could implement a similar blog submission# process). # Once the configuration data has been collected from the user it is# saved and the user will not be asked again unless the# -c/--configure option is given on the command line.#====================================================# To do:# - Reliable detection of filure to send.# - Use file as body. Use file command to discover text files,# present list so user can pick one to use as the body. #====================================================# $Id: sendtoposterous,v 1.10 2011/05/02 19:33:05 kj Exp $ ## $Log: sendtoposterous,v $# Revision 1.10 2011/05/02 19:33:05 kj# Fixed tags file so that only the tags need to be present. Uses sed to add boolean False before each line.## Revision 1.9 2011/05/02 19:21:37 kj# Tags history now works.## Revision 1.8 2011/05/02 17:52:00 kj# Added title history and tags.## Revision 1.7 2011/04/29 16:12:12 kj# Changed from a single config file to a config directory so that we can store history.## Revision 1.6 2011/04/27 20:41:40 kj# Added post title as text on progress dialog.## Revision 1.5 2011/04/27 19:41:51 kj# Removed grep filtering of progress, pulsating bar works now.## Revision 1.4 2011/04/27 19:36:26 kj# .##====================================================set -x # Uncomment for debugging echo "Starting $0"# Search the list of files for files that can be used as the body of# the file.findtextfiles(){ for f in "$@" do if file "$f" | grep text then textfiles=("${textfiles[@]}" "False") textfiles=("${textfiles[@]}" "$f") fi done }# Note that you cannot use echo to output debugging information inside# this function because it is the output on stdout that the caller# uses.ask() { zenity --entry --title="dlgtitle" --text="$1" --entry-text="$2" if [ $? != 0 ] then echo "User cancelled" set -e # Ensure that the exit in the next line exits the whole script. exit 1 fi }# Use a function to send so that we can start a Zenity notification# icon or progress bar.send(){ subject="$PostTitle ((tags: $PostTags))" sendEmail -v -f "$AddrFrom" -t "$AddrTo" -u "$subject" -m "$PostBody" -s "$SMTPServer" -xu "$SMTPUser" -xp "$SMTPPass" -a "$@" | tee >(zenity --progress --pulsate --auto-close --title="$dlgtitle" --text="$PostTitle")} sendfilebody(){ subject="$PostTitle ((tags: $PostTags))" cat "$tmpbody" | sendEmail -v -f "$AddrFrom" -t "$AddrTo" -u "$subject" -s "$SMTPServer" -xu "$SMTPUser" -xp "$SMTPPass" -a "$@" | tee >(zenity --progress --pulsate --auto-close --title="$dlgtitle" --text="$PostTitle")}# Ask the user for a title, present the history of titles so that the# user can pick.asktitle(){ # First, ensure that the titles file has at least one line in it. if [[ ! -s "$titlesfile" ]] then echo "Posted by sendtoposterous on `date`" > "$titlesfile" fi PostTitle=`cat "$titlesfile" | zenity --list \ --editable \ --title="$dlgtitle" \ --column="Title (click or enter to edit)"` if [ "$PostTitle" = "" ] then exit 1 fi # Add the selected title to a file of titles. Add to the start of # the file. Remove duplicates so that even if the user re-uses a # title it will only appear in the file once. addtohistory "$PostTitle" "$titlesfile"}# Ask the user for the tags. User can pick as many as required.asktags(){ # First, ensure that the tags file has at least one tag in it so # that we can easily detect whether there are any.. if [[ ! -s "$tagsfile" ]] then echo "`date`" >> "$tagsfile" fi # Add the boolean column to the tag file and pipe it to zenity. PostTags=`sed '/.*/i False' $tagsfile | zenity --list \ --title="$dlgtitle" \ --editable \ --checklist \ --column="Select" \ --column="Tag (click or enter to edit)" \ --separator=", "` if [ "$PostTags" = "" ] then # user cancelled exit 1 fi # Present the tag to the user as a comma separated list for # further editing and confirmation. PostTags=`zenity --entry \ --title="$dlgtitle" \ --text="Edit and confirm tags" \ --entry-text="$PostTags"` # Add the selected tags to a file of tags. Add to the start of # the file. Remove duplicates so that even if the user re-uses a # title it will only appear in the file once. tags=(${PostTags//,/ }) replace commas with spaces # Back up the tags file mv "$tagsfile" "${tagsfile}.bak" # Write the new tags to the, now empty, tag file. Note that we do # not need the booleans, just the tags, one per line. for tag in "${tags[@]}" do echo "$tag" >> "$tagsfile" done # Now remove the selected tags from the backup for tag in "${tags[@]}" do sed -in-place "/$tag/d" "${tagsfile}.bak" done # Finally append the history to the new tags cat "${tagsfile}.bak" >> "$tagsfile"}# Add an entry to a history file, remove duplicates, place new item at# the top.addtohistory(){ item="$1" file="$2" sed "/$item/d" "${file}" > "${file}.bak" echo "$item" > "${file}" cat "${file}.bak" >> "${file}"}# Initialize configdir="$HOME/.`basename $0`"config="$configdir/config"echo "looking for config file: $config"titlesfile="$configdir/titles"tagsfile="$configdir/tags"tmpbody="$configdir/tmpbody"declare -a textfiles=()dlgtitle="Send to Posterous"# Create config directoryif [ ! -d "$configdir" ]then if [ ! mkdir "$configdir" then zenity --info --title="$dlgtitle" --text="Could not create configuration directory." exit 1 fifi# Create config fileif [ -e "$config" ]then . "$config" echo "loaded $config"else echo "Not found $config" AddrFrom="" AddrTo="" SMTPServer="" SMTPUser="" SMTPPass=""fiif [ "$AddrFrom" = "" -o "$AddrTo" = "" -o "$SMTPServer" = "" -o "$SMTPUser" = "" -o "$SMTPPass" = "" ]then # Set defaults if [ "$AddrTo" = "" ] then AddrTo="post@posterous.com" fi if [ "$SMTPServer" = "" ] then SMTPServer="smtp.gmail.com" fi echo "Ask user for config" SMTPServer=`ask "SMTP server" "$SMTPServer"` SMTPUser=`ask "SMTP user" "$SMTPUser"` SMTPPass=`ask "SMTP password" "$SMTPPass"` AddrFrom=`ask "From" "$AddrFrom"` AddrTo=`ask "To" "$AddrTo"` # Save config echo "SMTPServer=$SMTPServer" > "$config" echo "SMTPUser=$SMTPUser" >> "$config" echo "SMTPPass=$SMTPPass" >> "$config" echo "AddrFrom=$AddrFrom" >> "$config" echo "AddrTo=$AddrTo" >> "$config" else echo "Got config"fi# Now ask the user for the title and bodyasktitleasktagsPostBody=""# Always add a space to the body to ensure that sendEmail doesn't# think it needs to ask again.findtextfiles "$@"echo "debug text files: ${textfiles[@]}" if [ "${#textfiles[@]}" -ne "0" ]then bodyfiles=`zenity --title="$dlgtitle" --text="Pick one or more files." --checklist --list --column="select" --column="file" "${textfiles[@]}"` fi# Now we have everything we can construct the command line except the# body. Show a progress bar so the user knows we are trying even# though we cannot report progress.echo "text files: ${textfiles[@]}" echo "body files: ${bodyfiles[@]}"if [ "${#bodyfiles[@]}" -ne "0" ]then cat "${bodyfiles[@]}" > "$tmpbody" sendresult=`sendfilebody "$@"`else PostBody=`ask "Body" "$PostBody"`" " sendresult=`send "$@"`fiecho "$sendresult"if [ $? = 0 ]then zenity --info --title="$dlgtitle" --text="$PostTitle\rSuccess."else zenity --warning --title="$dlgtitle" --text="Failed\r$sendresult"fi
Wednesday, 4 May 2011
HTML, again
Subscribe to:
Post Comments (Atom)
Blog Archive
-
▼
2011
(102)
-
▼
May
(16)
- A simple utility to launch a program or script
- Crop an image to minimum size needed inn .NET
- Encapsulate in
- Encapsulate in
- Leading spaces
- HTML, again
- Adding ability to find text files to use as body
- Adding ability to find text files to use as body
- Disposable web pages
- Fixing tags bug.
- Fixing tags bug.
- Title history and tags look like they work, but ...
- Wrong port? Now on 587/TLS
- Wrong port?
- Wrong port?
- Wrong port?
-
▼
May
(16)
No comments:
Post a Comment