#!/bin/bash
#
# File: /usr/local/bin/txttoman
#
# Beschreibung
#
#    Copyright (C) 2013  Ingo Kaesmann
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#
# Script template: 0.3.6
#
# Exit codes:
# 0 = OK
# 1 = Error in parameters
# 3 = Library old or not found
# 8 = Error in other file or other file not found
##############################################################################
# SOURCE STANDARD FILES

. /usr/local/etc/main-inka-sh.conf			# main config
. $LLIBDIR/lib-inka-std.sh				# functions standard
#test -e /usr/local/etc/x.conf && . /usr/local/etc/x.conf	# global config
#test -e ~/.$(basename $0)rc %% . ~/.$(basename $0)rc	# personal config
#test -e ~/.xrc && . ~/.xrc				# local config
##############################################################################
# DECLARATION OF VARIABLES

# STRINGS
pkgname=inka-buildpackage					# package name
lib_inka_std_sh_needed=1.3.6				# standard lib version
#conf_file_needed=0.0.1					# conf file version
#----------------------- end of variables to configure -----------------------
version=$(grep "^VERSION" $PROGREG/$pkgname.inf | cut -f 2)	# version
scriptname=$(basename $0)				# name of script
tempfile=$TEMPDIR/$scriptname.$UID.$$.tmp		# temporary file
infolog="logger -p user.info -t $scriptname --"		# log info messages
errlog="logger -p user.err -t $scriptname -- ERROR:"	# log error messages
debuglog="logger -p user.debug -t $scriptname -- DEBUG:" # log debug messages
debug=no						# debug=yes/no
verbose=""						# verbose=""/-q/-v
opt_found=no						# opt_found=yes/no
opt=""							# option
#------------------------- end of standard variables -------------------------
opt_s=""						# option ""/"-s"

# NUMBERS
err=0							# exit code
##############################################################################
# FUNCTIONS

function show_help ()
{
# Show help
# Uses: cat
# Return codes: standard

if [ "$debug" == "yes" ]; then				# debug
	echo "DEBUG show_help: $# $@" >&2
	#$debuglog show_help: $# $@
fi

cat <<EOT

Aufruf: $scriptname [OPTION]... -m PAKET VERSION SEKTION PROGRAMM
        $scriptname [OPTION]... -x PROGRAMM
Erstellung einer Manpage, bzw. Anzeige einer zu erstellenden Manpage

        -m      Erstellung einer Manpage im aktuellen Verzeichnis
        -x      Erstellung einer Manpage im man-Verzeichnis
        -s      mit -m, -x: nur Anzeige der zu erstellenden Manpage
-h, --help      Hilfe anzeigen und beenden
 --version      Versionsinformationen anzeigen und beenden
   --debug      Debug-Modus benutzen
        -q      ohne Meldungen
        -v      mit vielen Meldungen

Bei Benutzung von -m muss Quelldatei im aktuellen Verzeichnis sein.
Bei -x muss das aktuelle Verzeichnis 'helpX' sein, wobei 'X' die Sektion ist
und im uebergeordneten Verzeichnis die aktuelle pkg.inf vorhanden sein.

EOT
return
}
#-----------------------------------------------------------------------------
function show_config ()
{
# Show configuration of program
# Uses: cat, cut, grep
# Return codes: standard

if [ "$debug" == "yes" ]; then				# debug
	echo "DEBUG show_config: $# $@" >&2
	#$debuglog show_config: $# $@
fi

cat <<EOT

var-Erklaerung:
$var

Programm wird zu folgenden Zeiten aufgerufen:
EOT
grep "&&" /etc/cron.d/xyz.cron | cut -f 1

return
}

