#!/bin/sh
#
# groups2html.sh
#   Create an HTML page containing group information for all users.

MY_H=htm
MY_GROUPS2HTML=groups2html
MY_GROUPS2HTML=http://www.lafn.org/~cymbala/bin/${MY_GROUPS2HTML}.html
MY_TITLE="Group Membership [@ www.marxists.org]"
MY_TITLE_SETPERMS="File and Directory Permissions (WWW.MARXISTS.ORG)"
MY_TMPFILE=`mktemp`
MY_TMPFILE_TMP=${MY_TMPFILE}.intermediate
MY_TMPFILE_USERS=${MY_TMPFILE}.users
MY_TMPFILE_GROUPS=${MY_TMPFILE}.groups
MY_TMPFILE_JOIN=${MY_TMPFILE}.join
MY_USERS=/etc/passwd
MY_GROUPS=/etc/group
MY_NOW="`822-date`"
MY_CWD=/www/public_html/admin/volunteers/biographies
MY_TEMPLATE=/www/public_html/admin/janitor/template.${MY_H}
MY_SETPERMS=set-permissions
MY_SET_PERMISSIONS=/www/scripts/${MY_SETPERMS}.sh
MY_OUTPUT_SETPERMS=${MY_SETPERMS}.${MY_H}
MY_OUTPUT=${MY_CWD}/groups.${MY_H}
MY_OUTPUT2=${MY_CWD}/group.${MY_H}
MY_ZAPTO='~~~'

cd $MY_CWD
echo -n "Working directory: "
pwd

# Output start of HTML page.
awk '{ print; if (/<[hH][112233445566]/) {exit;} }' $MY_TEMPLATE \
    | sed "s/__TITLE__/${MY_TITLE}/" \
    > $MY_OUTPUT
awk '{ print; if (/<[hH][112233445566]/) {exit;} }' $MY_TEMPLATE \
    | sed "s/__TITLE__/${MY_TITLE_SETPERMS}/" \
    > $MY_OUTPUT_SETPERMS

# See also...
awk '{ if (/<[hH][112233445566]/) { print; exit;} }' $MY_TEMPLATE \
    | awk '{sub(/MIA.*__TITLE__/, \
	"See also: <a href=\x22" MY_OUTPUT_SETPERMS "\x22><code>" MY_SETPERMS "</code></a>"); print; }' \
    MY_SETPERMS="$MY_SETPERMS" MY_OUTPUT_SETPERMS="$MY_OUTPUT_SETPERMS" \
    >> $MY_OUTPUT

# Output time-stamp.
awk '/<[uU][lL]/ { \
	sub(/<.*/, "<code>" MY_NOW "</code>"); print; exit; \
    }' MY_NOW="$MY_NOW" $MY_TEMPLATE \
    >> $MY_OUTPUT
awk '/<[uU][lL]/ { \
	sub(/<.*/, "<code>" MY_NOW "</code>"); print; exit; \
    }' MY_NOW="$MY_NOW" $MY_TEMPLATE \
    >> $MY_OUTPUT_SETPERMS

# Output start of PRE element.
awk '/<[uU][lL]/ { sub(/ul/, "pre"); print; exit; }' $MY_TEMPLATE \
    >> $MY_OUTPUT
awk '/<[uU][lL]/ { sub(/ul/, "pre"); print; exit; }' $MY_TEMPLATE \
    >> $MY_OUTPUT_SETPERMS

# Convert set-permissions script to SGML
awk '{ gsub(/&/, "&amp;"); gsub(/</, "&lt"); gsub(/>/, "&gt;"); print; }' $MY_SET_PERMISSIONS \
    >> $MY_OUTPUT_SETPERMS

# List of users
# abc	1000
# def	1001
# ghi	1002
#
awk -F':' '$3 > 999 { print $1 "\t" $3; }' $MY_USERS \
    | sort -k 1,1 - \
    > $MY_TMPFILE_USERS
##########less $MY_TMPFILE_USERS

# List of groups
# abc	francais
# abc	marxists
# abc	meia
# abc	reference
#
awk -F':' '{ \
	if ($4 == "") { $4 = $1; } \
	n = split($4, parts, /,/); \
	for (i=1; i<=n; i++) { print parts[i] "\t" $1; } \
    }' $MY_GROUPS \
    | sort -k 1,1 - \
    > $MY_TMPFILE_GROUPS
