#!/bin/bash
# Description:
# This script is designed to add some text to a text file based
# apon some values entered in an HTML form. It can be used in conjuction
# with the script 'plaintext2html-forum.sh' or with the script
# linkdoc2html-forum. These scripts create the
# necessary HTML forms and links which will point to this cgi-script
#
#
# Notes:
# The web server must have 'write' permission to the file inorder
# for this script to achieve anything. If the web-server does not
# have 'write' permission the script does not complain but the
# target file is not updated.
#
# The version of this script on Debian Linux used the 'fromdos' program,
# but this is not really a standard unix program (unlike say 'unix2dos')
# On Debian, 'fromdos' is aliased to 'dos2unix' in any case, so the
# 'dos2unix' invocation should probably be used for porability.
# However some HTML textareas, notable Netscape, return strings with neither
# unix nor dos line endings, but just \r characters. For this we will just
# use a simple sed conversion.
#
# This script should include a 'Contribution Heading' parameter, so that
# different section headings could be used for the 'comments' section. In other
# words, in some cases, the document maintainer might want to call the
# comment section 'contributions' but in other cases might want to call it
# 'visitor comments' and so on.
# Ideas:
# make the date a better format, check to see if the file
# is writable, etc.
# Dependencies:
# plaintext2html-forum.sh
# procgi
# This is a c program which extracts submitted HTML form values from the
# posted or 'getted' data sent by the web-visitors browser. This program
# was found somewhere on the Internet.
# See Also:
# plaintext2html.sh,
# Converts a plain text style document into HTML with links and a table of contents
# plaintext2pdf.sh,
# Converts the same type of document into PDF using the 'htmldoc' program
# plaintext2html-forum.sh
# Converts a document as above but allows the web-visitor to make contributions
# via a CGI script called 'add-comment'
# linkdoc2html.sh
# Converts a text document which consists of a list of URLs and descriptions into
# a hyperlinked HTML document
# diary2html.sh
# Converts a 'diary style' plain text document into HTML. A diary is just a
# series of dates and description for those dates
# linkdoc2html-index.sh,
# linkdoc2html-forum.sh
# Similar to the 'plaintext2html-forum.sh' script but operates on 'linkdocs' as
# described above.
# add-comment
# A CGI script which adds a user supplied comment to a text file and regenerates an
# HTML file using one of the '2html' scripts described here. The script uses a
# utility called 'procgi' or 'proccgi' which extracts submitted HTML form values.
# Author:
# mjb
# Bugs:
# This script will probably currently fail for strangely named text files. In particular
# text files which follow the HTML internationalizing naming convention (for use with
# the 'language negotiation' feature, or 'content negotiation' feature of web-servers
# and web-browsers) such as 'index.html.en'. This script will probably mangle the
# name of the generated HTML file.
# The line below parses the querystring or posted environment
# variables. It uses a program which was found at.
# http://www.fpx.de/fp/Software/ProcCGIsh.html
#
eval "`./procgi $*`"
echo "Content-type: text/html"
echo ""
# This second empty echo line IS necessary. A 'server error' will
# be generated by the web-server if it is not present.
# echo "A script to add something to a text file"
sFileName=$FORM_filename
sComment=$FORM_comment
sUserName=$FORM_username
sSourceDocumentType=$FORM_documenttype
sDebug=$FORM_debug
if [ "$sDebug" != "" ]
then
echo "
The variables received by this cgi script were
sFileName=$sFileName
sComment=$sComment
sUserName=$sUserName
sDebug=$sDebug
"
fi
if [ "$sFileName" = "" ]
then
echo ""
echo "
No file name was specified for the script $0.
This is an error. For more information please contact matthew@ella-associates.org
The document has not been altered.
"
echo "
"
echo ""
exit 1;
fi
sHtmlFileName=$(echo $sFileName | sed "s/\.[^\.]*$//gi")".html"
#-- Check that the directory is writable. If not the text file will be 'truncated'
#-- by this script and will only contain the comment just added and nothing else.
#-- This is a very bad outcome and must be avoided at all costs.
if [ -w $(dirname $sFileName) ]
then
:
else
sScriptResultMessage=" \
The directory in which the source file resides is not 'writable' by. \
the Web Server. You will have to ask the system administrator to make this \
directory writable in order for this comment script to work \
The document has not been altered. <\/center><\/strong>
"
cat $sHtmlFileName | sed "s//$sScriptResultMessage/g"
exit 1;
fi
#-- Check that the file is writable.
if [ -w $sFileName ]
then
:
else
sScriptResultMessage=" \
The source file is not 'writable' by the Web Server. \
You will have to ask the system administrator to make this \
file writable in order for this comment script to work \
The document has not been altered. <\/center><\/strong>
"
cat $sHtmlFileName | sed "s//$sScriptResultMessage/g"
exit 1;
fi
if [ "$sComment" = "" ]
then
#-- Another 'gotcha': because the string sScriptResultMessage is to be used in
#-- the sed command, it cannot contain / characters. This may be obvious to some
#-- Another gotcha: the following sed snippet -e "s#\\#\\\\#g" in my humble opinion
#-- should actually work but doesn't because the sed engine (gnu I think) seem to
#-- apply the escaping back-slash to the # character rather than to the other \
#-- character. Actually this is a quoting problem not a sed problem.
#-- I cant get this escaping of escape characters to work and frankly I dont care
#echo ""
#sSafeFileName=$(echo $sFileName | sed -e 's#/#\\\/#g' -e 's#\\#\\\\#g')
#sSafeFileName=$(echo $sFileName | sed -e 's#/#\\\/#g' )
sScriptResultMessage=" \
No comment or other text was specified to be added to the document. \
The document has not been altered. <\/center><\/strong>
"
cat $sHtmlFileName | sed "s//$sScriptResultMessage/g"
exit 1;
else
#-- We need to get rid of the MS Line Ending format, if the
#-- text was entered on an MS Windows computer.
#-- finding the -a switch for fromdos took some time.
#-- For some reason the 'fromdos' command gets rid of all
#-- line breaks. It is possible that the 'proccgi' program is
#-- doing something unpleasant to the FORM values
#echo "sComment=$sComment"
sComment=$(echo $sComment | tr '\r' '\n')
#sComment=$(echo $sComment | dos2unix | fmt -w80)
#sComment=$(echo $sComment | sed "s/[\r\n]//g")
echo
fi
if [ "$sUserName" = "" ]
then
sUserName="[anonymous]"
fi
#-- Create a 'comments' section heading in the text file if there
#-- is not one already. If there is already a comments section but
#-- it is not the last section heading (all capitals line) then this
#-- won't work as it really should. But thats the nature of shell scripting
#-- 'good enough is good enough'
if [ "$(cat $sFileName | grep '^[ ]*COMMENTS')" = "" ]
then
echo "COMMENTS" >> $sFileName
fi
#-- The date string below gives a full text date, with weekday and AM/PM time
#-- The code below attempts to add the last comment immediately under the
#-- comment tag.
cp $sFileName $sFileName.temp
#-- Preserve the old version of the file, just in case something goes terribly
#-- wrong. For example, if the web-server does not have permission to write to
#-- the directory in the which the text file resides, then the 'cp' command wont
#-- work, and nor will the lines below. Back to the drawing board.
datetag=$(date "+%d%B%Y-%I-%M%p")
cp $sFileName $sFileName.$datetag
(sed -n "1,/^[ ]*COMMENTS/p" $sFileName.temp; \
echo "
Added by: $sUserName, on $(date '+%A, %d %B %Y, %I:%M %p')
$sComment "; \
sed "1,/^[ ]*COMMENTS/d" $sFileName.temp; ) > $sFileName
rm -f $sFileName.temp
#-- A 'gotcha' is that the full path to the 'plaintext2html-forum.sh' script
#-- must be included, even though the script is on the bash path. This is,
#-- I suppose, because the cgi environment does not inherit the environment
#-- from the bash shell
#-- Another 'gotcha' is that the 'plaintext2html.sh' script is not working
#-- properly because it relies on a temporary file, and the web server
#-- doesn't seem able to create the file. This seems odd because the web
#-- server is able to create the '.html' transformed file. That is the
#-- web-server has sufficient permissions to create a text file from this
#-- script, but a script which it starts (executes) does not have sufficient
#-- permissions. I could try giving maximum permission to the filter script
#-- and see if that helps.
#-- I have worked around the problem mentioned above by rewriting the
#-- filter script (plaintext2html-forum.sh) so that it doesn't write
#-- to any temporary files
# echo "sHtmlFileName=$sHtmlFileName"
if [ "$sSourceDocumentType" = "linkdoc" ]
then
/usr/local/bin/linkdoc2html-forum.sh $sFileName > $sHtmlFileName
elif [ "$sSourceDocumentType" = "plaintext" ]
then
/usr/local/bin/plaintext2html-forum.sh $sFileName > $sHtmlFileName
else
/usr/local/bin/plaintext2html-forum.sh $sFileName > $sHtmlFileName
fi
echo ""
#-- Really, special characters within $username should be 'escaped' so that
#-- they will not create problems for the 'sed' command. For example if
#-- $username contains the character '/' the sed command will probably die
#-- a sudden painful death.
#cat $sHtmlFileName
sResultMessage=" \
\
Your comment was added to this document, thankyou $sUserName \
"
cat $sHtmlFileName | sed "s//Your comment was added to this document, thankyou $sUserName<\/strong><\/center> /g"