#! /bin/sh

gridsecdir=""
users=""
gridmap=""
output=""
nodes=0

if [ "$1" != '' ]; then
    output="-o $1"
fi

while [ "$gridsecdir" = "" ]; do
    printf "Enter trusted certificate directory to copy to cluster: "
    read gridsecdir

    if [ ! -d "$gridsecdir" ]; then
        echo "$gridsecdir is not a directory" 1>&2
        gridsecdir=""
    elif [ ! -r "$gridsecdir" ]; then
        echo "$gridsecdir is not readable" 1>&2
        gridsecdir=""
    fi
done

printf "Enter whitespace-delimited list of user names to create on the cluster: "
read users

while [ "$gridmap" = "" ]; do
    printf "Enter path to gridmap to add to cluster: "
    read gridmap

    if [ ! -r "$gridmap" ]; then
        echo "$gridmap is not readable" 1>&2
        gridmap=""
    fi
done

while [ "$nodes" -eq 0 ]; do
    printf "Enter number of compute nodes for this cluster: "
    read nodes
done

get_trusted_cert_data()
{
    dir="$1"
    tmpfile="osg-trusted-certs.tar.gz"

    echo "#! /bin/sh"
    echo "cd /etc/grid-security/certificates"
    echo "uudecode <<EOF"
        cd "$dir"
        tar cf - . | gzip -9 | uuencode -m $tmpfile
    echo "EOF"
    echo "gzip -dc $tmpfile | tar xf -"
    echo "rm $tmpfile"
}

get_users_data()
{
    user_list="$1"
    echo "$user_list" | tr '    ' '\n\n'
}

exec 3<<'EOF'
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:vwl="http://www.globus.org/2008/06/workspace/metadata/logistics"
    version="1.0">

    <xsl:output method="xml" cdata-section-elements="vwl:data"/>

    <xsl:param name="users"/>
    <xsl:param name="gridmap"/>
    <xsl:param name="trusted-certs"/>
    <xsl:param name="count"/>

    <xsl:template match="*">
        <xsl:element name="{name()}" namespace="{namespace-uri()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="vwl:data[@name='users']">
        <xsl:element name="{name()}" namespace="{namespace-uri()}">
            <xsl:attribute name="name">users</xsl:attribute>
            <xsl:value-of select="$users"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="vwl:data[@name='gridmap']">
        <xsl:element name="{name()}" namespace="{namespace-uri()}">
            <xsl:attribute name="name">gridmap</xsl:attribute>
            <xsl:value-of select="$gridmap"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="vwl:data[@name='trusted-certs']">
        <xsl:element name="{name()}" namespace="{namespace-uri()}">
            <xsl:attribute name="name">trusted-certs</xsl:attribute>
            <xsl:value-of select="$trusted-certs"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="vwl:quantity">
        <xsl:element name="quantity" namespace="{namespace-uri()}">
            <xsl:choose>
                <xsl:when test="../vwl:name/text() = 'OSGwn'">
                    <xsl:value-of select="$count"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="."/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
EOF

exec 4<<'EOF'
<?xml version="1.0" encoding="UTF-8"?>

<cluster xmlns="http://www.globus.org/2008/06/workspace/metadata/logistics">

  <workspace>

    <name>OSGce</name>

    <image>osg-1.0.0-ce.gz</image>

    <quantity>1</quantity>

    <nic interface="eth0" wantlogin="true">public</nic>
    <nic interface="eth1">privatenogw</nic>

    <ctx>
        <provides>
            <identity>
                <interface>eth0</interface>
            </identity>
            <identity>
                <interface>eth1</interface>
            </identity>
            <role interface="eth1">torquemaster</role>
            <role interface="eth1">nfsserver</role>
        </provides>

        <requires>
            <identity />
            <role name="torqueslave" hostname="true" pubkey="true" />
            <role name="nfsclient" />
            <data name="users"></data>
            <data name="gridmap"></data>
            <data name="trusted-certs"></data>
        </requires>
    </ctx>
  </workspace>

  <workspace>

    <name>OSGwn</name>

    <image>osg-1.0.0-wn.gz</image>

    <quantity>1</quantity>

    <nic interface="eth1">private</nic>

    <ctx>

        <provides>
            <identity>
                <interface>eth1</interface>
            </identity>
            <role interface="eth1">torqueslave</role>
            <role interface="eth1">nfsclient</role>
        </provides>

        <requires>
            <identity />
            <role name="torquemaster" hostname="true" pubkey="true" />
            <role name="nfsserver" />
            <data name="users"></data>
        </requires>

    </ctx>
  </workspace>

</cluster>
EOF

xsltproc --stringparam users "`get_users_data \"$users\"`" \
         --stringparam gridmap "`cat $gridmap`" \
         --stringparam trusted-certs "`get_trusted_cert_data $gridsecdir`" \
         --param count "$nodes" \
         $output \
         /dev/fd/3 /dev/fd/4