##########less $MY_TMPFILE_GROUPS

# Join.
join -t'	' -j 1 $MY_TMPFILE_USERS $MY_TMPFILE_GROUPS \
    | sort -n -k 2,2 \
    > $MY_TMPFILE_JOIN
##########less $MY_TMPFILE_JOIN

# Combine groups together.
#
cat $MY_TMPFILE_JOIN \
    | awk -F'\t' ' \
	BEGIN { OFS="\t"; } \
	FNR == 1 { \
	    uid = $2; list = $3; previous = $1; } \
	FNR >= 2 { \
	    if (previous != $1) { 
		list = MY_ZAPTO list; \
		print previous, uid, list; \
		uid = $2; list = $3; previous = $1; } \
	    else { \
		list = list "," $3; } \
	} \
	END { list = MY_ZAPTO list; \
	      print previous, uid, list; \
    }' MY_ZAPTO=$MY_ZAPTO \
    > $MY_TMPFILE

# Add header-row and footer-row.
cat $MY_TMPFILE \
    | awk 'BEGIN { OFS="\t"; } \
	   NR == 1 { \
	      print "USERNAME\tUID\t"MY_ZAPTO"GROUP(S)"; \
	      print "--------\t----\t"MY_ZAPTO"--------"; } \
	    { print; } \
	END { print "ZZZZZZZZ\tZZZZZZZZ\t"MY_ZAPTO"ZZZZZZZZ"; \
    }' MY_ZAPTO=$MY_ZAPTO \
    > $MY_TMPFILE_TMP

# Convert tabs to spaces (preparation for <PRE> tag).
cat $MY_TMPFILE_TMP \
    | column -t \
    > $MY_TMPFILE

# Add hyperlink to usernames with matching username.htm file.
cat $MY_TMPFILE \
    | awk '{ \
	if ($2 ~ /^[0-9]+$/) { \
	    rc = system("ls " MY_CWD "/" $1"."MY_H ">/dev/null 2>&1"); \
	    if (rc == 0) { \
		sub($1, "<a href=\x22"$1"."MY_H"\x22>" $1 "</a>"); } } \
	print; \
	}' MY_CWD=$MY_CWD MY_H=$MY_H \
    > $MY_TMPFILE_TMP

# Delete UID column
cat $MY_TMPFILE_TMP \
    | awk '{ MY_RE = "[^ ]+[ ]+" MY_ZAPTO; \
	     sub(MY_RE, ""); print; \
    }' MY_ZAPTO=$MY_ZAPTO \
    > $MY_TMPFILE

# Tweak some spaces.
cat $MY_TMPFILE \
    | awk '{ gsub(/,/, ", "); print; }' \
    | awk '{ sub(/^/, "     "); print; }' \
    > $MY_TMPFILE_TMP

# Append to output
cat $MY_TMPFILE_TMP \
    >> $MY_OUTPUT

# Output end of PRE element.
awk '/\/[uU][lL]/ { sub(/ul/, "pre"); print; ; exit; }' $MY_TEMPLATE \
    >> $MY_OUTPUT
awk '/\/[uU][lL]/ { sub(/ul/, "pre"); print; ; exit; }' $MY_TEMPLATE \
    >> $MY_OUTPUT_SETPERMS

# See also...
awk '{ if (/<[hH][112233445566]/) { print; exit;} }' $MY_TEMPLATE \
    | awk '{sub(/MIA.*__TITLE__/, \
	"See also: <a href=\x22" MY_GROUPS2HTML "\x22><code>" MY_GROUPS2HTML "</code></a>"); print; }' \
    MY_GROUPS2HTML="$MY_GROUPS2HTML" \
    >> $MY_OUTPUT

# Output end of HTML page.
awk '{ if (/[Cc][oO][mM][mM][eE][nN][tT][sS]/) {p=1;} if (p==1) {print;} }' $MY_TEMPLATE \
    >> $MY_OUTPUT
awk '{ if (/[Cc][oO][mM][mM][eE][nN][tT][sS]/) {p=1;} if (p==1) {print;} }' $MY_TEMPLATE \
    >> $MY_OUTPUT_SETPERMS

cp $MY_OUTPUT $MY_OUTPUT2

rm -f $MY_TMPFILE
rm -f $MY_TMPFILE_USERS
rm -f $MY_TMPFILE_GROUPS
rm -f $MY_TMPFILE_JOIN
echo "Done."
###
#