#-----------------------------------------------------------------------------
function create_show_man_proc ()
{
# Create or show the manpage in aktual directory
# Par1 - Par4: Paket name, version, sektion, program name
# Uses: echo, txt2man
# Return codes:
# 0 = OK
# 8 = Source file not found

if [ "$debug" == "yes" ]; then				# debug
	echo "DEBUG create_show_man_proc: $# $@" >&2
	#$debuglog create_show_man_proc: $# $@
fi

local p1 p2 p3 p4
p1=$1		# paket name
p2=$2		# version
p3=$3		# sektion
p4=$4		# program name

if ! [ -e $p4 ]; then					# source file not exist
	if [ "$verbose" != "-q" ]; then
		echo "Fehler - Quelldatei $p4 exitiert nicht!" >&2	# error
	else
		$errlog source file $1 not exist
	fi
	exit 8
fi
# txt2man -t PROGRAM -s SEKTION -v PAKET -r PAKET-VERSION PROGRAM > PROGRAM.SEKTION.gz
if [ -z "$opt_s" ]; then				# no -s - create manpage
	txt2man -t $p4 -s $p3 -v $p1 -r $p1-$p2 $p4 > $p4.$p3.gz
else							# -s - only show manpage
	txt2man -T -t $p4 -s $p3 -v $p1 -r $p1-$p2 $p4
fi

#rm -f $tempfile
return
}
#-----------------------------------------------------------------------------
function create_auto_proc ()
{
# Create manpage. Read infos from pkg.inf and read the sektion from dir name
# Par1: Program name
# Uses: echo, grep, txt2man
# Return codes:
# 0 = OK
# 8 = Source file or pkg.inf not found

if [ "$debug" == "yes" ]; then				# debug
	echo "DEBUG create_auto_proc: $# $@" >&2
	#$debuglog create_auto_proc: $# $@
fi

local p1 hdir sek pak vers
p1=$1		# program name
hdir=""		# helpdir
sek=""		# sektion
pak=""		# package name
vers=""		# version

if ! [ -e $p1 ]; then					# source file not exist
	if [ "$verbose" != "-q" ]; then
		echo "Fehler - Quelldatei $p1 exitiert nicht!" >&2	# error
	else
		$errlog source file $1 not exist
	fi
	exit 8
elif ! [ -e ../pkg.inf ]; then				# pkg.inf not exist
	if [ "$verbose" != "-q" ]; then
		echo "Fehler - pkg.inf exitiert nicht im uebergeordneten Verzeichnis!" >&2	# error
	else
		$errlog pkg.inf not exist in parent dir
	fi
	exit 8
fi

hdir=${PWD##*/}						# help dir
sek=${hdir##help}					# sektion
pak=$(grep PKGNAME ../pkg.inf | cut -f 2)		# package name
vers=$(grep VERSION ../pkg.inf | cut -f 2)		# version

if [ -z "$opt_s" ]; then				# no -s - create manpage
	txt2man -t $p1 -s $sek -v $pak -r $pak-$vers $p1 > ../man$sek/$p1.$sek.gz
else							# -s - only show manpage
	txt2man -T -t $p1 -s $sek -v $pak -r $pak-$vers $p1
fi

#rm -f $tempfile
return
}
##############################################################################
# PARSE COMMANDLINE

# Read all options with args and all additional args into variables.
# Stop parsing after last parameter.
# Try to do a check on all parameters and version numbers.
# Handle options -h, -C and -V directly.
# Exit on error.

if [ "$debug" == "yes" ]; then				# debug
	echo "DEBUG Parse Commandline: $# $@" >&2
	#$debuglog Parse Commandline: $# $@
fi

# get options and options with arguments
while [ "${1:0:1}" == "-" ]; do				# get all options
	case "$1" in
	  -h|--help)	opt=-h;;			# option -h
	  --version)	opt=--v;; 			# option --version
#	  --show-config) opt=--s;;			# option --show-config
	  --debug)	debug=yes;;			# option --debug
	  -q|--quiet)	verbose=-q;;			# option -q
	  -v|--verbose)	verbose=-v;;			# option -v
#-------------------------- end of standard options --------------------------
	  -m|-x)	opt="$1";;			# option -c, -s, -x
	  -s)	opt_s=$1;;				# option -s
#	  -z)	opt_z=$1				# option -z + 1 arg
#		if [ "$#" -gt 1 ] & [ "${2:0:1}" != "-" ]; then	# par2 is 1.arg of opt_z
#			opt_z1=$2
#			shift				# shift option
#		else					# error no arg
#			if [ "$verbose" != -q ]; then
#				echo "Fehler - Wert fuer Option $1 fehlt!" >&2
#			else
#				$errlog arg for option $1 is missing
#			fi
#			exit 1
#		fi;;
	  *)	if [ "$verbose" != "-q" ]; then
			echo "Fehler - Option $1 falsch!" >&2	# error
		else
			$errlog unknown option $1
		fi
		exit 1;;
	esac
	shift			# shift option, or last argument for option
	opt_found=yes
done

# handle standard options -h, --v, --s
case "$opt" in
  -h)	show_help; exit 0;;					# show help
  --v)	echo "$scriptname (${pkgname}) $version"; exit 0;;	# show version
#  --s)	show_config; exit 0;;					# show config
esac

# check arguments after options
case "$opt" in
  -m)	if [ $# -eq 4 ]; then		# parameter count ok
			arg1="$1"
			arg2="$2"
			arg3="$3"
			arg4="$4"
			shift 4
	else				# error in param count
		if [ "$verbose" != "-q" ]; then
			echo "Fehler - Parameteranzahl falsch!" >&2
		else
			$errlog parameter count wrong
		fi
		exit 1
	fi;;
  -x)	if [ $# -eq 1 ]; then		# parameter count ok
			arg1="$1"
			shift
	else				# error in param count
		if [ "$verbose" != "-q" ]; then
			echo "Fehler - Parameteranzahl falsch!" >&2
		else
			$errlog parameter count wrong
		fi
		exit 1
	fi;;
  *)	if [ $# -ne 0 ]; then			# error in param count
		if [ "$verbose" != "-q" ]; then
			echo "Fehler - Parameteranzahl falsch!" >&2
		else
			$errlog parameter count
		fi
		exit 1
	fi;;
esac
##############################################################################
# CHECK LIBRARY AND CONFIG

# check library
Compare_Version $lib_inka_std_sh_needed $Lib_Inka_Std_Sh_Version
ret=$?						# (ret: 0,1,2,9,127)
if [ $ret -eq 1 ]; then		# needed lib-version higher than installed
	if [ "$verbose" != "-q" ]; then
		echo "Fehler - Programm benoetigt neuere Version von lib-inka-std.sh!" >&2
	else
		$errlog newer version of lib-inka-std.sh needed
	fi
	exit 3
elif [ $ret -eq 9 ] || [ $ret -eq 127 ]; then		# other error (version or lib missing)
	if [ "$verbose" != "-q" ]; then
		echo "Fehler - Versionspruefung von lib-inka-std.sh nicht moeglich!"
	else
		$errlog check of version of lib-inka-std.sh impossible
	fi
	exit 3
else					# check ok, reset $ret
	ret=0
fi

# check version of config files - set config var and program name!
#Compare_Version $conf_file_needed $Program_Conf
#Compare_Version $conf_file_needed $Program_Rc
#ret=$?						# (ret: 0,1,2,9)
#if [ $ret -eq 1 ]; then		# needed config-version higher than installed
#	if [ "$verbose" != "-q" ]; then
#		echo "Fehler - $scriptname benoetigt neuere Version der Konfig-datei!" >&2
#	else
#		$errlog newer version of conf file needed
#	fi
#	exit 2
#elif [ $ret -eq 9 ]; then		# other error (version of conffile missing)
#	if [ "$verbose" != "-q" ]; then
#		echo "Fehler - Versionspruefung der Konfig-datei von $scriptname nicht moeglich!"
#	else
#		$errlog check of version of conf file impossible
#	fi
#	exit 2
#else					# check ok, reset $ret
#	ret=0
#fi
##############################################################################
# MAINPROGRAM

if [ "$debug" == "yes" ]; then				# debug
	echo "DEBUG Main: $# $@" >&2
	#$debuglog Main: $# $@
fi

# Check what to do (initial options and args are removed from cmdline)
case "$opt" in
  -m)							# opt -c, -s
	create_show_man_proc $arg1 $arg2 $arg3 $arg4
	err=$?;;
  -x)							# opt -x
	create_auto_proc $arg1
	err=$?;;
  "")							# no opt given
	if [ "$verbose" != "-q" ]; then
		echo "Fehler - Option fehlt!" >&2
	else
		$errlog option missing
	fi
	err=1;;
esac

exit $err
